@jcoreio/graphql-sequelize-extra

some missing pieces of the graphql-sequelize bridge

Usage no npm install needed!

<script type="module">
  import jcoreioGraphqlSequelizeExtra from 'https://cdn.skypack.dev/@jcoreio/graphql-sequelize-extra';
</script>

README

@jcoreio/graphql-sequelize-extra

CircleCI Coverage Status semantic-release Commitizen friendly npm version

some missing pieces of the graphql-sequelize bridge

Installation

npm install --save @jcoreio/graphql-sequelize-extra

API

associationFields(model, options)

const { associationFields } = require('@jcoreio/graphql-sequelize-extra')

Creates GraphQL fields for the given sequelize model's associations.

Arguments

model: Class<Sequelize.Model<any>>

options: Object

options.getType: (model: Class<Sequelize.Model<any>>) => Object (required)

Gets the GraphQL type for the given sequelize model.

options.getArgs: (model: Class<Sequelize.Model<any>>) => Object (optional)

Gets the GraphQL args for the given sequelize model.

options.getResolver: (model: Class<Sequelize.Model<any>>, association: Sequelize.Association) => Function (optional)

Gets the GraphQL resolve function for the given sequelize model and association.

Returns

A plain object of GraphQL fields for the given model's associations.

Advice

You should use associationFields within a fields thunk since it some types it needs would fail to be defined if there are circular associations:

const { models } = sequelize

function getType(model) {
  return types[model.name]
}

const types = mapValues(
  models,
  (model) =>
    new graphql.GraphQLObjectType({
      name: model.name,
      fields: () => ({
        ...attributeFields(model),
        ...associationFields(model, { getType }),
      }),
    })
)

If you have circular associations, you should use some form of nested GraphQL query attack prevention.