relay-compiler 11.0.2 → 13.0.0-rc.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (261) hide show
  1. package/README.md +108 -0
  2. package/cli.js +23 -0
  3. package/index.js +22 -4
  4. package/linux-x64/relay +0 -0
  5. package/macos-arm64/relay +0 -0
  6. package/macos-x64/relay +0 -0
  7. package/package.json +2 -26
  8. package/win-x64/relay.exe +0 -0
  9. package/bin/RelayCompilerBin.js.flow +0 -169
  10. package/bin/RelayCompilerMain.js.flow +0 -515
  11. package/bin/__fixtures__/plugin-module.js.flow +0 -17
  12. package/bin/relay-compiler +0 -19008
  13. package/codegen/CodegenDirectory.js.flow +0 -375
  14. package/codegen/CodegenRunner.js.flow +0 -432
  15. package/codegen/CodegenTypes.js.flow +0 -28
  16. package/codegen/CodegenWatcher.js.flow +0 -254
  17. package/codegen/NormalizationCodeGenerator.js.flow +0 -571
  18. package/codegen/ReaderCodeGenerator.js.flow +0 -512
  19. package/codegen/RelayCodeGenerator.js.flow +0 -85
  20. package/codegen/RelayFileWriter.js.flow +0 -367
  21. package/codegen/SourceControl.js.flow +0 -58
  22. package/codegen/compileRelayArtifacts.js.flow +0 -182
  23. package/codegen/createPrintRequireModuleDependency.js.flow +0 -21
  24. package/codegen/sortObjectByKey.js.flow +0 -25
  25. package/codegen/writeRelayGeneratedFile.js.flow +0 -239
  26. package/core/ASTCache.js.flow +0 -74
  27. package/core/ASTConvert.js.flow +0 -233
  28. package/core/CompilerContext.js.flow +0 -191
  29. package/core/CompilerError.js.flow +0 -255
  30. package/core/DotGraphQLParser.js.flow +0 -39
  31. package/core/GraphQLCompilerProfiler.js.flow +0 -341
  32. package/core/GraphQLDerivedFromMetadata.js.flow +0 -36
  33. package/core/GraphQLWatchmanClient.js.flow +0 -111
  34. package/core/IR.js.flow +0 -326
  35. package/core/IRPrinter.js.flow +0 -478
  36. package/core/IRTransformer.js.flow +0 -377
  37. package/core/IRValidator.js.flow +0 -260
  38. package/core/IRVisitor.js.flow +0 -150
  39. package/core/JSModuleParser.js.flow +0 -24
  40. package/core/RelayCompilerScope.js.flow +0 -199
  41. package/core/RelayFindGraphQLTags.js.flow +0 -119
  42. package/core/RelayGraphQLEnumsGenerator.js.flow +0 -55
  43. package/core/RelayIRTransforms.js.flow +0 -138
  44. package/core/RelayParser.js.flow +0 -1734
  45. package/core/RelaySourceModuleParser.js.flow +0 -135
  46. package/core/Schema.js.flow +0 -2037
  47. package/core/SchemaUtils.js.flow +0 -120
  48. package/core/filterContextForNode.js.flow +0 -50
  49. package/core/getFieldDefinition.js.flow +0 -156
  50. package/core/getIdentifierForArgumentValue.js.flow +0 -49
  51. package/core/getIdentifierForSelection.js.flow +0 -69
  52. package/core/getLiteralArgumentValues.js.flow +0 -32
  53. package/core/getNormalizationOperationName.js.flow +0 -19
  54. package/core/inferRootArgumentDefinitions.js.flow +0 -323
  55. package/index.js.flow +0 -200
  56. package/language/RelayLanguagePluginInterface.js.flow +0 -283
  57. package/language/javascript/FindGraphQLTags.js.flow +0 -137
  58. package/language/javascript/RelayFlowBabelFactories.js.flow +0 -176
  59. package/language/javascript/RelayFlowGenerator.js.flow +0 -1100
  60. package/language/javascript/RelayFlowTypeTransformers.js.flow +0 -184
  61. package/language/javascript/RelayLanguagePluginJavaScript.js.flow +0 -34
  62. package/language/javascript/formatGeneratedModule.js.flow +0 -65
  63. package/lib/bin/RelayCompilerBin.js +0 -143
  64. package/lib/bin/RelayCompilerMain.js +0 -486
  65. package/lib/bin/__fixtures__/plugin-module.js +0 -16
  66. package/lib/codegen/CodegenDirectory.js +0 -336
  67. package/lib/codegen/CodegenRunner.js +0 -433
  68. package/lib/codegen/CodegenTypes.js +0 -11
  69. package/lib/codegen/CodegenWatcher.js +0 -271
  70. package/lib/codegen/NormalizationCodeGenerator.js +0 -481
  71. package/lib/codegen/ReaderCodeGenerator.js +0 -472
  72. package/lib/codegen/RelayCodeGenerator.js +0 -68
  73. package/lib/codegen/RelayFileWriter.js +0 -270
  74. package/lib/codegen/SourceControl.js +0 -60
  75. package/lib/codegen/compileRelayArtifacts.js +0 -157
  76. package/lib/codegen/createPrintRequireModuleDependency.js +0 -19
  77. package/lib/codegen/sortObjectByKey.js +0 -41
  78. package/lib/codegen/writeRelayGeneratedFile.js +0 -208
  79. package/lib/core/ASTCache.js +0 -70
  80. package/lib/core/ASTConvert.js +0 -198
  81. package/lib/core/CompilerContext.js +0 -165
  82. package/lib/core/CompilerError.js +0 -251
  83. package/lib/core/DotGraphQLParser.js +0 -40
  84. package/lib/core/GraphQLCompilerProfiler.js +0 -299
  85. package/lib/core/GraphQLDerivedFromMetadata.js +0 -31
  86. package/lib/core/GraphQLWatchmanClient.js +0 -150
  87. package/lib/core/IR.js +0 -11
  88. package/lib/core/IRPrinter.js +0 -389
  89. package/lib/core/IRTransformer.js +0 -345
  90. package/lib/core/IRValidator.js +0 -226
  91. package/lib/core/IRVisitor.js +0 -45
  92. package/lib/core/JSModuleParser.js +0 -18
  93. package/lib/core/RelayCompilerScope.js +0 -149
  94. package/lib/core/RelayFindGraphQLTags.js +0 -79
  95. package/lib/core/RelayGraphQLEnumsGenerator.js +0 -50
  96. package/lib/core/RelayIRTransforms.js +0 -109
  97. package/lib/core/RelayParser.js +0 -1382
  98. package/lib/core/RelaySourceModuleParser.js +0 -104
  99. package/lib/core/Schema.js +0 -1877
  100. package/lib/core/SchemaUtils.js +0 -98
  101. package/lib/core/filterContextForNode.js +0 -49
  102. package/lib/core/getFieldDefinition.js +0 -145
  103. package/lib/core/getIdentifierForArgumentValue.js +0 -53
  104. package/lib/core/getIdentifierForSelection.js +0 -48
  105. package/lib/core/getLiteralArgumentValues.js +0 -26
  106. package/lib/core/getNormalizationOperationName.js +0 -17
  107. package/lib/core/inferRootArgumentDefinitions.js +0 -351
  108. package/lib/index.js +0 -178
  109. package/lib/language/RelayLanguagePluginInterface.js +0 -14
  110. package/lib/language/javascript/FindGraphQLTags.js +0 -126
  111. package/lib/language/javascript/RelayFlowBabelFactories.js +0 -160
  112. package/lib/language/javascript/RelayFlowGenerator.js +0 -857
  113. package/lib/language/javascript/RelayFlowTypeTransformers.js +0 -119
  114. package/lib/language/javascript/RelayLanguagePluginJavaScript.js +0 -30
  115. package/lib/language/javascript/formatGeneratedModule.js +0 -36
  116. package/lib/reporters/ConsoleReporter.js +0 -61
  117. package/lib/reporters/MultiReporter.js +0 -45
  118. package/lib/reporters/Reporter.js +0 -11
  119. package/lib/runner/Artifacts.js +0 -323
  120. package/lib/runner/BufferedFilesystem.js +0 -261
  121. package/lib/runner/GraphQLASTNodeGroup.js +0 -256
  122. package/lib/runner/GraphQLASTUtils.js +0 -23
  123. package/lib/runner/GraphQLNodeMap.js +0 -81
  124. package/lib/runner/Sources.js +0 -271
  125. package/lib/runner/StrictMap.js +0 -134
  126. package/lib/runner/compileArtifacts.js +0 -39
  127. package/lib/runner/extractAST.js +0 -77
  128. package/lib/runner/getChangedNodeNames.js +0 -82
  129. package/lib/runner/getSchemaInstance.js +0 -30
  130. package/lib/runner/types.js +0 -12
  131. package/lib/transforms/ApplyFragmentArgumentTransform.js +0 -393
  132. package/lib/transforms/ClientExtensionsTransform.js +0 -221
  133. package/lib/transforms/ConnectionTransform.js +0 -639
  134. package/lib/transforms/DeclarativeConnectionMutationTransform.js +0 -218
  135. package/lib/transforms/DeferStreamTransform.js +0 -246
  136. package/lib/transforms/DisallowIdAsAlias.js +0 -40
  137. package/lib/transforms/DisallowTypenameOnRoot.js +0 -53
  138. package/lib/transforms/FieldHandleTransform.js +0 -79
  139. package/lib/transforms/FilterCompilerDirectivesTransform.js +0 -29
  140. package/lib/transforms/FilterDirectivesTransform.js +0 -41
  141. package/lib/transforms/FlattenTransform.js +0 -306
  142. package/lib/transforms/GenerateIDFieldTransform.js +0 -135
  143. package/lib/transforms/GenerateTypeNameTransform.js +0 -149
  144. package/lib/transforms/InlineDataFragmentTransform.js +0 -100
  145. package/lib/transforms/InlineFragmentsTransform.js +0 -61
  146. package/lib/transforms/MaskTransform.js +0 -117
  147. package/lib/transforms/MatchTransform.js +0 -434
  148. package/lib/transforms/ReactFlightComponentTransform.js +0 -158
  149. package/lib/transforms/RefetchableFragmentTransform.js +0 -249
  150. package/lib/transforms/RelayDirectiveTransform.js +0 -83
  151. package/lib/transforms/RequiredFieldTransform.js +0 -369
  152. package/lib/transforms/SkipClientExtensionsTransform.js +0 -46
  153. package/lib/transforms/SkipHandleFieldTransform.js +0 -44
  154. package/lib/transforms/SkipRedundantNodesTransform.js +0 -254
  155. package/lib/transforms/SkipSplitOperationTransform.js +0 -32
  156. package/lib/transforms/SkipUnreachableNodeTransform.js +0 -158
  157. package/lib/transforms/SkipUnusedVariablesTransform.js +0 -74
  158. package/lib/transforms/SplitModuleImportTransform.js +0 -82
  159. package/lib/transforms/TestOperationTransform.js +0 -144
  160. package/lib/transforms/TransformUtils.js +0 -21
  161. package/lib/transforms/ValidateGlobalVariablesTransform.js +0 -91
  162. package/lib/transforms/ValidateRequiredArgumentsTransform.js +0 -114
  163. package/lib/transforms/ValidateServerOnlyDirectivesTransform.js +0 -108
  164. package/lib/transforms/ValidateUnusedVariablesTransform.js +0 -96
  165. package/lib/transforms/query-generators/FetchableQueryGenerator.js +0 -157
  166. package/lib/transforms/query-generators/NodeQueryGenerator.js +0 -166
  167. package/lib/transforms/query-generators/QueryQueryGenerator.js +0 -48
  168. package/lib/transforms/query-generators/ViewerQueryGenerator.js +0 -77
  169. package/lib/transforms/query-generators/index.js +0 -60
  170. package/lib/transforms/query-generators/utils.js +0 -92
  171. package/lib/util/CodeMarker.js +0 -80
  172. package/lib/util/DefaultHandleKey.js +0 -15
  173. package/lib/util/RelayCompilerCache.js +0 -98
  174. package/lib/util/Rollout.js +0 -40
  175. package/lib/util/TimeReporter.js +0 -83
  176. package/lib/util/areEqualArgValues.js +0 -134
  177. package/lib/util/argumentContainsVariables.js +0 -37
  178. package/lib/util/dedupeJSONStringify.js +0 -160
  179. package/lib/util/generateAbstractTypeRefinementKey.js +0 -24
  180. package/lib/util/getDefinitionNodeHash.js +0 -22
  181. package/lib/util/getModuleName.js +0 -32
  182. package/lib/util/joinArgumentDefinitions.js +0 -66
  183. package/lib/util/md5.js +0 -17
  184. package/lib/util/murmurHash.js +0 -86
  185. package/lib/util/nullthrowsOSS.js +0 -23
  186. package/lib/util/orList.js +0 -36
  187. package/lib/util/partitionArray.js +0 -35
  188. package/relay-compiler.js +0 -17
  189. package/relay-compiler.min.js +0 -22
  190. package/reporters/ConsoleReporter.js.flow +0 -81
  191. package/reporters/MultiReporter.js.flow +0 -43
  192. package/reporters/Reporter.js.flow +0 -19
  193. package/runner/Artifacts.js.flow +0 -219
  194. package/runner/BufferedFilesystem.js.flow +0 -194
  195. package/runner/GraphQLASTNodeGroup.js.flow +0 -176
  196. package/runner/GraphQLASTUtils.js.flow +0 -26
  197. package/runner/GraphQLNodeMap.js.flow +0 -55
  198. package/runner/Sources.js.flow +0 -228
  199. package/runner/StrictMap.js.flow +0 -96
  200. package/runner/compileArtifacts.js.flow +0 -76
  201. package/runner/extractAST.js.flow +0 -100
  202. package/runner/getChangedNodeNames.js.flow +0 -48
  203. package/runner/getSchemaInstance.js.flow +0 -36
  204. package/runner/types.js.flow +0 -37
  205. package/transforms/ApplyFragmentArgumentTransform.js.flow +0 -526
  206. package/transforms/ClientExtensionsTransform.js.flow +0 -225
  207. package/transforms/ConnectionTransform.js.flow +0 -855
  208. package/transforms/DeclarativeConnectionMutationTransform.js.flow +0 -247
  209. package/transforms/DeferStreamTransform.js.flow +0 -265
  210. package/transforms/DisallowIdAsAlias.js.flow +0 -47
  211. package/transforms/DisallowTypenameOnRoot.js.flow +0 -45
  212. package/transforms/FieldHandleTransform.js.flow +0 -79
  213. package/transforms/FilterCompilerDirectivesTransform.js.flow +0 -33
  214. package/transforms/FilterDirectivesTransform.js.flow +0 -45
  215. package/transforms/FlattenTransform.js.flow +0 -460
  216. package/transforms/GenerateIDFieldTransform.js.flow +0 -152
  217. package/transforms/GenerateTypeNameTransform.js.flow +0 -161
  218. package/transforms/InlineDataFragmentTransform.js.flow +0 -125
  219. package/transforms/InlineFragmentsTransform.js.flow +0 -71
  220. package/transforms/MaskTransform.js.flow +0 -126
  221. package/transforms/MatchTransform.js.flow +0 -589
  222. package/transforms/ReactFlightComponentTransform.js.flow +0 -195
  223. package/transforms/RefetchableFragmentTransform.js.flow +0 -272
  224. package/transforms/RelayDirectiveTransform.js.flow +0 -97
  225. package/transforms/RequiredFieldTransform.js.flow +0 -415
  226. package/transforms/SkipClientExtensionsTransform.js.flow +0 -54
  227. package/transforms/SkipHandleFieldTransform.js.flow +0 -44
  228. package/transforms/SkipRedundantNodesTransform.js.flow +0 -258
  229. package/transforms/SkipSplitOperationTransform.js.flow +0 -37
  230. package/transforms/SkipUnreachableNodeTransform.js.flow +0 -149
  231. package/transforms/SkipUnusedVariablesTransform.js.flow +0 -59
  232. package/transforms/SplitModuleImportTransform.js.flow +0 -98
  233. package/transforms/TestOperationTransform.js.flow +0 -142
  234. package/transforms/TransformUtils.js.flow +0 -26
  235. package/transforms/ValidateGlobalVariablesTransform.js.flow +0 -81
  236. package/transforms/ValidateRequiredArgumentsTransform.js.flow +0 -127
  237. package/transforms/ValidateServerOnlyDirectivesTransform.js.flow +0 -112
  238. package/transforms/ValidateUnusedVariablesTransform.js.flow +0 -89
  239. package/transforms/query-generators/FetchableQueryGenerator.js.flow +0 -189
  240. package/transforms/query-generators/NodeQueryGenerator.js.flow +0 -219
  241. package/transforms/query-generators/QueryQueryGenerator.js.flow +0 -57
  242. package/transforms/query-generators/ViewerQueryGenerator.js.flow +0 -97
  243. package/transforms/query-generators/index.js.flow +0 -90
  244. package/transforms/query-generators/utils.js.flow +0 -76
  245. package/util/CodeMarker.js.flow +0 -79
  246. package/util/DefaultHandleKey.js.flow +0 -17
  247. package/util/RelayCompilerCache.js.flow +0 -88
  248. package/util/Rollout.js.flow +0 -39
  249. package/util/TimeReporter.js.flow +0 -79
  250. package/util/areEqualArgValues.js.flow +0 -125
  251. package/util/argumentContainsVariables.js.flow +0 -38
  252. package/util/dedupeJSONStringify.js.flow +0 -152
  253. package/util/generateAbstractTypeRefinementKey.js.flow +0 -29
  254. package/util/getDefinitionNodeHash.js.flow +0 -25
  255. package/util/getModuleName.js.flow +0 -39
  256. package/util/joinArgumentDefinitions.js.flow +0 -105
  257. package/util/md5.js.flow +0 -22
  258. package/util/murmurHash.js.flow +0 -94
  259. package/util/nullthrowsOSS.js.flow +0 -25
  260. package/util/orList.js.flow +0 -37
  261. package/util/partitionArray.js.flow +0 -37
