UNPKG

graphql

Version:

A Query Language and Runtime which can target any service.

1 lines 3.29 kB
{"version":3,"file":"NoUndefinedVariablesRule.js","sourceRoot":"","sources":["../../../src/validation/rules/NoUndefinedVariablesRule.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,qCAAoC;AA2C3D,MAAM,UAAU,wBAAwB,CACtC,OAA0B;IAE1B,OAAO;QACL,mBAAmB,CAAC,SAAS;YAC3B,MAAM,mBAAmB,GAAG,IAAI,GAAG,CACjC,SAAS,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CACvE,CAAC;YAEF,MAAM,MAAM,GAAG,OAAO,CAAC,0BAA0B,CAAC,SAAS,CAAC,CAAC;YAC7D,KAAK,MAAM,EAAE,IAAI,EAAE,0BAA0B,EAAE,IAAI,MAAM,EAAE,CAAC;gBAC1D,IAAI,0BAA0B,EAAE,CAAC;oBAC/B,SAAS;gBACX,CAAC;gBACD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;gBAChC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;oBACtC,OAAO,CAAC,WAAW,CACjB,IAAI,YAAY,CACd,SAAS,CAAC,IAAI;wBACZ,CAAC,CAAC,cAAc,OAAO,kCAAkC,SAAS,CAAC,IAAI,CAAC,KAAK,IAAI;wBACjF,CAAC,CAAC,cAAc,OAAO,mBAAmB,EAC5C,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,CAC7B,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 undefined variables\n *\n * A GraphQL operation is only valid if all variables encountered, both directly\n * and via fragment spreads, are defined by that operation.\n *\n * See https://spec.graphql.org/draft/#sec-All-Variable-Uses-Defined\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 { NoUndefinedVariablesRule } from 'graphql/validation';\n *\n * const schema = buildSchema(`\n * type Query {\n * field(arg: ID): String\n * }\n * `);\n *\n * const invalidDocument = parse(`\n * query ($id: ID) { field(arg: $missing) }\n * `);\n * const invalidErrors = validate(schema, invalidDocument, [\n * NoUndefinedVariablesRule,\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, [NoUndefinedVariablesRule]);\n *\n * validErrors; // => []\n * ```\n */\nexport function NoUndefinedVariablesRule(\n context: ValidationContext,\n): ASTVisitor {\n return {\n OperationDefinition(operation) {\n const variableNameDefined = new Set<string>(\n operation.variableDefinitions?.map((node) => node.variable.name.value),\n );\n\n const usages = context.getRecursiveVariableUsages(operation);\n for (const { node, fragmentVariableDefinition } of usages) {\n if (fragmentVariableDefinition) {\n continue;\n }\n const varName = node.name.value;\n if (!variableNameDefined.has(varName)) {\n context.reportError(\n new GraphQLError(\n operation.name\n ? `Variable \"$${varName}\" is not defined by operation \"${operation.name.value}\".`\n : `Variable \"$${varName}\" is not defined.`,\n { nodes: [node, operation] },\n ),\n );\n }\n }\n },\n };\n}\n"]}