JSPM

  • Created
  • Published
  • Downloads 48091
  • Score
    100M100P100Q24838F
  • License MIT

get-graphql-from-jsonschema gets a GraphQL schema from a JSON schema.

Package Exports

  • get-graphql-from-jsonschema
  • get-graphql-from-jsonschema/build/lib/scalarTypes

This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (get-graphql-from-jsonschema) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.

Readme

get-graphql-from-jsonschema

get-graphql-from-jsonschema gets a GraphQL schema from a JSON schema.

Status

Category Status
Version npm
Dependencies David
Dev dependencies David
Build GitHub Actions
License GitHub

Installation

$ npm install get-graphql-from-jsonschema

Quick Start

First you need to add a reference to get-graphql-from-jsonschema to your application:

const { getGraphqlFromJsonSchema } = require('get-graphql-from-jsonschema');

If you use TypeScript, use the following code instead:

import { getGraphqlFromJsonSchema } from 'get-graphql-from-jsonschema';

To get a GraphQL schema from a JSON schema, call the getGraphqlFromJsonSchema function and hand over the root name of the schema you want to convert as well as the schema itself. As a result, you get back the root GraphQL type name and, if needed, additional GraphQL type definitions:

const { typeName, typeDefinitions } = getGraphqlFromJsonSchema({
  rootName: 'person',
  schema: {
    type: 'object',
    properties: {
      firstName: { type: 'string' },
      lastName: { type: 'string' },
      coordinates: {
        type: 'object',
        properties: {
          latitude: { type: 'number' },
          longitude: { type: 'number' }
        },
        required: [ 'latitude', 'longitude' ],
        additionalProperties: false
      },
      tags: {
        type: 'array',
        items: {
          type: 'object',
          properties: {
            key: { type: 'string' },
            value: { type: 'string' }
          },
          required: [ 'key', 'value' ],
          additionalProperties: false
        }
      }
    },
    required: [ 'firstName', 'tags' ],
    additionalProperties: false
  }
});

console.log(typeName);
// => PersonT0

console.log(typeDefinitions);
// => [
//      'type PersonT0CoordinatesT0 {
//        latitude: Float!
//        longitude: Float!
//      }',
//      'type PersonT0TagsT0T0 {
//        key: String!
//        value: String!
//      }',
//      'type PersonT0 {
//        firstName: String!
//        lastName: String
//        coordinates: PersonT0CoordinatesT0
//        tags: [PersonT0TagsT0T0]!
//      }'
//    ]

The T0 suffixes are due to enumerating the types in each schema. If a schema has multiple types, they are noted with increasing indexes, to differentiate them in resulting union types. This also happens with anyOf constructs.

If you want to use the generated types as input types for a mutation, additionally provide the direction option to the call to getGraphqlFromJsonSchema and set its value to input:

const { typeName, typeDefinitions } = getGraphqlFromJsonSchema({
  rootName: 'person',
  schema: {
    // ...
  },
  direction: 'input'
});

Using oneOf to generate union types

The oneOf keyword is supported with a limitation on its use: There must be no other properties on the same level as the oneOf.

const { typeName, typeDefinitions } = getGraphqlFromJsonSchema({
  rootName: 'foobar',
  schema: {
    oneOf: [
      {
        type: 'number'
      },
      {
        type: 'object',
        properties: {
          foo: { type: 'string' },
          bar: { type: 'number' }
        },
        required: [ 'foo' ],
        additionalProperties: false
      }
    ]
  }
});

console.log(typeName);
// => Foobar

console.log(typeDefinitions);
// => [
//     'type FoobarI1T0 {
//       foo: String!
//       bar: Float
//     }',
//     'union Foobar = Float | FoobarI1T0'
// ]

Knowing the limitations

Unfortunately, it is not possible to map every aspect of a JSON schema to a GraphQL schema. When using getGraphqlFromJsonSchema, the following limitations apply:

  • The null type gets ignored, since it can not be mapped to GraphQL directly.
  • The keywords allOf and anyOf get ignored, since their logic can not be mapped to GraphQL. However, the oneOf keyword is supported.

Running quality assurance

To run quality assurance for this module use roboter:

$ npx roboter