@ardatan/relay-compiler 12.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (256) hide show
  1. package/LICENSE +21 -0
  2. package/bin/RelayCompilerBin.js.flow +169 -0
  3. package/bin/RelayCompilerMain.js.flow +515 -0
  4. package/bin/__fixtures__/plugin-module.js.flow +17 -0
  5. package/bin/relay-compiler +19066 -0
  6. package/codegen/CodegenDirectory.js.flow +375 -0
  7. package/codegen/CodegenRunner.js.flow +432 -0
  8. package/codegen/CodegenTypes.js.flow +28 -0
  9. package/codegen/CodegenWatcher.js.flow +254 -0
  10. package/codegen/NormalizationCodeGenerator.js.flow +566 -0
  11. package/codegen/ReaderCodeGenerator.js.flow +512 -0
  12. package/codegen/RelayCodeGenerator.js.flow +85 -0
  13. package/codegen/RelayFileWriter.js.flow +367 -0
  14. package/codegen/SourceControl.js.flow +58 -0
  15. package/codegen/compileRelayArtifacts.js.flow +182 -0
  16. package/codegen/createPrintRequireModuleDependency.js.flow +19 -0
  17. package/codegen/sortObjectByKey.js.flow +25 -0
  18. package/codegen/writeRelayGeneratedFile.js.flow +239 -0
  19. package/core/ASTCache.js.flow +74 -0
  20. package/core/ASTConvert.js.flow +233 -0
  21. package/core/CompilerContext.js.flow +191 -0
  22. package/core/CompilerError.js.flow +255 -0
  23. package/core/DotGraphQLParser.js.flow +39 -0
  24. package/core/GraphQLCompilerProfiler.js.flow +341 -0
  25. package/core/GraphQLDerivedFromMetadata.js.flow +36 -0
  26. package/core/GraphQLWatchmanClient.js.flow +111 -0
  27. package/core/IR.js.flow +326 -0
  28. package/core/IRPrinter.js.flow +478 -0
  29. package/core/IRTransformer.js.flow +377 -0
  30. package/core/IRValidator.js.flow +260 -0
  31. package/core/IRVisitor.js.flow +150 -0
  32. package/core/JSModuleParser.js.flow +24 -0
  33. package/core/RelayCompilerScope.js.flow +199 -0
  34. package/core/RelayFindGraphQLTags.js.flow +119 -0
  35. package/core/RelayGraphQLEnumsGenerator.js.flow +55 -0
  36. package/core/RelayIRTransforms.js.flow +138 -0
  37. package/core/RelayParser.js.flow +1734 -0
  38. package/core/RelaySourceModuleParser.js.flow +135 -0
  39. package/core/Schema.js.flow +2037 -0
  40. package/core/SchemaUtils.js.flow +120 -0
  41. package/core/filterContextForNode.js.flow +50 -0
  42. package/core/getFieldDefinition.js.flow +156 -0
  43. package/core/getIdentifierForArgumentValue.js.flow +49 -0
  44. package/core/getIdentifierForSelection.js.flow +69 -0
  45. package/core/getLiteralArgumentValues.js.flow +32 -0
  46. package/core/getNormalizationOperationName.js.flow +19 -0
  47. package/core/inferRootArgumentDefinitions.js.flow +323 -0
  48. package/index.js +10 -0
  49. package/index.js.flow +200 -0
  50. package/language/RelayLanguagePluginInterface.js.flow +283 -0
  51. package/language/javascript/FindGraphQLTags.js.flow +137 -0
  52. package/language/javascript/RelayFlowBabelFactories.js.flow +176 -0
  53. package/language/javascript/RelayFlowGenerator.js.flow +1100 -0
  54. package/language/javascript/RelayFlowTypeTransformers.js.flow +184 -0
  55. package/language/javascript/RelayLanguagePluginJavaScript.js.flow +34 -0
  56. package/language/javascript/formatGeneratedModule.js.flow +65 -0
  57. package/lib/bin/RelayCompilerBin.js +143 -0
  58. package/lib/bin/RelayCompilerMain.js +486 -0
  59. package/lib/bin/__fixtures__/plugin-module.js +16 -0
  60. package/lib/codegen/CodegenDirectory.js +336 -0
  61. package/lib/codegen/CodegenRunner.js +433 -0
  62. package/lib/codegen/CodegenTypes.js +11 -0
  63. package/lib/codegen/CodegenWatcher.js +271 -0
  64. package/lib/codegen/NormalizationCodeGenerator.js +480 -0
  65. package/lib/codegen/ReaderCodeGenerator.js +472 -0
  66. package/lib/codegen/RelayCodeGenerator.js +68 -0
  67. package/lib/codegen/RelayFileWriter.js +270 -0
  68. package/lib/codegen/SourceControl.js +60 -0
  69. package/lib/codegen/compileRelayArtifacts.js +157 -0
  70. package/lib/codegen/createPrintRequireModuleDependency.js +19 -0
  71. package/lib/codegen/sortObjectByKey.js +41 -0
  72. package/lib/codegen/writeRelayGeneratedFile.js +208 -0
  73. package/lib/core/ASTCache.js +70 -0
  74. package/lib/core/ASTConvert.js +198 -0
  75. package/lib/core/CompilerContext.js +165 -0
  76. package/lib/core/CompilerError.js +251 -0
  77. package/lib/core/DotGraphQLParser.js +40 -0
  78. package/lib/core/GraphQLCompilerProfiler.js +299 -0
  79. package/lib/core/GraphQLDerivedFromMetadata.js +31 -0
  80. package/lib/core/GraphQLWatchmanClient.js +150 -0
  81. package/lib/core/IR.js +11 -0
  82. package/lib/core/IRPrinter.js +389 -0
  83. package/lib/core/IRTransformer.js +345 -0
  84. package/lib/core/IRValidator.js +226 -0
  85. package/lib/core/IRVisitor.js +45 -0
  86. package/lib/core/JSModuleParser.js +18 -0
  87. package/lib/core/RelayCompilerScope.js +149 -0
  88. package/lib/core/RelayFindGraphQLTags.js +79 -0
  89. package/lib/core/RelayGraphQLEnumsGenerator.js +50 -0
  90. package/lib/core/RelayIRTransforms.js +109 -0
  91. package/lib/core/RelayParser.js +1382 -0
  92. package/lib/core/RelaySourceModuleParser.js +104 -0
  93. package/lib/core/Schema.js +1877 -0
  94. package/lib/core/SchemaUtils.js +98 -0
  95. package/lib/core/filterContextForNode.js +49 -0
  96. package/lib/core/getFieldDefinition.js +145 -0
  97. package/lib/core/getIdentifierForArgumentValue.js +53 -0
  98. package/lib/core/getIdentifierForSelection.js +48 -0
  99. package/lib/core/getLiteralArgumentValues.js +26 -0
  100. package/lib/core/getNormalizationOperationName.js +17 -0
  101. package/lib/core/inferRootArgumentDefinitions.js +351 -0
  102. package/lib/index.js +178 -0
  103. package/lib/language/RelayLanguagePluginInterface.js +14 -0
  104. package/lib/language/javascript/FindGraphQLTags.js +126 -0
  105. package/lib/language/javascript/RelayFlowBabelFactories.js +160 -0
  106. package/lib/language/javascript/RelayFlowGenerator.js +857 -0
  107. package/lib/language/javascript/RelayFlowTypeTransformers.js +119 -0
  108. package/lib/language/javascript/RelayLanguagePluginJavaScript.js +30 -0
  109. package/lib/language/javascript/formatGeneratedModule.js +36 -0
  110. package/lib/reporters/ConsoleReporter.js +61 -0
  111. package/lib/reporters/MultiReporter.js +45 -0
  112. package/lib/reporters/Reporter.js +11 -0
  113. package/lib/runner/Artifacts.js +323 -0
  114. package/lib/runner/BufferedFilesystem.js +261 -0
  115. package/lib/runner/GraphQLASTNodeGroup.js +256 -0
  116. package/lib/runner/GraphQLASTUtils.js +23 -0
  117. package/lib/runner/GraphQLNodeMap.js +81 -0
  118. package/lib/runner/Sources.js +271 -0
  119. package/lib/runner/StrictMap.js +134 -0
  120. package/lib/runner/compileArtifacts.js +39 -0
  121. package/lib/runner/extractAST.js +77 -0
  122. package/lib/runner/getChangedNodeNames.js +82 -0
  123. package/lib/runner/getSchemaInstance.js +30 -0
  124. package/lib/runner/types.js +12 -0
  125. package/lib/transforms/ApplyFragmentArgumentTransform.js +393 -0
  126. package/lib/transforms/ClientExtensionsTransform.js +222 -0
  127. package/lib/transforms/ConnectionTransform.js +643 -0
  128. package/lib/transforms/DeclarativeConnectionMutationTransform.js +221 -0
  129. package/lib/transforms/DeferStreamTransform.js +247 -0
  130. package/lib/transforms/DisallowIdAsAlias.js +41 -0
  131. package/lib/transforms/DisallowTypenameOnRoot.js +53 -0
  132. package/lib/transforms/FieldHandleTransform.js +81 -0
  133. package/lib/transforms/FilterCompilerDirectivesTransform.js +29 -0
  134. package/lib/transforms/FilterDirectivesTransform.js +41 -0
  135. package/lib/transforms/FlattenTransform.js +308 -0
  136. package/lib/transforms/GenerateIDFieldTransform.js +137 -0
  137. package/lib/transforms/GenerateTypeNameTransform.js +155 -0
  138. package/lib/transforms/InlineDataFragmentTransform.js +104 -0
  139. package/lib/transforms/InlineFragmentsTransform.js +63 -0
  140. package/lib/transforms/MaskTransform.js +121 -0
  141. package/lib/transforms/MatchTransform.js +438 -0
  142. package/lib/transforms/ReactFlightComponentTransform.js +161 -0
  143. package/lib/transforms/RefetchableFragmentTransform.js +249 -0
  144. package/lib/transforms/RelayDirectiveTransform.js +85 -0
  145. package/lib/transforms/RequiredFieldTransform.js +373 -0
  146. package/lib/transforms/SkipClientExtensionsTransform.js +49 -0
  147. package/lib/transforms/SkipHandleFieldTransform.js +45 -0
  148. package/lib/transforms/SkipRedundantNodesTransform.js +255 -0
  149. package/lib/transforms/SkipSplitOperationTransform.js +32 -0
  150. package/lib/transforms/SkipUnreachableNodeTransform.js +158 -0
  151. package/lib/transforms/SkipUnusedVariablesTransform.js +74 -0
  152. package/lib/transforms/SplitModuleImportTransform.js +85 -0
  153. package/lib/transforms/TestOperationTransform.js +145 -0
  154. package/lib/transforms/TransformUtils.js +21 -0
  155. package/lib/transforms/ValidateGlobalVariablesTransform.js +91 -0
  156. package/lib/transforms/ValidateRequiredArgumentsTransform.js +118 -0
  157. package/lib/transforms/ValidateServerOnlyDirectivesTransform.js +111 -0
  158. package/lib/transforms/ValidateUnusedVariablesTransform.js +96 -0
  159. package/lib/transforms/query-generators/FetchableQueryGenerator.js +157 -0
  160. package/lib/transforms/query-generators/NodeQueryGenerator.js +166 -0
  161. package/lib/transforms/query-generators/QueryQueryGenerator.js +48 -0
  162. package/lib/transforms/query-generators/ViewerQueryGenerator.js +77 -0
  163. package/lib/transforms/query-generators/index.js +60 -0
  164. package/lib/transforms/query-generators/utils.js +92 -0
  165. package/lib/util/CodeMarker.js +80 -0
  166. package/lib/util/DefaultHandleKey.js +15 -0
  167. package/lib/util/RelayCompilerCache.js +98 -0
  168. package/lib/util/Rollout.js +40 -0
  169. package/lib/util/TimeReporter.js +83 -0
  170. package/lib/util/areEqualArgValues.js +135 -0
  171. package/lib/util/argumentContainsVariables.js +37 -0
  172. package/lib/util/dedupeJSONStringify.js +160 -0
  173. package/lib/util/generateAbstractTypeRefinementKey.js +24 -0
  174. package/lib/util/getDefinitionNodeHash.js +22 -0
  175. package/lib/util/getModuleName.js +32 -0
  176. package/lib/util/joinArgumentDefinitions.js +66 -0
  177. package/lib/util/md5.js +17 -0
  178. package/lib/util/murmurHash.js +86 -0
  179. package/lib/util/nullthrowsOSS.js +23 -0
  180. package/lib/util/orList.js +36 -0
  181. package/lib/util/partitionArray.js +35 -0
  182. package/package.json +42 -0
  183. package/relay-compiler.js +17 -0
  184. package/relay-compiler.min.js +22 -0
  185. package/reporters/ConsoleReporter.js.flow +81 -0
  186. package/reporters/MultiReporter.js.flow +43 -0
  187. package/reporters/Reporter.js.flow +19 -0
  188. package/runner/Artifacts.js.flow +219 -0
  189. package/runner/BufferedFilesystem.js.flow +194 -0
  190. package/runner/GraphQLASTNodeGroup.js.flow +176 -0
  191. package/runner/GraphQLASTUtils.js.flow +26 -0
  192. package/runner/GraphQLNodeMap.js.flow +55 -0
  193. package/runner/Sources.js.flow +228 -0
  194. package/runner/StrictMap.js.flow +96 -0
  195. package/runner/compileArtifacts.js.flow +76 -0
  196. package/runner/extractAST.js.flow +100 -0
  197. package/runner/getChangedNodeNames.js.flow +48 -0
  198. package/runner/getSchemaInstance.js.flow +36 -0
  199. package/runner/types.js.flow +37 -0
  200. package/transforms/ApplyFragmentArgumentTransform.js.flow +526 -0
  201. package/transforms/ClientExtensionsTransform.js.flow +226 -0
  202. package/transforms/ConnectionTransform.js.flow +859 -0
  203. package/transforms/DeclarativeConnectionMutationTransform.js.flow +250 -0
  204. package/transforms/DeferStreamTransform.js.flow +266 -0
  205. package/transforms/DisallowIdAsAlias.js.flow +48 -0
  206. package/transforms/DisallowTypenameOnRoot.js.flow +45 -0
  207. package/transforms/FieldHandleTransform.js.flow +81 -0
  208. package/transforms/FilterCompilerDirectivesTransform.js.flow +33 -0
  209. package/transforms/FilterDirectivesTransform.js.flow +45 -0
  210. package/transforms/FlattenTransform.js.flow +462 -0
  211. package/transforms/GenerateIDFieldTransform.js.flow +154 -0
  212. package/transforms/GenerateTypeNameTransform.js.flow +167 -0
  213. package/transforms/InlineDataFragmentTransform.js.flow +129 -0
  214. package/transforms/InlineFragmentsTransform.js.flow +73 -0
  215. package/transforms/MaskTransform.js.flow +130 -0
  216. package/transforms/MatchTransform.js.flow +593 -0
  217. package/transforms/ReactFlightComponentTransform.js.flow +198 -0
  218. package/transforms/RefetchableFragmentTransform.js.flow +272 -0
  219. package/transforms/RelayDirectiveTransform.js.flow +99 -0
  220. package/transforms/RequiredFieldTransform.js.flow +419 -0
  221. package/transforms/SkipClientExtensionsTransform.js.flow +57 -0
  222. package/transforms/SkipHandleFieldTransform.js.flow +45 -0
  223. package/transforms/SkipRedundantNodesTransform.js.flow +259 -0
  224. package/transforms/SkipSplitOperationTransform.js.flow +37 -0
  225. package/transforms/SkipUnreachableNodeTransform.js.flow +149 -0
  226. package/transforms/SkipUnusedVariablesTransform.js.flow +59 -0
  227. package/transforms/SplitModuleImportTransform.js.flow +101 -0
  228. package/transforms/TestOperationTransform.js.flow +143 -0
  229. package/transforms/TransformUtils.js.flow +26 -0
  230. package/transforms/ValidateGlobalVariablesTransform.js.flow +81 -0
  231. package/transforms/ValidateRequiredArgumentsTransform.js.flow +131 -0
  232. package/transforms/ValidateServerOnlyDirectivesTransform.js.flow +115 -0
  233. package/transforms/ValidateUnusedVariablesTransform.js.flow +89 -0
  234. package/transforms/query-generators/FetchableQueryGenerator.js.flow +189 -0
  235. package/transforms/query-generators/NodeQueryGenerator.js.flow +219 -0
  236. package/transforms/query-generators/QueryQueryGenerator.js.flow +57 -0
  237. package/transforms/query-generators/ViewerQueryGenerator.js.flow +97 -0
  238. package/transforms/query-generators/index.js.flow +90 -0
  239. package/transforms/query-generators/utils.js.flow +76 -0
  240. package/util/CodeMarker.js.flow +79 -0
  241. package/util/DefaultHandleKey.js.flow +17 -0
  242. package/util/RelayCompilerCache.js.flow +88 -0
  243. package/util/Rollout.js.flow +39 -0
  244. package/util/TimeReporter.js.flow +79 -0
  245. package/util/areEqualArgValues.js.flow +126 -0
  246. package/util/argumentContainsVariables.js.flow +38 -0
  247. package/util/dedupeJSONStringify.js.flow +152 -0
  248. package/util/generateAbstractTypeRefinementKey.js.flow +29 -0
  249. package/util/getDefinitionNodeHash.js.flow +25 -0
  250. package/util/getModuleName.js.flow +39 -0
  251. package/util/joinArgumentDefinitions.js.flow +105 -0
  252. package/util/md5.js.flow +22 -0
  253. package/util/murmurHash.js.flow +94 -0
  254. package/util/nullthrowsOSS.js.flow +25 -0
  255. package/util/orList.js.flow +37 -0
  256. package/util/partitionArray.js.flow +37 -0
