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.
- package/bin/RelayCompilerBin.js.flow +169 -0
- package/bin/RelayCompilerMain.js.flow +508 -0
- package/bin/__fixtures__/plugin-module.js.flow +17 -0
- package/bin/relay-compiler +8554 -8142
- package/codegen/CodegenDirectory.js.flow +375 -0
- package/codegen/CodegenRunner.js.flow +431 -0
- package/codegen/CodegenTypes.js.flow +28 -0
- package/codegen/CodegenWatcher.js.flow +254 -0
- package/codegen/NormalizationCodeGenerator.js.flow +499 -0
- package/codegen/ReaderCodeGenerator.js.flow +453 -0
- package/codegen/RelayCodeGenerator.js.flow +76 -0
- package/codegen/RelayFileWriter.js.flow +366 -0
- package/codegen/SourceControl.js.flow +58 -0
- package/codegen/compileRelayArtifacts.js.flow +182 -0
- package/codegen/createPrintRequireModuleDependency.js.flow +21 -0
- package/codegen/writeRelayGeneratedFile.js.flow +194 -0
- package/core/ASTCache.js.flow +73 -0
- package/core/ASTConvert.js.flow +233 -0
- package/core/CompilerContext.js.flow +190 -0
- package/core/CompilerError.js.flow +250 -0
- package/core/DotGraphQLParser.js.flow +39 -0
- package/core/GraphQLCompilerProfiler.js.flow +341 -0
- package/core/GraphQLDerivedFromMetadata.js.flow +48 -0
- package/core/GraphQLWatchmanClient.js.flow +111 -0
- package/core/IR.js.flow +329 -0
- package/core/IRPrinter.js.flow +488 -0
- package/core/IRTransformer.js.flow +377 -0
- package/core/IRValidator.js.flow +260 -0
- package/core/IRVisitor.js.flow +150 -0
- package/core/JSModuleParser.js.flow +24 -0
- package/core/RelayCompilerScope.js.flow +199 -0
- package/core/RelayFindGraphQLTags.js.flow +119 -0
- package/core/RelayGraphQLEnumsGenerator.js.flow +55 -0
- package/core/RelayIRTransforms.js.flow +130 -0
- package/core/RelayParser.js.flow +1759 -0
- package/core/RelaySourceModuleParser.js.flow +135 -0
- package/core/Schema.js.flow +1985 -0
- package/core/SchemaUtils.js.flow +109 -0
- package/core/filterContextForNode.js.flow +50 -0
- package/core/getFieldDefinition.js.flow +156 -0
- package/core/getIdentifierForArgumentValue.js.flow +49 -0
- package/core/getIdentifierForSelection.js.flow +69 -0
- package/core/getLiteralArgumentValues.js.flow +32 -0
- package/core/getNormalizationOperationName.js.flow +19 -0
- package/core/inferRootArgumentDefinitions.js.flow +323 -0
- package/index.js +1 -1
- package/index.js.flow +202 -0
- package/language/RelayLanguagePluginInterface.js.flow +283 -0
- package/language/javascript/FindGraphQLTags.js.flow +233 -0
- package/language/javascript/RelayFlowBabelFactories.js.flow +180 -0
- package/language/javascript/RelayFlowGenerator.js.flow +1040 -0
- package/language/javascript/RelayFlowTypeTransformers.js.flow +184 -0
- package/language/javascript/RelayLanguagePluginJavaScript.js.flow +34 -0
- package/language/javascript/formatGeneratedModule.js.flow +65 -0
- package/lib/bin/RelayCompilerBin.js +25 -7
- package/lib/bin/RelayCompilerMain.js +134 -125
- package/lib/bin/__fixtures__/plugin-module.js +1 -0
- package/lib/codegen/CodegenDirectory.js +14 -8
- package/lib/codegen/CodegenRunner.js +35 -75
- package/lib/codegen/CodegenTypes.js +1 -0
- package/lib/codegen/CodegenWatcher.js +14 -21
- package/lib/codegen/NormalizationCodeGenerator.js +80 -127
- package/lib/codegen/ReaderCodeGenerator.js +85 -111
- package/lib/codegen/RelayCodeGenerator.js +9 -6
- package/lib/codegen/RelayFileWriter.js +22 -41
- package/lib/codegen/SourceControl.js +1 -0
- package/lib/codegen/compileRelayArtifacts.js +18 -31
- package/lib/codegen/createPrintRequireModuleDependency.js +1 -0
- package/lib/codegen/writeRelayGeneratedFile.js +62 -90
- package/lib/core/ASTCache.js +4 -4
- package/lib/core/ASTConvert.js +1 -0
- package/lib/core/{GraphQLCompilerContext.js → CompilerContext.js} +10 -11
- package/lib/core/{RelayCompilerError.js → CompilerError.js} +29 -55
- package/lib/core/DotGraphQLParser.js +1 -0
- package/lib/core/GraphQLCompilerProfiler.js +9 -12
- package/lib/core/GraphQLDerivedFromMetadata.js +1 -0
- package/lib/core/GraphQLWatchmanClient.js +5 -12
- package/lib/core/{GraphQLIR.js → IR.js} +1 -0
- package/lib/core/{GraphQLIRPrinter.js → IRPrinter.js} +39 -17
- package/lib/core/{GraphQLIRTransformer.js → IRTransformer.js} +21 -16
- package/lib/core/{GraphQLIRValidator.js → IRValidator.js} +18 -10
- package/lib/core/{GraphQLIRVisitor.js → IRVisitor.js} +1 -2
- package/lib/core/JSModuleParser.js +18 -0
- package/lib/core/RelayCompilerScope.js +6 -5
- package/lib/core/RelayFindGraphQLTags.js +1 -0
- package/lib/core/RelayGraphQLEnumsGenerator.js +26 -12
- package/lib/core/RelayIRTransforms.js +12 -9
- package/lib/core/RelayParser.js +113 -75
- package/lib/core/RelaySourceModuleParser.js +4 -3
- package/lib/core/Schema.js +808 -317
- package/lib/core/SchemaUtils.js +1 -0
- package/lib/core/filterContextForNode.js +5 -4
- package/lib/core/getFieldDefinition.js +14 -16
- package/lib/core/getIdentifierForArgumentValue.js +18 -0
- package/lib/core/getIdentifierForSelection.js +4 -5
- package/lib/core/getLiteralArgumentValues.js +1 -0
- package/lib/core/getNormalizationOperationName.js +1 -0
- package/lib/core/inferRootArgumentDefinitions.js +79 -99
- package/lib/index.js +69 -19
- package/lib/language/RelayLanguagePluginInterface.js +1 -0
- package/lib/language/javascript/FindGraphQLTags.js +1 -0
- package/lib/language/javascript/RelayFlowBabelFactories.js +15 -0
- package/lib/language/javascript/RelayFlowGenerator.js +94 -173
- package/lib/language/javascript/RelayFlowTypeTransformers.js +2 -3
- package/lib/language/javascript/RelayLanguagePluginJavaScript.js +7 -4
- package/lib/language/javascript/formatGeneratedModule.js +14 -4
- package/lib/reporters/ConsoleReporter.js +2 -3
- package/lib/reporters/MultiReporter.js +2 -3
- package/lib/reporters/Reporter.js +1 -0
- package/lib/runner/Artifacts.js +327 -0
- package/lib/runner/BufferedFilesystem.js +265 -0
- package/lib/runner/GraphQLASTNodeGroup.js +260 -0
- package/lib/runner/GraphQLASTUtils.js +23 -0
- package/lib/runner/GraphQLNodeMap.js +85 -0
- package/lib/runner/Sources.js +266 -0
- package/lib/runner/StrictMap.js +136 -0
- package/lib/runner/compileArtifacts.js +39 -0
- package/lib/runner/extractAST.js +77 -0
- package/lib/runner/getChangedNodeNames.js +84 -0
- package/lib/runner/getSchemaInstance.js +30 -0
- package/lib/runner/types.js +12 -0
- package/lib/transforms/ApplyFragmentArgumentTransform.js +49 -55
- package/lib/transforms/ClientExtensionsTransform.js +11 -17
- package/lib/transforms/ConnectionTransform.js +35 -28
- package/lib/transforms/DeferStreamTransform.js +26 -74
- package/lib/transforms/DisallowIdAsAlias.js +5 -4
- package/lib/transforms/DisallowTypenameOnRoot.js +55 -0
- package/lib/transforms/FieldHandleTransform.js +8 -3
- package/lib/transforms/FilterDirectivesTransform.js +4 -3
- package/lib/transforms/FlattenTransform.js +23 -47
- package/lib/transforms/GenerateIDFieldTransform.js +9 -4
- package/lib/transforms/GenerateTypeNameTransform.js +8 -3
- package/lib/transforms/InlineDataFragmentTransform.js +11 -6
- package/lib/transforms/InlineFragmentsTransform.js +3 -2
- package/lib/transforms/MaskTransform.js +20 -19
- package/lib/transforms/MatchTransform.js +113 -34
- package/lib/transforms/RefetchableFragmentTransform.js +25 -41
- package/lib/transforms/RelayDirectiveTransform.js +13 -4
- package/lib/transforms/SkipClientExtensionsTransform.js +11 -2
- package/lib/transforms/SkipHandleFieldTransform.js +8 -3
- package/lib/transforms/SkipRedundantNodesTransform.js +9 -6
- package/lib/transforms/SkipSplitOperationTransform.js +32 -0
- package/lib/transforms/SkipUnreachableNodeTransform.js +12 -12
- package/lib/transforms/SkipUnusedVariablesTransform.js +19 -17
- package/lib/transforms/SplitModuleImportTransform.js +4 -3
- package/lib/transforms/TestOperationTransform.js +9 -6
- package/lib/transforms/TransformUtils.js +1 -0
- package/lib/transforms/ValidateGlobalVariablesTransform.js +20 -31
- package/lib/transforms/ValidateRequiredArgumentsTransform.js +17 -20
- package/lib/transforms/ValidateServerOnlyDirectivesTransform.js +20 -33
- package/lib/transforms/ValidateUnusedVariablesTransform.js +20 -31
- package/lib/transforms/query-generators/FetchableQueryGenerator.js +161 -0
- package/lib/transforms/query-generators/NodeQueryGenerator.js +9 -3
- package/lib/transforms/query-generators/QueryQueryGenerator.js +2 -0
- package/lib/transforms/query-generators/ViewerQueryGenerator.js +6 -3
- package/lib/transforms/query-generators/index.js +25 -7
- package/lib/transforms/query-generators/utils.js +13 -15
- package/lib/util/CodeMarker.js +1 -0
- package/lib/util/DefaultHandleKey.js +1 -0
- package/lib/util/RelayCompilerCache.js +2 -3
- package/lib/util/Rollout.js +1 -0
- package/lib/util/TimeReporter.js +83 -0
- package/lib/util/areEqualOSS.js +1 -0
- package/lib/util/dedupeJSONStringify.js +16 -12
- package/lib/util/getDefinitionNodeHash.js +22 -0
- package/lib/util/getModuleName.js +4 -5
- package/lib/util/joinArgumentDefinitions.js +2 -1
- package/lib/util/md5.js +17 -0
- package/lib/util/murmurHash.js +1 -0
- package/lib/util/nullthrowsOSS.js +1 -0
- package/lib/util/orList.js +2 -1
- package/lib/util/partitionArray.js +1 -0
- package/package.json +4 -4
- package/relay-compiler.js +4 -4
- package/relay-compiler.min.js +4 -4
- package/reporters/ConsoleReporter.js.flow +81 -0
- package/reporters/MultiReporter.js.flow +43 -0
- package/reporters/Reporter.js.flow +19 -0
- package/runner/Artifacts.js.flow +219 -0
- package/runner/BufferedFilesystem.js.flow +194 -0
- package/runner/GraphQLASTNodeGroup.js.flow +176 -0
- package/runner/GraphQLASTUtils.js.flow +26 -0
- package/runner/GraphQLNodeMap.js.flow +55 -0
- package/runner/Sources.js.flow +218 -0
- package/runner/StrictMap.js.flow +96 -0
- package/runner/compileArtifacts.js.flow +76 -0
- package/runner/extractAST.js.flow +100 -0
- package/runner/getChangedNodeNames.js.flow +48 -0
- package/runner/getSchemaInstance.js.flow +36 -0
- package/runner/types.js.flow +37 -0
- package/transforms/ApplyFragmentArgumentTransform.js.flow +474 -0
- package/transforms/ClientExtensionsTransform.js.flow +220 -0
- package/transforms/ConnectionTransform.js.flow +869 -0
- package/transforms/DeferStreamTransform.js.flow +258 -0
- package/transforms/DisallowIdAsAlias.js.flow +47 -0
- package/transforms/DisallowTypenameOnRoot.js.flow +45 -0
- package/transforms/FieldHandleTransform.js.flow +80 -0
- package/transforms/FilterDirectivesTransform.js.flow +45 -0
- package/transforms/FlattenTransform.js.flow +456 -0
- package/transforms/GenerateIDFieldTransform.js.flow +134 -0
- package/transforms/GenerateTypeNameTransform.js.flow +81 -0
- package/transforms/InlineDataFragmentTransform.js.flow +124 -0
- package/transforms/InlineFragmentsTransform.js.flow +71 -0
- package/transforms/MaskTransform.js.flow +126 -0
- package/transforms/MatchTransform.js.flow +583 -0
- package/transforms/RefetchableFragmentTransform.js.flow +272 -0
- package/transforms/RelayDirectiveTransform.js.flow +99 -0
- package/transforms/SkipClientExtensionsTransform.js.flow +54 -0
- package/transforms/SkipHandleFieldTransform.js.flow +44 -0
- package/transforms/SkipRedundantNodesTransform.js.flow +253 -0
- package/transforms/SkipSplitOperationTransform.js.flow +37 -0
- package/transforms/SkipUnreachableNodeTransform.js.flow +149 -0
- package/transforms/SkipUnusedVariablesTransform.js.flow +59 -0
- package/transforms/SplitModuleImportTransform.js.flow +98 -0
- package/transforms/TestOperationTransform.js.flow +138 -0
- package/transforms/TransformUtils.js.flow +26 -0
- package/transforms/ValidateGlobalVariablesTransform.js.flow +81 -0
- package/transforms/ValidateRequiredArgumentsTransform.js.flow +127 -0
- package/transforms/ValidateServerOnlyDirectivesTransform.js.flow +112 -0
- package/transforms/ValidateUnusedVariablesTransform.js.flow +89 -0
- package/transforms/query-generators/FetchableQueryGenerator.js.flow +190 -0
- package/transforms/query-generators/NodeQueryGenerator.js.flow +206 -0
- package/transforms/query-generators/QueryQueryGenerator.js.flow +57 -0
- package/transforms/query-generators/ViewerQueryGenerator.js.flow +97 -0
- package/transforms/query-generators/index.js.flow +90 -0
- package/transforms/query-generators/utils.js.flow +72 -0
- package/util/CodeMarker.js.flow +79 -0
- package/util/DefaultHandleKey.js.flow +17 -0
- package/util/RelayCompilerCache.js.flow +88 -0
- package/util/Rollout.js.flow +39 -0
- package/util/TimeReporter.js.flow +79 -0
- package/util/areEqualOSS.js.flow +123 -0
- package/util/dedupeJSONStringify.js.flow +152 -0
- package/util/getDefinitionNodeHash.js.flow +25 -0
- package/util/getModuleName.js.flow +39 -0
- package/util/joinArgumentDefinitions.js.flow +99 -0
- package/util/md5.js.flow +22 -0
- package/util/murmurHash.js.flow +94 -0
- package/util/nullthrowsOSS.js.flow +25 -0
- package/util/orList.js.flow +37 -0
- package/util/partitionArray.js.flow +37 -0
- 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
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
|
+
};
|