graphql 17.0.0-beta.2 → 17.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (262) hide show
  1. package/README.md +3 -5
  2. package/__dev__/diagnostics.d.mts +1 -0
  3. package/__dev__/diagnostics.d.ts +1 -0
  4. package/__dev__/diagnostics.js +3 -0
  5. package/__dev__/diagnostics.mjs +3 -0
  6. package/diagnostics.d.mts +307 -0
  7. package/diagnostics.d.ts +307 -0
  8. package/diagnostics.js +75 -0
  9. package/diagnostics.js.map +1 -0
  10. package/diagnostics.mjs +70 -0
  11. package/diagnostics.mjs.map +1 -0
  12. package/error/GraphQLError.d.mts +3 -1
  13. package/error/GraphQLError.d.ts +3 -1
  14. package/error/GraphQLError.js +3 -3
  15. package/error/GraphQLError.js.map +1 -1
  16. package/error/GraphQLError.mjs +3 -3
  17. package/error/GraphQLError.mjs.map +1 -1
  18. package/error/locatedError.d.mts +1 -3
  19. package/error/locatedError.d.ts +1 -3
  20. package/error/locatedError.js.map +1 -1
  21. package/error/locatedError.mjs.map +1 -1
  22. package/execution/ExecutionArgs.d.mts +6 -0
  23. package/execution/ExecutionArgs.d.ts +6 -0
  24. package/execution/ExecutionArgs.js.map +1 -1
  25. package/execution/ExecutionArgs.mjs.map +1 -1
  26. package/execution/Executor.d.mts +19 -1
  27. package/execution/Executor.d.ts +19 -1
  28. package/execution/Executor.js +49 -4
  29. package/execution/Executor.js.map +1 -1
  30. package/execution/Executor.mjs +49 -4
  31. package/execution/Executor.mjs.map +1 -1
  32. package/execution/execute.d.mts +65 -44
  33. package/execution/execute.d.ts +65 -44
  34. package/execution/execute.js +73 -4
  35. package/execution/execute.js.map +1 -1
  36. package/execution/execute.mjs +73 -4
  37. package/execution/execute.mjs.map +1 -1
  38. package/execution/values.d.mts +17 -17
  39. package/execution/values.d.ts +17 -17
  40. package/execution/values.js.map +1 -1
  41. package/execution/values.mjs.map +1 -1
  42. package/index.d.mts +1 -0
  43. package/index.d.ts +1 -0
  44. package/index.js.map +1 -1
  45. package/index.mjs.map +1 -1
  46. package/language/parser.d.mts +20 -30
  47. package/language/parser.d.ts +20 -30
  48. package/language/parser.js +9 -9
  49. package/language/parser.js.map +1 -1
  50. package/language/parser.mjs +9 -9
  51. package/language/parser.mjs.map +1 -1
  52. package/language/predicates.d.mts +5 -1
  53. package/language/predicates.d.ts +5 -1
  54. package/language/predicates.js.map +1 -1
  55. package/language/predicates.mjs.map +1 -1
  56. package/language/source.d.mts +4 -5
  57. package/language/source.d.ts +4 -5
  58. package/language/source.js.map +1 -1
  59. package/language/source.mjs.map +1 -1
  60. package/language/visitor.d.mts +10 -2
  61. package/language/visitor.d.ts +10 -2
  62. package/language/visitor.js.map +1 -1
  63. package/language/visitor.mjs.map +1 -1
  64. package/package.json +2 -2
  65. package/type/definition.d.mts +96 -64
  66. package/type/definition.d.ts +96 -64
  67. package/type/definition.js.map +1 -1
  68. package/type/definition.mjs.map +1 -1
  69. package/type/directives.d.mts +3 -3
  70. package/type/directives.d.ts +3 -3
  71. package/type/directives.js.map +1 -1
  72. package/type/directives.mjs.map +1 -1
  73. package/type/schema.d.mts +4 -8
  74. package/type/schema.d.ts +4 -8
  75. package/type/schema.js.map +1 -1
  76. package/type/schema.mjs.map +1 -1
  77. package/type/validate.js +101 -30
  78. package/type/validate.js.map +1 -1
  79. package/type/validate.mjs +101 -30
  80. package/type/validate.mjs.map +1 -1
  81. package/utilities/TypeInfo.d.mts +1 -1
  82. package/utilities/TypeInfo.d.ts +1 -1
  83. package/utilities/TypeInfo.js.map +1 -1
  84. package/utilities/TypeInfo.mjs.map +1 -1
  85. package/utilities/buildASTSchema.d.mts +0 -1
  86. package/utilities/buildASTSchema.d.ts +0 -1
  87. package/utilities/buildASTSchema.js +0 -1
  88. package/utilities/buildASTSchema.js.map +1 -1
  89. package/utilities/buildASTSchema.mjs +0 -1
  90. package/utilities/buildASTSchema.mjs.map +1 -1
  91. package/utilities/buildClientSchema.d.mts +5 -1
  92. package/utilities/buildClientSchema.d.ts +5 -1
  93. package/utilities/buildClientSchema.js.map +1 -1
  94. package/utilities/buildClientSchema.mjs.map +1 -1
  95. package/utilities/coerceInputValue.d.mts +7 -6
  96. package/utilities/coerceInputValue.d.ts +7 -6
  97. package/utilities/coerceInputValue.js.map +1 -1
  98. package/utilities/coerceInputValue.mjs.map +1 -1
  99. package/utilities/concatAST.d.mts +4 -1
  100. package/utilities/concatAST.d.ts +4 -1
  101. package/utilities/concatAST.js.map +1 -1
  102. package/utilities/concatAST.mjs.map +1 -1
  103. package/utilities/extendSchema.d.mts +3 -3
  104. package/utilities/extendSchema.d.ts +3 -3
  105. package/utilities/extendSchema.js +5 -1
  106. package/utilities/extendSchema.js.map +1 -1
  107. package/utilities/extendSchema.mjs +5 -1
  108. package/utilities/extendSchema.mjs.map +1 -1
  109. package/utilities/introspectionFromSchema.d.mts +6 -2
  110. package/utilities/introspectionFromSchema.d.ts +6 -2
  111. package/utilities/introspectionFromSchema.js.map +1 -1
  112. package/utilities/introspectionFromSchema.mjs.map +1 -1
  113. package/utilities/lexicographicSortSchema.d.mts +5 -1
  114. package/utilities/lexicographicSortSchema.d.ts +5 -1
  115. package/utilities/lexicographicSortSchema.js.map +1 -1
  116. package/utilities/lexicographicSortSchema.mjs.map +1 -1
  117. package/utilities/printSchema.d.mts +5 -1
  118. package/utilities/printSchema.d.ts +5 -1
  119. package/utilities/printSchema.js.map +1 -1
  120. package/utilities/printSchema.mjs.map +1 -1
  121. package/utilities/replaceVariables.d.mts +4 -8
  122. package/utilities/replaceVariables.d.ts +4 -8
  123. package/utilities/replaceVariables.js.map +1 -1
  124. package/utilities/replaceVariables.mjs.map +1 -1
  125. package/utilities/stripIgnoredCharacters.d.mts +2 -2
  126. package/utilities/stripIgnoredCharacters.d.ts +2 -2
  127. package/utilities/stripIgnoredCharacters.js.map +1 -1
  128. package/utilities/stripIgnoredCharacters.mjs.map +1 -1
  129. package/utilities/typeComparators.d.mts +1 -5
  130. package/utilities/typeComparators.d.ts +1 -5
  131. package/utilities/typeComparators.js.map +1 -1
  132. package/utilities/typeComparators.mjs.map +1 -1
  133. package/utilities/validateInputValue.d.mts +10 -8
  134. package/utilities/validateInputValue.d.ts +10 -8
  135. package/utilities/validateInputValue.js.map +1 -1
  136. package/utilities/validateInputValue.mjs.map +1 -1
  137. package/validation/rules/DeferStreamDirectiveOnRootFieldRule.d.mts +4 -1
  138. package/validation/rules/DeferStreamDirectiveOnRootFieldRule.d.ts +4 -1
  139. package/validation/rules/DeferStreamDirectiveOnRootFieldRule.js +70 -17
  140. package/validation/rules/DeferStreamDirectiveOnRootFieldRule.js.map +1 -1
  141. package/validation/rules/DeferStreamDirectiveOnRootFieldRule.mjs +70 -17
  142. package/validation/rules/DeferStreamDirectiveOnRootFieldRule.mjs.map +1 -1
  143. package/validation/rules/DeferStreamDirectiveOnValidOperationsRule.d.mts +1 -1
  144. package/validation/rules/DeferStreamDirectiveOnValidOperationsRule.d.ts +1 -1
  145. package/validation/rules/DeferStreamDirectiveOnValidOperationsRule.js +90 -21
  146. package/validation/rules/DeferStreamDirectiveOnValidOperationsRule.js.map +1 -1
  147. package/validation/rules/DeferStreamDirectiveOnValidOperationsRule.mjs +91 -22
  148. package/validation/rules/DeferStreamDirectiveOnValidOperationsRule.mjs.map +1 -1
  149. package/validation/rules/ExecutableDefinitionsRule.d.mts +6 -2
  150. package/validation/rules/ExecutableDefinitionsRule.d.ts +6 -2
  151. package/validation/rules/ExecutableDefinitionsRule.js.map +1 -1
  152. package/validation/rules/ExecutableDefinitionsRule.mjs.map +1 -1
  153. package/validation/rules/FieldsOnCorrectTypeRule.d.mts +3 -1
  154. package/validation/rules/FieldsOnCorrectTypeRule.d.ts +3 -1
  155. package/validation/rules/FieldsOnCorrectTypeRule.js.map +1 -1
  156. package/validation/rules/FieldsOnCorrectTypeRule.mjs.map +1 -1
  157. package/validation/rules/FragmentsOnCompositeTypesRule.d.mts +6 -2
  158. package/validation/rules/FragmentsOnCompositeTypesRule.d.ts +6 -2
  159. package/validation/rules/FragmentsOnCompositeTypesRule.js.map +1 -1
  160. package/validation/rules/FragmentsOnCompositeTypesRule.mjs.map +1 -1
  161. package/validation/rules/KnownArgumentNamesRule.d.mts +3 -1
  162. package/validation/rules/KnownArgumentNamesRule.d.ts +3 -1
  163. package/validation/rules/KnownArgumentNamesRule.js.map +1 -1
  164. package/validation/rules/KnownArgumentNamesRule.mjs.map +1 -1
  165. package/validation/rules/KnownDirectivesRule.js +2 -1
  166. package/validation/rules/KnownDirectivesRule.js.map +1 -1
  167. package/validation/rules/KnownDirectivesRule.mjs +2 -1
  168. package/validation/rules/KnownDirectivesRule.mjs.map +1 -1
  169. package/validation/rules/KnownFragmentNamesRule.d.mts +3 -1
  170. package/validation/rules/KnownFragmentNamesRule.d.ts +3 -1
  171. package/validation/rules/KnownFragmentNamesRule.js.map +1 -1
  172. package/validation/rules/KnownFragmentNamesRule.mjs.map +1 -1
  173. package/validation/rules/LoneAnonymousOperationRule.d.mts +6 -2
  174. package/validation/rules/LoneAnonymousOperationRule.d.ts +6 -2
  175. package/validation/rules/LoneAnonymousOperationRule.js.map +1 -1
  176. package/validation/rules/LoneAnonymousOperationRule.mjs.map +1 -1
  177. package/validation/rules/MaxIntrospectionDepthRule.d.mts +6 -2
  178. package/validation/rules/MaxIntrospectionDepthRule.d.ts +6 -2
  179. package/validation/rules/MaxIntrospectionDepthRule.js.map +1 -1
  180. package/validation/rules/MaxIntrospectionDepthRule.mjs.map +1 -1
  181. package/validation/rules/NoUndefinedVariablesRule.d.mts +3 -1
  182. package/validation/rules/NoUndefinedVariablesRule.d.ts +3 -1
  183. package/validation/rules/NoUndefinedVariablesRule.js.map +1 -1
  184. package/validation/rules/NoUndefinedVariablesRule.mjs.map +1 -1
  185. package/validation/rules/NoUnusedFragmentsRule.d.mts +3 -1
  186. package/validation/rules/NoUnusedFragmentsRule.d.ts +3 -1
  187. package/validation/rules/NoUnusedFragmentsRule.js.map +1 -1
  188. package/validation/rules/NoUnusedFragmentsRule.mjs.map +1 -1
  189. package/validation/rules/NoUnusedVariablesRule.d.mts +3 -1
  190. package/validation/rules/NoUnusedVariablesRule.d.ts +3 -1
  191. package/validation/rules/NoUnusedVariablesRule.js.map +1 -1
  192. package/validation/rules/NoUnusedVariablesRule.mjs.map +1 -1
  193. package/validation/rules/OverlappingFieldsCanBeMergedRule.d.mts +6 -2
  194. package/validation/rules/OverlappingFieldsCanBeMergedRule.d.ts +6 -2
  195. package/validation/rules/OverlappingFieldsCanBeMergedRule.js.map +1 -1
  196. package/validation/rules/OverlappingFieldsCanBeMergedRule.mjs.map +1 -1
  197. package/validation/rules/PossibleFragmentSpreadsRule.d.mts +6 -2
  198. package/validation/rules/PossibleFragmentSpreadsRule.d.ts +6 -2
  199. package/validation/rules/PossibleFragmentSpreadsRule.js.map +1 -1
  200. package/validation/rules/PossibleFragmentSpreadsRule.mjs.map +1 -1
  201. package/validation/rules/ProvidedRequiredArgumentsRule.d.mts +6 -2
  202. package/validation/rules/ProvidedRequiredArgumentsRule.d.ts +6 -2
  203. package/validation/rules/ProvidedRequiredArgumentsRule.js.map +1 -1
  204. package/validation/rules/ProvidedRequiredArgumentsRule.mjs.map +1 -1
  205. package/validation/rules/SingleFieldSubscriptionsRule.d.mts +6 -2
  206. package/validation/rules/SingleFieldSubscriptionsRule.d.ts +6 -2
  207. package/validation/rules/SingleFieldSubscriptionsRule.js.map +1 -1
  208. package/validation/rules/SingleFieldSubscriptionsRule.mjs.map +1 -1
  209. package/validation/rules/UniqueArgumentNamesRule.d.mts +3 -1
  210. package/validation/rules/UniqueArgumentNamesRule.d.ts +3 -1
  211. package/validation/rules/UniqueArgumentNamesRule.js.map +1 -1
  212. package/validation/rules/UniqueArgumentNamesRule.mjs.map +1 -1
  213. package/validation/rules/UniqueDirectivesPerLocationRule.d.mts +6 -2
  214. package/validation/rules/UniqueDirectivesPerLocationRule.d.ts +6 -2
  215. package/validation/rules/UniqueDirectivesPerLocationRule.js.map +1 -1
  216. package/validation/rules/UniqueDirectivesPerLocationRule.mjs.map +1 -1
  217. package/validation/rules/UniqueFragmentNamesRule.d.mts +3 -1
  218. package/validation/rules/UniqueFragmentNamesRule.d.ts +3 -1
  219. package/validation/rules/UniqueFragmentNamesRule.js.map +1 -1
  220. package/validation/rules/UniqueFragmentNamesRule.mjs.map +1 -1
  221. package/validation/rules/UniqueInputFieldNamesRule.d.mts +6 -2
  222. package/validation/rules/UniqueInputFieldNamesRule.d.ts +6 -2
  223. package/validation/rules/UniqueInputFieldNamesRule.js.map +1 -1
  224. package/validation/rules/UniqueInputFieldNamesRule.mjs.map +1 -1
  225. package/validation/rules/UniqueOperationNamesRule.d.mts +3 -1
  226. package/validation/rules/UniqueOperationNamesRule.d.ts +3 -1
  227. package/validation/rules/UniqueOperationNamesRule.js.map +1 -1
  228. package/validation/rules/UniqueOperationNamesRule.mjs.map +1 -1
  229. package/validation/rules/UniqueVariableNamesRule.d.mts +3 -1
  230. package/validation/rules/UniqueVariableNamesRule.d.ts +3 -1
  231. package/validation/rules/UniqueVariableNamesRule.js.map +1 -1
  232. package/validation/rules/UniqueVariableNamesRule.mjs.map +1 -1
  233. package/validation/rules/ValuesOfCorrectTypeRule.d.mts +3 -1
  234. package/validation/rules/ValuesOfCorrectTypeRule.d.ts +3 -1
  235. package/validation/rules/ValuesOfCorrectTypeRule.js.map +1 -1
  236. package/validation/rules/ValuesOfCorrectTypeRule.mjs.map +1 -1
  237. package/validation/rules/VariablesAreInputTypesRule.d.mts +6 -2
  238. package/validation/rules/VariablesAreInputTypesRule.d.ts +6 -2
  239. package/validation/rules/VariablesAreInputTypesRule.js.map +1 -1
  240. package/validation/rules/VariablesAreInputTypesRule.mjs.map +1 -1
  241. package/validation/rules/VariablesInAllowedPositionRule.d.mts +6 -2
  242. package/validation/rules/VariablesInAllowedPositionRule.d.ts +6 -2
  243. package/validation/rules/VariablesInAllowedPositionRule.js.map +1 -1
  244. package/validation/rules/VariablesInAllowedPositionRule.mjs.map +1 -1
  245. package/validation/rules/custom/NoDeprecatedCustomRule.d.mts +3 -1
  246. package/validation/rules/custom/NoDeprecatedCustomRule.d.ts +3 -1
  247. package/validation/rules/custom/NoDeprecatedCustomRule.js.map +1 -1
  248. package/validation/rules/custom/NoDeprecatedCustomRule.mjs.map +1 -1
  249. package/validation/rules/custom/NoSchemaIntrospectionCustomRule.d.mts +6 -2
  250. package/validation/rules/custom/NoSchemaIntrospectionCustomRule.d.ts +6 -2
  251. package/validation/rules/custom/NoSchemaIntrospectionCustomRule.js.map +1 -1
  252. package/validation/rules/custom/NoSchemaIntrospectionCustomRule.mjs.map +1 -1
  253. package/validation/validate.d.mts +3 -6
  254. package/validation/validate.d.ts +3 -6
  255. package/validation/validate.js +6 -0
  256. package/validation/validate.js.map +1 -1
  257. package/validation/validate.mjs +6 -0
  258. package/validation/validate.mjs.map +1 -1
  259. package/version.js +2 -2
  260. package/version.js.map +1 -1
  261. package/version.mjs +2 -2
  262. package/version.mjs.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"KnownArgumentNamesRule.js","sourceRoot":"","sources":["../../../src/validation/rules/KnownArgumentNamesRule.ts"],"names":[],"mappings":"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","sourcesContent":["/** @category Validation Rules */\n\nimport { didYouMean } from '../../jsutils/didYouMean.ts';\nimport { suggestionList } from '../../jsutils/suggestionList.ts';\n\nimport { GraphQLError } from '../../error/GraphQLError.ts';\n\nimport { Kind } from '../../language/kinds.ts';\nimport type { ASTVisitor } from '../../language/visitor.ts';\n\nimport { specifiedDirectives } from '../../type/directives.ts';\n\nimport type {\n SDLValidationContext,\n ValidationContext,\n} from '../ValidationContext.ts';\n\n/**\n * Known argument names\n *\n * A GraphQL field is only valid if all supplied arguments are defined by\n * that field.\n *\n * See https://spec.graphql.org/draft/#sec-Argument-Names\n * See https://spec.graphql.org/draft/#sec-Directives-Are-In-Valid-Locations\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 { KnownArgumentNamesRule } from 'graphql/validation';\n *\n * const schema = buildSchema(`\n * type Query {\n * field(arg: String): String\n * }\n * `);\n *\n * const invalidDocument = parse(`\n * { field(unknown: \"1\") }\n * `);\n * const invalidErrors = validate(schema, invalidDocument, [KnownArgumentNamesRule]);\n *\n * invalidErrors.length; // => 1\n *\n * const validDocument = parse(`\n * { field(arg: \"1\") }\n * `);\n * const validErrors = validate(schema, validDocument, [KnownArgumentNamesRule]);\n *\n * validErrors; // => []\n * ```\n */\nexport function KnownArgumentNamesRule(context: ValidationContext): ASTVisitor {\n return {\n // eslint-disable-next-line new-cap\n ...KnownArgumentNamesOnDirectivesRule(context),\n FragmentArgument(argNode) {\n const fragmentSignature = context.getFragmentSignature();\n if (fragmentSignature) {\n const varDef = fragmentSignature.variableDefinitions.get(\n argNode.name.value,\n );\n if (!varDef) {\n const argName = argNode.name.value;\n const suggestions = context.hideSuggestions\n ? []\n : suggestionList(\n argName,\n Array.from(fragmentSignature.variableDefinitions.values()).map(\n (varSignature) => varSignature.variable.name.value,\n ),\n );\n context.reportError(\n new GraphQLError(\n `Unknown argument \"${argName}\" on fragment \"${fragmentSignature.definition.name.value}\".` +\n didYouMean(suggestions),\n { nodes: argNode },\n ),\n );\n }\n }\n },\n Argument(argNode) {\n const argDef = context.getArgument();\n const fieldDef = context.getFieldDef();\n\n if (!argDef && fieldDef) {\n const argName = argNode.name.value;\n const suggestions = context.hideSuggestions\n ? []\n : suggestionList(\n argName,\n fieldDef.args.map((arg) => arg.name),\n );\n context.reportError(\n new GraphQLError(\n `Unknown argument \"${argName}\" on field \"${fieldDef}\".` +\n didYouMean(suggestions),\n { nodes: argNode },\n ),\n );\n }\n },\n };\n}\n\n/** @internal */\nexport function KnownArgumentNamesOnDirectivesRule(\n context: ValidationContext | SDLValidationContext,\n): ASTVisitor {\n const directiveArgs = new Map<string, ReadonlyArray<string>>();\n\n const schema = context.getSchema();\n const definedDirectives = schema\n ? schema.getDirectives()\n : specifiedDirectives;\n for (const directive of definedDirectives) {\n directiveArgs.set(\n directive.name,\n directive.args.map((arg) => arg.name),\n );\n }\n\n const astDefinitions = context.getDocument().definitions;\n for (const def of astDefinitions) {\n if (def.kind === Kind.DIRECTIVE_DEFINITION) {\n const argsNodes = def.arguments ?? [];\n\n directiveArgs.set(\n def.name.value,\n argsNodes.map((arg) => arg.name.value),\n );\n }\n }\n\n return {\n Directive(directiveNode) {\n const directiveName = directiveNode.name.value;\n const knownArgs = directiveArgs.get(directiveName);\n\n if (directiveNode.arguments != null && knownArgs != null) {\n for (const argNode of directiveNode.arguments) {\n const argName = argNode.name.value;\n if (!knownArgs.includes(argName)) {\n const suggestions = suggestionList(argName, knownArgs);\n context.reportError(\n new GraphQLError(\n `Unknown argument \"${argName}\" on directive \"@${directiveName}\".` +\n (context.hideSuggestions ? '' : didYouMean(suggestions)),\n { nodes: argNode },\n ),\n );\n }\n }\n }\n\n return false;\n },\n };\n}\n"]}
