relay-compiler 7.0.0 → 9.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (242) hide show
  1. package/bin/RelayCompilerBin.js.flow +169 -0
  2. package/bin/RelayCompilerMain.js.flow +508 -0
  3. package/bin/__fixtures__/plugin-module.js.flow +17 -0
  4. package/bin/relay-compiler +8554 -8142
  5. package/codegen/CodegenDirectory.js.flow +375 -0
  6. package/codegen/CodegenRunner.js.flow +431 -0
  7. package/codegen/CodegenTypes.js.flow +28 -0
  8. package/codegen/CodegenWatcher.js.flow +254 -0
  9. package/codegen/NormalizationCodeGenerator.js.flow +499 -0
  10. package/codegen/ReaderCodeGenerator.js.flow +453 -0
  11. package/codegen/RelayCodeGenerator.js.flow +76 -0
  12. package/codegen/RelayFileWriter.js.flow +366 -0
  13. package/codegen/SourceControl.js.flow +58 -0
  14. package/codegen/compileRelayArtifacts.js.flow +182 -0
  15. package/codegen/createPrintRequireModuleDependency.js.flow +21 -0
  16. package/codegen/writeRelayGeneratedFile.js.flow +194 -0
  17. package/core/ASTCache.js.flow +73 -0
  18. package/core/ASTConvert.js.flow +233 -0
  19. package/core/CompilerContext.js.flow +190 -0
  20. package/core/CompilerError.js.flow +250 -0
  21. package/core/DotGraphQLParser.js.flow +39 -0
  22. package/core/GraphQLCompilerProfiler.js.flow +341 -0
  23. package/core/GraphQLDerivedFromMetadata.js.flow +48 -0
  24. package/core/GraphQLWatchmanClient.js.flow +111 -0
  25. package/core/IR.js.flow +329 -0
  26. package/core/IRPrinter.js.flow +488 -0
  27. package/core/IRTransformer.js.flow +377 -0
  28. package/core/IRValidator.js.flow +260 -0
  29. package/core/IRVisitor.js.flow +150 -0
  30. package/core/JSModuleParser.js.flow +24 -0
  31. package/core/RelayCompilerScope.js.flow +199 -0
  32. package/core/RelayFindGraphQLTags.js.flow +119 -0
  33. package/core/RelayGraphQLEnumsGenerator.js.flow +55 -0
  34. package/core/RelayIRTransforms.js.flow +130 -0
  35. package/core/RelayParser.js.flow +1759 -0
  36. package/core/RelaySourceModuleParser.js.flow +135 -0
  37. package/core/Schema.js.flow +1985 -0
  38. package/core/SchemaUtils.js.flow +109 -0
  39. package/core/filterContextForNode.js.flow +50 -0
  40. package/core/getFieldDefinition.js.flow +156 -0
  41. package/core/getIdentifierForArgumentValue.js.flow +49 -0
  42. package/core/getIdentifierForSelection.js.flow +69 -0
  43. package/core/getLiteralArgumentValues.js.flow +32 -0
  44. package/core/getNormalizationOperationName.js.flow +19 -0
  45. package/core/inferRootArgumentDefinitions.js.flow +323 -0
  46. package/index.js +1 -1
  47. package/index.js.flow +202 -0
  48. package/language/RelayLanguagePluginInterface.js.flow +283 -0
  49. package/language/javascript/FindGraphQLTags.js.flow +233 -0
  50. package/language/javascript/RelayFlowBabelFactories.js.flow +180 -0
  51. package/language/javascript/RelayFlowGenerator.js.flow +1040 -0
  52. package/language/javascript/RelayFlowTypeTransformers.js.flow +184 -0
  53. package/language/javascript/RelayLanguagePluginJavaScript.js.flow +34 -0
  54. package/language/javascript/formatGeneratedModule.js.flow +65 -0
  55. package/lib/bin/RelayCompilerBin.js +25 -7
  56. package/lib/bin/RelayCompilerMain.js +134 -125
  57. package/lib/bin/__fixtures__/plugin-module.js +1 -0
  58. package/lib/codegen/CodegenDirectory.js +14 -8
  59. package/lib/codegen/CodegenRunner.js +35 -75
  60. package/lib/codegen/CodegenTypes.js +1 -0
  61. package/lib/codegen/CodegenWatcher.js +14 -21
  62. package/lib/codegen/NormalizationCodeGenerator.js +80 -127
  63. package/lib/codegen/ReaderCodeGenerator.js +85 -111
  64. package/lib/codegen/RelayCodeGenerator.js +9 -6
  65. package/lib/codegen/RelayFileWriter.js +22 -41
  66. package/lib/codegen/SourceControl.js +1 -0
  67. package/lib/codegen/compileRelayArtifacts.js +18 -31
  68. package/lib/codegen/createPrintRequireModuleDependency.js +1 -0
  69. package/lib/codegen/writeRelayGeneratedFile.js +62 -90
  70. package/lib/core/ASTCache.js +4 -4
  71. package/lib/core/ASTConvert.js +1 -0
  72. package/lib/core/{GraphQLCompilerContext.js → CompilerContext.js} +10 -11
  73. package/lib/core/{RelayCompilerError.js → CompilerError.js} +29 -55
  74. package/lib/core/DotGraphQLParser.js +1 -0
  75. package/lib/core/GraphQLCompilerProfiler.js +9 -12
  76. package/lib/core/GraphQLDerivedFromMetadata.js +1 -0
  77. package/lib/core/GraphQLWatchmanClient.js +5 -12
  78. package/lib/core/{GraphQLIR.js → IR.js} +1 -0
  79. package/lib/core/{GraphQLIRPrinter.js → IRPrinter.js} +39 -17
  80. package/lib/core/{GraphQLIRTransformer.js → IRTransformer.js} +21 -16
  81. package/lib/core/{GraphQLIRValidator.js → IRValidator.js} +18 -10
  82. package/lib/core/{GraphQLIRVisitor.js → IRVisitor.js} +1 -2
  83. package/lib/core/JSModuleParser.js +18 -0
  84. package/lib/core/RelayCompilerScope.js +6 -5
  85. package/lib/core/RelayFindGraphQLTags.js +1 -0
  86. package/lib/core/RelayGraphQLEnumsGenerator.js +26 -12
  87. package/lib/core/RelayIRTransforms.js +12 -9
  88. package/lib/core/RelayParser.js +113 -75
  89. package/lib/core/RelaySourceModuleParser.js +4 -3
  90. package/lib/core/Schema.js +808 -317
  91. package/lib/core/SchemaUtils.js +1 -0
  92. package/lib/core/filterContextForNode.js +5 -4
  93. package/lib/core/getFieldDefinition.js +14 -16
  94. package/lib/core/getIdentifierForArgumentValue.js +18 -0
  95. package/lib/core/getIdentifierForSelection.js +4 -5
  96. package/lib/core/getLiteralArgumentValues.js +1 -0
  97. package/lib/core/getNormalizationOperationName.js +1 -0
  98. package/lib/core/inferRootArgumentDefinitions.js +79 -99
  99. package/lib/index.js +69 -19
  100. package/lib/language/RelayLanguagePluginInterface.js +1 -0
  101. package/lib/language/javascript/FindGraphQLTags.js +1 -0
  102. package/lib/language/javascript/RelayFlowBabelFactories.js +15 -0
  103. package/lib/language/javascript/RelayFlowGenerator.js +94 -173
  104. package/lib/language/javascript/RelayFlowTypeTransformers.js +2 -3
  105. package/lib/language/javascript/RelayLanguagePluginJavaScript.js +7 -4
  106. package/lib/language/javascript/formatGeneratedModule.js +14 -4
  107. package/lib/reporters/ConsoleReporter.js +2 -3
  108. package/lib/reporters/MultiReporter.js +2 -3
  109. package/lib/reporters/Reporter.js +1 -0
  110. package/lib/runner/Artifacts.js +327 -0
  111. package/lib/runner/BufferedFilesystem.js +265 -0
  112. package/lib/runner/GraphQLASTNodeGroup.js +260 -0
  113. package/lib/runner/GraphQLASTUtils.js +23 -0
  114. package/lib/runner/GraphQLNodeMap.js +85 -0
  115. package/lib/runner/Sources.js +266 -0
  116. package/lib/runner/StrictMap.js +136 -0
  117. package/lib/runner/compileArtifacts.js +39 -0
  118. package/lib/runner/extractAST.js +77 -0
  119. package/lib/runner/getChangedNodeNames.js +84 -0
  120. package/lib/runner/getSchemaInstance.js +30 -0
  121. package/lib/runner/types.js +12 -0
  122. package/lib/transforms/ApplyFragmentArgumentTransform.js +49 -55
  123. package/lib/transforms/ClientExtensionsTransform.js +11 -17
  124. package/lib/transforms/ConnectionTransform.js +35 -28
  125. package/lib/transforms/DeferStreamTransform.js +26 -74
  126. package/lib/transforms/DisallowIdAsAlias.js +5 -4
  127. package/lib/transforms/DisallowTypenameOnRoot.js +55 -0
  128. package/lib/transforms/FieldHandleTransform.js +8 -3
  129. package/lib/transforms/FilterDirectivesTransform.js +4 -3
  130. package/lib/transforms/FlattenTransform.js +23 -47
  131. package/lib/transforms/GenerateIDFieldTransform.js +9 -4
  132. package/lib/transforms/GenerateTypeNameTransform.js +8 -3
  133. package/lib/transforms/InlineDataFragmentTransform.js +11 -6
  134. package/lib/transforms/InlineFragmentsTransform.js +3 -2
  135. package/lib/transforms/MaskTransform.js +20 -19
  136. package/lib/transforms/MatchTransform.js +113 -34
  137. package/lib/transforms/RefetchableFragmentTransform.js +25 -41
  138. package/lib/transforms/RelayDirectiveTransform.js +13 -4
  139. package/lib/transforms/SkipClientExtensionsTransform.js +11 -2
  140. package/lib/transforms/SkipHandleFieldTransform.js +8 -3
  141. package/lib/transforms/SkipRedundantNodesTransform.js +9 -6
  142. package/lib/transforms/SkipSplitOperationTransform.js +32 -0
  143. package/lib/transforms/SkipUnreachableNodeTransform.js +12 -12
  144. package/lib/transforms/SkipUnusedVariablesTransform.js +19 -17
  145. package/lib/transforms/SplitModuleImportTransform.js +4 -3
  146. package/lib/transforms/TestOperationTransform.js +9 -6
  147. package/lib/transforms/TransformUtils.js +1 -0
  148. package/lib/transforms/ValidateGlobalVariablesTransform.js +20 -31
  149. package/lib/transforms/ValidateRequiredArgumentsTransform.js +17 -20
  150. package/lib/transforms/ValidateServerOnlyDirectivesTransform.js +20 -33
  151. package/lib/transforms/ValidateUnusedVariablesTransform.js +20 -31
  152. package/lib/transforms/query-generators/FetchableQueryGenerator.js +161 -0
  153. package/lib/transforms/query-generators/NodeQueryGenerator.js +9 -3
  154. package/lib/transforms/query-generators/QueryQueryGenerator.js +2 -0
  155. package/lib/transforms/query-generators/ViewerQueryGenerator.js +6 -3
  156. package/lib/transforms/query-generators/index.js +25 -7
  157. package/lib/transforms/query-generators/utils.js +13 -15
  158. package/lib/util/CodeMarker.js +1 -0
  159. package/lib/util/DefaultHandleKey.js +1 -0
  160. package/lib/util/RelayCompilerCache.js +2 -3
  161. package/lib/util/Rollout.js +1 -0
  162. package/lib/util/TimeReporter.js +83 -0
  163. package/lib/util/areEqualOSS.js +1 -0
  164. package/lib/util/dedupeJSONStringify.js +16 -12
  165. package/lib/util/getDefinitionNodeHash.js +22 -0
  166. package/lib/util/getModuleName.js +4 -5
  167. package/lib/util/joinArgumentDefinitions.js +2 -1
  168. package/lib/util/md5.js +17 -0
  169. package/lib/util/murmurHash.js +1 -0
  170. package/lib/util/nullthrowsOSS.js +1 -0
  171. package/lib/util/orList.js +2 -1
  172. package/lib/util/partitionArray.js +1 -0
  173. package/package.json +4 -4
  174. package/relay-compiler.js +4 -4
  175. package/relay-compiler.min.js +4 -4
  176. package/reporters/ConsoleReporter.js.flow +81 -0
  177. package/reporters/MultiReporter.js.flow +43 -0
  178. package/reporters/Reporter.js.flow +19 -0
  179. package/runner/Artifacts.js.flow +219 -0
  180. package/runner/BufferedFilesystem.js.flow +194 -0
  181. package/runner/GraphQLASTNodeGroup.js.flow +176 -0
  182. package/runner/GraphQLASTUtils.js.flow +26 -0
  183. package/runner/GraphQLNodeMap.js.flow +55 -0
  184. package/runner/Sources.js.flow +218 -0
  185. package/runner/StrictMap.js.flow +96 -0
  186. package/runner/compileArtifacts.js.flow +76 -0
  187. package/runner/extractAST.js.flow +100 -0
  188. package/runner/getChangedNodeNames.js.flow +48 -0
  189. package/runner/getSchemaInstance.js.flow +36 -0
  190. package/runner/types.js.flow +37 -0
  191. package/transforms/ApplyFragmentArgumentTransform.js.flow +474 -0
  192. package/transforms/ClientExtensionsTransform.js.flow +220 -0
  193. package/transforms/ConnectionTransform.js.flow +869 -0
  194. package/transforms/DeferStreamTransform.js.flow +258 -0
  195. package/transforms/DisallowIdAsAlias.js.flow +47 -0
  196. package/transforms/DisallowTypenameOnRoot.js.flow +45 -0
  197. package/transforms/FieldHandleTransform.js.flow +80 -0
  198. package/transforms/FilterDirectivesTransform.js.flow +45 -0
  199. package/transforms/FlattenTransform.js.flow +456 -0
  200. package/transforms/GenerateIDFieldTransform.js.flow +134 -0
  201. package/transforms/GenerateTypeNameTransform.js.flow +81 -0
  202. package/transforms/InlineDataFragmentTransform.js.flow +124 -0
  203. package/transforms/InlineFragmentsTransform.js.flow +71 -0
  204. package/transforms/MaskTransform.js.flow +126 -0
  205. package/transforms/MatchTransform.js.flow +583 -0
  206. package/transforms/RefetchableFragmentTransform.js.flow +272 -0
  207. package/transforms/RelayDirectiveTransform.js.flow +99 -0
  208. package/transforms/SkipClientExtensionsTransform.js.flow +54 -0
  209. package/transforms/SkipHandleFieldTransform.js.flow +44 -0
  210. package/transforms/SkipRedundantNodesTransform.js.flow +253 -0
  211. package/transforms/SkipSplitOperationTransform.js.flow +37 -0
  212. package/transforms/SkipUnreachableNodeTransform.js.flow +149 -0
  213. package/transforms/SkipUnusedVariablesTransform.js.flow +59 -0
  214. package/transforms/SplitModuleImportTransform.js.flow +98 -0
  215. package/transforms/TestOperationTransform.js.flow +138 -0
  216. package/transforms/TransformUtils.js.flow +26 -0
  217. package/transforms/ValidateGlobalVariablesTransform.js.flow +81 -0
  218. package/transforms/ValidateRequiredArgumentsTransform.js.flow +127 -0
  219. package/transforms/ValidateServerOnlyDirectivesTransform.js.flow +112 -0
  220. package/transforms/ValidateUnusedVariablesTransform.js.flow +89 -0
  221. package/transforms/query-generators/FetchableQueryGenerator.js.flow +190 -0
  222. package/transforms/query-generators/NodeQueryGenerator.js.flow +206 -0
  223. package/transforms/query-generators/QueryQueryGenerator.js.flow +57 -0
  224. package/transforms/query-generators/ViewerQueryGenerator.js.flow +97 -0
  225. package/transforms/query-generators/index.js.flow +90 -0
  226. package/transforms/query-generators/utils.js.flow +72 -0
  227. package/util/CodeMarker.js.flow +79 -0
  228. package/util/DefaultHandleKey.js.flow +17 -0
  229. package/util/RelayCompilerCache.js.flow +88 -0
  230. package/util/Rollout.js.flow +39 -0
  231. package/util/TimeReporter.js.flow +79 -0
  232. package/util/areEqualOSS.js.flow +123 -0
  233. package/util/dedupeJSONStringify.js.flow +152 -0
  234. package/util/getDefinitionNodeHash.js.flow +25 -0
  235. package/util/getModuleName.js.flow +39 -0
  236. package/util/joinArgumentDefinitions.js.flow +99 -0
  237. package/util/md5.js.flow +22 -0
  238. package/util/murmurHash.js.flow +94 -0
  239. package/util/nullthrowsOSS.js.flow +25 -0
  240. package/util/orList.js.flow +37 -0
  241. package/util/partitionArray.js.flow +37 -0
  242. package/lib/transforms/ConnectionFieldTransform.js +0 -275
