118 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			118 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 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,
 | |
|             },
 | |
|           ),
 | |
|         );
 | |
|       }
 | |
|     },
 | |
|   };
 | |
| }
 |