relay-compiler 0.0.0-main-8ff54d69 → 0.0.0-main-38f1c96e
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cli.js +23 -0
- package/index.js +19 -3
- package/linux-x64/relay +0 -0
- package/macos-x64/relay +0 -0
- package/package.json +2 -24
- package/win-x64/relay.exe +0 -0
- package/bin/RelayCompilerBin.js.flow +0 -168
- package/bin/RelayCompilerMain.js.flow +0 -515
- package/bin/__fixtures__/plugin-module.js.flow +0 -17
- package/bin/relay-compiler +0 -19068
- package/codegen/CodegenDirectory.js.flow +0 -372
- package/codegen/CodegenRunner.js.flow +0 -424
- package/codegen/CodegenTypes.js.flow +0 -28
- package/codegen/CodegenWatcher.js.flow +0 -250
- package/codegen/NormalizationCodeGenerator.js.flow +0 -566
- package/codegen/ReaderCodeGenerator.js.flow +0 -510
- package/codegen/RelayCodeGenerator.js.flow +0 -85
- package/codegen/RelayFileWriter.js.flow +0 -365
- package/codegen/SourceControl.js.flow +0 -58
- package/codegen/compileRelayArtifacts.js.flow +0 -181
- package/codegen/createPrintRequireModuleDependency.js.flow +0 -19
- package/codegen/sortObjectByKey.js.flow +0 -25
- package/codegen/writeRelayGeneratedFile.js.flow +0 -235
- package/core/ASTCache.js.flow +0 -73
- package/core/ASTConvert.js.flow +0 -230
- package/core/CompilerContext.js.flow +0 -189
- package/core/CompilerError.js.flow +0 -255
- package/core/DotGraphQLParser.js.flow +0 -37
- package/core/GraphQLCompilerProfiler.js.flow +0 -341
- package/core/GraphQLDerivedFromMetadata.js.flow +0 -36
- package/core/GraphQLWatchmanClient.js.flow +0 -109
- package/core/IR.js.flow +0 -326
- package/core/IRPrinter.js.flow +0 -472
- package/core/IRTransformer.js.flow +0 -376
- package/core/IRValidator.js.flow +0 -259
- package/core/IRVisitor.js.flow +0 -150
- package/core/JSModuleParser.js.flow +0 -24
- package/core/RelayCompilerScope.js.flow +0 -199
- package/core/RelayFindGraphQLTags.js.flow +0 -118
- package/core/RelayGraphQLEnumsGenerator.js.flow +0 -55
- package/core/RelayIRTransforms.js.flow +0 -138
- package/core/RelayParser.js.flow +0 -1741
- package/core/RelaySourceModuleParser.js.flow +0 -133
- package/core/Schema.js.flow +0 -2035
- package/core/SchemaUtils.js.flow +0 -120
- package/core/filterContextForNode.js.flow +0 -49
- package/core/getFieldDefinition.js.flow +0 -156
- package/core/getIdentifierForArgumentValue.js.flow +0 -49
- package/core/getIdentifierForSelection.js.flow +0 -68
- package/core/getLiteralArgumentValues.js.flow +0 -32
- package/core/getNormalizationOperationName.js.flow +0 -19
- package/core/inferRootArgumentDefinitions.js.flow +0 -322
- package/index.js.flow +0 -198
- package/language/RelayLanguagePluginInterface.js.flow +0 -283
- package/language/javascript/FindGraphQLTags.js.flow +0 -136
- package/language/javascript/RelayFlowBabelFactories.js.flow +0 -176
- package/language/javascript/RelayFlowGenerator.js.flow +0 -1096
- package/language/javascript/RelayFlowTypeTransformers.js.flow +0 -181
- package/language/javascript/RelayLanguagePluginJavaScript.js.flow +0 -33
- package/language/javascript/formatGeneratedModule.js.flow +0 -65
- package/lib/bin/RelayCompilerBin.js +0 -143
- package/lib/bin/RelayCompilerMain.js +0 -488
- package/lib/bin/__fixtures__/plugin-module.js +0 -16
- package/lib/codegen/CodegenDirectory.js +0 -335
- package/lib/codegen/CodegenRunner.js +0 -433
- package/lib/codegen/CodegenTypes.js +0 -11
- package/lib/codegen/CodegenWatcher.js +0 -271
- package/lib/codegen/NormalizationCodeGenerator.js +0 -487
- package/lib/codegen/ReaderCodeGenerator.js +0 -473
- package/lib/codegen/RelayCodeGenerator.js +0 -75
- package/lib/codegen/RelayFileWriter.js +0 -270
- package/lib/codegen/SourceControl.js +0 -60
- package/lib/codegen/compileRelayArtifacts.js +0 -157
- package/lib/codegen/createPrintRequireModuleDependency.js +0 -19
- package/lib/codegen/sortObjectByKey.js +0 -41
- package/lib/codegen/writeRelayGeneratedFile.js +0 -206
- package/lib/core/ASTCache.js +0 -70
- package/lib/core/ASTConvert.js +0 -198
- package/lib/core/CompilerContext.js +0 -165
- package/lib/core/CompilerError.js +0 -252
- package/lib/core/DotGraphQLParser.js +0 -40
- package/lib/core/GraphQLCompilerProfiler.js +0 -299
- package/lib/core/GraphQLDerivedFromMetadata.js +0 -31
- package/lib/core/GraphQLWatchmanClient.js +0 -150
- package/lib/core/IR.js +0 -11
- package/lib/core/IRPrinter.js +0 -388
- package/lib/core/IRTransformer.js +0 -345
- package/lib/core/IRValidator.js +0 -226
- package/lib/core/IRVisitor.js +0 -45
- package/lib/core/JSModuleParser.js +0 -18
- package/lib/core/RelayCompilerScope.js +0 -183
- package/lib/core/RelayFindGraphQLTags.js +0 -79
- package/lib/core/RelayGraphQLEnumsGenerator.js +0 -50
- package/lib/core/RelayIRTransforms.js +0 -109
- package/lib/core/RelayParser.js +0 -1381
- package/lib/core/RelaySourceModuleParser.js +0 -104
- package/lib/core/Schema.js +0 -1877
- package/lib/core/SchemaUtils.js +0 -98
- package/lib/core/filterContextForNode.js +0 -50
- package/lib/core/getFieldDefinition.js +0 -145
- package/lib/core/getIdentifierForArgumentValue.js +0 -54
- package/lib/core/getIdentifierForSelection.js +0 -49
- package/lib/core/getLiteralArgumentValues.js +0 -26
- package/lib/core/getNormalizationOperationName.js +0 -17
- package/lib/core/inferRootArgumentDefinitions.js +0 -351
- package/lib/index.js +0 -178
- package/lib/language/RelayLanguagePluginInterface.js +0 -26
- package/lib/language/javascript/FindGraphQLTags.js +0 -126
- package/lib/language/javascript/RelayFlowBabelFactories.js +0 -160
- package/lib/language/javascript/RelayFlowGenerator.js +0 -856
- package/lib/language/javascript/RelayFlowTypeTransformers.js +0 -119
- package/lib/language/javascript/RelayLanguagePluginJavaScript.js +0 -30
- package/lib/language/javascript/formatGeneratedModule.js +0 -36
- package/lib/reporters/ConsoleReporter.js +0 -61
- package/lib/reporters/MultiReporter.js +0 -45
- package/lib/reporters/Reporter.js +0 -11
- package/lib/runner/Artifacts.js +0 -323
- package/lib/runner/BufferedFilesystem.js +0 -262
- package/lib/runner/GraphQLASTNodeGroup.js +0 -256
- package/lib/runner/GraphQLASTUtils.js +0 -23
- package/lib/runner/GraphQLNodeMap.js +0 -81
- package/lib/runner/Sources.js +0 -271
- package/lib/runner/StrictMap.js +0 -134
- package/lib/runner/compileArtifacts.js +0 -39
- package/lib/runner/extractAST.js +0 -77
- package/lib/runner/getChangedNodeNames.js +0 -82
- package/lib/runner/getSchemaInstance.js +0 -30
- package/lib/runner/types.js +0 -12
- package/lib/test-utils/TestSchema.js +0 -27
- package/lib/test-utils/parseGraphQLText.js +0 -30
- package/lib/transforms/ApplyFragmentArgumentTransform.js +0 -393
- package/lib/transforms/ClientExtensionsTransform.js +0 -221
- package/lib/transforms/ConnectionTransform.js +0 -639
- package/lib/transforms/DeclarativeConnectionMutationTransform.js +0 -218
- package/lib/transforms/DeferStreamTransform.js +0 -246
- package/lib/transforms/DisallowIdAsAlias.js +0 -40
- package/lib/transforms/DisallowTypenameOnRoot.js +0 -53
- package/lib/transforms/FieldHandleTransform.js +0 -79
- package/lib/transforms/FilterCompilerDirectivesTransform.js +0 -29
- package/lib/transforms/FilterDirectivesTransform.js +0 -42
- package/lib/transforms/FlattenTransform.js +0 -306
- package/lib/transforms/GenerateIDFieldTransform.js +0 -135
- package/lib/transforms/GenerateTypeNameTransform.js +0 -149
- package/lib/transforms/InlineDataFragmentTransform.js +0 -100
- package/lib/transforms/InlineFragmentsTransform.js +0 -61
- package/lib/transforms/MaskTransform.js +0 -117
- package/lib/transforms/MatchTransform.js +0 -434
- package/lib/transforms/ReactFlightComponentTransform.js +0 -158
- package/lib/transforms/RefetchableFragmentTransform.js +0 -249
- package/lib/transforms/RelayDirectiveTransform.js +0 -83
- package/lib/transforms/RequiredFieldTransform.js +0 -369
- package/lib/transforms/SkipClientExtensionsTransform.js +0 -46
- package/lib/transforms/SkipHandleFieldTransform.js +0 -45
- package/lib/transforms/SkipRedundantNodesTransform.js +0 -261
- package/lib/transforms/SkipSplitOperationTransform.js +0 -32
- package/lib/transforms/SkipUnreachableNodeTransform.js +0 -158
- package/lib/transforms/SkipUnusedVariablesTransform.js +0 -75
- package/lib/transforms/SplitModuleImportTransform.js +0 -82
- package/lib/transforms/TestOperationTransform.js +0 -144
- package/lib/transforms/TransformUtils.js +0 -21
- package/lib/transforms/ValidateGlobalVariablesTransform.js +0 -92
- package/lib/transforms/ValidateRequiredArgumentsTransform.js +0 -114
- package/lib/transforms/ValidateServerOnlyDirectivesTransform.js +0 -108
- package/lib/transforms/ValidateUnusedVariablesTransform.js +0 -96
- package/lib/transforms/query-generators/FetchableQueryGenerator.js +0 -157
- package/lib/transforms/query-generators/NodeQueryGenerator.js +0 -166
- package/lib/transforms/query-generators/QueryQueryGenerator.js +0 -48
- package/lib/transforms/query-generators/ViewerQueryGenerator.js +0 -77
- package/lib/transforms/query-generators/index.js +0 -60
- package/lib/transforms/query-generators/utils.js +0 -92
- package/lib/util/CodeMarker.js +0 -80
- package/lib/util/DefaultHandleKey.js +0 -15
- package/lib/util/RelayCompilerCache.js +0 -97
- package/lib/util/Rollout.js +0 -40
- package/lib/util/TimeReporter.js +0 -83
- package/lib/util/areEqualArgValues.js +0 -135
- package/lib/util/argumentContainsVariables.js +0 -37
- package/lib/util/dedupeJSONStringify.js +0 -160
- package/lib/util/generateAbstractTypeRefinementKey.js +0 -24
- package/lib/util/getDefinitionNodeHash.js +0 -22
- package/lib/util/getModuleName.js +0 -32
- package/lib/util/joinArgumentDefinitions.js +0 -67
- package/lib/util/md5.js +0 -17
- package/lib/util/murmurHash.js +0 -86
- package/lib/util/nullthrowsOSS.js +0 -23
- package/lib/util/orList.js +0 -36
- package/lib/util/partitionArray.js +0 -35
- package/relay-compiler.js +0 -17
- package/relay-compiler.min.js +0 -22
- package/reporters/ConsoleReporter.js.flow +0 -81
- package/reporters/MultiReporter.js.flow +0 -43
- package/reporters/Reporter.js.flow +0 -19
- package/runner/Artifacts.js.flow +0 -215
- package/runner/BufferedFilesystem.js.flow +0 -194
- package/runner/GraphQLASTNodeGroup.js.flow +0 -174
- package/runner/GraphQLASTUtils.js.flow +0 -26
- package/runner/GraphQLNodeMap.js.flow +0 -55
- package/runner/Sources.js.flow +0 -227
- package/runner/StrictMap.js.flow +0 -96
- package/runner/compileArtifacts.js.flow +0 -75
- package/runner/extractAST.js.flow +0 -98
- package/runner/getChangedNodeNames.js.flow +0 -48
- package/runner/getSchemaInstance.js.flow +0 -36
- package/runner/types.js.flow +0 -37
- package/test-utils/TestSchema.js.flow +0 -30
- package/test-utils/parseGraphQLText.js.flow +0 -41
- package/transforms/ApplyFragmentArgumentTransform.js.flow +0 -524
- package/transforms/ClientExtensionsTransform.js.flow +0 -224
- package/transforms/ConnectionTransform.js.flow +0 -850
- package/transforms/DeclarativeConnectionMutationTransform.js.flow +0 -245
- package/transforms/DeferStreamTransform.js.flow +0 -263
- package/transforms/DisallowIdAsAlias.js.flow +0 -46
- package/transforms/DisallowTypenameOnRoot.js.flow +0 -44
- package/transforms/FieldHandleTransform.js.flow +0 -77
- package/transforms/FilterCompilerDirectivesTransform.js.flow +0 -33
- package/transforms/FilterDirectivesTransform.js.flow +0 -45
- package/transforms/FlattenTransform.js.flow +0 -458
- package/transforms/GenerateIDFieldTransform.js.flow +0 -151
- package/transforms/GenerateTypeNameTransform.js.flow +0 -159
- package/transforms/InlineDataFragmentTransform.js.flow +0 -123
- package/transforms/InlineFragmentsTransform.js.flow +0 -70
- package/transforms/MaskTransform.js.flow +0 -124
- package/transforms/MatchTransform.js.flow +0 -587
- package/transforms/ReactFlightComponentTransform.js.flow +0 -207
- package/transforms/RefetchableFragmentTransform.js.flow +0 -266
- package/transforms/RelayDirectiveTransform.js.flow +0 -96
- package/transforms/RequiredFieldTransform.js.flow +0 -413
- package/transforms/SkipClientExtensionsTransform.js.flow +0 -54
- package/transforms/SkipHandleFieldTransform.js.flow +0 -44
- package/transforms/SkipRedundantNodesTransform.js.flow +0 -277
- package/transforms/SkipSplitOperationTransform.js.flow +0 -37
- package/transforms/SkipUnreachableNodeTransform.js.flow +0 -148
- package/transforms/SkipUnusedVariablesTransform.js.flow +0 -59
- package/transforms/SplitModuleImportTransform.js.flow +0 -97
- package/transforms/TestOperationTransform.js.flow +0 -142
- package/transforms/TransformUtils.js.flow +0 -26
- package/transforms/ValidateGlobalVariablesTransform.js.flow +0 -80
- package/transforms/ValidateRequiredArgumentsTransform.js.flow +0 -130
- package/transforms/ValidateServerOnlyDirectivesTransform.js.flow +0 -128
- package/transforms/ValidateUnusedVariablesTransform.js.flow +0 -88
- package/transforms/query-generators/FetchableQueryGenerator.js.flow +0 -188
- package/transforms/query-generators/NodeQueryGenerator.js.flow +0 -217
- package/transforms/query-generators/QueryQueryGenerator.js.flow +0 -57
- package/transforms/query-generators/ViewerQueryGenerator.js.flow +0 -97
- package/transforms/query-generators/index.js.flow +0 -89
- package/transforms/query-generators/utils.js.flow +0 -76
- package/util/CodeMarker.js.flow +0 -79
- package/util/DefaultHandleKey.js.flow +0 -17
- package/util/RelayCompilerCache.js.flow +0 -86
- package/util/Rollout.js.flow +0 -39
- package/util/TimeReporter.js.flow +0 -79
- package/util/areEqualArgValues.js.flow +0 -126
- package/util/argumentContainsVariables.js.flow +0 -38
- package/util/dedupeJSONStringify.js.flow +0 -156
- package/util/generateAbstractTypeRefinementKey.js.flow +0 -29
- package/util/getDefinitionNodeHash.js.flow +0 -24
- package/util/getModuleName.js.flow +0 -39
- package/util/joinArgumentDefinitions.js.flow +0 -105
- package/util/md5.js.flow +0 -19
- package/util/murmurHash.js.flow +0 -94
- package/util/nullthrowsOSS.js.flow +0 -25
- package/util/orList.js.flow +0 -37
- package/util/partitionArray.js.flow +0 -37
@@ -1,142 +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 strict-local
|
8
|
-
* @format
|
9
|
-
* @emails oncall+relay
|
10
|
-
*/
|
11
|
-
|
12
|
-
// flowlint ambiguous-object-type:error
|
13
|
-
|
14
|
-
'use strict';
|
15
|
-
|
16
|
-
import type CompilerContext from '../core/CompilerContext';
|
17
|
-
import type {Root} from '../core/IR';
|
18
|
-
import type {Schema, TypeID} from '../core/Schema';
|
19
|
-
|
20
|
-
const IRTransformer = require('../core/IRTransformer');
|
21
|
-
|
22
|
-
// The purpose of this directive is to add GraphQL type inform for fields in
|
23
|
-
// the operation selection in order to use in in RelayMockPayloadGenerator
|
24
|
-
// to generate better mock values, and expand the API of MockResolvers
|
25
|
-
const SCHEMA_EXTENSION =
|
26
|
-
'directive @relay_test_operation on QUERY | MUTATION | SUBSCRIPTION';
|
27
|
-
|
28
|
-
function testOperationDirective(context: CompilerContext): CompilerContext {
|
29
|
-
return IRTransformer.transform(context, {
|
30
|
-
Fragment: node => node,
|
31
|
-
Root: visitRoot,
|
32
|
-
SplitOperation: node => node,
|
33
|
-
});
|
34
|
-
}
|
35
|
-
|
36
|
-
type TypeDetails = {|
|
37
|
-
+type: string,
|
38
|
-
+plural: boolean,
|
39
|
-
+nullable: boolean,
|
40
|
-
+enumValues: null | $ReadOnlyArray<string>,
|
41
|
-
|};
|
42
|
-
|
43
|
-
function getTypeDetails(schema: Schema, fieldType: TypeID): TypeDetails {
|
44
|
-
const nullableType = schema.getNullableType(fieldType);
|
45
|
-
const isNullable = !schema.isNonNull(fieldType);
|
46
|
-
const isPlural = schema.isList(nullableType);
|
47
|
-
const type = schema.getRawType(nullableType);
|
48
|
-
|
49
|
-
return {
|
50
|
-
enumValues: schema.isEnum(type)
|
51
|
-
? schema.getEnumValues(schema.assertEnumType(type))
|
52
|
-
: null,
|
53
|
-
nullable: isNullable,
|
54
|
-
plural: isPlural,
|
55
|
-
type: schema.getTypeString(type),
|
56
|
-
};
|
57
|
-
}
|
58
|
-
|
59
|
-
function visitRoot(node: Root) {
|
60
|
-
const schema: Schema = this.getContext().getSchema();
|
61
|
-
const testDirective = node.directives.find(
|
62
|
-
directive => directive.name === 'relay_test_operation',
|
63
|
-
);
|
64
|
-
if (testDirective == null) {
|
65
|
-
return node;
|
66
|
-
}
|
67
|
-
const queue = [
|
68
|
-
{
|
69
|
-
selections: node.selections,
|
70
|
-
path: null,
|
71
|
-
},
|
72
|
-
];
|
73
|
-
const selectionsTypeInfo = {};
|
74
|
-
while (queue.length > 0) {
|
75
|
-
const {selections: currentSelections, path} = queue.pop();
|
76
|
-
currentSelections.forEach(selection => {
|
77
|
-
switch (selection.kind) {
|
78
|
-
case 'FragmentSpread':
|
79
|
-
// We don't expect to have fragment spreads at this point (it's operations only transform step)
|
80
|
-
break;
|
81
|
-
case 'ScalarField': {
|
82
|
-
const nextPath =
|
83
|
-
path === null ? selection.alias : `${path}.${selection.alias}`;
|
84
|
-
selectionsTypeInfo[nextPath] = getTypeDetails(schema, selection.type);
|
85
|
-
break;
|
86
|
-
}
|
87
|
-
case 'LinkedField': {
|
88
|
-
const nextPath =
|
89
|
-
path === null ? selection.alias : `${path}.${selection.alias}`;
|
90
|
-
selectionsTypeInfo[nextPath] = getTypeDetails(schema, selection.type);
|
91
|
-
queue.push({
|
92
|
-
selections: selection.selections,
|
93
|
-
path: nextPath,
|
94
|
-
});
|
95
|
-
break;
|
96
|
-
}
|
97
|
-
case 'Condition':
|
98
|
-
case 'Defer':
|
99
|
-
case 'InlineDataFragmentSpread':
|
100
|
-
case 'InlineFragment':
|
101
|
-
case 'ModuleImport':
|
102
|
-
case 'Stream':
|
103
|
-
queue.push({
|
104
|
-
selections: selection.selections,
|
105
|
-
path,
|
106
|
-
});
|
107
|
-
break;
|
108
|
-
case 'ClientExtension':
|
109
|
-
// Clinet extensions are not part of the schema. We should not generate type info.
|
110
|
-
break;
|
111
|
-
default:
|
112
|
-
(selection: empty);
|
113
|
-
break;
|
114
|
-
}
|
115
|
-
});
|
116
|
-
}
|
117
|
-
|
118
|
-
// Sort selectionsTypeInfo
|
119
|
-
const keys = Object.keys(selectionsTypeInfo).sort((a, b) =>
|
120
|
-
a < b ? -1 : a > b ? 1 : 0,
|
121
|
-
);
|
122
|
-
const sortedSelectionsTypeInfo = {};
|
123
|
-
keys.forEach(key => {
|
124
|
-
sortedSelectionsTypeInfo[key] = selectionsTypeInfo[key];
|
125
|
-
});
|
126
|
-
|
127
|
-
return {
|
128
|
-
...node,
|
129
|
-
directives: node.directives.filter(
|
130
|
-
directive => directive !== testDirective,
|
131
|
-
),
|
132
|
-
metadata: {
|
133
|
-
...(node.metadata || {}),
|
134
|
-
relayTestingSelectionTypeInfo: sortedSelectionsTypeInfo,
|
135
|
-
},
|
136
|
-
};
|
137
|
-
}
|
138
|
-
|
139
|
-
module.exports = {
|
140
|
-
SCHEMA_EXTENSION,
|
141
|
-
transform: testOperationDirective,
|
142
|
-
};
|
@@ -1,26 +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 strict-local
|
8
|
-
* @format
|
9
|
-
*/
|
10
|
-
|
11
|
-
// flowlint ambiguous-object-type:error
|
12
|
-
|
13
|
-
'use strict';
|
14
|
-
|
15
|
-
import type {LinkedField} from '../core/IR';
|
16
|
-
|
17
|
-
function hasUnaliasedSelection(field: LinkedField, fieldName: string): boolean {
|
18
|
-
return field.selections.some(
|
19
|
-
selection =>
|
20
|
-
selection.kind === 'ScalarField' &&
|
21
|
-
selection.alias === fieldName &&
|
22
|
-
selection.name === fieldName,
|
23
|
-
);
|
24
|
-
}
|
25
|
-
|
26
|
-
module.exports = {hasUnaliasedSelection};
|
@@ -1,80 +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 strict-local
|
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 {ArgumentDefinition} from '../core/IR';
|
17
|
-
|
18
|
-
const {
|
19
|
-
createUserError,
|
20
|
-
eachWithCombinedError,
|
21
|
-
} = require('../core/CompilerError');
|
22
|
-
const inferRootArgumentDefinitions = require('../core/inferRootArgumentDefinitions');
|
23
|
-
|
24
|
-
/**
|
25
|
-
* Validates that all global variables used in operations are defined at the
|
26
|
-
* root. This isn't a real transform as it returns the original context, but
|
27
|
-
* has to happen before other transforms strip certain variable usages.
|
28
|
-
*/
|
29
|
-
function validateGlobalVariablesTransform(
|
30
|
-
context: CompilerContext,
|
31
|
-
): CompilerContext {
|
32
|
-
const contextWithUsedArguments = inferRootArgumentDefinitions(context);
|
33
|
-
eachWithCombinedError(context.documents(), node => {
|
34
|
-
if (node.kind !== 'Root') {
|
35
|
-
return;
|
36
|
-
}
|
37
|
-
const nodeWithUsedArguments = contextWithUsedArguments.getRoot(node.name);
|
38
|
-
const definedArguments = argumentDefinitionsToMap(node.argumentDefinitions);
|
39
|
-
const usedArguments = argumentDefinitionsToMap(
|
40
|
-
nodeWithUsedArguments.argumentDefinitions,
|
41
|
-
);
|
42
|
-
// All used arguments must be defined
|
43
|
-
const undefinedVariables = [];
|
44
|
-
for (const argDef of usedArguments.values()) {
|
45
|
-
if (!definedArguments.has(argDef.name)) {
|
46
|
-
undefinedVariables.push(argDef);
|
47
|
-
}
|
48
|
-
}
|
49
|
-
if (undefinedVariables.length !== 0) {
|
50
|
-
throw createUserError(
|
51
|
-
`Operation '${
|
52
|
-
node.name
|
53
|
-
}' references undefined variable(s):\n${undefinedVariables
|
54
|
-
.map(
|
55
|
-
argDef =>
|
56
|
-
`- \$${argDef.name}: ${context
|
57
|
-
.getSchema()
|
58
|
-
.getTypeString(argDef.type)}`,
|
59
|
-
)
|
60
|
-
.join('\n')}.`,
|
61
|
-
undefinedVariables.map(argDef => argDef.loc),
|
62
|
-
);
|
63
|
-
}
|
64
|
-
});
|
65
|
-
return context;
|
66
|
-
}
|
67
|
-
|
68
|
-
function argumentDefinitionsToMap<T: ArgumentDefinition>(
|
69
|
-
argDefs: $ReadOnlyArray<T>,
|
70
|
-
): Map<string, T> {
|
71
|
-
const map = new Map();
|
72
|
-
for (const argDef of argDefs) {
|
73
|
-
map.set(argDef.name, argDef);
|
74
|
-
}
|
75
|
-
return map;
|
76
|
-
}
|
77
|
-
|
78
|
-
module.exports = {
|
79
|
-
transform: validateGlobalVariablesTransform,
|
80
|
-
};
|
@@ -1,130 +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 strict-local
|
8
|
-
* @format
|
9
|
-
*/
|
10
|
-
|
11
|
-
// flowlint ambiguous-object-type:error
|
12
|
-
|
13
|
-
'use strict';
|
14
|
-
import type {InlineFragment} from '../core/IR';
|
15
|
-
|
16
|
-
import type CompilerContext from '../core/CompilerContext';
|
17
|
-
import type {
|
18
|
-
Directive,
|
19
|
-
Field,
|
20
|
-
Fragment,
|
21
|
-
Root,
|
22
|
-
SplitOperation,
|
23
|
-
} from '../core/IR';
|
24
|
-
import type {Argument, Schema, TypeID} from '../core/Schema';
|
25
|
-
|
26
|
-
const {createUserError} = require('../core/CompilerError');
|
27
|
-
const {getFieldDefinitionStrict} = require('../core/getFieldDefinition');
|
28
|
-
const IRValidator = require('../core/IRValidator');
|
29
|
-
|
30
|
-
type State = {|
|
31
|
-
+rootNode: Fragment | Root | SplitOperation,
|
32
|
-
+parentType: TypeID,
|
33
|
-
|};
|
34
|
-
|
35
|
-
/*
|
36
|
-
* Validate required arguments are provided after transforms filling in arguments
|
37
|
-
*/
|
38
|
-
function validateRequiredArguments(context: CompilerContext): CompilerContext {
|
39
|
-
IRValidator.validate(
|
40
|
-
context,
|
41
|
-
{
|
42
|
-
Directive: visitDirective,
|
43
|
-
InlineFragment: visitInlineFragment,
|
44
|
-
LinkedField: visitField,
|
45
|
-
ScalarField: visitField,
|
46
|
-
// FragmentSpread validation is done in ApplyFragmentArgumentTransform
|
47
|
-
},
|
48
|
-
node => ({rootNode: node, parentType: node.type}),
|
49
|
-
);
|
50
|
-
return context;
|
51
|
-
}
|
52
|
-
|
53
|
-
function visitDirective(node: Directive, {rootNode}: State): void {
|
54
|
-
const context: CompilerContext = this.getContext();
|
55
|
-
const directiveDef = context.getSchema().getDirective(node.name);
|
56
|
-
if (directiveDef == null) {
|
57
|
-
return;
|
58
|
-
}
|
59
|
-
validateRequiredArgumentsOnNode(
|
60
|
-
context.getSchema(),
|
61
|
-
node,
|
62
|
-
directiveDef.args,
|
63
|
-
rootNode,
|
64
|
-
);
|
65
|
-
}
|
66
|
-
|
67
|
-
function visitInlineFragment(
|
68
|
-
fragment: InlineFragment,
|
69
|
-
{rootNode}: State,
|
70
|
-
): void {
|
71
|
-
this.traverse(fragment, {
|
72
|
-
rootNode,
|
73
|
-
parentType: fragment.typeCondition,
|
74
|
-
});
|
75
|
-
}
|
76
|
-
|
77
|
-
function visitField(node: Field, {parentType, rootNode}: State): void {
|
78
|
-
const context: CompilerContext = this.getContext();
|
79
|
-
const schema = context.getSchema();
|
80
|
-
const definition = getFieldDefinitionStrict(schema, parentType, node.name);
|
81
|
-
if (definition == null) {
|
82
|
-
const isLegacyFatInterface = node.directives.some(
|
83
|
-
directive => directive.name === 'fixme_fat_interface',
|
84
|
-
);
|
85
|
-
if (!isLegacyFatInterface) {
|
86
|
-
throw createUserError(
|
87
|
-
`Unknown field '${node.name}' on type ` +
|
88
|
-
`'${schema.getTypeString(parentType)}'.`,
|
89
|
-
[node.loc],
|
90
|
-
);
|
91
|
-
}
|
92
|
-
} else {
|
93
|
-
validateRequiredArgumentsOnNode(
|
94
|
-
schema,
|
95
|
-
node,
|
96
|
-
schema.getFieldConfig(definition).args,
|
97
|
-
rootNode,
|
98
|
-
);
|
99
|
-
}
|
100
|
-
this.traverse(node, {
|
101
|
-
rootNode,
|
102
|
-
parentType: node.type,
|
103
|
-
});
|
104
|
-
}
|
105
|
-
|
106
|
-
function validateRequiredArgumentsOnNode(
|
107
|
-
schema: Schema,
|
108
|
-
node: Directive | Field,
|
109
|
-
definitionArgs: $ReadOnlyArray<Argument>,
|
110
|
-
rootNode: Fragment | Root | SplitOperation,
|
111
|
-
): void {
|
112
|
-
const nodeArgsSet = new Set(node.args.map(arg => arg.name));
|
113
|
-
for (const arg of definitionArgs) {
|
114
|
-
if (
|
115
|
-
arg.defaultValue == null &&
|
116
|
-
schema.isNonNull(arg.type) &&
|
117
|
-
!nodeArgsSet.has(arg.name)
|
118
|
-
) {
|
119
|
-
throw createUserError(
|
120
|
-
`Required argument '${arg.name}: ${schema.getTypeString(arg.type)}' ` +
|
121
|
-
`is missing on '${node.name}' in '${rootNode.name}'.`,
|
122
|
-
[node.loc, rootNode.loc],
|
123
|
-
);
|
124
|
-
}
|
125
|
-
}
|
126
|
-
}
|
127
|
-
|
128
|
-
module.exports = {
|
129
|
-
transform: validateRequiredArguments,
|
130
|
-
};
|
@@ -1,128 +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 strict-local
|
8
|
-
* @format
|
9
|
-
*/
|
10
|
-
|
11
|
-
// flowlint ambiguous-object-type:error
|
12
|
-
|
13
|
-
'use strict';
|
14
|
-
import type {
|
15
|
-
UnknownLocation,
|
16
|
-
SourceLocation,
|
17
|
-
Location,
|
18
|
-
GeneratedLocation,
|
19
|
-
DerivedLocation,
|
20
|
-
} from '../core/IR';
|
21
|
-
|
22
|
-
import type CompilerContext from '../core/CompilerContext';
|
23
|
-
import type {
|
24
|
-
ClientExtension,
|
25
|
-
Defer,
|
26
|
-
LinkedField,
|
27
|
-
Selection,
|
28
|
-
Stream,
|
29
|
-
} from '../core/IR';
|
30
|
-
|
31
|
-
const {createUserError} = require('../core/CompilerError');
|
32
|
-
const IRValidator = require('../core/IRValidator');
|
33
|
-
|
34
|
-
type State = {rootClientSelection: ?Selection, ...};
|
35
|
-
|
36
|
-
const NODEKIND_DIRECTIVE_MAP = {
|
37
|
-
Defer: 'defer',
|
38
|
-
Stream: 'stream',
|
39
|
-
};
|
40
|
-
|
41
|
-
/*
|
42
|
-
* Validate that server-only directives are not used inside client fields
|
43
|
-
*/
|
44
|
-
function validateServerOnlyDirectives(
|
45
|
-
context: CompilerContext,
|
46
|
-
): CompilerContext {
|
47
|
-
IRValidator.validate(
|
48
|
-
context,
|
49
|
-
{
|
50
|
-
ClientExtension: visitClientExtension,
|
51
|
-
Defer: visitTransformedDirective,
|
52
|
-
Stream: visitTransformedDirective,
|
53
|
-
LinkedField: visitLinkedField,
|
54
|
-
ScalarField: stopVisit,
|
55
|
-
},
|
56
|
-
() => ({
|
57
|
-
rootClientSelection: null,
|
58
|
-
}),
|
59
|
-
);
|
60
|
-
return context;
|
61
|
-
}
|
62
|
-
|
63
|
-
// If an empty visitor is defined, we no longer automatically visit child nodes
|
64
|
-
// such as arguments.
|
65
|
-
function stopVisit() {}
|
66
|
-
|
67
|
-
// Only visits selections as an optimization to not look at arguments
|
68
|
-
function visitLinkedField(node: LinkedField, state: State): void {
|
69
|
-
for (const selection of node.selections) {
|
70
|
-
this.visit(selection, state);
|
71
|
-
}
|
72
|
-
}
|
73
|
-
|
74
|
-
function visitClientExtension(node: ClientExtension, state: State): void {
|
75
|
-
for (const selection of node.selections) {
|
76
|
-
this.visit(selection, {
|
77
|
-
rootClientSelection: selection,
|
78
|
-
});
|
79
|
-
}
|
80
|
-
}
|
81
|
-
|
82
|
-
function visitTransformedDirective(node: Defer | Stream, state: State): void {
|
83
|
-
if (state.rootClientSelection) {
|
84
|
-
throwError(
|
85
|
-
`@${NODEKIND_DIRECTIVE_MAP[node.kind]}`,
|
86
|
-
node.loc,
|
87
|
-
state.rootClientSelection.loc,
|
88
|
-
);
|
89
|
-
}
|
90
|
-
// directive used only on client fields
|
91
|
-
if (node.selections.every(sel => sel.kind === 'ClientExtension')) {
|
92
|
-
const clientExtension = node.selections[0];
|
93
|
-
throwError(
|
94
|
-
`@${NODEKIND_DIRECTIVE_MAP[node.kind]}`,
|
95
|
-
node.loc,
|
96
|
-
clientExtension && clientExtension.kind === 'ClientExtension'
|
97
|
-
? clientExtension.selections[0]?.loc
|
98
|
-
: null,
|
99
|
-
);
|
100
|
-
}
|
101
|
-
this.traverse(node, state);
|
102
|
-
}
|
103
|
-
|
104
|
-
function throwError(
|
105
|
-
directiveName: string,
|
106
|
-
directiveLoc: Location,
|
107
|
-
clientExtensionLoc:
|
108
|
-
| null
|
109
|
-
| SourceLocation
|
110
|
-
| GeneratedLocation
|
111
|
-
| DerivedLocation
|
112
|
-
| UnknownLocation
|
113
|
-
| Location,
|
114
|
-
) {
|
115
|
-
throw createUserError(
|
116
|
-
`Unexpected directive: ${directiveName}. ` +
|
117
|
-
'This directive can only be used on fields/fragments that are ' +
|
118
|
-
'fetched from the server schema, but it is used ' +
|
119
|
-
'inside a client-only selection.',
|
120
|
-
clientExtensionLoc == null || directiveLoc === clientExtensionLoc
|
121
|
-
? [directiveLoc]
|
122
|
-
: [directiveLoc, clientExtensionLoc],
|
123
|
-
);
|
124
|
-
}
|
125
|
-
|
126
|
-
module.exports = {
|
127
|
-
transform: validateServerOnlyDirectives,
|
128
|
-
};
|
@@ -1,88 +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 strict-local
|
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 {ArgumentDefinition} from '../core/IR';
|
17
|
-
|
18
|
-
const {
|
19
|
-
createUserError,
|
20
|
-
eachWithCombinedError,
|
21
|
-
} = require('../core/CompilerError');
|
22
|
-
const inferRootArgumentDefinitions = require('../core/inferRootArgumentDefinitions');
|
23
|
-
|
24
|
-
const SCHEMA_EXTENSION =
|
25
|
-
'directive @DEPRECATED__relay_ignore_unused_variables_error on QUERY | MUTATION | SUBSCRIPTION';
|
26
|
-
|
27
|
-
/**
|
28
|
-
* Validates that there are no unused variables in the operation.
|
29
|
-
* former `graphql-js`` NoUnusedVariablesRule
|
30
|
-
*/
|
31
|
-
function validateUnusedVariablesTransform(
|
32
|
-
context: CompilerContext,
|
33
|
-
): CompilerContext {
|
34
|
-
const contextWithUsedArguments = inferRootArgumentDefinitions(context);
|
35
|
-
eachWithCombinedError(context.documents(), node => {
|
36
|
-
if (node.kind !== 'Root') {
|
37
|
-
return;
|
38
|
-
}
|
39
|
-
const rootArgumentLocations = new Map(
|
40
|
-
node.argumentDefinitions.map(arg => [arg.name, arg.loc]),
|
41
|
-
);
|
42
|
-
const nodeWithUsedArguments = contextWithUsedArguments.getRoot(node.name);
|
43
|
-
const usedArguments = argumentDefinitionsToMap(
|
44
|
-
nodeWithUsedArguments.argumentDefinitions,
|
45
|
-
);
|
46
|
-
for (const usedArgumentName of usedArguments.keys()) {
|
47
|
-
rootArgumentLocations.delete(usedArgumentName);
|
48
|
-
}
|
49
|
-
|
50
|
-
const ignoreErrorDirective = node.directives.find(
|
51
|
-
({name}) => name === 'DEPRECATED__relay_ignore_unused_variables_error',
|
52
|
-
);
|
53
|
-
if (rootArgumentLocations.size > 0 && !ignoreErrorDirective) {
|
54
|
-
const isPlural = rootArgumentLocations.size > 1;
|
55
|
-
throw createUserError(
|
56
|
-
`Variable${isPlural ? 's' : ''} '$${Array.from(
|
57
|
-
rootArgumentLocations.keys(),
|
58
|
-
).join("', '$")}' ${isPlural ? 'are' : 'is'} never used in operation '${
|
59
|
-
node.name
|
60
|
-
}'.`,
|
61
|
-
Array.from(rootArgumentLocations.values()),
|
62
|
-
);
|
63
|
-
}
|
64
|
-
if (rootArgumentLocations.size === 0 && ignoreErrorDirective) {
|
65
|
-
throw createUserError(
|
66
|
-
"Invalid usage of '@DEPRECATED__relay_ignore_unused_variables_error.'" +
|
67
|
-
`No unused variables found in the query '${node.name}'`,
|
68
|
-
[ignoreErrorDirective.loc],
|
69
|
-
);
|
70
|
-
}
|
71
|
-
});
|
72
|
-
return context;
|
73
|
-
}
|
74
|
-
|
75
|
-
function argumentDefinitionsToMap<T: ArgumentDefinition>(
|
76
|
-
argDefs: $ReadOnlyArray<T>,
|
77
|
-
): Map<string, T> {
|
78
|
-
const map = new Map();
|
79
|
-
for (const argDef of argDefs) {
|
80
|
-
map.set(argDef.name, argDef);
|
81
|
-
}
|
82
|
-
return map;
|
83
|
-
}
|
84
|
-
|
85
|
-
module.exports = {
|
86
|
-
transform: validateUnusedVariablesTransform,
|
87
|
-
SCHEMA_EXTENSION,
|
88
|
-
};
|