relay-compiler 0.0.0-main-4d287de9 → 0.0.0-main-9a79039d
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 -26
- package/win-x64/relay.exe +0 -0
- package/bin/RelayCompilerBin.js.flow +0 -168
- package/bin/RelayCompilerMain.js.flow +0 -513
- package/bin/__fixtures__/plugin-module.js.flow +0 -17
- package/bin/relay-compiler +0 -19066
- 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 -565
- 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 -1731
- 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 -486
- 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/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/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 -194
- 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 -255
- 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 -126
- package/transforms/ValidateServerOnlyDirectivesTransform.js.flow +0 -111
- 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 -152
- 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,188 +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 {QueryGenerator, RefetchRoot} from '.';
|
16
|
-
import type {Fragment} from '../../core/IR';
|
17
|
-
import type {Schema} from '../../core/Schema';
|
18
|
-
|
19
|
-
const {createUserError} = require('../../core/CompilerError');
|
20
|
-
const SchemaUtils = require('../../core/SchemaUtils');
|
21
|
-
const {
|
22
|
-
buildFragmentSpread,
|
23
|
-
buildOperationArgumentDefinitions,
|
24
|
-
} = require('./utils');
|
25
|
-
|
26
|
-
function buildRefetchOperation(
|
27
|
-
schema: Schema,
|
28
|
-
fragment: Fragment,
|
29
|
-
queryName: string,
|
30
|
-
): ?RefetchRoot {
|
31
|
-
let fetchableIdentifierField = null;
|
32
|
-
if (schema.isObject(fragment.type)) {
|
33
|
-
const objectType = schema.assertObjectType(fragment.type);
|
34
|
-
fetchableIdentifierField = schema.getFetchableFieldName(objectType);
|
35
|
-
}
|
36
|
-
if (fetchableIdentifierField == null) {
|
37
|
-
return null;
|
38
|
-
}
|
39
|
-
const identifierField = schema.getFieldConfig(
|
40
|
-
schema.expectField(fragment.type, fetchableIdentifierField),
|
41
|
-
);
|
42
|
-
if (!schema.isId(schema.getRawType(identifierField.type))) {
|
43
|
-
const typeName = schema.getTypeString(fragment.type);
|
44
|
-
throw createUserError(
|
45
|
-
`Invalid use of @refetchable on fragment '${fragment.name}', the type ` +
|
46
|
-
`'${typeName}' is @fetchable but the identifying field '${fetchableIdentifierField}' ` +
|
47
|
-
"does not have type 'ID'.",
|
48
|
-
[fragment.loc],
|
49
|
-
);
|
50
|
-
}
|
51
|
-
|
52
|
-
const queryType = schema.expectQueryType();
|
53
|
-
const fetchFieldName = `fetch__${schema.getTypeString(fragment.type)}`;
|
54
|
-
const fetchField = schema.getFieldConfig(
|
55
|
-
schema.expectField(queryType, fetchFieldName),
|
56
|
-
);
|
57
|
-
if (
|
58
|
-
!(
|
59
|
-
fetchField != null &&
|
60
|
-
schema.isObject(fetchField.type) &&
|
61
|
-
schema.areEqualTypes(fetchField.type, fragment.type) &&
|
62
|
-
schema.areEqualTypes(
|
63
|
-
schema.getNullableType(fetchField.args[0].type),
|
64
|
-
schema.expectIdType(),
|
65
|
-
)
|
66
|
-
)
|
67
|
-
) {
|
68
|
-
const typeName = schema.getTypeString(fragment.type);
|
69
|
-
throw createUserError(
|
70
|
-
`Invalid use of @refetchable on fragment '${fragment.name}', the type ` +
|
71
|
-
`'${typeName}' is @fetchable but there is no corresponding '${fetchFieldName}'` +
|
72
|
-
`field or it is invalid (expected '${fetchFieldName}(id: ID!): ${typeName}').`,
|
73
|
-
[fragment.loc],
|
74
|
-
);
|
75
|
-
}
|
76
|
-
|
77
|
-
// name and type of the node(_: ID) field parameter
|
78
|
-
const idArgName = fetchField.args[0].name;
|
79
|
-
const idArgType = fetchField.args[0].type;
|
80
|
-
// name and type of the query variable
|
81
|
-
const idVariableType = SchemaUtils.getNonNullIdInput(schema);
|
82
|
-
const idVariableName = 'id';
|
83
|
-
|
84
|
-
const argumentDefinitions = buildOperationArgumentDefinitions(
|
85
|
-
fragment.argumentDefinitions,
|
86
|
-
);
|
87
|
-
const idArgument = argumentDefinitions.find(
|
88
|
-
argDef => argDef.name === idVariableName,
|
89
|
-
);
|
90
|
-
if (idArgument != null) {
|
91
|
-
throw createUserError(
|
92
|
-
`Invalid use of @refetchable on fragment \`${fragment.name}\`, this ` +
|
93
|
-
'fragment already has an `$id` variable in scope.',
|
94
|
-
[idArgument.loc],
|
95
|
-
);
|
96
|
-
}
|
97
|
-
const argumentDefinitionsWithId = [
|
98
|
-
...argumentDefinitions,
|
99
|
-
{
|
100
|
-
defaultValue: null,
|
101
|
-
kind: 'LocalArgumentDefinition',
|
102
|
-
loc: {kind: 'Derived', source: fragment.loc},
|
103
|
-
name: idVariableName,
|
104
|
-
type: idVariableType,
|
105
|
-
},
|
106
|
-
];
|
107
|
-
return {
|
108
|
-
identifierField: fetchableIdentifierField,
|
109
|
-
path: [fetchFieldName],
|
110
|
-
node: {
|
111
|
-
argumentDefinitions: argumentDefinitionsWithId,
|
112
|
-
directives: [],
|
113
|
-
kind: 'Root',
|
114
|
-
loc: {kind: 'Derived', source: fragment.loc},
|
115
|
-
metadata: null,
|
116
|
-
name: queryName,
|
117
|
-
operation: 'query',
|
118
|
-
selections: [
|
119
|
-
{
|
120
|
-
alias: fetchFieldName,
|
121
|
-
args: [
|
122
|
-
{
|
123
|
-
kind: 'Argument',
|
124
|
-
loc: {kind: 'Derived', source: fragment.loc},
|
125
|
-
name: idArgName,
|
126
|
-
type: schema.assertInputType(idArgType),
|
127
|
-
value: {
|
128
|
-
kind: 'Variable',
|
129
|
-
loc: {kind: 'Derived', source: fragment.loc},
|
130
|
-
variableName: idVariableName,
|
131
|
-
type: idVariableType,
|
132
|
-
},
|
133
|
-
},
|
134
|
-
],
|
135
|
-
connection: false,
|
136
|
-
directives: [],
|
137
|
-
handles: null,
|
138
|
-
kind: 'LinkedField',
|
139
|
-
loc: {kind: 'Derived', source: fragment.loc},
|
140
|
-
metadata: null,
|
141
|
-
name: fetchFieldName,
|
142
|
-
selections: [buildFragmentSpread(fragment)],
|
143
|
-
type: fragment.type,
|
144
|
-
},
|
145
|
-
],
|
146
|
-
type: queryType,
|
147
|
-
},
|
148
|
-
transformedFragment: enforceIDField(
|
149
|
-
schema,
|
150
|
-
fragment,
|
151
|
-
fetchableIdentifierField,
|
152
|
-
),
|
153
|
-
};
|
154
|
-
}
|
155
|
-
|
156
|
-
function enforceIDField(
|
157
|
-
schema: Schema,
|
158
|
-
fragment: Fragment,
|
159
|
-
fetchableIdentifierField: string,
|
160
|
-
): Fragment {
|
161
|
-
const idSelection = fragment.selections.find(
|
162
|
-
selection =>
|
163
|
-
selection.kind === 'ScalarField' &&
|
164
|
-
selection.name === fetchableIdentifierField &&
|
165
|
-
selection.alias === fetchableIdentifierField &&
|
166
|
-
schema.areEqualTypes(
|
167
|
-
schema.getNullableType(selection.type),
|
168
|
-
schema.expectIdType(),
|
169
|
-
),
|
170
|
-
);
|
171
|
-
if (idSelection) {
|
172
|
-
return fragment;
|
173
|
-
}
|
174
|
-
const idField = SchemaUtils.generateIDField(schema, fragment.type);
|
175
|
-
// idField is uniquely owned here, safe to mutate
|
176
|
-
(idField: $FlowFixMe).alias = fetchableIdentifierField;
|
177
|
-
// idField is uniquely owned here, safe to mutate
|
178
|
-
(idField: $FlowFixMe).name = fetchableIdentifierField;
|
179
|
-
return {
|
180
|
-
...fragment,
|
181
|
-
selections: [...fragment.selections, idField],
|
182
|
-
};
|
183
|
-
}
|
184
|
-
|
185
|
-
module.exports = ({
|
186
|
-
description: '@fetchable types',
|
187
|
-
buildRefetchOperation,
|
188
|
-
}: QueryGenerator);
|
@@ -1,217 +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 {QueryGenerator, RefetchRoot} from '.';
|
16
|
-
import type {Fragment} from '../../core/IR';
|
17
|
-
import type {Schema} from '../../core/Schema';
|
18
|
-
|
19
|
-
const {createUserError} = require('../../core/CompilerError');
|
20
|
-
const SchemaUtils = require('../../core/SchemaUtils');
|
21
|
-
const {
|
22
|
-
buildFragmentSpread,
|
23
|
-
buildOperationArgumentDefinitions,
|
24
|
-
} = require('./utils');
|
25
|
-
const nullthrows = require('nullthrows');
|
26
|
-
|
27
|
-
const NODE_TYPE_NAME = 'Node';
|
28
|
-
const NODE_FIELD_NAME = 'node';
|
29
|
-
|
30
|
-
function buildRefetchOperation(
|
31
|
-
schema: Schema,
|
32
|
-
fragment: Fragment,
|
33
|
-
queryName: string,
|
34
|
-
): ?RefetchRoot {
|
35
|
-
const eligible =
|
36
|
-
schema.getTypeString(fragment.type) === NODE_TYPE_NAME ||
|
37
|
-
(schema.isObject(fragment.type) &&
|
38
|
-
schema
|
39
|
-
.getInterfaces(schema.assertCompositeType(fragment.type))
|
40
|
-
.some(interfaceType =>
|
41
|
-
schema.areEqualTypes(
|
42
|
-
interfaceType,
|
43
|
-
schema.expectTypeFromString(NODE_TYPE_NAME),
|
44
|
-
),
|
45
|
-
)) ||
|
46
|
-
(schema.isAbstractType(fragment.type) &&
|
47
|
-
Array.from(
|
48
|
-
schema.getPossibleTypes(schema.assertAbstractType(fragment.type)),
|
49
|
-
).every(possibleType =>
|
50
|
-
schema.implementsInterface(
|
51
|
-
schema.assertCompositeType(possibleType),
|
52
|
-
schema.assertInterfaceType(
|
53
|
-
schema.expectTypeFromString(NODE_TYPE_NAME),
|
54
|
-
),
|
55
|
-
),
|
56
|
-
));
|
57
|
-
if (!eligible) {
|
58
|
-
return null;
|
59
|
-
}
|
60
|
-
|
61
|
-
const queryType = schema.expectQueryType();
|
62
|
-
const nodeType = schema.getTypeFromString(NODE_TYPE_NAME);
|
63
|
-
const nodeField = schema.getFieldConfig(
|
64
|
-
schema.expectField(queryType, NODE_FIELD_NAME),
|
65
|
-
);
|
66
|
-
if (
|
67
|
-
!(
|
68
|
-
nodeType &&
|
69
|
-
schema.isInterface(nodeType) &&
|
70
|
-
schema.isInterface(nodeField.type) &&
|
71
|
-
schema.areEqualTypes(nodeField.type, nodeType) &&
|
72
|
-
nodeField.args.length === 1 &&
|
73
|
-
schema.areEqualTypes(
|
74
|
-
schema.getNullableType(nodeField.args[0].type),
|
75
|
-
schema.expectIdType(),
|
76
|
-
) &&
|
77
|
-
// the fragment must be on Node or on a type that implements Node
|
78
|
-
((schema.isObject(fragment.type) &&
|
79
|
-
schema
|
80
|
-
.getInterfaces(schema.assertCompositeType(fragment.type))
|
81
|
-
.some(interfaceType =>
|
82
|
-
schema.areEqualTypes(interfaceType, nodeType),
|
83
|
-
)) ||
|
84
|
-
(schema.isAbstractType(fragment.type) &&
|
85
|
-
Array.from(
|
86
|
-
schema.getPossibleTypes(schema.assertAbstractType(fragment.type)),
|
87
|
-
).every(possibleType =>
|
88
|
-
schema
|
89
|
-
.getInterfaces(schema.assertCompositeType(possibleType))
|
90
|
-
.some(interfaceType =>
|
91
|
-
schema.areEqualTypes(interfaceType, nodeType),
|
92
|
-
),
|
93
|
-
)))
|
94
|
-
)
|
95
|
-
) {
|
96
|
-
throw createUserError(
|
97
|
-
`Invalid use of @refetchable on fragment '${fragment.name}', check ` +
|
98
|
-
'that your schema defines a `Node { id: ID }` interface and has a ' +
|
99
|
-
'`node(id: ID): Node` field on the query type (the id argument may ' +
|
100
|
-
'also be non-null).',
|
101
|
-
[fragment.loc],
|
102
|
-
);
|
103
|
-
}
|
104
|
-
|
105
|
-
// name and type of the node(_: ID) field parameter
|
106
|
-
const idArgName = nodeField.args[0].name;
|
107
|
-
const idArgType = nodeField.args[0].type;
|
108
|
-
// name and type of the query variable
|
109
|
-
const idVariableType = SchemaUtils.getNonNullIdInput(schema);
|
110
|
-
const idVariableName = 'id';
|
111
|
-
|
112
|
-
const argumentDefinitions = buildOperationArgumentDefinitions(
|
113
|
-
fragment.argumentDefinitions,
|
114
|
-
);
|
115
|
-
const idArgument = argumentDefinitions.find(
|
116
|
-
argDef => argDef.name === idVariableName,
|
117
|
-
);
|
118
|
-
if (idArgument != null) {
|
119
|
-
throw createUserError(
|
120
|
-
`Invalid use of @refetchable on fragment \`${fragment.name}\`, this ` +
|
121
|
-
'fragment already has an `$id` variable in scope.',
|
122
|
-
[idArgument.loc],
|
123
|
-
);
|
124
|
-
}
|
125
|
-
const argumentDefinitionsWithId = [
|
126
|
-
...argumentDefinitions,
|
127
|
-
{
|
128
|
-
defaultValue: null,
|
129
|
-
kind: 'LocalArgumentDefinition',
|
130
|
-
loc: {kind: 'Derived', source: fragment.loc},
|
131
|
-
name: idVariableName,
|
132
|
-
type: idVariableType,
|
133
|
-
},
|
134
|
-
];
|
135
|
-
return {
|
136
|
-
identifierField: 'id',
|
137
|
-
path: [NODE_FIELD_NAME],
|
138
|
-
node: {
|
139
|
-
argumentDefinitions: argumentDefinitionsWithId,
|
140
|
-
directives: [],
|
141
|
-
kind: 'Root',
|
142
|
-
loc: {kind: 'Derived', source: fragment.loc},
|
143
|
-
metadata: null,
|
144
|
-
name: queryName,
|
145
|
-
operation: 'query',
|
146
|
-
selections: [
|
147
|
-
{
|
148
|
-
alias: NODE_FIELD_NAME,
|
149
|
-
args: [
|
150
|
-
{
|
151
|
-
kind: 'Argument',
|
152
|
-
loc: {kind: 'Derived', source: fragment.loc},
|
153
|
-
name: idArgName,
|
154
|
-
type: schema.assertInputType(idArgType),
|
155
|
-
value: {
|
156
|
-
kind: 'Variable',
|
157
|
-
loc: {kind: 'Derived', source: fragment.loc},
|
158
|
-
variableName: idVariableName,
|
159
|
-
type: idVariableType,
|
160
|
-
},
|
161
|
-
},
|
162
|
-
],
|
163
|
-
connection: false,
|
164
|
-
directives: [],
|
165
|
-
handles: null,
|
166
|
-
kind: 'LinkedField',
|
167
|
-
loc: {kind: 'Derived', source: fragment.loc},
|
168
|
-
metadata: null,
|
169
|
-
name: NODE_FIELD_NAME,
|
170
|
-
selections: [buildFragmentSpread(fragment)],
|
171
|
-
type: schema.assertLinkedFieldType(nodeType),
|
172
|
-
},
|
173
|
-
],
|
174
|
-
type: queryType,
|
175
|
-
},
|
176
|
-
transformedFragment: enforceIDField(schema, fragment),
|
177
|
-
};
|
178
|
-
}
|
179
|
-
|
180
|
-
function enforceIDField(schema: Schema, fragment: Fragment): Fragment {
|
181
|
-
const idSelection = fragment.selections.find(
|
182
|
-
selection =>
|
183
|
-
selection.kind === 'ScalarField' &&
|
184
|
-
selection.name === 'id' &&
|
185
|
-
selection.alias === 'id' &&
|
186
|
-
schema.areEqualTypes(
|
187
|
-
schema.getNullableType(selection.type),
|
188
|
-
schema.expectIdType(),
|
189
|
-
),
|
190
|
-
);
|
191
|
-
if (idSelection) {
|
192
|
-
return fragment;
|
193
|
-
}
|
194
|
-
const idField = schema.getFieldByName(fragment.type, 'id');
|
195
|
-
const nodeType = schema.assertCompositeType(
|
196
|
-
nullthrows(schema.getTypeFromString(NODE_TYPE_NAME)),
|
197
|
-
);
|
198
|
-
const generatedIDSelection = idField
|
199
|
-
? SchemaUtils.generateIDField(schema, fragment.type)
|
200
|
-
: {
|
201
|
-
kind: 'InlineFragment',
|
202
|
-
directives: [],
|
203
|
-
loc: {kind: 'Generated'},
|
204
|
-
metadata: null,
|
205
|
-
selections: [SchemaUtils.generateIDField(schema, nodeType)],
|
206
|
-
typeCondition: nodeType,
|
207
|
-
};
|
208
|
-
return {
|
209
|
-
...fragment,
|
210
|
-
selections: [...fragment.selections, generatedIDSelection],
|
211
|
-
};
|
212
|
-
}
|
213
|
-
|
214
|
-
module.exports = ({
|
215
|
-
description: 'the Node interface or types implementing the Node interface',
|
216
|
-
buildRefetchOperation,
|
217
|
-
}: QueryGenerator);
|
@@ -1,57 +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 {QueryGenerator, RefetchRoot} from '.';
|
16
|
-
import type {Fragment} from '../../core/IR';
|
17
|
-
import type {Schema} from '../../core/Schema';
|
18
|
-
|
19
|
-
const {
|
20
|
-
buildFragmentSpread,
|
21
|
-
buildOperationArgumentDefinitions,
|
22
|
-
} = require('./utils');
|
23
|
-
|
24
|
-
function buildRefetchOperation(
|
25
|
-
schema: Schema,
|
26
|
-
fragment: Fragment,
|
27
|
-
queryName: string,
|
28
|
-
): ?RefetchRoot {
|
29
|
-
const queryType = schema.expectQueryType();
|
30
|
-
if (!schema.areEqualTypes(fragment.type, queryType)) {
|
31
|
-
return null;
|
32
|
-
}
|
33
|
-
|
34
|
-
return {
|
35
|
-
identifierField: null,
|
36
|
-
path: [],
|
37
|
-
node: {
|
38
|
-
argumentDefinitions: buildOperationArgumentDefinitions(
|
39
|
-
fragment.argumentDefinitions,
|
40
|
-
),
|
41
|
-
directives: [],
|
42
|
-
kind: 'Root',
|
43
|
-
loc: {kind: 'Derived', source: fragment.loc},
|
44
|
-
metadata: null,
|
45
|
-
name: queryName,
|
46
|
-
operation: 'query',
|
47
|
-
selections: [buildFragmentSpread(fragment)],
|
48
|
-
type: queryType,
|
49
|
-
},
|
50
|
-
transformedFragment: fragment,
|
51
|
-
};
|
52
|
-
}
|
53
|
-
|
54
|
-
module.exports = ({
|
55
|
-
description: 'the Query type',
|
56
|
-
buildRefetchOperation,
|
57
|
-
}: QueryGenerator);
|
@@ -1,97 +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 {QueryGenerator, RefetchRoot} from '.';
|
16
|
-
import type {Fragment} from '../../core/IR';
|
17
|
-
import type {Schema} from '../../core/Schema';
|
18
|
-
|
19
|
-
const {createUserError} = require('../../core/CompilerError');
|
20
|
-
const {
|
21
|
-
buildFragmentSpread,
|
22
|
-
buildOperationArgumentDefinitions,
|
23
|
-
} = require('./utils');
|
24
|
-
|
25
|
-
const VIEWER_TYPE_NAME = 'Viewer';
|
26
|
-
const VIEWER_FIELD_NAME = 'viewer';
|
27
|
-
|
28
|
-
function buildRefetchOperation(
|
29
|
-
schema: Schema,
|
30
|
-
fragment: Fragment,
|
31
|
-
queryName: string,
|
32
|
-
): ?RefetchRoot {
|
33
|
-
if (schema.getTypeString(fragment.type) !== VIEWER_TYPE_NAME) {
|
34
|
-
return null;
|
35
|
-
}
|
36
|
-
// Handle fragments on viewer
|
37
|
-
const queryType = schema.expectQueryType();
|
38
|
-
const viewerType = schema.getTypeFromString(VIEWER_TYPE_NAME);
|
39
|
-
const viewerField = schema.getFieldConfig(
|
40
|
-
schema.expectField(queryType, VIEWER_FIELD_NAME),
|
41
|
-
);
|
42
|
-
const viewerFieldType = schema.getNullableType(viewerField.type);
|
43
|
-
if (
|
44
|
-
!(
|
45
|
-
viewerType &&
|
46
|
-
schema.isObject(viewerType) &&
|
47
|
-
schema.isObject(viewerFieldType) &&
|
48
|
-
schema.areEqualTypes(viewerFieldType, viewerType) &&
|
49
|
-
viewerField.args.length === 0 &&
|
50
|
-
schema.areEqualTypes(fragment.type, viewerType)
|
51
|
-
)
|
52
|
-
) {
|
53
|
-
throw createUserError(
|
54
|
-
`Invalid use of @refetchable on fragment '${fragment.name}', check ` +
|
55
|
-
"that your schema defines a 'Viewer' object type and has a " +
|
56
|
-
"'viewer: Viewer' field on the query type.",
|
57
|
-
[fragment.loc],
|
58
|
-
);
|
59
|
-
}
|
60
|
-
return {
|
61
|
-
identifierField: null,
|
62
|
-
path: [VIEWER_FIELD_NAME],
|
63
|
-
node: {
|
64
|
-
argumentDefinitions: buildOperationArgumentDefinitions(
|
65
|
-
fragment.argumentDefinitions,
|
66
|
-
),
|
67
|
-
directives: [],
|
68
|
-
kind: 'Root',
|
69
|
-
loc: {kind: 'Derived', source: fragment.loc},
|
70
|
-
metadata: null,
|
71
|
-
name: queryName,
|
72
|
-
operation: 'query',
|
73
|
-
selections: [
|
74
|
-
{
|
75
|
-
alias: VIEWER_FIELD_NAME,
|
76
|
-
args: [],
|
77
|
-
connection: false,
|
78
|
-
directives: [],
|
79
|
-
handles: null,
|
80
|
-
kind: 'LinkedField',
|
81
|
-
loc: {kind: 'Derived', source: fragment.loc},
|
82
|
-
metadata: null,
|
83
|
-
name: VIEWER_FIELD_NAME,
|
84
|
-
selections: [buildFragmentSpread(fragment)],
|
85
|
-
type: schema.assertLinkedFieldType(viewerField.type),
|
86
|
-
},
|
87
|
-
],
|
88
|
-
type: queryType,
|
89
|
-
},
|
90
|
-
transformedFragment: fragment,
|
91
|
-
};
|
92
|
-
}
|
93
|
-
|
94
|
-
module.exports = ({
|
95
|
-
description: 'the Viewer type',
|
96
|
-
buildRefetchOperation,
|
97
|
-
}: QueryGenerator);
|
@@ -1,89 +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 {Fragment, Root} from '../../core/IR';
|
16
|
-
import type {Schema} from '../../core/Schema';
|
17
|
-
|
18
|
-
const {createUserError} = require('../../core/CompilerError');
|
19
|
-
const FetchableQueryGenerator = require('./FetchableQueryGenerator');
|
20
|
-
const NodeQueryGenerator = require('./NodeQueryGenerator');
|
21
|
-
const QueryQueryGenerator = require('./QueryQueryGenerator');
|
22
|
-
const ViewerQueryGenerator = require('./ViewerQueryGenerator');
|
23
|
-
|
24
|
-
export type RefetchRoot = {|
|
25
|
-
identifierField: ?string,
|
26
|
-
path: $ReadOnlyArray<string>,
|
27
|
-
node: Root,
|
28
|
-
transformedFragment: Fragment,
|
29
|
-
|};
|
30
|
-
|
31
|
-
/**
|
32
|
-
* A strategy to generate queries for a given fragment. Multiple stategies
|
33
|
-
* can be tried, such as generating a `node(id: ID)` query or a query directly
|
34
|
-
* on the root query type.
|
35
|
-
*/
|
36
|
-
export type QueryGenerator = {|
|
37
|
-
/**
|
38
|
-
* Used to describe what fragments this QueryGenerator applies to, used in
|
39
|
-
* error messages.
|
40
|
-
*/
|
41
|
-
+description: string,
|
42
|
-
/**
|
43
|
-
* Returns RefetchRoot or null if not applicable. Might throw a user error
|
44
|
-
* for an invalid schema or other problems.
|
45
|
-
*/
|
46
|
-
+buildRefetchOperation: (
|
47
|
-
schema: Schema,
|
48
|
-
fragment: Fragment,
|
49
|
-
queryName: string,
|
50
|
-
) => ?RefetchRoot,
|
51
|
-
|};
|
52
|
-
|
53
|
-
const GENERATORS = [
|
54
|
-
ViewerQueryGenerator,
|
55
|
-
QueryQueryGenerator,
|
56
|
-
NodeQueryGenerator,
|
57
|
-
FetchableQueryGenerator,
|
58
|
-
];
|
59
|
-
|
60
|
-
/**
|
61
|
-
* Builds a query to refetch the given fragment or throws if we have not way to
|
62
|
-
* generate one.
|
63
|
-
*/
|
64
|
-
function buildRefetchOperation(
|
65
|
-
schema: Schema,
|
66
|
-
fragment: Fragment,
|
67
|
-
queryName: string,
|
68
|
-
): RefetchRoot {
|
69
|
-
for (const generator of GENERATORS) {
|
70
|
-
const refetchRoot = generator.buildRefetchOperation(
|
71
|
-
schema,
|
72
|
-
fragment,
|
73
|
-
queryName,
|
74
|
-
);
|
75
|
-
if (refetchRoot != null) {
|
76
|
-
return refetchRoot;
|
77
|
-
}
|
78
|
-
}
|
79
|
-
throw createUserError(
|
80
|
-
`Invalid use of @refetchable on fragment '${fragment.name}', only ` +
|
81
|
-
'supported are fragments on:\n' +
|
82
|
-
GENERATORS.map(generator => ` - ${generator.description}`).join('\n'),
|
83
|
-
[fragment.loc],
|
84
|
-
);
|
85
|
-
}
|
86
|
-
|
87
|
-
module.exports = {
|
88
|
-
buildRefetchOperation,
|
89
|
-
};
|