relay-runtime 8.0.0 → 10.0.1
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/handlers/RelayDefaultHandlerProvider.js.flow +41 -0
- package/handlers/connection/ConnectionHandler.js.flow +549 -0
- package/handlers/connection/ConnectionInterface.js.flow +92 -0
- package/handlers/connection/MutationHandlers.js.flow +88 -0
- package/index.js +1 -1
- package/index.js.flow +320 -0
- package/lib/handlers/RelayDefaultHandlerProvider.js +13 -2
- package/lib/handlers/connection/{RelayConnectionHandler.js → ConnectionHandler.js} +33 -35
- package/lib/handlers/connection/{RelayConnectionInterface.js → ConnectionInterface.js} +2 -2
- package/lib/handlers/connection/MutationHandlers.js +86 -0
- package/lib/index.js +15 -19
- package/lib/mutations/RelayDeclarativeMutationConfig.js +29 -52
- package/lib/mutations/RelayRecordProxy.js +1 -3
- package/lib/mutations/RelayRecordSourceMutator.js +2 -9
- package/lib/mutations/RelayRecordSourceProxy.js +2 -4
- package/lib/mutations/RelayRecordSourceSelectorProxy.js +1 -13
- package/lib/mutations/commitMutation.js +13 -3
- package/lib/mutations/validateMutation.js +16 -9
- package/lib/network/RelayObservable.js +9 -9
- package/lib/network/RelayQueryResponseCache.js +8 -6
- package/lib/query/PreloadableQueryRegistry.js +70 -0
- package/lib/query/fetchQueryInternal.js +31 -23
- package/lib/store/DataChecker.js +122 -110
- package/lib/store/RelayConcreteVariables.js +6 -2
- package/lib/store/RelayModernEnvironment.js +121 -67
- package/lib/store/RelayModernFragmentSpecResolver.js +12 -16
- package/lib/store/RelayModernQueryExecutor.js +389 -314
- package/lib/store/RelayModernRecord.js +14 -9
- package/lib/store/RelayModernSelector.js +7 -3
- package/lib/store/RelayModernStore.js +289 -484
- package/lib/store/RelayOperationTracker.js +35 -78
- package/lib/store/RelayOptimisticRecordSource.js +7 -5
- package/lib/store/RelayPublishQueue.js +6 -33
- package/lib/store/RelayReader.js +113 -45
- package/lib/store/RelayRecordSource.js +2 -9
- package/lib/store/RelayRecordSourceMapImpl.js +13 -18
- package/lib/store/RelayReferenceMarker.js +40 -60
- package/lib/store/RelayResponseNormalizer.js +158 -193
- package/lib/store/RelayStoreUtils.js +1 -0
- package/lib/store/StoreInspector.js +8 -8
- package/lib/store/TypeID.js +28 -0
- package/lib/store/cloneRelayScalarHandleSourceField.js +44 -0
- package/lib/store/normalizeRelayPayload.js +6 -2
- package/lib/store/readInlineData.js +1 -1
- package/lib/subscription/requestSubscription.js +5 -3
- package/lib/util/RelayConcreteNode.js +9 -6
- package/lib/util/RelayError.js +39 -9
- package/lib/util/RelayFeatureFlags.js +2 -5
- package/lib/util/RelayReplaySubject.js +3 -3
- package/lib/util/createPayloadFor3DField.js +7 -2
- package/lib/util/getRequestIdentifier.js +2 -2
- package/lib/util/recycleNodesInto.js +2 -6
- package/mutations/RelayDeclarativeMutationConfig.js.flow +380 -0
- package/mutations/RelayRecordProxy.js.flow +165 -0
- package/mutations/RelayRecordSourceMutator.js.flow +238 -0
- package/mutations/RelayRecordSourceProxy.js.flow +164 -0
- package/mutations/RelayRecordSourceSelectorProxy.js.flow +119 -0
- package/mutations/applyOptimisticMutation.js.flow +76 -0
- package/mutations/commitLocalUpdate.js.flow +24 -0
- package/mutations/commitMutation.js.flow +182 -0
- package/mutations/validateMutation.js.flow +213 -0
- package/network/ConvertToExecuteFunction.js.flow +49 -0
- package/network/RelayNetwork.js.flow +84 -0
- package/network/RelayNetworkTypes.js.flow +123 -0
- package/network/RelayObservable.js.flow +634 -0
- package/network/RelayQueryResponseCache.js.flow +111 -0
- package/package.json +1 -1
- package/query/GraphQLTag.js.flow +166 -0
- package/query/PreloadableQueryRegistry.js.flow +65 -0
- package/query/fetchQuery.js.flow +47 -0
- package/query/fetchQueryInternal.js.flow +348 -0
- package/relay-runtime.js +2 -2
- package/relay-runtime.min.js +2 -2
- package/store/ClientID.js.flow +43 -0
- package/store/DataChecker.js.flow +502 -0
- package/store/RelayConcreteVariables.js.flow +96 -0
- package/store/RelayModernEnvironment.js.flow +551 -0
- package/store/RelayModernFragmentSpecResolver.js.flow +426 -0
- package/store/RelayModernOperationDescriptor.js.flow +88 -0
- package/store/RelayModernQueryExecutor.js.flow +1321 -0
- package/store/RelayModernRecord.js.flow +403 -0
- package/store/RelayModernSelector.js.flow +455 -0
- package/store/RelayModernStore.js.flow +842 -0
- package/store/RelayOperationTracker.js.flow +164 -0
- package/store/RelayOptimisticRecordSource.js.flow +119 -0
- package/store/RelayPublishQueue.js.flow +401 -0
- package/store/RelayReader.js.flow +473 -0
- package/store/RelayRecordSource.js.flow +29 -0
- package/store/RelayRecordSourceMapImpl.js.flow +87 -0
- package/store/RelayRecordState.js.flow +37 -0
- package/store/RelayReferenceMarker.js.flow +257 -0
- package/store/RelayResponseNormalizer.js.flow +680 -0
- package/store/RelayStoreTypes.js.flow +899 -0
- package/store/RelayStoreUtils.js.flow +219 -0
- package/store/StoreInspector.js.flow +171 -0
- package/store/TypeID.js.flow +28 -0
- package/store/ViewerPattern.js.flow +26 -0
- package/store/cloneRelayHandleSourceField.js.flow +66 -0
- package/store/cloneRelayScalarHandleSourceField.js.flow +62 -0
- package/store/createFragmentSpecResolver.js.flow +55 -0
- package/store/createRelayContext.js.flow +44 -0
- package/store/defaultGetDataID.js.flow +27 -0
- package/store/hasOverlappingIDs.js.flow +34 -0
- package/store/isRelayModernEnvironment.js.flow +27 -0
- package/store/normalizeRelayPayload.js.flow +51 -0
- package/store/readInlineData.js.flow +75 -0
- package/subscription/requestSubscription.js.flow +100 -0
- package/util/JSResourceTypes.flow.js.flow +20 -0
- package/util/NormalizationNode.js.flow +198 -0
- package/util/ReaderNode.js.flow +208 -0
- package/util/RelayConcreteNode.js.flow +93 -0
- package/util/RelayDefaultHandleKey.js.flow +17 -0
- package/util/RelayError.js.flow +62 -0
- package/util/RelayFeatureFlags.js.flow +30 -0
- package/util/RelayProfiler.js.flow +284 -0
- package/util/RelayReplaySubject.js.flow +135 -0
- package/util/RelayRuntimeTypes.js.flow +72 -0
- package/util/createPayloadFor3DField.js.flow +43 -0
- package/util/deepFreeze.js.flow +36 -0
- package/util/generateID.js.flow +21 -0
- package/util/getFragmentIdentifier.js.flow +52 -0
- package/util/getRelayHandleKey.js.flow +41 -0
- package/util/getRequestIdentifier.js.flow +42 -0
- package/util/isPromise.js.flow +21 -0
- package/util/isScalarAndEqual.js.flow +26 -0
- package/util/recycleNodesInto.js.flow +76 -0
- package/util/resolveImmediate.js.flow +30 -0
- package/util/stableCopy.js.flow +35 -0
- package/lib/handlers/RelayDefaultMissingFieldHandlers.js +0 -26
- package/lib/handlers/getRelayDefaultMissingFieldHandlers.js +0 -36
- package/lib/query/RelayModernGraphQLTag.js +0 -104
- package/lib/store/RelayConnection.js +0 -37
- package/lib/store/RelayConnectionResolver.js +0 -178
- package/lib/store/RelayRecordSourceObjectImpl.js +0 -79
- package/lib/util/getFragmentSpecIdentifier.js +0 -27
|
@@ -0,0 +1,257 @@
|
|
|
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 RelayConcreteNode = require('../util/RelayConcreteNode');
|
|
16
|
+
const RelayFeatureFlags = require('../util/RelayFeatureFlags');
|
|
17
|
+
const RelayModernRecord = require('./RelayModernRecord');
|
|
18
|
+
const RelayStoreUtils = require('./RelayStoreUtils');
|
|
19
|
+
|
|
20
|
+
const cloneRelayHandleSourceField = require('./cloneRelayHandleSourceField');
|
|
21
|
+
const invariant = require('invariant');
|
|
22
|
+
|
|
23
|
+
const {generateTypeID} = require('./TypeID');
|
|
24
|
+
|
|
25
|
+
import type {
|
|
26
|
+
NormalizationLinkedField,
|
|
27
|
+
NormalizationModuleImport,
|
|
28
|
+
NormalizationNode,
|
|
29
|
+
NormalizationSelection,
|
|
30
|
+
} from '../util/NormalizationNode';
|
|
31
|
+
import type {DataID, Variables} from '../util/RelayRuntimeTypes';
|
|
32
|
+
import type {
|
|
33
|
+
NormalizationSelector,
|
|
34
|
+
OperationLoader,
|
|
35
|
+
Record,
|
|
36
|
+
RecordSource,
|
|
37
|
+
} from './RelayStoreTypes';
|
|
38
|
+
|
|
39
|
+
const {
|
|
40
|
+
CONDITION,
|
|
41
|
+
CLIENT_EXTENSION,
|
|
42
|
+
DEFER,
|
|
43
|
+
FRAGMENT_SPREAD,
|
|
44
|
+
INLINE_FRAGMENT,
|
|
45
|
+
LINKED_FIELD,
|
|
46
|
+
MODULE_IMPORT,
|
|
47
|
+
LINKED_HANDLE,
|
|
48
|
+
SCALAR_FIELD,
|
|
49
|
+
SCALAR_HANDLE,
|
|
50
|
+
STREAM,
|
|
51
|
+
TYPE_DISCRIMINATOR,
|
|
52
|
+
} = RelayConcreteNode;
|
|
53
|
+
const {getStorageKey, getModuleOperationKey} = RelayStoreUtils;
|
|
54
|
+
|
|
55
|
+
function mark(
|
|
56
|
+
recordSource: RecordSource,
|
|
57
|
+
selector: NormalizationSelector,
|
|
58
|
+
references: Set<DataID>,
|
|
59
|
+
operationLoader: ?OperationLoader,
|
|
60
|
+
): void {
|
|
61
|
+
const {dataID, node, variables} = selector;
|
|
62
|
+
const marker = new RelayReferenceMarker(
|
|
63
|
+
recordSource,
|
|
64
|
+
variables,
|
|
65
|
+
references,
|
|
66
|
+
operationLoader,
|
|
67
|
+
);
|
|
68
|
+
marker.mark(node, dataID);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* @private
|
|
73
|
+
*/
|
|
74
|
+
class RelayReferenceMarker {
|
|
75
|
+
_operationLoader: OperationLoader | null;
|
|
76
|
+
_recordSource: RecordSource;
|
|
77
|
+
_references: Set<DataID>;
|
|
78
|
+
_variables: Variables;
|
|
79
|
+
|
|
80
|
+
constructor(
|
|
81
|
+
recordSource: RecordSource,
|
|
82
|
+
variables: Variables,
|
|
83
|
+
references: Set<DataID>,
|
|
84
|
+
operationLoader: ?OperationLoader,
|
|
85
|
+
) {
|
|
86
|
+
this._operationLoader = operationLoader ?? null;
|
|
87
|
+
this._recordSource = recordSource;
|
|
88
|
+
this._references = references;
|
|
89
|
+
this._variables = variables;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
mark(node: NormalizationNode, dataID: DataID): void {
|
|
93
|
+
this._traverse(node, dataID);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
_traverse(node: NormalizationNode, dataID: DataID): void {
|
|
97
|
+
this._references.add(dataID);
|
|
98
|
+
const record = this._recordSource.get(dataID);
|
|
99
|
+
if (record == null) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
this._traverseSelections(node.selections, record);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
_getVariableValue(name: string): mixed {
|
|
106
|
+
invariant(
|
|
107
|
+
this._variables.hasOwnProperty(name),
|
|
108
|
+
'RelayReferenceMarker(): Undefined variable `%s`.',
|
|
109
|
+
name,
|
|
110
|
+
);
|
|
111
|
+
return this._variables[name];
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
_traverseSelections(
|
|
115
|
+
selections: $ReadOnlyArray<NormalizationSelection>,
|
|
116
|
+
record: Record,
|
|
117
|
+
): void {
|
|
118
|
+
selections.forEach(selection => {
|
|
119
|
+
/* eslint-disable no-fallthrough */
|
|
120
|
+
switch (selection.kind) {
|
|
121
|
+
case LINKED_FIELD:
|
|
122
|
+
if (selection.plural) {
|
|
123
|
+
this._traversePluralLink(selection, record);
|
|
124
|
+
} else {
|
|
125
|
+
this._traverseLink(selection, record);
|
|
126
|
+
}
|
|
127
|
+
break;
|
|
128
|
+
case CONDITION:
|
|
129
|
+
const conditionValue = this._getVariableValue(selection.condition);
|
|
130
|
+
if (conditionValue === selection.passingValue) {
|
|
131
|
+
this._traverseSelections(selection.selections, record);
|
|
132
|
+
}
|
|
133
|
+
break;
|
|
134
|
+
case INLINE_FRAGMENT:
|
|
135
|
+
if (selection.abstractKey == null) {
|
|
136
|
+
const typeName = RelayModernRecord.getType(record);
|
|
137
|
+
if (typeName != null && typeName === selection.type) {
|
|
138
|
+
this._traverseSelections(selection.selections, record);
|
|
139
|
+
}
|
|
140
|
+
} else if (RelayFeatureFlags.ENABLE_PRECISE_TYPE_REFINEMENT) {
|
|
141
|
+
const typeName = RelayModernRecord.getType(record);
|
|
142
|
+
const typeID = generateTypeID(typeName);
|
|
143
|
+
this._references.add(typeID);
|
|
144
|
+
this._traverseSelections(selection.selections, record);
|
|
145
|
+
} else {
|
|
146
|
+
this._traverseSelections(selection.selections, record);
|
|
147
|
+
}
|
|
148
|
+
break;
|
|
149
|
+
case FRAGMENT_SPREAD:
|
|
150
|
+
invariant(
|
|
151
|
+
false,
|
|
152
|
+
'RelayReferenceMarker(): Unexpected fragment spread `...%s`, ' +
|
|
153
|
+
'expected all fragments to be inlined.',
|
|
154
|
+
selection.name,
|
|
155
|
+
);
|
|
156
|
+
case LINKED_HANDLE:
|
|
157
|
+
// The selections for a "handle" field are the same as those of the
|
|
158
|
+
// original linked field where the handle was applied. Reference marking
|
|
159
|
+
// therefore requires traversing the original field selections against
|
|
160
|
+
// the synthesized client field.
|
|
161
|
+
//
|
|
162
|
+
// TODO: Instead of finding the source field in `selections`, change
|
|
163
|
+
// the concrete structure to allow shared subtrees, and have the linked
|
|
164
|
+
// handle directly refer to the same selections as the LinkedField that
|
|
165
|
+
// it was split from.
|
|
166
|
+
const handleField = cloneRelayHandleSourceField(
|
|
167
|
+
selection,
|
|
168
|
+
selections,
|
|
169
|
+
this._variables,
|
|
170
|
+
);
|
|
171
|
+
if (handleField.plural) {
|
|
172
|
+
this._traversePluralLink(handleField, record);
|
|
173
|
+
} else {
|
|
174
|
+
this._traverseLink(handleField, record);
|
|
175
|
+
}
|
|
176
|
+
break;
|
|
177
|
+
case DEFER:
|
|
178
|
+
case STREAM:
|
|
179
|
+
this._traverseSelections(selection.selections, record);
|
|
180
|
+
break;
|
|
181
|
+
case SCALAR_FIELD:
|
|
182
|
+
case SCALAR_HANDLE:
|
|
183
|
+
break;
|
|
184
|
+
case TYPE_DISCRIMINATOR: {
|
|
185
|
+
if (RelayFeatureFlags.ENABLE_PRECISE_TYPE_REFINEMENT) {
|
|
186
|
+
const typeName = RelayModernRecord.getType(record);
|
|
187
|
+
const typeID = generateTypeID(typeName);
|
|
188
|
+
this._references.add(typeID);
|
|
189
|
+
}
|
|
190
|
+
break;
|
|
191
|
+
}
|
|
192
|
+
case MODULE_IMPORT:
|
|
193
|
+
this._traverseModuleImport(selection, record);
|
|
194
|
+
break;
|
|
195
|
+
case CLIENT_EXTENSION:
|
|
196
|
+
this._traverseSelections(selection.selections, record);
|
|
197
|
+
break;
|
|
198
|
+
default:
|
|
199
|
+
(selection: empty);
|
|
200
|
+
invariant(
|
|
201
|
+
false,
|
|
202
|
+
'RelayReferenceMarker: Unknown AST node `%s`.',
|
|
203
|
+
selection,
|
|
204
|
+
);
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
_traverseModuleImport(
|
|
210
|
+
moduleImport: NormalizationModuleImport,
|
|
211
|
+
record: Record,
|
|
212
|
+
): void {
|
|
213
|
+
const operationLoader = this._operationLoader;
|
|
214
|
+
invariant(
|
|
215
|
+
operationLoader !== null,
|
|
216
|
+
'RelayReferenceMarker: Expected an operationLoader to be configured when using `@module`.',
|
|
217
|
+
);
|
|
218
|
+
const operationKey = getModuleOperationKey(moduleImport.documentName);
|
|
219
|
+
const operationReference = RelayModernRecord.getValue(record, operationKey);
|
|
220
|
+
if (operationReference == null) {
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
const operation = operationLoader.get(operationReference);
|
|
224
|
+
if (operation != null) {
|
|
225
|
+
this._traverseSelections(operation.selections, record);
|
|
226
|
+
}
|
|
227
|
+
// Otherwise, if the operation is not available, we assume that the data
|
|
228
|
+
// cannot have been processed yet and therefore isn't in the store to
|
|
229
|
+
// begin with.
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
_traverseLink(field: NormalizationLinkedField, record: Record): void {
|
|
233
|
+
const storageKey = getStorageKey(field, this._variables);
|
|
234
|
+
const linkedID = RelayModernRecord.getLinkedRecordID(record, storageKey);
|
|
235
|
+
|
|
236
|
+
if (linkedID == null) {
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
this._traverse(field, linkedID);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
_traversePluralLink(field: NormalizationLinkedField, record: Record): void {
|
|
243
|
+
const storageKey = getStorageKey(field, this._variables);
|
|
244
|
+
const linkedIDs = RelayModernRecord.getLinkedRecordIDs(record, storageKey);
|
|
245
|
+
|
|
246
|
+
if (linkedIDs == null) {
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
linkedIDs.forEach(linkedID => {
|
|
250
|
+
if (linkedID != null) {
|
|
251
|
+
this._traverse(field, linkedID);
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
module.exports = {mark};
|