Spaces:
Running
Running
import { invariant } from '../../../jsutils/invariant.mjs'; | |
import { GraphQLError } from '../../../error/GraphQLError.mjs'; | |
import { getNamedType, isInputObjectType } from '../../../type/definition.mjs'; | |
/** | |
* No deprecated | |
* | |
* A GraphQL document is only valid if all selected fields and all used enum values have not been | |
* deprecated. | |
* | |
* Note: This rule is optional and is not part of the Validation section of the GraphQL | |
* Specification. The main purpose of this rule is detection of deprecated usages and not | |
* necessarily to forbid their use when querying a service. | |
*/ | |
export function NoDeprecatedCustomRule(context) { | |
return { | |
Field(node) { | |
const fieldDef = context.getFieldDef(); | |
const deprecationReason = | |
fieldDef === null || fieldDef === void 0 | |
? void 0 | |
: fieldDef.deprecationReason; | |
if (fieldDef && deprecationReason != null) { | |
const parentType = context.getParentType(); | |
parentType != null || invariant(false); | |
context.reportError( | |
new GraphQLError( | |
`The field ${parentType.name}.${fieldDef.name} is deprecated. ${deprecationReason}`, | |
{ | |
nodes: node, | |
}, | |
), | |
); | |
} | |
}, | |
Argument(node) { | |
const argDef = context.getArgument(); | |
const deprecationReason = | |
argDef === null || argDef === void 0 | |
? void 0 | |
: argDef.deprecationReason; | |
if (argDef && deprecationReason != null) { | |
const directiveDef = context.getDirective(); | |
if (directiveDef != null) { | |
context.reportError( | |
new GraphQLError( | |
`Directive "@${directiveDef.name}" argument "${argDef.name}" is deprecated. ${deprecationReason}`, | |
{ | |
nodes: node, | |
}, | |
), | |
); | |
} else { | |
const parentType = context.getParentType(); | |
const fieldDef = context.getFieldDef(); | |
(parentType != null && fieldDef != null) || invariant(false); | |
context.reportError( | |
new GraphQLError( | |
`Field "${parentType.name}.${fieldDef.name}" argument "${argDef.name}" is deprecated. ${deprecationReason}`, | |
{ | |
nodes: node, | |
}, | |
), | |
); | |
} | |
} | |
}, | |
ObjectField(node) { | |
const inputObjectDef = getNamedType(context.getParentInputType()); | |
if (isInputObjectType(inputObjectDef)) { | |
const inputFieldDef = inputObjectDef.getFields()[node.name.value]; | |
const deprecationReason = | |
inputFieldDef === null || inputFieldDef === void 0 | |
? void 0 | |
: inputFieldDef.deprecationReason; | |
if (deprecationReason != null) { | |
context.reportError( | |
new GraphQLError( | |
`The input field ${inputObjectDef.name}.${inputFieldDef.name} is deprecated. ${deprecationReason}`, | |
{ | |
nodes: node, | |
}, | |
), | |
); | |
} | |
} | |
}, | |
EnumValue(node) { | |
const enumValueDef = context.getEnumValue(); | |
const deprecationReason = | |
enumValueDef === null || enumValueDef === void 0 | |
? void 0 | |
: enumValueDef.deprecationReason; | |
if (enumValueDef && deprecationReason != null) { | |
const enumTypeDef = getNamedType(context.getInputType()); | |
enumTypeDef != null || invariant(false); | |
context.reportError( | |
new GraphQLError( | |
`The enum value "${enumTypeDef.name}.${enumValueDef.name}" is deprecated. ${deprecationReason}`, | |
{ | |
nodes: node, | |
}, | |
), | |
); | |
} | |
}, | |
}; | |
} | |