graphql 14.0.2 → 14.2.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 (361) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +5 -5
  3. package/codecov.yml +14 -0
  4. package/error/GraphQLError.js +2 -2
  5. package/error/GraphQLError.js.flow +4 -4
  6. package/error/GraphQLError.mjs +2 -2
  7. package/error/formatError.js +2 -2
  8. package/error/formatError.js.flow +1 -1
  9. package/error/formatError.mjs +2 -2
  10. package/error/index.js.flow +1 -1
  11. package/error/index.mjs +2 -2
  12. package/error/locatedError.js +2 -2
  13. package/error/locatedError.js.flow +1 -1
  14. package/error/locatedError.mjs +2 -2
  15. package/error/printError.js +2 -2
  16. package/error/printError.js.flow +1 -1
  17. package/error/printError.mjs +2 -2
  18. package/error/syntaxError.js +2 -2
  19. package/error/syntaxError.js.flow +1 -1
  20. package/error/syntaxError.mjs +2 -2
  21. package/execution/execute.js +20 -11
  22. package/execution/execute.js.flow +41 -27
  23. package/execution/execute.mjs +19 -13
  24. package/execution/index.js +6 -0
  25. package/execution/index.js.flow +7 -2
  26. package/execution/index.mjs +3 -3
  27. package/execution/values.js +10 -10
  28. package/execution/values.js.flow +8 -8
  29. package/execution/values.mjs +9 -9
  30. package/graphql.js +8 -8
  31. package/graphql.js.flow +18 -4
  32. package/graphql.mjs +8 -8
  33. package/index.js +18 -0
  34. package/index.js.flow +4 -1
  35. package/index.mjs +4 -4
  36. package/jsutils/ObjMap.js.flow +1 -1
  37. package/jsutils/{MaybePromise.js → PromiseOrValue.js} +0 -0
  38. package/jsutils/{MaybePromise.js.flow → PromiseOrValue.js.flow} +2 -2
  39. package/jsutils/{MaybePromise.mjs → PromiseOrValue.mjs} +0 -0
  40. package/jsutils/dedent.js +2 -2
  41. package/jsutils/dedent.js.flow +1 -1
  42. package/jsutils/dedent.mjs +2 -2
  43. package/jsutils/defineToJSON.js +18 -7
  44. package/jsutils/defineToJSON.js.flow +15 -6
  45. package/jsutils/defineToJSON.mjs +15 -7
  46. package/jsutils/defineToStringTag.js +6 -6
  47. package/jsutils/defineToStringTag.js.flow +4 -4
  48. package/jsutils/defineToStringTag.mjs +5 -5
  49. package/jsutils/inspect.js +109 -23
  50. package/jsutils/inspect.js.flow +112 -14
  51. package/jsutils/inspect.mjs +108 -17
  52. package/jsutils/instanceOf.js +2 -2
  53. package/jsutils/instanceOf.js.flow +1 -1
  54. package/jsutils/instanceOf.mjs +2 -2
  55. package/jsutils/invariant.js +2 -2
  56. package/jsutils/invariant.js.flow +1 -1
  57. package/jsutils/invariant.mjs +2 -2
  58. package/jsutils/isInvalid.js +2 -2
  59. package/jsutils/isInvalid.js.flow +1 -1
  60. package/jsutils/isInvalid.mjs +2 -2
  61. package/jsutils/isNullish.js +2 -2
  62. package/jsutils/isNullish.js.flow +1 -1
  63. package/jsutils/isNullish.mjs +2 -2
  64. package/jsutils/isPromise.js +2 -2
  65. package/jsutils/isPromise.js.flow +1 -1
  66. package/jsutils/isPromise.mjs +2 -2
  67. package/jsutils/keyMap.js +2 -2
  68. package/jsutils/keyMap.js.flow +1 -1
  69. package/jsutils/keyMap.mjs +2 -2
  70. package/jsutils/keyValMap.js +2 -2
  71. package/jsutils/keyValMap.js.flow +1 -1
  72. package/jsutils/keyValMap.mjs +2 -2
  73. package/jsutils/mapValue.js +54 -0
  74. package/jsutils/mapValue.js.flow +27 -0
  75. package/jsutils/mapValue.mjs +44 -0
  76. package/jsutils/memoize3.js +2 -2
  77. package/jsutils/memoize3.js.flow +1 -1
  78. package/jsutils/memoize3.mjs +2 -2
  79. package/jsutils/nodejsCustomInspectSymbol.js +18 -0
  80. package/jsutils/nodejsCustomInspectSymbol.js.flow +15 -0
  81. package/jsutils/nodejsCustomInspectSymbol.mjs +10 -0
  82. package/jsutils/orList.js +18 -5
  83. package/jsutils/orList.js.flow +14 -8
  84. package/jsutils/orList.mjs +15 -5
  85. package/jsutils/promiseForObject.js +2 -2
  86. package/jsutils/promiseForObject.js.flow +1 -1
  87. package/jsutils/promiseForObject.mjs +2 -2
  88. package/jsutils/promiseReduce.js +2 -2
  89. package/jsutils/promiseReduce.js.flow +5 -5
  90. package/jsutils/promiseReduce.mjs +2 -2
  91. package/jsutils/quotedOrList.js +2 -2
  92. package/jsutils/quotedOrList.js.flow +1 -1
  93. package/jsutils/quotedOrList.mjs +2 -2
  94. package/jsutils/suggestionList.js +2 -2
  95. package/jsutils/suggestionList.js.flow +1 -1
  96. package/jsutils/suggestionList.mjs +2 -2
  97. package/language/ast.js.flow +1 -1
  98. package/language/{blockStringValue.mjs → blockString.js} +39 -3
  99. package/language/{blockStringValue.js.flow → blockString.js.flow} +31 -2
  100. package/language/{blockStringValue.js → blockString.mjs} +31 -10
  101. package/language/directiveLocation.js +2 -2
  102. package/language/directiveLocation.js.flow +1 -1
  103. package/language/directiveLocation.mjs +2 -2
  104. package/language/index.js.flow +1 -1
  105. package/language/index.mjs +2 -2
  106. package/language/kinds.js +2 -2
  107. package/language/kinds.js.flow +1 -1
  108. package/language/kinds.mjs +2 -2
  109. package/language/lexer.js +60 -46
  110. package/language/lexer.js.flow +71 -69
  111. package/language/lexer.mjs +58 -45
  112. package/language/location.js +2 -2
  113. package/language/location.js.flow +1 -1
  114. package/language/location.mjs +2 -2
  115. package/language/parser.js +84 -83
  116. package/language/parser.js.flow +85 -94
  117. package/language/parser.mjs +83 -83
  118. package/language/predicates.js +2 -2
  119. package/language/predicates.js.flow +1 -1
  120. package/language/predicates.mjs +2 -2
  121. package/language/printer.js +15 -17
  122. package/language/printer.js.flow +21 -20
  123. package/language/printer.mjs +14 -17
  124. package/language/source.js +8 -7
  125. package/language/source.js.flow +1 -1
  126. package/language/source.mjs +2 -10
  127. package/language/visitor.js +7 -6
  128. package/language/visitor.js.flow +3 -5
  129. package/language/visitor.mjs +7 -6
  130. package/package.json +5 -2
  131. package/polyfills/find.js +31 -0
  132. package/polyfills/find.js.flow +29 -0
  133. package/polyfills/find.mjs +23 -0
  134. package/polyfills/flatMap.js +38 -0
  135. package/polyfills/flatMap.js.flow +34 -0
  136. package/polyfills/flatMap.mjs +30 -0
  137. package/{jsutils → polyfills}/isFinite.js +2 -2
  138. package/{jsutils → polyfills}/isFinite.js.flow +1 -1
  139. package/{jsutils → polyfills}/isFinite.mjs +2 -2
  140. package/{jsutils → polyfills}/isInteger.js +2 -2
  141. package/{jsutils → polyfills}/isInteger.js.flow +1 -1
  142. package/{jsutils → polyfills}/isInteger.mjs +2 -2
  143. package/polyfills/objectEntries.js +26 -0
  144. package/polyfills/objectEntries.js.flow +19 -0
  145. package/polyfills/objectEntries.mjs +18 -0
  146. package/{jsutils → polyfills}/objectValues.js +2 -2
  147. package/{jsutils → polyfills}/objectValues.js.flow +2 -2
  148. package/{jsutils → polyfills}/objectValues.mjs +2 -2
  149. package/subscription/asyncIteratorReject.js.flow +1 -1
  150. package/subscription/asyncIteratorReject.mjs +2 -2
  151. package/subscription/index.js.flow +1 -1
  152. package/subscription/index.mjs +2 -2
  153. package/subscription/mapAsyncIterator.js.flow +5 -5
  154. package/subscription/mapAsyncIterator.mjs +2 -2
  155. package/subscription/subscribe.js +2 -2
  156. package/subscription/subscribe.js.flow +1 -1
  157. package/subscription/subscribe.mjs +2 -2
  158. package/type/definition.js +161 -138
  159. package/type/definition.js.flow +193 -57
  160. package/type/definition.mjs +158 -140
  161. package/type/directives.js +35 -29
  162. package/type/directives.js.flow +39 -21
  163. package/type/directives.mjs +34 -31
  164. package/type/index.js +12 -0
  165. package/type/index.js.flow +5 -1
  166. package/type/index.mjs +6 -4
  167. package/type/introspection.js +11 -7
  168. package/type/introspection.js.flow +11 -8
  169. package/type/introspection.mjs +11 -7
  170. package/type/scalars.js +45 -34
  171. package/type/scalars.js.flow +41 -27
  172. package/type/scalars.mjs +45 -27
  173. package/type/schema.js +134 -88
  174. package/type/schema.js.flow +77 -11
  175. package/type/schema.mjs +132 -88
  176. package/type/validate.js +152 -187
  177. package/type/validate.js.flow +12 -61
  178. package/type/validate.mjs +143 -188
  179. package/utilities/TypeInfo.js +10 -23
  180. package/utilities/TypeInfo.js.flow +2 -2
  181. package/utilities/TypeInfo.mjs +3 -25
  182. package/utilities/assertValidName.js +2 -2
  183. package/utilities/assertValidName.js.flow +1 -1
  184. package/utilities/assertValidName.mjs +2 -2
  185. package/utilities/astFromValue.js +7 -6
  186. package/utilities/astFromValue.js.flow +7 -6
  187. package/utilities/astFromValue.mjs +9 -8
  188. package/utilities/buildASTSchema.js +213 -197
  189. package/utilities/buildASTSchema.js.flow +163 -173
  190. package/utilities/buildASTSchema.mjs +203 -198
  191. package/utilities/buildClientSchema.js +39 -47
  192. package/utilities/buildClientSchema.js.flow +49 -58
  193. package/utilities/buildClientSchema.mjs +38 -46
  194. package/utilities/coerceValue.js +41 -21
  195. package/utilities/coerceValue.js.flow +44 -49
  196. package/utilities/coerceValue.mjs +42 -23
  197. package/utilities/concatAST.js +9 -13
  198. package/utilities/concatAST.js.flow +3 -9
  199. package/utilities/concatAST.mjs +6 -13
  200. package/utilities/extendSchema.js +256 -630
  201. package/utilities/extendSchema.js.flow +190 -426
  202. package/utilities/extendSchema.mjs +256 -631
  203. package/utilities/findBreakingChanges.js +8 -6
  204. package/utilities/findBreakingChanges.js.flow +4 -3
  205. package/utilities/findBreakingChanges.mjs +7 -6
  206. package/utilities/findDeprecatedUsages.js +4 -4
  207. package/utilities/findDeprecatedUsages.js.flow +3 -3
  208. package/utilities/findDeprecatedUsages.mjs +4 -4
  209. package/utilities/getOperationAST.js +2 -2
  210. package/utilities/getOperationAST.js.flow +1 -1
  211. package/utilities/getOperationAST.mjs +2 -2
  212. package/utilities/getOperationRootType.js +6 -6
  213. package/utilities/getOperationRootType.js.flow +9 -7
  214. package/utilities/getOperationRootType.mjs +6 -6
  215. package/utilities/index.js.flow +1 -1
  216. package/utilities/index.mjs +2 -2
  217. package/utilities/introspectionFromSchema.js +2 -2
  218. package/utilities/introspectionFromSchema.js.flow +1 -1
  219. package/utilities/introspectionFromSchema.mjs +2 -2
  220. package/utilities/introspectionQuery.js +2 -2
  221. package/utilities/introspectionQuery.js.flow +1 -1
  222. package/utilities/introspectionQuery.mjs +2 -2
  223. package/utilities/isValidJSValue.js +4 -2
  224. package/utilities/isValidJSValue.js.flow +2 -1
  225. package/utilities/isValidJSValue.mjs +4 -2
  226. package/utilities/isValidLiteralValue.js +2 -2
  227. package/utilities/isValidLiteralValue.js.flow +1 -1
  228. package/utilities/isValidLiteralValue.mjs +2 -2
  229. package/utilities/lexicographicSortSchema.js +86 -124
  230. package/utilities/lexicographicSortSchema.js.flow +68 -96
  231. package/utilities/lexicographicSortSchema.mjs +86 -124
  232. package/utilities/schemaPrinter.js +47 -73
  233. package/utilities/schemaPrinter.js.flow +62 -111
  234. package/utilities/schemaPrinter.mjs +46 -73
  235. package/utilities/separateOperations.js +11 -10
  236. package/utilities/separateOperations.js.flow +1 -1
  237. package/utilities/separateOperations.mjs +11 -10
  238. package/utilities/typeComparators.js +2 -2
  239. package/utilities/typeComparators.js.flow +1 -1
  240. package/utilities/typeComparators.mjs +2 -2
  241. package/utilities/typeFromAST.js +9 -4
  242. package/utilities/typeFromAST.js.flow +5 -2
  243. package/utilities/typeFromAST.mjs +6 -4
  244. package/utilities/valueFromAST.js +9 -6
  245. package/utilities/valueFromAST.js.flow +5 -3
  246. package/utilities/valueFromAST.mjs +7 -5
  247. package/utilities/valueFromASTUntyped.js +7 -4
  248. package/utilities/valueFromASTUntyped.js.flow +5 -2
  249. package/utilities/valueFromASTUntyped.mjs +6 -4
  250. package/validation/ValidationContext.js +57 -82
  251. package/validation/ValidationContext.js.flow +53 -50
  252. package/validation/ValidationContext.mjs +53 -78
  253. package/validation/index.js.flow +1 -1
  254. package/validation/index.mjs +2 -2
  255. package/validation/rules/ExecutableDefinitions.js +3 -3
  256. package/validation/rules/ExecutableDefinitions.js.flow +3 -3
  257. package/validation/rules/ExecutableDefinitions.mjs +3 -3
  258. package/validation/rules/FieldsOnCorrectType.js +3 -3
  259. package/validation/rules/FieldsOnCorrectType.js.flow +2 -2
  260. package/validation/rules/FieldsOnCorrectType.mjs +3 -3
  261. package/validation/rules/FragmentsOnCompositeTypes.js +4 -4
  262. package/validation/rules/FragmentsOnCompositeTypes.js.flow +3 -3
  263. package/validation/rules/FragmentsOnCompositeTypes.mjs +4 -4
  264. package/validation/rules/KnownArgumentNames.js.flow +1 -1
  265. package/validation/rules/KnownArgumentNames.mjs +2 -2
  266. package/validation/rules/KnownDirectives.js +4 -4
  267. package/validation/rules/KnownDirectives.js.flow +5 -4
  268. package/validation/rules/KnownDirectives.mjs +4 -4
  269. package/validation/rules/KnownFragmentNames.js +3 -3
  270. package/validation/rules/KnownFragmentNames.js.flow +2 -2
  271. package/validation/rules/KnownFragmentNames.mjs +3 -3
  272. package/validation/rules/KnownTypeNames.js +60 -22
  273. package/validation/rules/KnownTypeNames.js.flow +55 -21
  274. package/validation/rules/KnownTypeNames.mjs +57 -22
  275. package/validation/rules/LoneAnonymousOperation.js +3 -3
  276. package/validation/rules/LoneAnonymousOperation.js.flow +2 -2
  277. package/validation/rules/LoneAnonymousOperation.mjs +3 -3
  278. package/validation/rules/LoneSchemaDefinition.js +2 -2
  279. package/validation/rules/LoneSchemaDefinition.js.flow +1 -1
  280. package/validation/rules/LoneSchemaDefinition.mjs +2 -2
  281. package/validation/rules/NoFragmentCycles.js +2 -2
  282. package/validation/rules/NoFragmentCycles.js.flow +3 -3
  283. package/validation/rules/NoFragmentCycles.mjs +2 -2
  284. package/validation/rules/NoUndefinedVariables.js +2 -2
  285. package/validation/rules/NoUndefinedVariables.js.flow +1 -1
  286. package/validation/rules/NoUndefinedVariables.mjs +2 -2
  287. package/validation/rules/NoUnusedFragments.js +10 -7
  288. package/validation/rules/NoUnusedFragments.js.flow +4 -4
  289. package/validation/rules/NoUnusedFragments.mjs +10 -7
  290. package/validation/rules/NoUnusedVariables.js +7 -5
  291. package/validation/rules/NoUnusedVariables.js.flow +4 -3
  292. package/validation/rules/NoUnusedVariables.mjs +7 -5
  293. package/validation/rules/OverlappingFieldsCanBeMerged.js +58 -33
  294. package/validation/rules/OverlappingFieldsCanBeMerged.js.flow +4 -4
  295. package/validation/rules/OverlappingFieldsCanBeMerged.mjs +50 -34
  296. package/validation/rules/PossibleFragmentSpreads.js +4 -4
  297. package/validation/rules/PossibleFragmentSpreads.js.flow +3 -3
  298. package/validation/rules/PossibleFragmentSpreads.mjs +4 -4
  299. package/validation/rules/PossibleTypeExtensions.js +158 -0
  300. package/validation/rules/PossibleTypeExtensions.js.flow +160 -0
  301. package/validation/rules/PossibleTypeExtensions.mjs +146 -0
  302. package/validation/rules/ProvidedRequiredArguments.js +3 -3
  303. package/validation/rules/ProvidedRequiredArguments.js.flow +4 -4
  304. package/validation/rules/ProvidedRequiredArguments.mjs +5 -5
  305. package/validation/rules/ScalarLeafs.js +4 -4
  306. package/validation/rules/ScalarLeafs.js.flow +3 -3
  307. package/validation/rules/ScalarLeafs.mjs +4 -4
  308. package/validation/rules/SingleFieldSubscriptions.js +2 -2
  309. package/validation/rules/SingleFieldSubscriptions.js.flow +1 -1
  310. package/validation/rules/SingleFieldSubscriptions.mjs +2 -2
  311. package/validation/rules/UniqueArgumentNames.js +2 -2
  312. package/validation/rules/UniqueArgumentNames.js.flow +1 -1
  313. package/validation/rules/UniqueArgumentNames.mjs +2 -2
  314. package/validation/rules/UniqueDirectiveNames.js +55 -0
  315. package/validation/rules/UniqueDirectiveNames.js.flow +64 -0
  316. package/validation/rules/UniqueDirectiveNames.mjs +43 -0
  317. package/validation/rules/UniqueDirectivesPerLocation.js +2 -2
  318. package/validation/rules/UniqueDirectivesPerLocation.js.flow +1 -1
  319. package/validation/rules/UniqueDirectivesPerLocation.mjs +2 -2
  320. package/validation/rules/UniqueEnumValueNames.js +90 -0
  321. package/validation/rules/UniqueEnumValueNames.js.flow +85 -0
  322. package/validation/rules/UniqueEnumValueNames.mjs +77 -0
  323. package/validation/rules/UniqueFieldDefinitionNames.js +101 -0
  324. package/validation/rules/UniqueFieldDefinitionNames.js.flow +99 -0
  325. package/validation/rules/UniqueFieldDefinitionNames.mjs +88 -0
  326. package/validation/rules/UniqueFragmentNames.js +2 -2
  327. package/validation/rules/UniqueFragmentNames.js.flow +1 -1
  328. package/validation/rules/UniqueFragmentNames.mjs +2 -2
  329. package/validation/rules/UniqueInputFieldNames.js +2 -4
  330. package/validation/rules/UniqueInputFieldNames.js.flow +1 -2
  331. package/validation/rules/UniqueInputFieldNames.mjs +2 -4
  332. package/validation/rules/UniqueOperationNames.js +2 -2
  333. package/validation/rules/UniqueOperationNames.js.flow +1 -1
  334. package/validation/rules/UniqueOperationNames.mjs +2 -2
  335. package/validation/rules/UniqueOperationTypes.js +85 -0
  336. package/validation/rules/UniqueOperationTypes.js.flow +76 -0
  337. package/validation/rules/UniqueOperationTypes.mjs +73 -0
  338. package/validation/rules/UniqueTypeNames.js +62 -0
  339. package/validation/rules/UniqueTypeNames.js.flow +67 -0
  340. package/validation/rules/UniqueTypeNames.mjs +50 -0
  341. package/validation/rules/UniqueVariableNames.js +2 -2
  342. package/validation/rules/UniqueVariableNames.js.flow +1 -1
  343. package/validation/rules/UniqueVariableNames.mjs +2 -2
  344. package/validation/rules/ValuesOfCorrectType.js +30 -14
  345. package/validation/rules/ValuesOfCorrectType.js.flow +5 -6
  346. package/validation/rules/ValuesOfCorrectType.mjs +29 -14
  347. package/validation/rules/VariablesAreInputTypes.js +3 -3
  348. package/validation/rules/VariablesAreInputTypes.js.flow +2 -2
  349. package/validation/rules/VariablesAreInputTypes.mjs +3 -3
  350. package/validation/rules/VariablesInAllowedPosition.js +5 -5
  351. package/validation/rules/VariablesInAllowedPosition.js.flow +1 -1
  352. package/validation/rules/VariablesInAllowedPosition.mjs +5 -5
  353. package/validation/specifiedRules.js +15 -3
  354. package/validation/specifiedRules.js.flow +14 -1
  355. package/validation/specifiedRules.mjs +9 -3
  356. package/validation/validate.js +2 -2
  357. package/validation/validate.js.flow +1 -1
  358. package/validation/validate.mjs +2 -2
  359. package/jsutils/find.js +0 -22
  360. package/jsutils/find.js.flow +0 -19
  361. package/jsutils/find.mjs +0 -15
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Copyright (c) 2015-present, Facebook, Inc.
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
3
  *
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
@@ -8,6 +8,7 @@
8
8
  */
