vadistic / graphql-extra

GraphQL AST/SDL toolkit extending graphql/graphql-js with extra features for code generation & testing
https://graphql-extra.netlify.com/globals
MIT License
15 stars 3 forks source link

graphql-extra

GraphQL AST/SDL toolkit extending standard graphql/graphql-js with extra features for code generation & testing.

Inspired by code-first schema generation tools like graphql-compose or graphql-nexus, but focused on AST/SDL, instead of executable schema.

The aim is to provide flexible and very interoperable tooling for GraphQL generation & testing.

Use cases

Features

AST factories

SDL APIs

Docs

Check source or docs

Installation

$ yarn add graphql-extra

Sneak peek

AST

import { namedtypeNode } from 'graphql-extra'

const named: NamedTypenode = namedTypeNode('Int')

graphql-nexus-like experience with t aliased function names

import { t } from 'graphql-extra'

const node: ObjectTypeDefinitionNode = t.objectType({
  name: 'MyObject',
  description: 'My object',
  interfaces: [
    // accept string
    'MyInterface',
    // or ast node
    t.type.named('Other'),
  ],
  fields: [
    // accept props object
    {
      name: 'myField',
      description: 'my description',
      // nested ast node
      type: t.type.int(),
    },
    // or ast node
    t.fieldDef({
      name: 'myOtherField',
      // entirely nestable
      type: '[ID!]',
    }),
  ],
})

API

Low-level apis for any graphql AST node

import { objectTypeApi } from 'graphql-extra'

const node: ObjectTypeDefinitionNode = {...}

const obj = objectTypeApi(node)
  .removeField('myField')
  .createField({ name: 'otherField', type: 'Int!' })
  .updateField('otherField', { name: 'renamedField' })

if(node === obj.node) {
  console.log(`it's simply mutating provided astNode object`)
}

Which also works for DocumentNode

import { documentSchemaApi } from 'graphql-extra'

const typeDefs = /* GraphQL */ `
  type Person {
    id: ID!
    name: String!
  }
`

const moreTypeDefs = /* GraphQL */ `
  type Post {
    id: ID!
    body: String!
    authot: Person!
  }
`

const ast = documentSchemaApi().addSDL(moreTypeDefs)

const obj1 = ast.getType('Person')
                .getField('id')
                .setTypename('Int')

const obj2 = ast.createObjectType({...}).addDescription('...')

// serialise in any time
const typedefsString = ast.toString()
const documentNode = ast.toDocument()
const introspectionSchema = ast.toSchema()