relay-compiler 0.0.0-main-8ff54d69 → 0.0.0-main-4467ae84

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