graphql
Version:
A Query Language and Runtime which can target any service.
1 lines • 4.78 kB
Source Map (JSON)
{"version":3,"file":"NoUnusedVariablesRule.js","sourceRoot":"","sources":["../../../src/validation/rules/NoUnusedVariablesRule.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,qCAAoC;AA4C3D,MAAM,UAAU,qBAAqB,CAAC,OAA0B;IAC9D,OAAO;QACL,kBAAkB,CAAC,QAAQ;YACzB,MAAM,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;YACnD,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAC9B,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAC1C,CAAC;YACF,MAAM,mBAAmB,GAAG,QAAQ,CAAC,mBAAmB,IAAI,EAAE,CAAC;YAC/D,KAAK,MAAM,MAAM,IAAI,mBAAmB,EAAE,CAAC;gBACzC,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;gBAC3C,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;oBACnC,OAAO,CAAC,WAAW,CACjB,IAAI,YAAY,CACd,cAAc,OAAO,gCAAgC,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,EAC5E,EAAE,KAAK,EAAE,MAAM,EAAE,CAClB,CACF,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QACD,mBAAmB,CAAC,SAAS;YAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,0BAA0B,CAAC,SAAS,CAAC,CAAC;YAC7D,MAAM,yBAAyB,GAAG,IAAI,GAAG,EAAU,CAAC;YACpD,KAAK,MAAM,EAAE,IAAI,EAAE,0BAA0B,EAAE,IAAI,MAAM,EAAE,CAAC;gBAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;gBAChC,IAAI,CAAC,0BAA0B,EAAE,CAAC;oBAChC,yBAAyB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBACzC,CAAC;YACH,CAAC;YAED,MAAM,mBAAmB,GAAG,SAAS,CAAC,mBAAmB,IAAI,EAAE,CAAC;YAChE,KAAK,MAAM,WAAW,IAAI,mBAAmB,EAAE,CAAC;gBAC9C,MAAM,YAAY,GAAG,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;gBACrD,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;oBACjD,OAAO,CAAC,WAAW,CACjB,IAAI,YAAY,CACd,SAAS,CAAC,IAAI;wBACZ,CAAC,CAAC,cAAc,YAAY,iCAAiC,SAAS,CAAC,IAAI,CAAC,KAAK,IAAI;wBACrF,CAAC,CAAC,cAAc,YAAY,kBAAkB,EAChD,EAAE,KAAK,EAAE,WAAW,EAAE,CACvB,CACF,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["/** @category Validation Rules */\n\nimport { GraphQLError } from '../../error/GraphQLError.ts';\n\nimport type { ASTVisitor } from '../../language/visitor.ts';\n\nimport type { ValidationContext } from '../ValidationContext.ts';\n\n/**\n * No unused variables\n *\n * A GraphQL operation is only valid if all variables defined by an operation\n * are used, either directly or within a spread fragment.\n *\n * See https://spec.graphql.org/draft/#sec-All-Variables-Used\n * @param context - The validation context used while checking the document.\n * @returns A visitor that reports validation errors for this rule.\n * @example\n * ```ts\n * import { buildSchema, parse, validate } from 'graphql';\n * import { NoUnusedVariablesRule } from 'graphql/validation';\n *\n * const schema = buildSchema(`\n * type Query {\n * field(arg: ID): String\n * name: String\n * }\n * `);\n *\n * const invalidDocument = parse(`\n * query ($id: ID) { name }\n * `);\n * const invalidErrors = validate(schema, invalidDocument, [\n * NoUnusedVariablesRule,\n * ]);\n *\n * invalidErrors.length; // => 1\n *\n * const validDocument = parse(`\n * query ($id: ID) { field(arg: $id) }\n * `);\n * const validErrors = validate(schema, validDocument, [NoUnusedVariablesRule]);\n *\n * validErrors; // => []\n * ```\n */\nexport function NoUnusedVariablesRule(context: ValidationContext): ASTVisitor {\n return {\n FragmentDefinition(fragment) {\n const usages = context.getVariableUsages(fragment);\n const argumentNameUsed = new Set<string>(\n usages.map(({ node }) => node.name.value),\n );\n const variableDefinitions = fragment.variableDefinitions ?? [];\n for (const varDef of variableDefinitions) {\n const argName = varDef.variable.name.value;\n if (!argumentNameUsed.has(argName)) {\n context.reportError(\n new GraphQLError(\n `Variable \"$${argName}\" is never used in fragment \"${fragment.name.value}\".`,\n { nodes: varDef },\n ),\n );\n }\n }\n },\n OperationDefinition(operation) {\n const usages = context.getRecursiveVariableUsages(operation);\n const operationVariableNameUsed = new Set<string>();\n for (const { node, fragmentVariableDefinition } of usages) {\n const varName = node.name.value;\n if (!fragmentVariableDefinition) {\n operationVariableNameUsed.add(varName);\n }\n }\n\n const variableDefinitions = operation.variableDefinitions ?? [];\n for (const variableDef of variableDefinitions) {\n const variableName = variableDef.variable.name.value;\n if (!operationVariableNameUsed.has(variableName)) {\n context.reportError(\n new GraphQLError(\n operation.name\n ? `Variable \"$${variableName}\" is never used in operation \"${operation.name.value}\".`\n : `Variable \"$${variableName}\" is never used.`,\n { nodes: variableDef },\n ),\n );\n }\n }\n },\n };\n}\n"]}