Allows using @constraint as a directive to validate input data. Inspired by Constraints Directives RFC and OpenAPI
npm install graphql-constraint-directive const ConstraintDirective = require('graphql-constraint-directive') const express = require('express') const bodyParser = require('body-parser') const { graphqlExpress } = require('apollo-server-express') const { makeExecutableSchema } = require('graphql-tools') const typeDefs = ` type Query { books: [Book] } type Book { title: String } type Mutation { createBook(input: BookInput): Book } input BookInput { title: String! @constraint(minLength: 5, format: "email") }` const schema = makeExecutableSchema({ typeDefs, schemaDirectives: { constraint: ConstraintDirective } }) const app = express() app.use('/graphql', bodyParser.json(), graphqlExpress({ schema }))@constraint(minLength: 5) Restrict to a minimum length
@constraint(maxLength: 5) Restrict to a maximum length
@constraint(startsWith: "foo") Ensure value starts with foo
@constraint(endsWith: "foo") Ensure value ends with foo
@constraint(contains: "foo") Ensure value contains foo
@constraint(notContains: "foo") Ensure value does not contain foo
@constraint(pattern: "^[0-9a-zA-Z]*$") Ensure value matches regex, e.g. alphanumeric
@constraint(format: "email") Ensure value is in a particular format
Supported formats:
- byte: Base64
- date-time: RFC 3339
- date: ISO 8601
- ipv4
- ipv6
- uri
- uuid
@constraint(min: 3) Ensure value is greater than or equal to
@constraint(max: 3) Ensure value is less than or equal to
@constraint(exclusiveMin: 3) Ensure value is greater than
@constraint(exclusiveMax: 3) Ensure value is less than
@constraint(multipleOf: 10) Ensure value is a multiple
Each validation error throws a ConstraintDirectiveError. Combined with a formatError function, this can be used to customise error messages.
{ code: 'ERR_GRAPHQL_CONSTRAINT_VALIDATION', fieldName: 'theFieldName', context: [ { arg: 'argument name which failed', value: 'value of argument' } ] }const formatError = function (error) { if (error.originalError && error.originalError.code === 'ERR_GRAPHQL_CONSTRAINT_VALIDATION') { // return a custom object } return error } app.use('/graphql', bodyParser.json(), graphqlExpress({ schema, formatError }))