1
0
mirror of synced 2025-12-21 10:57:10 -05:00
Files
docs/lib/graphql/validator.js
Kevin Heis 8a56437c93 Pretty format (#20352)
* Update prettier flow to include JS

* Run prettier

* ...run prettier
2021-07-14 14:35:01 -07:00

256 lines
4.5 KiB
JavaScript

// the tests in tests/graphql.js use this schema to ensure the integrity
// of the data in lib/graphql/static/*.json
// PREVIEWS
export 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
export 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))
}
export const schemaValidator = {
queryConnections,
queryFields,
mutations,
objects,
interfaces,
enums,
unions,
inputObjects,
scalars,
}