relay-runtime 18.1.0 → 19.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/experimental.js +1 -1
- package/experimental.js.flow +22 -9
- package/handlers/connection/ConnectionHandler.js.flow +6 -1
- package/index.js +1 -1
- package/index.js.flow +4 -0
- package/lib/experimental.js +5 -2
- package/lib/handlers/connection/ConnectionHandler.js +1 -1
- package/lib/index.js +3 -0
- package/lib/multi-actor-environment/ActorSpecificEnvironment.js +1 -1
- package/lib/mutations/RelayRecordProxy.js +14 -3
- package/lib/mutations/RelayRecordSourceMutator.js +17 -0
- package/lib/mutations/RelayRecordSourceProxy.js +2 -1
- package/lib/mutations/createUpdatableProxy.js +1 -1
- package/lib/mutations/validateMutation.js +2 -2
- package/lib/network/RelayObservable.js +1 -3
- package/lib/network/wrapNetworkWithLogObserver.js +2 -2
- package/lib/query/fetchQuery.js +1 -1
- package/lib/store/DataChecker.js +4 -5
- package/lib/store/OperationExecutor.js +11 -0
- package/lib/store/RelayModernEnvironment.js +13 -4
- package/lib/store/RelayModernFragmentSpecResolver.js +4 -4
- package/lib/store/RelayModernStore.js +43 -21
- package/lib/store/RelayPublishQueue.js +11 -15
- package/lib/store/RelayReader.js +244 -183
- package/lib/store/RelayReferenceMarker.js +3 -4
- package/lib/store/RelayResponseNormalizer.js +48 -26
- package/lib/store/RelayStoreSubscriptions.js +2 -2
- package/lib/store/RelayStoreUtils.js +8 -0
- package/lib/store/ResolverCache.js +1 -165
- package/lib/store/ResolverFragments.js +2 -2
- package/lib/store/createRelayLoggingContext.js +17 -0
- package/lib/store/generateTypenamePrefixedDataID.js +9 -0
- package/lib/store/live-resolvers/LiveResolverCache.js +5 -10
- package/lib/store/live-resolvers/resolverDataInjector.js +4 -4
- package/lib/store/observeFragmentExperimental.js +60 -13
- package/lib/store/observeQueryExperimental.js +21 -0
- package/lib/util/RelayFeatureFlags.js +7 -2
- package/lib/util/handlePotentialSnapshotErrors.js +12 -9
- package/multi-actor-environment/ActorSpecificEnvironment.js.flow +1 -0
- package/mutations/RelayRecordProxy.js.flow +30 -3
- package/mutations/RelayRecordSourceMutator.js.flow +27 -0
- package/mutations/RelayRecordSourceProxy.js.flow +4 -0
- package/mutations/createUpdatableProxy.js.flow +1 -1
- package/mutations/validateMutation.js.flow +3 -3
- package/network/RelayNetworkTypes.js.flow +3 -0
- package/network/RelayObservable.js.flow +1 -5
- package/network/wrapNetworkWithLogObserver.js.flow +19 -1
- package/package.json +1 -1
- package/query/fetchQuery.js.flow +1 -1
- package/store/DataChecker.js.flow +5 -2
- package/store/OperationExecutor.js.flow +12 -1
- package/store/RelayExperimentalGraphResponseTransform.js.flow +4 -4
- package/store/RelayModernEnvironment.js.flow +22 -6
- package/store/RelayModernFragmentSpecResolver.js.flow +6 -6
- package/store/RelayModernRecord.js.flow +1 -1
- package/store/RelayModernSelector.js.flow +2 -0
- package/store/RelayModernStore.js.flow +74 -27
- package/store/RelayOptimisticRecordSource.js.flow +2 -0
- package/store/RelayPublishQueue.js.flow +32 -21
- package/store/RelayReader.js.flow +400 -145
- package/store/RelayRecordState.js.flow +1 -1
- package/store/RelayReferenceMarker.js.flow +3 -4
- package/store/RelayResponseNormalizer.js.flow +94 -62
- package/store/RelayStoreSubscriptions.js.flow +2 -2
- package/store/RelayStoreTypes.js.flow +45 -15
- package/store/RelayStoreUtils.js.flow +30 -1
- package/store/ResolverCache.js.flow +2 -271
- package/store/ResolverFragments.js.flow +5 -3
- package/store/StoreInspector.js.flow +5 -0
- package/store/createRelayContext.js.flow +3 -2
- package/store/createRelayLoggingContext.js.flow +46 -0
- package/store/generateTypenamePrefixedDataID.js.flow +25 -0
- package/store/live-resolvers/LiveResolverCache.js.flow +5 -10
- package/store/live-resolvers/resolverDataInjector.js.flow +10 -6
- package/store/observeFragmentExperimental.js.flow +82 -28
- package/store/observeQueryExperimental.js.flow +61 -0
- package/store/waitForFragmentExperimental.js.flow +4 -3
- package/util/NormalizationNode.js.flow +10 -1
- package/util/ReaderNode.js.flow +9 -3
- package/util/RelayConcreteNode.js.flow +3 -1
- package/util/RelayError.js.flow +1 -0
- package/util/RelayFeatureFlags.js.flow +31 -7
- package/util/RelayRuntimeTypes.js.flow +17 -3
- package/util/getPaginationVariables.js.flow +2 -0
- package/util/handlePotentialSnapshotErrors.js.flow +24 -12
- package/util/registerEnvironmentWithDevTools.js.flow +4 -2
- package/util/withProvidedVariables.js.flow +1 -0
- package/util/withStartAndDuration.js.flow +3 -0
- package/relay-runtime-experimental.js +0 -4
- package/relay-runtime-experimental.min.js +0 -9
- package/relay-runtime.js +0 -4
- package/relay-runtime.min.js +0 -9
|
@@ -12,7 +12,8 @@ var RelayStoreUtils = require('./RelayStoreUtils');
|
|
|
12
12
|
var _require2 = require('./TypeID'),
|
|
13
13
|
generateTypeID = _require2.generateTypeID;
|
|
14
14
|
var invariant = require('invariant');
|
|
15
|
-
var
|
|
15
|
+
var getReadTimeResolverStorageKey = RelayStoreUtils.getReadTimeResolverStorageKey,
|
|
16
|
+
getStorageKey = RelayStoreUtils.getStorageKey,
|
|
16
17
|
getModuleOperationKey = RelayStoreUtils.getModuleOperationKey;
|
|
17
18
|
function mark(recordSource, selector, references, operationLoader, shouldProcessClientComponents) {
|
|
18
19
|
var dataID = selector.dataID,
|
|
@@ -123,8 +124,6 @@ var RelayReferenceMarker = /*#__PURE__*/function () {
|
|
|
123
124
|
_this._traverseSelections(selection.fragment.selections, record);
|
|
124
125
|
break;
|
|
125
126
|
case 'RelayResolver':
|
|
126
|
-
_this._traverseResolverField(selection, record);
|
|
127
|
-
break;
|
|
128
127
|
case 'RelayLiveResolver':
|
|
129
128
|
_this._traverseResolverField(selection, record);
|
|
130
129
|
break;
|
|
@@ -195,7 +194,7 @@ var RelayReferenceMarker = /*#__PURE__*/function () {
|
|
|
195
194
|
}
|
|
196
195
|
};
|
|
197
196
|
_proto._traverseResolverField = function _traverseResolverField(field, record) {
|
|
198
|
-
var storageKey =
|
|
197
|
+
var storageKey = getReadTimeResolverStorageKey(field, this._variables);
|
|
199
198
|
var dataID = RelayModernRecord.getLinkedRecordID(record, storageKey);
|
|
200
199
|
if (dataID != null) {
|
|
201
200
|
this._references.add(dataID);
|
|
@@ -6,6 +6,7 @@ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers
|
|
|
6
6
|
var _require = require('../multi-actor-environment/ActorUtils'),
|
|
7
7
|
ACTOR_IDENTIFIER_FIELD_NAME = _require.ACTOR_IDENTIFIER_FIELD_NAME,
|
|
8
8
|
getActorIdentifierFromPayload = _require.getActorIdentifierFromPayload;
|
|
9
|
+
var RelayFeatureFlags = require('../util/RelayFeatureFlags');
|
|
9
10
|
var _require2 = require('./ClientID'),
|
|
10
11
|
generateClientID = _require2.generateClientID,
|
|
11
12
|
isClientID = _require2.isClientID;
|
|
@@ -53,6 +54,7 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
|
|
|
53
54
|
this._recordSource = recordSource;
|
|
54
55
|
this._variables = variables;
|
|
55
56
|
this._shouldProcessClientComponents = options.shouldProcessClientComponents;
|
|
57
|
+
this._log = options.log;
|
|
56
58
|
}
|
|
57
59
|
var _proto = RelayResponseNormalizer.prototype;
|
|
58
60
|
_proto.normalizeResponse = function normalizeResponse(node, dataID, data, errors) {
|
|
@@ -204,8 +206,6 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
|
|
|
204
206
|
this._normalizeActorChange(selection, record, data);
|
|
205
207
|
break;
|
|
206
208
|
case 'RelayResolver':
|
|
207
|
-
this._normalizeResolver(selection, record, data);
|
|
208
|
-
break;
|
|
209
209
|
case 'RelayLiveResolver':
|
|
210
210
|
this._normalizeResolver(selection, record, data);
|
|
211
211
|
break;
|
|
@@ -288,7 +288,8 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
|
|
|
288
288
|
var responseKey = selection.alias || selection.name;
|
|
289
289
|
var storageKey = getStorageKey(selection, this._variables);
|
|
290
290
|
var fieldValue = data[responseKey];
|
|
291
|
-
|
|
291
|
+
var isNoncompliantlyNullish = RelayFeatureFlags.ENABLE_NONCOMPLIANT_ERROR_HANDLING_ON_LISTS && Array.isArray(fieldValue) && fieldValue.length === 0;
|
|
292
|
+
if (fieldValue == null || isNoncompliantlyNullish) {
|
|
292
293
|
if (fieldValue === undefined) {
|
|
293
294
|
var isOptionalField = this._isClientExtension || this._isUnmatchedAbstractType;
|
|
294
295
|
if (isOptionalField) {
|
|
@@ -300,12 +301,18 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
|
|
|
300
301
|
return;
|
|
301
302
|
}
|
|
302
303
|
}
|
|
303
|
-
if (
|
|
304
|
-
|
|
305
|
-
|
|
304
|
+
if (selection.kind === 'ScalarField') {
|
|
305
|
+
this._validateConflictingFieldsWithIdenticalId(record, storageKey, null);
|
|
306
|
+
}
|
|
307
|
+
if (isNoncompliantlyNullish) {
|
|
308
|
+
if (selection.kind === 'LinkedField') {
|
|
309
|
+
RelayModernRecord.setLinkedRecordIDs(record, storageKey, []);
|
|
310
|
+
} else {
|
|
311
|
+
RelayModernRecord.setValue(record, storageKey, []);
|
|
306
312
|
}
|
|
313
|
+
} else {
|
|
314
|
+
RelayModernRecord.setValue(record, storageKey, null);
|
|
307
315
|
}
|
|
308
|
-
RelayModernRecord.setValue(record, storageKey, null);
|
|
309
316
|
var errorTrie = this._errorTrie;
|
|
310
317
|
if (errorTrie != null) {
|
|
311
318
|
var errors = getErrorsByKey(errorTrie, responseKey);
|
|
@@ -316,9 +323,7 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
|
|
|
316
323
|
return;
|
|
317
324
|
}
|
|
318
325
|
if (selection.kind === 'ScalarField') {
|
|
319
|
-
|
|
320
|
-
this._validateConflictingFieldsWithIdenticalId(record, storageKey, fieldValue);
|
|
321
|
-
}
|
|
326
|
+
this._validateConflictingFieldsWithIdenticalId(record, storageKey, fieldValue);
|
|
322
327
|
RelayModernRecord.setValue(record, storageKey, fieldValue);
|
|
323
328
|
} else if (selection.kind === 'LinkedField') {
|
|
324
329
|
this._path.push(responseKey);
|
|
@@ -386,16 +391,14 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
|
|
|
386
391
|
!(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;
|
|
387
392
|
var nextID = this._getDataId(fieldValue, (_field$concreteType2 = field.concreteType) !== null && _field$concreteType2 !== void 0 ? _field$concreteType2 : this._getRecordType(fieldValue)) || RelayModernRecord.getLinkedRecordID(record, storageKey) || generateClientID(RelayModernRecord.getDataID(record), storageKey);
|
|
388
393
|
!(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;
|
|
389
|
-
|
|
390
|
-
this._validateConflictingLinkedFieldsWithIdenticalId(RelayModernRecord.getLinkedRecordID(record, storageKey), nextID, storageKey);
|
|
391
|
-
}
|
|
394
|
+
this._validateConflictingLinkedFieldsWithIdenticalId(RelayModernRecord.getLinkedRecordID(record, storageKey), nextID, storageKey);
|
|
392
395
|
RelayModernRecord.setLinkedRecordID(record, storageKey, nextID);
|
|
393
396
|
var nextRecord = this._recordSource.get(nextID);
|
|
394
397
|
if (!nextRecord) {
|
|
395
398
|
var typeName = field.concreteType || this._getRecordType(fieldValue);
|
|
396
399
|
nextRecord = RelayModernRecord.create(nextID, typeName);
|
|
397
400
|
this._recordSource.set(nextID, nextRecord);
|
|
398
|
-
} else
|
|
401
|
+
} else {
|
|
399
402
|
this._validateRecordType(nextRecord, field, fieldValue);
|
|
400
403
|
}
|
|
401
404
|
this._traverseSelections(field, nextRecord, fieldValue);
|
|
@@ -423,13 +426,11 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
|
|
|
423
426
|
var typeName = field.concreteType || _this._getRecordType(item);
|
|
424
427
|
nextRecord = RelayModernRecord.create(nextID, typeName);
|
|
425
428
|
_this._recordSource.set(nextID, nextRecord);
|
|
426
|
-
} else
|
|
429
|
+
} else {
|
|
427
430
|
_this._validateRecordType(nextRecord, field, item);
|
|
428
431
|
}
|
|
429
|
-
if (
|
|
430
|
-
|
|
431
|
-
_this._validateConflictingLinkedFieldsWithIdenticalId(prevIDs[nextIndex], nextID, storageKey);
|
|
432
|
-
}
|
|
432
|
+
if (prevIDs) {
|
|
433
|
+
_this._validateConflictingLinkedFieldsWithIdenticalId(prevIDs[nextIndex], nextID, storageKey);
|
|
433
434
|
}
|
|
434
435
|
_this._traverseSelections(field, nextRecord, item);
|
|
435
436
|
_this._errorTrie = oldErrorTrie;
|
|
@@ -438,21 +439,42 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
|
|
|
438
439
|
RelayModernRecord.setLinkedRecordIDs(record, storageKey, nextIDs);
|
|
439
440
|
};
|
|
440
441
|
_proto._validateRecordType = function _validateRecordType(record, field, payload) {
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
442
|
+
if (RelayFeatureFlags.ENABLE_STORE_ID_COLLISION_LOGGING) {
|
|
443
|
+
var _field$concreteType4;
|
|
444
|
+
var typeName = (_field$concreteType4 = field.concreteType) !== null && _field$concreteType4 !== void 0 ? _field$concreteType4 : this._getRecordType(payload);
|
|
445
|
+
var dataID = RelayModernRecord.getDataID(record);
|
|
446
|
+
var expected = isClientID(dataID) && dataID !== ROOT_ID || RelayModernRecord.getType(record) === typeName;
|
|
447
|
+
if (!expected) {
|
|
448
|
+
var logEvent = {
|
|
449
|
+
name: 'idCollision.typename',
|
|
450
|
+
previous_typename: RelayModernRecord.getType(record),
|
|
451
|
+
new_typename: typeName
|
|
452
|
+
};
|
|
453
|
+
if (this._log != null) {
|
|
454
|
+
this._log(logEvent);
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
if (process.env.NODE_ENV !== "production") {
|
|
459
|
+
var _field$concreteType5;
|
|
460
|
+
var _typeName3 = (_field$concreteType5 = field.concreteType) !== null && _field$concreteType5 !== void 0 ? _field$concreteType5 : this._getRecordType(payload);
|
|
461
|
+
var _dataID = RelayModernRecord.getDataID(record);
|
|
462
|
+
var _expected = isClientID(_dataID) && _dataID !== ROOT_ID || RelayModernRecord.getType(record) === _typeName3;
|
|
463
|
+
process.env.NODE_ENV !== "production" ? warning(_expected, '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), _typeName3) : void 0;
|
|
464
|
+
}
|
|
445
465
|
};
|
|
446
466
|
_proto._validateConflictingFieldsWithIdenticalId = function _validateConflictingFieldsWithIdenticalId(record, storageKey, fieldValue) {
|
|
447
467
|
if (process.env.NODE_ENV !== "production") {
|
|
448
|
-
var dataID = RelayModernRecord.getDataID(record);
|
|
449
468
|
var previousValue = RelayModernRecord.getValue(record, storageKey);
|
|
450
|
-
|
|
469
|
+
var dataID = RelayModernRecord.getDataID(record);
|
|
470
|
+
var expected = storageKey === TYPENAME_KEY || previousValue === undefined || areEqual(previousValue, fieldValue);
|
|
471
|
+
process.env.NODE_ENV !== "production" ? warning(expected, 'RelayResponseNormalizer: Invalid record. The record contains two ' + 'instances of the same id: `%s` with conflicting field, %s and its values: %s and %s. ' + 'If two fields are different but share ' + 'the same id, one field will overwrite the other.', dataID, storageKey, previousValue, fieldValue) : void 0;
|
|
451
472
|
}
|
|
452
473
|
};
|
|
453
474
|
_proto._validateConflictingLinkedFieldsWithIdenticalId = function _validateConflictingLinkedFieldsWithIdenticalId(prevID, nextID, storageKey) {
|
|
454
475
|
if (process.env.NODE_ENV !== "production") {
|
|
455
|
-
|
|
476
|
+
var expected = prevID === undefined || prevID === nextID;
|
|
477
|
+
process.env.NODE_ENV !== "production" ? warning(expected, 'RelayResponseNormalizer: Invalid record. The record contains ' + 'references to the conflicting field, %s and its id values: %s and %s. ' + 'We need to make sure that the record the field points ' + 'to remains consistent or one field will overwrite the other.', storageKey, prevID, nextID) : void 0;
|
|
456
478
|
}
|
|
457
479
|
};
|
|
458
480
|
return RelayResponseNormalizer;
|
|
@@ -59,7 +59,7 @@ var RelayStoreSubscriptions = /*#__PURE__*/function () {
|
|
|
59
59
|
missingLiveResolverFields: backup.missingLiveResolverFields,
|
|
60
60
|
seenRecords: backup.seenRecords,
|
|
61
61
|
selector: backup.selector,
|
|
62
|
-
|
|
62
|
+
fieldErrors: backup.fieldErrors
|
|
63
63
|
};
|
|
64
64
|
} else {
|
|
65
65
|
subscription.stale = true;
|
|
@@ -94,7 +94,7 @@ var RelayStoreSubscriptions = /*#__PURE__*/function () {
|
|
|
94
94
|
missingLiveResolverFields: nextSnapshot.missingLiveResolverFields,
|
|
95
95
|
seenRecords: nextSnapshot.seenRecords,
|
|
96
96
|
selector: nextSnapshot.selector,
|
|
97
|
-
|
|
97
|
+
fieldErrors: nextSnapshot.fieldErrors
|
|
98
98
|
};
|
|
99
99
|
if (process.env.NODE_ENV !== "production") {
|
|
100
100
|
deepFreeze(nextSnapshot);
|
|
@@ -4,6 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
4
4
|
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
5
5
|
var getRelayHandleKey = require('../util/getRelayHandleKey');
|
|
6
6
|
var RelayConcreteNode = require('../util/RelayConcreteNode');
|
|
7
|
+
var RelayFeatureFlags = require('../util/RelayFeatureFlags');
|
|
7
8
|
var _require = require('../util/stableCopy'),
|
|
8
9
|
stableCopy = _require.stableCopy;
|
|
9
10
|
var invariant = require('invariant');
|
|
@@ -14,6 +15,7 @@ var VARIABLE = RelayConcreteNode.VARIABLE,
|
|
|
14
15
|
var ERRORS_KEY = '__errors';
|
|
15
16
|
var MODULE_COMPONENT_KEY_PREFIX = '__module_component_';
|
|
16
17
|
var MODULE_OPERATION_KEY_PREFIX = '__module_operation_';
|
|
18
|
+
var RELAY_READ_TIME_RESOLVER_KEY_PREFIX = '$r:';
|
|
17
19
|
function getArgumentValue(arg, variables) {
|
|
18
20
|
if (arg.kind === VARIABLE) {
|
|
19
21
|
return getStableVariableValue(arg.variableName, variables);
|
|
@@ -76,6 +78,10 @@ function getStorageKey(field, variables) {
|
|
|
76
78
|
var name = field.name;
|
|
77
79
|
return args && args.length !== 0 ? formatStorageKey(name, getArgumentValues(args, variables)) : name;
|
|
78
80
|
}
|
|
81
|
+
function getReadTimeResolverStorageKey(field, variables) {
|
|
82
|
+
var storageKey = getStorageKey(field, variables);
|
|
83
|
+
return RelayFeatureFlags.ENABLE_READ_TIME_RESOLVER_STORAGE_KEY_PREFIX ? '$r:' + storageKey : storageKey;
|
|
84
|
+
}
|
|
79
85
|
function getArguments(field) {
|
|
80
86
|
if (field.kind === 'RelayResolver' || field.kind === 'RelayLiveResolver') {
|
|
81
87
|
var _field$fragment2;
|
|
@@ -141,11 +147,13 @@ var RelayStoreUtils = {
|
|
|
141
147
|
RELAY_RESOLVER_SNAPSHOT_KEY: '__resolverSnapshot',
|
|
142
148
|
RELAY_RESOLVER_ERROR_KEY: '__resolverError',
|
|
143
149
|
RELAY_RESOLVER_OUTPUT_TYPE_RECORD_IDS: '__resolverOutputTypeRecordIDs',
|
|
150
|
+
RELAY_READ_TIME_RESOLVER_KEY_PREFIX: RELAY_READ_TIME_RESOLVER_KEY_PREFIX,
|
|
144
151
|
formatStorageKey: formatStorageKey,
|
|
145
152
|
getArgumentValue: getArgumentValue,
|
|
146
153
|
getArgumentValues: getArgumentValues,
|
|
147
154
|
getHandleStorageKey: getHandleStorageKey,
|
|
148
155
|
getStorageKey: getStorageKey,
|
|
156
|
+
getReadTimeResolverStorageKey: getReadTimeResolverStorageKey,
|
|
149
157
|
getStableStorageKey: getStableStorageKey,
|
|
150
158
|
getModuleComponentKey: getModuleComponentKey,
|
|
151
159
|
getModuleOperationKey: getModuleOperationKey
|
|
@@ -1,24 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault")["default"];
|
|
4
|
-
var _createForOfIteratorHelper2 = _interopRequireDefault(require("@babel/runtime/helpers/createForOfIteratorHelper"));
|
|
5
|
-
var recycleNodesInto = require('../util/recycleNodesInto');
|
|
6
3
|
var _require = require('../util/RelayConcreteNode'),
|
|
7
4
|
RELAY_LIVE_RESOLVER = _require.RELAY_LIVE_RESOLVER;
|
|
8
|
-
var RelayFeatureFlags = require('../util/RelayFeatureFlags');
|
|
9
|
-
var shallowFreeze = require('../util/shallowFreeze');
|
|
10
|
-
var _require2 = require('./ClientID'),
|
|
11
|
-
generateClientID = _require2.generateClientID;
|
|
12
|
-
var RelayModernRecord = require('./RelayModernRecord');
|
|
13
|
-
var _require3 = require('./RelayStoreUtils'),
|
|
14
|
-
RELAY_RESOLVER_ERROR_KEY = _require3.RELAY_RESOLVER_ERROR_KEY,
|
|
15
|
-
RELAY_RESOLVER_INVALIDATION_KEY = _require3.RELAY_RESOLVER_INVALIDATION_KEY,
|
|
16
|
-
RELAY_RESOLVER_SNAPSHOT_KEY = _require3.RELAY_RESOLVER_SNAPSHOT_KEY,
|
|
17
|
-
RELAY_RESOLVER_VALUE_KEY = _require3.RELAY_RESOLVER_VALUE_KEY,
|
|
18
|
-
getStorageKey = _require3.getStorageKey;
|
|
19
5
|
var invariant = require('invariant');
|
|
20
|
-
var warning = require("fbjs/lib/warning");
|
|
21
|
-
var emptySet = new Set();
|
|
22
6
|
var NoopResolverCache = /*#__PURE__*/function () {
|
|
23
7
|
function NoopResolverCache() {}
|
|
24
8
|
var _proto = NoopResolverCache.prototype;
|
|
@@ -37,154 +21,6 @@ var NoopResolverCache = /*#__PURE__*/function () {
|
|
|
37
21
|
_proto.notifyUpdatedSubscribers = function notifyUpdatedSubscribers(updatedDataIDs) {};
|
|
38
22
|
return NoopResolverCache;
|
|
39
23
|
}();
|
|
40
|
-
function addDependencyEdge(edges, from, to) {
|
|
41
|
-
var set = edges.get(from);
|
|
42
|
-
if (!set) {
|
|
43
|
-
set = new Set();
|
|
44
|
-
edges.set(from, set);
|
|
45
|
-
}
|
|
46
|
-
set.add(to);
|
|
47
|
-
}
|
|
48
|
-
var RecordResolverCache = /*#__PURE__*/function () {
|
|
49
|
-
function RecordResolverCache(getRecordSource) {
|
|
50
|
-
this._resolverIDToRecordIDs = new Map();
|
|
51
|
-
this._recordIDToResolverIDs = new Map();
|
|
52
|
-
this._getRecordSource = getRecordSource;
|
|
53
|
-
}
|
|
54
|
-
var _proto2 = RecordResolverCache.prototype;
|
|
55
|
-
_proto2.readFromCacheOrEvaluate = function readFromCacheOrEvaluate(recordID, field, variables, evaluate, getDataForResolverFragment) {
|
|
56
|
-
var recordSource = this._getRecordSource();
|
|
57
|
-
var record = recordSource.get(recordID);
|
|
58
|
-
!(record != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'We expect record to exist in the store.') : invariant(false) : void 0;
|
|
59
|
-
var storageKey = getStorageKey(field, variables);
|
|
60
|
-
var linkedID = RelayModernRecord.getLinkedRecordID(record, storageKey);
|
|
61
|
-
var linkedRecord = linkedID == null ? null : recordSource.get(linkedID);
|
|
62
|
-
if (linkedRecord == null || this._isInvalid(linkedRecord, getDataForResolverFragment)) {
|
|
63
|
-
var _linkedID;
|
|
64
|
-
linkedID = (_linkedID = linkedID) !== null && _linkedID !== void 0 ? _linkedID : generateClientID(recordID, storageKey);
|
|
65
|
-
linkedRecord = RelayModernRecord.create(linkedID, '__RELAY_RESOLVER__');
|
|
66
|
-
var evaluationResult = evaluate();
|
|
67
|
-
shallowFreeze(evaluationResult.resolverResult);
|
|
68
|
-
RelayModernRecord.setValue(linkedRecord, RELAY_RESOLVER_VALUE_KEY, evaluationResult.resolverResult);
|
|
69
|
-
RelayModernRecord.setValue(linkedRecord, RELAY_RESOLVER_SNAPSHOT_KEY, evaluationResult.snapshot);
|
|
70
|
-
RelayModernRecord.setValue(linkedRecord, RELAY_RESOLVER_ERROR_KEY, evaluationResult.error);
|
|
71
|
-
recordSource.set(linkedID, linkedRecord);
|
|
72
|
-
var currentRecord = recordSource.get(recordID);
|
|
73
|
-
!(currentRecord != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'Expected the parent record to still be in the record source.') : invariant(false) : void 0;
|
|
74
|
-
var nextRecord = RelayModernRecord.clone(currentRecord);
|
|
75
|
-
RelayModernRecord.setLinkedRecordID(nextRecord, storageKey, linkedID);
|
|
76
|
-
recordSource.set(recordID, nextRecord);
|
|
77
|
-
if (field.fragment != null) {
|
|
78
|
-
var _evaluationResult$sna;
|
|
79
|
-
var fragmentStorageKey = getStorageKey(field.fragment, variables);
|
|
80
|
-
var resolverID = generateClientID(recordID, fragmentStorageKey);
|
|
81
|
-
addDependencyEdge(this._resolverIDToRecordIDs, resolverID, linkedID);
|
|
82
|
-
addDependencyEdge(this._recordIDToResolverIDs, recordID, resolverID);
|
|
83
|
-
var seenRecordIds = (_evaluationResult$sna = evaluationResult.snapshot) === null || _evaluationResult$sna === void 0 ? void 0 : _evaluationResult$sna.seenRecords;
|
|
84
|
-
if (seenRecordIds != null) {
|
|
85
|
-
var _iterator = (0, _createForOfIteratorHelper2["default"])(seenRecordIds),
|
|
86
|
-
_step;
|
|
87
|
-
try {
|
|
88
|
-
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
89
|
-
var seenRecordID = _step.value;
|
|
90
|
-
addDependencyEdge(this._recordIDToResolverIDs, seenRecordID, resolverID);
|
|
91
|
-
}
|
|
92
|
-
} catch (err) {
|
|
93
|
-
_iterator.e(err);
|
|
94
|
-
} finally {
|
|
95
|
-
_iterator.f();
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
var answer = RelayModernRecord.getValue(linkedRecord, RELAY_RESOLVER_VALUE_KEY);
|
|
101
|
-
var snapshot = RelayModernRecord.getValue(linkedRecord, RELAY_RESOLVER_SNAPSHOT_KEY);
|
|
102
|
-
var error = RelayModernRecord.getValue(linkedRecord, RELAY_RESOLVER_ERROR_KEY);
|
|
103
|
-
return [answer, linkedID, error, snapshot, undefined, undefined];
|
|
104
|
-
};
|
|
105
|
-
_proto2.invalidateDataIDs = function invalidateDataIDs(updatedDataIDs) {
|
|
106
|
-
var recordSource = this._getRecordSource();
|
|
107
|
-
var visited = new Set();
|
|
108
|
-
var recordsToVisit = Array.from(updatedDataIDs);
|
|
109
|
-
while (recordsToVisit.length) {
|
|
110
|
-
var recordID = recordsToVisit.pop();
|
|
111
|
-
updatedDataIDs.add(recordID);
|
|
112
|
-
var _iterator2 = (0, _createForOfIteratorHelper2["default"])((_this$_recordIDToReso = this._recordIDToResolverIDs.get(recordID)) !== null && _this$_recordIDToReso !== void 0 ? _this$_recordIDToReso : emptySet),
|
|
113
|
-
_step2;
|
|
114
|
-
try {
|
|
115
|
-
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
116
|
-
var _this$_recordIDToReso;
|
|
117
|
-
var fragment = _step2.value;
|
|
118
|
-
if (!visited.has(fragment)) {
|
|
119
|
-
var _iterator3 = (0, _createForOfIteratorHelper2["default"])((_this$_resolverIDToRe = this._resolverIDToRecordIDs.get(fragment)) !== null && _this$_resolverIDToRe !== void 0 ? _this$_resolverIDToRe : emptySet),
|
|
120
|
-
_step3;
|
|
121
|
-
try {
|
|
122
|
-
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
123
|
-
var _this$_resolverIDToRe;
|
|
124
|
-
var anotherRecordID = _step3.value;
|
|
125
|
-
this._markInvalidatedResolverRecord(anotherRecordID, recordSource, updatedDataIDs);
|
|
126
|
-
if (!visited.has(anotherRecordID)) {
|
|
127
|
-
recordsToVisit.push(anotherRecordID);
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
} catch (err) {
|
|
131
|
-
_iterator3.e(err);
|
|
132
|
-
} finally {
|
|
133
|
-
_iterator3.f();
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
} catch (err) {
|
|
138
|
-
_iterator2.e(err);
|
|
139
|
-
} finally {
|
|
140
|
-
_iterator2.f();
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
};
|
|
144
|
-
_proto2._markInvalidatedResolverRecord = function _markInvalidatedResolverRecord(dataID, recordSource, updatedDataIDs) {
|
|
145
|
-
var record = recordSource.get(dataID);
|
|
146
|
-
if (!record) {
|
|
147
|
-
process.env.NODE_ENV !== "production" ? warning(false, 'Expected a resolver record with ID %s, but it was missing.', dataID) : void 0;
|
|
148
|
-
return;
|
|
149
|
-
}
|
|
150
|
-
var nextRecord = RelayModernRecord.clone(record);
|
|
151
|
-
RelayModernRecord.setValue(nextRecord, RELAY_RESOLVER_INVALIDATION_KEY, true);
|
|
152
|
-
recordSource.set(dataID, nextRecord);
|
|
153
|
-
};
|
|
154
|
-
_proto2._isInvalid = function _isInvalid(record, getDataForResolverFragment) {
|
|
155
|
-
if (!RelayModernRecord.getValue(record, RELAY_RESOLVER_INVALIDATION_KEY)) {
|
|
156
|
-
return false;
|
|
157
|
-
}
|
|
158
|
-
var snapshot = RelayModernRecord.getValue(record, RELAY_RESOLVER_SNAPSHOT_KEY);
|
|
159
|
-
var originalInputs = snapshot === null || snapshot === void 0 ? void 0 : snapshot.data;
|
|
160
|
-
var readerSelector = snapshot === null || snapshot === void 0 ? void 0 : snapshot.selector;
|
|
161
|
-
if (originalInputs == null || readerSelector == null) {
|
|
162
|
-
process.env.NODE_ENV !== "production" ? warning(false, 'Expected previous inputs and reader selector on resolver record with ID %s, but they were missing.', RelayModernRecord.getDataID(record)) : void 0;
|
|
163
|
-
return true;
|
|
164
|
-
}
|
|
165
|
-
var _getDataForResolverFr = getDataForResolverFragment(readerSelector),
|
|
166
|
-
latestValues = _getDataForResolverFr.data;
|
|
167
|
-
var recycled = recycleNodesInto(originalInputs, latestValues);
|
|
168
|
-
if (recycled !== originalInputs) {
|
|
169
|
-
return true;
|
|
170
|
-
}
|
|
171
|
-
if (RelayFeatureFlags.MARK_RESOLVER_VALUES_AS_CLEAN_AFTER_FRAGMENT_REREAD) {
|
|
172
|
-
var nextRecord = RelayModernRecord.clone(record);
|
|
173
|
-
RelayModernRecord.setValue(nextRecord, RELAY_RESOLVER_INVALIDATION_KEY, false);
|
|
174
|
-
var recordSource = this._getRecordSource();
|
|
175
|
-
recordSource.set(RelayModernRecord.getDataID(record), nextRecord);
|
|
176
|
-
}
|
|
177
|
-
return false;
|
|
178
|
-
};
|
|
179
|
-
_proto2.ensureClientRecord = function ensureClientRecord(id, typename) {
|
|
180
|
-
!false ? process.env.NODE_ENV !== "production" ? invariant(false, 'Client Edges to Client Objects are not supported in this version of Relay Store') : invariant(false) : void 0;
|
|
181
|
-
};
|
|
182
|
-
_proto2.notifyUpdatedSubscribers = function notifyUpdatedSubscribers(updatedDataIDs) {
|
|
183
|
-
!false ? process.env.NODE_ENV !== "production" ? invariant(false, 'Processing @outputType records is not supported in this version of Relay Store') : invariant(false) : void 0;
|
|
184
|
-
};
|
|
185
|
-
return RecordResolverCache;
|
|
186
|
-
}();
|
|
187
24
|
module.exports = {
|
|
188
|
-
NoopResolverCache: NoopResolverCache
|
|
189
|
-
RecordResolverCache: RecordResolverCache
|
|
25
|
+
NoopResolverCache: NoopResolverCache
|
|
190
26
|
};
|
|
@@ -28,8 +28,8 @@ function readFragment(fragmentInput, fragmentKey) {
|
|
|
28
28
|
var _context$getDataForRe = context.getDataForResolverFragment(fragmentSelector, fragmentKey),
|
|
29
29
|
data = _context$getDataForRe.data,
|
|
30
30
|
isMissingData = _context$getDataForRe.isMissingData,
|
|
31
|
-
|
|
32
|
-
if (isMissingData ||
|
|
31
|
+
fieldErrors = _context$getDataForRe.fieldErrors;
|
|
32
|
+
if (isMissingData || fieldErrors != null && fieldErrors.some(eventShouldThrow)) {
|
|
33
33
|
throw RESOLVER_FRAGMENT_ERRORED_SENTINEL;
|
|
34
34
|
}
|
|
35
35
|
return data;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var invariant = require('invariant');
|
|
4
|
+
var relayLoggingContext;
|
|
5
|
+
var firstReact;
|
|
6
|
+
function createRelayLoggingContext(react) {
|
|
7
|
+
if (!relayLoggingContext) {
|
|
8
|
+
relayLoggingContext = react.createContext(null);
|
|
9
|
+
if (process.env.NODE_ENV !== "production") {
|
|
10
|
+
relayLoggingContext.displayName = 'RelayLoggingContext';
|
|
11
|
+
}
|
|
12
|
+
firstReact = react;
|
|
13
|
+
}
|
|
14
|
+
!(react === firstReact) ? process.env.NODE_ENV !== "production" ? invariant(false, '[createRelayLoggingContext]: You are passing a different instance of React', react.version) : invariant(false) : void 0;
|
|
15
|
+
return relayLoggingContext;
|
|
16
|
+
}
|
|
17
|
+
module.exports = createRelayLoggingContext;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var TYPENAME_PREFIX = '__type:';
|
|
4
|
+
function generateTypenamePrefixedDataID(typeName, dataID) {
|
|
5
|
+
return "".concat(TYPENAME_PREFIX).concat(typeName, ":").concat(dataID);
|
|
6
|
+
}
|
|
7
|
+
module.exports = {
|
|
8
|
+
generateTypenamePrefixedDataID: generateTypenamePrefixedDataID
|
|
9
|
+
};
|
|
@@ -22,6 +22,7 @@ var _require5 = require('../RelayStoreUtils'),
|
|
|
22
22
|
RELAY_RESOLVER_OUTPUT_TYPE_RECORD_IDS = _require5.RELAY_RESOLVER_OUTPUT_TYPE_RECORD_IDS,
|
|
23
23
|
RELAY_RESOLVER_SNAPSHOT_KEY = _require5.RELAY_RESOLVER_SNAPSHOT_KEY,
|
|
24
24
|
RELAY_RESOLVER_VALUE_KEY = _require5.RELAY_RESOLVER_VALUE_KEY,
|
|
25
|
+
getReadTimeResolverStorageKey = _require5.getReadTimeResolverStorageKey,
|
|
25
26
|
getStorageKey = _require5.getStorageKey;
|
|
26
27
|
var getOutputTypeRecordIDs = require('./getOutputTypeRecordIDs');
|
|
27
28
|
var isLiveStateValue = require('./isLiveStateValue');
|
|
@@ -55,7 +56,7 @@ var LiveResolverCache = /*#__PURE__*/function () {
|
|
|
55
56
|
_proto.readFromCacheOrEvaluate = function readFromCacheOrEvaluate(recordID, field, variables, evaluate, getDataForResolverFragment) {
|
|
56
57
|
var recordSource = this._getRecordSource();
|
|
57
58
|
var record = expectRecord(recordSource, recordID);
|
|
58
|
-
var storageKey =
|
|
59
|
+
var storageKey = getReadTimeResolverStorageKey(field, variables);
|
|
59
60
|
var linkedID = RelayModernRecord.getLinkedRecordID(record, storageKey);
|
|
60
61
|
var linkedRecord = linkedID == null ? null : recordSource.get(linkedID);
|
|
61
62
|
var updatedDataIDs;
|
|
@@ -292,9 +293,7 @@ var LiveResolverCache = /*#__PURE__*/function () {
|
|
|
292
293
|
var recordsToVisit = Array.from(updatedDataIDs);
|
|
293
294
|
while (recordsToVisit.length) {
|
|
294
295
|
var recordID = recordsToVisit.pop();
|
|
295
|
-
|
|
296
|
-
visited.add(recordID);
|
|
297
|
-
}
|
|
296
|
+
visited.add(recordID);
|
|
298
297
|
updatedDataIDs.add(recordID);
|
|
299
298
|
var fragmentSet = this._recordIDToResolverIDs.get(recordID);
|
|
300
299
|
if (fragmentSet == null) {
|
|
@@ -306,9 +305,7 @@ var LiveResolverCache = /*#__PURE__*/function () {
|
|
|
306
305
|
for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
|
|
307
306
|
var fragment = _step4.value;
|
|
308
307
|
if (!visited.has(fragment)) {
|
|
309
|
-
|
|
310
|
-
visited.add(fragment);
|
|
311
|
-
}
|
|
308
|
+
visited.add(fragment);
|
|
312
309
|
var recordSet = this._resolverIDToRecordIDs.get(fragment);
|
|
313
310
|
if (recordSet == null) {
|
|
314
311
|
continue;
|
|
@@ -320,9 +317,7 @@ var LiveResolverCache = /*#__PURE__*/function () {
|
|
|
320
317
|
var anotherRecordID = _step5.value;
|
|
321
318
|
markInvalidatedResolverRecord(anotherRecordID, recordSource);
|
|
322
319
|
if (!visited.has(anotherRecordID)) {
|
|
323
|
-
|
|
324
|
-
visited.add(anotherRecordID);
|
|
325
|
-
}
|
|
320
|
+
visited.add(anotherRecordID);
|
|
326
321
|
recordsToVisit.push(anotherRecordID);
|
|
327
322
|
}
|
|
328
323
|
}
|
|
@@ -5,26 +5,26 @@ var _require = require('../ResolverFragments'),
|
|
|
5
5
|
var invariant = require('invariant');
|
|
6
6
|
function resolverDataInjector(fragment, _resolverFn, fieldName, isRequiredField) {
|
|
7
7
|
var resolverFn = _resolverFn;
|
|
8
|
-
return function (fragmentKey, args) {
|
|
8
|
+
return function (fragmentKey, args, resolverContext) {
|
|
9
9
|
var data = readFragment(fragment, fragmentKey);
|
|
10
10
|
if (fieldName != null) {
|
|
11
11
|
if (data == null) {
|
|
12
12
|
if (isRequiredField === true) {
|
|
13
13
|
!false ? process.env.NODE_ENV !== "production" ? invariant(false, 'Expected required resolver field `%s` in fragment `%s` to be present. But resolvers fragment data is null/undefined.', fieldName, fragment.name) : invariant(false) : void 0;
|
|
14
14
|
} else {
|
|
15
|
-
return resolverFn(null, args);
|
|
15
|
+
return resolverFn(null, args, resolverContext);
|
|
16
16
|
}
|
|
17
17
|
}
|
|
18
18
|
if (fieldName in data) {
|
|
19
19
|
if (isRequiredField === true) {
|
|
20
20
|
!(data[fieldName] != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'Expected required resolver field `%s` in fragment `%s` to be non-null.', fieldName, fragment.name) : invariant(false) : void 0;
|
|
21
21
|
}
|
|
22
|
-
return resolverFn(data[fieldName], args);
|
|
22
|
+
return resolverFn(data[fieldName], args, resolverContext);
|
|
23
23
|
} else {
|
|
24
24
|
!false ? process.env.NODE_ENV !== "production" ? invariant(false, 'Missing field `%s` in fragment `%s` in resolver response.', fieldName, fragment.name) : invariant(false) : void 0;
|
|
25
25
|
}
|
|
26
26
|
} else {
|
|
27
|
-
return resolverFn(
|
|
27
|
+
return resolverFn(null, args, resolverContext);
|
|
28
28
|
}
|
|
29
29
|
};
|
|
30
30
|
}
|