UNPKG

@graphql-inspector/cli

Version:

Tooling for GraphQL. Compare GraphQL Schemas, check documents, find breaking changes, find similar types.

389 lines (388 loc) • 18.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.directiveUsageRemoved = exports.directiveUsageAdded = void 0; const graphql_1 = require("graphql"); const change_js_1 = require("./change.js"); function addedSpecialDirective(directiveName, forceReturn) { if (directiveName === 'deprecated') { return change_js_1.CriticalityLevel.NonBreaking; } if (directiveName === 'oneOf') { return change_js_1.CriticalityLevel.Breaking; } return forceReturn; } function removedSpecialDirective(directiveName, forceReturn) { if (directiveName === 'deprecated') { return change_js_1.CriticalityLevel.NonBreaking; } if (directiveName === 'oneOf') { return change_js_1.CriticalityLevel.NonBreaking; } return forceReturn; } function directiveUsageAdded(kind, directive, payload) { if (isOfKind(kind, graphql_1.Kind.ARGUMENT, payload)) { return { type: change_js_1.ChangeType.DirectiveUsageArgumentDefinitionAdded, criticality: { level: addedSpecialDirective(directive.name.value, change_js_1.CriticalityLevel.Dangerous), reason: `Directive '${directive.name.value}' was added to argument '${payload.argument.name}'`, }, message: `Directive '${directive.name.value}' was added to argument '${payload.argument.name}'`, meta: { argumentName: payload.argument.name, addedDirectiveName: directive.name.value, fieldName: payload.field.name, typeName: payload.type.name, }, path: [ payload.type.name, payload.field.name, payload.argument.name, directive.name.value, ].join('.'), }; } if (isOfKind(kind, graphql_1.Kind.INPUT_VALUE_DEFINITION, payload)) { return { type: change_js_1.ChangeType.DirectiveUsageArgumentDefinitionAdded, criticality: { level: addedSpecialDirective(directive.name.value, change_js_1.CriticalityLevel.Dangerous), reason: `Directive '${directive.name.value}' was added to argument '${payload.field.name}'`, }, message: `Directive '${directive.name.value}' was added to argument '${payload.field.name}'`, meta: { argumentName: payload.field.name, addedDirectiveName: directive.name.value, fieldName: payload.type.name, typeName: payload.type.name, }, path: [payload.type.name, payload.field.name, directive.name.value].join('.'), }; } if (isOfKind(kind, graphql_1.Kind.INPUT_OBJECT_TYPE_DEFINITION, payload)) { return { type: change_js_1.ChangeType.DirectiveUsageInputObjectAdded, criticality: { level: addedSpecialDirective(directive.name.value, change_js_1.CriticalityLevel.Dangerous), reason: `Directive '${directive.name.value}' was added to input object '${payload.name}'`, }, message: `Directive '${directive.name.value}' was added to input object '${payload.name}'`, meta: { inputObjectName: payload.name, addedDirectiveName: directive.name.value, }, path: [payload.name, directive.name.value].join('.'), }; } if (isOfKind(kind, graphql_1.Kind.INTERFACE_TYPE_DEFINITION, payload)) { return { type: change_js_1.ChangeType.DirectiveUsageInterfaceAdded, criticality: { level: addedSpecialDirective(directive.name.value, change_js_1.CriticalityLevel.Dangerous), reason: `Directive '${directive.name.value}' was added to interface '${payload.name}'`, }, message: `Directive '${directive.name.value}' was added to interface '${payload.name}'`, meta: { interfaceName: payload.name, addedDirectiveName: directive.name.value, }, path: [payload.name, directive.name.value].join('.'), }; } if (isOfKind(kind, graphql_1.Kind.OBJECT, payload)) { return { type: change_js_1.ChangeType.DirectiveUsageObjectAdded, criticality: { level: addedSpecialDirective(directive.name.value, change_js_1.CriticalityLevel.Dangerous), reason: `Directive '${directive.name.value}' was added to object '${payload.name}'`, }, message: `Directive '${directive.name.value}' was added to object '${payload.name}'`, meta: { objectName: payload.name, addedDirectiveName: directive.name.value, }, path: [payload.name, directive.name.value].join('.'), }; } if (isOfKind(kind, graphql_1.Kind.ENUM_TYPE_DEFINITION, payload)) { return { type: change_js_1.ChangeType.DirectiveUsageEnumAdded, criticality: { level: addedSpecialDirective(directive.name.value, change_js_1.CriticalityLevel.Dangerous), reason: `Directive '${directive.name.value}' was added to enum '${payload.name}'`, }, message: `Directive '${directive.name.value}' was added to enum '${payload.name}'`, meta: { enumName: payload.name, addedDirectiveName: directive.name.value, }, path: [payload.name, directive.name.value].join('.'), }; } if (isOfKind(kind, graphql_1.Kind.FIELD_DEFINITION, payload)) { return { type: change_js_1.ChangeType.DirectiveUsageFieldDefinitionAdded, criticality: { level: addedSpecialDirective(directive.name.value, change_js_1.CriticalityLevel.Dangerous), reason: `Directive '${directive.name.value}' was added to field '${payload.parentType.name}.${payload.field.name}'`, }, message: `Directive '${directive.name.value}' was added to field '${payload.parentType.name}.${payload.field.name}'`, meta: { typeName: payload.parentType.name, fieldName: payload.field.name, addedDirectiveName: directive.name.value, }, path: [payload.parentType.name, payload.field.name, directive.name.value].join('.'), }; } if (isOfKind(kind, graphql_1.Kind.UNION_TYPE_DEFINITION, payload)) { return { type: change_js_1.ChangeType.DirectiveUsageUnionMemberAdded, criticality: { level: addedSpecialDirective(directive.name.value, change_js_1.CriticalityLevel.Dangerous), reason: `Directive '${directive.name.value}' was added to union member '${payload.name}'`, }, message: `Directive '${directive.name.value}' was added to union member '${payload.name}'`, meta: { unionName: payload.name, addedDirectiveName: directive.name.value, addedUnionMemberTypeName: payload.name, }, path: [payload.name, directive.name.value].join('.'), }; } if (isOfKind(kind, graphql_1.Kind.ENUM_VALUE_DEFINITION, payload)) { return { type: change_js_1.ChangeType.DirectiveUsageEnumValueAdded, criticality: { level: addedSpecialDirective(directive.name.value, change_js_1.CriticalityLevel.Dangerous), reason: `Directive '${directive.name.value}' was added to enum value '${payload.type.name}.${payload.value.name}'`, }, message: `Directive '${directive.name.value}' was added to enum value '${payload.type.name}.${payload.value.name}'`, meta: { enumName: payload.type.name, enumValueName: payload.value.name, addedDirectiveName: directive.name.value, }, path: [payload.type.name, payload.value.name, directive.name.value].join('.'), }; } if (isOfKind(kind, graphql_1.Kind.SCHEMA_DEFINITION, payload)) { return { type: change_js_1.ChangeType.DirectiveUsageSchemaAdded, criticality: { level: addedSpecialDirective(directive.name.value, change_js_1.CriticalityLevel.Dangerous), reason: `Directive '${directive.name.value}' was added to schema`, }, message: `Directive '${directive.name.value}' was added to schema`, meta: { addedDirectiveName: directive.name.value, schemaTypeName: payload.getQueryType()?.name || '', }, path: [payload.getQueryType()?.name || '', directive.name.value].join('.'), }; } if (isOfKind(kind, graphql_1.Kind.SCALAR_TYPE_DEFINITION, payload)) { return { type: change_js_1.ChangeType.DirectiveUsageScalarAdded, criticality: { level: addedSpecialDirective(directive.name.value, change_js_1.CriticalityLevel.Dangerous), reason: `Directive '${directive.name.value}' was added to scalar '${payload.name}'`, }, message: `Directive '${directive.name.value}' was added to scalar '${payload.name}'`, meta: { scalarName: payload.name, addedDirectiveName: directive.name.value, }, path: [payload.name, directive.name.value].join('.'), }; } return {}; } exports.directiveUsageAdded = directiveUsageAdded; function directiveUsageRemoved(kind, directive, payload) { if (isOfKind(kind, graphql_1.Kind.ARGUMENT, payload)) { return { type: change_js_1.ChangeType.DirectiveUsageArgumentDefinitionRemoved, criticality: { level: removedSpecialDirective(directive.name.value, change_js_1.CriticalityLevel.Dangerous), reason: `Directive '${directive.name.value}' was removed from argument '${payload.type.name}.${payload.field.name}'`, }, message: `Directive '${directive.name.value}' was removed from argument '${payload.type.name}.${payload.field.name}'`, meta: { argumentName: payload.argument.name, removedDirectiveName: directive.name.value, fieldName: payload.field.name, typeName: payload.type.name, }, path: [ payload.type.name, payload.field.name, payload.argument.name, directive.name.value, ].join('.'), }; } if (isOfKind(kind, graphql_1.Kind.INPUT_VALUE_DEFINITION, payload)) { return { type: change_js_1.ChangeType.DirectiveUsageArgumentDefinitionRemoved, criticality: { level: removedSpecialDirective(directive.name.value, change_js_1.CriticalityLevel.Dangerous), reason: `Directive '${directive.name.value}' was removed from input value '${payload.type.name}.${payload.field.name}'`, }, message: `Directive '${directive.name.value}' was removed from input value '${payload.type.name}.${payload.field.name}'`, meta: { argumentName: payload.field.name, removedDirectiveName: directive.name.value, fieldName: payload.type.name, typeName: payload.type.name, }, path: [payload.type.name, payload.field.name, directive.name.value].join('.'), }; } if (isOfKind(kind, graphql_1.Kind.INPUT_OBJECT_TYPE_DEFINITION, payload)) { return { type: change_js_1.ChangeType.DirectiveUsageInputObjectRemoved, criticality: { level: removedSpecialDirective(directive.name.value, change_js_1.CriticalityLevel.Dangerous), reason: `Directive '${directive.name.value}' was removed from input object '${payload.name}'`, }, message: `Directive '${directive.name.value}' was removed from input object '${payload.name}'`, meta: { inputObjectName: payload.name, removedDirectiveName: directive.name.value, }, path: [payload.name, directive.name.value].join('.'), }; } if (isOfKind(kind, graphql_1.Kind.INTERFACE_TYPE_DEFINITION, payload)) { return { type: change_js_1.ChangeType.DirectiveUsageInterfaceRemoved, criticality: { level: removedSpecialDirective(directive.name.value, change_js_1.CriticalityLevel.Breaking), reason: `Directive '${directive.name.value}' was removed from interface '${payload.name}'`, }, message: `Directive '${directive.name.value}' was removed from interface '${payload.name}'`, meta: { interfaceName: payload.name, removedDirectiveName: directive.name.value, }, path: [payload.name, directive.name.value].join('.'), }; } if (isOfKind(kind, graphql_1.Kind.OBJECT, payload)) { return { type: change_js_1.ChangeType.DirectiveUsageObjectRemoved, criticality: { level: removedSpecialDirective(directive.name.value, change_js_1.CriticalityLevel.Dangerous), reason: `Directive '${directive.name.value}' was removed from object '${payload.name}'`, }, message: `Directive '${directive.name.value}' was removed from object '${payload.name}'`, meta: { objectName: payload.name, removedDirectiveName: directive.name.value, }, path: [payload.name, directive.name.value].join('.'), }; } if (isOfKind(kind, graphql_1.Kind.ENUM_TYPE_DEFINITION, payload)) { return { type: change_js_1.ChangeType.DirectiveUsageEnumRemoved, criticality: { level: removedSpecialDirective(directive.name.value, change_js_1.CriticalityLevel.Dangerous), reason: `Directive '${directive.name.value}' was removed from enum '${payload.name}'`, }, message: `Directive '${directive.name.value}' was removed from enum '${payload.name}'`, meta: { enumName: payload.name, removedDirectiveName: directive.name.value, }, path: [payload.name, directive.name.value].join('.'), }; } if (isOfKind(kind, graphql_1.Kind.FIELD_DEFINITION, payload)) { return { type: change_js_1.ChangeType.DirectiveUsageFieldDefinitionRemoved, criticality: { level: removedSpecialDirective(directive.name.value, change_js_1.CriticalityLevel.Dangerous), reason: `Directive '${directive.name.value}' was removed from field '${payload.parentType.name}.${payload.field.name}'`, }, message: `Directive '${directive.name.value}' was removed from field '${payload.parentType.name}.${payload.field.name}'`, meta: { typeName: payload.parentType.name, fieldName: payload.field.name, removedDirectiveName: directive.name.value, }, path: [payload.parentType.name, payload.field.name, directive.name.value].join('.'), }; } if (isOfKind(kind, graphql_1.Kind.UNION_TYPE_DEFINITION, payload)) { return { type: change_js_1.ChangeType.DirectiveUsageUnionMemberRemoved, criticality: { level: removedSpecialDirective(directive.name.value, change_js_1.CriticalityLevel.Dangerous), reason: `Directive '${directive.name.value}' was removed from union member '${payload.name}'`, }, message: `Directive '${directive.name.value}' was removed from union member '${payload.name}'`, meta: { unionName: payload.name, removedDirectiveName: directive.name.value, removedUnionMemberTypeName: payload.name, }, path: [payload.name, directive.name.value].join('.'), }; } if (isOfKind(kind, graphql_1.Kind.ENUM_VALUE_DEFINITION, payload)) { return { type: change_js_1.ChangeType.DirectiveUsageEnumValueRemoved, criticality: { level: removedSpecialDirective(directive.name.value, change_js_1.CriticalityLevel.Dangerous), reason: `Directive '${directive.name.value}' was removed from enum value '${payload.type.name}.${payload.value.name}'`, }, message: `Directive '${directive.name.value}' was removed from enum value '${payload.type.name}.${payload.value.name}'`, meta: { enumName: payload.type.name, enumValueName: payload.value.name, removedDirectiveName: directive.name.value, }, path: [payload.type.name, payload.value.name, directive.name.value].join('.'), }; } if (isOfKind(kind, graphql_1.Kind.SCHEMA_DEFINITION, payload)) { return { type: change_js_1.ChangeType.DirectiveUsageSchemaRemoved, criticality: { level: removedSpecialDirective(directive.name.value, change_js_1.CriticalityLevel.Dangerous), reason: `Directive '${directive.name.value}' was removed from schema`, }, message: `Directive '${directive.name.value}' was removed from schema`, meta: { removedDirectiveName: directive.name.value, schemaTypeName: payload.getQueryType()?.name || '', }, path: [payload.getQueryType()?.name || '', directive.name.value].join('.'), }; } if (isOfKind(kind, graphql_1.Kind.SCALAR_TYPE_DEFINITION, payload)) { return { type: change_js_1.ChangeType.DirectiveUsageScalarRemoved, criticality: { level: removedSpecialDirective(directive.name.value, change_js_1.CriticalityLevel.Breaking), reason: `Directive '${directive.name.value}' was removed from scalar '${payload.name}'`, }, message: `Directive '${directive.name.value}' was removed from scalar '${payload.name}'`, meta: { scalarName: payload.name, removedDirectiveName: directive.name.value, }, path: [payload.name, directive.name.value].join('.'), }; } return {}; } exports.directiveUsageRemoved = directiveUsageRemoved; function isOfKind(kind, expectedKind, _value) { return kind === expectedKind; }