Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/taylorgoolsby/graphql-directive-connection
Generate relay connections by marking fields with a @connection directive.
https://github.com/taylorgoolsby/graphql-directive-connection
connection directive graphql relay schema sdl
Last synced: 3 months ago
JSON representation
Generate relay connections by marking fields with a @connection directive.
- Host: GitHub
- URL: https://github.com/taylorgoolsby/graphql-directive-connection
- Owner: taylorgoolsby
- License: mit
- Created: 2018-11-20T03:07:35.000Z (about 6 years ago)
- Default Branch: master
- Last Pushed: 2023-07-06T03:46:22.000Z (over 1 year ago)
- Last Synced: 2024-10-30T19:07:05.761Z (3 months ago)
- Topics: connection, directive, graphql, relay, schema, sdl
- Language: JavaScript
- Homepage: https://www.npmjs.com/package/graphql-directive-connection
- Size: 675 KB
- Stars: 13
- Watchers: 2
- Forks: 4
- Open Issues: 5
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# graphql-directive-connection
This package generates relay connections by marking fields with a `@connection` directive, and then passing your SDL through `applyConnectionTransform`.
## Example
```js
import sqlDirective from 'graphql-to-sql'
import privateDirective from 'graphql-directive-private'
import connectionDirective from 'graphql-directive-connection'
import { makeExecutableSchema } from '@graphql-tools/schema'const { generateSql } = sqlDirective('sql')
const { privateDirectiveTransform } = privateDirective('private')
const { connectionDirectiveTransform } = connectionDirective('connection')const typeDefs = `
directive @connection on FIELD_DEFINITION
directive @private on OBJECT | FIELD_DEFINITIONtype User {
userId: Int @sql(type: "BINARY(16)", primary: true)
password: String @sql(type: "VARCHAR(255)", primary: true) @private
# Tag the field with @connection. Its return type will be replaced with PostConnection.
posts: [Post!]! @connection
}type Post {
postId: Int @sql(type: "BINARY(16)", primary: true)
}type Query {
user: User
}
`export const sql = generateSql({typeDefs}, {
databaseName: 'public',
tablePrefix: 'test_',
dbType: 'mysql',
})let schema = makeExecutableSchema({
typeDefs
})schema = privateDirectiveTransform(schema)
schema = connectionDirectiveTransform(schema)export default schema
```It will:
* Create the needed Connection and Edge object types.
* Reassign the type of marked fields to the Connection type.
* Remove any `@connection` directives.
* Generate the PageInfo object type if it hasn't been defined.
* Throw errors if the generated Connection and Edge types have a name conflict with types already defined in your SDL.
* Leave everything else in your SDL untouched.These types will be added to your schema:
```graphql
type PageInfo {
hasNextPage: Boolean!
hasPreviousPage: Boolean!
startCursor: String
endCursor: String
}type PostEdge {
cursor: String!
node: Post
}type PostConnection {
totalCount: Int!
edges: [PostEdge]
pageInfo: PageInfo!
}
```## cacheControl
By default, the `cacheControl` directives are not generated on Edge object types and inside connection fields which results in cache arguments being completely ignored.
Enabling `defaultMaxAge` for all types/fields across your GraphQL implementation partially solve the problem, however it might not be the best options.
It is possible to enable `cacheControl` directive support by passing a `useCacheControl: true` flag to `applyConnectionTransform` function.
The package will then use the largest `maxAge` across the connection fields with custom types and apply it to `edges` and `pageInfo` fields along with the `Edge` type.