relay-compiler 8.0.0 → 10.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (220) hide show
  1. package/bin/RelayCompilerBin.js.flow +169 -0
  2. package/bin/RelayCompilerMain.js.flow +515 -0
  3. package/bin/__fixtures__/plugin-module.js.flow +17 -0
  4. package/bin/relay-compiler +8930 -8967
  5. package/codegen/CodegenDirectory.js.flow +375 -0
  6. package/codegen/CodegenRunner.js.flow +432 -0
  7. package/codegen/CodegenTypes.js.flow +28 -0
  8. package/codegen/CodegenWatcher.js.flow +254 -0
  9. package/codegen/NormalizationCodeGenerator.js.flow +563 -0
  10. package/codegen/ReaderCodeGenerator.js.flow +477 -0
  11. package/codegen/RelayCodeGenerator.js.flow +85 -0
  12. package/codegen/RelayFileWriter.js.flow +365 -0
  13. package/codegen/SourceControl.js.flow +58 -0
  14. package/codegen/compileRelayArtifacts.js.flow +182 -0
  15. package/codegen/createPrintRequireModuleDependency.js.flow +21 -0
  16. package/codegen/sortObjectByKey.js.flow +25 -0
  17. package/codegen/writeRelayGeneratedFile.js.flow +223 -0
  18. package/core/ASTCache.js.flow +73 -0
  19. package/core/ASTConvert.js.flow +233 -0
  20. package/core/CompilerContext.js.flow +190 -0
  21. package/core/CompilerError.js.flow +250 -0
  22. package/core/DotGraphQLParser.js.flow +39 -0
  23. package/core/GraphQLCompilerProfiler.js.flow +341 -0
  24. package/core/GraphQLDerivedFromMetadata.js.flow +36 -0
  25. package/core/GraphQLWatchmanClient.js.flow +111 -0
  26. package/core/IR.js.flow +327 -0
  27. package/core/IRPrinter.js.flow +482 -0
  28. package/core/IRTransformer.js.flow +377 -0
  29. package/core/IRValidator.js.flow +260 -0
  30. package/core/IRVisitor.js.flow +150 -0
  31. package/core/JSModuleParser.js.flow +24 -0
  32. package/core/RelayCompilerScope.js.flow +199 -0
  33. package/core/RelayFindGraphQLTags.js.flow +119 -0
  34. package/core/RelayGraphQLEnumsGenerator.js.flow +55 -0
  35. package/core/RelayIRTransforms.js.flow +131 -0
  36. package/core/RelayParser.js.flow +1731 -0
  37. package/core/RelaySourceModuleParser.js.flow +135 -0
  38. package/core/Schema.js.flow +1983 -0
  39. package/core/SchemaUtils.js.flow +120 -0
  40. package/core/filterContextForNode.js.flow +50 -0
  41. package/core/getFieldDefinition.js.flow +156 -0
  42. package/core/getIdentifierForArgumentValue.js.flow +49 -0
  43. package/core/getIdentifierForSelection.js.flow +69 -0
  44. package/core/getLiteralArgumentValues.js.flow +32 -0
  45. package/core/getNormalizationOperationName.js.flow +19 -0
  46. package/core/inferRootArgumentDefinitions.js.flow +323 -0
  47. package/index.js +1 -1
  48. package/index.js.flow +200 -0
  49. package/language/RelayLanguagePluginInterface.js.flow +283 -0
  50. package/language/javascript/FindGraphQLTags.js.flow +232 -0
  51. package/language/javascript/RelayFlowBabelFactories.js.flow +180 -0
  52. package/language/javascript/RelayFlowGenerator.js.flow +1042 -0
  53. package/language/javascript/RelayFlowTypeTransformers.js.flow +184 -0
  54. package/language/javascript/RelayLanguagePluginJavaScript.js.flow +34 -0
  55. package/language/javascript/formatGeneratedModule.js.flow +65 -0
  56. package/lib/bin/RelayCompilerBin.js +24 -7
  57. package/lib/bin/RelayCompilerMain.js +141 -136
  58. package/lib/codegen/CodegenDirectory.js +13 -8
  59. package/lib/codegen/CodegenRunner.js +37 -76
  60. package/lib/codegen/CodegenWatcher.js +13 -21
  61. package/lib/codegen/NormalizationCodeGenerator.js +117 -140
  62. package/lib/codegen/ReaderCodeGenerator.js +76 -117
  63. package/lib/codegen/RelayCodeGenerator.js +17 -6
  64. package/lib/codegen/RelayFileWriter.js +19 -40
  65. package/lib/codegen/compileRelayArtifacts.js +16 -30
  66. package/lib/codegen/sortObjectByKey.js +43 -0
  67. package/lib/codegen/writeRelayGeneratedFile.js +86 -95
  68. package/lib/core/ASTCache.js +2 -4
  69. package/lib/core/CompilerContext.js +2 -4
  70. package/lib/core/CompilerError.js +27 -54
  71. package/lib/core/GraphQLCompilerProfiler.js +8 -12
  72. package/lib/core/GraphQLDerivedFromMetadata.js +1 -10
  73. package/lib/core/GraphQLWatchmanClient.js +4 -12
  74. package/lib/core/IRPrinter.js +23 -21
  75. package/lib/core/IRTransformer.js +8 -16
  76. package/lib/core/IRValidator.js +1 -9
  77. package/lib/core/IRVisitor.js +0 -2
  78. package/lib/core/RelayCompilerScope.js +4 -4
  79. package/lib/core/RelayGraphQLEnumsGenerator.js +12 -15
  80. package/lib/core/RelayIRTransforms.js +16 -14
  81. package/lib/core/RelayParser.js +53 -89
  82. package/lib/core/RelaySourceModuleParser.js +3 -3
  83. package/lib/core/Schema.js +61 -73
  84. package/lib/core/SchemaUtils.js +15 -1
  85. package/lib/core/getFieldDefinition.js +12 -15
  86. package/lib/core/getIdentifierForSelection.js +2 -4
  87. package/lib/core/inferRootArgumentDefinitions.js +33 -73
  88. package/lib/index.js +4 -5
  89. package/lib/language/javascript/FindGraphQLTags.js +4 -3
  90. package/lib/language/javascript/RelayFlowGenerator.js +82 -171
  91. package/lib/language/javascript/RelayFlowTypeTransformers.js +1 -3
  92. package/lib/language/javascript/RelayLanguagePluginJavaScript.js +6 -4
  93. package/lib/language/javascript/formatGeneratedModule.js +11 -2
  94. package/lib/reporters/ConsoleReporter.js +1 -3
  95. package/lib/reporters/MultiReporter.js +1 -3
  96. package/lib/runner/Artifacts.js +69 -170
  97. package/lib/runner/BufferedFilesystem.js +32 -66
  98. package/lib/runner/GraphQLASTNodeGroup.js +54 -120
  99. package/lib/runner/GraphQLNodeMap.js +14 -19
  100. package/lib/runner/Sources.js +51 -85
  101. package/lib/runner/StrictMap.js +21 -37
  102. package/lib/runner/getChangedNodeNames.js +30 -62
  103. package/lib/transforms/ApplyFragmentArgumentTransform.js +73 -59
  104. package/lib/transforms/ClientExtensionsTransform.js +12 -16
  105. package/lib/transforms/ConnectionTransform.js +30 -37
  106. package/lib/transforms/DeclarativeConnectionMutationTransform.js +167 -0
  107. package/lib/transforms/DeferStreamTransform.js +30 -73
  108. package/lib/transforms/DisallowTypenameOnRoot.js +55 -0
  109. package/lib/transforms/FieldHandleTransform.js +6 -2
  110. package/lib/transforms/FlattenTransform.js +18 -45
  111. package/lib/transforms/GenerateIDFieldTransform.js +56 -35
  112. package/lib/transforms/GenerateTypeNameTransform.js +84 -10
  113. package/lib/transforms/InlineDataFragmentTransform.js +9 -4
  114. package/lib/transforms/MaskTransform.js +17 -17
  115. package/lib/transforms/MatchTransform.js +110 -32
  116. package/lib/transforms/RefetchableFragmentTransform.js +21 -38
  117. package/lib/transforms/RelayDirectiveTransform.js +8 -3
  118. package/lib/transforms/SkipClientExtensionsTransform.js +8 -0
  119. package/lib/transforms/SkipHandleFieldTransform.js +6 -2
  120. package/lib/transforms/SkipRedundantNodesTransform.js +7 -4
  121. package/lib/transforms/SkipSplitOperationTransform.js +32 -0
  122. package/lib/transforms/SkipUnreachableNodeTransform.js +9 -10
  123. package/lib/transforms/SkipUnusedVariablesTransform.js +18 -17
  124. package/lib/transforms/SplitModuleImportTransform.js +2 -2
  125. package/lib/transforms/TestOperationTransform.js +26 -22
  126. package/lib/transforms/ValidateGlobalVariablesTransform.js +18 -30
  127. package/lib/transforms/ValidateRequiredArgumentsTransform.js +12 -16
  128. package/lib/transforms/ValidateServerOnlyDirectivesTransform.js +16 -30
  129. package/lib/transforms/ValidateUnusedVariablesTransform.js +18 -30
  130. package/lib/transforms/query-generators/FetchableQueryGenerator.js +161 -0
  131. package/lib/transforms/query-generators/NodeQueryGenerator.js +22 -3
  132. package/lib/transforms/query-generators/QueryQueryGenerator.js +2 -1
  133. package/lib/transforms/query-generators/ViewerQueryGenerator.js +1 -0
  134. package/lib/transforms/query-generators/index.js +23 -6
  135. package/lib/transforms/query-generators/utils.js +17 -16
  136. package/lib/util/RelayCompilerCache.js +2 -4
  137. package/lib/util/argumentContainsVariables.js +37 -0
  138. package/lib/util/dedupeJSONStringify.js +15 -12
  139. package/lib/util/generateAbstractTypeRefinementKey.js +24 -0
  140. package/lib/util/getModuleName.js +3 -5
  141. package/lib/util/joinArgumentDefinitions.js +3 -1
  142. package/package.json +6 -6
  143. package/relay-compiler.js +4 -4
  144. package/relay-compiler.min.js +4 -4
  145. package/reporters/ConsoleReporter.js.flow +81 -0
  146. package/reporters/MultiReporter.js.flow +43 -0
  147. package/reporters/Reporter.js.flow +19 -0
  148. package/runner/Artifacts.js.flow +219 -0
  149. package/runner/BufferedFilesystem.js.flow +194 -0
  150. package/runner/GraphQLASTNodeGroup.js.flow +176 -0
  151. package/runner/GraphQLASTUtils.js.flow +26 -0
  152. package/runner/GraphQLNodeMap.js.flow +55 -0
  153. package/runner/Sources.js.flow +214 -0
  154. package/runner/StrictMap.js.flow +96 -0
  155. package/runner/compileArtifacts.js.flow +76 -0
  156. package/runner/extractAST.js.flow +100 -0
  157. package/runner/getChangedNodeNames.js.flow +48 -0
  158. package/runner/getSchemaInstance.js.flow +36 -0
  159. package/runner/types.js.flow +37 -0
  160. package/transforms/ApplyFragmentArgumentTransform.js.flow +526 -0
  161. package/transforms/ClientExtensionsTransform.js.flow +222 -0
  162. package/transforms/ConnectionTransform.js.flow +856 -0
  163. package/transforms/DeclarativeConnectionMutationTransform.js.flow +157 -0
  164. package/transforms/DeferStreamTransform.js.flow +265 -0
  165. package/transforms/DisallowIdAsAlias.js.flow +47 -0
  166. package/transforms/DisallowTypenameOnRoot.js.flow +45 -0
  167. package/transforms/FieldHandleTransform.js.flow +80 -0
  168. package/transforms/FilterDirectivesTransform.js.flow +45 -0
  169. package/transforms/FlattenTransform.js.flow +453 -0
  170. package/transforms/GenerateIDFieldTransform.js.flow +152 -0
  171. package/transforms/GenerateTypeNameTransform.js.flow +161 -0
  172. package/transforms/InlineDataFragmentTransform.js.flow +125 -0
  173. package/transforms/InlineFragmentsTransform.js.flow +71 -0
  174. package/transforms/MaskTransform.js.flow +126 -0
  175. package/transforms/MatchTransform.js.flow +583 -0
  176. package/transforms/RefetchableFragmentTransform.js.flow +272 -0
  177. package/transforms/RelayDirectiveTransform.js.flow +97 -0
  178. package/transforms/SkipClientExtensionsTransform.js.flow +54 -0
  179. package/transforms/SkipHandleFieldTransform.js.flow +44 -0
  180. package/transforms/SkipRedundantNodesTransform.js.flow +254 -0
  181. package/transforms/SkipSplitOperationTransform.js.flow +37 -0
  182. package/transforms/SkipUnreachableNodeTransform.js.flow +149 -0
  183. package/transforms/SkipUnusedVariablesTransform.js.flow +59 -0
  184. package/transforms/SplitModuleImportTransform.js.flow +98 -0
  185. package/transforms/TestOperationTransform.js.flow +142 -0
  186. package/transforms/TransformUtils.js.flow +26 -0
  187. package/transforms/ValidateGlobalVariablesTransform.js.flow +81 -0
  188. package/transforms/ValidateRequiredArgumentsTransform.js.flow +127 -0
  189. package/transforms/ValidateServerOnlyDirectivesTransform.js.flow +112 -0
  190. package/transforms/ValidateUnusedVariablesTransform.js.flow +89 -0
  191. package/transforms/query-generators/FetchableQueryGenerator.js.flow +189 -0
  192. package/transforms/query-generators/NodeQueryGenerator.js.flow +219 -0
  193. package/transforms/query-generators/QueryQueryGenerator.js.flow +57 -0
  194. package/transforms/query-generators/ViewerQueryGenerator.js.flow +97 -0
  195. package/transforms/query-generators/index.js.flow +90 -0
  196. package/transforms/query-generators/utils.js.flow +76 -0
  197. package/util/CodeMarker.js.flow +79 -0
  198. package/{lib/core/GraphQLIR.js → util/DefaultHandleKey.js.flow} +9 -2
  199. package/util/RelayCompilerCache.js.flow +88 -0
  200. package/util/Rollout.js.flow +39 -0
  201. package/util/TimeReporter.js.flow +79 -0
  202. package/util/areEqualOSS.js.flow +123 -0
  203. package/util/argumentContainsVariables.js.flow +38 -0
  204. package/util/dedupeJSONStringify.js.flow +152 -0
  205. package/util/generateAbstractTypeRefinementKey.js.flow +29 -0
  206. package/util/getDefinitionNodeHash.js.flow +25 -0
  207. package/util/getModuleName.js.flow +39 -0
  208. package/util/joinArgumentDefinitions.js.flow +105 -0
  209. package/util/md5.js.flow +22 -0
  210. package/util/murmurHash.js.flow +94 -0
  211. package/util/nullthrowsOSS.js.flow +25 -0
  212. package/util/orList.js.flow +37 -0
  213. package/util/partitionArray.js.flow +37 -0
  214. package/lib/core/GraphQLCompilerContext.js +0 -165
  215. package/lib/core/GraphQLIRPrinter.js +0 -371
  216. package/lib/core/GraphQLIRTransformer.js +0 -344
  217. package/lib/core/GraphQLIRValidator.js +0 -218
  218. package/lib/core/GraphQLIRVisitor.js +0 -46
  219. package/lib/core/RelayCompilerError.js +0 -277
  220. package/lib/transforms/ConnectionFieldTransform.js +0 -276
