@graphql-inspector/cli
Version:
Tooling for GraphQL. Compare GraphQL Schemas, check documents, find breaking changes, find similar types.
81 lines (80 loc) • 3.94 kB
JavaScript
import { Kind } from 'graphql';
import { compareDirectiveLists, compareLists, diffArrays, isNotEqual, isVoid, } from '../utils/compare.js';
import { directiveUsageAdded, directiveUsageChanged, directiveUsageRemoved, } from './changes/directive-usage.js';
import { inputFieldAdded, inputFieldDefaultValueChanged, inputFieldDescriptionAdded, inputFieldDescriptionChanged, inputFieldDescriptionRemoved, inputFieldRemoved, inputFieldTypeChanged, } from './changes/input.js';
export function changesInInputObject(oldInput, newInput, addChange) {
const oldFields = oldInput?.getFields() ?? {};
const newFields = newInput.getFields();
compareLists(Object.values(oldFields), Object.values(newFields), {
onAdded(field) {
addChange(inputFieldAdded(newInput, field, oldInput == null));
changesInInputField(newInput, null, field, addChange);
},
onRemoved(field) {
addChange(inputFieldRemoved(oldInput, field));
},
onMutual(field) {
changesInInputField(newInput, field.oldVersion, field.newVersion, addChange);
},
});
compareDirectiveLists(oldInput?.astNode?.directives || [], newInput.astNode?.directives || [], {
onAdded(directive) {
addChange(directiveUsageAdded(Kind.INPUT_OBJECT_TYPE_DEFINITION, directive, newInput, oldInput === null));
directiveUsageChanged(null, directive, addChange, newInput);
},
onMutual(directive) {
directiveUsageChanged(directive.oldVersion, directive.newVersion, addChange, newInput);
},
onRemoved(directive) {
addChange(directiveUsageRemoved(Kind.INPUT_OBJECT_TYPE_DEFINITION, directive, oldInput));
},
});
}
function changesInInputField(input, oldField, newField, addChange) {
if (isNotEqual(oldField?.description, newField.description)) {
if (isVoid(oldField?.description)) {
addChange(inputFieldDescriptionAdded(input, newField));
}
else if (isVoid(newField.description)) {
addChange(inputFieldDescriptionRemoved(input, oldField));
}
else {
addChange(inputFieldDescriptionChanged(input, oldField, newField));
}
}
if (!isVoid(oldField)) {
if (isNotEqual(oldField?.defaultValue, newField.defaultValue)) {
if (Array.isArray(oldField?.defaultValue) && Array.isArray(newField.defaultValue)) {
if (diffArrays(oldField.defaultValue, newField.defaultValue).length > 0) {
addChange(inputFieldDefaultValueChanged(input, oldField, newField));
}
}
else if (JSON.stringify(oldField?.defaultValue) !== JSON.stringify(newField.defaultValue)) {
addChange(inputFieldDefaultValueChanged(input, oldField, newField));
}
}
if (!isVoid(oldField) && isNotEqual(oldField.type.toString(), newField.type.toString())) {
addChange(inputFieldTypeChanged(input, oldField, newField));
}
}
if (newField.astNode?.directives) {
compareDirectiveLists(oldField?.astNode?.directives || [], newField.astNode.directives || [], {
onAdded(directive) {
addChange(directiveUsageAdded(Kind.INPUT_VALUE_DEFINITION, directive, {
type: input,
field: newField,
}, oldField === null));
directiveUsageChanged(null, directive, addChange, input, newField);
},
onMutual(directive) {
directiveUsageChanged(directive.oldVersion, directive.newVersion, addChange, input, newField);
},
onRemoved(directive) {
addChange(directiveUsageRemoved(Kind.INPUT_VALUE_DEFINITION, directive, {
type: input,
field: newField,
}));
},
});
}
}