graphql 17.0.0-rc.0 → 17.0.1

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 (232) hide show
  1. package/README.md +3 -5
  2. package/diagnostics.d.mts +67 -38
  3. package/diagnostics.d.ts +67 -38
  4. package/diagnostics.js +2 -1
  5. package/diagnostics.js.map +1 -1
  6. package/diagnostics.mjs +2 -1
  7. package/diagnostics.mjs.map +1 -1
  8. package/error/locatedError.d.mts +1 -3
  9. package/error/locatedError.d.ts +1 -3
  10. package/error/locatedError.js.map +1 -1
  11. package/error/locatedError.mjs.map +1 -1
  12. package/execution/Executor.d.mts +2 -2
  13. package/execution/Executor.d.ts +2 -2
  14. package/execution/Executor.js.map +1 -1
  15. package/execution/Executor.mjs.map +1 -1
  16. package/execution/execute.d.mts +65 -44
  17. package/execution/execute.d.ts +65 -44
  18. package/execution/execute.js +11 -2
  19. package/execution/execute.js.map +1 -1
  20. package/execution/execute.mjs +11 -2
  21. package/execution/execute.mjs.map +1 -1
  22. package/execution/values.d.mts +17 -17
  23. package/execution/values.d.ts +17 -17
  24. package/execution/values.js.map +1 -1
  25. package/execution/values.mjs.map +1 -1
  26. package/language/parser.d.mts +20 -30
  27. package/language/parser.d.ts +20 -30
  28. package/language/parser.js +3 -9
  29. package/language/parser.js.map +1 -1
  30. package/language/parser.mjs +3 -9
  31. package/language/parser.mjs.map +1 -1
  32. package/language/predicates.d.mts +5 -1
  33. package/language/predicates.d.ts +5 -1
  34. package/language/predicates.js.map +1 -1
  35. package/language/predicates.mjs.map +1 -1
  36. package/language/source.d.mts +4 -5
  37. package/language/source.d.ts +4 -5
  38. package/language/source.js.map +1 -1
  39. package/language/source.mjs.map +1 -1
  40. package/language/visitor.d.mts +10 -2
  41. package/language/visitor.d.ts +10 -2
  42. package/language/visitor.js.map +1 -1
  43. package/language/visitor.mjs.map +1 -1
  44. package/package.json +1 -4
  45. package/type/definition.d.mts +96 -64
  46. package/type/definition.d.ts +96 -64
  47. package/type/definition.js.map +1 -1
  48. package/type/definition.mjs.map +1 -1
  49. package/type/directives.d.mts +3 -3
  50. package/type/directives.d.ts +3 -3
  51. package/type/directives.js.map +1 -1
  52. package/type/directives.mjs.map +1 -1
  53. package/type/schema.d.mts +4 -8
  54. package/type/schema.d.ts +4 -8
  55. package/type/schema.js.map +1 -1
  56. package/type/schema.mjs.map +1 -1
  57. package/type/validate.js +101 -30
  58. package/type/validate.js.map +1 -1
  59. package/type/validate.mjs +101 -30
  60. package/type/validate.mjs.map +1 -1
  61. package/utilities/TypeInfo.d.mts +1 -1
  62. package/utilities/TypeInfo.d.ts +1 -1
  63. package/utilities/TypeInfo.js.map +1 -1
  64. package/utilities/TypeInfo.mjs.map +1 -1
  65. package/utilities/buildASTSchema.d.mts +0 -1
  66. package/utilities/buildASTSchema.d.ts +0 -1
  67. package/utilities/buildASTSchema.js +0 -1
  68. package/utilities/buildASTSchema.js.map +1 -1
  69. package/utilities/buildASTSchema.mjs +0 -1
  70. package/utilities/buildASTSchema.mjs.map +1 -1
  71. package/utilities/buildClientSchema.d.mts +5 -1
  72. package/utilities/buildClientSchema.d.ts +5 -1
  73. package/utilities/buildClientSchema.js.map +1 -1
  74. package/utilities/buildClientSchema.mjs.map +1 -1
  75. package/utilities/coerceInputValue.d.mts +7 -6
  76. package/utilities/coerceInputValue.d.ts +7 -6
  77. package/utilities/coerceInputValue.js.map +1 -1
  78. package/utilities/coerceInputValue.mjs.map +1 -1
  79. package/utilities/concatAST.d.mts +4 -1
  80. package/utilities/concatAST.d.ts +4 -1
  81. package/utilities/concatAST.js.map +1 -1
  82. package/utilities/concatAST.mjs.map +1 -1
  83. package/utilities/extendSchema.d.mts +3 -3
  84. package/utilities/extendSchema.d.ts +3 -3
  85. package/utilities/extendSchema.js +5 -1
  86. package/utilities/extendSchema.js.map +1 -1
  87. package/utilities/extendSchema.mjs +5 -1
  88. package/utilities/extendSchema.mjs.map +1 -1
  89. package/utilities/introspectionFromSchema.d.mts +6 -2
  90. package/utilities/introspectionFromSchema.d.ts +6 -2
  91. package/utilities/introspectionFromSchema.js.map +1 -1
  92. package/utilities/introspectionFromSchema.mjs.map +1 -1
  93. package/utilities/lexicographicSortSchema.d.mts +5 -1
  94. package/utilities/lexicographicSortSchema.d.ts +5 -1
  95. package/utilities/lexicographicSortSchema.js.map +1 -1
  96. package/utilities/lexicographicSortSchema.mjs.map +1 -1
  97. package/utilities/printSchema.d.mts +5 -1
  98. package/utilities/printSchema.d.ts +5 -1
  99. package/utilities/printSchema.js.map +1 -1
  100. package/utilities/printSchema.mjs.map +1 -1
  101. package/utilities/replaceVariables.d.mts +4 -8
  102. package/utilities/replaceVariables.d.ts +4 -8
  103. package/utilities/replaceVariables.js.map +1 -1
  104. package/utilities/replaceVariables.mjs.map +1 -1
  105. package/utilities/stripIgnoredCharacters.d.mts +2 -2
  106. package/utilities/stripIgnoredCharacters.d.ts +2 -2
  107. package/utilities/stripIgnoredCharacters.js.map +1 -1
  108. package/utilities/stripIgnoredCharacters.mjs.map +1 -1
  109. package/utilities/typeComparators.d.mts +1 -5
  110. package/utilities/typeComparators.d.ts +1 -5
  111. package/utilities/typeComparators.js.map +1 -1
  112. package/utilities/typeComparators.mjs.map +1 -1
  113. package/utilities/validateInputValue.d.mts +10 -8
  114. package/utilities/validateInputValue.d.ts +10 -8
  115. package/utilities/validateInputValue.js.map +1 -1
  116. package/utilities/validateInputValue.mjs.map +1 -1
  117. package/validation/rules/DeferStreamDirectiveOnRootFieldRule.d.mts +4 -1
  118. package/validation/rules/DeferStreamDirectiveOnRootFieldRule.d.ts +4 -1
  119. package/validation/rules/DeferStreamDirectiveOnRootFieldRule.js.map +1 -1
  120. package/validation/rules/DeferStreamDirectiveOnRootFieldRule.mjs.map +1 -1
  121. package/validation/rules/ExecutableDefinitionsRule.d.mts +6 -2
  122. package/validation/rules/ExecutableDefinitionsRule.d.ts +6 -2
  123. package/validation/rules/ExecutableDefinitionsRule.js.map +1 -1
  124. package/validation/rules/ExecutableDefinitionsRule.mjs.map +1 -1
  125. package/validation/rules/FieldsOnCorrectTypeRule.d.mts +3 -1
  126. package/validation/rules/FieldsOnCorrectTypeRule.d.ts +3 -1
  127. package/validation/rules/FieldsOnCorrectTypeRule.js.map +1 -1
  128. package/validation/rules/FieldsOnCorrectTypeRule.mjs.map +1 -1
  129. package/validation/rules/FragmentsOnCompositeTypesRule.d.mts +6 -2
  130. package/validation/rules/FragmentsOnCompositeTypesRule.d.ts +6 -2
  131. package/validation/rules/FragmentsOnCompositeTypesRule.js.map +1 -1
  132. package/validation/rules/FragmentsOnCompositeTypesRule.mjs.map +1 -1
  133. package/validation/rules/KnownArgumentNamesRule.d.mts +3 -1
  134. package/validation/rules/KnownArgumentNamesRule.d.ts +3 -1
  135. package/validation/rules/KnownArgumentNamesRule.js.map +1 -1
  136. package/validation/rules/KnownArgumentNamesRule.mjs.map +1 -1
  137. package/validation/rules/KnownDirectivesRule.js +2 -1
  138. package/validation/rules/KnownDirectivesRule.js.map +1 -1
  139. package/validation/rules/KnownDirectivesRule.mjs +2 -1
  140. package/validation/rules/KnownDirectivesRule.mjs.map +1 -1
  141. package/validation/rules/KnownFragmentNamesRule.d.mts +3 -1
  142. package/validation/rules/KnownFragmentNamesRule.d.ts +3 -1
  143. package/validation/rules/KnownFragmentNamesRule.js.map +1 -1
  144. package/validation/rules/KnownFragmentNamesRule.mjs.map +1 -1
  145. package/validation/rules/LoneAnonymousOperationRule.d.mts +6 -2
  146. package/validation/rules/LoneAnonymousOperationRule.d.ts +6 -2
  147. package/validation/rules/LoneAnonymousOperationRule.js.map +1 -1
  148. package/validation/rules/LoneAnonymousOperationRule.mjs.map +1 -1
  149. package/validation/rules/MaxIntrospectionDepthRule.d.mts +6 -2
  150. package/validation/rules/MaxIntrospectionDepthRule.d.ts +6 -2
  151. package/validation/rules/MaxIntrospectionDepthRule.js.map +1 -1
  152. package/validation/rules/MaxIntrospectionDepthRule.mjs.map +1 -1
  153. package/validation/rules/NoUndefinedVariablesRule.d.mts +3 -1
  154. package/validation/rules/NoUndefinedVariablesRule.d.ts +3 -1
  155. package/validation/rules/NoUndefinedVariablesRule.js.map +1 -1
  156. package/validation/rules/NoUndefinedVariablesRule.mjs.map +1 -1
  157. package/validation/rules/NoUnusedFragmentsRule.d.mts +3 -1
  158. package/validation/rules/NoUnusedFragmentsRule.d.ts +3 -1
  159. package/validation/rules/NoUnusedFragmentsRule.js.map +1 -1
  160. package/validation/rules/NoUnusedFragmentsRule.mjs.map +1 -1
  161. package/validation/rules/NoUnusedVariablesRule.d.mts +3 -1
  162. package/validation/rules/NoUnusedVariablesRule.d.ts +3 -1
  163. package/validation/rules/NoUnusedVariablesRule.js.map +1 -1
  164. package/validation/rules/NoUnusedVariablesRule.mjs.map +1 -1
  165. package/validation/rules/OverlappingFieldsCanBeMergedRule.d.mts +6 -2
  166. package/validation/rules/OverlappingFieldsCanBeMergedRule.d.ts +6 -2
  167. package/validation/rules/OverlappingFieldsCanBeMergedRule.js.map +1 -1
  168. package/validation/rules/OverlappingFieldsCanBeMergedRule.mjs.map +1 -1
  169. package/validation/rules/PossibleFragmentSpreadsRule.d.mts +6 -2
  170. package/validation/rules/PossibleFragmentSpreadsRule.d.ts +6 -2
  171. package/validation/rules/PossibleFragmentSpreadsRule.js.map +1 -1
  172. package/validation/rules/PossibleFragmentSpreadsRule.mjs.map +1 -1
  173. package/validation/rules/ProvidedRequiredArgumentsRule.d.mts +6 -2
  174. package/validation/rules/ProvidedRequiredArgumentsRule.d.ts +6 -2
  175. package/validation/rules/ProvidedRequiredArgumentsRule.js.map +1 -1
  176. package/validation/rules/ProvidedRequiredArgumentsRule.mjs.map +1 -1
  177. package/validation/rules/SingleFieldSubscriptionsRule.d.mts +6 -2
  178. package/validation/rules/SingleFieldSubscriptionsRule.d.ts +6 -2
  179. package/validation/rules/SingleFieldSubscriptionsRule.js.map +1 -1
  180. package/validation/rules/SingleFieldSubscriptionsRule.mjs.map +1 -1
  181. package/validation/rules/UniqueArgumentNamesRule.d.mts +3 -1
  182. package/validation/rules/UniqueArgumentNamesRule.d.ts +3 -1
  183. package/validation/rules/UniqueArgumentNamesRule.js.map +1 -1
  184. package/validation/rules/UniqueArgumentNamesRule.mjs.map +1 -1
  185. package/validation/rules/UniqueDirectivesPerLocationRule.d.mts +6 -2
  186. package/validation/rules/UniqueDirectivesPerLocationRule.d.ts +6 -2
  187. package/validation/rules/UniqueDirectivesPerLocationRule.js.map +1 -1
  188. package/validation/rules/UniqueDirectivesPerLocationRule.mjs.map +1 -1
  189. package/validation/rules/UniqueFragmentNamesRule.d.mts +3 -1
  190. package/validation/rules/UniqueFragmentNamesRule.d.ts +3 -1
  191. package/validation/rules/UniqueFragmentNamesRule.js.map +1 -1
  192. package/validation/rules/UniqueFragmentNamesRule.mjs.map +1 -1
  193. package/validation/rules/UniqueInputFieldNamesRule.d.mts +6 -2
  194. package/validation/rules/UniqueInputFieldNamesRule.d.ts +6 -2
  195. package/validation/rules/UniqueInputFieldNamesRule.js.map +1 -1
  196. package/validation/rules/UniqueInputFieldNamesRule.mjs.map +1 -1
  197. package/validation/rules/UniqueOperationNamesRule.d.mts +3 -1
  198. package/validation/rules/UniqueOperationNamesRule.d.ts +3 -1
  199. package/validation/rules/UniqueOperationNamesRule.js.map +1 -1
  200. package/validation/rules/UniqueOperationNamesRule.mjs.map +1 -1
  201. package/validation/rules/UniqueVariableNamesRule.d.mts +3 -1
  202. package/validation/rules/UniqueVariableNamesRule.d.ts +3 -1
  203. package/validation/rules/UniqueVariableNamesRule.js.map +1 -1
  204. package/validation/rules/UniqueVariableNamesRule.mjs.map +1 -1
  205. package/validation/rules/ValuesOfCorrectTypeRule.d.mts +3 -1
  206. package/validation/rules/ValuesOfCorrectTypeRule.d.ts +3 -1
  207. package/validation/rules/ValuesOfCorrectTypeRule.js.map +1 -1
  208. package/validation/rules/ValuesOfCorrectTypeRule.mjs.map +1 -1
  209. package/validation/rules/VariablesAreInputTypesRule.d.mts +6 -2
  210. package/validation/rules/VariablesAreInputTypesRule.d.ts +6 -2
  211. package/validation/rules/VariablesAreInputTypesRule.js.map +1 -1
  212. package/validation/rules/VariablesAreInputTypesRule.mjs.map +1 -1
  213. package/validation/rules/VariablesInAllowedPositionRule.d.mts +6 -2
  214. package/validation/rules/VariablesInAllowedPositionRule.d.ts +6 -2
  215. package/validation/rules/VariablesInAllowedPositionRule.js.map +1 -1
  216. package/validation/rules/VariablesInAllowedPositionRule.mjs.map +1 -1
  217. package/validation/rules/custom/NoDeprecatedCustomRule.d.mts +3 -1
  218. package/validation/rules/custom/NoDeprecatedCustomRule.d.ts +3 -1
  219. package/validation/rules/custom/NoDeprecatedCustomRule.js.map +1 -1
  220. package/validation/rules/custom/NoDeprecatedCustomRule.mjs.map +1 -1
  221. package/validation/rules/custom/NoSchemaIntrospectionCustomRule.d.mts +6 -2
  222. package/validation/rules/custom/NoSchemaIntrospectionCustomRule.d.ts +6 -2
  223. package/validation/rules/custom/NoSchemaIntrospectionCustomRule.js.map +1 -1
  224. package/validation/rules/custom/NoSchemaIntrospectionCustomRule.mjs.map +1 -1
  225. package/validation/validate.d.mts +3 -6
  226. package/validation/validate.d.ts +3 -6
  227. package/validation/validate.js.map +1 -1
  228. package/validation/validate.mjs.map +1 -1
  229. package/version.js +3 -3
  230. package/version.js.map +1 -1
  231. package/version.mjs +3 -3
  232. package/version.mjs.map +1 -1