@@ -1,526 +0,0 @@
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
- * @flow
8
- * @format
9
- */
10
-
11
- // flowlint ambiguous-object-type:error
12
-
13
- 'use strict';
14
-
15
- const IRTransformer = require('../core/IRTransformer');
16
- const RelayCompilerScope = require('../core/RelayCompilerScope');
17
-
18
- const getIdentifierForArgumentValue = require('../core/getIdentifierForArgumentValue');
19
- const murmurHash = require('../util/murmurHash');
20
-
21
- const {
22
- createCompilerError,
23
- createNonRecoverableUserError,
24
- } = require('../core/CompilerError');
25
-
26
- import type CompilerContext from '../core/CompilerContext';
27
- import type {
28
- Argument,
29
- ArgumentValue,
30
- Condition,
31
- Defer,
32
- Directive,
33
- Field,
34
- Fragment,
35
- FragmentSpread,
36
- IR,
37
- Node,
38
- Selection,
39
- Stream,
40
- } from '../core/IR';
41
- import type {Scope} from '../core/RelayCompilerScope';
42
-
43
- const {getFragmentScope, getRootScope} = RelayCompilerScope;
44
-
45
- type PendingFragment =
46
- | {|kind: 'pending'|}
47
- | {|kind: 'resolved', value: ?Fragment|};
48
-
49
- /**
50
- * A transform that converts a set of documents containing fragments/fragment
51
- * spreads *with* arguments to one where all arguments have been inlined. This
52
- * is effectively static currying of functions. Nodes are changed as follows:
53
- * - Fragment spreads with arguments are replaced with references to an inlined
54
- * version of the referenced fragment.
55
- * - Fragments with argument definitions are cloned once per unique set of
56
- * arguments, with the name changed to original name + hash and all nested
57
- * variable references changed to the value of that variable given its
58
- * arguments.
59
- * - Field & directive argument variables are replaced with the value of those
60
- * variables in context.
61
- * - All nodes are cloned with updated children.
62
- *
63
- * The transform also handles statically passing/failing Condition nodes:
64
- * - Literal Conditions with a passing value are elided and their selections
65
- * inlined in their parent.
66
- * - Literal Conditions with a failing value are removed.
67
- * - Nodes that would become empty as a result of the above are removed.
68
- *
69
- * Note that unreferenced fragments are not added to the output.
70
- */
71
- function applyFragmentArgumentTransform(
72
- context: CompilerContext,
73
- ): CompilerContext {
74
- const fragments: Map<string, PendingFragment> = new Map();
75
- let nextContext = IRTransformer.transform(context, {
76
- Root: node => {
77
- const scope = getRootScope(node.argumentDefinitions);
78
- return transformNode(context, fragments, scope, node, [node]);
79
- },
80
- SplitOperation: node => {
81
- return transformNode(context, fragments, {}, node, [node]);
82
- },
83
- // Fragments are included below where referenced.
84
- // Unreferenced fragments are not included.
85
- Fragment: () => null,
86
- });
87
-
88
- for (const pendingFragment of fragments.values()) {
89
- if (pendingFragment.kind === 'resolved' && pendingFragment.value) {
90
- nextContext = nextContext.add(pendingFragment.value);
91
- }
92
- }
93
- return nextContext;
94
- }
95
-
96
- function transformNode<T: Node>(
97
- context: CompilerContext,
98
- fragments: Map<string, PendingFragment>,
99
- scope: Scope,
100
- node: T,
101
- errorContext: $ReadOnlyArray<IR>,
102
- ): ?T {
103
- const selections = transformSelections(
104
- context,
105
- fragments,
106
- scope,
107
- node.selections,
108
- errorContext,
109
- );
110
- if (!selections) {
111
- return null;
112
- }
113
- if (node.hasOwnProperty('directives')) {
114
- const directives = transformDirectives(
115
- scope,
116
- (node: $FlowIssue).directives,
117
- errorContext,
118
- );
119
- return ({
120
- ...node,
121
- directives,
122
- selections,
123
- }: any);
124
- }
125
- return ({
126
- ...node,
127
- selections,
128
- }: $FlowIssue);
129
- }
130
-
131
- function transformDeferStreamNode<T: Defer | Stream>(
132
- context: CompilerContext,
133
- fragments: Map<string, PendingFragment>,
134
- scope: Scope,
135
- node: T,
136
- errorContext: $ReadOnlyArray<IR>,
137
- ): ?Selection {
138
- const nextNode = transformNode(context, fragments, scope, node, errorContext);
139
- if (!nextNode) {
140
- return null;
141
- }
142
- (nextNode: T);
143
- if (nextNode.if) {
144
- const ifVal = transformValue(scope, nextNode.if, errorContext);
145
- if (
146
- ifVal.kind === 'Literal' &&
147
- ifVal.value === false &&
148
- node.selections &&
149
- node.selections.length === 1
150
- ) {
151
- // Skip Defer/Stream wrapper with literal if: false
152
- return node.selections[0];
153
- }
154
- // $FlowFixMe[cannot-write] nextNode is uniquely owned
155
- nextNode.if = ifVal;
156
- }
157
- if (nextNode.useCustomizedBatch) {
158
- // $FlowFixMe[cannot-write] nextNode is uniquely owned
159
- nextNode.useCustomizedBatch = transformValue(
160
- scope,
161
- nextNode.useCustomizedBatch,
162
- errorContext,
163
- );
164
- }
165
- if (nextNode.initialCount) {
166
- // $FlowFixMe[cannot-write] nextNode is uniquely owned
167
- nextNode.initialCount = transformValue(
168
- scope,
169
- nextNode.initialCount,
170
- errorContext,
171
- );
172
- }
173
- return nextNode;
174
- }
175
-
176
- function transformFragmentSpread(
177
- context: CompilerContext,
178
- fragments: Map<string, PendingFragment>,
179
- scope: Scope,
180
- spread: FragmentSpread,
181
- errorContext: $ReadOnlyArray<IR>,
182
- ): ?FragmentSpread {
183
- const directives = transformDirectives(
184
- scope,
185
- spread.directives,
186
- errorContext,
187
- );
188
- const appliedFragment = transformFragment(
189
- context,
190
- fragments,
191
- scope,
192
- spread,
193
- spread.args,
194
- [...errorContext, spread],
195
- );
196
- if (!appliedFragment) {
197
- return null;
198
- }
199
- const transformed: FragmentSpread = {
200
- ...spread,
201
- kind: 'FragmentSpread',
202
- args: [],
203
- directives,
204
- name: appliedFragment.name,
205
- };
206
- return transformed;
207
- }
208
-
209
- function transformField<T: Field>(
210
- context: CompilerContext,
211
- fragments: Map<string, PendingFragment>,
212
- scope: Scope,
213
- field: T,
214
- errorContext: $ReadOnlyArray<IR>,
215
- ): ?T {
216
- const args = transformArguments(scope, field.args, errorContext);
217
- const directives = transformDirectives(scope, field.directives, errorContext);
218
- if (field.kind === 'LinkedField') {
219
- const selections = transformSelections(
220
- context,
221
- fragments,
222
- scope,
223
- field.selections,
224
- errorContext,
225
- );
226
- if (!selections) {
227
- return null;
228
- }
229
- return ({
230
- ...field,
231
- args,
232
- directives,
233
- selections,
234
- }: $FlowFixMe);
235
- } else {
236
- return {
237
- ...field,
238
- args,
239
- directives,
240
- };
241
- }
242
- }
243
-
244
- function transformCondition(
245
- context: CompilerContext,
246
- fragments: Map<string, PendingFragment>,
247
- scope: Scope,
248
- node: Condition,
249
- errorContext: $ReadOnlyArray<IR>,
250
- ): ?$ReadOnlyArray<Selection> {
251
- const condition = transformValue(scope, node.condition, errorContext);
252
- if (!(condition.kind === 'Literal' || condition.kind === 'Variable')) {
253
- // This transform does whole-program optimization, errors in
254
- // a single document could break invariants and/or cause
255
- // additional spurious errors.
256
- throw createNonRecoverableUserError(
257
- 'A non-scalar value was applied to an @include or @skip directive, ' +
258
- 'the `if` argument value must be a ' +
259
- 'variable or a literal Boolean.',
260
- [condition.loc],
261
- );
262
- }
263
- if (condition.kind === 'Literal' && condition.value !== node.passingValue) {
264
- // Dead code, no need to traverse further.
265
- return null;
266
- }
267
- const selections = transformSelections(
268
- context,
269
- fragments,
270
- scope,
271
- node.selections,
272
- errorContext,
273
- );
274
- if (!selections) {
275
- return null;
276
- }
277
- if (condition.kind === 'Literal' && condition.value === node.passingValue) {
278
- // Always passes, return inlined selections
279
- return selections;
280
- }
281
- return [
282
- {
283
- ...node,
284
- condition,
285
- selections,
286
- },
287
- ];
288
- }
289
-
290
- function transformSelections(
291
- context: CompilerContext,
292
- fragments: Map<string, PendingFragment>,
293
- scope: Scope,
294
- selections: $ReadOnlyArray<Selection>,
295
- errorContext: $ReadOnlyArray<IR>,
296
- ): ?$ReadOnlyArray<Selection> {
297
- let nextSelections = null;
298
- selections.forEach(selection => {
299
- let nextSelection;
300
- if (
301
- selection.kind === 'ClientExtension' ||
302
- selection.kind === 'InlineDataFragmentSpread' ||
303
- selection.kind === 'InlineFragment' ||
304
- selection.kind === 'ModuleImport'
305
- ) {
306
- nextSelection = transformNode(
307
- context,
308
- fragments,
309
- scope,
310
- selection,
311
- errorContext,
312
- );
313
- } else if (selection.kind === 'Defer' || selection.kind === 'Stream') {
314
- nextSelection = transformDeferStreamNode(
315
- context,
316
- fragments,
317
- scope,
318
- selection,
319
- errorContext,
320
- );
321
- } else if (selection.kind === 'FragmentSpread') {
322
- nextSelection = transformFragmentSpread(
323
- context,
324
- fragments,
325
- scope,
326
- selection,
327
- errorContext,
328
- );
329
- } else if (selection.kind === 'Condition') {
330
- const conditionSelections = transformCondition(
331
- context,
332
- fragments,
333
- scope,
334
- selection,
335
- errorContext,
336
- );
337
- if (conditionSelections) {
338
- nextSelections = nextSelections || [];
339
- nextSelections.push(...conditionSelections);
340
- }
341
- } else if (
342
- selection.kind === 'LinkedField' ||
343
- selection.kind === 'ScalarField'
344
- ) {
345
- nextSelection = transformField(
346
- context,
347
- fragments,
348
- scope,
349
- selection,
350
- errorContext,
351
- );
352
- } else {
353
- (selection: empty);
354
- throw createCompilerError(
355
- `ApplyFragmentArgumentTransform: Unsupported kind '${selection.kind}'.`,
356
- [selection.loc],
357
- );
358
- }
359
- if (nextSelection) {
360
- nextSelections = nextSelections || [];
361
- nextSelections.push(nextSelection);
362
- }
363
- });
364
- return nextSelections;
365
- }
366
-
367
- function transformDirectives(
368
- scope: Scope,
369
- directives: $ReadOnlyArray<Directive>,
370
- errorContext: $ReadOnlyArray<IR>,
371
- ): $ReadOnlyArray<Directive> {
372
- return directives.map(directive => {
373
- const args = transformArguments(scope, directive.args, errorContext);
374
- return {
375
- ...directive,
376
- args,
377
- };
378
- });
379
- }
380
-
381
- function transformArguments(
382
- scope: Scope,
383
- args: $ReadOnlyArray<Argument>,
384
- errorContext: $ReadOnlyArray<IR>,
385
- ): $ReadOnlyArray<Argument> {
386
- return args.map(arg => {
387
- const value = transformValue(scope, arg.value, errorContext);
388
- return value === arg.value ? arg : {...arg, value};
389
- });
390
- }
391
-
392
- function transformValue(
393
- scope: Scope,
394
- value: ArgumentValue,
395
- errorContext: $ReadOnlyArray<IR>,
396
- ): ArgumentValue {
397
- if (value.kind === 'Variable') {
398
- const scopeValue = scope[value.variableName];
399
- if (scopeValue == null) {
400
- // This transform does whole-program optimization, errors in
401
- // a single document could break invariants and/or cause
402
- // additional spurious errors.
403
- throw createNonRecoverableUserError(
404
- `Variable '$${value.variableName}' is not in scope.`,
405
- [errorContext[0]?.loc, value.loc].filter(Boolean),
406
- );
407
- }
408
- return scopeValue;
409
- } else if (value.kind === 'ObjectValue') {
410
- return {
411
- ...value,
412
- fields: value.fields.map(field => ({
413
- ...field,
414
- value: transformValue(scope, field.value, errorContext),
415
- })),
416
- };
417
- } else if (value.kind === 'ListValue') {
418
- return {
419
- ...value,
420
- items: value.items.map(item => transformValue(scope, item, errorContext)),
421
- };
422
- }
423
- return value;
424
- }
425
-
426
- /**
427
- * Apply arguments to a fragment, creating a new fragment (with the given name)
428
- * with all values recursively applied.
429
- */
430
- function transformFragment(
431
- context: CompilerContext,
432
- fragments: Map<string, PendingFragment>,
433
- parentScope: Scope,
434
- spread: FragmentSpread,
435
- args: $ReadOnlyArray<Argument>,
436
- errorContext: $ReadOnlyArray<IR>,
437
- ): ?Fragment {
438
- const schema = context.getSchema();
439
- const fragment = context.getFragment(spread.name, spread.loc);
440
- const argumentsHash = hashArguments(args, parentScope, errorContext);
441
- const fragmentName = argumentsHash
442
- ? `${fragment.name}_${argumentsHash}`
443
- : fragment.name;
444
- const appliedFragment = fragments.get(fragmentName);
445
- if (appliedFragment) {
446
- if (appliedFragment.kind === 'resolved') {
447
- return appliedFragment.value;
448
- } else {
449
- // This transform does whole-program optimization, errors in
450
- // a single document could break invariants and/or cause
451
- // additional spurious errors.
452
- throw createNonRecoverableUserError(
453
- `Found a circular reference from fragment '${fragment.name}'.`,
454
- errorContext.map(node => node.loc),
455
- );
456
- }
457
- }
458
- const fragmentScope = getFragmentScope(
459
- schema,
460
- fragment.argumentDefinitions,
461
- args,
462
- parentScope,
463
- spread,
464
- );
465
- // record that this fragment is pending to detect circular references
466
- fragments.set(fragmentName, {kind: 'pending'});
467
- let transformedFragment = null;
468
- const selections = transformSelections(
469
- context,
470
- fragments,
471
- fragmentScope,
472
- fragment.selections,
473
- errorContext,
474
- );
475
- if (selections) {
476
- transformedFragment = {
477
- ...fragment,
478
- selections,
479
- name: fragmentName,
480
- argumentDefinitions: [],
481
- };
482
- }
483
- fragments.set(fragmentName, {kind: 'resolved', value: transformedFragment});
484
- return transformedFragment;
485
- }
486
-
487
- function hashArguments(
488
- args: $ReadOnlyArray<Argument>,
489
- scope: Scope,
490
- errorContext: $ReadOnlyArray<IR>,
491
- ): ?string {
492
- if (!args.length) {
493
- return null;
494
- }
495
- const sortedArgs = [...args].sort((a, b) => {
496
- return a.name < b.name ? -1 : a.name > b.name ? 1 : 0;
497
- });
498
- const printedArgs = JSON.stringify(
499
- sortedArgs.map(arg => {
500
- let value;
501
- if (arg.value.kind === 'Variable') {
502
- value = scope[arg.value.variableName];
503
- if (value == null) {
504
- // This transform does whole-program optimization, errors in
505
- // a single document could break invariants and/or cause
506
- // additional spurious errors.
507
- throw createNonRecoverableUserError(
508
- `Variable '$${arg.value.variableName}' is not in scope.`,
509
- [errorContext[0]?.loc, arg.value.loc].filter(Boolean),
510
- );
511
- }
512
- } else {
513
- value = arg.value;
514
- }
515
- return {
516
- name: arg.name,
517
- value: getIdentifierForArgumentValue(value),
518
- };
519
- }),
520
- );
521
- return murmurHash(printedArgs);
522
- }
523
-
524
- module.exports = {
525
- transform: applyFragmentArgumentTransform,
526
- };