9
9
 
10
10
  import inspect from '../jsutils/inspect';
11
+ import defineToJSON from '../jsutils/defineToJSON';
11
12
  import { Source } from './source';
12
13
  import { syntaxError } from '../error';
13
14
  import type { GraphQLError } from '../error';
@@ -115,17 +116,6 @@ export type ParseOptions = {
115
116
  * future.
116
117
  */
117
118
  experimentalFragmentVariables?: boolean,
118
-
119
- /**
120
- * EXPERIMENTAL:
121
- *
122
- * If enabled, the parser understands directives on variable definitions:
123
- *
124
- * query Foo($var: String = "abc" @variable_definition_directive) {
125
- * ...
126
- * }
127
- */
128
- experimentalVariableDefinitionDirectives?: boolean,
129
119
  };
130
120
 
131
121
  /**
@@ -160,9 +150,9 @@ export function parseValue(
160
150
  ): ValueNode {
161
151
  const sourceObj = typeof source === 'string' ? new Source(source) : source;
162
152
  const lexer = createLexer(sourceObj, options || {});
163
- expect(lexer, TokenKind.SOF);
153
+ expectToken(lexer, TokenKind.SOF);
164
154
  const value = parseValueLiteral(lexer, false);
165
- expect(lexer, TokenKind.EOF);
155
+ expectToken(lexer, TokenKind.EOF);
166
156
  return value;
167
157
  }
168
158
 
@@ -182,9 +172,9 @@ export function parseType(
182
172
  ): TypeNode {
183
173
  const sourceObj = typeof source === 'string' ? new Source(source) : source;
184
174
  const lexer = createLexer(sourceObj, options || {});
185
- expect(lexer, TokenKind.SOF);
175
+ expectToken(lexer, TokenKind.SOF);
186
176
  const type = parseTypeReference(lexer);
187
- expect(lexer, TokenKind.EOF);
177
+ expectToken(lexer, TokenKind.EOF);
188
178
  return type;
189
179
  }
190
180
 
@@ -192,7 +182,7 @@ export function parseType(
192
182
  * Converts a name lex token into a name parse node.
193
183
  */
