@graphql-inspector/core
Version:
Tooling for GraphQL. Compare GraphQL Schemas, check documents, find breaking changes, find similar types.
108 lines (107 loc) • 5.26 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.fieldArgumentDescriptionChangedFromMeta = fieldArgumentDescriptionChangedFromMeta;
exports.fieldArgumentDescriptionChanged = fieldArgumentDescriptionChanged;
exports.fieldArgumentDefaultChangedFromMeta = fieldArgumentDefaultChangedFromMeta;
exports.fieldArgumentDefaultChanged = fieldArgumentDefaultChanged;
exports.fieldArgumentTypeChangedFromMeta = fieldArgumentTypeChangedFromMeta;
exports.fieldArgumentTypeChanged = fieldArgumentTypeChanged;
const graphql_js_1 = require("../../utils/graphql.js");
const string_js_1 = require("../../utils/string.js");
const change_js_1 = require("./change.js");
function buildFieldArgumentDescriptionChangedMessage(args) {
return `Description for argument '${args.argumentName}' on field '${args.typeName}.${args.fieldName}' changed from '${args.oldDescription}' to '${args.newDescription}'`;
}
function fieldArgumentDescriptionChangedFromMeta(args) {
return {
type: change_js_1.ChangeType.FieldArgumentDescriptionChanged,
criticality: {
level: change_js_1.CriticalityLevel.NonBreaking,
},
message: buildFieldArgumentDescriptionChangedMessage(args.meta),
meta: args.meta,
path: [args.meta.typeName, args.meta.fieldName, args.meta.argumentName].join('.'),
};
}
function fieldArgumentDescriptionChanged(type, field, oldArg, newArg) {
return fieldArgumentDescriptionChangedFromMeta({
type: change_js_1.ChangeType.FieldArgumentDescriptionChanged,
meta: {
typeName: type.name,
fieldName: field.name,
argumentName: oldArg.name,
oldDescription: oldArg.description ?? null,
newDescription: newArg.description ?? null,
},
});
}
function buildFieldArgumentDefaultChangedMessage(args) {
return args.oldDefaultValue === undefined
? `Default value '${args.newDefaultValue}' was added to argument '${args.argumentName}' on field '${args.typeName}.${args.fieldName}'`
: `Default value for argument '${args.argumentName}' on field '${args.typeName}.${args.fieldName}' changed from '${args.oldDefaultValue}' to '${args.newDefaultValue}'`;
}
const fieldArgumentDefaultChangedCriticalityDangerousReason = 'Changing the default value for an argument may change the runtime behaviour of a field if it was never provided.';
function fieldArgumentDefaultChangedFromMeta(args) {
return {
type: change_js_1.ChangeType.FieldArgumentDefaultChanged,
criticality: {
level: change_js_1.CriticalityLevel.Dangerous,
reason: fieldArgumentDefaultChangedCriticalityDangerousReason,
},
message: buildFieldArgumentDefaultChangedMessage(args.meta),
meta: args.meta,
path: [args.meta.typeName, args.meta.fieldName, args.meta.argumentName].join('.'),
};
}
function fieldArgumentDefaultChanged(type, field, oldArg, newArg) {
const meta = {
typeName: type.name,
fieldName: field.name,
argumentName: newArg.name,
};
if (oldArg.defaultValue !== undefined) {
meta.oldDefaultValue = (0, string_js_1.safeString)(oldArg.defaultValue);
}
if (newArg.defaultValue !== undefined) {
meta.newDefaultValue = (0, string_js_1.safeString)(newArg.defaultValue);
}
return fieldArgumentDefaultChangedFromMeta({
type: change_js_1.ChangeType.FieldArgumentDefaultChanged,
meta,
});
}
function buildFieldArgumentTypeChangedMessage(args) {
return `Type for argument '${args.argumentName}' on field '${args.typeName}.${args.fieldName}' changed from '${args.oldArgumentType}' to '${args.newArgumentType}'`;
}
const fieldArgumentTypeChangedCriticalityNonBreakingReason = `Changing an input field from non-null to null is considered non-breaking.`;
const fieldArgumentTypeChangedCriticalityBreakingReason = `Changing the type of a field's argument can cause existing queries that use this argument to error.`;
function fieldArgumentTypeChangedFromMeta(args) {
return {
type: change_js_1.ChangeType.FieldArgumentTypeChanged,
criticality: args.meta.isSafeArgumentTypeChange
? {
level: change_js_1.CriticalityLevel.NonBreaking,
reason: fieldArgumentTypeChangedCriticalityNonBreakingReason,
}
: {
level: change_js_1.CriticalityLevel.Breaking,
reason: fieldArgumentTypeChangedCriticalityBreakingReason,
},
message: buildFieldArgumentTypeChangedMessage(args.meta),
meta: args.meta,
path: [args.meta.typeName, args.meta.fieldName, args.meta.argumentName].join('.'),
};
}
function fieldArgumentTypeChanged(type, field, oldArg, newArg) {
return fieldArgumentTypeChangedFromMeta({
type: change_js_1.ChangeType.FieldArgumentTypeChanged,
meta: {
typeName: type.name,
fieldName: field.name,
argumentName: newArg.name,
oldArgumentType: oldArg.type.toString(),
newArgumentType: newArg.type.toString(),
isSafeArgumentTypeChange: (0, graphql_js_1.safeChangeForInputValue)(oldArg.type, newArg.type),
},
});
}
;