sequelize-graphql-schema

A helper library that lets you focus on business logic by automatically generates GraphQLSchema and manages graphQL from Sequelize model.

Installation

npm install sequelize-graphql-schema

Prerequisites

This package assumes you have graphql and sequelize already installed (both packages are declared as peerDependencies).

Options

option type example description
authorizer Function   Your custom authorization mechanism goes here, all queries and mutations will be called after this. This must return a promise.
exclude Array ['MODEL_NAME', 'MODEL_NAME'] Pass in model names to exclude from graphql schema.
includeArguments Object { 'customArgument', 'int' } These arguments will be included in all queries and mutations.
remote Object See Remote Options Import queries from external graphql schema.

Model Options

option type example description
attributes Object {exclude: ['ATTRIBUTE_NAME'], include: { customAttributeName: 'int' }} Model attributes in exclude will be excluded from graphql types. Non-Model custom attributes will be added in graphql type from include.
bulk Array ['create', 'destroy'] Create mutations for bulk create or destroy operations.
alias Object { fetch: 'myQuery', create: 'myCreateMutation', destroy: 'myDeleteMutation, update: 'myUpdateMutation' } Rename default queries and mutations with alias.
excludeMutations Array [ 'create', 'update', 'destroy' ]  
excludeQueries Array [ 'fetch' ]  
types Object {myType: { id: '[int]' }, myTypeInput: { id: 'int' }} Create custom types. Add Input postfix to convert to input type.
mutations Object {myMutation: { input: 'myTypeInput', output: '[myType]', resolver: customResolver}} Custom mutations to be created. input or output can refer to a custom input type or default graphql types.
queries Object {myQuery: { output: '[myType]', resolver: customResolver }}  
before Object {create: (source, args, context, info) => { return Promise.resolve(); }} To run before default query or mutation executes. Available options are create, fetch, destroy and update. Functions must return a promise.
overwrite Object same as before This will overwrite default query or mutation.
extend Object same as before with data coming from default passed to this function: create: (data, source, args, context, info) To extend default functionality.
import Array see remote options Associations with remote schema.
Product.graphql = {
    attributes: {
        exclude: ['description'],
        include: { modelPortfolioId: 'int', obj: 'myObj' },
    }
};

Remote Options

option type example description
import Object {'RemoteData': {endpoint: 'http://garphql-endpoint.com',queries: { 'myQuery': { as: 'RemoteQuery' } },headers: ['authorization']} Remote graphql data to import given queries, alias of query and headers to pass when calling it.
headers Array [ 'authorization' ] Common headers passed to all endpoints.

Model Import Options

option type example description
from String   Remote schema name from Import.
as String   alias for remote schema.
with String   foreign key from model.
to String   target key from remote model.

Usage

const {generateModelTypes, generateSchema} = require('sequelize-graphql-schema')(options);
const models = require('./models')
const schema = generateSchema(models) // Generates the schema
// OR
const types = generateModelTypes(models)
const schema = generateSchema(models, types) // Generates the schema by reusing the types

Example with Express

const { GraphQLSchema } = require('graphql');
const express = require('express');
const graphqlHTTP = require('express-graphql');

var options = {
  exclude: ["Users"]
}

const {generateSchema} = require('sequelize-graphql-schema')(options);

const models = require('./models');

const app = express();

app.use(
  '/graphql',
  graphqlHTTP({
    schema: new GraphQLSchema(generateSchema(models)),
    graphiql: true
  })
)

app.listen(8080, function() {
  console.log('RUNNING ON 8080. Graphiql http://localhost:8080/graphql')
})

Credits

This library is inspired and was initiated from https://github.com/rpellerin/graphql-sequelize-schema-generator.