@@ -0,0 +1,323 @@
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 strict-local
8
+ * @format
9
+ */
10
+
11
+ // flowlint ambiguous-object-type:error
12
+
13
+ 'use strict';
14
+
15
+ const CompilerContext = require('./CompilerContext');
16
+ const IRVisitor = require('./IRVisitor');
17
+ const SchemaUtils = require('./SchemaUtils');
18
+
19
+ const {createCompilerError} = require('./CompilerError');
20
+
21
+ import type {
22
+ Argument,
23
+ ArgumentDefinition,
24
+ Condition,
25
+ Defer,
26
+ Fragment,
27
+ FragmentSpread,
28
+ LinkedField,
29
+ Root,
30
+ SplitOperation,
31
+ Stream,
32
+ } from './IR';
33
+
34
+ type ArgumentMap = Map<string, ArgumentDefinition>;
35
+
36
+ /**
37
+ * Returns a transformed version of the input context where each document's
38
+ * argument definitions are updated to accurately describe the root variables
39
+ * used (or reachable) from that document:
40
+ * - Fragment argument definitions are updated to include local argument
41
+ * definitions and any root variables that are referenced
42
+ * by the fragment (or any fragments it transitively spreads).
43
+ * - Root argument definitions are updated to reflect the variables
44
+ * referenced locally and all root variables referenced by any
45
+ * fragments it (transitively) spreads.
46
+ */
47
+ function inferRootArgumentDefinitions(
48
+ context: CompilerContext,
49
+ ): CompilerContext {
50
+ // This transform does two main tasks:
51
+ // - Determine the set of root variables referenced locally in each
52
+ // fragment. Note that RootArgumentDefinitions in the fragment's
53
+ // argumentDefinitions can contain spurious entries for legacy
54
+ // reasons. Instead of using those the fragment is traversed
55
+ // to reanalyze variable usage.
56
+ // - Determine the set of root variables that are transitively referenced
57
+ // by each fragment, ie the union of all root variables used in the
58
+ // fragment and any fragments it transitively spreads.
59
+
60
+ // Cache fragments as they are transformed to avoid duplicate processing.
61
+ // Because @argument values don't matter (only variable names/types),
62
+ // each reachable fragment only has to be checked once.
63
+ const transformed = new Map<string, ArgumentMap>();
64
+ const nextContext = new CompilerContext(context.getSchema());
65
+ return nextContext.addAll(
66
+ Array.from(context.documents(), node => {
67
+ switch (node.kind) {
68
+ case 'Fragment': {
69
+ const argumentDefinitions = transformFragmentArguments(
70
+ context,
71
+ transformed,
72
+ node,
73
+ );
74
+ return ({
75
+ ...node,
76
+ argumentDefinitions: Array.from(argumentDefinitions.values()),
77
+ }: Fragment);
78
+ }
79
+ case 'Root': {
80
+ return transformRoot(context, transformed, node);
81
+ }
82
+ case 'SplitOperation': {
83
+ return (node: SplitOperation);
84
+ }
85
+ default: {
86
+ (node: empty);
87
+ throw createCompilerError(
88
+ `inferRootArgumentDefinitions: Unsupported kind '${node.kind}'.`,
89
+ );
90
+ }
91
+ }
92
+ }),
93
+ );
94
+ }
95
+
96
+ function transformRoot(
97
+ context: CompilerContext,
98
+ transformed: Map<string, ArgumentMap>,
99
+ root: Root,
100
+ ): Root {
101
+ // Ignore argument definitions, determine what root variables are
102
+ // transitively referenced
103
+ const argumentDefinitions = new Map();
104
+ const localArgumentDefinitions = new Map();
105
+ for (const [name, argDef] of root.argumentDefinitions.entries()) {
106
+ if (argDef.kind === 'LocalArgumentDefinition') {
107
+ localArgumentDefinitions.set(name, argDef);
108
+ }
109
+ }
110
+ visit(context, transformed, argumentDefinitions, root);
111
+ return {
112
+ ...root,
113
+ argumentDefinitions: Array.from(argumentDefinitions.values(), argDef => {
114
+ if (argDef.kind !== 'RootArgumentDefinition') {
115
+ throw createCompilerError(
116
+ `inferRootArgumentDefinitions: Expected inferred variable '\$${argDef.name}' to be a root variables.`,
117
+ [argDef.loc],
118
+ );
119
+ }
120
+ const localDefinition = localArgumentDefinitions.get(argDef.name);
121
+ const type = localDefinition?.type ?? argDef.type;
122
+ return {
123
+ defaultValue: localDefinition?.defaultValue ?? null,
124
+ kind: 'LocalArgumentDefinition',
125
+ loc: argDef.loc,
126
+ name: argDef.name,
127
+ type: type,
128
+ };
129
+ }),
130
+ };
131
+ }
132
+
133
+ function transformFragmentArguments(
134
+ context: CompilerContext,
135
+ transformed: Map<string, ArgumentMap>,
136
+ fragment: Fragment,
137
+ ): ArgumentMap {
138
+ const name = fragment.name;
139
+ const transformedArguments = transformed.get(name);
140
+ if (transformedArguments != null) {
141
+ return transformedArguments;
142
+ }
143
+ // Start with only the explicitly defined local arguments, recover the
144
+ // correct set of root variables excluding invalid @arguments values.
145
+ const argumentDefinitions: ArgumentMap = new Map();
146
+ fragment.argumentDefinitions.forEach(argDef => {
147
+ if (argDef.kind === 'LocalArgumentDefinition') {
148
+ argumentDefinitions.set(argDef.name, argDef);
149
+ }
150
+ });
151
+ // Break cycles by initially caching a version that only has local
152
+ // arguments. If the current fragment is reached again, it won't have
153
+ // any root variables to add to its parents. The traversal below will
154
+ // find any root variables and update the cached version of the
155
+ // fragment.
156
+ transformed.set(name, argumentDefinitions);
157
+ visit(context, transformed, argumentDefinitions, fragment);
158
+ transformed.set(name, argumentDefinitions);
159
+ return argumentDefinitions;
160
+ }
161
+
162
+ function visit(
163
+ context: CompilerContext,
164
+ transformed: Map<string, ArgumentMap>,
165
+ argumentDefinitions: ArgumentMap,
166
+ node: Fragment | Root,
167
+ ): void {
168
+ IRVisitor.visit(node, {
169
+ FragmentSpread(fragmentSpread: FragmentSpread) {
170
+ const fragment = context.getFragment(
171
+ fragmentSpread.name,
172
+ fragmentSpread.loc,
173
+ );
174
+ const referencedFragmentArguments = transformFragmentArguments(
175
+ context,
176
+ transformed,
177
+ fragment,
178
+ );
179
+ // Detect root variables being passed as the value of @arguments;
180
+ // recover the expected type from the corresponding argument definitions.
181
+ fragmentSpread.args.forEach(arg => {
182
+ const argDef = referencedFragmentArguments.get(arg.name);
183
+ if (
184
+ argDef != null &&
185
+ arg.value.kind === 'Variable' &&
186
+ !argumentDefinitions.has(arg.value.variableName)
187
+ ) {
188
+ argumentDefinitions.set(arg.value.variableName, {
189
+ kind: 'RootArgumentDefinition',
190
+ loc: {kind: 'Derived', source: arg.loc},
191
+ name: arg.value.variableName,
192
+ type: argDef.type,
193
+ });
194
+ }
195
+ });
196
+ // Merge any root variables referenced by the spread fragment
197
+ // into this (parent) fragment's arguments.
198
+ for (const argDef of referencedFragmentArguments.values()) {
199
+ if (argDef.kind === 'RootArgumentDefinition') {
200
+ argumentDefinitions.set(argDef.name, argDef);
201
+ }
202
+ }
203
+ },
204
+ Argument(argument: Argument) {
205
+ if (argument.value.kind === 'Literal') {
206
+ return false;
207
+ }
208
+ const values = [argument.value];
209
+ while (values.length > 0) {
210
+ const currentValue = values.pop();
211
+ if (currentValue.kind === 'Variable') {
212
+ const type = currentValue.type ?? argument.type;
213
+ if (type == null) {
214
+ continue;
215
+ }
216
+ if (!argumentDefinitions.has(currentValue.variableName)) {
217
+ // root variable
218
+ argumentDefinitions.set(currentValue.variableName, {
219
+ kind: 'RootArgumentDefinition',
220
+ loc: {kind: 'Derived', source: argument.loc},
221
+ name: currentValue.variableName,
222
+ type: type,
223
+ });
224
+ }
225
+ } else if (currentValue.kind === 'ObjectValue') {
226
+ currentValue.fields.forEach(fieldValue => {
227
+ if (fieldValue.value.kind !== 'Literal') {
228
+ values.push(fieldValue.value);
229
+ }
230
+ });
231
+ } else if (currentValue.kind === 'ListValue') {
232
+ currentValue.items.forEach(listValue => {
233
+ if (listValue.kind !== 'Literal') {
234
+ values.push(listValue);
235
+ }
236
+ });
237
+ }
238
+ }
239
+ return false;
240
+ },
241
+ Condition(condition: Condition) {
242
+ const variable = condition.condition;
243
+ if (variable.kind !== 'Variable') {
244
+ return;
245
+ }
246
+ const type =
247
+ variable.type ??
248
+ SchemaUtils.getNonNullBooleanInput(context.getSchema());
249
+ if (!argumentDefinitions.has(variable.variableName)) {
250
+ // root variable
251
+ argumentDefinitions.set(variable.variableName, {
252
+ kind: 'RootArgumentDefinition',
253
+ loc: {kind: 'Derived', source: variable.loc},
254
+ name: variable.variableName,
255
+ type: type,
256
+ });
257
+ }
258
+ },
259
+ Defer(defer: Defer) {
260
+ const variable = defer.if;
261
+ if (variable == null || variable.kind !== 'Variable') {
262
+ return;
263
+ }
264
+ const type =
265
+ variable.type ??
266
+ SchemaUtils.getNonNullBooleanInput(context.getSchema());
267
+ if (!argumentDefinitions.has(variable.variableName)) {
268
+ // root variable
269
+ argumentDefinitions.set(variable.variableName, {
270
+ kind: 'RootArgumentDefinition',
271
+ loc: {kind: 'Derived', source: variable.loc},
272
+ name: variable.variableName,
273
+ type: type,
274
+ });
275
+ }
276
+ },
277
+ Stream(stream: Stream) {
278
+ [stream.if, stream.initialCount].forEach(variable => {
279
+ if (variable == null || variable.kind !== 'Variable') {
280
+ return;
281
+ }
282
+
283
+ const type =
284
+ variable.type ??
285
+ SchemaUtils.getNonNullBooleanInput(context.getSchema());
286
+ if (!argumentDefinitions.has(variable.variableName)) {
287
+ // root variable
288
+ argumentDefinitions.set(variable.variableName, {
289
+ kind: 'RootArgumentDefinition',
290
+ loc: {kind: 'Derived', source: variable.loc},
291
+ name: variable.variableName,
292
+ type,
293
+ });
294
+ }
295
+ });
296
+ },
297
+ LinkedField(field: LinkedField) {
298
+ if (!field.handles) {
299
+ return;
300
+ }
301
+ field.handles.forEach(handle => {
302
+ const variable = handle.dynamicKey;
303
+ if (variable == null) {
304
+ return;
305
+ }
306
+ const type =
307
+ variable.type ??
308
+ SchemaUtils.getNullableStringInput(context.getSchema());
309
+ if (!argumentDefinitions.has(variable.variableName)) {
310
+ // root variable
311
+ argumentDefinitions.set(variable.variableName, {
312
+ kind: 'RootArgumentDefinition',
313
+ loc: {kind: 'Derived', source: variable.loc},
314
+ name: variable.variableName,
315
+ type: type,
316
+ });
317
+ }
318
+ });
319
+ },
320
+ });
321
+ }
322
+
323
+ module.exports = inferRootArgumentDefinitions;
package/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Relay v7.0.0
2
+ * Relay v9.1.0
3
3
  *