1
+ {"version":3,"file":"KnownArgumentNamesRule.js","sourceRoot":"","sources":["../../../src/validation/rules/KnownArgumentNamesRule.ts"],"names":[],"mappings":"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","sourcesContent":["/** @category Validation Rules */\n\nimport { didYouMean } from '../../jsutils/didYouMean.ts';\nimport { suggestionList } from '../../jsutils/suggestionList.ts';\n\nimport { GraphQLError } from '../../error/GraphQLError.ts';\n\nimport { Kind } from '../../language/kinds.ts';\nimport type { ASTVisitor } from '../../language/visitor.ts';\n\nimport { specifiedDirectives } from '../../type/directives.ts';\n\nimport type {\n SDLValidationContext,\n ValidationContext,\n} from '../ValidationContext.ts';\n\n/**\n * Known argument names\n *\n * A GraphQL field is only valid if all supplied arguments are defined by\n * that field.\n *\n * See https://spec.graphql.org/draft/#sec-Argument-Names\n * See https://spec.graphql.org/draft/#sec-Directives-Are-In-Valid-Locations\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 { KnownArgumentNamesRule } from 'graphql/validation';\n *\n * const schema = buildSchema(`\n * type Query {\n * field(arg: String): String\n * }\n * `);\n *\n * const invalidDocument = parse(`\n * { field(unknown: \"1\") }\n * `);\n * const invalidErrors = validate(schema, invalidDocument, [\n * KnownArgumentNamesRule,\n * ]);\n *\n * invalidErrors.length; // => 1\n *\n * const validDocument = parse(`\n * { field(arg: \"1\") }\n * `);\n * const validErrors = validate(schema, validDocument, [KnownArgumentNamesRule]);\n *\n * validErrors; // => []\n * ```\n */\nexport function KnownArgumentNamesRule(context: ValidationContext): ASTVisitor {\n return {\n // eslint-disable-next-line new-cap\n ...KnownArgumentNamesOnDirectivesRule(context),\n FragmentArgument(argNode) {\n const fragmentSignature = context.getFragmentSignature();\n if (fragmentSignature) {\n const varDef = fragmentSignature.variableDefinitions.get(\n argNode.name.value,\n );\n if (!varDef) {\n const argName = argNode.name.value;\n const suggestions = context.hideSuggestions\n ? []\n : suggestionList(\n argName,\n Array.from(fragmentSignature.variableDefinitions.values()).map(\n (varSignature) => varSignature.variable.name.value,\n ),\n );\n context.reportError(\n new GraphQLError(\n `Unknown argument \"${argName}\" on fragment \"${fragmentSignature.definition.name.value}\".` +\n didYouMean(suggestions),\n { nodes: argNode },\n ),\n );\n }\n }\n },\n Argument(argNode) {\n const argDef = context.getArgument();\n const fieldDef = context.getFieldDef();\n\n if (!argDef && fieldDef) {\n const argName = argNode.name.value;\n const suggestions = context.hideSuggestions\n ? []\n : suggestionList(\n argName,\n fieldDef.args.map((arg) => arg.name),\n );\n context.reportError(\n new GraphQLError(\n `Unknown argument \"${argName}\" on field \"${fieldDef}\".` +\n didYouMean(suggestions),\n { nodes: argNode },\n ),\n );\n }\n },\n };\n}\n\n/** @internal */\nexport function KnownArgumentNamesOnDirectivesRule(\n context: ValidationContext | SDLValidationContext,\n): ASTVisitor {\n const directiveArgs = new Map<string, ReadonlyArray<string>>();\n\n const schema = context.getSchema();\n const definedDirectives = schema\n ? schema.getDirectives()\n : specifiedDirectives;\n for (const directive of definedDirectives) {\n directiveArgs.set(\n directive.name,\n directive.args.map((arg) => arg.name),\n );\n }\n\n const astDefinitions = context.getDocument().definitions;\n for (const def of astDefinitions) {\n if (def.kind === Kind.DIRECTIVE_DEFINITION) {\n const argsNodes = def.arguments ?? [];\n\n directiveArgs.set(\n def.name.value,\n argsNodes.map((arg) => arg.name.value),\n );\n }\n }\n\n return {\n Directive(directiveNode) {\n const directiveName = directiveNode.name.value;\n const knownArgs = directiveArgs.get(directiveName);\n\n if (directiveNode.arguments != null && knownArgs != null) {\n for (const argNode of directiveNode.arguments) {\n const argName = argNode.name.value;\n if (!knownArgs.includes(argName)) {\n const suggestions = suggestionList(argName, knownArgs);\n context.reportError(\n new GraphQLError(\n `Unknown argument \"${argName}\" on directive \"@${directiveName}\".` +\n (context.hideSuggestions ? '' : didYouMean(suggestions)),\n { nodes: argNode },\n ),\n );\n }\n }\n }\n\n return false;\n },\n };\n}\n"]}
@@ -90,7 +90,8 @@ function getDirectiveLocationForASTPath(ancestors) {
90
90
  const parentNode = ancestors.at(-3);
91
91
  if (!(parentNode != null && 'kind' in parentNode))
92
92
  (0, invariant_ts_1.invariant)(false);
93
- return parentNode.kind === kinds_ts_1.Kind.INPUT_OBJECT_TYPE_DEFINITION
93
+ return parentNode.kind === kinds_ts_1.Kind.INPUT_OBJECT_TYPE_DEFINITION ||
94
+ parentNode.kind === kinds_ts_1.Kind.INPUT_OBJECT_TYPE_EXTENSION
94
95
  ? directiveLocation_ts_1.DirectiveLocation.INPUT_FIELD_DEFINITION
95
96
  : directiveLocation_ts_1.DirectiveLocation.ARGUMENT_DEFINITION;
96
97
  }