@@ -12,7 +12,11 @@
12
12
 
13
13
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
14
14
 
15
- var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread"));
15
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
16
+
17
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
18
+
19
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
16
20
 
17
21
  var IRTransformer = require('../core/IRTransformer');
18
22
 
@@ -28,20 +32,17 @@ var _require = require('../core/CompilerError'),
28
32
  * Transform that flattens inline fragments, fragment spreads, and conditionals.
29
33
  *
30
34
  * Inline fragments are inlined (replaced with their selections) when:
31
- * - The fragment type matches the type of its parent.
32
- * - The fragment has an abstract type and the `flattenAbstractTypes` option has
33
- * been set.
35
+ * - The fragment type matches the type of its parent, and its `isForCodegen`,
36
+ * or if it's for printing, there is no directive on the inline fragment.
34
37
  */
35
38
  function flattenTransformImpl(context, options) {
36
39
  var state = {
37
- flattenAbstractTypes: !!(options && options.flattenAbstractTypes),
40
+ isForCodegen: !!(options && options.isForCodegen),
38
41
  parentType: null
39
42
  };
40
43
  var visitorFn = memoizedFlattenSelection(new Map());
41
44
  return IRTransformer.transform(context, {
42
45
  Condition: visitorFn,
43
- Connection: visitorFn,
44
- ConnectionField: visitorFn,
45
46
  Defer: visitorFn,
46
47
  Fragment: visitorFn,
47
48
  InlineFragment: visitorFn,
@@ -83,7 +84,7 @@ function memoizedFlattenSelection(cache) {
83
84
 
84
85
  var nextSelections = new Map();
85
86
  var hasFlattened = flattenSelectionsInto(context.getSchema(), nextSelections, node, state, type);
86
- var flattenedNode = hasFlattened ? (0, _objectSpread2["default"])({}, node, {
87
+ var flattenedNode = hasFlattened ? _objectSpread({}, node, {
87
88
  selections: Array.from(nextSelections.values())
88
89
  }) : node;
89
90
  state.parentType = type;
@@ -123,7 +124,7 @@ function flattenSelectionsInto(schema, flattenedSelections, node, state, type) {
123
124
  throw createCompilerError("FlattenTransform: Expected an InlineFragment, got a '".concat(selection.kind, "'"), [selection.loc]);
124
125
  }
125
126
 
126
- flattenedSelections.set(nodeIdentifier, (0, _objectSpread2["default"])({}, flattenedSelection, {
127
+ flattenedSelections.set(nodeIdentifier, _objectSpread({}, flattenedSelection, {
127
128
  selections: mergeSelections(schema, flattenedSelection, selection, state, selection.typeCondition)
128
129
  }));
129
130
  } else if (flattenedSelection.kind === 'Condition') {
@@ -131,7 +132,7 @@ function flattenSelectionsInto(schema, flattenedSelections, node, state, type) {
131
132
  throw createCompilerError("FlattenTransform: Expected a Condition, got a '".concat(selection.kind, "'"), [selection.loc]);
132
133
  }
133
134
 
134
- flattenedSelections.set(nodeIdentifier, (0, _objectSpread2["default"])({}, flattenedSelection, {
135
+ flattenedSelections.set(nodeIdentifier, _objectSpread({}, flattenedSelection, {
135
136
  selections: mergeSelections(schema, flattenedSelection, selection, state, type)
136
137
  }));
137
138
  } else if (flattenedSelection.kind === 'ClientExtension') {
@@ -139,7 +140,7 @@ function flattenSelectionsInto(schema, flattenedSelections, node, state, type) {
139
140
  throw createCompilerError("FlattenTransform: Expected a ClientExtension, got a '".concat(selection.kind, "'"), [selection.loc]);
140
141
  }
141
142
 
142
- flattenedSelections.set(nodeIdentifier, (0, _objectSpread2["default"])({}, flattenedSelection, {
143
+ flattenedSelections.set(nodeIdentifier, _objectSpread({}, flattenedSelection, {
143
144
  selections: mergeSelections(schema, flattenedSelection, selection, state, type)
144
145
  }));
145
146
  } else if (flattenedSelection.kind === 'FragmentSpread') {// Ignore duplicate fragment spreads.
@@ -148,11 +149,11 @@ function flattenSelectionsInto(schema, flattenedSelections, node, state, type) {
148
149
  throw createCompilerError("FlattenTransform: Expected a ModuleImport, got a '".concat(selection.kind, "'"), [selection.loc]);
149
150
  }
150
151
 
151
- if (selection.name !== flattenedSelection.name || selection.module !== flattenedSelection.module || selection.documentName !== flattenedSelection.documentName) {
152
+ if (selection.name !== flattenedSelection.name || selection.module !== flattenedSelection.module || selection.key !== flattenedSelection.key) {
152
153
  throw createUserError('Found conflicting @module selections: use a unique alias on the ' + 'parent fields.', [selection.loc, flattenedSelection.loc]);
153
154
  }
154
155
 
155
- flattenedSelections.set(nodeIdentifier, (0, _objectSpread2["default"])({}, flattenedSelection, {
156
+ flattenedSelections.set(nodeIdentifier, _objectSpread({}, flattenedSelection, {
156
157
  selections: mergeSelections(schema, flattenedSelection, selection, state, type)
157
158
  }));
158
159
  } else if (flattenedSelection.kind === 'Defer') {
@@ -160,7 +161,7 @@ function flattenSelectionsInto(schema, flattenedSelections, node, state, type) {
160
161
  throw createCompilerError("FlattenTransform: Expected a Defer, got a '".concat(selection.kind, "'"), [selection.loc]);
161
162
  }
162
163
 
163
- flattenedSelections.set(nodeIdentifier, (0, _objectSpread2["default"])({
164
+ flattenedSelections.set(nodeIdentifier, _objectSpread({
164
165
  kind: 'Defer'
165
166
  }, flattenedSelection, {
166
167
  selections: mergeSelections(schema, flattenedSelection, selection, state, type)
@@ -170,7 +171,7 @@ function flattenSelectionsInto(schema, flattenedSelections, node, state, type) {
170
171
  throw createCompilerError("FlattenTransform: Expected a Stream, got a '".concat(selection.kind, "'"), [selection.loc]);
171
172
  }
172
173
 
173
- flattenedSelections.set(nodeIdentifier, (0, _objectSpread2["default"])({
174
+ flattenedSelections.set(nodeIdentifier, _objectSpread({
174
175
  kind: 'Stream'
175
176
  }, flattenedSelection, {
176
177
  selections: mergeSelections(schema, flattenedSelection, selection, state, type)
@@ -203,42 +204,14 @@ function flattenSelectionsInto(schema, flattenedSelections, node, state, type) {
203
204
  assertUniqueArgsForAlias(selection, flattenedSelection);
204
205
 
205
206
  if (selection.handles && selection.handles.length > 0) {
206
- flattenedSelections.set(nodeIdentifier, (0, _objectSpread2["default"])({
207
+ flattenedSelections.set(nodeIdentifier, _objectSpread({
207
208
  kind: 'ScalarField'
208
209
  }, flattenedSelection, {
209
210
  handles: mergeHandles(selection, flattenedSelection)
210
211
  }));
211
212
  }
212
- } else if (flattenedSelection.kind === 'ConnectionField') {
213
- if (selection.kind !== 'ConnectionField') {
214
- throw createCompilerError("FlattenTransform: Expected a ConnectionField, got a '".concat(selection.kind, "'"), [selection.loc]);
215
- }
216
-
217
- assertUniqueArgsForAlias(selection, flattenedSelection); // NOTE: not using object spread here as this code is pretty hot
218
-
219
- flattenedSelections.set(nodeIdentifier, {
220
- kind: 'ConnectionField',
221
- alias: flattenedSelection.alias,
222
- args: flattenedSelection.args,
223
- directives: flattenedSelection.directives,
224
- loc: flattenedSelection.loc,
225
- metadata: flattenedSelection.metadata,
226
- name: flattenedSelection.name,
227
- selections: mergeSelections(schema, flattenedSelection, selection, state, selection.type),
228
- type: flattenedSelection.type
229
- });
230
213
  } else if (flattenedSelection.kind === 'InlineDataFragmentSpread') {
231
214
  throw createCompilerError('FlattenTransform: did not expect an InlineDataFragmentSpread node. ' + 'Only expecting InlineDataFragmentSpread in reader ASTs and this ' + 'transform to run only on normalization ASTs.', [selection.loc]);
232
- } else if (flattenedSelection.kind === 'Connection') {
233
- if (selection.kind !== 'Connection') {
234
- throw createCompilerError("FlattenTransform: Expected a Connection, got a '".concat(selection.kind, "'"), [selection.loc]);
235
- }
236
-
237
- flattenedSelections.set(nodeIdentifier, (0, _objectSpread2["default"])({
238
- kind: 'Connection'
239
- }, flattenedSelection, {
240
- selections: mergeSelections(schema, flattenedSelection, selection, state, selection.type)
241
- }));
242
215
  } else {
243
216
  flattenedSelection.kind;
244
217
  throw createCompilerError("FlattenTransform: Unknown kind '".concat(flattenedSelection.kind, "'"));
@@ -275,7 +248,7 @@ function assertUniqueArgsForAlias(field, otherField) {
275
248
 
276
249
 
277
250
  function shouldFlattenInlineFragment(schema, fragment, state, type) {
278
- return schema.areEqualTypes(fragment.typeCondition, schema.getRawType(type)) || state.flattenAbstractTypes && schema.isAbstractType(fragment.typeCondition);
251
+ return schema.areEqualTypes(fragment.typeCondition, schema.getRawType(type)) && (state.isForCodegen || fragment.directives.length === 0);
279
252
  }
280
253
  /**
281
254
  * @private
@@ -12,18 +12,22 @@
12
12
 
13
13
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
14
14
 
15
- var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread"));
15
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
16
16
 
17
17
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
18
18
 
19
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
20
+
21
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
22
+
19
23
  var IRTransformer = require('../core/IRTransformer');
20
24
 
21
- var SchemaUtils = require('../core/SchemaUtils');
25
+ var _require = require('../core/SchemaUtils'),
26
+ generateIDField = _require.generateIDField;
22
27
 
23
- var _require = require('./TransformUtils'),
24
- hasUnaliasedSelection = _require.hasUnaliasedSelection;
28
+ var _require2 = require('./TransformUtils'),
29
+ hasUnaliasedSelection = _require2.hasUnaliasedSelection;
25
30
 
26
- var generateIDField = SchemaUtils.generateIDField;
27
31
  var ID = 'id';
28
32
  var NODE_TYPE = 'Node';
29
33
 
@@ -33,10 +37,44 @@ var NODE_TYPE = 'Node';
33
37
  */
34
38
  function generateIDFieldTransform(context) {
35
39
  var schema = context.getSchema();
36
- var idType = schema.expectIdType();
37
- var idField = generateIDField(idType);
40
+ var typeToIDField = new Map();
41
+
42
+ function idFieldForType(type) {
43
+ var idField = typeToIDField.get(type);
44
+
45
+ if (idField == null) {
46
+ idField = generateIDField(schema, type);
47
+ typeToIDField.set(type, idField);
48
+ }
49
+
50
+ return idField;
51
+ }
52
+
53
+ var typeToIDFragment = new Map();
54
+
55
+ function idFragmentForType(type) {
56
+ var fragment = typeToIDFragment.get(type);
57
+
58
+ if (fragment == null) {
59
+ fragment = {
60
+ kind: 'InlineFragment',
61
+ directives: [],
62
+ loc: {
63
+ kind: 'Generated'
64
+ },
65
+ metadata: null,
66
+ selections: [idFieldForType(type)],
67
+ typeCondition: type
68
+ };
69
+ typeToIDFragment.set(type, fragment);
70
+ }
71
+
72
+ return fragment;
73
+ }
74
+
38
75
  var state = {
39
- idField: idField
76
+ idFieldForType: idFieldForType,
77
+ idFragmentForType: idFragmentForType
40
78
  };
41
79
  return IRTransformer.transform(context, {
42
80
  LinkedField: visitLinkedField
@@ -57,8 +95,8 @@ function visitLinkedField(field, state) {
57
95
  var unmodifiedType = schema.assertCompositeType(schema.getRawType(field.type)); // If the field type has an `id` subfield add an `id` selection
58
96
 
59
97
  if (schema.canHaveSelections(unmodifiedType) && schema.hasId(unmodifiedType)) {
60
- return (0, _objectSpread2["default"])({}, transformedNode, {
61
- selections: [].concat((0, _toConsumableArray2["default"])(transformedNode.selections), [state.idField])
98
+ return _objectSpread({}, transformedNode, {
99
+ selections: [].concat((0, _toConsumableArray2["default"])(transformedNode.selections), [state.idFieldForType(unmodifiedType)])
62
100
  });
63
101
  } // If the field type is abstract, then generate a `... on Node { id }`
64
102
  // fragment if *any* concrete type implements Node. Then generate a
@@ -78,40 +116,23 @@ function visitLinkedField(field, state) {
78
116
  var selections = (0, _toConsumableArray2["default"])(transformedNode.selections);
79
117
 
80
118
  if (schema.mayImplement(unmodifiedType, nodeInterface)) {
81
- selections.push(buildIDFragment(nodeInterface, state.idField));
119
+ selections.push(state.idFragmentForType(nodeInterface));
82
120
  }
83
121
 
84
- schema.getPossibleTypes(schema.assertAbstractType(unmodifiedType)).forEach(function (possibleType) {
85
- if (!schema.implementsInterface(schema.assertCompositeType(possibleType), nodeInterface) && schema.hasId(possibleType)) {
86
- selections.push(buildIDFragment(possibleType, state.idField));
87
- }
122
+ Array.from(schema.getPossibleTypes(schema.assertAbstractType(unmodifiedType)).values()).filter(function (concreteType) {
123
+ return !schema.implementsInterface(schema.assertCompositeType(concreteType), nodeInterface) && schema.hasId(concreteType);
124
+ }).sort(function (a, b) {
125
+ return schema.getTypeString(a) < schema.getTypeString(b) ? -1 : 1;
126
+ }).forEach(function (concreteType) {
127
+ selections.push(state.idFragmentForType(concreteType));
88
128
  });
89
- return (0, _objectSpread2["default"])({}, transformedNode, {
129
+ return _objectSpread({}, transformedNode, {
90
130
  selections: selections
91
131
  });
92
132
  }
93
133
 
94
134
  return transformedNode;
95
135
  }
96
- /**
97
- * @internal
98
- *
99
- * Returns IR for `... on FRAGMENT_TYPE { id }`
100
- */
101
-
102
-
103
- function buildIDFragment(fragmentType, idField) {
104
- return {
105
- kind: 'InlineFragment',
106
- directives: [],
107
- loc: {
108
- kind: 'Generated'
109
- },
110
- metadata: null,
111
- selections: [idField],
112
- typeCondition: fragmentType
113
- };
114
- }
115
136
 
116
137
  module.exports = {
117
138
  transform: generateIDFieldTransform
@@ -12,12 +12,18 @@
12
12
 
13
13
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
14
14
 
15
- var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread"));
15
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
16
16
 
17
17
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
18
18
 
19
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
20
+
21
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
22
+
19
23
  var IRTransformer = require('../core/IRTransformer');
20
24
 
25
+ var generateAbstractTypeRefinementKey = require('../util/generateAbstractTypeRefinementKey');
26
+
21
27
  var _require = require('./TransformUtils'),
22
28
  hasUnaliasedSelection = _require.hasUnaliasedSelection;
23
29
 
@@ -42,30 +48,98 @@ function generateTypeNameTransform(context) {
42
48
  },
43
49
  metadata: null,
44
50
  name: TYPENAME_KEY,
45
- type: schema.expectStringType()
46
- };
47
- var state = {
48
- typenameField: typenameField
51
+ type: schema.assertScalarFieldType(schema.getNonNullType(schema.expectStringType()))
49
52
  };
50
53
  return IRTransformer.transform(context, {
51
- LinkedField: visitLinkedField
52
- }, function () {
53
- return state;
54
+ Fragment: visitFragment,
55
+ LinkedField: visitLinkedField,
56
+ InlineFragment: visitInlineFragment
57
+ }, function (node) {
58
+ return {
59
+ typenameField: typenameField
60
+ };
54
61
  });
55
62
  }
56
63
 
64
+ function visitFragment(fragment, state) {
65
+ var schema = this.getContext().getSchema();
66
+ var rawType = schema.getRawType(fragment.type);
67
+ var transformedNode = this.traverse(fragment, state);
68
+ var isClientType = !schema.isServerType(rawType);
69
+
70
+ if (!isClientType && schema.isAbstractType(rawType)) {
71
+ var abstractKey = generateAbstractTypeRefinementKey(schema, rawType);
72
+ transformedNode = _objectSpread({}, transformedNode, {
73
+ selections: [{
74
+ kind: 'ScalarField',
75
+ alias: abstractKey,
76
+ args: [],
77
+ directives: [],
78
+ handles: null,
79
+ loc: {
80
+ kind: 'Generated'
81
+ },
82
+ metadata: {
83
+ abstractKey: abstractKey
84
+ },
85
+ name: TYPENAME_KEY,
86
+ type: schema.assertScalarFieldType(schema.getNonNullType(schema.expectStringType()))
87
+ }].concat((0, _toConsumableArray2["default"])(transformedNode.selections))
88
+ });
89
+ }
90
+
91
+ return transformedNode;
92
+ }
93
+
94
+ function visitInlineFragment(fragment, state) {
95
+ var schema = this.getContext().getSchema();
96
+ var transformedNode = cache.get(fragment);
97
+
98
+ if (transformedNode != null && transformedNode.kind === 'InlineFragment') {
99
+ return transformedNode;
100
+ }
101
+
102
+ var rawType = schema.getRawType(fragment.typeCondition);
103
+ transformedNode = this.traverse(fragment, state);
104
+ var isClientType = !schema.isServerType(rawType);
105
+
106
+ if (!isClientType && schema.isAbstractType(rawType)) {
107
+ var abstractKey = generateAbstractTypeRefinementKey(schema, rawType);
108
+ transformedNode = _objectSpread({}, transformedNode, {
109
+ selections: [{
110
+ kind: 'ScalarField',
111
+ alias: abstractKey,
112
+ args: [],
113
+ directives: [],
114
+ handles: null,
115
+ loc: {
116
+ kind: 'Generated'
117
+ },
118
+ metadata: {
119
+ abstractKey: abstractKey
120
+ },
121
+ name: TYPENAME_KEY,
122
+ type: schema.assertScalarFieldType(schema.getNonNullType(schema.expectStringType()))
123
+ }].concat((0, _toConsumableArray2["default"])(transformedNode.selections))
124
+ });
125
+ }
126
+
127
+ cache.set(fragment, transformedNode);
128
+ return transformedNode;
129
+ }
130
+
57
131
  function visitLinkedField(field, state) {
58
132
  var schema = this.getContext().getSchema();
59
133
  var transformedNode = cache.get(field);
60
134
 
61
- if (transformedNode != null) {
135
+ if (transformedNode != null && transformedNode.kind === 'LinkedField') {
62
136
  return transformedNode;
63
137
  }
64
138
 
65
139
  transformedNode = this.traverse(field, state);
66
140
 
67
141
  if (schema.isAbstractType(schema.getRawType(transformedNode.type)) && !hasUnaliasedSelection(transformedNode, TYPENAME_KEY)) {
68
- transformedNode = (0, _objectSpread2["default"])({}, transformedNode, {
142
+ transformedNode = _objectSpread({}, transformedNode, {
69
143
  selections: [state.typenameField].concat((0, _toConsumableArray2["default"])(transformedNode.selections))
70
144
  });
71
145
  }
@@ -12,7 +12,11 @@
12
12
 
13
13
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
14
14
 
15
- var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread"));
15
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
16
+
17
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
18
+
19
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
16
20
 
17
21
  var IRTransformer = require('../core/IRTransformer');
18
22
 
@@ -28,7 +32,8 @@ var SCHEMA_EXTENSION = "\ndirective @inline on FRAGMENT_DEFINITION\n";
28
32
 
29
33
  function inlineDataFragmentTransform(context) {
30
34
  return IRTransformer.transform(context, {
31
- // $FlowFixMe - this visitor intentionally changes node types
35
+ // $FlowFixMe[prop-missing] - this visitor intentionally changes node types
36
+ // $FlowFixMe[incompatible-call] - this visitor intentionally changes node types
32
37
  FragmentSpread: visitFragmentSpread,
33
38
  Fragment: visitFragment
34
39
  });
@@ -44,11 +49,11 @@ function visitFragment(fragment) {
44
49
  return transformedFragment;
45
50
  }
46
51
 
47
- return (0, _objectSpread2["default"])({}, transformedFragment, {
52
+ return _objectSpread({}, transformedFragment, {
48
53
  directives: transformedFragment.directives.filter(function (directive) {
49
54
  return directive !== inlineDirective;
50
55
  }),
51
- metadata: (0, _objectSpread2["default"])({}, transformedFragment.metadata || {}, {
56
+ metadata: _objectSpread({}, transformedFragment.metadata || {}, {
52
57
  inlineData: true
53
58
  })
54
59
  });
@@ -12,7 +12,17 @@
12
12
 
13
13
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
14
14
 
15
- var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread"));
15
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
16
+
17
+ function _createForOfIteratorHelper(o) { if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray(o))) { var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var it, normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
18
+
19
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
20
+
21
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
22
+
23
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
24
+
25
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
16
26
 
17
27
  var IRTransformer = require('../core/IRTransformer');
18
28
 
@@ -46,7 +56,7 @@ function visitFragment(fragment, state) {
46
56
  }
47
57
 
48
58
  var joinedArgumentDefinitions = joinArgumentDefinitions(this.getContext().getSchema(), fragment, state.reachableArguments, '@relay(unmask: true)');
49
- return (0, _objectSpread2["default"])({}, result, {
59
+ return _objectSpread({}, result, {
50
60
  argumentDefinitions: joinedArgumentDefinitions
51
61
  });
52
62
  }
@@ -85,28 +95,18 @@ function visitFragmentSpread(fragmentSpread, state) {
85
95
  // to list all invalid variables/arguments instead of only one.
86
96
 
87
97
 
88
- var _iteratorNormalCompletion = true;
89
- var _didIteratorError = false;
90
- var _iteratorError = undefined;
98
+ var _iterator = _createForOfIteratorHelper(fragment.argumentDefinitions),
99
+ _step;
91
100
 
92
101
  try {
93
- for (var _iterator = fragment.argumentDefinitions[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
102
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
94
103
  var argDef = _step.value;
95
104
  state.reachableArguments.push(argDef);
96
105
  }
97
106
  } catch (err) {
98
- _didIteratorError = true;
99
- _iteratorError = err;
107
+ _iterator.e(err);
100
108
  } finally {
101
- try {
102
- if (!_iteratorNormalCompletion && _iterator["return"] != null) {
103
- _iterator["return"]();
104
- }
105
- } finally {
106
- if (_didIteratorError) {
107
- throw _iteratorError;
108
- }
109
- }
109
+ _iterator.f();
110
110
  }
111
111
 
112
112
  return this.traverse(result, state);