4
4
  * Copyright (c) Facebook, Inc. and its affiliates.
5
5
  *
package/index.js.flow ADDED
@@ -0,0 +1,202 @@
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 strict-local
8
+ * @format
9
+ */
10
+
11
+ // flowlint ambiguous-object-type:error
12
+
13
+ 'use strict';
14
+
15
+ const ASTCache = require('./core/ASTCache');
16
+ const ASTConvert = require('./core/ASTConvert');
17
+ const Artifacts = require('./runner/Artifacts');
18
+ const BufferedFilesystem = require('./runner/BufferedFilesystem');
19
+ const CodeMarker = require('./util/CodeMarker');
20
+ const CodegenDirectory = require('./codegen/CodegenDirectory');
21
+ const CodegenRunner = require('./codegen/CodegenRunner');
22
+ const CodegenWatcher = require('./codegen/CodegenWatcher');
23
+ const CompilerContext = require('./core/CompilerContext');
24
+ const CompilerError = require('./core/CompilerError');
25
+ const ConsoleReporter = require('./reporters/ConsoleReporter');
26
+ const DotGraphQLParser = require('./core/DotGraphQLParser');
27
+ const FindGraphQLTags = require('./language/javascript/FindGraphQLTags');
28
+ const GraphQLASTNodeGroup = require('./runner/GraphQLASTNodeGroup');
29
+ const GraphQLASTUtils = require('./runner/GraphQLASTUtils');
30
+ const GraphQLCompilerProfiler = require('./core/GraphQLCompilerProfiler');
31
+ const GraphQLNodeMap = require('./runner/GraphQLNodeMap');
32
+ const GraphQLWatchmanClient = require('./core/GraphQLWatchmanClient');
33
+ const IRPrinter = require('./core/IRPrinter');
34
+ const IRTransformer = require('./core/IRTransformer');
35
+ const IRVisitor = require('./core/IRVisitor');
36
+ const JSModuleParser = require('./core/JSModuleParser');
37
+ const MultiReporter = require('./reporters/MultiReporter');
38
+ const RelayCodeGenerator = require('./codegen/RelayCodeGenerator');
39
+ const RelayFileWriter = require('./codegen/RelayFileWriter');
40
+ const RelayFindGraphQLTags = require('./core/RelayFindGraphQLTags');
41
+ const RelayFlowGenerator = require('./language/javascript/RelayFlowGenerator');
42
+ const RelayIRTransforms = require('./core/RelayIRTransforms');
43
+ const RelayParser = require('./core/RelayParser');
44
+ const RelaySchema = require('./core/Schema');
45
+ const Rollout = require('./util/Rollout');
46
+ const SchemaUtils = require('./core/SchemaUtils');
47
+ const Sources = require('./runner/Sources');
48
+ const StrictMap = require('./runner/StrictMap');
49
+ const TimeReporter = require('./util/TimeReporter');
50
+
51
+ const compileArtifacts = require('./runner/compileArtifacts');
52
+ const compileRelayArtifacts = require('./codegen/compileRelayArtifacts');
53
+ const extractAST = require('./runner/extractAST');
54
+ const filterContextForNode = require('./core/filterContextForNode');
55
+ const getChangedNodeNames = require('./runner/getChangedNodeNames');
56
+ const getDefinitionNodeHash = require('./util/getDefinitionNodeHash');
57
+ const getIdentifierForArgumentValue = require('./core/getIdentifierForArgumentValue');
58
+ const getLiteralArgumentValues = require('./core/getLiteralArgumentValues');
59
+ const getNormalizationOperationName = require('./core/getNormalizationOperationName');
60
+ const getSchemaInstance = require('./runner/getSchemaInstance');
61
+ const md5 = require('./util/md5');
62
+ const writeRelayGeneratedFile = require('./codegen/writeRelayGeneratedFile');
63
+
64
+ const {main} = require('./bin/RelayCompilerMain');
65
+ const {SourceControlMercurial} = require('./codegen/SourceControl');
66
+ const {
67
+ getReaderSourceDefinitionName,
68
+ getSourceDefinitionName,
69
+ } = require('./core/GraphQLDerivedFromMetadata');
70
+ const {
71
+ formatGeneratedCommonjsModule: formatGeneratedModule,
72
+ } = require('./language/javascript/formatGeneratedModule');
73
+
74
+ export type {Filesystem} from './codegen/CodegenDirectory';
75
+ export type {
76
+ WriteFiles,
77
+ WriteFilesOptions,
78
+ ParserConfig,
79
+ WriterConfig,
80
+ } from './codegen/CodegenRunner';
81
+ export type {CompileResult, File} from './codegen/CodegenTypes';
82
+ export type {FileFilter, WatchmanExpression} from './codegen/CodegenWatcher';
83
+ export type {SourceControl} from './codegen/SourceControl';
84
+ export type {RelayCompilerTransforms} from './codegen/compileRelayArtifacts';
85
+ export type {IRTransform} from './core/CompilerContext';
86
+ export type {
87
+ Argument,
88
+ ArgumentDefinition,
89
+ ArgumentValue,
90
+ Condition,
91
+ Definition,
92
+ Directive,
93
+ Field,
94
+ Fragment,
95
+ FragmentSpread,
96
+ GeneratedDefinition,
97
+ Handle,
98
+ InlineFragment,
99
+ IR,
100
+ LinkedField,
101
+ ListValue,
102
+ Literal,
103
+ LocalArgumentDefinition,
104
+ ModuleImport,
105
+ Metadata,
106
+ Node,
107
+ ObjectFieldValue,
108
+ ObjectValue,
109
+ Request,
110
+ Root,
111
+ RootArgumentDefinition,
112
+ ScalarField,
113
+ Selection,
114
+ SplitOperation,
115
+ Variable,
116
+ } from './core/IR';
117
+ export type {Schema, TypeID, FieldID} from './core/Schema';
118
+ export type {
119
+ FormatModule,
120
+ TypeGenerator,
121
+ } from './language/RelayLanguagePluginInterface';
122
+ export type {Reporter} from './reporters/Reporter';
123
+ export type {
124
+ ArtifactMap,
125
+ ArtifactState,
126
+ SerializedArtifactState,
127
+ } from './runner/Artifacts';
128
+ export type {NodeGroup} from './runner/GraphQLASTNodeGroup';
129
+ export type {SourceChanges} from './runner/Sources';
130
+ export type {StrictMap} from './runner/StrictMap';
131
+ export type {ExtractFn} from './runner/extractAST';
132
+ export type {SavedStateCollection, WatchmanFile} from './runner/types';
133
+ export type {FlattenOptions} from './transforms/FlattenTransform';
134
+
135
+ module.exports = {
136
+ relayCompiler: main,
137
+
138
+ ASTConvert,
139
+ CodegenDirectory,
140
+ CodegenRunner,
141
+ CodegenWatcher,
142
+ CodeMarker,
143
+ CompilerContext,
144
+ CompilerError,
145
+ ConsoleReporter,
146
+ DotGraphQLParser,
147
+ ASTCache,
148
+ IRTransformer,
149
+ IRVisitor,
150
+ Printer: IRPrinter,
151
+ Profiler: GraphQLCompilerProfiler,
152
+ Rollout,
153
+ SchemaUtils,
154
+ SourceControlMercurial,
155
+ WatchmanClient: GraphQLWatchmanClient,
156
+
157
+ filterContextForNode,
158
+ getIdentifierForArgumentValue,
159
+ getNormalizationOperationName,
160
+ getLiteralArgumentValues,
161
+
162
+ Parser: RelayParser,
163
+ Schema: RelaySchema,
164
+ CodeGenerator: RelayCodeGenerator,
165
+ FlowGenerator: RelayFlowGenerator,
166
+
167
+ FileWriter: RelayFileWriter,
168
+ IRTransforms: RelayIRTransforms,
169
+ JSModuleParser,
170
+ MultiReporter,
171
+ Runner: CodegenRunner,
172
+ TimeReporter,
173
+ compileRelayArtifacts,
174
+ formatGeneratedModule,
175
+ convertASTDocuments: ASTConvert.convertASTDocuments,
176
+ transformASTSchema: ASTConvert.transformASTSchema,
177
+
178
+ getReaderSourceDefinitionName,
179
+ getSourceDefinitionName,
180
+
181
+ writeRelayGeneratedFile,
182
+
183
+ Sources,
184
+ __internal: {
185
+ Artifacts,
186
+ BufferedFilesystem,
187
+ GraphQLASTNodeGroup,
188
+ GraphQLASTUtils,
189
+ GraphQLNodeMap,
190
+ FindGraphQLTags,
191
+ StrictMap,
192
+ RelayFindGraphQLTags,
193
+ compileArtifacts,
194
+ extractFromJS: extractAST.extractFromJS,
195
+ getChangedNodeNames,
196
+ getDefinitionNodeHash,
197
+ getSchemaInstance,
198
+ md5,
199
+ parseExecutableNode: extractAST.parseExecutableNode,
200
+ toASTRecord: extractAST.toASTRecord,
201
+ },
202
+ };