4.0.3 • Published 10 months ago

graphql-directive-connection v4.0.3

Weekly downloads
177
License
MIT
Repository
github
Last release
10 months ago

graphql-directive-connection

This package generates relay connections by marking fields with a @connection directive, and then passing your SDL through applyConnectionTransform.

Example

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_DEFINITION

  type 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:

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.

3.0.0

10 months ago

4.0.1

10 months ago

4.0.0

10 months ago

4.0.3

10 months ago

4.0.2

10 months ago

2.0.1

3 years ago

2.0.0

3 years ago

1.6.0

3 years ago

1.5.0

4 years ago

1.4.0

4 years ago

1.1.3

5 years ago

1.1.2

5 years ago

1.1.1

5 years ago

1.1.0

5 years ago

1.0.2

5 years ago

1.0.1

5 years ago

1.0.0

5 years ago