relay-runtime 11.0.0-rc.0 → 12.0.0
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/connection/ConnectionHandler.js.flow +7 -0
- package/handlers/connection/MutationHandlers.js.flow +28 -0
- package/index.js +1 -1
- package/index.js.flow +20 -3
- package/lib/handlers/RelayDefaultHandlerProvider.js +1 -1
- package/lib/handlers/connection/ConnectionHandler.js +12 -6
- package/lib/handlers/connection/MutationHandlers.js +67 -8
- package/lib/index.js +15 -0
- package/lib/multi-actor-environment/ActorIdentifier.js +33 -0
- package/lib/multi-actor-environment/ActorSpecificEnvironment.js +148 -0
- package/lib/multi-actor-environment/ActorUtils.js +27 -0
- package/lib/multi-actor-environment/MultiActorEnvironment.js +406 -0
- package/lib/multi-actor-environment/MultiActorEnvironmentTypes.js +11 -0
- package/lib/multi-actor-environment/index.js +21 -0
- package/lib/mutations/RelayRecordProxy.js +1 -1
- package/lib/mutations/RelayRecordSourceMutator.js +1 -1
- package/lib/mutations/RelayRecordSourceProxy.js +1 -1
- package/lib/mutations/RelayRecordSourceSelectorProxy.js +7 -2
- package/lib/mutations/applyOptimisticMutation.js +1 -1
- package/lib/mutations/commitMutation.js +5 -2
- package/lib/mutations/validateMutation.js +39 -17
- package/lib/network/RelayNetwork.js +1 -1
- package/lib/network/RelayObservable.js +3 -1
- package/lib/network/RelayQueryResponseCache.js +20 -3
- package/lib/network/wrapNetworkWithLogObserver.js +78 -0
- package/lib/query/GraphQLTag.js +1 -1
- package/lib/query/fetchQuery.js +1 -1
- package/lib/query/fetchQueryInternal.js +1 -1
- package/lib/store/DataChecker.js +132 -50
- package/lib/store/{RelayModernQueryExecutor.js → OperationExecutor.js} +524 -187
- package/lib/store/RelayConcreteVariables.js +29 -4
- package/lib/store/RelayModernEnvironment.js +137 -220
- package/lib/store/RelayModernFragmentSpecResolver.js +49 -23
- package/lib/store/RelayModernRecord.js +36 -2
- package/lib/store/RelayModernSelector.js +1 -1
- package/lib/store/RelayModernStore.js +53 -22
- package/lib/store/RelayOperationTracker.js +34 -24
- package/lib/store/RelayPublishQueue.js +30 -8
- package/lib/store/RelayReader.js +177 -29
- package/lib/store/RelayRecordSource.js +87 -3
- package/lib/store/RelayReferenceMarker.js +53 -28
- package/lib/store/RelayResponseNormalizer.js +247 -108
- package/lib/store/RelayStoreReactFlightUtils.js +7 -11
- package/lib/store/RelayStoreSubscriptions.js +8 -5
- package/lib/store/RelayStoreUtils.js +10 -4
- package/lib/store/ResolverCache.js +213 -0
- package/lib/store/ResolverFragments.js +57 -0
- package/lib/store/cloneRelayHandleSourceField.js +1 -1
- package/lib/store/cloneRelayScalarHandleSourceField.js +1 -1
- package/lib/store/createRelayContext.js +2 -2
- package/lib/store/defaultGetDataID.js +3 -1
- package/lib/store/readInlineData.js +1 -1
- package/lib/subscription/requestSubscription.js +32 -6
- package/lib/util/RelayConcreteNode.js +3 -0
- package/lib/util/RelayFeatureFlags.js +5 -4
- package/lib/util/RelayProfiler.js +17 -187
- package/lib/util/RelayReplaySubject.js +22 -7
- package/lib/util/deepFreeze.js +1 -0
- package/lib/util/getPaginationMetadata.js +41 -0
- package/lib/util/getPaginationVariables.js +67 -0
- package/lib/util/getPendingOperationsForFragment.js +55 -0
- package/lib/util/getRefetchMetadata.js +36 -0
- package/lib/util/getRelayHandleKey.js +1 -1
- package/lib/util/getRequestIdentifier.js +1 -1
- package/lib/util/getValueAtPath.js +51 -0
- package/lib/util/isEmptyObject.js +1 -1
- package/lib/util/registerEnvironmentWithDevTools.js +26 -0
- package/lib/util/withDuration.js +31 -0
- package/multi-actor-environment/ActorIdentifier.js.flow +43 -0
- package/multi-actor-environment/ActorSpecificEnvironment.js.flow +217 -0
- package/multi-actor-environment/ActorUtils.js.flow +33 -0
- package/multi-actor-environment/MultiActorEnvironment.js.flow +485 -0
- package/multi-actor-environment/MultiActorEnvironmentTypes.js.flow +245 -0
- package/multi-actor-environment/index.js.flow +27 -0
- package/mutations/RelayRecordSourceSelectorProxy.js.flow +7 -2
- package/mutations/commitMutation.js.flow +3 -1
- package/mutations/validateMutation.js.flow +42 -16
- package/network/RelayNetworkTypes.js.flow +17 -8
- package/network/RelayObservable.js.flow +2 -0
- package/network/RelayQueryResponseCache.js.flow +31 -17
- package/network/wrapNetworkWithLogObserver.js.flow +99 -0
- package/package.json +3 -2
- package/relay-runtime.js +2 -2
- package/relay-runtime.min.js +2 -2
- package/store/ClientID.js.flow +5 -1
- package/store/DataChecker.js.flow +148 -44
- package/store/{RelayModernQueryExecutor.js.flow → OperationExecutor.js.flow} +578 -237
- package/store/RelayConcreteVariables.js.flow +31 -1
- package/store/RelayModernEnvironment.js.flow +132 -220
- package/store/RelayModernFragmentSpecResolver.js.flow +40 -14
- package/store/RelayModernOperationDescriptor.js.flow +9 -3
- package/store/RelayModernRecord.js.flow +49 -0
- package/store/RelayModernStore.js.flow +57 -17
- package/store/RelayOperationTracker.js.flow +56 -34
- package/store/RelayPublishQueue.js.flow +37 -11
- package/store/RelayReader.js.flow +186 -27
- package/store/RelayRecordSource.js.flow +72 -6
- package/store/RelayReferenceMarker.js.flow +51 -21
- package/store/RelayResponseNormalizer.js.flow +251 -67
- package/store/RelayStoreReactFlightUtils.js.flow +6 -9
- package/store/RelayStoreSubscriptions.js.flow +10 -3
- package/store/RelayStoreTypes.js.flow +144 -21
- package/store/RelayStoreUtils.js.flow +19 -4
- package/store/ResolverCache.js.flow +247 -0
- package/store/ResolverFragments.js.flow +128 -0
- package/store/createRelayContext.js.flow +1 -1
- package/store/defaultGetDataID.js.flow +3 -1
- package/subscription/requestSubscription.js.flow +43 -8
- package/util/NormalizationNode.js.flow +16 -3
- package/util/ReaderNode.js.flow +29 -2
- package/util/RelayConcreteNode.js.flow +3 -0
- package/util/RelayFeatureFlags.js.flow +10 -6
- package/util/RelayProfiler.js.flow +22 -194
- package/util/RelayReplaySubject.js.flow +7 -6
- package/util/RelayRuntimeTypes.js.flow +4 -2
- package/util/deepFreeze.js.flow +2 -1
- package/util/getPaginationMetadata.js.flow +74 -0
- package/util/getPaginationVariables.js.flow +112 -0
- package/util/getPendingOperationsForFragment.js.flow +62 -0
- package/util/getRefetchMetadata.js.flow +80 -0
- package/util/getValueAtPath.js.flow +46 -0
- package/util/isEmptyObject.js.flow +2 -1
- package/util/registerEnvironmentWithDevTools.js.flow +33 -0
- package/util/withDuration.js.flow +32 -0
- package/lib/store/RelayRecordSourceMapImpl.js +0 -107
- package/lib/store/RelayStoreSubscriptionsUsingMapByID.js +0 -318
- package/store/RelayRecordSourceMapImpl.js.flow +0 -91
- package/store/RelayStoreSubscriptionsUsingMapByID.js.flow +0 -283
|
@@ -20,55 +20,62 @@ var RelayFeatureFlags = require('../util/RelayFeatureFlags');
|
|
|
20
20
|
|
|
21
21
|
var RelayModernRecord = require('./RelayModernRecord');
|
|
22
22
|
|
|
23
|
-
var RelayProfiler = require('../util/RelayProfiler');
|
|
24
|
-
|
|
25
23
|
var areEqual = require("fbjs/lib/areEqual");
|
|
26
24
|
|
|
27
|
-
var invariant = require(
|
|
25
|
+
var invariant = require('invariant');
|
|
28
26
|
|
|
29
27
|
var warning = require("fbjs/lib/warning");
|
|
30
28
|
|
|
31
|
-
var _require = require('../
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
var _require5 = require('./
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
29
|
+
var _require = require('../multi-actor-environment/ActorUtils'),
|
|
30
|
+
ACTOR_IDENTIFIER_FIELD_NAME = _require.ACTOR_IDENTIFIER_FIELD_NAME,
|
|
31
|
+
getActorIdentifierFromPayload = _require.getActorIdentifierFromPayload;
|
|
32
|
+
|
|
33
|
+
var _require2 = require('../util/RelayConcreteNode'),
|
|
34
|
+
ACTOR_CHANGE = _require2.ACTOR_CHANGE,
|
|
35
|
+
CONDITION = _require2.CONDITION,
|
|
36
|
+
CLIENT_COMPONENT = _require2.CLIENT_COMPONENT,
|
|
37
|
+
CLIENT_EXTENSION = _require2.CLIENT_EXTENSION,
|
|
38
|
+
DEFER = _require2.DEFER,
|
|
39
|
+
FLIGHT_FIELD = _require2.FLIGHT_FIELD,
|
|
40
|
+
FRAGMENT_SPREAD = _require2.FRAGMENT_SPREAD,
|
|
41
|
+
INLINE_FRAGMENT = _require2.INLINE_FRAGMENT,
|
|
42
|
+
LINKED_FIELD = _require2.LINKED_FIELD,
|
|
43
|
+
LINKED_HANDLE = _require2.LINKED_HANDLE,
|
|
44
|
+
MODULE_IMPORT = _require2.MODULE_IMPORT,
|
|
45
|
+
SCALAR_FIELD = _require2.SCALAR_FIELD,
|
|
46
|
+
SCALAR_HANDLE = _require2.SCALAR_HANDLE,
|
|
47
|
+
STREAM = _require2.STREAM,
|
|
48
|
+
TYPE_DISCRIMINATOR = _require2.TYPE_DISCRIMINATOR;
|
|
49
|
+
|
|
50
|
+
var _require3 = require('./ClientID'),
|
|
51
|
+
generateClientID = _require3.generateClientID,
|
|
52
|
+
isClientID = _require3.isClientID;
|
|
53
|
+
|
|
54
|
+
var _require4 = require('./RelayConcreteVariables'),
|
|
55
|
+
getLocalVariables = _require4.getLocalVariables;
|
|
56
|
+
|
|
57
|
+
var _require5 = require('./RelayModernSelector'),
|
|
58
|
+
createNormalizationSelector = _require5.createNormalizationSelector;
|
|
59
|
+
|
|
60
|
+
var _require6 = require('./RelayStoreReactFlightUtils'),
|
|
61
|
+
refineToReactFlightPayloadData = _require6.refineToReactFlightPayloadData,
|
|
62
|
+
REACT_FLIGHT_EXECUTABLE_DEFINITIONS_STORAGE_KEY = _require6.REACT_FLIGHT_EXECUTABLE_DEFINITIONS_STORAGE_KEY,
|
|
63
|
+
REACT_FLIGHT_TREE_STORAGE_KEY = _require6.REACT_FLIGHT_TREE_STORAGE_KEY,
|
|
64
|
+
REACT_FLIGHT_TYPE_NAME = _require6.REACT_FLIGHT_TYPE_NAME;
|
|
65
|
+
|
|
66
|
+
var _require7 = require('./RelayStoreUtils'),
|
|
67
|
+
getArgumentValues = _require7.getArgumentValues,
|
|
68
|
+
getHandleStorageKey = _require7.getHandleStorageKey,
|
|
69
|
+
getModuleComponentKey = _require7.getModuleComponentKey,
|
|
70
|
+
getModuleOperationKey = _require7.getModuleOperationKey,
|
|
71
|
+
getStorageKey = _require7.getStorageKey,
|
|
72
|
+
TYPENAME_KEY = _require7.TYPENAME_KEY,
|
|
73
|
+
ROOT_ID = _require7.ROOT_ID,
|
|
74
|
+
ROOT_TYPE = _require7.ROOT_TYPE;
|
|
75
|
+
|
|
76
|
+
var _require8 = require('./TypeID'),
|
|
77
|
+
generateTypeID = _require8.generateTypeID,
|
|
78
|
+
TYPE_SCHEMA_TYPE = _require8.TYPE_SCHEMA_TYPE;
|
|
72
79
|
|
|
73
80
|
/**
|
|
74
81
|
* Normalizes the results of a query and standard GraphQL response, writing the
|
|
@@ -90,18 +97,20 @@ function normalize(recordSource, selector, response, options) {
|
|
|
90
97
|
|
|
91
98
|
var RelayResponseNormalizer = /*#__PURE__*/function () {
|
|
92
99
|
function RelayResponseNormalizer(recordSource, variables, options) {
|
|
100
|
+
this._actorIdentifier = options.actorIdentifier;
|
|
93
101
|
this._getDataId = options.getDataID;
|
|
94
102
|
this._handleFieldPayloads = [];
|
|
95
103
|
this._treatMissingFieldsAsNull = options.treatMissingFieldsAsNull;
|
|
96
104
|
this._incrementalPlaceholders = [];
|
|
97
105
|
this._isClientExtension = false;
|
|
98
106
|
this._isUnmatchedAbstractType = false;
|
|
99
|
-
this.
|
|
107
|
+
this._followupPayloads = [];
|
|
100
108
|
this._path = options.path ? (0, _toConsumableArray2["default"])(options.path) : [];
|
|
101
109
|
this._recordSource = recordSource;
|
|
102
110
|
this._variables = variables;
|
|
103
111
|
this._reactFlightPayloadDeserializer = options.reactFlightPayloadDeserializer;
|
|
104
112
|
this._reactFlightServerErrorHandler = options.reactFlightServerErrorHandler;
|
|
113
|
+
this._shouldProcessClientComponents = options.shouldProcessClientComponents;
|
|
105
114
|
}
|
|
106
115
|
|
|
107
116
|
var _proto = RelayResponseNormalizer.prototype;
|
|
@@ -117,14 +126,15 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
|
|
|
117
126
|
errors: null,
|
|
118
127
|
fieldPayloads: this._handleFieldPayloads,
|
|
119
128
|
incrementalPlaceholders: this._incrementalPlaceholders,
|
|
120
|
-
|
|
129
|
+
followupPayloads: this._followupPayloads,
|
|
121
130
|
source: this._recordSource,
|
|
122
131
|
isFinal: false
|
|
123
132
|
};
|
|
124
133
|
};
|
|
125
134
|
|
|
126
135
|
_proto._getVariableValue = function _getVariableValue(name) {
|
|
127
|
-
!this._variables.hasOwnProperty(name) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer(): Undefined variable `%s`.', name) : invariant(false) : void 0;
|
|
136
|
+
!this._variables.hasOwnProperty(name) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer(): Undefined variable `%s`.', name) : invariant(false) : void 0; // $FlowFixMe[cannot-write]
|
|
137
|
+
|
|
128
138
|
return this._variables[name];
|
|
129
139
|
};
|
|
130
140
|
|
|
@@ -146,7 +156,7 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
|
|
|
146
156
|
break;
|
|
147
157
|
|
|
148
158
|
case CONDITION:
|
|
149
|
-
var conditionValue = this._getVariableValue(selection.condition);
|
|
159
|
+
var conditionValue = Boolean(this._getVariableValue(selection.condition));
|
|
150
160
|
|
|
151
161
|
if (conditionValue === selection.passingValue) {
|
|
152
162
|
this._traverseSelections(selection, record, data);
|
|
@@ -156,8 +166,12 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
|
|
|
156
166
|
|
|
157
167
|
case FRAGMENT_SPREAD:
|
|
158
168
|
{
|
|
169
|
+
var prevVariables = this._variables;
|
|
170
|
+
this._variables = getLocalVariables(this._variables, selection.fragment.argumentDefinitions, selection.args);
|
|
171
|
+
|
|
159
172
|
this._traverseSelections(selection.fragment, record, data);
|
|
160
173
|
|
|
174
|
+
this._variables = prevVariables;
|
|
161
175
|
break;
|
|
162
176
|
}
|
|
163
177
|
|
|
@@ -171,7 +185,7 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
|
|
|
171
185
|
if (_typeName === selection.type) {
|
|
172
186
|
this._traverseSelections(selection, record, data);
|
|
173
187
|
}
|
|
174
|
-
} else
|
|
188
|
+
} else {
|
|
175
189
|
var implementsInterface = data.hasOwnProperty(abstractKey);
|
|
176
190
|
|
|
177
191
|
var _typeName2 = RelayModernRecord.getType(record);
|
|
@@ -191,18 +205,6 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
|
|
|
191
205
|
if (implementsInterface) {
|
|
192
206
|
this._traverseSelections(selection, record, data);
|
|
193
207
|
}
|
|
194
|
-
} else {
|
|
195
|
-
// legacy behavior for abstract refinements: always normalize even
|
|
196
|
-
// if the type doesn't conform, but track if the type matches or not
|
|
197
|
-
// for determining whether response fields are expected to be present
|
|
198
|
-
var _implementsInterface = data.hasOwnProperty(abstractKey);
|
|
199
|
-
|
|
200
|
-
var parentIsUnmatchedAbstractType = this._isUnmatchedAbstractType;
|
|
201
|
-
this._isUnmatchedAbstractType = this._isUnmatchedAbstractType || !_implementsInterface;
|
|
202
|
-
|
|
203
|
-
this._traverseSelections(selection, record, data);
|
|
204
|
-
|
|
205
|
-
this._isUnmatchedAbstractType = parentIsUnmatchedAbstractType;
|
|
206
208
|
}
|
|
207
209
|
|
|
208
210
|
break;
|
|
@@ -210,26 +212,23 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
|
|
|
210
212
|
|
|
211
213
|
case TYPE_DISCRIMINATOR:
|
|
212
214
|
{
|
|
213
|
-
|
|
214
|
-
var _abstractKey = selection.abstractKey;
|
|
215
|
-
|
|
216
|
-
var _implementsInterface2 = data.hasOwnProperty(_abstractKey);
|
|
215
|
+
var _abstractKey = selection.abstractKey;
|
|
217
216
|
|
|
218
|
-
|
|
217
|
+
var _implementsInterface = data.hasOwnProperty(_abstractKey);
|
|
219
218
|
|
|
220
|
-
|
|
219
|
+
var _typeName3 = RelayModernRecord.getType(record);
|
|
221
220
|
|
|
222
|
-
|
|
221
|
+
var _typeID = generateTypeID(_typeName3);
|
|
223
222
|
|
|
224
|
-
|
|
225
|
-
_typeRecord = RelayModernRecord.create(_typeID, TYPE_SCHEMA_TYPE);
|
|
223
|
+
var _typeRecord = this._recordSource.get(_typeID);
|
|
226
224
|
|
|
227
|
-
|
|
228
|
-
|
|
225
|
+
if (_typeRecord == null) {
|
|
226
|
+
_typeRecord = RelayModernRecord.create(_typeID, TYPE_SCHEMA_TYPE);
|
|
229
227
|
|
|
230
|
-
|
|
228
|
+
this._recordSource.set(_typeID, _typeRecord);
|
|
231
229
|
}
|
|
232
230
|
|
|
231
|
+
RelayModernRecord.setValue(_typeRecord, _abstractKey, _implementsInterface);
|
|
233
232
|
break;
|
|
234
233
|
}
|
|
235
234
|
|
|
@@ -240,12 +239,17 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
|
|
|
240
239
|
var handleKey = getHandleStorageKey(selection, this._variables);
|
|
241
240
|
|
|
242
241
|
this._handleFieldPayloads.push({
|
|
242
|
+
/* $FlowFixMe[class-object-subtyping] added when improving typing
|
|
243
|
+
* for this parameters */
|
|
243
244
|
args: args,
|
|
244
245
|
dataID: RelayModernRecord.getDataID(record),
|
|
245
246
|
fieldKey: fieldKey,
|
|
246
247
|
handle: selection.handle,
|
|
247
248
|
handleKey: handleKey,
|
|
248
|
-
handleArgs: selection.handleArgs ?
|
|
249
|
+
handleArgs: selection.handleArgs ?
|
|
250
|
+
/* $FlowFixMe[class-object-subtyping] added when improving typing
|
|
251
|
+
* for this parameters */
|
|
252
|
+
getArgumentValues(selection.handleArgs, this._variables) : {}
|
|
249
253
|
});
|
|
250
254
|
|
|
251
255
|
break;
|
|
@@ -274,6 +278,15 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
|
|
|
274
278
|
this._isClientExtension = isClientExtension;
|
|
275
279
|
break;
|
|
276
280
|
|
|
281
|
+
case CLIENT_COMPONENT:
|
|
282
|
+
if (this._shouldProcessClientComponents === false) {
|
|
283
|
+
break;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
this._traverseSelections(selection.fragment, record, data);
|
|
287
|
+
|
|
288
|
+
break;
|
|
289
|
+
|
|
277
290
|
case FLIGHT_FIELD:
|
|
278
291
|
if (RelayFeatureFlags.ENABLE_REACT_FLIGHT_COMPONENT_FIELD) {
|
|
279
292
|
this._normalizeFlightField(node, selection, record, data);
|
|
@@ -283,6 +296,11 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
|
|
|
283
296
|
|
|
284
297
|
break;
|
|
285
298
|
|
|
299
|
+
case ACTOR_CHANGE:
|
|
300
|
+
this._normalizeActorChange(node, selection, record, data);
|
|
301
|
+
|
|
302
|
+
break;
|
|
303
|
+
|
|
286
304
|
default:
|
|
287
305
|
selection;
|
|
288
306
|
!false ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer(): Unexpected ast kind `%s`.', selection.kind) : invariant(false) : void 0;
|
|
@@ -310,7 +328,8 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
|
|
|
310
328
|
label: defer.label,
|
|
311
329
|
path: (0, _toConsumableArray2["default"])(this._path),
|
|
312
330
|
selector: createNormalizationSelector(defer, RelayModernRecord.getDataID(record), this._variables),
|
|
313
|
-
typeName: RelayModernRecord.getType(record)
|
|
331
|
+
typeName: RelayModernRecord.getType(record),
|
|
332
|
+
actorIdentifier: this._actorIdentifier
|
|
314
333
|
});
|
|
315
334
|
}
|
|
316
335
|
};
|
|
@@ -336,7 +355,8 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
|
|
|
336
355
|
path: (0, _toConsumableArray2["default"])(this._path),
|
|
337
356
|
parentID: RelayModernRecord.getDataID(record),
|
|
338
357
|
node: stream,
|
|
339
|
-
variables: this._variables
|
|
358
|
+
variables: this._variables,
|
|
359
|
+
actorIdentifier: this._actorIdentifier
|
|
340
360
|
});
|
|
341
361
|
}
|
|
342
362
|
};
|
|
@@ -352,13 +372,16 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
|
|
|
352
372
|
RelayModernRecord.setValue(record, operationKey, operationReference !== null && operationReference !== void 0 ? operationReference : null);
|
|
353
373
|
|
|
354
374
|
if (operationReference != null) {
|
|
355
|
-
this.
|
|
375
|
+
this._followupPayloads.push({
|
|
376
|
+
kind: 'ModuleImportPayload',
|
|
377
|
+
args: moduleImport.args,
|
|
356
378
|
data: data,
|
|
357
379
|
dataID: RelayModernRecord.getDataID(record),
|
|
358
380
|
operationReference: operationReference,
|
|
359
381
|
path: (0, _toConsumableArray2["default"])(this._path),
|
|
360
382
|
typeName: typeName,
|
|
361
|
-
variables: this._variables
|
|
383
|
+
variables: this._variables,
|
|
384
|
+
actorIdentifier: this._actorIdentifier
|
|
362
385
|
});
|
|
363
386
|
}
|
|
364
387
|
};
|
|
@@ -429,19 +452,97 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
|
|
|
429
452
|
}
|
|
430
453
|
};
|
|
431
454
|
|
|
455
|
+
_proto._normalizeActorChange = function _normalizeActorChange(parent, selection, record, data) {
|
|
456
|
+
var _field$concreteType;
|
|
457
|
+
|
|
458
|
+
var field = selection.linkedField;
|
|
459
|
+
!(typeof data === 'object' && data) ? process.env.NODE_ENV !== "production" ? invariant(false, '_normalizeActorChange(): Expected data for field `%s` to be an object.', field.name) : invariant(false) : void 0;
|
|
460
|
+
var responseKey = field.alias || field.name;
|
|
461
|
+
var storageKey = getStorageKey(field, this._variables);
|
|
462
|
+
var fieldValue = data[responseKey];
|
|
463
|
+
|
|
464
|
+
if (fieldValue == null) {
|
|
465
|
+
if (fieldValue === undefined) {
|
|
466
|
+
var isOptionalField = this._isClientExtension || this._isUnmatchedAbstractType;
|
|
467
|
+
|
|
468
|
+
if (isOptionalField) {
|
|
469
|
+
return;
|
|
470
|
+
} else if (!this._treatMissingFieldsAsNull) {
|
|
471
|
+
if (process.env.NODE_ENV !== "production") {
|
|
472
|
+
process.env.NODE_ENV !== "production" ? warning(false, 'RelayResponseNormalizer: Payload did not contain a value ' + 'for field `%s: %s`. Check that you are parsing with the same ' + 'query that was used to fetch the payload.', responseKey, storageKey) : void 0;
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
return;
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
RelayModernRecord.setValue(record, storageKey, null);
|
|
480
|
+
return;
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
var actorIdentifier = getActorIdentifierFromPayload(fieldValue);
|
|
484
|
+
|
|
485
|
+
if (actorIdentifier == null) {
|
|
486
|
+
if (process.env.NODE_ENV !== "production") {
|
|
487
|
+
process.env.NODE_ENV !== "production" ? warning(false, 'RelayResponseNormalizer: Payload did not contain a value ' + 'for field `%s`. Check that you are parsing with the same ' + 'query that was used to fetch the payload. Payload is `%s`.', ACTOR_IDENTIFIER_FIELD_NAME, JSON.stringify(fieldValue, null, 2)) : void 0;
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
RelayModernRecord.setValue(record, storageKey, null);
|
|
491
|
+
return;
|
|
492
|
+
} // $FlowFixMe[incompatible-call]
|
|
493
|
+
|
|
494
|
+
|
|
495
|
+
var typeName = (_field$concreteType = field.concreteType) !== null && _field$concreteType !== void 0 ? _field$concreteType : this._getRecordType(fieldValue);
|
|
496
|
+
var nextID = this._getDataId( // $FlowFixMe[incompatible-call]
|
|
497
|
+
fieldValue, typeName) || RelayModernRecord.getLinkedRecordID(record, storageKey) || generateClientID(RelayModernRecord.getDataID(record), storageKey);
|
|
498
|
+
!(typeof nextID === 'string') ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer: Expected id on field `%s` to be a string.', storageKey) : invariant(false) : void 0;
|
|
499
|
+
RelayModernRecord.setActorLinkedRecordID(record, storageKey, actorIdentifier, nextID);
|
|
500
|
+
|
|
501
|
+
this._followupPayloads.push({
|
|
502
|
+
kind: 'ActorPayload',
|
|
503
|
+
data: fieldValue,
|
|
504
|
+
dataID: nextID,
|
|
505
|
+
path: [].concat((0, _toConsumableArray2["default"])(this._path), [responseKey]),
|
|
506
|
+
typeName: typeName,
|
|
507
|
+
variables: this._variables,
|
|
508
|
+
node: field,
|
|
509
|
+
actorIdentifier: actorIdentifier
|
|
510
|
+
});
|
|
511
|
+
};
|
|
512
|
+
|
|
432
513
|
_proto._normalizeFlightField = function _normalizeFlightField(parent, selection, record, data) {
|
|
433
514
|
var responseKey = selection.alias || selection.name;
|
|
434
515
|
var storageKey = getStorageKey(selection, this._variables);
|
|
435
516
|
var fieldValue = data[responseKey];
|
|
436
517
|
|
|
437
518
|
if (fieldValue == null) {
|
|
519
|
+
if (fieldValue === undefined) {
|
|
520
|
+
// Flight field may be missing in the response if:
|
|
521
|
+
// - It is inside an abstract type refinement where the concrete type does
|
|
522
|
+
// not conform to the interface/union.
|
|
523
|
+
// However an otherwise-required field may also be missing if the server
|
|
524
|
+
// is configured to skip fields with `null` values, in which case the
|
|
525
|
+
// client is assumed to be correctly configured with
|
|
526
|
+
// treatMissingFieldsAsNull=true.
|
|
527
|
+
if (this._isUnmatchedAbstractType) {
|
|
528
|
+
// Field not expected to exist regardless of whether the server is pruning null
|
|
529
|
+
// fields or not.
|
|
530
|
+
return;
|
|
531
|
+
} else {
|
|
532
|
+
// Not optional and the server is not pruning null fields: field is expected
|
|
533
|
+
// to be present
|
|
534
|
+
!this._treatMissingFieldsAsNull ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer: Payload did not contain a value for ' + 'field `%s: %s`. Check that you are parsing with the same ' + 'query that was used to fetch the payload.', responseKey, storageKey) : invariant(false) : void 0;
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
|
|
438
538
|
RelayModernRecord.setValue(record, storageKey, null);
|
|
439
539
|
return;
|
|
440
540
|
}
|
|
441
541
|
|
|
442
542
|
var reactFlightPayload = refineToReactFlightPayloadData(fieldValue);
|
|
543
|
+
var reactFlightPayloadDeserializer = this._reactFlightPayloadDeserializer;
|
|
443
544
|
!(reactFlightPayload != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer: Expected React Flight payload data to be an ' + 'object with `status`, tree`, `queries` and `errors` properties, got ' + '`%s`.', fieldValue) : invariant(false) : void 0;
|
|
444
|
-
!(typeof
|
|
545
|
+
!(typeof reactFlightPayloadDeserializer === 'function') ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer: Expected reactFlightPayloadDeserializer to ' + 'be a function, got `%s`.', reactFlightPayloadDeserializer) : invariant(false) : void 0;
|
|
445
546
|
|
|
446
547
|
if (reactFlightPayload.errors.length > 0) {
|
|
447
548
|
if (typeof this._reactFlightServerErrorHandler === 'function') {
|
|
@@ -449,22 +550,7 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
|
|
|
449
550
|
} else {
|
|
450
551
|
process.env.NODE_ENV !== "production" ? warning(false, 'RelayResponseNormalizer: Received server errors for field `%s`.\n\n' + '%s\n%s', responseKey, reactFlightPayload.errors[0].message, reactFlightPayload.errors[0].stack) : void 0;
|
|
451
552
|
}
|
|
452
|
-
}
|
|
453
|
-
// being written. When this occurs, we should not continue normalization of
|
|
454
|
-
// the Flight field because the row response is malformed.
|
|
455
|
-
//
|
|
456
|
-
// Receiving empty rows is OK because it can indicate the start of a stream.
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
if (reactFlightPayload.tree == null) {
|
|
460
|
-
process.env.NODE_ENV !== "production" ? warning(false, 'RelayResponseNormalizer: Expected `tree` not to be null. This ' + 'typically indicates that a fatal server error prevented any Server ' + 'Component rows from being written.') : void 0;
|
|
461
|
-
return;
|
|
462
|
-
} // We store the deserialized reactFlightClientResponse in a separate
|
|
463
|
-
// record and link it to the parent record. This is so we can GC the Flight
|
|
464
|
-
// tree later even if the parent record is still reachable.
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
var reactFlightClientResponse = this._reactFlightPayloadDeserializer(reactFlightPayload.tree);
|
|
553
|
+
}
|
|
468
554
|
|
|
469
555
|
var reactFlightID = generateClientID(RelayModernRecord.getDataID(record), getStorageKey(selection, this._variables));
|
|
470
556
|
|
|
@@ -476,8 +562,27 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
|
|
|
476
562
|
this._recordSource.set(reactFlightID, reactFlightClientResponseRecord);
|
|
477
563
|
}
|
|
478
564
|
|
|
565
|
+
if (reactFlightPayload.tree == null) {
|
|
566
|
+
// This typically indicates that a fatal server error prevented rows from
|
|
567
|
+
// being written. When this occurs, we should not continue normalization of
|
|
568
|
+
// the Flight field because the row response is malformed.
|
|
569
|
+
//
|
|
570
|
+
// Receiving empty rows is OK because it can indicate the start of a stream.
|
|
571
|
+
process.env.NODE_ENV !== "production" ? warning(false, 'RelayResponseNormalizer: Expected `tree` not to be null. This ' + 'typically indicates that a fatal server error prevented any Server ' + 'Component rows from being written.') : void 0; // We create the flight record with a null value for the tree
|
|
572
|
+
// and empty reachable definitions
|
|
573
|
+
|
|
574
|
+
RelayModernRecord.setValue(reactFlightClientResponseRecord, REACT_FLIGHT_TREE_STORAGE_KEY, null);
|
|
575
|
+
RelayModernRecord.setValue(reactFlightClientResponseRecord, REACT_FLIGHT_EXECUTABLE_DEFINITIONS_STORAGE_KEY, []);
|
|
576
|
+
RelayModernRecord.setLinkedRecordID(record, storageKey, reactFlightID);
|
|
577
|
+
return;
|
|
578
|
+
} // We store the deserialized reactFlightClientResponse in a separate
|
|
579
|
+
// record and link it to the parent record. This is so we can GC the Flight
|
|
580
|
+
// tree later even if the parent record is still reachable.
|
|
581
|
+
|
|
582
|
+
|
|
583
|
+
var reactFlightClientResponse = reactFlightPayloadDeserializer(reactFlightPayload.tree);
|
|
479
584
|
RelayModernRecord.setValue(reactFlightClientResponseRecord, REACT_FLIGHT_TREE_STORAGE_KEY, reactFlightClientResponse);
|
|
480
|
-
var
|
|
585
|
+
var reachableExecutableDefinitions = [];
|
|
481
586
|
|
|
482
587
|
var _iterator = (0, _createForOfIteratorHelper2["default"])(reactFlightPayload.queries),
|
|
483
588
|
_step;
|
|
@@ -487,17 +592,20 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
|
|
|
487
592
|
var query = _step.value;
|
|
488
593
|
|
|
489
594
|
if (query.response.data != null) {
|
|
490
|
-
this.
|
|
595
|
+
this._followupPayloads.push({
|
|
596
|
+
kind: 'ModuleImportPayload',
|
|
597
|
+
args: null,
|
|
491
598
|
data: query.response.data,
|
|
492
599
|
dataID: ROOT_ID,
|
|
493
600
|
operationReference: query.module,
|
|
494
601
|
path: [],
|
|
495
602
|
typeName: ROOT_TYPE,
|
|
496
|
-
variables: query.variables
|
|
603
|
+
variables: query.variables,
|
|
604
|
+
actorIdentifier: this._actorIdentifier
|
|
497
605
|
});
|
|
498
606
|
}
|
|
499
607
|
|
|
500
|
-
|
|
608
|
+
reachableExecutableDefinitions.push({
|
|
501
609
|
module: query.module,
|
|
502
610
|
variables: query.variables
|
|
503
611
|
});
|
|
@@ -508,17 +616,49 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
|
|
|
508
616
|
_iterator.f();
|
|
509
617
|
}
|
|
510
618
|
|
|
511
|
-
|
|
619
|
+
var _iterator2 = (0, _createForOfIteratorHelper2["default"])(reactFlightPayload.fragments),
|
|
620
|
+
_step2;
|
|
621
|
+
|
|
622
|
+
try {
|
|
623
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
624
|
+
var fragment = _step2.value;
|
|
625
|
+
|
|
626
|
+
if (fragment.response.data != null) {
|
|
627
|
+
this._followupPayloads.push({
|
|
628
|
+
kind: 'ModuleImportPayload',
|
|
629
|
+
args: null,
|
|
630
|
+
data: fragment.response.data,
|
|
631
|
+
dataID: fragment.__id,
|
|
632
|
+
operationReference: fragment.module,
|
|
633
|
+
path: [],
|
|
634
|
+
typeName: fragment.__typename,
|
|
635
|
+
variables: fragment.variables,
|
|
636
|
+
actorIdentifier: this._actorIdentifier
|
|
637
|
+
});
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
reachableExecutableDefinitions.push({
|
|
641
|
+
module: fragment.module,
|
|
642
|
+
variables: fragment.variables
|
|
643
|
+
});
|
|
644
|
+
}
|
|
645
|
+
} catch (err) {
|
|
646
|
+
_iterator2.e(err);
|
|
647
|
+
} finally {
|
|
648
|
+
_iterator2.f();
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
RelayModernRecord.setValue(reactFlightClientResponseRecord, REACT_FLIGHT_EXECUTABLE_DEFINITIONS_STORAGE_KEY, reachableExecutableDefinitions);
|
|
512
652
|
RelayModernRecord.setLinkedRecordID(record, storageKey, reactFlightID);
|
|
513
653
|
};
|
|
514
654
|
|
|
515
655
|
_proto._normalizeLink = function _normalizeLink(field, record, storageKey, fieldValue) {
|
|
516
|
-
var _field$
|
|
656
|
+
var _field$concreteType2;
|
|
517
657
|
|
|
518
658
|
!(typeof fieldValue === 'object' && fieldValue) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer: Expected data for field `%s` to be an object.', storageKey) : invariant(false) : void 0;
|
|
519
659
|
var nextID = this._getDataId( // $FlowFixMe[incompatible-variance]
|
|
520
660
|
fieldValue, // $FlowFixMe[incompatible-variance]
|
|
521
|
-
(_field$
|
|
661
|
+
(_field$concreteType2 = field.concreteType) !== null && _field$concreteType2 !== void 0 ? _field$concreteType2 : this._getRecordType(fieldValue)) || // Reuse previously generated client IDs
|
|
522
662
|
RelayModernRecord.getLinkedRecordID(record, storageKey) || generateClientID(RelayModernRecord.getDataID(record), storageKey);
|
|
523
663
|
!(typeof nextID === 'string') ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer: Expected id on field `%s` to be a string.', storageKey) : invariant(false) : void 0;
|
|
524
664
|
|
|
@@ -552,7 +692,7 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
|
|
|
552
692
|
var prevIDs = RelayModernRecord.getLinkedRecordIDs(record, storageKey);
|
|
553
693
|
var nextIDs = [];
|
|
554
694
|
fieldValue.forEach(function (item, nextIndex) {
|
|
555
|
-
var _field$
|
|
695
|
+
var _field$concreteType3;
|
|
556
696
|
|
|
557
697
|
// validate response data
|
|
558
698
|
if (item == null) {
|
|
@@ -565,7 +705,7 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
|
|
|
565
705
|
!(typeof item === 'object') ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer: Expected elements for field `%s` to be ' + 'objects.', storageKey) : invariant(false) : void 0;
|
|
566
706
|
var nextID = _this._getDataId( // $FlowFixMe[incompatible-variance]
|
|
567
707
|
item, // $FlowFixMe[incompatible-variance]
|
|
568
|
-
(_field$
|
|
708
|
+
(_field$concreteType3 = field.concreteType) !== null && _field$concreteType3 !== void 0 ? _field$concreteType3 : _this._getRecordType(item)) || prevIDs && prevIDs[nextIndex] || // Reuse previously generated client IDs:
|
|
569
709
|
generateClientID(RelayModernRecord.getDataID(record), storageKey, nextIndex);
|
|
570
710
|
!(typeof nextID === 'string') ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer: Expected id of elements of field `%s` to ' + 'be strings.', storageKey) : invariant(false) : void 0;
|
|
571
711
|
nextIDs.push(nextID);
|
|
@@ -604,9 +744,9 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
|
|
|
604
744
|
;
|
|
605
745
|
|
|
606
746
|
_proto._validateRecordType = function _validateRecordType(record, field, payload) {
|
|
607
|
-
var _field$
|
|
747
|
+
var _field$concreteType4;
|
|
608
748
|
|
|
609
|
-
var typeName = (_field$
|
|
749
|
+
var typeName = (_field$concreteType4 = field.concreteType) !== null && _field$concreteType4 !== void 0 ? _field$concreteType4 : this._getRecordType(payload);
|
|
610
750
|
var dataID = RelayModernRecord.getDataID(record);
|
|
611
751
|
process.env.NODE_ENV !== "production" ? warning(isClientID(dataID) && dataID !== ROOT_ID || RelayModernRecord.getType(record) === typeName, 'RelayResponseNormalizer: Invalid record `%s`. Expected %s to be ' + 'consistent, but the record was assigned conflicting types `%s` ' + 'and `%s`. The GraphQL server likely violated the globally unique ' + 'id requirement by returning the same id for different objects.', dataID, TYPENAME_KEY, RelayModernRecord.getType(record), typeName) : void 0;
|
|
612
752
|
}
|
|
@@ -638,7 +778,6 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
|
|
|
638
778
|
return RelayResponseNormalizer;
|
|
639
779
|
}();
|
|
640
780
|
|
|
641
|
-
var instrumentedNormalize = RelayProfiler.instrument('RelayResponseNormalizer.normalize', normalize);
|
|
642
781
|
module.exports = {
|
|
643
|
-
normalize:
|
|
782
|
+
normalize: normalize
|
|
644
783
|
};
|
|
@@ -10,17 +10,19 @@
|
|
|
10
10
|
// flowlint ambiguous-object-type:error
|
|
11
11
|
'use strict';
|
|
12
12
|
|
|
13
|
-
var invariant = require(
|
|
13
|
+
var invariant = require('invariant');
|
|
14
14
|
|
|
15
15
|
var _require = require('./RelayModernRecord'),
|
|
16
16
|
getType = _require.getType;
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
// Reachable (client) executable definitions encountered while server component
|
|
19
|
+
// rendering
|
|
20
|
+
var REACT_FLIGHT_EXECUTABLE_DEFINITIONS_STORAGE_KEY = 'executableDefinitions';
|
|
19
21
|
var REACT_FLIGHT_TREE_STORAGE_KEY = 'tree';
|
|
20
22
|
var REACT_FLIGHT_TYPE_NAME = 'ReactFlightComponent';
|
|
21
23
|
|
|
22
24
|
function refineToReactFlightPayloadData(payload) {
|
|
23
|
-
if (payload == null || typeof payload !== 'object' || typeof payload.status !== 'string' || !Array.isArray(payload.tree) && payload.tree !== null || !Array.isArray(payload.queries) || !Array.isArray(payload.errors)) {
|
|
25
|
+
if (payload == null || typeof payload !== 'object' || typeof payload.status !== 'string' || !Array.isArray(payload.tree) && payload.tree !== null || !Array.isArray(payload.queries) || !Array.isArray(payload.fragments) || !Array.isArray(payload.errors)) {
|
|
24
26
|
return null;
|
|
25
27
|
}
|
|
26
28
|
|
|
@@ -29,17 +31,11 @@ function refineToReactFlightPayloadData(payload) {
|
|
|
29
31
|
|
|
30
32
|
function getReactFlightClientResponse(record) {
|
|
31
33
|
!(getType(record) === REACT_FLIGHT_TYPE_NAME) ? process.env.NODE_ENV !== "production" ? invariant(false, 'getReactFlightClientResponse(): Expected a ReactFlightComponentRecord, ' + 'got %s.', record) : invariant(false) : void 0;
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
if (response != null) {
|
|
35
|
-
return response;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
return null;
|
|
34
|
+
return record[REACT_FLIGHT_TREE_STORAGE_KEY];
|
|
39
35
|
}
|
|
40
36
|
|
|
41
37
|
module.exports = {
|
|
42
|
-
|
|
38
|
+
REACT_FLIGHT_EXECUTABLE_DEFINITIONS_STORAGE_KEY: REACT_FLIGHT_EXECUTABLE_DEFINITIONS_STORAGE_KEY,
|
|
43
39
|
REACT_FLIGHT_TREE_STORAGE_KEY: REACT_FLIGHT_TREE_STORAGE_KEY,
|
|
44
40
|
REACT_FLIGHT_TYPE_NAME: REACT_FLIGHT_TYPE_NAME,
|
|
45
41
|
getReactFlightClientResponse: getReactFlightClientResponse,
|