Skip to content

ericelliott/gql-validate

Repository files navigation

gql-validate

Validate a JS object against a GraphQL schema using yup for validation.

Status - Developer Preview

Currently, this checks that required properties are present, handles the GraphQL primitives and supports custom types. You have to implement nested objects as custom types. See custom-types-test.js for examples.

Usage

import { gqlValidate } from 'gql-validate';

const rootType = 'Person';
const schema = `
  type ${rootType} {
    name: String!
    knowsJS: Boolean!
    age: Int
    height: Float
  }
`;
const validPerson = {
  name: 'Alice',
  knowsJS: true,
  age: 42
};
const invalidPerson = {
  knowsJS: "Yes"
  age: 10.5,
};
gqlValidate(schema, rootType, validPerson).then(console.log);
// []
gqlValidate(schema, rootType)(invalidPerson).then(console.log);
// [
//   "'name' is required",
//   "'knowsJS' must be of type boolean, received string",
//   "'age' must be of type integer, received float"
// ]

By default validate understands the native GraphQL scalars. By default ID is just a string, so there is no validation for uniqueness. See configureGqlValidate for supporting custom types or to change the validation of existing types.

API

gqlValidate(gqlSchema, rootType, data) ⇒ Promise< Array >

Validate a JavaScript object against a GraphQL schema. This function is curried.

Supported features: GraphQL scalars and required.

Returns: Promise< Array > - A promise with an array of errors.

Param Type Description
gqlSchema string A GraphQL schema.
rootType string The root type of the data object to validate.
data object The object to validate.

configureGqlValidate(config) => validate

Configure the validation methods for the default and custom types for the validate function.

Returns: validate - The validate function.

Param Type Description
config object The keys of the validation object represent the GraphQL type. The values must be yup objects.

Usage

import configureGqlValidate from 'gql-validate';

const Email = yup.string().strict().email();
const config = { Email };
const validate = configureGqlValidate(config);

const rootType = 'Message';
const schema = `
  type ${rootType} {
    from: Email!
  }
`;
const validMessage = { from: "foo@example.com" };
const invalidMessage = { from: 'Bob' };
valiadate(schema, rootType, validMessage).then(console.log);
// []
validate(schema, rootType, invalidMessage).then(console.log);
// ["from must be a valid email"]

About

Validate a JS object against a GraphQL schema

Resources

License

Stars

Watchers

Forks

Packages

No packages published