@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
JavaScript
"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;
}