194
184
  function parseName(lexer: Lexer<*>): NameNode {
195
- const token = expect(lexer, TokenKind.NAME);
185
+ const token = expectToken(lexer, TokenKind.NAME);
196
186
  return {
197
187
  kind: Kind.NAME,
198
188
  value: ((token.value: any): string),
@@ -312,7 +302,7 @@ function parseOperationDefinition(lexer: Lexer<*>): OperationDefinitionNode {
312
302
  * OperationType : one of query mutation subscription
313
303
  */
314
304
  function parseOperationType(lexer: Lexer<*>): OperationTypeNode {
315
- const operationToken = expect(lexer, TokenKind.NAME);
305
+ const operationToken = expectToken(lexer, TokenKind.NAME);
316
306
  switch (operationToken.value) {
317
307
  case 'query':
318
308
  return 'query';
@@ -341,26 +331,14 @@ function parseVariableDefinitions(
341
331
  */
342
332
  function parseVariableDefinition(lexer: Lexer<*>): VariableDefinitionNode {
343
333
  const start = lexer.token;
344
- if (lexer.options.experimentalVariableDefinitionDirectives) {
345
- return {
346
- kind: Kind.VARIABLE_DEFINITION,
347
- variable: parseVariable(lexer),
348
- type: (expect(lexer, TokenKind.COLON), parseTypeReference(lexer)),
349
- defaultValue: skip(lexer, TokenKind.EQUALS)
350
- ? parseValueLiteral(lexer, true)
351
- : undefined,
352
- directives: parseDirectives(lexer, true),
353
- loc: loc(lexer, start),
354
- };
355
- }
356
-
357
334
  return {
358
335
  kind: Kind.VARIABLE_DEFINITION,
359
336
  variable: parseVariable(lexer),
360
- type: (expect(lexer, TokenKind.COLON), parseTypeReference(lexer)),
361
- defaultValue: skip(lexer, TokenKind.EQUALS)
337
+ type: (expectToken(lexer, TokenKind.COLON), parseTypeReference(lexer)),
338
+ defaultValue: expectOptionalToken(lexer, TokenKind.EQUALS)
362
339
  ? parseValueLiteral(lexer, true)
363
340
  : undefined,
341
+ directives: parseDirectives(lexer, true),
364
342
  loc: loc(lexer, start),
365
343
  };
366
344
  }
@@ -370,7 +348,7 @@ function parseVariableDefinition(lexer: Lexer<*>): VariableDefinitionNode {
370
348
  */
371
349
  function parseVariable(lexer: Lexer<*>): VariableNode {
372
350
  const start = lexer.token;
373
- expect(lexer, TokenKind.DOLLAR);
351
+ expectToken(lexer, TokenKind.DOLLAR);
374
352
  return {
375
353
  kind: Kind.VARIABLE,
376
354
  name: parseName(lexer),
@@ -418,7 +396,7 @@ function parseField(lexer: Lexer<*>): FieldNode {
418
396
  const nameOrAlias = parseName(lexer);
419
397
  let alias;
420
398
  let name;
421
- if (skip(lexer, TokenKind.COLON)) {
399
+ if (expectOptionalToken(lexer, TokenKind.COLON)) {
422
400
  alias = nameOrAlias;
423
401
  name = parseName(lexer);
424
402
  } else {
@@ -456,10 +434,13 @@ function parseArguments(
456
434
  */
457
435
  function parseArgument(lexer: Lexer<*>): ArgumentNode {
458
436
  const start = lexer.token;
437
+ const name = parseName(lexer);
438
+
439
+ expectToken(lexer, TokenKind.COLON);
459
440
  return {
460
441
  kind: Kind.ARGUMENT,
461
- name: parseName(lexer),
462
- value: (expect(lexer, TokenKind.COLON), parseValueLiteral(lexer, false)),
442
+ name,
443
+ value: parseValueLiteral(lexer, false),
463
444
  loc: loc(lexer, start),
464
445
  };
465
446
  }
@@ -469,7 +450,7 @@ function parseConstArgument(lexer: Lexer<*>): ArgumentNode {
469
450
  return {
470
451
  kind: Kind.ARGUMENT,
471
452
  name: parseName(lexer),
472
- value: (expect(lexer, TokenKind.COLON), parseConstValue(lexer)),
453
+ value: (expectToken(lexer, TokenKind.COLON), parseConstValue(lexer)),
473
454
  loc: loc(lexer, start),
474
455
  };
475
456
  }
@@ -487,8 +468,10 @@ function parseFragment(
487
468
  lexer: Lexer<*>,
488
469
  ): FragmentSpreadNode | InlineFragmentNode {
489
470
  const start = lexer.token;
490
- expect(lexer, TokenKind.SPREAD);
491
- if (peek(lexer, TokenKind.NAME) && lexer.token.value !== 'on') {
471
+ expectToken(lexer, TokenKind.SPREAD);
472
+
473
+ const hasTypeCondition = expectOptionalKeyword(lexer, 'on');
474
+ if (!hasTypeCondition && peek(lexer, TokenKind.NAME)) {
492
475
  return {
493
476
  kind: Kind.FRAGMENT_SPREAD,
494
477
  name: parseFragmentName(lexer),
@@ -496,14 +479,9 @@ function parseFragment(
496
479
  loc: loc(lexer, start),
497
480
  };
498
481
  }
499
- let typeCondition;
500
- if (lexer.token.value === 'on') {
501
- lexer.advance();
502
- typeCondition = parseNamedType(lexer);
503
- }
504
482
  return {
505
483
  kind: Kind.INLINE_FRAGMENT,
506
- typeCondition,
484
+ typeCondition: hasTypeCondition ? parseNamedType(lexer) : undefined,
507
485
  directives: parseDirectives(lexer, false),
508
486
  selectionSet: parseSelectionSet(lexer),
509
487
  loc: loc(lexer, start),
@@ -668,14 +646,10 @@ function parseList(lexer: Lexer<*>, isConst: boolean): ListValueNode {
668
646
  */
669
647
  function parseObject(lexer: Lexer<*>, isConst: boolean): ObjectValueNode {
670
648
  const start = lexer.token;
671
- expect(lexer, TokenKind.BRACE_L);
672
- const fields = [];
673
- while (!skip(lexer, TokenKind.BRACE_R)) {
674
- fields.push(parseObjectField(lexer, isConst));
675
- }
649
+ const item = () => parseObjectField(lexer, isConst);
676
650
  return {
677
651
  kind: Kind.OBJECT,
678
- fields,
652
+ fields: any(lexer, TokenKind.BRACE_L, item, TokenKind.BRACE_R),
679
653
  loc: loc(lexer, start),
680
654
  };
681
655
  }
@@ -685,10 +659,13 @@ function parseObject(lexer: Lexer<*>, isConst: boolean): ObjectValueNode {
685
659
  */
686
660
  function parseObjectField(lexer: Lexer<*>, isConst: boolean): ObjectFieldNode {
687
661
  const start = lexer.token;
662
+ const name = parseName(lexer);
663
+ expectToken(lexer, TokenKind.COLON);
664
+
688
665
  return {
689
666
  kind: Kind.OBJECT_FIELD,
690
- name: parseName(lexer),
691
- value: (expect(lexer, TokenKind.COLON), parseValueLiteral(lexer, isConst)),
667
+ name,
668
+ value: parseValueLiteral(lexer, isConst),
692
669
  loc: loc(lexer, start),
693
670
  };
694
671
  }
@@ -714,7 +691,7 @@ function parseDirectives(
714
691
  */
715
692
  function parseDirective(lexer: Lexer<*>, isConst: boolean): DirectiveNode {
716
693
  const start = lexer.token;
717
- expect(lexer, TokenKind.AT);
694
+ expectToken(lexer, TokenKind.AT);
718
695
  return {
719
696
  kind: Kind.DIRECTIVE,
720
697
  name: parseName(lexer),
@@ -734,9 +711,9 @@ function parseDirective(lexer: Lexer<*>, isConst: boolean): DirectiveNode {
734
711
  export function parseTypeReference(lexer: Lexer<*>): TypeNode {
735
712
  const start = lexer.token;
736
713
  let type;
737
- if (skip(lexer, TokenKind.BRACKET_L)) {
714
+ if (expectOptionalToken(lexer, TokenKind.BRACKET_L)) {
738
715
  type = parseTypeReference(lexer);
739
- expect(lexer, TokenKind.BRACKET_R);
716
+ expectToken(lexer, TokenKind.BRACKET_R);
740
717
  type = ({
741
718
  kind: Kind.LIST_TYPE,
742
719
  type,
@@ -745,7 +722,7 @@ export function parseTypeReference(lexer: Lexer<*>): TypeNode {
745
722
  } else {
746
723
  type = parseNamedType(lexer);
747
724
  }
748
- if (skip(lexer, TokenKind.BANG)) {
725
+ if (expectOptionalToken(lexer, TokenKind.BANG)) {
749
726
  return ({
750
727
  kind: Kind.NON_NULL_TYPE,
751
728
  type,
@@ -853,7 +830,7 @@ function parseOperationTypeDefinition(
853
830
  ): OperationTypeDefinitionNode {
854
831
  const start = lexer.token;
855
832
  const operation = parseOperationType(lexer);
856
- expect(lexer, TokenKind.COLON);
833
+ expectToken(lexer, TokenKind.COLON);
857
834
  const type = parseNamedType(lexer);
858
835
  return {
859
836
  kind: Kind.OPERATION_TYPE_DEFINITION,
@@ -912,14 +889,13 @@ function parseObjectTypeDefinition(lexer: Lexer<*>): ObjectTypeDefinitionNode {
912
889
  */
913
890
  function parseImplementsInterfaces(lexer: Lexer<*>): Array<NamedTypeNode> {
914
891
  const types = [];
915
- if (lexer.token.value === 'implements') {
916
- lexer.advance();
892
+ if (expectOptionalKeyword(lexer, 'implements')) {
917
893
  // Optional leading ampersand
918
- skip(lexer, TokenKind.AMP);
894
+ expectOptionalToken(lexer, TokenKind.AMP);
919
895
  do {
920
896
  types.push(parseNamedType(lexer));
921
897
  } while (
922
- skip(lexer, TokenKind.AMP) ||
898
+ expectOptionalToken(lexer, TokenKind.AMP) ||
923
899
  // Legacy support for the SDL?
924
900
  (lexer.options.allowLegacySDLImplementsInterfaces &&
925
901
  peek(lexer, TokenKind.NAME))
@@ -956,7 +932,7 @@ function parseFieldDefinition(lexer: Lexer<*>): FieldDefinitionNode {
956
932
  const description = parseDescription(lexer);
957
933
  const name = parseName(lexer);
958
934
  const args = parseArgumentDefs(lexer);
959
- expect(lexer, TokenKind.COLON);
935
+ expectToken(lexer, TokenKind.COLON);
960
936
  const type = parseTypeReference(lexer);
961
937
  const directives = parseDirectives(lexer, true);
962
938
  return {
@@ -988,10 +964,10 @@ function parseInputValueDef(lexer: Lexer<*>): InputValueDefinitionNode {
988
964
  const start = lexer.token;
989
965
  const description = parseDescription(lexer);
990
966
  const name = parseName(lexer);
991
- expect(lexer, TokenKind.COLON);
967
+ expectToken(lexer, TokenKind.COLON);
992
968
  const type = parseTypeReference(lexer);
993
969
  let defaultValue;
994
- if (skip(lexer, TokenKind.EQUALS)) {
970
+ if (expectOptionalToken(lexer, TokenKind.EQUALS)) {
995
971
  defaultValue = parseConstValue(lexer);
996
972
  }
997
973
  const directives = parseDirectives(lexer, true);
@@ -1057,12 +1033,12 @@ function parseUnionTypeDefinition(lexer: Lexer<*>): UnionTypeDefinitionNode {
1057
1033
  */
1058
1034
  function parseUnionMemberTypes(lexer: Lexer<*>): Array<NamedTypeNode> {
1059
1035
  const types = [];
1060
- if (skip(lexer, TokenKind.EQUALS)) {
1036
+ if (expectOptionalToken(lexer, TokenKind.EQUALS)) {
1061
1037
  // Optional leading pipe
1062
- skip(lexer, TokenKind.PIPE);
1038
+ expectOptionalToken(lexer, TokenKind.PIPE);
1063
1039
  do {
1064
1040
  types.push(parseNamedType(lexer));
1065
- } while (skip(lexer, TokenKind.PIPE));
1041
+ } while (expectOptionalToken(lexer, TokenKind.PIPE));
1066
1042
  }
1067
1043
  return types;
1068
1044
  }
@@ -1384,7 +1360,7 @@ function parseDirectiveDefinition(lexer: Lexer<*>): DirectiveDefinitionNode {
1384
1360
  const start = lexer.token;
1385
1361
  const description = parseDescription(lexer);
1386
1362
  expectKeyword(lexer, 'directive');
1387
- expect(lexer, TokenKind.AT);
1363
+ expectToken(lexer, TokenKind.AT);
1388
1364
  const name = parseName(lexer);
1389
1365
  const args = parseArgumentDefs(lexer);
1390
1366
  expectKeyword(lexer, 'on');
@@ -1406,11 +1382,11 @@ function parseDirectiveDefinition(lexer: Lexer<*>): DirectiveDefinitionNode {
1406
1382
  */
1407
1383
  function parseDirectiveLocations(lexer: Lexer<*>): Array<NameNode> {
1408
1384
  // Optional leading pipe
1409
- skip(lexer, TokenKind.PIPE);
1385
+ expectOptionalToken(lexer, TokenKind.PIPE);
1410
1386
  const locations = [];
1411
1387
  do {
1412
1388
  locations.push(parseDirectiveLocation(lexer));
1413
- } while (skip(lexer, TokenKind.PIPE));
1389
+ } while (expectOptionalToken(lexer, TokenKind.PIPE));
1414
1390
  return locations;
1415
1391
  }
1416
1392
 
@@ -1471,9 +1447,9 @@ function Loc(startToken: Token, endToken: Token, source: Source) {
1471
1447
  }
1472
1448
 
1473
1449
  // Print a simplified form when appearing in JSON/util.inspect.
1474
- Loc.prototype.toJSON = Loc.prototype.inspect = function toJSON() {
1450
+ defineToJSON(Loc, function() {
1475
1451
  return { start: this.start, end: this.end };
1476
- };
1452
+ });
1477
1453
 
1478
1454
  /**
1479
1455
  * Determines if the next token is of a given kind
@@ -1482,28 +1458,17 @@ function peek(lexer: Lexer<*>, kind: TokenKindEnum): boolean {
1482
1458
  return lexer.token.kind === kind;
1483
1459
  }
1484
1460
 
1485
- /**
1486
- * If the next token is of the given kind, return true after advancing
1487
- * the lexer. Otherwise, do not change the parser state and return false.
1488
- */
1489
- function skip(lexer: Lexer<*>, kind: TokenKindEnum): boolean {
1490
- const match = lexer.token.kind === kind;
1491
- if (match) {
1492
- lexer.advance();
1493
- }
1494
- return match;
1495
- }
1496
-
1497
1461
  /**
1498
1462
  * If the next token is of the given kind, return that token after advancing
1499
1463
  * the lexer. Otherwise, do not change the parser state and throw an error.
1500
1464
  */
1501
- function expect(lexer: Lexer<*>, kind: TokenKindEnum): Token {
1465
+ function expectToken(lexer: Lexer<*>, kind: TokenKindEnum): Token {
1502
1466
  const token = lexer.token;
1503
1467
  if (token.kind === kind) {
1504
1468
  lexer.advance();
1505
1469
  return token;
1506
1470
  }
1471
+
1507
1472
  throw syntaxError(
1508
1473
  lexer.source,
1509
1474
  token.start,
@@ -1512,9 +1477,21 @@ function expect(lexer: Lexer<*>, kind: TokenKindEnum): Token {
1512
1477
  }
1513
1478
 
1514
1479
  /**
1515
- * If the next token is a keyword with the given value, return that token after
1516
- * advancing the lexer. Otherwise, do not change the parser state and return
1517
- * false.
1480
+ * If the next token is of the given kind, return that token after advancing
1481
+ * the lexer. Otherwise, do not change the parser state and return undefined.
1482
+ */
1483
+ function expectOptionalToken(lexer: Lexer<*>, kind: TokenKindEnum): ?Token {
1484
+ const token = lexer.token;
1485
+ if (token.kind === kind) {
1486
+ lexer.advance();
1487
+ return token;
1488
+ }
1489
+ return undefined;
1490
+ }
1491
+
1492
+ /**
1493
+ * If the next token is a given keyword, return that token after advancing
1494
+ * the lexer. Otherwise, do not change the parser state and throw an error.
1518
1495
  */
1519
1496
  function expectKeyword(lexer: Lexer<*>, value: string): Token {
1520
1497
  const token = lexer.token;
@@ -1522,6 +1499,7 @@ function expectKeyword(lexer: Lexer<*>, value: string): Token {
1522
1499
  lexer.advance();
1523
1500
  return token;
1524
1501
  }
1502
+
1525
1503
  throw syntaxError(
1526
1504
  lexer.source,
1527
1505
  token.start,
@@ -1529,6 +1507,19 @@ function expectKeyword(lexer: Lexer<*>, value: string): Token {
1529
1507
  );
1530
1508
  }
1531
1509
 
1510
+ /**
1511
+ * If the next token is a given keyword, return that token after advancing
1512
+ * the lexer. Otherwise, do not change the parser state and return undefined.
1513
+ */
1514
+ function expectOptionalKeyword(lexer: Lexer<*>, value: string): ?Token {
1515
+ const token = lexer.token;
1516
+ if (token.kind === TokenKind.NAME && token.value === value) {
1517
+ lexer.advance();
1518
+ return token;
1519
+ }
1520
+ return undefined;
1521
+ }
1522
+
1532
1523
  /**
1533
1524
  * Helper function for creating an error when an unexpected lexed token
1534
1525
  * is encountered.
@@ -1554,9 +1545,9 @@ function any<T>(
1554
1545
  parseFn: (lexer: Lexer<*>) => T,
1555
1546
  closeKind: TokenKindEnum,
1556
1547
  ): Array<T> {
1557
- expect(lexer, openKind);
1548
+ expectToken(lexer, openKind);
1558
1549
  const nodes = [];
1559
- while (!skip(lexer, closeKind)) {
1550
+ while (!expectOptionalToken(lexer, closeKind)) {
1560
1551
  nodes.push(parseFn(lexer));
1561
1552
  }
1562
1553
  return nodes;
@@ -1574,9 +1565,9 @@ function many<T>(
1574
1565
  parseFn: (lexer: Lexer<*>) => T,
1575
1566
  closeKind: TokenKindEnum,
1576
1567
  ): Array<T> {
1577
- expect(lexer, openKind);
1568
+ expectToken(lexer, openKind);
1578
1569
  const nodes = [parseFn(lexer)];
1579
- while (!skip(lexer, closeKind)) {
1570
+ while (!expectOptionalToken(lexer, closeKind)) {
1580
1571
  nodes.push(parseFn(lexer));
1581
1572
  }
1582
1573
  return nodes;