@@ -26,11 +26,10 @@ export declare class Source {
26
26
  * ```ts
27
27
  * import { Source } from 'graphql/language';
28
28
  *
29
- * const source = new Source(
30
- * 'type Query { greeting: String }',
31
- * 'schema.graphql',
32
- * { line: 10, column: 1 },
33
- * );
29
+ * const source = new Source('type Query { greeting: String }', 'schema.graphql', {
30
+ * line: 10,
31
+ * column: 1,
32
+ * });
34
33
  *
35
34
  * source.body; // => 'type Query { greeting: String }'
36
35
  * source.name; // => 'schema.graphql'
@@ -26,11 +26,10 @@ export declare class Source {
26
26
  * ```ts
27
27
  * import { Source } from 'graphql/language';
28
28
  *
29
- * const source = new Source(
30
- * 'type Query { greeting: String }',
31
- * 'schema.graphql',
32
- * { line: 10, column: 1 },
33
- * );
29
+ * const source = new Source('type Query { greeting: String }', 'schema.graphql', {
30
+ * line: 10,
31
+ * column: 1,
32
+ * });
34
33
  *
35
34
  * source.body; // => 'type Query { greeting: String }'
36
35
  * source.name; // => 'schema.graphql'
@@ -1 +1 @@
1
- {"version":3,"file":"source.js","sourceRoot":"","sources":["../../src/language/source.ts"],"names":[],"mappings":";;;AAuFA,4BAEC;AAvFD,0DAAoD;AACpD,4DAAsD;AAQtD,MAAM,YAAY,GAAkB,MAAM,CAAC,QAAQ,CAAC,CAAC;AASrD,MAAa,MAAM;IAkCjB,YACE,IAAY,EACZ,OAAe,iBAAiB,EAChC,iBAA2B,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;QAEjD,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;cAEnC,IAAI,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC;gBAD9B,wBAAS,SAEP,2DAA2D;cAG3D,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC;gBADhC,wBAAS,SAEP,6DAA6D;IAEjE,CAAC;IAMD,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;QACtB,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF;AA5DD,wBA4DC;AAOD,SAAgB,QAAQ,CAAC,MAAe;IACtC,OAAO,IAAA,0BAAU,EAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC","sourcesContent":["/** @category Source */\n\nimport { devAssert } from '../jsutils/devAssert.ts';\nimport { instanceOf } from '../jsutils/instanceOf.ts';\n\ninterface Location {\n line: number;\n column: number;\n}\n\n/** @private */\nconst sourceSymbol: unique symbol = Symbol('Source');\n\n/**\n * A representation of source input to GraphQL. The `name` and `locationOffset` parameters are\n * optional, but they are useful for clients who store GraphQL documents in source files.\n * For example, if the GraphQL input starts at line 40 in a file named `Foo.graphql`, it might\n * be useful for `name` to be `\"Foo.graphql\"` and location to be `{ line: 40, column: 1 }`.\n * The `line` and `column` properties in `locationOffset` are 1-indexed.\n */\nexport class Source {\n /**\n * Internal runtime marker used to identify Source instances.\n * @private\n */\n readonly __kind: symbol;\n\n /** The GraphQL source text. */\n body: string;\n /** Name used in diagnostics for this source, such as a file path or request name. */\n name: string;\n /** One-indexed line and column where this source begins. */\n locationOffset: Location;\n\n /**\n * Creates a Source instance.\n * @param body - The GraphQL source text.\n * @param name - Name used in diagnostics for this source.\n * @param locationOffset - One-indexed line and column where this source begins.\n * @example\n * ```ts\n * import { Source } from 'graphql/language';\n *\n * const source = new Source(\n * 'type Query { greeting: String }',\n * 'schema.graphql',\n * { line: 10, column: 1 },\n * );\n *\n * source.body; // => 'type Query { greeting: String }'\n * source.name; // => 'schema.graphql'\n * source.locationOffset; // => { line: 10, column: 1 }\n * ```\n */\n constructor(\n body: string,\n name: string = 'GraphQL request',\n locationOffset: Location = { line: 1, column: 1 },\n ) {\n this.__kind = sourceSymbol;\n this.body = body;\n this.name = name;\n this.locationOffset = locationOffset;\n devAssert(\n this.locationOffset.line > 0,\n 'line in locationOffset is 1-indexed and must be positive.',\n );\n devAssert(\n this.locationOffset.column > 0,\n 'column in locationOffset is 1-indexed and must be positive.',\n );\n }\n\n /**\n * Returns the value used by `Object.prototype.toString`.\n * @returns The built-in string tag for this object.\n */\n get [Symbol.toStringTag](): string {\n return 'Source';\n }\n}\n\n/**\n * Test if the given value is a Source object.\n *\n * @internal\n */\nexport function isSource(source: unknown): source is Source {\n return instanceOf(source, sourceSymbol, Source);\n}\n"]}
1
+ {"version":3,"file":"source.js","sourceRoot":"","sources":["../../src/language/source.ts"],"names":[],"mappings":";;;AAsFA,4BAEC;AAtFD,0DAAoD;AACpD,4DAAsD;AAQtD,MAAM,YAAY,GAAkB,MAAM,CAAC,QAAQ,CAAC,CAAC;AASrD,MAAa,MAAM;IAiCjB,YACE,IAAY,EACZ,OAAe,iBAAiB,EAChC,iBAA2B,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;QAEjD,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;cAEnC,IAAI,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC;gBAD9B,wBAAS,SAEP,2DAA2D;cAG3D,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC;gBADhC,wBAAS,SAEP,6DAA6D;IAEjE,CAAC;IAMD,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;QACtB,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF;AA3DD,wBA2DC;AAOD,SAAgB,QAAQ,CAAC,MAAe;IACtC,OAAO,IAAA,0BAAU,EAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC","sourcesContent":["/** @category Source */\n\nimport { devAssert } from '../jsutils/devAssert.ts';\nimport { instanceOf } from '../jsutils/instanceOf.ts';\n\ninterface Location {\n line: number;\n column: number;\n}\n\n/** @private */\nconst sourceSymbol: unique symbol = Symbol('Source');\n\n/**\n * A representation of source input to GraphQL. The `name` and `locationOffset` parameters are\n * optional, but they are useful for clients who store GraphQL documents in source files.\n * For example, if the GraphQL input starts at line 40 in a file named `Foo.graphql`, it might\n * be useful for `name` to be `\"Foo.graphql\"` and location to be `{ line: 40, column: 1 }`.\n * The `line` and `column` properties in `locationOffset` are 1-indexed.\n */\nexport class Source {\n /**\n * Internal runtime marker used to identify Source instances.\n * @private\n */\n readonly __kind: symbol;\n\n /** The GraphQL source text. */\n body: string;\n /** Name used in diagnostics for this source, such as a file path or request name. */\n name: string;\n /** One-indexed line and column where this source begins. */\n locationOffset: Location;\n\n /**\n * Creates a Source instance.\n * @param body - The GraphQL source text.\n * @param name - Name used in diagnostics for this source.\n * @param locationOffset - One-indexed line and column where this source begins.\n * @example\n * ```ts\n * import { Source } from 'graphql/language';\n *\n * const source = new Source('type Query { greeting: String }', 'schema.graphql', {\n * line: 10,\n * column: 1,\n * });\n *\n * source.body; // => 'type Query { greeting: String }'\n * source.name; // => 'schema.graphql'\n * source.locationOffset; // => { line: 10, column: 1 }\n * ```\n */\n constructor(\n body: string,\n name: string = 'GraphQL request',\n locationOffset: Location = { line: 1, column: 1 },\n ) {\n this.__kind = sourceSymbol;\n this.body = body;\n this.name = name;\n this.locationOffset = locationOffset;\n devAssert(\n this.locationOffset.line > 0,\n 'line in locationOffset is 1-indexed and must be positive.',\n );\n devAssert(\n this.locationOffset.column > 0,\n 'column in locationOffset is 1-indexed and must be positive.',\n );\n }\n\n /**\n * Returns the value used by `Object.prototype.toString`.\n * @returns The built-in string tag for this object.\n */\n get [Symbol.toStringTag](): string {\n return 'Source';\n }\n}\n\n/**\n * Test if the given value is a Source object.\n *\n * @internal\n */\nexport function isSource(source: unknown): source is Source {\n return instanceOf(source, sourceSymbol, Source);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"source.js","sourceRoot":"","sources":["../../src/language/source.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,iCAAgC;AACpD,OAAO,EAAE,UAAU,EAAE,kCAAiC;AAQtD,MAAM,YAAY,GAAkB,MAAM,CAAC,QAAQ,CAAC,CAAC;AASrD,MAAM,OAAO,MAAM;IAkCjB,YACE,IAAY,EACZ,OAAe,iBAAiB,EAChC,iBAA2B,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;QAEjD,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;cAEnC,IAAI,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC;YAD9B,SAAS,QAEP,2DAA2D;cAG3D,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC;YADhC,SAAS,QAEP,6DAA6D;IAEjE,CAAC;IAMD,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;QACtB,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF;AAOD,MAAM,UAAU,QAAQ,CAAC,MAAe;IACtC,OAAO,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC","sourcesContent":["/** @category Source */\n\nimport { devAssert } from '../jsutils/devAssert.ts';\nimport { instanceOf } from '../jsutils/instanceOf.ts';\n\ninterface Location {\n line: number;\n column: number;\n}\n\n/** @private */\nconst sourceSymbol: unique symbol = Symbol('Source');\n\n/**\n * A representation of source input to GraphQL. The `name` and `locationOffset` parameters are\n * optional, but they are useful for clients who store GraphQL documents in source files.\n * For example, if the GraphQL input starts at line 40 in a file named `Foo.graphql`, it might\n * be useful for `name` to be `\"Foo.graphql\"` and location to be `{ line: 40, column: 1 }`.\n * The `line` and `column` properties in `locationOffset` are 1-indexed.\n */\nexport class Source {\n /**\n * Internal runtime marker used to identify Source instances.\n * @private\n */\n readonly __kind: symbol;\n\n /** The GraphQL source text. */\n body: string;\n /** Name used in diagnostics for this source, such as a file path or request name. */\n name: string;\n /** One-indexed line and column where this source begins. */\n locationOffset: Location;\n\n /**\n * Creates a Source instance.\n * @param body - The GraphQL source text.\n * @param name - Name used in diagnostics for this source.\n * @param locationOffset - One-indexed line and column where this source begins.\n * @example\n * ```ts\n * import { Source } from 'graphql/language';\n *\n * const source = new Source(\n * 'type Query { greeting: String }',\n * 'schema.graphql',\n * { line: 10, column: 1 },\n * );\n *\n * source.body; // => 'type Query { greeting: String }'\n * source.name; // => 'schema.graphql'\n * source.locationOffset; // => { line: 10, column: 1 }\n * ```\n */\n constructor(\n body: string,\n name: string = 'GraphQL request',\n locationOffset: Location = { line: 1, column: 1 },\n ) {\n this.__kind = sourceSymbol;\n this.body = body;\n this.name = name;\n this.locationOffset = locationOffset;\n devAssert(\n this.locationOffset.line > 0,\n 'line in locationOffset is 1-indexed and must be positive.',\n );\n devAssert(\n this.locationOffset.column > 0,\n 'column in locationOffset is 1-indexed and must be positive.',\n );\n }\n\n /**\n * Returns the value used by `Object.prototype.toString`.\n * @returns The built-in string tag for this object.\n */\n get [Symbol.toStringTag](): string {\n return 'Source';\n }\n}\n\n/**\n * Test if the given value is a Source object.\n *\n * @internal\n */\nexport function isSource(source: unknown): source is Source {\n return instanceOf(source, sourceSymbol, Source);\n}\n"]}
1
+ {"version":3,"file":"source.js","sourceRoot":"","sources":["../../src/language/source.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,iCAAgC;AACpD,OAAO,EAAE,UAAU,EAAE,kCAAiC;AAQtD,MAAM,YAAY,GAAkB,MAAM,CAAC,QAAQ,CAAC,CAAC;AASrD,MAAM,OAAO,MAAM;IAiCjB,YACE,IAAY,EACZ,OAAe,iBAAiB,EAChC,iBAA2B,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE;QAEjD,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;cAEnC,IAAI,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC;YAD9B,SAAS,QAEP,2DAA2D;cAG3D,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC;YADhC,SAAS,QAEP,6DAA6D;IAEjE,CAAC;IAMD,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;QACtB,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF;AAOD,MAAM,UAAU,QAAQ,CAAC,MAAe;IACtC,OAAO,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;AAClD,CAAC","sourcesContent":["/** @category Source */\n\nimport { devAssert } from '../jsutils/devAssert.ts';\nimport { instanceOf } from '../jsutils/instanceOf.ts';\n\ninterface Location {\n line: number;\n column: number;\n}\n\n/** @private */\nconst sourceSymbol: unique symbol = Symbol('Source');\n\n/**\n * A representation of source input to GraphQL. The `name` and `locationOffset` parameters are\n * optional, but they are useful for clients who store GraphQL documents in source files.\n * For example, if the GraphQL input starts at line 40 in a file named `Foo.graphql`, it might\n * be useful for `name` to be `\"Foo.graphql\"` and location to be `{ line: 40, column: 1 }`.\n * The `line` and `column` properties in `locationOffset` are 1-indexed.\n */\nexport class Source {\n /**\n * Internal runtime marker used to identify Source instances.\n * @private\n */\n readonly __kind: symbol;\n\n /** The GraphQL source text. */\n body: string;\n /** Name used in diagnostics for this source, such as a file path or request name. */\n name: string;\n /** One-indexed line and column where this source begins. */\n locationOffset: Location;\n\n /**\n * Creates a Source instance.\n * @param body - The GraphQL source text.\n * @param name - Name used in diagnostics for this source.\n * @param locationOffset - One-indexed line and column where this source begins.\n * @example\n * ```ts\n * import { Source } from 'graphql/language';\n *\n * const source = new Source('type Query { greeting: String }', 'schema.graphql', {\n * line: 10,\n * column: 1,\n * });\n *\n * source.body; // => 'type Query { greeting: String }'\n * source.name; // => 'schema.graphql'\n * source.locationOffset; // => { line: 10, column: 1 }\n * ```\n */\n constructor(\n body: string,\n name: string = 'GraphQL request',\n locationOffset: Location = { line: 1, column: 1 },\n ) {\n this.__kind = sourceSymbol;\n this.body = body;\n this.name = name;\n this.locationOffset = locationOffset;\n devAssert(\n this.locationOffset.line > 0,\n 'line in locationOffset is 1-indexed and must be positive.',\n );\n devAssert(\n this.locationOffset.column > 0,\n 'column in locationOffset is 1-indexed and must be positive.',\n );\n }\n\n /**\n * Returns the value used by `Object.prototype.toString`.\n * @returns The built-in string tag for this object.\n */\n get [Symbol.toStringTag](): string {\n return 'Source';\n }\n}\n\n/**\n * Test if the given value is a Source object.\n *\n * @internal\n */\nexport function isSource(source: unknown): source is Source {\n return instanceOf(source, sourceSymbol, Source);\n}\n"]}
@@ -242,8 +242,16 @@ export declare function visit<R>(root: ASTNode, visitor: ASTReducer<R>, visitorK
242
242
  * visit(
243
243
  * document,
244
244
  * visitInParallel([
245
- * { Field: (node) => { events.push(`field:${node.name.value}`); } },
246
- * { Name: (node) => { events.push(`name:${node.value}`); } },
245
+ * {
246
+ * Field: (node) => {
247
+ * events.push(`field:${node.name.value}`);
248
+ * },
249
+ * },
250
+ * {
251
+ * Name: (node) => {
252
+ * events.push(`name:${node.value}`);
253
+ * },
254
+ * },
247
255
  * ]),
248
256
  * );
249
257
  *
@@ -242,8 +242,16 @@ export declare function visit<R>(root: ASTNode, visitor: ASTReducer<R>, visitorK
242
242
  * visit(
243
243
  * document,
244
244
  * visitInParallel([
245
- * { Field: (node) => { events.push(`field:${node.name.value}`); } },
246
- * { Name: (node) => { events.push(`name:${node.value}`); } },
245
+ * {
246
+ * Field: (node) => {
247
+ * events.push(`field:${node.name.value}`);
248
+ * },
249
+ * },
250
+ * {
251
+ * Name: (node) => {
252
+ * events.push(`name:${node.value}`);
253
+ * },
254
+ * },
247
255
  * ]),
248
256
  * );
249
257
  *
@@ -1 +1 @@
1
- {"version":3,"file":"visitor.js","sourceRoot":"","sources":["../../src/language/visitor.ts"],"names":[],"mappings":"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","sourcesContent":["/** @category Visiting */\n\nimport { devAssert } from '../jsutils/devAssert.ts';\nimport { inspect } from '../jsutils/inspect.ts';\n\nimport type { ASTNode } from './ast.ts';\nimport { isNode, QueryDocumentKeys } from './ast.ts';\nimport { Kind } from './kinds.ts';\n\n/** A visitor defines the callbacks called during AST traversal. */\nexport type ASTVisitor = EnterLeaveVisitor<ASTNode> | KindVisitor;\n\ntype KindVisitor = {\n readonly [NodeT in ASTNode as NodeT['kind']]?:\n | ASTVisitFn<NodeT>\n | EnterLeaveVisitor<NodeT>;\n};\n\ninterface EnterLeaveVisitor<TVisitedNode extends ASTNode> {\n readonly enter?: ASTVisitFn<TVisitedNode> | undefined;\n readonly leave?: ASTVisitFn<TVisitedNode> | undefined;\n}\n\n/**\n * A visitor is composed of visit functions called for each node during traversal.\n * @typeParam TVisitedNode - AST node type handled by this visitor function.\n */\nexport type ASTVisitFn<TVisitedNode extends ASTNode> = (\n /** Current node being visited. */\n node: TVisitedNode,\n /** Index or key for this node within the parent node or array. */\n key: string | number | undefined,\n /** Parent immediately above this node, which may be an array. */\n parent: ASTNode | ReadonlyArray<ASTNode> | undefined,\n /** Key path from the root node to this node. */\n path: ReadonlyArray<string | number>,\n /**\n * All nodes and arrays visited before reaching this node's parent.\n * These correspond to array indices in `path`.\n * Note: ancestors includes arrays that contain the visited node's parent.\n */\n ancestors: ReadonlyArray<ASTNode | ReadonlyArray<ASTNode>>,\n) => any;\n\n/**\n * A reducer is composed of reducer functions that convert AST nodes into another form.\n *\n * @internal\n */\nexport type ASTReducer<R> = {\n readonly [NodeT in ASTNode as NodeT['kind']]?: {\n readonly enter?: ASTVisitFn<NodeT>;\n readonly leave: ASTReducerFn<NodeT, R>;\n };\n};\n\ntype ASTReducerFn<TReducedNode extends ASTNode, R> = (\n /**\n * Current node being visited.\n * @internal\n */\n node: { [K in keyof TReducedNode]: ReducedField<TReducedNode[K], R> },\n /**\n * Index or key for this node within the parent node or array.\n * @internal\n */\n key: string | number | undefined,\n /**\n * Parent immediately above this node, which may be an array.\n * @internal\n */\n parent: ASTNode | ReadonlyArray<ASTNode> | undefined,\n /**\n * Key path from the root node to this node.\n * @internal\n */\n path: ReadonlyArray<string | number>,\n /**\n * All nodes and arrays visited before reaching this node's parent.\n * These correspond to array indices in `path`.\n * Note: ancestors includes arrays that contain the visited node's parent.\n * @internal\n */\n ancestors: ReadonlyArray<ASTNode | ReadonlyArray<ASTNode>>,\n) => R;\n\ntype ReducedField<T, R> = T extends ASTNode\n ? R\n : T extends ReadonlyArray<ASTNode>\n ? ReadonlyArray<R>\n : T;\n\n/** A visitor key map describes the traversable child properties for each node kind. */\nexport type ASTVisitorKeyMap = {\n [NodeT in ASTNode as NodeT['kind']]?: ReadonlyArray<keyof NodeT>;\n};\n\n/** A value that can be returned from a visitor function to stop traversal. */\nexport const BREAK: unknown = Object.freeze({});\n\n/**\n * visit() will walk through an AST using a depth-first traversal, calling\n * the visitor's enter function at each node in the traversal, and calling the\n * leave function after visiting that node and all of its child nodes.\n *\n * By returning different values from the enter and leave functions, the\n * behavior of the visitor can be altered, including skipping over a sub-tree of\n * the AST (by returning false), editing the AST by returning a value or null\n * to remove the value, or to stop the whole traversal by returning BREAK.\n *\n * When using visit() to edit an AST, the original AST will not be modified, and\n * a new version of the AST with the changes applied will be returned from the\n * visit function.\n * @param root - The AST node at which to start traversal.\n * @param visitor - The visitor or reducer functions to call while traversing.\n * @param visitorKeys - Optional map of child keys to visit for each AST node kind.\n * @returns The original AST, an edited AST, or a reduced value depending on the visitor.\n * @typeParam N - The root AST node type returned when visiting without reducing.\n * @example\n * ```ts\n * // Return values control traversal: undefined makes no change, false skips\n * // a subtree, BREAK stops traversal, null removes a node, and any other\n * // value replaces the current node.\n * import { Kind, parse, print, visit } from 'graphql/language';\n *\n * const document = parse('{ hero { name } }');\n * const editedAST = visit(document, {\n * Field: (node) => {\n * if (node.name.value === 'hero') {\n * return {\n * ...node,\n * name: { kind: Kind.NAME, value: 'human' },\n * };\n * }\n * },\n * });\n *\n * print(editedAST); // => '{\\n human {\\n name\\n }\\n}'\n * ```\n * @example\n * ```ts\n * // A named visitor function runs when entering nodes of that kind.\n * import { parse, visit } from 'graphql/language';\n *\n * const document = parse('{ hero { name } }');\n * const fieldNames = [];\n *\n * visit(document, {\n * Field: (node) => {\n * fieldNames.push(node.name.value);\n * },\n * });\n *\n * fieldNames; // => ['hero', 'name']\n * ```\n * @example\n * ```ts\n * // A named visitor object can provide separate enter and leave handlers for\n * // nodes of that kind.\n * import { parse, visit } from 'graphql/language';\n *\n * const document = parse('{ hero { name } }');\n * const events = [];\n *\n * visit(document, {\n * Field: {\n * enter: (node) => {\n * events.push(`enter:${node.name.value}`);\n * },\n * leave: (node) => {\n * events.push(`leave:${node.name.value}`);\n * },\n * },\n * });\n *\n * events; // => ['enter:hero', 'enter:name', 'leave:name', 'leave:hero']\n * ```\n * @example\n * ```ts\n * // Generic enter and leave handlers run for every node.\n * import { parse, visit } from 'graphql/language';\n *\n * const document = parse('{ hero { name } }');\n * let enterCount = 0;\n * let leaveCount = 0;\n *\n * visit(document, {\n * enter: (node) => {\n * enterCount += 1;\n * },\n * leave: (node) => {\n * leaveCount += 1;\n * },\n * });\n *\n * enterCount; // => leaveCount\n * enterCount > 0; // => true\n * ```\n */\nexport function visit<N extends ASTNode>(\n root: N,\n visitor: ASTVisitor,\n visitorKeys?: ASTVisitorKeyMap,\n): N;\n/**\n * Traverses an AST with reducer callbacks and returns the reduced value.\n * @param root - The AST node where traversal starts.\n * @param visitor - Reducer callbacks to invoke during traversal.\n * @param visitorKeys - Optional mapping of child keys for each AST node kind.\n * @returns The value produced by the reducer visitor.\n * @typeParam R - The value produced by reducer visitor callbacks.\n * @example\n * ```ts\n * // A reducer visitor returns values from leave handlers to build a reduced\n * // result instead of returning an edited AST.\n * import { parse, visit } from 'graphql/language';\n *\n * const document = parse('{ hero { name } }');\n * const printed = visit(document, {\n * Name: {\n * leave: (node) => {\n * return node.value;\n * },\n * },\n * Field: {\n * leave: (node) => {\n * return node.selectionSet == null\n * ? node.name\n * : `${node.name} { ${node.selectionSet} }`;\n * },\n * },\n * SelectionSet: {\n * leave: (node) => {\n * return node.selections.join(' ');\n * },\n * },\n * OperationDefinition: {\n * leave: (node) => {\n * return node.selectionSet;\n * },\n * },\n * Document: {\n * leave: (node) => {\n * return node.definitions.join('\\n');\n * },\n * },\n * });\n *\n * printed; // => 'hero { name }'\n * ```\n */\nexport function visit<R>(\n root: ASTNode,\n visitor: ASTReducer<R>,\n visitorKeys?: ASTVisitorKeyMap,\n): R;\n/**\n * Traverses an AST with visitor or reducer callbacks.\n * @internal\n */\nexport function visit(\n root: ASTNode,\n visitor: ASTVisitor | ASTReducer<any>,\n visitorKeys: ASTVisitorKeyMap = QueryDocumentKeys,\n): any {\n const enterLeaveMap = new Map<Kind, EnterLeaveVisitor<ASTNode>>();\n for (const kind of Object.values(Kind)) {\n enterLeaveMap.set(kind, getEnterLeaveForKind(visitor, kind));\n }\n\n /* eslint-disable no-undef-init */\n let stack: any = undefined;\n let inArray = Array.isArray(root);\n let keys: any = [root];\n let index = -1;\n let edits = [];\n let node: any = root;\n let key: any = undefined;\n let parent: any = undefined;\n const path: any = [];\n const ancestors = [];\n /* eslint-enable no-undef-init */\n\n do {\n index++;\n const isLeaving = index === keys.length;\n const isEdited = isLeaving && edits.length !== 0;\n if (isLeaving) {\n key = ancestors.length === 0 ? undefined : path[path.length - 1];\n node = parent;\n parent = ancestors.pop();\n if (isEdited) {\n if (inArray) {\n node = node.slice();\n\n let editOffset = 0;\n for (const [editKey, editValue] of edits) {\n const arrayKey = editKey - editOffset;\n if (editValue === null) {\n node.splice(arrayKey, 1);\n editOffset++;\n } else {\n node[arrayKey] = editValue;\n }\n }\n } else {\n node = { ...node };\n for (const [editKey, editValue] of edits) {\n node[editKey] = editValue;\n }\n }\n }\n index = stack.index;\n keys = stack.keys;\n edits = stack.edits;\n inArray = stack.inArray;\n stack = stack.prev;\n } else if (parent != null) {\n key = inArray ? index : keys[index];\n node = parent[key];\n if (node === null || node === undefined) {\n continue;\n }\n path.push(key);\n }\n\n let result;\n if (!Array.isArray(node)) {\n devAssert(isNode(node), `Invalid AST Node: ${inspect(node)}.`);\n\n const visitFn = isLeaving\n ? enterLeaveMap.get(node.kind)?.leave\n : enterLeaveMap.get(node.kind)?.enter;\n\n result = visitFn?.call(visitor, node, key, parent, path, ancestors);\n\n if (result === BREAK) {\n break;\n }\n\n if (result === false) {\n if (!isLeaving) {\n path.pop();\n continue;\n }\n } else if (result !== undefined) {\n edits.push([key, result]);\n if (!isLeaving) {\n if (isNode(result)) {\n node = result;\n } else {\n path.pop();\n continue;\n }\n }\n }\n }\n\n if (result === undefined && isEdited) {\n edits.push([key, node]);\n }\n\n if (isLeaving) {\n path.pop();\n } else {\n stack = { inArray, index, keys, edits, prev: stack };\n inArray = Array.isArray(node);\n keys = inArray ? node : ((visitorKeys as any)[node.kind] ?? []);\n index = -1;\n edits = [];\n if (parent != null) {\n ancestors.push(parent);\n }\n parent = node;\n }\n } while (stack !== undefined);\n\n if (edits.length !== 0) {\n // New root\n return edits.at(-1)[1];\n }\n\n return root;\n}\n\n/**\n * Creates a new visitor instance which delegates to many visitors to run in\n * parallel. Each visitor will be visited for each node before moving on.\n *\n * If a prior visitor edits a node, no following visitors will see that node.\n * @param visitors - The visitors to merge into one parallel visitor.\n * @returns A visitor that delegates traversal to each provided visitor.\n * @example\n * ```ts\n * import { parse, visit, visitInParallel } from 'graphql/language';\n *\n * const document = parse('{ hero { name } }');\n * const events = [];\n *\n * visit(\n * document,\n * visitInParallel([\n * { Field: (node) => { events.push(`field:${node.name.value}`); } },\n * { Name: (node) => { events.push(`name:${node.value}`); } },\n * ]),\n * );\n *\n * events; // => ['field:hero', 'name:hero', 'field:name', 'name:name']\n * ```\n */\nexport function visitInParallel(\n visitors: ReadonlyArray<ASTVisitor>,\n): ASTVisitor {\n const skipping = new Array(visitors.length).fill(null);\n const mergedVisitor = Object.create(null);\n\n for (const kind of Object.values(Kind)) {\n let hasVisitor = false;\n const enterList = new Array(visitors.length).fill(undefined);\n const leaveList = new Array(visitors.length).fill(undefined);\n\n for (let i = 0; i < visitors.length; ++i) {\n const { enter, leave } = getEnterLeaveForKind(visitors[i], kind);\n hasVisitor ||= enter != null || leave != null;\n enterList[i] = enter;\n leaveList[i] = leave;\n }\n\n if (!hasVisitor) {\n continue;\n }\n\n const mergedEnterLeave: EnterLeaveVisitor<ASTNode> = {\n enter(...args) {\n const node = args[0];\n for (let i = 0; i < visitors.length; i++) {\n if (skipping[i] === null) {\n const result = enterList[i]?.apply(visitors[i], args);\n if (result === false) {\n skipping[i] = node;\n } else if (result === BREAK) {\n skipping[i] = BREAK;\n } else if (result !== undefined) {\n return result;\n }\n }\n }\n },\n leave(...args) {\n const node = args[0];\n for (let i = 0; i < visitors.length; i++) {\n if (skipping[i] === null) {\n const result = leaveList[i]?.apply(visitors[i], args);\n if (result === BREAK) {\n skipping[i] = BREAK;\n } else if (result !== undefined && result !== false) {\n return result;\n }\n } else if (skipping[i] === node) {\n skipping[i] = null;\n }\n }\n },\n };\n\n mergedVisitor[kind] = mergedEnterLeave;\n }\n\n return mergedVisitor;\n}\n\n/**\n * Given a visitor instance and a node kind, return EnterLeaveVisitor for that kind.\n * @param visitor - The visitor object to inspect.\n * @param kind - The AST node kind to resolve handlers for.\n * @returns The enter and leave handlers that apply for the given node kind.\n * @example\n * ```ts\n * import { Kind, getEnterLeaveForKind } from 'graphql/language';\n *\n * const handlers = getEnterLeaveForKind({ Field: () => {} }, Kind.FIELD);\n *\n * typeof handlers.enter; // => 'function'\n * handlers.leave; // => undefined\n * ```\n */\nexport function getEnterLeaveForKind(\n visitor: ASTVisitor,\n kind: Kind,\n): EnterLeaveVisitor<ASTNode> {\n const kindVisitor:\n | ASTVisitFn<ASTNode>\n | EnterLeaveVisitor<ASTNode>\n | undefined = (visitor as any)[kind];\n\n if (typeof kindVisitor === 'object') {\n // { Kind: { enter() {}, leave() {} } }\n return kindVisitor;\n } else if (typeof kindVisitor === 'function') {\n // { Kind() {} }\n return { enter: kindVisitor, leave: undefined };\n }\n\n // { enter() {}, leave() {} }\n return { enter: (visitor as any).enter, leave: (visitor as any).leave };\n}\n"]}
1
+ {"version":3,"file":"visitor.js","sourceRoot":"","sources":["../../src/language/visitor.ts"],"names":[],"mappings":"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","sourcesContent":["/** @category Visiting */\n\nimport { devAssert } from '../jsutils/devAssert.ts';\nimport { inspect } from '../jsutils/inspect.ts';\n\nimport type { ASTNode } from './ast.ts';\nimport { isNode, QueryDocumentKeys } from './ast.ts';\nimport { Kind } from './kinds.ts';\n\n/** A visitor defines the callbacks called during AST traversal. */\nexport type ASTVisitor = EnterLeaveVisitor<ASTNode> | KindVisitor;\n\ntype KindVisitor = {\n readonly [NodeT in ASTNode as NodeT['kind']]?:\n | ASTVisitFn<NodeT>\n | EnterLeaveVisitor<NodeT>;\n};\n\ninterface EnterLeaveVisitor<TVisitedNode extends ASTNode> {\n readonly enter?: ASTVisitFn<TVisitedNode> | undefined;\n readonly leave?: ASTVisitFn<TVisitedNode> | undefined;\n}\n\n/**\n * A visitor is composed of visit functions called for each node during traversal.\n * @typeParam TVisitedNode - AST node type handled by this visitor function.\n */\nexport type ASTVisitFn<TVisitedNode extends ASTNode> = (\n /** Current node being visited. */\n node: TVisitedNode,\n /** Index or key for this node within the parent node or array. */\n key: string | number | undefined,\n /** Parent immediately above this node, which may be an array. */\n parent: ASTNode | ReadonlyArray<ASTNode> | undefined,\n /** Key path from the root node to this node. */\n path: ReadonlyArray<string | number>,\n /**\n * All nodes and arrays visited before reaching this node's parent.\n * These correspond to array indices in `path`.\n * Note: ancestors includes arrays that contain the visited node's parent.\n */\n ancestors: ReadonlyArray<ASTNode | ReadonlyArray<ASTNode>>,\n) => any;\n\n/**\n * A reducer is composed of reducer functions that convert AST nodes into another form.\n *\n * @internal\n */\nexport type ASTReducer<R> = {\n readonly [NodeT in ASTNode as NodeT['kind']]?: {\n readonly enter?: ASTVisitFn<NodeT>;\n readonly leave: ASTReducerFn<NodeT, R>;\n };\n};\n\ntype ASTReducerFn<TReducedNode extends ASTNode, R> = (\n /**\n * Current node being visited.\n * @internal\n */\n node: { [K in keyof TReducedNode]: ReducedField<TReducedNode[K], R> },\n /**\n * Index or key for this node within the parent node or array.\n * @internal\n */\n key: string | number | undefined,\n /**\n * Parent immediately above this node, which may be an array.\n * @internal\n */\n parent: ASTNode | ReadonlyArray<ASTNode> | undefined,\n /**\n * Key path from the root node to this node.\n * @internal\n */\n path: ReadonlyArray<string | number>,\n /**\n * All nodes and arrays visited before reaching this node's parent.\n * These correspond to array indices in `path`.\n * Note: ancestors includes arrays that contain the visited node's parent.\n * @internal\n */\n ancestors: ReadonlyArray<ASTNode | ReadonlyArray<ASTNode>>,\n) => R;\n\ntype ReducedField<T, R> = T extends ASTNode\n ? R\n : T extends ReadonlyArray<ASTNode>\n ? ReadonlyArray<R>\n : T;\n\n/** A visitor key map describes the traversable child properties for each node kind. */\nexport type ASTVisitorKeyMap = {\n [NodeT in ASTNode as NodeT['kind']]?: ReadonlyArray<keyof NodeT>;\n};\n\n/** A value that can be returned from a visitor function to stop traversal. */\nexport const BREAK: unknown = Object.freeze({});\n\n/**\n * visit() will walk through an AST using a depth-first traversal, calling\n * the visitor's enter function at each node in the traversal, and calling the\n * leave function after visiting that node and all of its child nodes.\n *\n * By returning different values from the enter and leave functions, the\n * behavior of the visitor can be altered, including skipping over a sub-tree of\n * the AST (by returning false), editing the AST by returning a value or null\n * to remove the value, or to stop the whole traversal by returning BREAK.\n *\n * When using visit() to edit an AST, the original AST will not be modified, and\n * a new version of the AST with the changes applied will be returned from the\n * visit function.\n * @param root - The AST node at which to start traversal.\n * @param visitor - The visitor or reducer functions to call while traversing.\n * @param visitorKeys - Optional map of child keys to visit for each AST node kind.\n * @returns The original AST, an edited AST, or a reduced value depending on the visitor.\n * @typeParam N - The root AST node type returned when visiting without reducing.\n * @example\n * ```ts\n * // Return values control traversal: undefined makes no change, false skips\n * // a subtree, BREAK stops traversal, null removes a node, and any other\n * // value replaces the current node.\n * import { Kind, parse, print, visit } from 'graphql/language';\n *\n * const document = parse('{ hero { name } }');\n * const editedAST = visit(document, {\n * Field: (node) => {\n * if (node.name.value === 'hero') {\n * return {\n * ...node,\n * name: { kind: Kind.NAME, value: 'human' },\n * };\n * }\n * },\n * });\n *\n * print(editedAST); // => '{\\n human {\\n name\\n }\\n}'\n * ```\n * @example\n * ```ts\n * // A named visitor function runs when entering nodes of that kind.\n * import { parse, visit } from 'graphql/language';\n *\n * const document = parse('{ hero { name } }');\n * const fieldNames = [];\n *\n * visit(document, {\n * Field: (node) => {\n * fieldNames.push(node.name.value);\n * },\n * });\n *\n * fieldNames; // => ['hero', 'name']\n * ```\n * @example\n * ```ts\n * // A named visitor object can provide separate enter and leave handlers for\n * // nodes of that kind.\n * import { parse, visit } from 'graphql/language';\n *\n * const document = parse('{ hero { name } }');\n * const events = [];\n *\n * visit(document, {\n * Field: {\n * enter: (node) => {\n * events.push(`enter:${node.name.value}`);\n * },\n * leave: (node) => {\n * events.push(`leave:${node.name.value}`);\n * },\n * },\n * });\n *\n * events; // => ['enter:hero', 'enter:name', 'leave:name', 'leave:hero']\n * ```\n * @example\n * ```ts\n * // Generic enter and leave handlers run for every node.\n * import { parse, visit } from 'graphql/language';\n *\n * const document = parse('{ hero { name } }');\n * let enterCount = 0;\n * let leaveCount = 0;\n *\n * visit(document, {\n * enter: (node) => {\n * enterCount += 1;\n * },\n * leave: (node) => {\n * leaveCount += 1;\n * },\n * });\n *\n * enterCount; // => leaveCount\n * enterCount > 0; // => true\n * ```\n */\nexport function visit<N extends ASTNode>(\n root: N,\n visitor: ASTVisitor,\n visitorKeys?: ASTVisitorKeyMap,\n): N;\n/**\n * Traverses an AST with reducer callbacks and returns the reduced value.\n * @param root - The AST node where traversal starts.\n * @param visitor - Reducer callbacks to invoke during traversal.\n * @param visitorKeys - Optional mapping of child keys for each AST node kind.\n * @returns The value produced by the reducer visitor.\n * @typeParam R - The value produced by reducer visitor callbacks.\n * @example\n * ```ts\n * // A reducer visitor returns values from leave handlers to build a reduced\n * // result instead of returning an edited AST.\n * import { parse, visit } from 'graphql/language';\n *\n * const document = parse('{ hero { name } }');\n * const printed = visit(document, {\n * Name: {\n * leave: (node) => {\n * return node.value;\n * },\n * },\n * Field: {\n * leave: (node) => {\n * return node.selectionSet == null\n * ? node.name\n * : `${node.name} { ${node.selectionSet} }`;\n * },\n * },\n * SelectionSet: {\n * leave: (node) => {\n * return node.selections.join(' ');\n * },\n * },\n * OperationDefinition: {\n * leave: (node) => {\n * return node.selectionSet;\n * },\n * },\n * Document: {\n * leave: (node) => {\n * return node.definitions.join('\\n');\n * },\n * },\n * });\n *\n * printed; // => 'hero { name }'\n * ```\n */\nexport function visit<R>(\n root: ASTNode,\n visitor: ASTReducer<R>,\n visitorKeys?: ASTVisitorKeyMap,\n): R;\n/**\n * Traverses an AST with visitor or reducer callbacks.\n * @internal\n */\nexport function visit(\n root: ASTNode,\n visitor: ASTVisitor | ASTReducer<any>,\n visitorKeys: ASTVisitorKeyMap = QueryDocumentKeys,\n): any {\n const enterLeaveMap = new Map<Kind, EnterLeaveVisitor<ASTNode>>();\n for (const kind of Object.values(Kind)) {\n enterLeaveMap.set(kind, getEnterLeaveForKind(visitor, kind));\n }\n\n /* eslint-disable no-undef-init */\n let stack: any = undefined;\n let inArray = Array.isArray(root);\n let keys: any = [root];\n let index = -1;\n let edits = [];\n let node: any = root;\n let key: any = undefined;\n let parent: any = undefined;\n const path: any = [];\n const ancestors = [];\n /* eslint-enable no-undef-init */\n\n do {\n index++;\n const isLeaving = index === keys.length;\n const isEdited = isLeaving && edits.length !== 0;\n if (isLeaving) {\n key = ancestors.length === 0 ? undefined : path[path.length - 1];\n node = parent;\n parent = ancestors.pop();\n if (isEdited) {\n if (inArray) {\n node = node.slice();\n\n let editOffset = 0;\n for (const [editKey, editValue] of edits) {\n const arrayKey = editKey - editOffset;\n if (editValue === null) {\n node.splice(arrayKey, 1);\n editOffset++;\n } else {\n node[arrayKey] = editValue;\n }\n }\n } else {\n node = { ...node };\n for (const [editKey, editValue] of edits) {\n node[editKey] = editValue;\n }\n }\n }\n index = stack.index;\n keys = stack.keys;\n edits = stack.edits;\n inArray = stack.inArray;\n stack = stack.prev;\n } else if (parent != null) {\n key = inArray ? index : keys[index];\n node = parent[key];\n if (node === null || node === undefined) {\n continue;\n }\n path.push(key);\n }\n\n let result;\n if (!Array.isArray(node)) {\n devAssert(isNode(node), `Invalid AST Node: ${inspect(node)}.`);\n\n const visitFn = isLeaving\n ? enterLeaveMap.get(node.kind)?.leave\n : enterLeaveMap.get(node.kind)?.enter;\n\n result = visitFn?.call(visitor, node, key, parent, path, ancestors);\n\n if (result === BREAK) {\n break;\n }\n\n if (result === false) {\n if (!isLeaving) {\n path.pop();\n continue;\n }\n } else if (result !== undefined) {\n edits.push([key, result]);\n if (!isLeaving) {\n if (isNode(result)) {\n node = result;\n } else {\n path.pop();\n continue;\n }\n }\n }\n }\n\n if (result === undefined && isEdited) {\n edits.push([key, node]);\n }\n\n if (isLeaving) {\n path.pop();\n } else {\n stack = { inArray, index, keys, edits, prev: stack };\n inArray = Array.isArray(node);\n keys = inArray ? node : ((visitorKeys as any)[node.kind] ?? []);\n index = -1;\n edits = [];\n if (parent != null) {\n ancestors.push(parent);\n }\n parent = node;\n }\n } while (stack !== undefined);\n\n if (edits.length !== 0) {\n // New root\n return edits.at(-1)[1];\n }\n\n return root;\n}\n\n/**\n * Creates a new visitor instance which delegates to many visitors to run in\n * parallel. Each visitor will be visited for each node before moving on.\n *\n * If a prior visitor edits a node, no following visitors will see that node.\n * @param visitors - The visitors to merge into one parallel visitor.\n * @returns A visitor that delegates traversal to each provided visitor.\n * @example\n * ```ts\n * import { parse, visit, visitInParallel } from 'graphql/language';\n *\n * const document = parse('{ hero { name } }');\n * const events = [];\n *\n * visit(\n * document,\n * visitInParallel([\n * {\n * Field: (node) => {\n * events.push(`field:${node.name.value}`);\n * },\n * },\n * {\n * Name: (node) => {\n * events.push(`name:${node.value}`);\n * },\n * },\n * ]),\n * );\n *\n * events; // => ['field:hero', 'name:hero', 'field:name', 'name:name']\n * ```\n */\nexport function visitInParallel(\n visitors: ReadonlyArray<ASTVisitor>,\n): ASTVisitor {\n const skipping = new Array(visitors.length).fill(null);\n const mergedVisitor = Object.create(null);\n\n for (const kind of Object.values(Kind)) {\n let hasVisitor = false;\n const enterList = new Array(visitors.length).fill(undefined);\n const leaveList = new Array(visitors.length).fill(undefined);\n\n for (let i = 0; i < visitors.length; ++i) {\n const { enter, leave } = getEnterLeaveForKind(visitors[i], kind);\n hasVisitor ||= enter != null || leave != null;\n enterList[i] = enter;\n leaveList[i] = leave;\n }\n\n if (!hasVisitor) {\n continue;\n }\n\n const mergedEnterLeave: EnterLeaveVisitor<ASTNode> = {\n enter(...args) {\n const node = args[0];\n for (let i = 0; i < visitors.length; i++) {\n if (skipping[i] === null) {\n const result = enterList[i]?.apply(visitors[i], args);\n if (result === false) {\n skipping[i] = node;\n } else if (result === BREAK) {\n skipping[i] = BREAK;\n } else if (result !== undefined) {\n return result;\n }\n }\n }\n },\n leave(...args) {\n const node = args[0];\n for (let i = 0; i < visitors.length; i++) {\n if (skipping[i] === null) {\n const result = leaveList[i]?.apply(visitors[i], args);\n if (result === BREAK) {\n skipping[i] = BREAK;\n } else if (result !== undefined && result !== false) {\n return result;\n }\n } else if (skipping[i] === node) {\n skipping[i] = null;\n }\n }\n },\n };\n\n mergedVisitor[kind] = mergedEnterLeave;\n }\n\n return mergedVisitor;\n}\n\n/**\n * Given a visitor instance and a node kind, return EnterLeaveVisitor for that kind.\n * @param visitor - The visitor object to inspect.\n * @param kind - The AST node kind to resolve handlers for.\n * @returns The enter and leave handlers that apply for the given node kind.\n * @example\n * ```ts\n * import { Kind, getEnterLeaveForKind } from 'graphql/language';\n *\n * const handlers = getEnterLeaveForKind({ Field: () => {} }, Kind.FIELD);\n *\n * typeof handlers.enter; // => 'function'\n * handlers.leave; // => undefined\n * ```\n */\nexport function getEnterLeaveForKind(\n visitor: ASTVisitor,\n kind: Kind,\n): EnterLeaveVisitor<ASTNode> {\n const kindVisitor:\n | ASTVisitFn<ASTNode>\n | EnterLeaveVisitor<ASTNode>\n | undefined = (visitor as any)[kind];\n\n if (typeof kindVisitor === 'object') {\n // { Kind: { enter() {}, leave() {} } }\n return kindVisitor;\n } else if (typeof kindVisitor === 'function') {\n // { Kind() {} }\n return { enter: kindVisitor, leave: undefined };\n }\n\n // { enter() {}, leave() {} }\n return { enter: (visitor as any).enter, leave: (visitor as any).leave };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"visitor.js","sourceRoot":"","sources":["../../src/language/visitor.ts"],"names":[],"mappings":"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","sourcesContent":["/** @category Visiting */\n\nimport { devAssert } from '../jsutils/devAssert.ts';\nimport { inspect } from '../jsutils/inspect.ts';\n\nimport type { ASTNode } from './ast.ts';\nimport { isNode, QueryDocumentKeys } from './ast.ts';\nimport { Kind } from './kinds.ts';\n\n/** A visitor defines the callbacks called during AST traversal. */\nexport type ASTVisitor = EnterLeaveVisitor<ASTNode> | KindVisitor;\n\ntype KindVisitor = {\n readonly [NodeT in ASTNode as NodeT['kind']]?:\n | ASTVisitFn<NodeT>\n | EnterLeaveVisitor<NodeT>;\n};\n\ninterface EnterLeaveVisitor<TVisitedNode extends ASTNode> {\n readonly enter?: ASTVisitFn<TVisitedNode> | undefined;\n readonly leave?: ASTVisitFn<TVisitedNode> | undefined;\n}\n\n/**\n * A visitor is composed of visit functions called for each node during traversal.\n * @typeParam TVisitedNode - AST node type handled by this visitor function.\n */\nexport type ASTVisitFn<TVisitedNode extends ASTNode> = (\n /** Current node being visited. */\n node: TVisitedNode,\n /** Index or key for this node within the parent node or array. */\n key: string | number | undefined,\n /** Parent immediately above this node, which may be an array. */\n parent: ASTNode | ReadonlyArray<ASTNode> | undefined,\n /** Key path from the root node to this node. */\n path: ReadonlyArray<string | number>,\n /**\n * All nodes and arrays visited before reaching this node's parent.\n * These correspond to array indices in `path`.\n * Note: ancestors includes arrays that contain the visited node's parent.\n */\n ancestors: ReadonlyArray<ASTNode | ReadonlyArray<ASTNode>>,\n) => any;\n\n/**\n * A reducer is composed of reducer functions that convert AST nodes into another form.\n *\n * @internal\n */\nexport type ASTReducer<R> = {\n readonly [NodeT in ASTNode as NodeT['kind']]?: {\n readonly enter?: ASTVisitFn<NodeT>;\n readonly leave: ASTReducerFn<NodeT, R>;\n };\n};\n\ntype ASTReducerFn<TReducedNode extends ASTNode, R> = (\n /**\n * Current node being visited.\n * @internal\n */\n node: { [K in keyof TReducedNode]: ReducedField<TReducedNode[K], R> },\n /**\n * Index or key for this node within the parent node or array.\n * @internal\n */\n key: string | number | undefined,\n /**\n * Parent immediately above this node, which may be an array.\n * @internal\n */\n parent: ASTNode | ReadonlyArray<ASTNode> | undefined,\n /**\n * Key path from the root node to this node.\n * @internal\n */\n path: ReadonlyArray<string | number>,\n /**\n * All nodes and arrays visited before reaching this node's parent.\n * These correspond to array indices in `path`.\n * Note: ancestors includes arrays that contain the visited node's parent.\n * @internal\n */\n ancestors: ReadonlyArray<ASTNode | ReadonlyArray<ASTNode>>,\n) => R;\n\ntype ReducedField<T, R> = T extends ASTNode\n ? R\n : T extends ReadonlyArray<ASTNode>\n ? ReadonlyArray<R>\n : T;\n\n/** A visitor key map describes the traversable child properties for each node kind. */\nexport type ASTVisitorKeyMap = {\n [NodeT in ASTNode as NodeT['kind']]?: ReadonlyArray<keyof NodeT>;\n};\n\n/** A value that can be returned from a visitor function to stop traversal. */\nexport const BREAK: unknown = Object.freeze({});\n\n/**\n * visit() will walk through an AST using a depth-first traversal, calling\n * the visitor's enter function at each node in the traversal, and calling the\n * leave function after visiting that node and all of its child nodes.\n *\n * By returning different values from the enter and leave functions, the\n * behavior of the visitor can be altered, including skipping over a sub-tree of\n * the AST (by returning false), editing the AST by returning a value or null\n * to remove the value, or to stop the whole traversal by returning BREAK.\n *\n * When using visit() to edit an AST, the original AST will not be modified, and\n * a new version of the AST with the changes applied will be returned from the\n * visit function.\n * @param root - The AST node at which to start traversal.\n * @param visitor - The visitor or reducer functions to call while traversing.\n * @param visitorKeys - Optional map of child keys to visit for each AST node kind.\n * @returns The original AST, an edited AST, or a reduced value depending on the visitor.\n * @typeParam N - The root AST node type returned when visiting without reducing.\n * @example\n * ```ts\n * // Return values control traversal: undefined makes no change, false skips\n * // a subtree, BREAK stops traversal, null removes a node, and any other\n * // value replaces the current node.\n * import { Kind, parse, print, visit } from 'graphql/language';\n *\n * const document = parse('{ hero { name } }');\n * const editedAST = visit(document, {\n * Field: (node) => {\n * if (node.name.value === 'hero') {\n * return {\n * ...node,\n * name: { kind: Kind.NAME, value: 'human' },\n * };\n * }\n * },\n * });\n *\n * print(editedAST); // => '{\\n human {\\n name\\n }\\n}'\n * ```\n * @example\n * ```ts\n * // A named visitor function runs when entering nodes of that kind.\n * import { parse, visit } from 'graphql/language';\n *\n * const document = parse('{ hero { name } }');\n * const fieldNames = [];\n *\n * visit(document, {\n * Field: (node) => {\n * fieldNames.push(node.name.value);\n * },\n * });\n *\n * fieldNames; // => ['hero', 'name']\n * ```\n * @example\n * ```ts\n * // A named visitor object can provide separate enter and leave handlers for\n * // nodes of that kind.\n * import { parse, visit } from 'graphql/language';\n *\n * const document = parse('{ hero { name } }');\n * const events = [];\n *\n * visit(document, {\n * Field: {\n * enter: (node) => {\n * events.push(`enter:${node.name.value}`);\n * },\n * leave: (node) => {\n * events.push(`leave:${node.name.value}`);\n * },\n * },\n * });\n *\n * events; // => ['enter:hero', 'enter:name', 'leave:name', 'leave:hero']\n * ```\n * @example\n * ```ts\n * // Generic enter and leave handlers run for every node.\n * import { parse, visit } from 'graphql/language';\n *\n * const document = parse('{ hero { name } }');\n * let enterCount = 0;\n * let leaveCount = 0;\n *\n * visit(document, {\n * enter: (node) => {\n * enterCount += 1;\n * },\n * leave: (node) => {\n * leaveCount += 1;\n * },\n * });\n *\n * enterCount; // => leaveCount\n * enterCount > 0; // => true\n * ```\n */\nexport function visit<N extends ASTNode>(\n root: N,\n visitor: ASTVisitor,\n visitorKeys?: ASTVisitorKeyMap,\n): N;\n/**\n * Traverses an AST with reducer callbacks and returns the reduced value.\n * @param root - The AST node where traversal starts.\n * @param visitor - Reducer callbacks to invoke during traversal.\n * @param visitorKeys - Optional mapping of child keys for each AST node kind.\n * @returns The value produced by the reducer visitor.\n * @typeParam R - The value produced by reducer visitor callbacks.\n * @example\n * ```ts\n * // A reducer visitor returns values from leave handlers to build a reduced\n * // result instead of returning an edited AST.\n * import { parse, visit } from 'graphql/language';\n *\n * const document = parse('{ hero { name } }');\n * const printed = visit(document, {\n * Name: {\n * leave: (node) => {\n * return node.value;\n * },\n * },\n * Field: {\n * leave: (node) => {\n * return node.selectionSet == null\n * ? node.name\n * : `${node.name} { ${node.selectionSet} }`;\n * },\n * },\n * SelectionSet: {\n * leave: (node) => {\n * return node.selections.join(' ');\n * },\n * },\n * OperationDefinition: {\n * leave: (node) => {\n * return node.selectionSet;\n * },\n * },\n * Document: {\n * leave: (node) => {\n * return node.definitions.join('\\n');\n * },\n * },\n * });\n *\n * printed; // => 'hero { name }'\n * ```\n */\nexport function visit<R>(\n root: ASTNode,\n visitor: ASTReducer<R>,\n visitorKeys?: ASTVisitorKeyMap,\n): R;\n/**\n * Traverses an AST with visitor or reducer callbacks.\n * @internal\n */\nexport function visit(\n root: ASTNode,\n visitor: ASTVisitor | ASTReducer<any>,\n visitorKeys: ASTVisitorKeyMap = QueryDocumentKeys,\n): any {\n const enterLeaveMap = new Map<Kind, EnterLeaveVisitor<ASTNode>>();\n for (const kind of Object.values(Kind)) {\n enterLeaveMap.set(kind, getEnterLeaveForKind(visitor, kind));\n }\n\n /* eslint-disable no-undef-init */\n let stack: any = undefined;\n let inArray = Array.isArray(root);\n let keys: any = [root];\n let index = -1;\n let edits = [];\n let node: any = root;\n let key: any = undefined;\n let parent: any = undefined;\n const path: any = [];\n const ancestors = [];\n /* eslint-enable no-undef-init */\n\n do {\n index++;\n const isLeaving = index === keys.length;\n const isEdited = isLeaving && edits.length !== 0;\n if (isLeaving) {\n key = ancestors.length === 0 ? undefined : path[path.length - 1];\n node = parent;\n parent = ancestors.pop();\n if (isEdited) {\n if (inArray) {\n node = node.slice();\n\n let editOffset = 0;\n for (const [editKey, editValue] of edits) {\n const arrayKey = editKey - editOffset;\n if (editValue === null) {\n node.splice(arrayKey, 1);\n editOffset++;\n } else {\n node[arrayKey] = editValue;\n }\n }\n } else {\n node = { ...node };\n for (const [editKey, editValue] of edits) {\n node[editKey] = editValue;\n }\n }\n }\n index = stack.index;\n keys = stack.keys;\n edits = stack.edits;\n inArray = stack.inArray;\n stack = stack.prev;\n } else if (parent != null) {\n key = inArray ? index : keys[index];\n node = parent[key];\n if (node === null || node === undefined) {\n continue;\n }\n path.push(key);\n }\n\n let result;\n if (!Array.isArray(node)) {\n devAssert(isNode(node), `Invalid AST Node: ${inspect(node)}.`);\n\n const visitFn = isLeaving\n ? enterLeaveMap.get(node.kind)?.leave\n : enterLeaveMap.get(node.kind)?.enter;\n\n result = visitFn?.call(visitor, node, key, parent, path, ancestors);\n\n if (result === BREAK) {\n break;\n }\n\n if (result === false) {\n if (!isLeaving) {\n path.pop();\n continue;\n }\n } else if (result !== undefined) {\n edits.push([key, result]);\n if (!isLeaving) {\n if (isNode(result)) {\n node = result;\n } else {\n path.pop();\n continue;\n }\n }\n }\n }\n\n if (result === undefined && isEdited) {\n edits.push([key, node]);\n }\n\n if (isLeaving) {\n path.pop();\n } else {\n stack = { inArray, index, keys, edits, prev: stack };\n inArray = Array.isArray(node);\n keys = inArray ? node : ((visitorKeys as any)[node.kind] ?? []);\n index = -1;\n edits = [];\n if (parent != null) {\n ancestors.push(parent);\n }\n parent = node;\n }\n } while (stack !== undefined);\n\n if (edits.length !== 0) {\n // New root\n return edits.at(-1)[1];\n }\n\n return root;\n}\n\n/**\n * Creates a new visitor instance which delegates to many visitors to run in\n * parallel. Each visitor will be visited for each node before moving on.\n *\n * If a prior visitor edits a node, no following visitors will see that node.\n * @param visitors - The visitors to merge into one parallel visitor.\n * @returns A visitor that delegates traversal to each provided visitor.\n * @example\n * ```ts\n * import { parse, visit, visitInParallel } from 'graphql/language';\n *\n * const document = parse('{ hero { name } }');\n * const events = [];\n *\n * visit(\n * document,\n * visitInParallel([\n * { Field: (node) => { events.push(`field:${node.name.value}`); } },\n * { Name: (node) => { events.push(`name:${node.value}`); } },\n * ]),\n * );\n *\n * events; // => ['field:hero', 'name:hero', 'field:name', 'name:name']\n * ```\n */\nexport function visitInParallel(\n visitors: ReadonlyArray<ASTVisitor>,\n): ASTVisitor {\n const skipping = new Array(visitors.length).fill(null);\n const mergedVisitor = Object.create(null);\n\n for (const kind of Object.values(Kind)) {\n let hasVisitor = false;\n const enterList = new Array(visitors.length).fill(undefined);\n const leaveList = new Array(visitors.length).fill(undefined);\n\n for (let i = 0; i < visitors.length; ++i) {\n const { enter, leave } = getEnterLeaveForKind(visitors[i], kind);\n hasVisitor ||= enter != null || leave != null;\n enterList[i] = enter;\n leaveList[i] = leave;\n }\n\n if (!hasVisitor) {\n continue;\n }\n\n const mergedEnterLeave: EnterLeaveVisitor<ASTNode> = {\n enter(...args) {\n const node = args[0];\n for (let i = 0; i < visitors.length; i++) {\n if (skipping[i] === null) {\n const result = enterList[i]?.apply(visitors[i], args);\n if (result === false) {\n skipping[i] = node;\n } else if (result === BREAK) {\n skipping[i] = BREAK;\n } else if (result !== undefined) {\n return result;\n }\n }\n }\n },\n leave(...args) {\n const node = args[0];\n for (let i = 0; i < visitors.length; i++) {\n if (skipping[i] === null) {\n const result = leaveList[i]?.apply(visitors[i], args);\n if (result === BREAK) {\n skipping[i] = BREAK;\n } else if (result !== undefined && result !== false) {\n return result;\n }\n } else if (skipping[i] === node) {\n skipping[i] = null;\n }\n }\n },\n };\n\n mergedVisitor[kind] = mergedEnterLeave;\n }\n\n return mergedVisitor;\n}\n\n/**\n * Given a visitor instance and a node kind, return EnterLeaveVisitor for that kind.\n * @param visitor - The visitor object to inspect.\n * @param kind - The AST node kind to resolve handlers for.\n * @returns The enter and leave handlers that apply for the given node kind.\n * @example\n * ```ts\n * import { Kind, getEnterLeaveForKind } from 'graphql/language';\n *\n * const handlers = getEnterLeaveForKind({ Field: () => {} }, Kind.FIELD);\n *\n * typeof handlers.enter; // => 'function'\n * handlers.leave; // => undefined\n * ```\n */\nexport function getEnterLeaveForKind(\n visitor: ASTVisitor,\n kind: Kind,\n): EnterLeaveVisitor<ASTNode> {\n const kindVisitor:\n | ASTVisitFn<ASTNode>\n | EnterLeaveVisitor<ASTNode>\n | undefined = (visitor as any)[kind];\n\n if (typeof kindVisitor === 'object') {\n // { Kind: { enter() {}, leave() {} } }\n return kindVisitor;\n } else if (typeof kindVisitor === 'function') {\n // { Kind() {} }\n return { enter: kindVisitor, leave: undefined };\n }\n\n // { enter() {}, leave() {} }\n return { enter: (visitor as any).enter, leave: (visitor as any).leave };\n}\n"]}
1
+ {"version":3,"file":"visitor.js","sourceRoot":"","sources":["../../src/language/visitor.ts"],"names":[],"mappings":"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","sourcesContent":["/** @category Visiting */\n\nimport { devAssert } from '../jsutils/devAssert.ts';\nimport { inspect } from '../jsutils/inspect.ts';\n\nimport type { ASTNode } from './ast.ts';\nimport { isNode, QueryDocumentKeys } from './ast.ts';\nimport { Kind } from './kinds.ts';\n\n/** A visitor defines the callbacks called during AST traversal. */\nexport type ASTVisitor = EnterLeaveVisitor<ASTNode> | KindVisitor;\n\ntype KindVisitor = {\n readonly [NodeT in ASTNode as NodeT['kind']]?:\n | ASTVisitFn<NodeT>\n | EnterLeaveVisitor<NodeT>;\n};\n\ninterface EnterLeaveVisitor<TVisitedNode extends ASTNode> {\n readonly enter?: ASTVisitFn<TVisitedNode> | undefined;\n readonly leave?: ASTVisitFn<TVisitedNode> | undefined;\n}\n\n/**\n * A visitor is composed of visit functions called for each node during traversal.\n * @typeParam TVisitedNode - AST node type handled by this visitor function.\n */\nexport type ASTVisitFn<TVisitedNode extends ASTNode> = (\n /** Current node being visited. */\n node: TVisitedNode,\n /** Index or key for this node within the parent node or array. */\n key: string | number | undefined,\n /** Parent immediately above this node, which may be an array. */\n parent: ASTNode | ReadonlyArray<ASTNode> | undefined,\n /** Key path from the root node to this node. */\n path: ReadonlyArray<string | number>,\n /**\n * All nodes and arrays visited before reaching this node's parent.\n * These correspond to array indices in `path`.\n * Note: ancestors includes arrays that contain the visited node's parent.\n */\n ancestors: ReadonlyArray<ASTNode | ReadonlyArray<ASTNode>>,\n) => any;\n\n/**\n * A reducer is composed of reducer functions that convert AST nodes into another form.\n *\n * @internal\n */\nexport type ASTReducer<R> = {\n readonly [NodeT in ASTNode as NodeT['kind']]?: {\n readonly enter?: ASTVisitFn<NodeT>;\n readonly leave: ASTReducerFn<NodeT, R>;\n };\n};\n\ntype ASTReducerFn<TReducedNode extends ASTNode, R> = (\n /**\n * Current node being visited.\n * @internal\n */\n node: { [K in keyof TReducedNode]: ReducedField<TReducedNode[K], R> },\n /**\n * Index or key for this node within the parent node or array.\n * @internal\n */\n key: string | number | undefined,\n /**\n * Parent immediately above this node, which may be an array.\n * @internal\n */\n parent: ASTNode | ReadonlyArray<ASTNode> | undefined,\n /**\n * Key path from the root node to this node.\n * @internal\n */\n path: ReadonlyArray<string | number>,\n /**\n * All nodes and arrays visited before reaching this node's parent.\n * These correspond to array indices in `path`.\n * Note: ancestors includes arrays that contain the visited node's parent.\n * @internal\n */\n ancestors: ReadonlyArray<ASTNode | ReadonlyArray<ASTNode>>,\n) => R;\n\ntype ReducedField<T, R> = T extends ASTNode\n ? R\n : T extends ReadonlyArray<ASTNode>\n ? ReadonlyArray<R>\n : T;\n\n/** A visitor key map describes the traversable child properties for each node kind. */\nexport type ASTVisitorKeyMap = {\n [NodeT in ASTNode as NodeT['kind']]?: ReadonlyArray<keyof NodeT>;\n};\n\n/** A value that can be returned from a visitor function to stop traversal. */\nexport const BREAK: unknown = Object.freeze({});\n\n/**\n * visit() will walk through an AST using a depth-first traversal, calling\n * the visitor's enter function at each node in the traversal, and calling the\n * leave function after visiting that node and all of its child nodes.\n *\n * By returning different values from the enter and leave functions, the\n * behavior of the visitor can be altered, including skipping over a sub-tree of\n * the AST (by returning false), editing the AST by returning a value or null\n * to remove the value, or to stop the whole traversal by returning BREAK.\n *\n * When using visit() to edit an AST, the original AST will not be modified, and\n * a new version of the AST with the changes applied will be returned from the\n * visit function.\n * @param root - The AST node at which to start traversal.\n * @param visitor - The visitor or reducer functions to call while traversing.\n * @param visitorKeys - Optional map of child keys to visit for each AST node kind.\n * @returns The original AST, an edited AST, or a reduced value depending on the visitor.\n * @typeParam N - The root AST node type returned when visiting without reducing.\n * @example\n * ```ts\n * // Return values control traversal: undefined makes no change, false skips\n * // a subtree, BREAK stops traversal, null removes a node, and any other\n * // value replaces the current node.\n * import { Kind, parse, print, visit } from 'graphql/language';\n *\n * const document = parse('{ hero { name } }');\n * const editedAST = visit(document, {\n * Field: (node) => {\n * if (node.name.value === 'hero') {\n * return {\n * ...node,\n * name: { kind: Kind.NAME, value: 'human' },\n * };\n * }\n * },\n * });\n *\n * print(editedAST); // => '{\\n human {\\n name\\n }\\n}'\n * ```\n * @example\n * ```ts\n * // A named visitor function runs when entering nodes of that kind.\n * import { parse, visit } from 'graphql/language';\n *\n * const document = parse('{ hero { name } }');\n * const fieldNames = [];\n *\n * visit(document, {\n * Field: (node) => {\n * fieldNames.push(node.name.value);\n * },\n * });\n *\n * fieldNames; // => ['hero', 'name']\n * ```\n * @example\n * ```ts\n * // A named visitor object can provide separate enter and leave handlers for\n * // nodes of that kind.\n * import { parse, visit } from 'graphql/language';\n *\n * const document = parse('{ hero { name } }');\n * const events = [];\n *\n * visit(document, {\n * Field: {\n * enter: (node) => {\n * events.push(`enter:${node.name.value}`);\n * },\n * leave: (node) => {\n * events.push(`leave:${node.name.value}`);\n * },\n * },\n * });\n *\n * events; // => ['enter:hero', 'enter:name', 'leave:name', 'leave:hero']\n * ```\n * @example\n * ```ts\n * // Generic enter and leave handlers run for every node.\n * import { parse, visit } from 'graphql/language';\n *\n * const document = parse('{ hero { name } }');\n * let enterCount = 0;\n * let leaveCount = 0;\n *\n * visit(document, {\n * enter: (node) => {\n * enterCount += 1;\n * },\n * leave: (node) => {\n * leaveCount += 1;\n * },\n * });\n *\n * enterCount; // => leaveCount\n * enterCount > 0; // => true\n * ```\n */\nexport function visit<N extends ASTNode>(\n root: N,\n visitor: ASTVisitor,\n visitorKeys?: ASTVisitorKeyMap,\n): N;\n/**\n * Traverses an AST with reducer callbacks and returns the reduced value.\n * @param root - The AST node where traversal starts.\n * @param visitor - Reducer callbacks to invoke during traversal.\n * @param visitorKeys - Optional mapping of child keys for each AST node kind.\n * @returns The value produced by the reducer visitor.\n * @typeParam R - The value produced by reducer visitor callbacks.\n * @example\n * ```ts\n * // A reducer visitor returns values from leave handlers to build a reduced\n * // result instead of returning an edited AST.\n * import { parse, visit } from 'graphql/language';\n *\n * const document = parse('{ hero { name } }');\n * const printed = visit(document, {\n * Name: {\n * leave: (node) => {\n * return node.value;\n * },\n * },\n * Field: {\n * leave: (node) => {\n * return node.selectionSet == null\n * ? node.name\n * : `${node.name} { ${node.selectionSet} }`;\n * },\n * },\n * SelectionSet: {\n * leave: (node) => {\n * return node.selections.join(' ');\n * },\n * },\n * OperationDefinition: {\n * leave: (node) => {\n * return node.selectionSet;\n * },\n * },\n * Document: {\n * leave: (node) => {\n * return node.definitions.join('\\n');\n * },\n * },\n * });\n *\n * printed; // => 'hero { name }'\n * ```\n */\nexport function visit<R>(\n root: ASTNode,\n visitor: ASTReducer<R>,\n visitorKeys?: ASTVisitorKeyMap,\n): R;\n/**\n * Traverses an AST with visitor or reducer callbacks.\n * @internal\n */\nexport function visit(\n root: ASTNode,\n visitor: ASTVisitor | ASTReducer<any>,\n visitorKeys: ASTVisitorKeyMap = QueryDocumentKeys,\n): any {\n const enterLeaveMap = new Map<Kind, EnterLeaveVisitor<ASTNode>>();\n for (const kind of Object.values(Kind)) {\n enterLeaveMap.set(kind, getEnterLeaveForKind(visitor, kind));\n }\n\n /* eslint-disable no-undef-init */\n let stack: any = undefined;\n let inArray = Array.isArray(root);\n let keys: any = [root];\n let index = -1;\n let edits = [];\n let node: any = root;\n let key: any = undefined;\n let parent: any = undefined;\n const path: any = [];\n const ancestors = [];\n /* eslint-enable no-undef-init */\n\n do {\n index++;\n const isLeaving = index === keys.length;\n const isEdited = isLeaving && edits.length !== 0;\n if (isLeaving) {\n key = ancestors.length === 0 ? undefined : path[path.length - 1];\n node = parent;\n parent = ancestors.pop();\n if (isEdited) {\n if (inArray) {\n node = node.slice();\n\n let editOffset = 0;\n for (const [editKey, editValue] of edits) {\n const arrayKey = editKey - editOffset;\n if (editValue === null) {\n node.splice(arrayKey, 1);\n editOffset++;\n } else {\n node[arrayKey] = editValue;\n }\n }\n } else {\n node = { ...node };\n for (const [editKey, editValue] of edits) {\n node[editKey] = editValue;\n }\n }\n }\n index = stack.index;\n keys = stack.keys;\n edits = stack.edits;\n inArray = stack.inArray;\n stack = stack.prev;\n } else if (parent != null) {\n key = inArray ? index : keys[index];\n node = parent[key];\n if (node === null || node === undefined) {\n continue;\n }\n path.push(key);\n }\n\n let result;\n if (!Array.isArray(node)) {\n devAssert(isNode(node), `Invalid AST Node: ${inspect(node)}.`);\n\n const visitFn = isLeaving\n ? enterLeaveMap.get(node.kind)?.leave\n : enterLeaveMap.get(node.kind)?.enter;\n\n result = visitFn?.call(visitor, node, key, parent, path, ancestors);\n\n if (result === BREAK) {\n break;\n }\n\n if (result === false) {\n if (!isLeaving) {\n path.pop();\n continue;\n }\n } else if (result !== undefined) {\n edits.push([key, result]);\n if (!isLeaving) {\n if (isNode(result)) {\n node = result;\n } else {\n path.pop();\n continue;\n }\n }\n }\n }\n\n if (result === undefined && isEdited) {\n edits.push([key, node]);\n }\n\n if (isLeaving) {\n path.pop();\n } else {\n stack = { inArray, index, keys, edits, prev: stack };\n inArray = Array.isArray(node);\n keys = inArray ? node : ((visitorKeys as any)[node.kind] ?? []);\n index = -1;\n edits = [];\n if (parent != null) {\n ancestors.push(parent);\n }\n parent = node;\n }\n } while (stack !== undefined);\n\n if (edits.length !== 0) {\n // New root\n return edits.at(-1)[1];\n }\n\n return root;\n}\n\n/**\n * Creates a new visitor instance which delegates to many visitors to run in\n * parallel. Each visitor will be visited for each node before moving on.\n *\n * If a prior visitor edits a node, no following visitors will see that node.\n * @param visitors - The visitors to merge into one parallel visitor.\n * @returns A visitor that delegates traversal to each provided visitor.\n * @example\n * ```ts\n * import { parse, visit, visitInParallel } from 'graphql/language';\n *\n * const document = parse('{ hero { name } }');\n * const events = [];\n *\n * visit(\n * document,\n * visitInParallel([\n * {\n * Field: (node) => {\n * events.push(`field:${node.name.value}`);\n * },\n * },\n * {\n * Name: (node) => {\n * events.push(`name:${node.value}`);\n * },\n * },\n * ]),\n * );\n *\n * events; // => ['field:hero', 'name:hero', 'field:name', 'name:name']\n * ```\n */\nexport function visitInParallel(\n visitors: ReadonlyArray<ASTVisitor>,\n): ASTVisitor {\n const skipping = new Array(visitors.length).fill(null);\n const mergedVisitor = Object.create(null);\n\n for (const kind of Object.values(Kind)) {\n let hasVisitor = false;\n const enterList = new Array(visitors.length).fill(undefined);\n const leaveList = new Array(visitors.length).fill(undefined);\n\n for (let i = 0; i < visitors.length; ++i) {\n const { enter, leave } = getEnterLeaveForKind(visitors[i], kind);\n hasVisitor ||= enter != null || leave != null;\n enterList[i] = enter;\n leaveList[i] = leave;\n }\n\n if (!hasVisitor) {\n continue;\n }\n\n const mergedEnterLeave: EnterLeaveVisitor<ASTNode> = {\n enter(...args) {\n const node = args[0];\n for (let i = 0; i < visitors.length; i++) {\n if (skipping[i] === null) {\n const result = enterList[i]?.apply(visitors[i], args);\n if (result === false) {\n skipping[i] = node;\n } else if (result === BREAK) {\n skipping[i] = BREAK;\n } else if (result !== undefined) {\n return result;\n }\n }\n }\n },\n leave(...args) {\n const node = args[0];\n for (let i = 0; i < visitors.length; i++) {\n if (skipping[i] === null) {\n const result = leaveList[i]?.apply(visitors[i], args);\n if (result === BREAK) {\n skipping[i] = BREAK;\n } else if (result !== undefined && result !== false) {\n return result;\n }\n } else if (skipping[i] === node) {\n skipping[i] = null;\n }\n }\n },\n };\n\n mergedVisitor[kind] = mergedEnterLeave;\n }\n\n return mergedVisitor;\n}\n\n/**\n * Given a visitor instance and a node kind, return EnterLeaveVisitor for that kind.\n * @param visitor - The visitor object to inspect.\n * @param kind - The AST node kind to resolve handlers for.\n * @returns The enter and leave handlers that apply for the given node kind.\n * @example\n * ```ts\n * import { Kind, getEnterLeaveForKind } from 'graphql/language';\n *\n * const handlers = getEnterLeaveForKind({ Field: () => {} }, Kind.FIELD);\n *\n * typeof handlers.enter; // => 'function'\n * handlers.leave; // => undefined\n * ```\n */\nexport function getEnterLeaveForKind(\n visitor: ASTVisitor,\n kind: Kind,\n): EnterLeaveVisitor<ASTNode> {\n const kindVisitor:\n | ASTVisitFn<ASTNode>\n | EnterLeaveVisitor<ASTNode>\n | undefined = (visitor as any)[kind];\n\n if (typeof kindVisitor === 'object') {\n // { Kind: { enter() {}, leave() {} } }\n return kindVisitor;\n } else if (typeof kindVisitor === 'function') {\n // { Kind() {} }\n return { enter: kindVisitor, leave: undefined };\n }\n\n // { enter() {}, leave() {} }\n return { enter: (visitor as any).enter, leave: (visitor as any).leave };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "graphql",
3
- "version": "17.0.0-rc.0",
3
+ "version": "17.0.1",
4
4
  "description": "A Query Language and Runtime which can target any service.",
5
5
  "license": "MIT",
6
6
  "typesVersions": {
@@ -33,9 +33,6 @@
33
33
  "engines": {
34
34
  "node": "^22.0.0 || ^24.0.0 || ^25.0.0 || >=26.0.0"
35
35
  },
36
- "publishConfig": {
37
- "tag": "rc"
38
- },
39
36
  "main": "index.js",
40
37
  "module": "index.mjs",
41
38
  "types": "index.d.ts",