@graphql-inspector/action
Version:
GraphQL Inspector functionality for GitHub Actions
165 lines (164 loc) • 7.03 kB
JavaScript
import { GraphQLDeprecatedDirective } from 'graphql';
import { isDeprecated } from '../../utils/is-deprecated.js';
import { fmt } from '../../utils/string.js';
import { ChangeType, CriticalityLevel, } from './change.js';
function buildEnumValueRemovedMessage(args) {
return `Enum value '${args.removedEnumValueName}' ${args.isEnumValueDeprecated ? '(deprecated) ' : ''}was removed from enum '${args.enumName}'`;
}
const enumValueRemovedCriticalityBreakingReason = `Removing an enum value will cause existing queries that use this enum value to error.`;
export function enumValueRemovedFromMeta(args) {
return {
type: ChangeType.EnumValueRemoved,
criticality: {
level: CriticalityLevel.Breaking,
reason: enumValueRemovedCriticalityBreakingReason,
},
message: buildEnumValueRemovedMessage(args.meta),
meta: args.meta,
path: [args.meta.enumName, args.meta.removedEnumValueName].join('.'),
};
}
export function enumValueRemoved(oldEnum, value) {
return enumValueRemovedFromMeta({
type: ChangeType.EnumValueRemoved,
meta: {
enumName: oldEnum.name,
removedEnumValueName: value.name,
isEnumValueDeprecated: isDeprecated(value),
},
});
}
function buildEnumValueAddedMessage(args) {
return `Enum value '${args.meta.addedEnumValueName}' was added to enum '${args.meta.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) {
/** Dangerous is there was a previous enum value */
const isSafe = args.meta.addedToNewType;
return {
type: ChangeType.EnumValueAdded,
criticality: {
level: isSafe ? CriticalityLevel.NonBreaking : CriticalityLevel.Dangerous,
reason: isSafe ? undefined : enumValueAddedCriticalityDangerousReason,
},
message: buildEnumValueAddedMessage(args),
meta: args.meta,
path: [args.meta.enumName, args.meta.addedEnumValueName].join('.'),
};
}
export function enumValueAdded(type, value, addedToNewType) {
return enumValueAddedFromMeta({
type: ChangeType.EnumValueAdded,
meta: {
enumName: type.name,
addedEnumValueName: value.name,
addedToNewType,
addedDirectiveDescription: value.description ?? null,
},
});
}
function buildEnumValueDescriptionChangedMessage(args) {
const oldDesc = fmt(args.oldEnumValueDescription ?? 'undefined');
const newDesc = fmt(args.newEnumValueDescription ?? 'undefined');
return args.oldEnumValueDescription === null
? `Description '${newDesc}' was added to enum value '${args.enumName}.${args.enumValueName}'`
: `Description for enum value '${args.enumName}.${args.enumValueName}' changed from '${oldDesc}' to '${newDesc}'`;
}
export function enumValueDescriptionChangedFromMeta(args) {
return {
criticality: {
level: CriticalityLevel.NonBreaking,
},
type: ChangeType.EnumValueDescriptionChanged,
message: buildEnumValueDescriptionChangedMessage(args.meta),
path: [args.meta.enumName, args.meta.enumValueName].join('.'),
meta: args.meta,
};
}
export function enumValueDescriptionChanged(newEnum, oldValue, newValue) {
return enumValueDescriptionChangedFromMeta({
type: ChangeType.EnumValueDescriptionChanged,
meta: {
enumName: newEnum.name,
enumValueName: newValue.name,
oldEnumValueDescription: oldValue?.description ?? null,
newEnumValueDescription: newValue.description ?? null,
},
});
}
function buildEnumValueDeprecationChangedMessage(args) {
const oldReason = fmt(args.oldEnumValueDeprecationReason);
const newReason = fmt(args.newEnumValueDeprecationReason);
return `Enum value '${args.enumName}.${args.enumValueName}' deprecation reason changed from '${oldReason}' to '${newReason}'`;
}
export function enumValueDeprecationReasonChangedFromMeta(args) {
return {
criticality: {
level: CriticalityLevel.NonBreaking,
},
type: ChangeType.EnumValueDeprecationReasonChanged,
message: buildEnumValueDeprecationChangedMessage(args.meta),
path: [args.meta.enumName, args.meta.enumValueName, `@${GraphQLDeprecatedDirective.name}`].join('.'),
meta: args.meta,
};
}
export function enumValueDeprecationReasonChanged(newEnum, oldValue, newValue) {
return enumValueDeprecationReasonChangedFromMeta({
type: ChangeType.EnumValueDeprecationReasonChanged,
meta: {
enumName: newEnum.name,
enumValueName: oldValue.name,
oldEnumValueDeprecationReason: oldValue.deprecationReason ?? '',
newEnumValueDeprecationReason: newValue.deprecationReason ?? '',
},
});
}
function buildEnumValueDeprecationReasonAddedMessage(args) {
const reason = fmt(args.addedValueDeprecationReason);
return `Enum value '${args.enumName}.${args.enumValueName}' was deprecated with reason '${reason}'`;
}
export function enumValueDeprecationReasonAddedFromMeta(args) {
return {
criticality: {
level: CriticalityLevel.NonBreaking,
},
type: ChangeType.EnumValueDeprecationReasonAdded,
message: buildEnumValueDeprecationReasonAddedMessage(args.meta),
path: [args.meta.enumName, args.meta.enumValueName, `@${GraphQLDeprecatedDirective.name}`].join('.'),
meta: args.meta,
};
}
export function enumValueDeprecationReasonAdded(newEnum, _oldValue, newValue) {
return enumValueDeprecationReasonAddedFromMeta({
type: ChangeType.EnumValueDeprecationReasonAdded,
meta: {
enumName: newEnum.name,
enumValueName: newValue.name,
addedValueDeprecationReason: newValue.deprecationReason ?? '',
},
});
}
function buildEnumValueDeprecationReasonRemovedMessage(args) {
return `Deprecation reason was removed from enum value '${args.enumName}.${args.enumValueName}'`;
}
export function enumValueDeprecationReasonRemovedFromMeta(args) {
return {
criticality: {
level: CriticalityLevel.NonBreaking,
},
type: ChangeType.EnumValueDeprecationReasonRemoved,
message: buildEnumValueDeprecationReasonRemovedMessage(args.meta),
path: [args.meta.enumName, args.meta.enumValueName].join('.'),
meta: args.meta,
};
}
export function enumValueDeprecationReasonRemoved(newEnum, oldValue, _newValue) {
return enumValueDeprecationReasonRemovedFromMeta({
type: ChangeType.EnumValueDeprecationReasonRemoved,
meta: {
enumName: newEnum.name,
enumValueName: oldValue.name,
removedEnumValueDeprecationReason: oldValue.deprecationReason ?? '',
},
});
}