graphql-factory
Tools for building GraphQL
Announcements
This project is currently undergoing a major re-write for v3.0.0
.
This will include
- a more graphql-like api
- updated GraphQL Factory Definition Format
- custom execution which will allow
- custom directive middleware support
- tracing data for all resolves/middleware
- Schema building tools
- Schema language support
- better code testing
- and more...
v2.1.0
code is available in the v2.1.0
branch. The master branch will
be used for v3.0.0
development
Schema Language Example
Create a schema from schema language and a SchemaBacking
import { graphql } from 'graphql'
import {
SchemaDefinition,
SchemaBacking
} from 'graphql-factory'
const definition = `
type Item {
id: String!
name: String!
}
type List {
id: String!
name: String!
items: [Item]!
}
type Query {
listLists (search: String): [List]
}
directive @test(value: String) on SCHEMA | OBJECT | QUERY | FIELD
schema @test(value: "I am a schema directive") {
query: Query
}`
const backing = new SchemaBacking()
.Directive('test')
.resolve((source, args, context, info) => {
console.log('Testing', args)
})
.Object('Query')
.resolve('listLists', (source, args, context, info) => {
})
.Object('List')
.resolve('items', (source, args, context, info) => {
})
.backing()
async function main() {
const schema = await new SchemaDefinition()
.use(definition, backing)
.buildSchema()
const result = await schema.request({
source: `
query MyQuery {
listLists {
name
items {
name
}
}
}
`
});
console.log(result);
}
main();
Factory Definition Example
Create the same schema using GraphQL Factory Definition Format
import { graphql } from 'graphql'
import { SchemaDefinition } from 'graphql-factory'
const definition = {
directives: {
test: {
locations: [ 'SCHEMA', 'OBJECT', 'QUERY', 'FIELD' ],
args: {
value: { type: 'String' }
},
resolve (source, args, context, info) {
console.log('Testing', args)
}
}
},
types: {
Item: {
type: 'Object',
fields: {
id: { type: 'String!' },
name: { type: 'String!' }
}
},
List: {
type: 'Object',
fields: {
id: { type: 'String!' },
name: { type: 'String!' },
items: {
type: '[Item]!',
resolve(source, args, context, info) {
}
}
}
},
Query: {
type: 'Object',
fields: {
listLists: {
type: '[List]',
args: {
search: { type: 'String' }
},
resolve(source, args, context, info) {
}
}
}
}
},
schema: {
directives: [ 'test' ],
query: 'Query',
'@directives': {
test: {
value: 'I am a schema directive'
}
}
}
}
async function main() {
const schema = await new SchemaDefinition()
.use(definition)
.buildSchema()
const result = await schema.request({
source: `
query MyQuery {
listLists {
name
items {
name
}
}
}
`
});
console.log(result);
}
main();