@graphql-inspector/core
Version:
Tooling for GraphQL. Compare GraphQL Schemas, check documents, find breaking changes, find similar types.
169 lines (168 loc) • 7.2 kB
JavaScript
import { isDeprecated } from '../../utils/is-deprecated.js';
import { fmt } from '../../utils/string.js';
import { ChangeType, CriticalityLevel, } from './change.js';
function buildEnumValueRemovedMessage(args, config) {
const value = fmt(args.removedEnumValueName, config);
const enumName = fmt(args.enumName, config);
return `Enum value ${value} ${args.isEnumValueDeprecated ? '(deprecated) ' : ''}was removed from enum ${enumName}`;
}
const enumValueRemovedCriticalityBreakingReason = `Removing an enum value will cause existing queries that use this enum value to error.`;
export function enumValueRemovedFromMeta(args, config) {
return {
type: ChangeType.EnumValueRemoved,
criticality: {
level: CriticalityLevel.Breaking,
reason: enumValueRemovedCriticalityBreakingReason,
},
message: buildEnumValueRemovedMessage(args.meta, config),
meta: args.meta,
path: [args.meta.enumName, args.meta.removedEnumValueName].join('.'),
};
}
export function enumValueRemoved(oldEnum, value, config) {
return enumValueRemovedFromMeta({
type: ChangeType.EnumValueRemoved,
meta: {
enumName: oldEnum.name,
removedEnumValueName: value.name,
isEnumValueDeprecated: isDeprecated(value),
},
}, config);
}
function buildEnumValueAddedMessage(args, config) {
const value = fmt(args.meta.addedEnumValueName, config);
const enumName = fmt(args.meta.enumName, config);
return `Enum value ${value} was added to enum ${enumName}`;
}
const enumValueAddedCriticalityDangerousReason = `Adding an enum value may break existing clients that were not programming defensively against an added case when querying an enum.`;
export function enumValueAddedFromMeta(args, config) {
return {
type: ChangeType.EnumValueAdded,
criticality: {
level: CriticalityLevel.Dangerous,
reason: enumValueAddedCriticalityDangerousReason,
},
message: buildEnumValueAddedMessage(args, config),
meta: args.meta,
path: [args.meta.enumName, args.meta.addedEnumValueName].join('.'),
};
}
export function enumValueAdded(newEnum, value, config) {
return enumValueAddedFromMeta({
type: ChangeType.EnumValueAdded,
meta: {
enumName: newEnum.name,
addedEnumValueName: value.name,
},
}, config);
}
function buildEnumValueDescriptionChangedMessage(args, config) {
const value = fmt(`${args.enumName}.${args.enumValueName}`, config);
const oldDesc = fmt(args.oldEnumValueDescription ?? 'undefined', config);
const newDesc = fmt(args.newEnumValueDescription ?? 'undefined', config);
if (args.oldEnumValueDescription === null) {
return `Description ${newDesc} was added to enum value ${value}`;
}
return `Description for enum value ${value} changed from ${oldDesc} to ${newDesc}`;
}
export function enumValueDescriptionChangedFromMeta(args, config) {
return {
criticality: {
level: CriticalityLevel.NonBreaking,
},
type: ChangeType.EnumValueDescriptionChanged,
message: buildEnumValueDescriptionChangedMessage(args.meta, config),
path: [args.meta.enumName, args.meta.enumValueName].join('.'),
meta: args.meta,
};
}
export function enumValueDescriptionChanged(newEnum, oldValue, newValue, config) {
return enumValueDescriptionChangedFromMeta({
type: ChangeType.EnumValueDescriptionChanged,
meta: {
enumName: newEnum.name,
enumValueName: oldValue.name,
oldEnumValueDescription: oldValue.description ?? null,
newEnumValueDescription: newValue.description ?? null,
},
}, config);
}
function buildEnumValueDeprecationChangedMessage(args, config) {
const value = fmt(`${args.enumName}.${args.enumValueName}`, config);
const oldReason = fmt(args.oldEnumValueDeprecationReason, config);
const newReason = fmt(args.newEnumValueDeprecationReason, config);
return `Enum value ${value} deprecation reason changed from ${oldReason} to ${newReason}`;
}
export function enumValueDeprecationReasonChangedFromMeta(args, config) {
return {
criticality: {
level: CriticalityLevel.NonBreaking,
},
type: ChangeType.EnumValueDeprecationReasonChanged,
message: buildEnumValueDeprecationChangedMessage(args.meta, config),
path: [args.meta.enumName, args.meta.enumValueName].join('.'),
meta: args.meta,
};
}
export function enumValueDeprecationReasonChanged(newEnum, oldValue, newValue, config) {
return enumValueDeprecationReasonChangedFromMeta({
type: ChangeType.EnumValueDeprecationReasonChanged,
meta: {
enumName: newEnum.name,
enumValueName: oldValue.name,
oldEnumValueDeprecationReason: oldValue.deprecationReason ?? '',
newEnumValueDeprecationReason: newValue.deprecationReason ?? '',
},
}, config);
}
function buildEnumValueDeprecationReasonAddedMessage(args, config) {
const value = fmt(`${args.enumName}.${args.enumValueName}`, config);
const reason = fmt(args.addedValueDeprecationReason, config);
return `Enum value ${value} was deprecated with reason ${reason}`;
}
export function enumValueDeprecationReasonAddedFromMeta(args, config) {
return {
criticality: {
level: CriticalityLevel.NonBreaking,
},
type: ChangeType.EnumValueDeprecationReasonAdded,
message: buildEnumValueDeprecationReasonAddedMessage(args.meta, config),
path: [args.meta.enumName, args.meta.enumValueName].join('.'),
meta: args.meta,
};
}
export function enumValueDeprecationReasonAdded(newEnum, oldValue, newValue, config) {
return enumValueDeprecationReasonAddedFromMeta({
type: ChangeType.EnumValueDeprecationReasonAdded,
meta: {
enumName: newEnum.name,
enumValueName: oldValue.name,
addedValueDeprecationReason: newValue.deprecationReason ?? '',
},
}, config);
}
function buildEnumValueDeprecationReasonRemovedMessage(args, config) {
const value = fmt(`${args.enumName}.${args.enumValueName}`, config);
return `Deprecation reason was removed from enum value ${value}`;
}
export function enumValueDeprecationReasonRemovedFromMeta(args, config) {
return {
criticality: {
level: CriticalityLevel.NonBreaking,
},
type: ChangeType.EnumValueDeprecationReasonRemoved,
message: buildEnumValueDeprecationReasonRemovedMessage(args.meta, config),
path: [args.meta.enumName, args.meta.enumValueName].join('.'),
meta: args.meta,
};
}
export function enumValueDeprecationReasonRemoved(newEnum, oldValue, _newValue, config) {
return enumValueDeprecationReasonRemovedFromMeta({
type: ChangeType.EnumValueDeprecationReasonRemoved,
meta: {
enumName: newEnum.name,
enumValueName: oldValue.name,
removedEnumValueDeprecationReason: oldValue.deprecationReason ?? '',
},
}, config);
}