@@ -1 +1 @@
1
- {"version":3,"file":"KnownDirectivesRule.js","sourceRoot":"","sources":["../../../src/validation/rules/KnownDirectivesRule.ts"],"names":[],"mappings":"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","sourcesContent":["/** @category Validation Rules */\n\nimport { inspect } from '../../jsutils/inspect.ts';\nimport { invariant } from '../../jsutils/invariant.ts';\n\nimport { GraphQLError } from '../../error/GraphQLError.ts';\n\nimport type { ASTNode } from '../../language/ast.ts';\nimport { OperationTypeNode } from '../../language/ast.ts';\nimport { DirectiveLocation } from '../../language/directiveLocation.ts';\nimport { Kind } from '../../language/kinds.ts';\nimport type { ASTVisitor } from '../../language/visitor.ts';\n\nimport { specifiedDirectives } from '../../type/directives.ts';\n\nimport type {\n SDLValidationContext,\n ValidationContext,\n} from '../ValidationContext.ts';\n\n/**\n * Known directives\n *\n * A GraphQL document is only valid if all `@directives` are known by the\n * schema and legally positioned.\n *\n * See https://spec.graphql.org/draft/#sec-Directives-Are-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 { KnownDirectivesRule } from 'graphql/validation';\n *\n * const schema = buildSchema(`\n * type Query {\n * name: String\n * }\n * `);\n *\n * const invalidDocument = parse(`\n * { name @unknown }\n * `);\n * const invalidErrors = validate(schema, invalidDocument, [KnownDirectivesRule]);\n *\n * invalidErrors.length; // => 1\n *\n * const validDocument = parse(`\n * { name @include(if: true) }\n * `);\n * const validErrors = validate(schema, validDocument, [KnownDirectivesRule]);\n *\n * validErrors; // => []\n * ```\n */\nexport function KnownDirectivesRule(\n context: ValidationContext | SDLValidationContext,\n): ASTVisitor {\n const locationsMap = new Map<string, ReadonlyArray<string>>();\n\n const schema = context.getSchema();\n const definedDirectives = schema\n ? schema.getDirectives()\n : specifiedDirectives;\n for (const directive of definedDirectives) {\n locationsMap.set(directive.name, directive.locations);\n }\n\n const astDefinitions = context.getDocument().definitions;\n for (const def of astDefinitions) {\n if (def.kind === Kind.DIRECTIVE_DEFINITION) {\n locationsMap.set(\n def.name.value,\n def.locations.map((name) => name.value),\n );\n }\n }\n\n return {\n Directive(node, _key, _parent, _path, ancestors) {\n const name = node.name.value;\n const locations = locationsMap.get(name);\n\n if (locations == null) {\n context.reportError(\n new GraphQLError(`Unknown directive \"@${name}\".`, { nodes: node }),\n );\n return;\n }\n\n const candidateLocation = getDirectiveLocationForASTPath(ancestors);\n if (candidateLocation != null && !locations.includes(candidateLocation)) {\n context.reportError(\n new GraphQLError(\n `Directive \"@${name}\" may not be used on ${candidateLocation}.`,\n { nodes: node },\n ),\n );\n }\n },\n };\n}\n\nfunction getDirectiveLocationForASTPath(\n ancestors: ReadonlyArray<ASTNode | ReadonlyArray<ASTNode>>,\n): DirectiveLocation | undefined {\n const appliedTo = ancestors.at(-1);\n invariant(appliedTo != null && 'kind' in appliedTo);\n\n switch (appliedTo.kind) {\n case Kind.OPERATION_DEFINITION:\n return getDirectiveLocationForOperation(appliedTo.operation);\n case Kind.FIELD:\n return DirectiveLocation.FIELD;\n case Kind.FRAGMENT_SPREAD:\n return DirectiveLocation.FRAGMENT_SPREAD;\n case Kind.INLINE_FRAGMENT:\n return DirectiveLocation.INLINE_FRAGMENT;\n case Kind.FRAGMENT_DEFINITION:\n return DirectiveLocation.FRAGMENT_DEFINITION;\n case Kind.VARIABLE_DEFINITION: {\n const parentNode = ancestors[ancestors.length - 3];\n invariant('kind' in parentNode);\n return parentNode.kind === Kind.OPERATION_DEFINITION\n ? DirectiveLocation.VARIABLE_DEFINITION\n : DirectiveLocation.FRAGMENT_VARIABLE_DEFINITION;\n }\n case Kind.SCHEMA_DEFINITION:\n case Kind.SCHEMA_EXTENSION:\n return DirectiveLocation.SCHEMA;\n case Kind.SCALAR_TYPE_DEFINITION:\n case Kind.SCALAR_TYPE_EXTENSION:\n return DirectiveLocation.SCALAR;\n case Kind.OBJECT_TYPE_DEFINITION:\n case Kind.OBJECT_TYPE_EXTENSION:\n return DirectiveLocation.OBJECT;\n case Kind.FIELD_DEFINITION:\n return DirectiveLocation.FIELD_DEFINITION;\n case Kind.INTERFACE_TYPE_DEFINITION:\n case Kind.INTERFACE_TYPE_EXTENSION:\n return DirectiveLocation.INTERFACE;\n case Kind.UNION_TYPE_DEFINITION:\n case Kind.UNION_TYPE_EXTENSION:\n return DirectiveLocation.UNION;\n case Kind.ENUM_TYPE_DEFINITION:\n case Kind.ENUM_TYPE_EXTENSION:\n return DirectiveLocation.ENUM;\n case Kind.ENUM_VALUE_DEFINITION:\n return DirectiveLocation.ENUM_VALUE;\n case Kind.INPUT_OBJECT_TYPE_DEFINITION:\n case Kind.INPUT_OBJECT_TYPE_EXTENSION:\n return DirectiveLocation.INPUT_OBJECT;\n case Kind.INPUT_VALUE_DEFINITION: {\n const parentNode = ancestors.at(-3);\n invariant(parentNode != null && 'kind' in parentNode);\n return parentNode.kind === Kind.INPUT_OBJECT_TYPE_DEFINITION\n ? DirectiveLocation.INPUT_FIELD_DEFINITION\n : DirectiveLocation.ARGUMENT_DEFINITION;\n }\n case Kind.DIRECTIVE_DEFINITION:\n case Kind.DIRECTIVE_EXTENSION:\n return DirectiveLocation.DIRECTIVE_DEFINITION;\n // Not reachable, all possible types have been considered.\n /* node:coverage ignore next 2 */\n default:\n invariant(false, 'Unexpected kind: ' + inspect(appliedTo.kind));\n }\n}\n\nfunction getDirectiveLocationForOperation(\n operation: OperationTypeNode,\n): DirectiveLocation {\n switch (operation) {\n case OperationTypeNode.QUERY:\n return DirectiveLocation.QUERY;\n case OperationTypeNode.MUTATION:\n return DirectiveLocation.MUTATION;\n case OperationTypeNode.SUBSCRIPTION:\n return DirectiveLocation.SUBSCRIPTION;\n }\n}\n"]}
1
+ {"version":3,"file":"KnownDirectivesRule.js","sourceRoot":"","sources":["../../../src/validation/rules/KnownDirectivesRule.ts"],"names":[],"mappings":"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","sourcesContent":["/** @category Validation Rules */\n\nimport { inspect } from '../../jsutils/inspect.ts';\nimport { invariant } from '../../jsutils/invariant.ts';\n\nimport { GraphQLError } from '../../error/GraphQLError.ts';\n\nimport type { ASTNode } from '../../language/ast.ts';\nimport { OperationTypeNode } from '../../language/ast.ts';\nimport { DirectiveLocation } from '../../language/directiveLocation.ts';\nimport { Kind } from '../../language/kinds.ts';\nimport type { ASTVisitor } from '../../language/visitor.ts';\n\nimport { specifiedDirectives } from '../../type/directives.ts';\n\nimport type {\n SDLValidationContext,\n ValidationContext,\n} from '../ValidationContext.ts';\n\n/**\n * Known directives\n *\n * A GraphQL document is only valid if all `@directives` are known by the\n * schema and legally positioned.\n *\n * See https://spec.graphql.org/draft/#sec-Directives-Are-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 { KnownDirectivesRule } from 'graphql/validation';\n *\n * const schema = buildSchema(`\n * type Query {\n * name: String\n * }\n * `);\n *\n * const invalidDocument = parse(`\n * { name @unknown }\n * `);\n * const invalidErrors = validate(schema, invalidDocument, [KnownDirectivesRule]);\n *\n * invalidErrors.length; // => 1\n *\n * const validDocument = parse(`\n * { name @include(if: true) }\n * `);\n * const validErrors = validate(schema, validDocument, [KnownDirectivesRule]);\n *\n * validErrors; // => []\n * ```\n */\nexport function KnownDirectivesRule(\n context: ValidationContext | SDLValidationContext,\n): ASTVisitor {\n const locationsMap = new Map<string, ReadonlyArray<string>>();\n\n const schema = context.getSchema();\n const definedDirectives = schema\n ? schema.getDirectives()\n : specifiedDirectives;\n for (const directive of definedDirectives) {\n locationsMap.set(directive.name, directive.locations);\n }\n\n const astDefinitions = context.getDocument().definitions;\n for (const def of astDefinitions) {\n if (def.kind === Kind.DIRECTIVE_DEFINITION) {\n locationsMap.set(\n def.name.value,\n def.locations.map((name) => name.value),\n );\n }\n }\n\n return {\n Directive(node, _key, _parent, _path, ancestors) {\n const name = node.name.value;\n const locations = locationsMap.get(name);\n\n if (locations == null) {\n context.reportError(\n new GraphQLError(`Unknown directive \"@${name}\".`, { nodes: node }),\n );\n return;\n }\n\n const candidateLocation = getDirectiveLocationForASTPath(ancestors);\n if (candidateLocation != null && !locations.includes(candidateLocation)) {\n context.reportError(\n new GraphQLError(\n `Directive \"@${name}\" may not be used on ${candidateLocation}.`,\n { nodes: node },\n ),\n );\n }\n },\n };\n}\n\nfunction getDirectiveLocationForASTPath(\n ancestors: ReadonlyArray<ASTNode | ReadonlyArray<ASTNode>>,\n): DirectiveLocation | undefined {\n const appliedTo = ancestors.at(-1);\n invariant(appliedTo != null && 'kind' in appliedTo);\n\n switch (appliedTo.kind) {\n case Kind.OPERATION_DEFINITION:\n return getDirectiveLocationForOperation(appliedTo.operation);\n case Kind.FIELD:\n return DirectiveLocation.FIELD;\n case Kind.FRAGMENT_SPREAD:\n return DirectiveLocation.FRAGMENT_SPREAD;\n case Kind.INLINE_FRAGMENT:\n return DirectiveLocation.INLINE_FRAGMENT;\n case Kind.FRAGMENT_DEFINITION:\n return DirectiveLocation.FRAGMENT_DEFINITION;\n case Kind.VARIABLE_DEFINITION: {\n const parentNode = ancestors[ancestors.length - 3];\n invariant('kind' in parentNode);\n return parentNode.kind === Kind.OPERATION_DEFINITION\n ? DirectiveLocation.VARIABLE_DEFINITION\n : DirectiveLocation.FRAGMENT_VARIABLE_DEFINITION;\n }\n case Kind.SCHEMA_DEFINITION:\n case Kind.SCHEMA_EXTENSION:\n return DirectiveLocation.SCHEMA;\n case Kind.SCALAR_TYPE_DEFINITION:\n case Kind.SCALAR_TYPE_EXTENSION:\n return DirectiveLocation.SCALAR;\n case Kind.OBJECT_TYPE_DEFINITION:\n case Kind.OBJECT_TYPE_EXTENSION:\n return DirectiveLocation.OBJECT;\n case Kind.FIELD_DEFINITION:\n return DirectiveLocation.FIELD_DEFINITION;\n case Kind.INTERFACE_TYPE_DEFINITION:\n case Kind.INTERFACE_TYPE_EXTENSION:\n return DirectiveLocation.INTERFACE;\n case Kind.UNION_TYPE_DEFINITION:\n case Kind.UNION_TYPE_EXTENSION:\n return DirectiveLocation.UNION;\n case Kind.ENUM_TYPE_DEFINITION:\n case Kind.ENUM_TYPE_EXTENSION:\n return DirectiveLocation.ENUM;\n case Kind.ENUM_VALUE_DEFINITION:\n return DirectiveLocation.ENUM_VALUE;\n case Kind.INPUT_OBJECT_TYPE_DEFINITION:\n case Kind.INPUT_OBJECT_TYPE_EXTENSION:\n return DirectiveLocation.INPUT_OBJECT;\n case Kind.INPUT_VALUE_DEFINITION: {\n const parentNode = ancestors.at(-3);\n invariant(parentNode != null && 'kind' in parentNode);\n return parentNode.kind === Kind.INPUT_OBJECT_TYPE_DEFINITION ||\n parentNode.kind === Kind.INPUT_OBJECT_TYPE_EXTENSION\n ? DirectiveLocation.INPUT_FIELD_DEFINITION\n : DirectiveLocation.ARGUMENT_DEFINITION;\n }\n case Kind.DIRECTIVE_DEFINITION:\n case Kind.DIRECTIVE_EXTENSION:\n return DirectiveLocation.DIRECTIVE_DEFINITION;\n // Not reachable, all possible types have been considered.\n /* node:coverage ignore next 2 */\n default:\n invariant(false, 'Unexpected kind: ' + inspect(appliedTo.kind));\n }\n}\n\nfunction getDirectiveLocationForOperation(\n operation: OperationTypeNode,\n): DirectiveLocation {\n switch (operation) {\n case OperationTypeNode.QUERY:\n return DirectiveLocation.QUERY;\n case OperationTypeNode.MUTATION:\n return DirectiveLocation.MUTATION;\n case OperationTypeNode.SUBSCRIPTION:\n return DirectiveLocation.SUBSCRIPTION;\n }\n}\n"]}
@@ -87,7 +87,8 @@ function getDirectiveLocationForASTPath(ancestors) {
87
87
  const parentNode = ancestors.at(-3);
88
88
  if (!(parentNode != null && 'kind' in parentNode))
89
89
  invariant(false);
90
- return parentNode.kind === Kind.INPUT_OBJECT_TYPE_DEFINITION
90
+ return parentNode.kind === Kind.INPUT_OBJECT_TYPE_DEFINITION ||
91
+ parentNode.kind === Kind.INPUT_OBJECT_TYPE_EXTENSION
91
92
  ? DirectiveLocation.INPUT_FIELD_DEFINITION
92
93
  : DirectiveLocation.ARGUMENT_DEFINITION;
93
94
  }