@@ -0,0 +1,480 @@
1
+ /**
2
+ * Copyright (c) Facebook, Inc. and its affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ *
8
+ * @format
9
+ */
10
+ // flowlint ambiguous-object-type:error
11
+ 'use strict';
12
+
13
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
14
+
15
+ var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
16
+
17
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
18
+
19
+ var argumentContainsVariables = require('../util/argumentContainsVariables');
20
+
21
+ var generateAbstractTypeRefinementKey = require('../util/generateAbstractTypeRefinementKey');
22
+
23
+ var partitionArray = require('../util/partitionArray');
24
+
25
+ var sortObjectByKey = require('./sortObjectByKey');
26
+
27
+ var _require = require('../core/CompilerError'),
28
+ createCompilerError = _require.createCompilerError,
29
+ createUserError = _require.createUserError;
30
+
31
+ var _require2 = require('relay-runtime'),
32
+ getStorageKey = _require2.getStorageKey,
33
+ stableCopy = _require2.stableCopy;
34
+
35
+ function generate(schema, node) {
36
+ switch (node.kind) {
37
+ case 'Root':
38
+ return generateRoot(schema, node);
39
+
40
+ case 'SplitOperation':
41
+ return generateSplitOperation(schema, node);
42
+
43
+ default:
44
+ throw createCompilerError("NormalizationCodeGenerator: Unsupported AST kind '".concat(node.kind, "'."), [node.loc]);
45
+ }
46
+ }
47
+
48
+ function generateRoot(schema, node) {
49
+ return {
50
+ argumentDefinitions: generateArgumentDefinitions(schema, node.argumentDefinitions),
51
+ kind: 'Operation',
52
+ name: node.name,
53
+ selections: generateSelections(schema, node.selections)
54
+ };
55
+ }
56
+
57
+ function generateSplitOperation(schema, node) {
58
+ return {
59
+ kind: 'SplitOperation',
60
+ metadata: sortObjectByKey(node.metadata),
61
+ name: node.name,
62
+ selections: generateSelections(schema, node.selections)
63
+ };
64
+ }
65
+
66
+ function generateSelections(schema, selections) {
67
+ var normalizationSelections = [];
68
+ selections.forEach(function (selection) {
69
+ var _selection$metadata;
70
+
71
+ switch (selection.kind) {
72
+ case 'Condition':
73
+ normalizationSelections.push(generateCondition(schema, selection));
74
+ break;
75
+
76
+ case 'ClientExtension':
77
+ normalizationSelections.push(generateClientExtension(schema, selection));
78
+ break;
79
+
80
+ case 'ScalarField':
81
+ // NOTE: Inline fragments in normalization ast have the abstractKey
82
+ // but we skip the corresponding ScalarField for the type discriminator
83
+ // selection, since it's guaranteed to be a duplicate of a parent __typename
84
+ // selection.
85
+ var abstractKey = (_selection$metadata = selection.metadata) === null || _selection$metadata === void 0 ? void 0 : _selection$metadata.abstractKey;
86
+
87
+ if (typeof abstractKey === 'string') {
88
+ normalizationSelections.push(generateTypeDiscriminator(abstractKey));
89
+ } else {
90
+ normalizationSelections.push.apply(normalizationSelections, (0, _toConsumableArray2["default"])(generateScalarField(selection)));
91
+ }
92
+
93
+ break;
94
+
95
+ case 'ModuleImport':
96
+ normalizationSelections.push(generateModuleImport(selection));
97
+ break;
98
+
99
+ case 'InlineFragment':
100
+ normalizationSelections.push(generateInlineFragment(schema, selection));
101
+ break;
102
+
103
+ case 'LinkedField':
104
+ normalizationSelections.push.apply(normalizationSelections, (0, _toConsumableArray2["default"])(generateLinkedField(schema, selection)));
105
+ break;
106
+
107
+ case 'Defer':
108
+ normalizationSelections.push(generateDefer(schema, selection));
109
+ break;
110
+
111
+ case 'Stream':
112
+ normalizationSelections.push(generateStream(schema, selection));
113
+ break;
114
+
115
+ case 'InlineDataFragmentSpread':
116
+ case 'FragmentSpread':
117
+ throw new createCompilerError("NormalizationCodeGenerator: Unexpected IR node ".concat(selection.kind, "."), [selection.loc]);
118
+
119
+ default:
120
+ selection;
121
+ throw new Error();
122
+ }
123
+ });
124
+ return normalizationSelections;
125
+ }
126
+
127
+ function generateArgumentDefinitions(schema, nodes) {
128
+ return nodes.map(function (node) {
129
+ return {
130
+ defaultValue: stableCopy(node.defaultValue),
131
+ kind: 'LocalArgument',
132
+ name: node.name
133
+ };
134
+ });
135
+ }
136
+
137
+ function generateClientExtension(schema, node) {
138
+ return {
139
+ kind: 'ClientExtension',
140
+ selections: generateSelections(schema, node.selections)
141
+ };
142
+ }
143
+
144
+ function generateCondition(schema, node) {
145
+ if (node.condition.kind !== 'Variable') {
146
+ throw createCompilerError("NormalizationCodeGenerator: Expected 'Condition' with static " + 'value to be pruned or inlined', [node.condition.loc]);
147
+ }
148
+
149
+ return {
150
+ condition: node.condition.variableName,
151
+ kind: 'Condition',
152
+ passingValue: node.passingValue,
153
+ selections: generateSelections(schema, node.selections)
154
+ };
155
+ }
156
+
157
+ function generateDefer(schema, node) {
158
+ if (!(node["if"] == null || node["if"].kind === 'Variable' || node["if"].kind === 'Literal' && node["if"].value === true)) {
159
+ var _node$if$loc, _node$if;
160
+
161
+ throw createCompilerError('NormalizationCodeGenerator: Expected @defer `if` condition to be ' + 'a variable, unspecified, or the literal `true`.', [(_node$if$loc = (_node$if = node["if"]) === null || _node$if === void 0 ? void 0 : _node$if.loc) !== null && _node$if$loc !== void 0 ? _node$if$loc : node.loc]);
162
+ }
163
+
164
+ return {
165
+ "if": node["if"] != null && node["if"].kind === 'Variable' ? node["if"].variableName : null,
166
+ kind: 'Defer',
167
+ label: node.label,
168
+ selections: generateSelections(schema, node.selections)
169
+ };
170
+ }
171
+
172
+ function generateInlineFragment(schema, node) {
173
+ var rawType = schema.getRawType(node.typeCondition);
174
+ var isAbstractType = schema.isAbstractType(rawType);
175
+ var abstractKey = isAbstractType ? generateAbstractTypeRefinementKey(schema, rawType) : null;
176
+ var selections = generateSelections(schema, node.selections);
177
+
178
+ if (isAbstractType) {
179
+ // Maintain a few invariants:
180
+ // - InlineFragment (and `selections` arrays generally) cannot be empty
181
+ // - Don't emit a TypeDiscriminator under an InlineFragment unless it has
182
+ // a different abstractKey
183
+ // This means we have to handle two cases:
184
+ // - The inline fragment only contains a TypeDiscriminator with the same
185
+ // abstractKey: replace the Fragment w the Discriminator
186
+ // - The inline fragment contains other selections: return all the selections
187
+ // minus any Discriminators w the same key
188
+ var _partitionArray = partitionArray(selections, function (selection) {
189
+ return selection.kind === 'TypeDiscriminator' && selection.abstractKey === abstractKey;
190
+ }),
191
+ discriminators = _partitionArray[0],
192
+ otherSelections = _partitionArray[1];
193
+
194
+ var discriminator = discriminators[0];
195
+
196
+ if (discriminator != null && otherSelections.length === 0) {
197
+ return discriminator;
198
+ } else {
199
+ selections = otherSelections;
200
+ }
201
+ }
202
+
203
+ return {
204
+ kind: 'InlineFragment',
205
+ selections: selections,
206
+ type: schema.getTypeString(rawType),
207
+ abstractKey: abstractKey
208
+ };
209
+ }
210
+
211
+ function generateLinkedField(schema, node) {
212
+ // Note: it is important that the arguments of this field be sorted to
213
+ // ensure stable generation of storage keys for equivalent arguments
214
+ // which may have originally appeared in different orders across an app.
215
+ var handles = node.handles && node.handles.map(function (handle) {
216
+ var handleNode = {
217
+ alias: node.alias === node.name ? null : node.alias,
218
+ args: generateArgs(node.args),
219
+ filters: handle.filters,
220
+ handle: handle.name,
221
+ key: handle.key,
222
+ kind: 'LinkedHandle',
223
+ name: node.name
224
+ }; // NOTE: this intentionally adds a dynamic key in order to avoid
225
+ // triggering updates to existing queries that do not use dynamic
226
+ // keys.
227
+
228
+ if (handle.dynamicKey != null) {
229
+ var dynamicKeyArgName = '__dynamicKey';
230
+ handleNode = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, handleNode), {}, {
231
+ dynamicKey: {
232
+ kind: 'Variable',
233
+ name: dynamicKeyArgName,
234
+ variableName: handle.dynamicKey.variableName
235
+ }
236
+ });
237
+ }
238
+
239
+ if (handle.handleArgs != null) {
240
+ var handleArgs = generateArgs(handle.handleArgs);
241
+
242
+ if (handleArgs != null) {
243
+ handleNode = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, handleNode), {}, {
244
+ handleArgs: handleArgs
245
+ });
246
+ }
247
+ }
248
+
249
+ return handleNode;
250
+ }) || [];
251
+ var type = schema.getRawType(node.type);
252
+ var field = {
253
+ alias: node.alias === node.name ? null : node.alias,
254
+ args: generateArgs(node.args),
255
+ concreteType: !schema.isAbstractType(type) ? schema.getTypeString(type) : null,
256
+ kind: 'LinkedField',
257
+ name: node.name,
258
+ plural: isPlural(schema, node.type),
259
+ selections: generateSelections(schema, node.selections),
260
+ storageKey: null
261
+ }; // Precompute storageKey if possible
262
+
263
+ var storageKey = getStaticStorageKey(field, node.metadata);
264
+
265
+ if (storageKey != null) {
266
+ field = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, field), {}, {
267
+ storageKey: storageKey
268
+ });
269
+ }
270
+
271
+ return [field].concat(handles);
272
+ }
273
+
274
+ function generateModuleImport(node) {
275
+ var fragmentName = node.name;
276
+ var regExpMatch = fragmentName.match(/^([a-zA-Z][a-zA-Z0-9]*)(?:_([a-zA-Z][_a-zA-Z0-9]*))?$/);
277
+
278
+ if (!regExpMatch) {
279
+ throw createCompilerError('NormalizationCodeGenerator: @module fragments should be named ' + "'FragmentName_propName', got '".concat(fragmentName, "'."), [node.loc]);
280
+ }
281
+
282
+ var fragmentPropName = regExpMatch[2];
283
+
284
+ if (typeof fragmentPropName !== 'string') {
285
+ throw createCompilerError('NormalizationCodeGenerator: @module fragments should be named ' + "'FragmentName_propName', got '".concat(fragmentName, "'."), [node.loc]);
286
+ }
287
+
288
+ return {
289
+ args: null,
290
+ documentName: node.key,
291
+ fragmentName: fragmentName,
292
+ fragmentPropName: fragmentPropName,
293
+ kind: 'ModuleImport'
294
+ };
295
+ }
296
+
297
+ function generateTypeDiscriminator(abstractKey) {
298
+ return {
299
+ kind: 'TypeDiscriminator',
300
+ abstractKey: abstractKey
301
+ };
302
+ }
303
+
304
+ function generateScalarField(node) {
305
+ var _node$metadata, _node$metadata2;
306
+
307
+ // flowlint-next-line sketchy-null-mixed:off
308
+ if ((_node$metadata = node.metadata) === null || _node$metadata === void 0 ? void 0 : _node$metadata.skipNormalizationNode) {
309
+ return [];
310
+ } // Note: it is important that the arguments of this field be sorted to
311
+ // ensure stable generation of storage keys for equivalent arguments
312
+ // which may have originally appeared in different orders across an app.
313
+
314
+
315
+ var handles = node.handles && node.handles.map(function (handle) {
316
+ if (handle.dynamicKey != null) {
317
+ throw createUserError('Dynamic key values are not supported on scalar fields.', [handle.dynamicKey.loc]);
318
+ }
319
+
320
+ var nodeHandle = {
321
+ alias: node.alias === node.name ? null : node.alias,
322
+ args: generateArgs(node.args),
323
+ filters: handle.filters,
324
+ handle: handle.name,
325
+ key: handle.key,
326
+ kind: 'ScalarHandle',
327
+ name: node.name
328
+ };
329
+
330
+ if (handle.handleArgs != null) {
331
+ // $FlowFixMe handleArgs exists in Handle
332
+ nodeHandle.handleArgs = generateArgs(handle.handleArgs);
333
+ }
334
+
335
+ return nodeHandle;
336
+ }) || [];
337
+ var field = {
338
+ alias: node.alias === node.name ? null : node.alias,
339
+ args: generateArgs(node.args),
340
+ kind: 'ScalarField',
341
+ name: node.name,
342
+ storageKey: null
343
+ }; // Precompute storageKey if possible
344
+
345
+ var storageKey = getStaticStorageKey(field, node.metadata);
346
+
347
+ if (storageKey != null) {
348
+ field = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, field), {}, {
349
+ storageKey: storageKey
350
+ });
351
+ }
352
+
353
+ if (((_node$metadata2 = node.metadata) === null || _node$metadata2 === void 0 ? void 0 : _node$metadata2.flight) === true) {
354
+ field = (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, field), {}, {
355
+ kind: 'FlightField'
356
+ });
357
+ }
358
+
359
+ return [field].concat(handles);
360
+ }
361
+
362
+ function generateStream(schema, node) {
363
+ if (!(node["if"] == null || node["if"].kind === 'Variable' || node["if"].kind === 'Literal' && node["if"].value === true)) {
364
+ var _node$if$loc2, _node$if2;
365
+
366
+ throw createCompilerError('NormalizationCodeGenerator: Expected @stream `if` condition to be ' + 'a variable, unspecified, or the literal `true`.', [(_node$if$loc2 = (_node$if2 = node["if"]) === null || _node$if2 === void 0 ? void 0 : _node$if2.loc) !== null && _node$if$loc2 !== void 0 ? _node$if$loc2 : node.loc]);
367
+ }
368
+
369
+ return {
370
+ "if": node["if"] != null && node["if"].kind === 'Variable' ? node["if"].variableName : null,
371
+ kind: 'Stream',
372
+ label: node.label,
373
+ selections: generateSelections(schema, node.selections)
374
+ };
375
+ }
376
+
377
+ function generateArgumentValue(name, value) {
378
+ switch (value.kind) {
379
+ case 'Variable':
380
+ return {
381
+ kind: 'Variable',
382
+ name: name,
383
+ variableName: value.variableName
384
+ };
385
+
386
+ case 'Literal':
387
+ return value.value === null ? null : {
388
+ kind: 'Literal',
389
+ name: name,
390
+ value: stableCopy(value.value)
391
+ };
392
+
393
+ case 'ObjectValue':
394
+ {
395
+ var objectKeys = value.fields.map(function (field) {
396
+ return field.name;
397
+ }).sort();
398
+ var objectValues = new Map(value.fields.map(function (field) {
399
+ return [field.name, field.value];
400
+ }));
401
+ return {
402
+ fields: objectKeys.map(function (fieldName) {
403
+ var _generateArgumentValu;
404
+
405
+ var fieldValue = objectValues.get(fieldName);
406
+
407
+ if (fieldValue == null) {
408
+ throw createCompilerError('Expected to have object field value');
409
+ }
410
+
411
+ return (_generateArgumentValu = generateArgumentValue(fieldName, fieldValue)) !== null && _generateArgumentValu !== void 0 ? _generateArgumentValu : {
412
+ kind: 'Literal',
413
+ name: fieldName,
414
+ value: null
415
+ };
416
+ }),
417
+ kind: 'ObjectValue',
418
+ name: name
419
+ };
420
+ }
421
+
422
+ case 'ListValue':
423
+ {
424
+ return {
425
+ items: value.items.map(function (item, index) {
426
+ return generateArgumentValue("".concat(name, ".").concat(index), item);
427
+ }),
428
+ kind: 'ListValue',
429
+ name: name
430
+ };
431
+ }
432
+
433
+ default:
434
+ throw createUserError('NormalizationCodeGenerator: Complex argument values (Lists or ' + 'InputObjects with nested variables) are not supported.', [value.loc]);
435
+ }
436
+ }
437
+
438
+ function generateArgs(args) {
439
+ var concreteArguments = [];
440
+ args.forEach(function (arg) {
441
+ var concreteArgument = generateArgumentValue(arg.name, arg.value);
442
+
443
+ if (concreteArgument !== null) {
444
+ concreteArguments.push(concreteArgument);
445
+ }
446
+ });
447
+ return concreteArguments.length === 0 ? null : concreteArguments.sort(nameComparator);
448
+ }
449
+
450
+ function nameComparator(a, b) {
451
+ return a.name < b.name ? -1 : a.name > b.name ? 1 : 0;
452
+ }
453
+ /**
454
+ * Pre-computes storage key if possible and advantageous. Storage keys are
455
+ * generated for fields with supplied arguments that are all statically known
456
+ * (ie. literals, no variables) at build time.
457
+ */
458
+
459
+
460
+ function getStaticStorageKey(field, metadata) {
461
+ var metadataStorageKey = metadata === null || metadata === void 0 ? void 0 : metadata.storageKey;
462
+
463
+ if (typeof metadataStorageKey === 'string') {
464
+ return metadataStorageKey;
465
+ }
466
+
467
+ if (!field.args || field.args.length === 0 || field.args.some(argumentContainsVariables)) {
468
+ return null;
469
+ }
470
+
471
+ return getStorageKey(field, {});
472
+ }
473
+
474
+ function isPlural(schema, type) {
475
+ return schema.isList(schema.getNullableType(type));
476
+ }
477
+
478
+ module.exports = {
479
+ generate: generate
480
+ };