// the tests in tests/graphql.js use this schema to ensure the integrity // of the data in lib/graphql/static/*.json // PREVIEWS const previewsValidator = { properties: { title: { type: 'string', required: true }, description: { type: 'string', required: true }, toggled_by: { type: 'string', required: true }, toggled_on: { type: 'array', required: true }, owning_teams: { type: 'array', required: true }, accept_header: { type: 'string', required: true }, href: { type: 'string', required: true } } } // UPCOMING CHANGES const upcomingChangesValidator = { properties: { location: { type: 'string', required: true }, description: { type: 'string', required: true }, reason: { type: 'string', required: true }, date: { type: 'string', required: true, pattern: /^\d{4}-\d{2}-\d{2}$/ }, criticality: { type: 'string', required: true, pattern: '(breaking|dangerous)' }, owner: { type: 'string', required: true, pattern: /^[\S]*$/ } } } // SCHEMAS // many GraphQL schema members have these core properties const coreProps = { properties: { name: { type: 'string', required: true }, type: { type: 'string', required: true }, kind: { type: 'string', required: true }, id: { type: 'string', required: true }, href: { type: 'string', required: true }, description: { type: 'string', required: true }, isDeprecated: { type: 'boolean', required: false }, preview: { type: 'object', required: false, properties: previewsValidator.properties } } } // some GraphQL schema members have the core properties plus an 'args' object const corePropsPlusArgs = dup(coreProps) corePropsPlusArgs.properties.args = { type: 'array', required: false, properties: coreProps.properties } // the args object can have defaultValue prop corePropsPlusArgs.properties.args.properties.defaultValue = { type: 'boolean', required: false } const corePropsNoType = dup(coreProps) delete corePropsNoType.properties.type const corePropsNoDescription = dup(coreProps) delete corePropsNoDescription.properties.description // QUERY CONNECTIONS AND FIELDS const queryConnections = corePropsPlusArgs const queryFields = corePropsPlusArgs // MUTATIONS const mutations = dup(corePropsNoType) mutations.properties.inputFields = { type: 'array', required: true, properties: corePropsNoDescription.properties } mutations.properties.returnFields = { type: 'array', required: true, properties: coreProps.properties } // OBJECTS const objects = dup(corePropsNoType) objects.properties.fields = { type: 'array', required: true, properties: corePropsPlusArgs.properties } objects.properties.implements = { type: 'array', required: false, properties: { name: { type: 'string', required: true }, id: { type: 'string', required: true }, href: { type: 'string', required: true } } } // INTERFACES const interfaces = dup(corePropsNoType) interfaces.properties.fields = { type: 'array', required: true, properties: corePropsPlusArgs.properties } // ENUMS const enums = dup(corePropsNoType) enums.properties.values = { type: 'array', required: true, properties: { name: { type: 'string', required: true }, description: { type: 'string', required: true } } } // UNIONS const unions = dup(corePropsNoType) unions.properties.possibleTypes = { type: 'array', required: true, properties: { name: { type: 'string', required: true }, id: { type: 'string', required: true }, href: { type: 'string', required: true } } } // INPUT OBJECTS const inputObjects = dup(corePropsNoType) inputObjects.properties.inputFields = { type: 'array', required: true, properties: coreProps.properties } // SCALARS const scalars = dup(corePropsNoType) scalars.properties.kind.required = false function dup (obj) { return JSON.parse(JSON.stringify(obj)) } module.exports = { schemaValidator: { queryConnections, queryFields, mutations, objects, interfaces, enums, unions, inputObjects, scalars }, previewsValidator, upcomingChangesValidator }