@@ -1 +1 @@
1
- {"version":3,"file":"KnownDirectivesRule.js","sourceRoot":"","sources":["../../../src/validation/rules/KnownDirectivesRule.ts"],"names":[],"mappings":"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","sourcesContent":["/** @category Validation Rules */\n\nimport { inspect } from '../../jsutils/inspect.ts';\nimport { invariant } from '../../jsutils/invariant.ts';\n\nimport { GraphQLError } from '../../error/GraphQLError.ts';\n\nimport type { ASTNode } from '../../language/ast.ts';\nimport { OperationTypeNode } from '../../language/ast.ts';\nimport { DirectiveLocation } from '../../language/directiveLocation.ts';\nimport { Kind } from '../../language/kinds.ts';\nimport type { ASTVisitor } from '../../language/visitor.ts';\n\nimport { specifiedDirectives } from '../../type/directives.ts';\n\nimport type {\n SDLValidationContext,\n ValidationContext,\n} from '../ValidationContext.ts';\n\n/**\n * Known directives\n *\n * A GraphQL document is only valid if all `@directives` are known by the\n * schema and legally positioned.\n *\n * See https://spec.graphql.org/draft/#sec-Directives-Are-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 { KnownDirectivesRule } from 'graphql/validation';\n *\n * const schema = buildSchema(`\n * type Query {\n * name: String\n * }\n * `);\n *\n * const invalidDocument = parse(`\n * { name @unknown }\n * `);\n * const invalidErrors = validate(schema, invalidDocument, [KnownDirectivesRule]);\n *\n * invalidErrors.length; // => 1\n *\n * const validDocument = parse(`\n * { name @include(if: true) }\n * `);\n * const validErrors = validate(schema, validDocument, [KnownDirectivesRule]);\n *\n * validErrors; // => []\n * ```\n */\nexport function KnownDirectivesRule(\n context: ValidationContext | SDLValidationContext,\n): ASTVisitor {\n const locationsMap = new Map<string, ReadonlyArray<string>>();\n\n const schema = context.getSchema();\n const definedDirectives = schema\n ? schema.getDirectives()\n : specifiedDirectives;\n for (const directive of definedDirectives) {\n locationsMap.set(directive.name, directive.locations);\n }\n\n const astDefinitions = context.getDocument().definitions;\n for (const def of astDefinitions) {\n if (def.kind === Kind.DIRECTIVE_DEFINITION) {\n locationsMap.set(\n def.name.value,\n def.locations.map((name) => name.value),\n );\n }\n }\n\n return {\n Directive(node, _key, _parent, _path, ancestors) {\n const name = node.name.value;\n const locations = locationsMap.get(name);\n\n if (locations == null) {\n context.reportError(\n new GraphQLError(`Unknown directive \"@${name}\".`, { nodes: node }),\n );\n return;\n }\n\n const candidateLocation = getDirectiveLocationForASTPath(ancestors);\n if (candidateLocation != null && !locations.includes(candidateLocation)) {\n context.reportError(\n new GraphQLError(\n `Directive \"@${name}\" may not be used on ${candidateLocation}.`,\n { nodes: node },\n ),\n );\n }\n },\n };\n}\n\nfunction getDirectiveLocationForASTPath(\n ancestors: ReadonlyArray<ASTNode | ReadonlyArray<ASTNode>>,\n): DirectiveLocation | undefined {\n const appliedTo = ancestors.at(-1);\n invariant(appliedTo != null && 'kind' in appliedTo);\n\n switch (appliedTo.kind) {\n case Kind.OPERATION_DEFINITION:\n return getDirectiveLocationForOperation(appliedTo.operation);\n case Kind.FIELD:\n return DirectiveLocation.FIELD;\n case Kind.FRAGMENT_SPREAD:\n return DirectiveLocation.FRAGMENT_SPREAD;\n case Kind.INLINE_FRAGMENT:\n return DirectiveLocation.INLINE_FRAGMENT;\n case Kind.FRAGMENT_DEFINITION:\n return DirectiveLocation.FRAGMENT_DEFINITION;\n case Kind.VARIABLE_DEFINITION: {\n const parentNode = ancestors[ancestors.length - 3];\n invariant('kind' in parentNode);\n return parentNode.kind === Kind.OPERATION_DEFINITION\n ? DirectiveLocation.VARIABLE_DEFINITION\n : DirectiveLocation.FRAGMENT_VARIABLE_DEFINITION;\n }\n case Kind.SCHEMA_DEFINITION:\n case Kind.SCHEMA_EXTENSION:\n return DirectiveLocation.SCHEMA;\n case Kind.SCALAR_TYPE_DEFINITION:\n case Kind.SCALAR_TYPE_EXTENSION:\n return DirectiveLocation.SCALAR;\n case Kind.OBJECT_TYPE_DEFINITION:\n case Kind.OBJECT_TYPE_EXTENSION:\n return DirectiveLocation.OBJECT;\n case Kind.FIELD_DEFINITION:\n return DirectiveLocation.FIELD_DEFINITION;\n case Kind.INTERFACE_TYPE_DEFINITION:\n case Kind.INTERFACE_TYPE_EXTENSION:\n return DirectiveLocation.INTERFACE;\n case Kind.UNION_TYPE_DEFINITION:\n case Kind.UNION_TYPE_EXTENSION:\n return DirectiveLocation.UNION;\n case Kind.ENUM_TYPE_DEFINITION:\n case Kind.ENUM_TYPE_EXTENSION:\n return DirectiveLocation.ENUM;\n case Kind.ENUM_VALUE_DEFINITION:\n return DirectiveLocation.ENUM_VALUE;\n case Kind.INPUT_OBJECT_TYPE_DEFINITION:\n case Kind.INPUT_OBJECT_TYPE_EXTENSION:\n return DirectiveLocation.INPUT_OBJECT;\n case Kind.INPUT_VALUE_DEFINITION: {\n const parentNode = ancestors.at(-3);\n invariant(parentNode != null && 'kind' in parentNode);\n return parentNode.kind === Kind.INPUT_OBJECT_TYPE_DEFINITION\n ? DirectiveLocation.INPUT_FIELD_DEFINITION\n : DirectiveLocation.ARGUMENT_DEFINITION;\n }\n case Kind.DIRECTIVE_DEFINITION:\n case Kind.DIRECTIVE_EXTENSION:\n return DirectiveLocation.DIRECTIVE_DEFINITION;\n // Not reachable, all possible types have been considered.\n /* node:coverage ignore next 2 */\n default:\n invariant(false, 'Unexpected kind: ' + inspect(appliedTo.kind));\n }\n}\n\nfunction getDirectiveLocationForOperation(\n operation: OperationTypeNode,\n): DirectiveLocation {\n switch (operation) {\n case OperationTypeNode.QUERY:\n return DirectiveLocation.QUERY;\n case OperationTypeNode.MUTATION:\n return DirectiveLocation.MUTATION;\n case OperationTypeNode.SUBSCRIPTION:\n return DirectiveLocation.SUBSCRIPTION;\n }\n}\n"]}
1
+ {"version":3,"file":"KnownDirectivesRule.js","sourceRoot":"","sources":["../../../src/validation/rules/KnownDirectivesRule.ts"],"names":[],"mappings":"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","sourcesContent":["/** @category Validation Rules */\n\nimport { inspect } from '../../jsutils/inspect.ts';\nimport { invariant } from '../../jsutils/invariant.ts';\n\nimport { GraphQLError } from '../../error/GraphQLError.ts';\n\nimport type { ASTNode } from '../../language/ast.ts';\nimport { OperationTypeNode } from '../../language/ast.ts';\nimport { DirectiveLocation } from '../../language/directiveLocation.ts';\nimport { Kind } from '../../language/kinds.ts';\nimport type { ASTVisitor } from '../../language/visitor.ts';\n\nimport { specifiedDirectives } from '../../type/directives.ts';\n\nimport type {\n SDLValidationContext,\n ValidationContext,\n} from '../ValidationContext.ts';\n\n/**\n * Known directives\n *\n * A GraphQL document is only valid if all `@directives` are known by the\n * schema and legally positioned.\n *\n * See https://spec.graphql.org/draft/#sec-Directives-Are-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 { KnownDirectivesRule } from 'graphql/validation';\n *\n * const schema = buildSchema(`\n * type Query {\n * name: String\n * }\n * `);\n *\n * const invalidDocument = parse(`\n * { name @unknown }\n * `);\n * const invalidErrors = validate(schema, invalidDocument, [KnownDirectivesRule]);\n *\n * invalidErrors.length; // => 1\n *\n * const validDocument = parse(`\n * { name @include(if: true) }\n * `);\n * const validErrors = validate(schema, validDocument, [KnownDirectivesRule]);\n *\n * validErrors; // => []\n * ```\n */\nexport function KnownDirectivesRule(\n context: ValidationContext | SDLValidationContext,\n): ASTVisitor {\n const locationsMap = new Map<string, ReadonlyArray<string>>();\n\n const schema = context.getSchema();\n const definedDirectives = schema\n ? schema.getDirectives()\n : specifiedDirectives;\n for (const directive of definedDirectives) {\n locationsMap.set(directive.name, directive.locations);\n }\n\n const astDefinitions = context.getDocument().definitions;\n for (const def of astDefinitions) {\n if (def.kind === Kind.DIRECTIVE_DEFINITION) {\n locationsMap.set(\n def.name.value,\n def.locations.map((name) => name.value),\n );\n }\n }\n\n return {\n Directive(node, _key, _parent, _path, ancestors) {\n const name = node.name.value;\n const locations = locationsMap.get(name);\n\n if (locations == null) {\n context.reportError(\n new GraphQLError(`Unknown directive \"@${name}\".`, { nodes: node }),\n );\n return;\n }\n\n const candidateLocation = getDirectiveLocationForASTPath(ancestors);\n if (candidateLocation != null && !locations.includes(candidateLocation)) {\n context.reportError(\n new GraphQLError(\n `Directive \"@${name}\" may not be used on ${candidateLocation}.`,\n { nodes: node },\n ),\n );\n }\n },\n };\n}\n\nfunction getDirectiveLocationForASTPath(\n ancestors: ReadonlyArray<ASTNode | ReadonlyArray<ASTNode>>,\n): DirectiveLocation | undefined {\n const appliedTo = ancestors.at(-1);\n invariant(appliedTo != null && 'kind' in appliedTo);\n\n switch (appliedTo.kind) {\n case Kind.OPERATION_DEFINITION:\n return getDirectiveLocationForOperation(appliedTo.operation);\n case Kind.FIELD:\n return DirectiveLocation.FIELD;\n case Kind.FRAGMENT_SPREAD:\n return DirectiveLocation.FRAGMENT_SPREAD;\n case Kind.INLINE_FRAGMENT:\n return DirectiveLocation.INLINE_FRAGMENT;\n case Kind.FRAGMENT_DEFINITION:\n return DirectiveLocation.FRAGMENT_DEFINITION;\n case Kind.VARIABLE_DEFINITION: {\n const parentNode = ancestors[ancestors.length - 3];\n invariant('kind' in parentNode);\n return parentNode.kind === Kind.OPERATION_DEFINITION\n ? DirectiveLocation.VARIABLE_DEFINITION\n : DirectiveLocation.FRAGMENT_VARIABLE_DEFINITION;\n }\n case Kind.SCHEMA_DEFINITION:\n case Kind.SCHEMA_EXTENSION:\n return DirectiveLocation.SCHEMA;\n case Kind.SCALAR_TYPE_DEFINITION:\n case Kind.SCALAR_TYPE_EXTENSION:\n return DirectiveLocation.SCALAR;\n case Kind.OBJECT_TYPE_DEFINITION:\n case Kind.OBJECT_TYPE_EXTENSION:\n return DirectiveLocation.OBJECT;\n case Kind.FIELD_DEFINITION:\n return DirectiveLocation.FIELD_DEFINITION;\n case Kind.INTERFACE_TYPE_DEFINITION:\n case Kind.INTERFACE_TYPE_EXTENSION:\n return DirectiveLocation.INTERFACE;\n case Kind.UNION_TYPE_DEFINITION:\n case Kind.UNION_TYPE_EXTENSION:\n return DirectiveLocation.UNION;\n case Kind.ENUM_TYPE_DEFINITION:\n case Kind.ENUM_TYPE_EXTENSION:\n return DirectiveLocation.ENUM;\n case Kind.ENUM_VALUE_DEFINITION:\n return DirectiveLocation.ENUM_VALUE;\n case Kind.INPUT_OBJECT_TYPE_DEFINITION:\n case Kind.INPUT_OBJECT_TYPE_EXTENSION:\n return DirectiveLocation.INPUT_OBJECT;\n case Kind.INPUT_VALUE_DEFINITION: {\n const parentNode = ancestors.at(-3);\n invariant(parentNode != null && 'kind' in parentNode);\n return parentNode.kind === Kind.INPUT_OBJECT_TYPE_DEFINITION ||\n parentNode.kind === Kind.INPUT_OBJECT_TYPE_EXTENSION\n ? DirectiveLocation.INPUT_FIELD_DEFINITION\n : DirectiveLocation.ARGUMENT_DEFINITION;\n }\n case Kind.DIRECTIVE_DEFINITION:\n case Kind.DIRECTIVE_EXTENSION:\n return DirectiveLocation.DIRECTIVE_DEFINITION;\n // Not reachable, all possible types have been considered.\n /* node:coverage ignore next 2 */\n default:\n invariant(false, 'Unexpected kind: ' + inspect(appliedTo.kind));\n }\n}\n\nfunction getDirectiveLocationForOperation(\n operation: OperationTypeNode,\n): DirectiveLocation {\n switch (operation) {\n case OperationTypeNode.QUERY:\n return DirectiveLocation.QUERY;\n case OperationTypeNode.MUTATION:\n return DirectiveLocation.MUTATION;\n case OperationTypeNode.SUBSCRIPTION:\n return DirectiveLocation.SUBSCRIPTION;\n }\n}\n"]}
@@ -24,7 +24,9 @@ import type { ValidationContext } from "../ValidationContext.mjs";
24
24
  * const invalidDocument = parse(`
25
25
  * { ...Missing }
26
26
  * `);
