{"version":3,"file":"NoUnusedFragmentsRule.js","sourceRoot":"","sources":["../../../src/validation/rules/NoUnusedFragmentsRule.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,qCAAoC;AA4C3D,MAAM,UAAU,qBAAqB,CACnC,OAA6B;IAE7B,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAC;IAC3C,MAAM,YAAY,GAAkC,EAAE,CAAC;IAEvD,OAAO;QACL,mBAAmB,CAAC,SAAS;YAC3B,KAAK,MAAM,QAAQ,IAAI,OAAO,CAAC,iCAAiC,CAC9D,SAAS,CACV,EAAE,CAAC;gBACF,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5C,CAAC;YACD,OAAO,KAAK,CAAC;QACf,CAAC;QACD,kBAAkB,CAAC,IAAI;YACrB,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,QAAQ,EAAE;YACR,KAAK;gBACH,KAAK,MAAM,WAAW,IAAI,YAAY,EAAE,CAAC;oBACvC,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;oBACxC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;wBACpC,OAAO,CAAC,WAAW,CACjB,IAAI,YAAY,CAAC,aAAa,QAAQ,kBAAkB,EAAE;4BACxD,KAAK,EAAE,WAAW;yBACnB,CAAC,CACH,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;SACF;KACF,CAAC;AACJ,CAAC","sourcesContent":["/** @category Validation Rules */\n\nimport { GraphQLError } from '../../error/GraphQLError.ts';\n\nimport type { FragmentDefinitionNode } from '../../language/ast.ts';\nimport type { ASTVisitor } from '../../language/visitor.ts';\n\nimport type { ASTValidationContext } from '../ValidationContext.ts';\n\n/**\n * No unused fragments\n *\n * A GraphQL document is only valid if all fragment definitions are spread\n * within operations, or spread within other fragments spread within operations.\n *\n * See https://spec.graphql.org/draft/#sec-Fragments-Must-Be-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 { NoUnusedFragmentsRule } from 'graphql/validation';\n *\n * const schema = buildSchema(`\n *   type Query {\n *     name: String\n *   }\n * `);\n *\n * const invalidDocument = parse(`\n *   fragment Unused on Query { name } query { name }\n * `);\n * const invalidErrors = validate(schema, invalidDocument, [\n *   NoUnusedFragmentsRule,\n * ]);\n *\n * invalidErrors.length; // => 1\n *\n * const validDocument = parse(`\n *   fragment Used on Query { name } query { ...Used }\n * `);\n * const validErrors = validate(schema, validDocument, [NoUnusedFragmentsRule]);\n *\n * validErrors; // => []\n * ```\n */\nexport function NoUnusedFragmentsRule(\n  context: ASTValidationContext,\n): ASTVisitor {\n  const fragmentNameUsed = new Set<string>();\n  const fragmentDefs: Array<FragmentDefinitionNode> = [];\n\n  return {\n    OperationDefinition(operation) {\n      for (const fragment of context.getRecursivelyReferencedFragments(\n        operation,\n      )) {\n        fragmentNameUsed.add(fragment.name.value);\n      }\n      return false;\n    },\n    FragmentDefinition(node) {\n      fragmentDefs.push(node);\n      return false;\n    },\n    Document: {\n      leave() {\n        for (const fragmentDef of fragmentDefs) {\n          const fragName = fragmentDef.name.value;\n          if (!fragmentNameUsed.has(fragName)) {\n            context.reportError(\n              new GraphQLError(`Fragment \"${fragName}\" is never used.`, {\n                nodes: fragmentDef,\n              }),\n            );\n          }\n        }\n      },\n    },\n  };\n}\n"]}