27
- * const invalidErrors = validate(schema, invalidDocument, [KnownFragmentNamesRule]);
27
+ * const invalidErrors = validate(schema, invalidDocument, [
28
+ * KnownFragmentNamesRule,
29
+ * ]);
28
30
  *
29
31
  * invalidErrors.length; // => 1
30
32
  *
@@ -24,7 +24,9 @@ import type { ValidationContext } from "../ValidationContext.js";
24
24
  * const invalidDocument = parse(`
25
25
  * { ...Missing }
26
26
  * `);
27
- * const invalidErrors = validate(schema, invalidDocument, [KnownFragmentNamesRule]);
27
+ * const invalidErrors = validate(schema, invalidDocument, [
28
+ * KnownFragmentNamesRule,
29
+ * ]);
28
30
  *
29
31
  * invalidErrors.length; // => 1
30
32
  *
@@ -1 +1 @@
1
- {"version":3,"file":"KnownFragmentNamesRule.js","sourceRoot":"","sources":["../../../src/validation/rules/KnownFragmentNamesRule.ts"],"names":[],"mappings":";;AA2CA,wDAcC;AAvDD,iEAA2D;AAyC3D,SAAgB,sBAAsB,CAAC,OAA0B;IAC/D,OAAO;QACL,cAAc,CAAC,IAAI;YACjB,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;YACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;YACnD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,CAAC,WAAW,CACjB,IAAI,8BAAY,CAAC,qBAAqB,YAAY,IAAI,EAAE;oBACtD,KAAK,EAAE,IAAI,CAAC,IAAI;iBACjB,CAAC,CACH,CAAC;YACJ,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 * Known fragment names\n *\n * A GraphQL document is only valid if all `...Fragment` fragment spreads refer\n * to fragments defined in the same document.\n *\n * See https://spec.graphql.org/draft/#sec-Fragment-spread-target-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 { KnownFragmentNamesRule } from 'graphql/validation';\n *\n * const schema = buildSchema(`\n * type Query {\n * name: String\n * }\n * `);\n *\n * const invalidDocument = parse(`\n * { ...Missing }\n * `);\n * const invalidErrors = validate(schema, invalidDocument, [KnownFragmentNamesRule]);\n *\n * invalidErrors.length; // => 1\n *\n * const validDocument = parse(`\n * fragment NameFields on Query { name } query { ...NameFields }\n * `);\n * const validErrors = validate(schema, validDocument, [KnownFragmentNamesRule]);\n *\n * validErrors; // => []\n * ```\n */\nexport function KnownFragmentNamesRule(context: ValidationContext): ASTVisitor {\n return {\n FragmentSpread(node) {\n const fragmentName = node.name.value;\n const fragment = context.getFragment(fragmentName);\n if (!fragment) {\n context.reportError(\n new GraphQLError(`Unknown fragment \"${fragmentName}\".`, {\n nodes: node.name,\n }),\n );\n }\n },\n };\n}\n"]}
1
+ {"version":3,"file":"KnownFragmentNamesRule.js","sourceRoot":"","sources":["../../../src/validation/rules/KnownFragmentNamesRule.ts"],"names":[],"mappings":";;AA6CA,wDAcC;AAzDD,iEAA2D;AA2C3D,SAAgB,sBAAsB,CAAC,OAA0B;IAC/D,OAAO;QACL,cAAc,CAAC,IAAI;YACjB,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;YACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;YACnD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,CAAC,WAAW,CACjB,IAAI,8BAAY,CAAC,qBAAqB,YAAY,IAAI,EAAE;oBACtD,KAAK,EAAE,IAAI,CAAC,IAAI;iBACjB,CAAC,CACH,CAAC;YACJ,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 * Known fragment names\n *\n * A GraphQL document is only valid if all `...Fragment` fragment spreads refer\n * to fragments defined in the same document.\n *\n * See https://spec.graphql.org/draft/#sec-Fragment-spread-target-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 { KnownFragmentNamesRule } from 'graphql/validation';\n *\n * const schema = buildSchema(`\n * type Query {\n * name: String\n * }\n * `);\n *\n * const invalidDocument = parse(`\n * { ...Missing }\n * `);\n * const invalidErrors = validate(schema, invalidDocument, [\n * KnownFragmentNamesRule,\n * ]);\n *\n * invalidErrors.length; // => 1\n *\n * const validDocument = parse(`\n * fragment NameFields on Query { name } query { ...NameFields }\n * `);\n * const validErrors = validate(schema, validDocument, [KnownFragmentNamesRule]);\n *\n * validErrors; // => []\n * ```\n */\nexport function KnownFragmentNamesRule(context: ValidationContext): ASTVisitor {\n return {\n FragmentSpread(node) {\n const fragmentName = node.name.value;\n const fragment = context.getFragment(fragmentName);\n if (!fragment) {\n context.reportError(\n new GraphQLError(`Unknown fragment \"${fragmentName}\".`, {\n nodes: node.name,\n }),\n );\n }\n },\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"KnownFragmentNamesRule.js","sourceRoot":"","sources":["../../../src/validation/rules/KnownFragmentNamesRule.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,qCAAoC;AAyC3D,MAAM,UAAU,sBAAsB,CAAC,OAA0B;IAC/D,OAAO;QACL,cAAc,CAAC,IAAI;YACjB,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;YACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;YACnD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,CAAC,WAAW,CACjB,IAAI,YAAY,CAAC,qBAAqB,YAAY,IAAI,EAAE;oBACtD,KAAK,EAAE,IAAI,CAAC,IAAI;iBACjB,CAAC,CACH,CAAC;YACJ,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 * Known fragment names\n *\n * A GraphQL document is only valid if all `...Fragment` fragment spreads refer\n * to fragments defined in the same document.\n *\n * See https://spec.graphql.org/draft/#sec-Fragment-spread-target-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 { KnownFragmentNamesRule } from 'graphql/validation';\n *\n * const schema = buildSchema(`\n * type Query {\n * name: String\n * }\n * `);\n *\n * const invalidDocument = parse(`\n * { ...Missing }\n * `);\n * const invalidErrors = validate(schema, invalidDocument, [KnownFragmentNamesRule]);\n *\n * invalidErrors.length; // => 1\n *\n * const validDocument = parse(`\n * fragment NameFields on Query { name } query { ...NameFields }\n * `);\n * const validErrors = validate(schema, validDocument, [KnownFragmentNamesRule]);\n *\n * validErrors; // => []\n * ```\n */\nexport function KnownFragmentNamesRule(context: ValidationContext): ASTVisitor {\n return {\n FragmentSpread(node) {\n const fragmentName = node.name.value;\n const fragment = context.getFragment(fragmentName);\n if (!fragment) {\n context.reportError(\n new GraphQLError(`Unknown fragment \"${fragmentName}\".`, {\n nodes: node.name,\n }),\n );\n }\n },\n };\n}\n"]}
1
+ {"version":3,"file":"KnownFragmentNamesRule.js","sourceRoot":"","sources":["../../../src/validation/rules/KnownFragmentNamesRule.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,qCAAoC;AA2C3D,MAAM,UAAU,sBAAsB,CAAC,OAA0B;IAC/D,OAAO;QACL,cAAc,CAAC,IAAI;YACjB,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;YACrC,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;YACnD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,CAAC,WAAW,CACjB,IAAI,YAAY,CAAC,qBAAqB,YAAY,IAAI,EAAE;oBACtD,KAAK,EAAE,IAAI,CAAC,IAAI;iBACjB,CAAC,CACH,CAAC;YACJ,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 * Known fragment names\n *\n * A GraphQL document is only valid if all `...Fragment` fragment spreads refer\n * to fragments defined in the same document.\n *\n * See https://spec.graphql.org/draft/#sec-Fragment-spread-target-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 { KnownFragmentNamesRule } from 'graphql/validation';\n *\n * const schema = buildSchema(`\n * type Query {\n * name: String\n * }\n * `);\n *\n * const invalidDocument = parse(`\n * { ...Missing }\n * `);\n * const invalidErrors = validate(schema, invalidDocument, [\n * KnownFragmentNamesRule,\n * ]);\n *\n * invalidErrors.length; // => 1\n *\n * const validDocument = parse(`\n * fragment NameFields on Query { name } query { ...NameFields }\n * `);\n * const validErrors = validate(schema, validDocument, [KnownFragmentNamesRule]);\n *\n * validErrors; // => []\n * ```\n */\nexport function KnownFragmentNamesRule(context: ValidationContext): ASTVisitor {\n return {\n FragmentSpread(node) {\n const fragmentName = node.name.value;\n const fragment = context.getFragment(fragmentName);\n if (!fragment) {\n context.reportError(\n new GraphQLError(`Unknown fragment \"${fragmentName}\".`, {\n nodes: node.name,\n }),\n );\n }\n },\n };\n}\n"]}
@@ -24,14 +24,18 @@ import type { ASTValidationContext } from "../ValidationContext.mjs";
24
24
  * const invalidDocument = parse(`
25
25
  * query { name } query Other { name }
26
26
  * `);
27
- * const invalidErrors = validate(schema, invalidDocument, [LoneAnonymousOperationRule]);
27
+ * const invalidErrors = validate(schema, invalidDocument, [
28
+ * LoneAnonymousOperationRule,
29
+ * ]);
28
30
  *
29
31
  * invalidErrors.length; // => 1
30
32
  *
31
33
  * const validDocument = parse(`
32
34
  * { name }
33
35
  * `);
34
- * const validErrors = validate(schema, validDocument, [LoneAnonymousOperationRule]);
36
+ * const validErrors = validate(schema, validDocument, [
37
+ * LoneAnonymousOperationRule,
38
+ * ]);
35
39
  *
36
40
  * validErrors; // => []
37
41
  * ```
@@ -24,14 +24,18 @@ import type { ASTValidationContext } from "../ValidationContext.js";
24
24
  * const invalidDocument = parse(`
25
25
  * query { name } query Other { name }
26
26
  * `);
27
- * const invalidErrors = validate(schema, invalidDocument, [LoneAnonymousOperationRule]);
27
+ * const invalidErrors = validate(schema, invalidDocument, [
28
+ * LoneAnonymousOperationRule,
29
+ * ]);
28
30
  *
29
31
  * invalidErrors.length; // => 1
30
32
  *
31
33
  * const validDocument = parse(`
32
34
  * { name }
33
35
  * `);
34
- * const validErrors = validate(schema, validDocument, [LoneAnonymousOperationRule]);
36
+ * const validErrors = validate(schema, validDocument, [
37
+ * LoneAnonymousOperationRule,
38
+ * ]);
35
39
  *
36
40
  * validErrors; // => []
37
41
  * ```
@@ -1 +1 @@
1
- {"version":3,"file":"LoneAnonymousOperationRule.js","sourceRoot":"","sources":["../../../src/validation/rules/LoneAnonymousOperationRule.ts"],"names":[],"mappings":";;AA4CA,gEAqBC;AA/DD,iEAA2D;AAE3D,sDAA+C;AAwC/C,SAAgB,0BAA0B,CACxC,OAA6B;IAE7B,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,OAAO;QACL,QAAQ,CAAC,IAAI;YACX,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CACtC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,KAAK,eAAI,CAAC,oBAAoB,CAC9D,CAAC,MAAM,CAAC;QACX,CAAC;QACD,mBAAmB,CAAC,IAAI;YACtB,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;gBACrC,OAAO,CAAC,WAAW,CACjB,IAAI,8BAAY,CACd,8DAA8D,EAC9D,EAAE,KAAK,EAAE,IAAI,EAAE,CAChB,CACF,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["/** @category Validation Rules */\n\nimport { GraphQLError } from '../../error/GraphQLError.ts';\n\nimport { Kind } from '../../language/kinds.ts';\nimport type { ASTVisitor } from '../../language/visitor.ts';\n\nimport type { ASTValidationContext } from '../ValidationContext.ts';\n\n/**\n * Lone anonymous operation\n *\n * A GraphQL document is only valid if when it contains an anonymous operation\n * (the query short-hand) that it contains only that one operation definition.\n *\n * See https://spec.graphql.org/draft/#sec-Lone-Anonymous-Operation\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 { LoneAnonymousOperationRule } from 'graphql/validation';\n *\n * const schema = buildSchema(`\n * type Query {\n * name: String\n * }\n * `);\n *\n * const invalidDocument = parse(`\n * query { name } query Other { name }\n * `);\n * const invalidErrors = validate(schema, invalidDocument, [LoneAnonymousOperationRule]);\n *\n * invalidErrors.length; // => 1\n *\n * const validDocument = parse(`\n * { name }\n * `);\n * const validErrors = validate(schema, validDocument, [LoneAnonymousOperationRule]);\n *\n * validErrors; // => []\n * ```\n */\nexport function LoneAnonymousOperationRule(\n context: ASTValidationContext,\n): ASTVisitor {\n let operationCount = 0;\n return {\n Document(node) {\n operationCount = node.definitions.filter(\n (definition) => definition.kind === Kind.OPERATION_DEFINITION,\n ).length;\n },\n OperationDefinition(node) {\n if (!node.name && operationCount > 1) {\n context.reportError(\n new GraphQLError(\n 'This anonymous operation must be the only defined operation.',\n { nodes: node },\n ),\n );\n }\n },\n };\n}\n"]}
1
+ {"version":3,"file":"LoneAnonymousOperationRule.js","sourceRoot":"","sources":["../../../src/validation/rules/LoneAnonymousOperationRule.ts"],"names":[],"mappings":";;AAgDA,gEAqBC;AAnED,iEAA2D;AAE3D,sDAA+C;AA4C/C,SAAgB,0BAA0B,CACxC,OAA6B;IAE7B,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,OAAO;QACL,QAAQ,CAAC,IAAI;YACX,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CACtC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,KAAK,eAAI,CAAC,oBAAoB,CAC9D,CAAC,MAAM,CAAC;QACX,CAAC;QACD,mBAAmB,CAAC,IAAI;YACtB,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;gBACrC,OAAO,CAAC,WAAW,CACjB,IAAI,8BAAY,CACd,8DAA8D,EAC9D,EAAE,KAAK,EAAE,IAAI,EAAE,CAChB,CACF,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["/** @category Validation Rules */\n\nimport { GraphQLError } from '../../error/GraphQLError.ts';\n\nimport { Kind } from '../../language/kinds.ts';\nimport type { ASTVisitor } from '../../language/visitor.ts';\n\nimport type { ASTValidationContext } from '../ValidationContext.ts';\n\n/**\n * Lone anonymous operation\n *\n * A GraphQL document is only valid if when it contains an anonymous operation\n * (the query short-hand) that it contains only that one operation definition.\n *\n * See https://spec.graphql.org/draft/#sec-Lone-Anonymous-Operation\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 { LoneAnonymousOperationRule } from 'graphql/validation';\n *\n * const schema = buildSchema(`\n * type Query {\n * name: String\n * }\n * `);\n *\n * const invalidDocument = parse(`\n * query { name } query Other { name }\n * `);\n * const invalidErrors = validate(schema, invalidDocument, [\n * LoneAnonymousOperationRule,\n * ]);\n *\n * invalidErrors.length; // => 1\n *\n * const validDocument = parse(`\n * { name }\n * `);\n * const validErrors = validate(schema, validDocument, [\n * LoneAnonymousOperationRule,\n * ]);\n *\n * validErrors; // => []\n * ```\n */\nexport function LoneAnonymousOperationRule(\n context: ASTValidationContext,\n): ASTVisitor {\n let operationCount = 0;\n return {\n Document(node) {\n operationCount = node.definitions.filter(\n (definition) => definition.kind === Kind.OPERATION_DEFINITION,\n ).length;\n },\n OperationDefinition(node) {\n if (!node.name && operationCount > 1) {\n context.reportError(\n new GraphQLError(\n 'This anonymous operation must be the only defined operation.',\n { nodes: node },\n ),\n );\n }\n },\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"LoneAnonymousOperationRule.js","sourceRoot":"","sources":["../../../src/validation/rules/LoneAnonymousOperationRule.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,qCAAoC;AAE3D,OAAO,EAAE,IAAI,EAAE,iCAAgC;AAwC/C,MAAM,UAAU,0BAA0B,CACxC,OAA6B;IAE7B,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,OAAO;QACL,QAAQ,CAAC,IAAI;YACX,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CACtC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,KAAK,IAAI,CAAC,oBAAoB,CAC9D,CAAC,MAAM,CAAC;QACX,CAAC;QACD,mBAAmB,CAAC,IAAI;YACtB,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;gBACrC,OAAO,CAAC,WAAW,CACjB,IAAI,YAAY,CACd,8DAA8D,EAC9D,EAAE,KAAK,EAAE,IAAI,EAAE,CAChB,CACF,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["/** @category Validation Rules */\n\nimport { GraphQLError } from '../../error/GraphQLError.ts';\n\nimport { Kind } from '../../language/kinds.ts';\nimport type { ASTVisitor } from '../../language/visitor.ts';\n\nimport type { ASTValidationContext } from '../ValidationContext.ts';\n\n/**\n * Lone anonymous operation\n *\n * A GraphQL document is only valid if when it contains an anonymous operation\n * (the query short-hand) that it contains only that one operation definition.\n *\n * See https://spec.graphql.org/draft/#sec-Lone-Anonymous-Operation\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 { LoneAnonymousOperationRule } from 'graphql/validation';\n *\n * const schema = buildSchema(`\n * type Query {\n * name: String\n * }\n * `);\n *\n * const invalidDocument = parse(`\n * query { name } query Other { name }\n * `);\n * const invalidErrors = validate(schema, invalidDocument, [LoneAnonymousOperationRule]);\n *\n * invalidErrors.length; // => 1\n *\n * const validDocument = parse(`\n * { name }\n * `);\n * const validErrors = validate(schema, validDocument, [LoneAnonymousOperationRule]);\n *\n * validErrors; // => []\n * ```\n */\nexport function LoneAnonymousOperationRule(\n context: ASTValidationContext,\n): ASTVisitor {\n let operationCount = 0;\n return {\n Document(node) {\n operationCount = node.definitions.filter(\n (definition) => definition.kind === Kind.OPERATION_DEFINITION,\n ).length;\n },\n OperationDefinition(node) {\n if (!node.name && operationCount > 1) {\n context.reportError(\n new GraphQLError(\n 'This anonymous operation must be the only defined operation.',\n { nodes: node },\n ),\n );\n }\n },\n };\n}\n"]}
1
+ {"version":3,"file":"LoneAnonymousOperationRule.js","sourceRoot":"","sources":["../../../src/validation/rules/LoneAnonymousOperationRule.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,qCAAoC;AAE3D,OAAO,EAAE,IAAI,EAAE,iCAAgC;AA4C/C,MAAM,UAAU,0BAA0B,CACxC,OAA6B;IAE7B,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,OAAO;QACL,QAAQ,CAAC,IAAI;YACX,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CACtC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,KAAK,IAAI,CAAC,oBAAoB,CAC9D,CAAC,MAAM,CAAC;QACX,CAAC;QACD,mBAAmB,CAAC,IAAI;YACtB,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,cAAc,GAAG,CAAC,EAAE,CAAC;gBACrC,OAAO,CAAC,WAAW,CACjB,IAAI,YAAY,CACd,8DAA8D,EAC9D,EAAE,KAAK,EAAE,IAAI,EAAE,CAChB,CACF,CAAC;YACJ,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["/** @category Validation Rules */\n\nimport { GraphQLError } from '../../error/GraphQLError.ts';\n\nimport { Kind } from '../../language/kinds.ts';\nimport type { ASTVisitor } from '../../language/visitor.ts';\n\nimport type { ASTValidationContext } from '../ValidationContext.ts';\n\n/**\n * Lone anonymous operation\n *\n * A GraphQL document is only valid if when it contains an anonymous operation\n * (the query short-hand) that it contains only that one operation definition.\n *\n * See https://spec.graphql.org/draft/#sec-Lone-Anonymous-Operation\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 { LoneAnonymousOperationRule } from 'graphql/validation';\n *\n * const schema = buildSchema(`\n * type Query {\n * name: String\n * }\n * `);\n *\n * const invalidDocument = parse(`\n * query { name } query Other { name }\n * `);\n * const invalidErrors = validate(schema, invalidDocument, [\n * LoneAnonymousOperationRule,\n * ]);\n *\n * invalidErrors.length; // => 1\n *\n * const validDocument = parse(`\n * { name }\n * `);\n * const validErrors = validate(schema, validDocument, [\n * LoneAnonymousOperationRule,\n * ]);\n *\n * validErrors; // => []\n * ```\n */\nexport function LoneAnonymousOperationRule(\n context: ASTValidationContext,\n): ASTVisitor {\n let operationCount = 0;\n return {\n Document(node) {\n operationCount = node.definitions.filter(\n (definition) => definition.kind === Kind.OPERATION_DEFINITION,\n ).length;\n },\n OperationDefinition(node) {\n if (!node.name && operationCount > 1) {\n context.reportError(\n new GraphQLError(\n 'This anonymous operation must be the only defined operation.',\n { nodes: node },\n ),\n );\n }\n },\n };\n}\n"]}
@@ -19,14 +19,18 @@ import type { ASTValidationContext } from "../ValidationContext.mjs";
19
19
  * const invalidDocument = parse(`
20
20
  * { __schema { types { fields { type { fields { type { fields { name } } } } } } } }
21
21
  * `);
22
- * const invalidErrors = validate(schema, invalidDocument, [MaxIntrospectionDepthRule]);
22
+ * const invalidErrors = validate(schema, invalidDocument, [
23
+ * MaxIntrospectionDepthRule,
24
+ * ]);
23
25
  *
24
26
  * invalidErrors.length; // => 1
25
27
  *
26
28
  * const validDocument = parse(`
27
29
  * { __schema { queryType { name } } }
28
30
  * `);
29
- * const validErrors = validate(schema, validDocument, [MaxIntrospectionDepthRule]);
31
+ * const validErrors = validate(schema, validDocument, [
32
+ * MaxIntrospectionDepthRule,
33
+ * ]);
30
34
  *
31
35
  * validErrors; // => []
32
36
  * ```
@@ -19,14 +19,18 @@ import type { ASTValidationContext } from "../ValidationContext.js";
19
19
  * const invalidDocument = parse(`
20
20
  * { __schema { types { fields { type { fields { type { fields { name } } } } } } } }
21
21
  * `);
22
- * const invalidErrors = validate(schema, invalidDocument, [MaxIntrospectionDepthRule]);
22
+ * const invalidErrors = validate(schema, invalidDocument, [
23
+ * MaxIntrospectionDepthRule,
24
+ * ]);
23
25
  *
24
26
  * invalidErrors.length; // => 1
25
27
  *
26
28
  * const validDocument = parse(`
27
29
  * { __schema { queryType { name } } }
28
30
  * `);
29
- * const validErrors = validate(schema, validDocument, [MaxIntrospectionDepthRule]);
31
+ * const validErrors = validate(schema, validDocument, [
32
+ * MaxIntrospectionDepthRule,
33
+ * ]);
30
34
  *
31
35
  * validErrors; // => []
32
36
  * ```
@@ -1 +1 @@
1
- {"version":3,"file":"MaxIntrospectionDepthRule.js","sourceRoot":"","sources":["../../../src/validation/rules/MaxIntrospectionDepthRule.ts"],"names":[],"mappings":";;AA0CA,8DAkFC;AA1HD,iEAA2D;AAG3D,sDAA+C;AAK/C,MAAM,eAAe,GAAG,CAAC,CAAC;AAgC1B,SAAgB,yBAAyB,CACvC,OAA6B;IAQ7B,SAAS,UAAU,CACjB,IAAa,EACb,mBAEI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EACvB,QAAgB,CAAC;QAEjB,IAAI,IAAI,CAAC,IAAI,KAAK,eAAI,CAAC,eAAe,EAAE,CAAC;YACvC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;YACrC,IAAI,gBAAgB,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE,CAAC;gBAE5C,OAAO,KAAK,CAAC;YACf,CAAC;YACD,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;YACnD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAEd,OAAO,KAAK,CAAC;YACf,CAAC;YAOD,IAAI,CAAC;gBACH,gBAAgB,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC;gBACtC,OAAO,UAAU,CAAC,QAAQ,EAAE,gBAAgB,EAAE,KAAK,CAAC,CAAC;YACvD,CAAC;oBAAS,CAAC;gBACT,gBAAgB,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC;YAC7C,CAAC;QACH,CAAC;QAED,IACE,IAAI,CAAC,IAAI,KAAK,eAAI,CAAC,KAAK;YAExB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,QAAQ;gBAC3B,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,YAAY;gBAChC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,eAAe;gBACnC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,aAAa,CAAC,EACpC,CAAC;YAED,KAAK,EAAE,CAAC;YACR,IAAI,KAAK,IAAI,eAAe,EAAE,CAAC;gBAC7B,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAGD,IAAI,cAAc,IAAI,IAAI,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAChD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC;gBACjD,IAAI,UAAU,CAAC,KAAK,EAAE,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC;oBAC/C,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO;QACL,KAAK,CAAC,IAAI;YACR,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACnE,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;oBACrB,OAAO,CAAC,WAAW,CACjB,IAAI,8BAAY,CAAC,sCAAsC,EAAE;wBACvD,KAAK,EAAE,CAAC,IAAI,CAAC;qBACd,CAAC,CACH,CAAC;oBACF,OAAO,KAAK,CAAC;gBACf,CAAC;YACH,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["/** @category Validation Rules */\n\nimport { GraphQLError } from '../../error/GraphQLError.ts';\n\nimport type { ASTNode } from '../../language/ast.ts';\nimport { Kind } from '../../language/kinds.ts';\nimport type { ASTVisitor } from '../../language/visitor.ts';\n\nimport type { ASTValidationContext } from '../ValidationContext.ts';\n\nconst MAX_LISTS_DEPTH = 3;\n\n/**\n * Implements the max introspection depth validation rule.\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 { MaxIntrospectionDepthRule } from 'graphql/validation';\n *\n * const schema = buildSchema(`\n * type Query {\n * name: String\n * }\n * `);\n *\n * const invalidDocument = parse(`\n * { __schema { types { fields { type { fields { type { fields { name } } } } } } } }\n * `);\n * const invalidErrors = validate(schema, invalidDocument, [MaxIntrospectionDepthRule]);\n *\n * invalidErrors.length; // => 1\n *\n * const validDocument = parse(`\n * { __schema { queryType { name } } }\n * `);\n * const validErrors = validate(schema, validDocument, [MaxIntrospectionDepthRule]);\n *\n * validErrors; // => []\n * ```\n */\nexport function MaxIntrospectionDepthRule(\n context: ASTValidationContext,\n): ASTVisitor {\n /**\n * Counts the depth of list fields in \"__Type\" recursively and\n * returns `true` if the limit has been reached.\n *\n * @internal\n */\n function checkDepth(\n node: ASTNode,\n visitedFragments: {\n [fragmentName: string]: true | undefined;\n } = Object.create(null),\n depth: number = 0,\n ): boolean {\n if (node.kind === Kind.FRAGMENT_SPREAD) {\n const fragmentName = node.name.value;\n if (visitedFragments[fragmentName] === true) {\n // Fragment cycles are handled by `NoFragmentCyclesRule`.\n return false;\n }\n const fragment = context.getFragment(fragmentName);\n if (!fragment) {\n // Missing fragments checks are handled by `KnownFragmentNamesRule`.\n return false;\n }\n\n // Rather than following an immutable programming pattern which has\n // significant memory and garbage collection overhead, we've opted to\n // take a mutable approach for efficiency's sake. Importantly visiting a\n // fragment twice is fine, so long as you don't do one visit inside the\n // other.\n try {\n visitedFragments[fragmentName] = true;\n return checkDepth(fragment, visitedFragments, depth);\n } finally {\n visitedFragments[fragmentName] = undefined;\n }\n }\n\n if (\n node.kind === Kind.FIELD &&\n // check all introspection lists\n (node.name.value === 'fields' ||\n node.name.value === 'interfaces' ||\n node.name.value === 'possibleTypes' ||\n node.name.value === 'inputFields')\n ) {\n // eslint-disable-next-line no-param-reassign\n depth++;\n if (depth >= MAX_LISTS_DEPTH) {\n return true;\n }\n }\n\n // handles fields and inline fragments\n if ('selectionSet' in node && node.selectionSet) {\n for (const child of node.selectionSet.selections) {\n if (checkDepth(child, visitedFragments, depth)) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n return {\n Field(node) {\n if (node.name.value === '__schema' || node.name.value === '__type') {\n if (checkDepth(node)) {\n context.reportError(\n new GraphQLError('Maximum introspection depth exceeded', {\n nodes: [node],\n }),\n );\n return false;\n }\n }\n },\n };\n}\n"]}
1
+ {"version":3,"file":"MaxIntrospectionDepthRule.js","sourceRoot":"","sources":["../../../src/validation/rules/MaxIntrospectionDepthRule.ts"],"names":[],"mappings":";;AA8CA,8DAkFC;AA9HD,iEAA2D;AAG3D,sDAA+C;AAK/C,MAAM,eAAe,GAAG,CAAC,CAAC;AAoC1B,SAAgB,yBAAyB,CACvC,OAA6B;IAQ7B,SAAS,UAAU,CACjB,IAAa,EACb,mBAEI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EACvB,QAAgB,CAAC;QAEjB,IAAI,IAAI,CAAC,IAAI,KAAK,eAAI,CAAC,eAAe,EAAE,CAAC;YACvC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;YACrC,IAAI,gBAAgB,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE,CAAC;gBAE5C,OAAO,KAAK,CAAC;YACf,CAAC;YACD,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;YACnD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAEd,OAAO,KAAK,CAAC;YACf,CAAC;YAOD,IAAI,CAAC;gBACH,gBAAgB,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC;gBACtC,OAAO,UAAU,CAAC,QAAQ,EAAE,gBAAgB,EAAE,KAAK,CAAC,CAAC;YACvD,CAAC;oBAAS,CAAC;gBACT,gBAAgB,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC;YAC7C,CAAC;QACH,CAAC;QAED,IACE,IAAI,CAAC,IAAI,KAAK,eAAI,CAAC,KAAK;YAExB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,QAAQ;gBAC3B,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,YAAY;gBAChC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,eAAe;gBACnC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,aAAa,CAAC,EACpC,CAAC;YAED,KAAK,EAAE,CAAC;YACR,IAAI,KAAK,IAAI,eAAe,EAAE,CAAC;gBAC7B,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAGD,IAAI,cAAc,IAAI,IAAI,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAChD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC;gBACjD,IAAI,UAAU,CAAC,KAAK,EAAE,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC;oBAC/C,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO;QACL,KAAK,CAAC,IAAI;YACR,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACnE,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;oBACrB,OAAO,CAAC,WAAW,CACjB,IAAI,8BAAY,CAAC,sCAAsC,EAAE;wBACvD,KAAK,EAAE,CAAC,IAAI,CAAC;qBACd,CAAC,CACH,CAAC;oBACF,OAAO,KAAK,CAAC;gBACf,CAAC;YACH,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["/** @category Validation Rules */\n\nimport { GraphQLError } from '../../error/GraphQLError.ts';\n\nimport type { ASTNode } from '../../language/ast.ts';\nimport { Kind } from '../../language/kinds.ts';\nimport type { ASTVisitor } from '../../language/visitor.ts';\n\nimport type { ASTValidationContext } from '../ValidationContext.ts';\n\nconst MAX_LISTS_DEPTH = 3;\n\n/**\n * Implements the max introspection depth validation rule.\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 { MaxIntrospectionDepthRule } from 'graphql/validation';\n *\n * const schema = buildSchema(`\n * type Query {\n * name: String\n * }\n * `);\n *\n * const invalidDocument = parse(`\n * { __schema { types { fields { type { fields { type { fields { name } } } } } } } }\n * `);\n * const invalidErrors = validate(schema, invalidDocument, [\n * MaxIntrospectionDepthRule,\n * ]);\n *\n * invalidErrors.length; // => 1\n *\n * const validDocument = parse(`\n * { __schema { queryType { name } } }\n * `);\n * const validErrors = validate(schema, validDocument, [\n * MaxIntrospectionDepthRule,\n * ]);\n *\n * validErrors; // => []\n * ```\n */\nexport function MaxIntrospectionDepthRule(\n context: ASTValidationContext,\n): ASTVisitor {\n /**\n * Counts the depth of list fields in \"__Type\" recursively and\n * returns `true` if the limit has been reached.\n *\n * @internal\n */\n function checkDepth(\n node: ASTNode,\n visitedFragments: {\n [fragmentName: string]: true | undefined;\n } = Object.create(null),\n depth: number = 0,\n ): boolean {\n if (node.kind === Kind.FRAGMENT_SPREAD) {\n const fragmentName = node.name.value;\n if (visitedFragments[fragmentName] === true) {\n // Fragment cycles are handled by `NoFragmentCyclesRule`.\n return false;\n }\n const fragment = context.getFragment(fragmentName);\n if (!fragment) {\n // Missing fragments checks are handled by `KnownFragmentNamesRule`.\n return false;\n }\n\n // Rather than following an immutable programming pattern which has\n // significant memory and garbage collection overhead, we've opted to\n // take a mutable approach for efficiency's sake. Importantly visiting a\n // fragment twice is fine, so long as you don't do one visit inside the\n // other.\n try {\n visitedFragments[fragmentName] = true;\n return checkDepth(fragment, visitedFragments, depth);\n } finally {\n visitedFragments[fragmentName] = undefined;\n }\n }\n\n if (\n node.kind === Kind.FIELD &&\n // check all introspection lists\n (node.name.value === 'fields' ||\n node.name.value === 'interfaces' ||\n node.name.value === 'possibleTypes' ||\n node.name.value === 'inputFields')\n ) {\n // eslint-disable-next-line no-param-reassign\n depth++;\n if (depth >= MAX_LISTS_DEPTH) {\n return true;\n }\n }\n\n // handles fields and inline fragments\n if ('selectionSet' in node && node.selectionSet) {\n for (const child of node.selectionSet.selections) {\n if (checkDepth(child, visitedFragments, depth)) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n return {\n Field(node) {\n if (node.name.value === '__schema' || node.name.value === '__type') {\n if (checkDepth(node)) {\n context.reportError(\n new GraphQLError('Maximum introspection depth exceeded', {\n nodes: [node],\n }),\n );\n return false;\n }\n }\n },\n };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"MaxIntrospectionDepthRule.js","sourceRoot":"","sources":["../../../src/validation/rules/MaxIntrospectionDepthRule.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,qCAAoC;AAG3D,OAAO,EAAE,IAAI,EAAE,iCAAgC;AAK/C,MAAM,eAAe,GAAG,CAAC,CAAC;AAgC1B,MAAM,UAAU,yBAAyB,CACvC,OAA6B;IAQ7B,SAAS,UAAU,CACjB,IAAa,EACb,mBAEI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EACvB,QAAgB,CAAC;QAEjB,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,eAAe,EAAE,CAAC;YACvC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;YACrC,IAAI,gBAAgB,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE,CAAC;gBAE5C,OAAO,KAAK,CAAC;YACf,CAAC;YACD,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;YACnD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAEd,OAAO,KAAK,CAAC;YACf,CAAC;YAOD,IAAI,CAAC;gBACH,gBAAgB,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC;gBACtC,OAAO,UAAU,CAAC,QAAQ,EAAE,gBAAgB,EAAE,KAAK,CAAC,CAAC;YACvD,CAAC;oBAAS,CAAC;gBACT,gBAAgB,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC;YAC7C,CAAC;QACH,CAAC;QAED,IACE,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK;YAExB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,QAAQ;gBAC3B,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,YAAY;gBAChC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,eAAe;gBACnC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,aAAa,CAAC,EACpC,CAAC;YAED,KAAK,EAAE,CAAC;YACR,IAAI,KAAK,IAAI,eAAe,EAAE,CAAC;gBAC7B,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAGD,IAAI,cAAc,IAAI,IAAI,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAChD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC;gBACjD,IAAI,UAAU,CAAC,KAAK,EAAE,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC;oBAC/C,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO;QACL,KAAK,CAAC,IAAI;YACR,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACnE,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;oBACrB,OAAO,CAAC,WAAW,CACjB,IAAI,YAAY,CAAC,sCAAsC,EAAE;wBACvD,KAAK,EAAE,CAAC,IAAI,CAAC;qBACd,CAAC,CACH,CAAC;oBACF,OAAO,KAAK,CAAC;gBACf,CAAC;YACH,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["/** @category Validation Rules */\n\nimport { GraphQLError } from '../../error/GraphQLError.ts';\n\nimport type { ASTNode } from '../../language/ast.ts';\nimport { Kind } from '../../language/kinds.ts';\nimport type { ASTVisitor } from '../../language/visitor.ts';\n\nimport type { ASTValidationContext } from '../ValidationContext.ts';\n\nconst MAX_LISTS_DEPTH = 3;\n\n/**\n * Implements the max introspection depth validation rule.\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 { MaxIntrospectionDepthRule } from 'graphql/validation';\n *\n * const schema = buildSchema(`\n * type Query {\n * name: String\n * }\n * `);\n *\n * const invalidDocument = parse(`\n * { __schema { types { fields { type { fields { type { fields { name } } } } } } } }\n * `);\n * const invalidErrors = validate(schema, invalidDocument, [MaxIntrospectionDepthRule]);\n *\n * invalidErrors.length; // => 1\n *\n * const validDocument = parse(`\n * { __schema { queryType { name } } }\n * `);\n * const validErrors = validate(schema, validDocument, [MaxIntrospectionDepthRule]);\n *\n * validErrors; // => []\n * ```\n */\nexport function MaxIntrospectionDepthRule(\n context: ASTValidationContext,\n): ASTVisitor {\n /**\n * Counts the depth of list fields in \"__Type\" recursively and\n * returns `true` if the limit has been reached.\n *\n * @internal\n */\n function checkDepth(\n node: ASTNode,\n visitedFragments: {\n [fragmentName: string]: true | undefined;\n } = Object.create(null),\n depth: number = 0,\n ): boolean {\n if (node.kind === Kind.FRAGMENT_SPREAD) {\n const fragmentName = node.name.value;\n if (visitedFragments[fragmentName] === true) {\n // Fragment cycles are handled by `NoFragmentCyclesRule`.\n return false;\n }\n const fragment = context.getFragment(fragmentName);\n if (!fragment) {\n // Missing fragments checks are handled by `KnownFragmentNamesRule`.\n return false;\n }\n\n // Rather than following an immutable programming pattern which has\n // significant memory and garbage collection overhead, we've opted to\n // take a mutable approach for efficiency's sake. Importantly visiting a\n // fragment twice is fine, so long as you don't do one visit inside the\n // other.\n try {\n visitedFragments[fragmentName] = true;\n return checkDepth(fragment, visitedFragments, depth);\n } finally {\n visitedFragments[fragmentName] = undefined;\n }\n }\n\n if (\n node.kind === Kind.FIELD &&\n // check all introspection lists\n (node.name.value === 'fields' ||\n node.name.value === 'interfaces' ||\n node.name.value === 'possibleTypes' ||\n node.name.value === 'inputFields')\n ) {\n // eslint-disable-next-line no-param-reassign\n depth++;\n if (depth >= MAX_LISTS_DEPTH) {\n return true;\n }\n }\n\n // handles fields and inline fragments\n if ('selectionSet' in node && node.selectionSet) {\n for (const child of node.selectionSet.selections) {\n if (checkDepth(child, visitedFragments, depth)) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n return {\n Field(node) {\n if (node.name.value === '__schema' || node.name.value === '__type') {\n if (checkDepth(node)) {\n context.reportError(\n new GraphQLError('Maximum introspection depth exceeded', {\n nodes: [node],\n }),\n );\n return false;\n }\n }\n },\n };\n}\n"]}
1
+ {"version":3,"file":"MaxIntrospectionDepthRule.js","sourceRoot":"","sources":["../../../src/validation/rules/MaxIntrospectionDepthRule.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,qCAAoC;AAG3D,OAAO,EAAE,IAAI,EAAE,iCAAgC;AAK/C,MAAM,eAAe,GAAG,CAAC,CAAC;AAoC1B,MAAM,UAAU,yBAAyB,CACvC,OAA6B;IAQ7B,SAAS,UAAU,CACjB,IAAa,EACb,mBAEI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EACvB,QAAgB,CAAC;QAEjB,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,eAAe,EAAE,CAAC;YACvC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;YACrC,IAAI,gBAAgB,CAAC,YAAY,CAAC,KAAK,IAAI,EAAE,CAAC;gBAE5C,OAAO,KAAK,CAAC;YACf,CAAC;YACD,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;YACnD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAEd,OAAO,KAAK,CAAC;YACf,CAAC;YAOD,IAAI,CAAC;gBACH,gBAAgB,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC;gBACtC,OAAO,UAAU,CAAC,QAAQ,EAAE,gBAAgB,EAAE,KAAK,CAAC,CAAC;YACvD,CAAC;oBAAS,CAAC;gBACT,gBAAgB,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC;YAC7C,CAAC;QACH,CAAC;QAED,IACE,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK;YAExB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,QAAQ;gBAC3B,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,YAAY;gBAChC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,eAAe;gBACnC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,aAAa,CAAC,EACpC,CAAC;YAED,KAAK,EAAE,CAAC;YACR,IAAI,KAAK,IAAI,eAAe,EAAE,CAAC;gBAC7B,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAGD,IAAI,cAAc,IAAI,IAAI,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YAChD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,CAAC;gBACjD,IAAI,UAAU,CAAC,KAAK,EAAE,gBAAgB,EAAE,KAAK,CAAC,EAAE,CAAC;oBAC/C,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO;QACL,KAAK,CAAC,IAAI;YACR,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,UAAU,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACnE,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;oBACrB,OAAO,CAAC,WAAW,CACjB,IAAI,YAAY,CAAC,sCAAsC,EAAE;wBACvD,KAAK,EAAE,CAAC,IAAI,CAAC;qBACd,CAAC,CACH,CAAC;oBACF,OAAO,KAAK,CAAC;gBACf,CAAC;YACH,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["/** @category Validation Rules */\n\nimport { GraphQLError } from '../../error/GraphQLError.ts';\n\nimport type { ASTNode } from '../../language/ast.ts';\nimport { Kind } from '../../language/kinds.ts';\nimport type { ASTVisitor } from '../../language/visitor.ts';\n\nimport type { ASTValidationContext } from '../ValidationContext.ts';\n\nconst MAX_LISTS_DEPTH = 3;\n\n/**\n * Implements the max introspection depth validation rule.\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 { MaxIntrospectionDepthRule } from 'graphql/validation';\n *\n * const schema = buildSchema(`\n * type Query {\n * name: String\n * }\n * `);\n *\n * const invalidDocument = parse(`\n * { __schema { types { fields { type { fields { type { fields { name } } } } } } } }\n * `);\n * const invalidErrors = validate(schema, invalidDocument, [\n * MaxIntrospectionDepthRule,\n * ]);\n *\n * invalidErrors.length; // => 1\n *\n * const validDocument = parse(`\n * { __schema { queryType { name } } }\n * `);\n * const validErrors = validate(schema, validDocument, [\n * MaxIntrospectionDepthRule,\n * ]);\n *\n * validErrors; // => []\n * ```\n */\nexport function MaxIntrospectionDepthRule(\n context: ASTValidationContext,\n): ASTVisitor {\n /**\n * Counts the depth of list fields in \"__Type\" recursively and\n * returns `true` if the limit has been reached.\n *\n * @internal\n */\n function checkDepth(\n node: ASTNode,\n visitedFragments: {\n [fragmentName: string]: true | undefined;\n } = Object.create(null),\n depth: number = 0,\n ): boolean {\n if (node.kind === Kind.FRAGMENT_SPREAD) {\n const fragmentName = node.name.value;\n if (visitedFragments[fragmentName] === true) {\n // Fragment cycles are handled by `NoFragmentCyclesRule`.\n return false;\n }\n const fragment = context.getFragment(fragmentName);\n if (!fragment) {\n // Missing fragments checks are handled by `KnownFragmentNamesRule`.\n return false;\n }\n\n // Rather than following an immutable programming pattern which has\n // significant memory and garbage collection overhead, we've opted to\n // take a mutable approach for efficiency's sake. Importantly visiting a\n // fragment twice is fine, so long as you don't do one visit inside the\n // other.\n try {\n visitedFragments[fragmentName] = true;\n return checkDepth(fragment, visitedFragments, depth);\n } finally {\n visitedFragments[fragmentName] = undefined;\n }\n }\n\n if (\n node.kind === Kind.FIELD &&\n // check all introspection lists\n (node.name.value === 'fields' ||\n node.name.value === 'interfaces' ||\n node.name.value === 'possibleTypes' ||\n node.name.value === 'inputFields')\n ) {\n // eslint-disable-next-line no-param-reassign\n depth++;\n if (depth >= MAX_LISTS_DEPTH) {\n return true;\n }\n }\n\n // handles fields and inline fragments\n if ('selectionSet' in node && node.selectionSet) {\n for (const child of node.selectionSet.selections) {\n if (checkDepth(child, visitedFragments, depth)) {\n return true;\n }\n }\n }\n\n return false;\n }\n\n return {\n Field(node) {\n if (node.name.value === '__schema' || node.name.value === '__type') {\n if (checkDepth(node)) {\n context.reportError(\n new GraphQLError('Maximum introspection depth exceeded', {\n nodes: [node],\n }),\n );\n return false;\n }\n }\n },\n };\n}\n"]}
@@ -24,7 +24,9 @@ import type { ValidationContext } from "../ValidationContext.mjs";
24
24
  * const invalidDocument = parse(`
25
25
  * query ($id: ID) { field(arg: $missing) }
26
26
  * `);
27
- * const invalidErrors = validate(schema, invalidDocument, [NoUndefinedVariablesRule]);
27
+ * const invalidErrors = validate(schema, invalidDocument, [
28
+ * NoUndefinedVariablesRule,
29
+ * ]);
28
30
  *
29
31
  * invalidErrors.length; // => 1
30
32
  *
@@ -24,7 +24,9 @@ import type { ValidationContext } from "../ValidationContext.js";
24
24
  * const invalidDocument = parse(`
25
25
  * query ($id: ID) { field(arg: $missing) }
26
26
  * `);
27
- * const invalidErrors = validate(schema, invalidDocument, [NoUndefinedVariablesRule]);
27
+ * const invalidErrors = validate(schema, invalidDocument, [
28
+ * NoUndefinedVariablesRule,
29
+ * ]);
28
30
  *
29
31
  * invalidErrors.length; // => 1
30
32
  *
@@ -1 +1 @@
1
- {"version":3,"file":"NoUndefinedVariablesRule.js","sourceRoot":"","sources":["../../../src/validation/rules/NoUndefinedVariablesRule.ts"],"names":[],"mappings":";;AA2CA,4DA4BC;AArED,iEAA2D;AAyC3D,SAAgB,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,8BAAY,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, [NoUndefinedVariablesRule]);\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"]}
1
+ {"version":3,"file":"NoUndefinedVariablesRule.js","sourceRoot":"","sources":["../../../src/validation/rules/NoUndefinedVariablesRule.ts"],"names":[],"mappings":";;AA6CA,4DA4BC;AAvED,iEAA2D;AA2C3D,SAAgB,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,8BAAY,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"]}
@@ -1 +1 @@
1
- {"version":3,"file":"NoUndefinedVariablesRule.js","sourceRoot":"","sources":["../../../src/validation/rules/NoUndefinedVariablesRule.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,qCAAoC;AAyC3D,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, [NoUndefinedVariablesRule]);\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"]}
1
+ {"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"]}
@@ -24,7 +24,9 @@ import type { ASTValidationContext } from "../ValidationContext.mjs";
24
24
  * const invalidDocument = parse(`
25
25
  * fragment Unused on Query { name } query { name }
26
26
  * `);
27
- * const invalidErrors = validate(schema, invalidDocument, [NoUnusedFragmentsRule]);
27
+ * const invalidErrors = validate(schema, invalidDocument, [
28
+ * NoUnusedFragmentsRule,
29
+ * ]);
28
30
  *
29
31
  * invalidErrors.length; // => 1
30
32
  *
@@ -24,7 +24,9 @@ import type { ASTValidationContext } from "../ValidationContext.js";
24
24
  * const invalidDocument = parse(`
25
25
  * fragment Unused on Query { name } query { name }
26
26
  * `);
27
- * const invalidErrors = validate(schema, invalidDocument, [NoUnusedFragmentsRule]);
27
+ * const invalidErrors = validate(schema, invalidDocument, [
28
+ * NoUnusedFragmentsRule,
29
+ * ]);
28
30
  *
29
31
  * invalidErrors.length; // => 1
30
32
  *
@@ -1 +1 @@
1
- {"version":3,"file":"NoUnusedFragmentsRule.js","sourceRoot":"","sources":["../../../src/validation/rules/NoUnusedFragmentsRule.ts"],"names":[],"mappings":";;AA4CA,sDAkCC;AA5ED,iEAA2D;AA0C3D,SAAgB,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,8BAAY,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, [NoUnusedFragmentsRule]);\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"]}
1
+ {"version":3,"file":"NoUnusedFragmentsRule.js","sourceRoot":"","sources":["../../../src/validation/rules/NoUnusedFragmentsRule.ts"],"names":[],"mappings":";;AA8CA,sDAkCC;AA9ED,iEAA2D;AA4C3D,SAAgB,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,8BAAY,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"]}
@@ -1 +1 @@
1
- {"version":3,"file":"NoUnusedFragmentsRule.js","sourceRoot":"","sources":["../../../src/validation/rules/NoUnusedFragmentsRule.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,qCAAoC;AA0C3D,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, [NoUnusedFragmentsRule]);\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"]}
1
+ {"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"]}
@@ -25,7 +25,9 @@ import type { ValidationContext } from "../ValidationContext.mjs";
25
25
  * const invalidDocument = parse(`
26
26
  * query ($id: ID) { name }
27
27
  * `);
28
- * const invalidErrors = validate(schema, invalidDocument, [NoUnusedVariablesRule]);
28
+ * const invalidErrors = validate(schema, invalidDocument, [
29
+ * NoUnusedVariablesRule,
30
+ * ]);
29
31
  *
30
32
  * invalidErrors.length; // => 1
31
33
  *
@@ -25,7 +25,9 @@ import type { ValidationContext } from "../ValidationContext.js";
25
25
  * const invalidDocument = parse(`
26
26
  * query ($id: ID) { name }
27
27
  * `);
28
- * const invalidErrors = validate(schema, invalidDocument, [NoUnusedVariablesRule]);
28
+ * const invalidErrors = validate(schema, invalidDocument, [
29
+ * NoUnusedVariablesRule,
30
+ * ]);
29
31
  *
30
32
  * invalidErrors.length; // => 1
31
33
  *
@@ -1 +1 @@
1
- {"version":3,"file":"NoUnusedVariablesRule.js","sourceRoot":"","sources":["../../../src/validation/rules/NoUnusedVariablesRule.ts"],"names":[],"mappings":";;AA4CA,sDA8CC;AAxFD,iEAA2D;AA0C3D,SAAgB,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,8BAAY,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,8BAAY,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, [NoUnusedVariablesRule]);\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"]}
1
+ {"version":3,"file":"NoUnusedVariablesRule.js","sourceRoot":"","sources":["../../../src/validation/rules/NoUnusedVariablesRule.ts"],"names":[],"mappings":";;AA8CA,sDA8CC;AA1FD,iEAA2D;AA4C3D,SAAgB,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,8BAAY,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,8BAAY,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"]}