relay-runtime 11.0.2 → 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/index.js +1 -1
- package/index.js.flow +16 -1
- package/lib/index.js +15 -0
- package/lib/multi-actor-environment/ActorIdentifier.js +11 -1
- package/lib/multi-actor-environment/ActorSpecificEnvironment.js +59 -19
- package/lib/multi-actor-environment/ActorUtils.js +27 -0
- package/lib/multi-actor-environment/MultiActorEnvironment.js +305 -55
- package/lib/multi-actor-environment/index.js +5 -1
- package/lib/mutations/RelayRecordSourceSelectorProxy.js +6 -1
- package/lib/mutations/commitMutation.js +4 -1
- package/lib/mutations/validateMutation.js +6 -1
- package/lib/network/RelayObservable.js +3 -1
- package/lib/network/RelayQueryResponseCache.js +19 -3
- package/lib/network/wrapNetworkWithLogObserver.js +78 -0
- package/lib/store/DataChecker.js +110 -40
- package/lib/store/OperationExecutor.js +478 -204
- package/lib/store/RelayConcreteVariables.js +21 -0
- package/lib/store/RelayModernEnvironment.js +41 -85
- package/lib/store/RelayModernFragmentSpecResolver.js +48 -22
- package/lib/store/RelayModernRecord.js +35 -1
- package/lib/store/RelayModernStore.js +48 -14
- package/lib/store/RelayOperationTracker.js +33 -23
- package/lib/store/RelayPublishQueue.js +23 -5
- package/lib/store/RelayReader.js +138 -44
- package/lib/store/RelayRecordSource.js +87 -3
- package/lib/store/RelayReferenceMarker.js +28 -15
- package/lib/store/RelayResponseNormalizer.js +164 -91
- package/lib/store/RelayStoreReactFlightUtils.js +1 -7
- package/lib/store/RelayStoreSubscriptions.js +8 -5
- package/lib/store/RelayStoreUtils.js +7 -2
- package/lib/store/ResolverCache.js +213 -0
- package/lib/store/ResolverFragments.js +1 -1
- package/lib/store/createRelayContext.js +1 -1
- package/lib/subscription/requestSubscription.js +27 -29
- package/lib/util/RelayConcreteNode.js +1 -0
- package/lib/util/RelayFeatureFlags.js +3 -5
- package/lib/util/RelayReplaySubject.js +21 -6
- 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/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 +17 -1
- package/multi-actor-environment/ActorSpecificEnvironment.js.flow +72 -44
- package/multi-actor-environment/ActorUtils.js.flow +33 -0
- package/multi-actor-environment/MultiActorEnvironment.js.flow +332 -80
- package/multi-actor-environment/MultiActorEnvironmentTypes.js.flow +61 -12
- package/multi-actor-environment/index.js.flow +3 -0
- package/mutations/RelayRecordSourceSelectorProxy.js.flow +7 -2
- package/mutations/commitMutation.js.flow +2 -0
- package/mutations/validateMutation.js.flow +8 -0
- package/network/RelayObservable.js.flow +2 -0
- package/network/RelayQueryResponseCache.js.flow +31 -18
- package/network/wrapNetworkWithLogObserver.js.flow +99 -0
- package/package.json +1 -1
- 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 +126 -35
- package/store/OperationExecutor.js.flow +528 -265
- package/store/RelayConcreteVariables.js.flow +26 -1
- package/store/RelayModernEnvironment.js.flow +41 -94
- 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 +50 -12
- package/store/RelayOperationTracker.js.flow +56 -34
- package/store/RelayPublishQueue.js.flow +31 -8
- package/store/RelayReader.js.flow +148 -42
- package/store/RelayRecordSource.js.flow +72 -6
- package/store/RelayReferenceMarker.js.flow +29 -12
- package/store/RelayResponseNormalizer.js.flow +164 -48
- package/store/RelayStoreReactFlightUtils.js.flow +1 -7
- package/store/RelayStoreSubscriptions.js.flow +10 -3
- package/store/RelayStoreTypes.js.flow +128 -12
- package/store/RelayStoreUtils.js.flow +17 -3
- package/store/ResolverCache.js.flow +247 -0
- package/store/ResolverFragments.js.flow +6 -3
- package/store/createRelayContext.js.flow +1 -1
- package/subscription/requestSubscription.js.flow +41 -29
- package/util/NormalizationNode.js.flow +10 -3
- package/util/ReaderNode.js.flow +15 -1
- package/util/RelayConcreteNode.js.flow +1 -0
- package/util/RelayFeatureFlags.js.flow +8 -10
- package/util/RelayReplaySubject.js.flow +7 -6
- 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 +1 -0
- 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
|
@@ -16,6 +16,9 @@ var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/obje
|
|
|
16
16
|
|
|
17
17
|
var invariant = require('invariant');
|
|
18
18
|
|
|
19
|
+
var _require = require('./RelayStoreUtils'),
|
|
20
|
+
getArgumentValues = _require.getArgumentValues;
|
|
21
|
+
|
|
19
22
|
/**
|
|
20
23
|
* Determines the variables that are in scope for a fragment given the variables
|
|
21
24
|
* in scope at the root query as well as any arguments applied at the fragment
|
|
@@ -88,7 +91,25 @@ function getOperationVariables(operation, variables) {
|
|
|
88
91
|
return operationVariables;
|
|
89
92
|
}
|
|
90
93
|
|
|
94
|
+
function getLocalVariables(currentVariables, argumentDefinitions, args) {
|
|
95
|
+
if (argumentDefinitions == null) {
|
|
96
|
+
return currentVariables;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
var nextVariables = (0, _objectSpread2["default"])({}, currentVariables);
|
|
100
|
+
var nextArgs = args ? getArgumentValues(args, currentVariables) : {};
|
|
101
|
+
argumentDefinitions.forEach(function (def) {
|
|
102
|
+
var _nextArgs$def$name;
|
|
103
|
+
|
|
104
|
+
// $FlowFixMe[cannot-write]
|
|
105
|
+
var value = (_nextArgs$def$name = nextArgs[def.name]) !== null && _nextArgs$def$name !== void 0 ? _nextArgs$def$name : def.defaultValue;
|
|
106
|
+
nextVariables[def.name] = value;
|
|
107
|
+
});
|
|
108
|
+
return nextVariables;
|
|
109
|
+
}
|
|
110
|
+
|
|
91
111
|
module.exports = {
|
|
112
|
+
getLocalVariables: getLocalVariables,
|
|
92
113
|
getFragmentVariables: getFragmentVariables,
|
|
93
114
|
getOperationVariables: getOperationVariables
|
|
94
115
|
};
|
|
@@ -33,10 +33,16 @@ var defaultGetDataID = require('./defaultGetDataID');
|
|
|
33
33
|
|
|
34
34
|
var defaultRequiredFieldLogger = require('./defaultRequiredFieldLogger');
|
|
35
35
|
|
|
36
|
-
var generateID = require('../util/generateID');
|
|
37
|
-
|
|
38
36
|
var invariant = require('invariant');
|
|
39
37
|
|
|
38
|
+
var registerEnvironmentWithDevTools = require('../util/registerEnvironmentWithDevTools');
|
|
39
|
+
|
|
40
|
+
var wrapNetworkWithLogObserver = require('../network/wrapNetworkWithLogObserver');
|
|
41
|
+
|
|
42
|
+
var _require = require('../multi-actor-environment/ActorIdentifier'),
|
|
43
|
+
INTERNAL_ACTOR_IDENTIFIER_DO_NOT_USE = _require.INTERNAL_ACTOR_IDENTIFIER_DO_NOT_USE,
|
|
44
|
+
assertInternalActorIndentifier = _require.assertInternalActorIndentifier;
|
|
45
|
+
|
|
40
46
|
var RelayModernEnvironment = /*#__PURE__*/function () {
|
|
41
47
|
function RelayModernEnvironment(config) {
|
|
42
48
|
var _this = this;
|
|
@@ -64,7 +70,7 @@ var RelayModernEnvironment = /*#__PURE__*/function () {
|
|
|
64
70
|
this._defaultRenderPolicy = ((_config$UNSTABLE_defa = config.UNSTABLE_defaultRenderPolicy) !== null && _config$UNSTABLE_defa !== void 0 ? _config$UNSTABLE_defa : RelayFeatureFlags.ENABLE_PARTIAL_RENDERING_DEFAULT === true) ? 'partial' : 'full';
|
|
65
71
|
this._operationLoader = operationLoader;
|
|
66
72
|
this._operationExecutions = new Map();
|
|
67
|
-
this._network = this
|
|
73
|
+
this._network = wrapNetworkWithLogObserver(this, config.network);
|
|
68
74
|
this._getDataID = (_config$getDataID = config.getDataID) !== null && _config$getDataID !== void 0 ? _config$getDataID : defaultGetDataID;
|
|
69
75
|
this._publishQueue = new RelayPublishQueue(config.store, (_config$handlerProvid = config.handlerProvider) !== null && _config$handlerProvid !== void 0 ? _config$handlerProvid : RelayDefaultHandlerProvider, this._getDataID);
|
|
70
76
|
this._scheduler = (_config$scheduler = config.scheduler) !== null && _config$scheduler !== void 0 ? _config$scheduler : null;
|
|
@@ -73,33 +79,26 @@ var RelayModernEnvironment = /*#__PURE__*/function () {
|
|
|
73
79
|
this._isServer = (_config$isServer = config.isServer) !== null && _config$isServer !== void 0 ? _config$isServer : false;
|
|
74
80
|
|
|
75
81
|
this.__setNet = function (newNet) {
|
|
76
|
-
return _this._network = _this
|
|
82
|
+
return _this._network = wrapNetworkWithLogObserver(_this, newNet);
|
|
77
83
|
};
|
|
78
84
|
|
|
79
85
|
if (process.env.NODE_ENV !== "production") {
|
|
80
|
-
var
|
|
81
|
-
inspect =
|
|
86
|
+
var _require2 = require('./StoreInspector'),
|
|
87
|
+
inspect = _require2.inspect;
|
|
82
88
|
|
|
83
89
|
this.DEBUG_inspect = function (dataID) {
|
|
84
90
|
return inspect(_this, dataID);
|
|
85
91
|
};
|
|
86
|
-
} // Register this Relay Environment with Relay DevTools if it exists.
|
|
87
|
-
// Note: this must always be the last step in the constructor.
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
var _global = typeof global !== 'undefined' ? global : typeof window !== 'undefined' ? window : undefined;
|
|
91
|
-
|
|
92
|
-
var devToolsHook = _global && _global.__RELAY_DEVTOOLS_HOOK__;
|
|
93
|
-
|
|
94
|
-
if (devToolsHook) {
|
|
95
|
-
devToolsHook.registerEnvironment(this);
|
|
96
92
|
}
|
|
97
93
|
|
|
98
94
|
this._missingFieldHandlers = config.missingFieldHandlers;
|
|
99
95
|
this._operationTracker = (_config$operationTrac = config.operationTracker) !== null && _config$operationTrac !== void 0 ? _config$operationTrac : new RelayOperationTracker();
|
|
100
96
|
this._reactFlightPayloadDeserializer = reactFlightPayloadDeserializer;
|
|
101
97
|
this._reactFlightServerErrorHandler = reactFlightServerErrorHandler;
|
|
102
|
-
this._shouldProcessClientComponents = config.shouldProcessClientComponents;
|
|
98
|
+
this._shouldProcessClientComponents = config.shouldProcessClientComponents; // Register this Relay Environment with Relay DevTools if it exists.
|
|
99
|
+
// Note: this must always be the last step in the constructor.
|
|
100
|
+
|
|
101
|
+
registerEnvironmentWithDevTools(this);
|
|
103
102
|
}
|
|
104
103
|
|
|
105
104
|
var _proto = RelayModernEnvironment.prototype;
|
|
@@ -241,9 +240,19 @@ var RelayModernEnvironment = /*#__PURE__*/function () {
|
|
|
241
240
|
|
|
242
241
|
var target = RelayRecordSource.create();
|
|
243
242
|
|
|
243
|
+
var source = this._store.getSource();
|
|
244
|
+
|
|
244
245
|
var result = this._store.check(operation, {
|
|
245
|
-
|
|
246
|
-
|
|
246
|
+
handlers: handlers,
|
|
247
|
+
defaultActorIdentifier: INTERNAL_ACTOR_IDENTIFIER_DO_NOT_USE,
|
|
248
|
+
getSourceForActor: function getSourceForActor(actorIdentifier) {
|
|
249
|
+
assertInternalActorIndentifier(actorIdentifier);
|
|
250
|
+
return source;
|
|
251
|
+
},
|
|
252
|
+
getTargetForActor: function getTargetForActor(actorIdentifier) {
|
|
253
|
+
assertInternalActorIndentifier(actorIdentifier);
|
|
254
|
+
return target;
|
|
255
|
+
}
|
|
247
256
|
});
|
|
248
257
|
|
|
249
258
|
if (target.size() > 0) {
|
|
@@ -336,7 +345,7 @@ var RelayModernEnvironment = /*#__PURE__*/function () {
|
|
|
336
345
|
/**
|
|
337
346
|
* Returns an Observable of GraphQLResponse resulting from executing the
|
|
338
347
|
* provided Query or Subscription operation responses, the result of which is
|
|
339
|
-
* then normalized and
|
|
348
|
+
* then normalized and committed to the publish queue.
|
|
340
349
|
*
|
|
341
350
|
* Note: Observables are lazy, so calling this method will do nothing until
|
|
342
351
|
* the result is subscribed to:
|
|
@@ -372,16 +381,23 @@ var RelayModernEnvironment = /*#__PURE__*/function () {
|
|
|
372
381
|
operation = _ref4.operation,
|
|
373
382
|
optimisticConfig = _ref4.optimisticConfig,
|
|
374
383
|
updater = _ref4.updater;
|
|
384
|
+
var publishQueue = this._publishQueue;
|
|
385
|
+
var store = this._store;
|
|
375
386
|
return RelayObservable.create(function (sink) {
|
|
376
387
|
var executor = OperationExecutor.execute({
|
|
388
|
+
actorIdentifier: INTERNAL_ACTOR_IDENTIFIER_DO_NOT_USE,
|
|
377
389
|
getDataID: _this9._getDataID,
|
|
378
390
|
isClientPayload: isClientPayload,
|
|
391
|
+
log: _this9.__log,
|
|
379
392
|
operation: operation,
|
|
380
393
|
operationExecutions: _this9._operationExecutions,
|
|
381
394
|
operationLoader: _this9._operationLoader,
|
|
382
395
|
operationTracker: _this9._operationTracker,
|
|
383
396
|
optimisticConfig: optimisticConfig,
|
|
384
|
-
|
|
397
|
+
getPublishQueue: function getPublishQueue(actorIdentifier) {
|
|
398
|
+
assertInternalActorIndentifier(actorIdentifier);
|
|
399
|
+
return publishQueue;
|
|
400
|
+
},
|
|
385
401
|
reactFlightPayloadDeserializer: _this9._reactFlightPayloadDeserializer,
|
|
386
402
|
reactFlightServerErrorHandler: _this9._reactFlightServerErrorHandler,
|
|
387
403
|
scheduler: _this9._scheduler,
|
|
@@ -390,7 +406,10 @@ var RelayModernEnvironment = /*#__PURE__*/function () {
|
|
|
390
406
|
// NOTE: Some product tests expect `Network.execute` to be called only
|
|
391
407
|
// when the Observable is executed.
|
|
392
408
|
source: createSource(),
|
|
393
|
-
|
|
409
|
+
getStore: function getStore(actorIdentifier) {
|
|
410
|
+
assertInternalActorIndentifier(actorIdentifier);
|
|
411
|
+
return store;
|
|
412
|
+
},
|
|
394
413
|
treatMissingFieldsAsNull: _this9._treatMissingFieldsAsNull,
|
|
395
414
|
updater: updater
|
|
396
415
|
});
|
|
@@ -398,69 +417,6 @@ var RelayModernEnvironment = /*#__PURE__*/function () {
|
|
|
398
417
|
return executor.cancel();
|
|
399
418
|
};
|
|
400
419
|
});
|
|
401
|
-
}
|
|
402
|
-
/**
|
|
403
|
-
* Wraps the network with logging to ensure that network requests are
|
|
404
|
-
* always logged. Relying on each network callsite to be wrapped is
|
|
405
|
-
* untenable and will eventually lead to holes in the logging.
|
|
406
|
-
*/
|
|
407
|
-
;
|
|
408
|
-
|
|
409
|
-
_proto.__wrapNetworkWithLogObserver = function __wrapNetworkWithLogObserver(network) {
|
|
410
|
-
var that = this;
|
|
411
|
-
return {
|
|
412
|
-
execute: function execute(params, variables, cacheConfig, uploadables) {
|
|
413
|
-
var transactionID = generateID();
|
|
414
|
-
var log = that.__log;
|
|
415
|
-
var logObserver = {
|
|
416
|
-
start: function start(subscription) {
|
|
417
|
-
log({
|
|
418
|
-
name: 'network.start',
|
|
419
|
-
transactionID: transactionID,
|
|
420
|
-
params: params,
|
|
421
|
-
variables: variables,
|
|
422
|
-
cacheConfig: cacheConfig
|
|
423
|
-
});
|
|
424
|
-
},
|
|
425
|
-
next: function next(response) {
|
|
426
|
-
log({
|
|
427
|
-
name: 'network.next',
|
|
428
|
-
transactionID: transactionID,
|
|
429
|
-
response: response
|
|
430
|
-
});
|
|
431
|
-
},
|
|
432
|
-
error: function error(_error) {
|
|
433
|
-
log({
|
|
434
|
-
name: 'network.error',
|
|
435
|
-
transactionID: transactionID,
|
|
436
|
-
error: _error
|
|
437
|
-
});
|
|
438
|
-
},
|
|
439
|
-
complete: function complete() {
|
|
440
|
-
log({
|
|
441
|
-
name: 'network.complete',
|
|
442
|
-
transactionID: transactionID
|
|
443
|
-
});
|
|
444
|
-
},
|
|
445
|
-
unsubscribe: function unsubscribe() {
|
|
446
|
-
log({
|
|
447
|
-
name: 'network.unsubscribe',
|
|
448
|
-
transactionID: transactionID
|
|
449
|
-
});
|
|
450
|
-
}
|
|
451
|
-
};
|
|
452
|
-
|
|
453
|
-
var logRequestInfo = function logRequestInfo(info) {
|
|
454
|
-
log({
|
|
455
|
-
name: 'network.info',
|
|
456
|
-
transactionID: transactionID,
|
|
457
|
-
info: info
|
|
458
|
-
});
|
|
459
|
-
};
|
|
460
|
-
|
|
461
|
-
return network.execute(params, variables, cacheConfig, uploadables, logRequestInfo)["do"](logObserver);
|
|
462
|
-
}
|
|
463
|
-
};
|
|
464
420
|
};
|
|
465
421
|
|
|
466
422
|
return RelayModernEnvironment;
|
|
@@ -20,24 +20,25 @@ var RelayFeatureFlags = require('../util/RelayFeatureFlags');
|
|
|
20
20
|
|
|
21
21
|
var areEqual = require("fbjs/lib/areEqual");
|
|
22
22
|
|
|
23
|
+
var getPendingOperationsForFragment = require('../util/getPendingOperationsForFragment');
|
|
24
|
+
|
|
23
25
|
var invariant = require('invariant');
|
|
24
26
|
|
|
25
27
|
var isScalarAndEqual = require('../util/isScalarAndEqual');
|
|
26
28
|
|
|
29
|
+
var recycleNodesInto = require('../util/recycleNodesInto');
|
|
30
|
+
|
|
27
31
|
var reportMissingRequiredFields = require('../util/reportMissingRequiredFields');
|
|
28
32
|
|
|
29
33
|
var warning = require("fbjs/lib/warning");
|
|
30
34
|
|
|
31
|
-
var _require = require('
|
|
32
|
-
|
|
35
|
+
var _require = require('./RelayModernOperationDescriptor'),
|
|
36
|
+
createRequestDescriptor = _require.createRequestDescriptor;
|
|
33
37
|
|
|
34
|
-
var _require2 = require('./
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
areEqualSelectors = _require3.areEqualSelectors,
|
|
39
|
-
createReaderSelector = _require3.createReaderSelector,
|
|
40
|
-
getSelectorsFromObject = _require3.getSelectorsFromObject;
|
|
38
|
+
var _require2 = require('./RelayModernSelector'),
|
|
39
|
+
areEqualSelectors = _require2.areEqualSelectors,
|
|
40
|
+
createReaderSelector = _require2.createReaderSelector,
|
|
41
|
+
getSelectorsFromObject = _require2.getSelectorsFromObject;
|
|
41
42
|
|
|
42
43
|
/**
|
|
43
44
|
* A utility for resolving and subscribing to the results of a fragment spec
|
|
@@ -129,13 +130,17 @@ var RelayModernFragmentSpecResolver = /*#__PURE__*/function () {
|
|
|
129
130
|
return this._data;
|
|
130
131
|
};
|
|
131
132
|
|
|
132
|
-
_proto.setCallback = function setCallback(callback) {
|
|
133
|
+
_proto.setCallback = function setCallback(props, callback) {
|
|
133
134
|
this._callback = callback;
|
|
135
|
+
|
|
136
|
+
if (RelayFeatureFlags.ENABLE_CONTAINERS_SUBSCRIBE_ON_COMMIT === true) {
|
|
137
|
+
this.setProps(props);
|
|
138
|
+
}
|
|
134
139
|
};
|
|
135
140
|
|
|
136
141
|
_proto.setProps = function setProps(props) {
|
|
137
|
-
var ownedSelectors = getSelectorsFromObject(this._fragments, props);
|
|
138
142
|
this._props = {};
|
|
143
|
+
var ownedSelectors = getSelectorsFromObject(this._fragments, props);
|
|
139
144
|
|
|
140
145
|
for (var _key3 in ownedSelectors) {
|
|
141
146
|
if (ownedSelectors.hasOwnProperty(_key3)) {
|
|
@@ -150,14 +155,14 @@ var RelayModernFragmentSpecResolver = /*#__PURE__*/function () {
|
|
|
150
155
|
resolver = null;
|
|
151
156
|
} else if (ownedSelector.kind === 'PluralReaderSelector') {
|
|
152
157
|
if (resolver == null) {
|
|
153
|
-
resolver = new SelectorListResolver(this._context.environment, this._rootIsQueryRenderer, ownedSelector, this._onChange);
|
|
158
|
+
resolver = new SelectorListResolver(this._context.environment, this._rootIsQueryRenderer, ownedSelector, this._callback != null, this._onChange);
|
|
154
159
|
} else {
|
|
155
160
|
!(resolver instanceof SelectorListResolver) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayModernFragmentSpecResolver: Expected prop `%s` to always be an array.', _key3) : invariant(false) : void 0;
|
|
156
161
|
resolver.setSelector(ownedSelector);
|
|
157
162
|
}
|
|
158
163
|
} else {
|
|
159
164
|
if (resolver == null) {
|
|
160
|
-
resolver = new SelectorResolver(this._context.environment, this._rootIsQueryRenderer, ownedSelector, this._onChange);
|
|
165
|
+
resolver = new SelectorResolver(this._context.environment, this._rootIsQueryRenderer, ownedSelector, this._callback != null, this._onChange);
|
|
161
166
|
} else {
|
|
162
167
|
!(resolver instanceof SelectorResolver) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayModernFragmentSpecResolver: Expected prop `%s` to always be an object.', _key3) : invariant(false) : void 0;
|
|
163
168
|
resolver.setSelector(ownedSelector);
|
|
@@ -194,7 +199,7 @@ var RelayModernFragmentSpecResolver = /*#__PURE__*/function () {
|
|
|
194
199
|
|
|
195
200
|
|
|
196
201
|
var SelectorResolver = /*#__PURE__*/function () {
|
|
197
|
-
function SelectorResolver(environment, rootIsQueryRenderer, selector, callback) {
|
|
202
|
+
function SelectorResolver(environment, rootIsQueryRenderer, selector, subscribeOnConstruction, callback) {
|
|
198
203
|
var _this2 = this;
|
|
199
204
|
|
|
200
205
|
(0, _defineProperty2["default"])(this, "_onChange", function (snapshot) {
|
|
@@ -214,7 +219,14 @@ var SelectorResolver = /*#__PURE__*/function () {
|
|
|
214
219
|
this._environment = environment;
|
|
215
220
|
this._rootIsQueryRenderer = rootIsQueryRenderer;
|
|
216
221
|
this._selector = selector;
|
|
217
|
-
|
|
222
|
+
|
|
223
|
+
if (RelayFeatureFlags.ENABLE_CONTAINERS_SUBSCRIBE_ON_COMMIT === true) {
|
|
224
|
+
if (subscribeOnConstruction) {
|
|
225
|
+
this._subscription = environment.subscribe(_snapshot, this._onChange);
|
|
226
|
+
}
|
|
227
|
+
} else {
|
|
228
|
+
this._subscription = environment.subscribe(_snapshot, this._onChange);
|
|
229
|
+
}
|
|
218
230
|
}
|
|
219
231
|
|
|
220
232
|
var _proto2 = SelectorResolver.prototype;
|
|
@@ -228,9 +240,7 @@ var SelectorResolver = /*#__PURE__*/function () {
|
|
|
228
240
|
};
|
|
229
241
|
|
|
230
242
|
_proto2.resolve = function resolve() {
|
|
231
|
-
if (
|
|
232
|
-
var _getPromiseForActiveR;
|
|
233
|
-
|
|
243
|
+
if (this._isMissingData === true) {
|
|
234
244
|
// NOTE: This branch exists to handle the case in which:
|
|
235
245
|
// - A RelayModern container is rendered as a descendant of a Relay Hook
|
|
236
246
|
// root using a "partial" renderPolicy (this means that eargerly
|
|
@@ -252,13 +262,28 @@ var SelectorResolver = /*#__PURE__*/function () {
|
|
|
252
262
|
// This should eventually go away with something like @optional, where we only
|
|
253
263
|
// suspend at specific boundaries depending on whether the boundary
|
|
254
264
|
// can be fulfilled or not.
|
|
255
|
-
var
|
|
265
|
+
var pendingOperationsResult = getPendingOperationsForFragment(this._environment, this._selector.node, this._selector.owner);
|
|
266
|
+
var promise = pendingOperationsResult === null || pendingOperationsResult === void 0 ? void 0 : pendingOperationsResult.promise;
|
|
256
267
|
|
|
257
268
|
if (promise != null) {
|
|
258
269
|
if (this._rootIsQueryRenderer) {
|
|
259
270
|
process.env.NODE_ENV !== "production" ? warning(false, 'Relay: Relay Container for fragment `%s` has missing data and ' + 'would suspend. When using features such as @defer or @module, ' + 'use `useFragment` instead of a Relay Container.', this._selector.node.name) : void 0;
|
|
260
271
|
} else {
|
|
272
|
+
var _pendingOperationsRes;
|
|
273
|
+
|
|
274
|
+
var pendingOperations = (_pendingOperationsRes = pendingOperationsResult === null || pendingOperationsResult === void 0 ? void 0 : pendingOperationsResult.pendingOperations) !== null && _pendingOperationsRes !== void 0 ? _pendingOperationsRes : [];
|
|
261
275
|
process.env.NODE_ENV !== "production" ? warning(false, 'Relay: Relay Container for fragment `%s` suspended. When using ' + 'features such as @defer or @module, use `useFragment` instead ' + 'of a Relay Container.', this._selector.node.name) : void 0;
|
|
276
|
+
|
|
277
|
+
this._environment.__log({
|
|
278
|
+
name: 'suspense.fragment',
|
|
279
|
+
data: this._data,
|
|
280
|
+
fragment: this._selector.node,
|
|
281
|
+
isRelayHooks: false,
|
|
282
|
+
isMissingData: this._isMissingData,
|
|
283
|
+
isPromiseCached: false,
|
|
284
|
+
pendingOperations: pendingOperations
|
|
285
|
+
});
|
|
286
|
+
|
|
262
287
|
throw promise;
|
|
263
288
|
}
|
|
264
289
|
}
|
|
@@ -280,7 +305,7 @@ var SelectorResolver = /*#__PURE__*/function () {
|
|
|
280
305
|
|
|
281
306
|
var snapshot = this._environment.lookup(selector);
|
|
282
307
|
|
|
283
|
-
this._data = snapshot.data;
|
|
308
|
+
this._data = recycleNodesInto(this._data, snapshot.data);
|
|
284
309
|
this._isMissingData = snapshot.isMissingData;
|
|
285
310
|
this._missingRequiredFields = snapshot.missingRequiredFields;
|
|
286
311
|
this._selector = selector;
|
|
@@ -319,7 +344,7 @@ var SelectorResolver = /*#__PURE__*/function () {
|
|
|
319
344
|
|
|
320
345
|
|
|
321
346
|
var SelectorListResolver = /*#__PURE__*/function () {
|
|
322
|
-
function SelectorListResolver(environment, rootIsQueryRenderer, selector, callback) {
|
|
347
|
+
function SelectorListResolver(environment, rootIsQueryRenderer, selector, subscribeOnConstruction, callback) {
|
|
323
348
|
var _this3 = this;
|
|
324
349
|
|
|
325
350
|
(0, _defineProperty2["default"])(this, "_onChange", function (data) {
|
|
@@ -333,6 +358,7 @@ var SelectorListResolver = /*#__PURE__*/function () {
|
|
|
333
358
|
this._resolvers = [];
|
|
334
359
|
this._stale = true;
|
|
335
360
|
this._rootIsQueryRenderer = rootIsQueryRenderer;
|
|
361
|
+
this._subscribeOnConstruction = subscribeOnConstruction;
|
|
336
362
|
this.setSelector(selector);
|
|
337
363
|
}
|
|
338
364
|
|
|
@@ -384,7 +410,7 @@ var SelectorListResolver = /*#__PURE__*/function () {
|
|
|
384
410
|
if (ii < this._resolvers.length) {
|
|
385
411
|
this._resolvers[ii].setSelector(selectors[ii]);
|
|
386
412
|
} else {
|
|
387
|
-
this._resolvers[ii] = new SelectorResolver(this._environment, this._rootIsQueryRenderer, selectors[ii], this._onChange);
|
|
413
|
+
this._resolvers[ii] = new SelectorResolver(this._environment, this._rootIsQueryRenderer, selectors[ii], this._subscribeOnConstruction, this._onChange);
|
|
388
414
|
}
|
|
389
415
|
}
|
|
390
416
|
|
|
@@ -26,6 +26,7 @@ var _require = require('./ClientID'),
|
|
|
26
26
|
isClientID = _require.isClientID;
|
|
27
27
|
|
|
28
28
|
var _require2 = require('./RelayStoreUtils'),
|
|
29
|
+
ACTOR_IDENTIFIER_KEY = _require2.ACTOR_IDENTIFIER_KEY,
|
|
29
30
|
ID_KEY = _require2.ID_KEY,
|
|
30
31
|
REF_KEY = _require2.REF_KEY,
|
|
31
32
|
REFS_KEY = _require2.REFS_KEY,
|
|
@@ -336,6 +337,37 @@ function setLinkedRecordIDs(record, storageKey, linkedIDs) {
|
|
|
336
337
|
links[REFS_KEY] = linkedIDs;
|
|
337
338
|
record[storageKey] = links;
|
|
338
339
|
}
|
|
340
|
+
/**
|
|
341
|
+
* @public
|
|
342
|
+
*
|
|
343
|
+
* Set the value of a field to a reference to another record in the actor specific store.
|
|
344
|
+
*/
|
|
345
|
+
|
|
346
|
+
|
|
347
|
+
function setActorLinkedRecordID(record, storageKey, actorIdentifier, linkedID) {
|
|
348
|
+
// See perf note above for why we aren't using computed property access.
|
|
349
|
+
var link = {};
|
|
350
|
+
link[REF_KEY] = linkedID;
|
|
351
|
+
link[ACTOR_IDENTIFIER_KEY] = actorIdentifier;
|
|
352
|
+
record[storageKey] = link;
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* @public
|
|
356
|
+
*
|
|
357
|
+
* Get link to a record and the actor identifier for the store.
|
|
358
|
+
*/
|
|
359
|
+
|
|
360
|
+
|
|
361
|
+
function getActorLinkedRecordID(record, storageKey) {
|
|
362
|
+
var link = record[storageKey];
|
|
363
|
+
|
|
364
|
+
if (link == null) {
|
|
365
|
+
return link;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
!(typeof link === 'object' && typeof link[REF_KEY] === 'string' && link[ACTOR_IDENTIFIER_KEY] != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayModernRecord.getActorLinkedRecordID(): Expected `%s.%s` to be an actor specific linked ID, ' + 'was `%s`.', record[ID_KEY], storageKey, JSON.stringify(link)) : invariant(false) : void 0;
|
|
369
|
+
return [link[ACTOR_IDENTIFIER_KEY], link[REF_KEY]];
|
|
370
|
+
}
|
|
339
371
|
|
|
340
372
|
module.exports = {
|
|
341
373
|
clone: clone,
|
|
@@ -352,5 +384,7 @@ module.exports = {
|
|
|
352
384
|
setValue: setValue,
|
|
353
385
|
setLinkedRecordID: setLinkedRecordID,
|
|
354
386
|
setLinkedRecordIDs: setLinkedRecordIDs,
|
|
355
|
-
update: update
|
|
387
|
+
update: update,
|
|
388
|
+
getActorLinkedRecordID: getActorLinkedRecordID,
|
|
389
|
+
setActorLinkedRecordID: setActorLinkedRecordID
|
|
356
390
|
};
|
|
@@ -32,8 +32,6 @@ var RelayStoreReactFlightUtils = require('./RelayStoreReactFlightUtils');
|
|
|
32
32
|
|
|
33
33
|
var RelayStoreSubscriptions = require('./RelayStoreSubscriptions');
|
|
34
34
|
|
|
35
|
-
var RelayStoreSubscriptionsUsingMapByID = require('./RelayStoreSubscriptionsUsingMapByID');
|
|
36
|
-
|
|
37
35
|
var RelayStoreUtils = require('./RelayStoreUtils');
|
|
38
36
|
|
|
39
37
|
var deepFreeze = require('../util/deepFreeze');
|
|
@@ -44,9 +42,16 @@ var invariant = require('invariant');
|
|
|
44
42
|
|
|
45
43
|
var resolveImmediate = require('../util/resolveImmediate');
|
|
46
44
|
|
|
47
|
-
var _require = require('
|
|
48
|
-
|
|
49
|
-
|
|
45
|
+
var _require = require('../multi-actor-environment/ActorIdentifier'),
|
|
46
|
+
INTERNAL_ACTOR_IDENTIFIER_DO_NOT_USE = _require.INTERNAL_ACTOR_IDENTIFIER_DO_NOT_USE,
|
|
47
|
+
assertInternalActorIndentifier = _require.assertInternalActorIndentifier;
|
|
48
|
+
|
|
49
|
+
var _require2 = require('./RelayStoreUtils'),
|
|
50
|
+
ROOT_ID = _require2.ROOT_ID,
|
|
51
|
+
ROOT_TYPE = _require2.ROOT_TYPE;
|
|
52
|
+
|
|
53
|
+
var _require3 = require('./ResolverCache'),
|
|
54
|
+
RecordResolverCache = _require3.RecordResolverCache;
|
|
50
55
|
|
|
51
56
|
var DEFAULT_RELEASE_BUFFER_SIZE = 10;
|
|
52
57
|
/**
|
|
@@ -108,7 +113,10 @@ var RelayModernStore = /*#__PURE__*/function () {
|
|
|
108
113
|
this._releaseBuffer = [];
|
|
109
114
|
this._roots = new Map();
|
|
110
115
|
this._shouldScheduleGC = false;
|
|
111
|
-
this.
|
|
116
|
+
this._resolverCache = new RecordResolverCache(function () {
|
|
117
|
+
return _this._getMutableRecordSource();
|
|
118
|
+
});
|
|
119
|
+
this._storeSubscriptions = new RelayStoreSubscriptions(options === null || options === void 0 ? void 0 : options.log, this._resolverCache);
|
|
112
120
|
this._updatedRecordIDs = new Set();
|
|
113
121
|
this._shouldProcessClientComponents = options === null || options === void 0 ? void 0 : options.shouldProcessClientComponents;
|
|
114
122
|
initializeRecordSource(this._recordSource);
|
|
@@ -122,11 +130,19 @@ var RelayModernStore = /*#__PURE__*/function () {
|
|
|
122
130
|
return (_this$_optimisticSour = this._optimisticSource) !== null && _this$_optimisticSour !== void 0 ? _this$_optimisticSour : this._recordSource;
|
|
123
131
|
};
|
|
124
132
|
|
|
133
|
+
_proto._getMutableRecordSource = function _getMutableRecordSource() {
|
|
134
|
+
var _this$_optimisticSour2;
|
|
135
|
+
|
|
136
|
+
return (_this$_optimisticSour2 = this._optimisticSource) !== null && _this$_optimisticSour2 !== void 0 ? _this$_optimisticSour2 : this._recordSource;
|
|
137
|
+
};
|
|
138
|
+
|
|
125
139
|
_proto.check = function check(operation, options) {
|
|
126
|
-
var
|
|
140
|
+
var _options$handlers, _options$getSourceFor, _options$getTargetFor, _options$defaultActor;
|
|
127
141
|
|
|
128
142
|
var selector = operation.root;
|
|
129
|
-
|
|
143
|
+
|
|
144
|
+
var source = this._getMutableRecordSource();
|
|
145
|
+
|
|
130
146
|
var globalInvalidationEpoch = this._globalInvalidationEpoch;
|
|
131
147
|
|
|
132
148
|
var rootEntry = this._roots.get(operation.request.identifier);
|
|
@@ -135,7 +151,7 @@ var RelayModernStore = /*#__PURE__*/function () {
|
|
|
135
151
|
|
|
136
152
|
if (globalInvalidationEpoch != null) {
|
|
137
153
|
// If so, check if the operation we're checking was last written
|
|
138
|
-
// before or after invalidation
|
|
154
|
+
// before or after invalidation occurred.
|
|
139
155
|
if (operationLastWrittenAt == null || operationLastWrittenAt <= globalInvalidationEpoch) {
|
|
140
156
|
// If the operation was written /before/ global invalidation occurred,
|
|
141
157
|
// or if this operation has never been written to the store before,
|
|
@@ -147,9 +163,16 @@ var RelayModernStore = /*#__PURE__*/function () {
|
|
|
147
163
|
}
|
|
148
164
|
}
|
|
149
165
|
|
|
150
|
-
var target = (_options$target = options === null || options === void 0 ? void 0 : options.target) !== null && _options$target !== void 0 ? _options$target : source;
|
|
151
166
|
var handlers = (_options$handlers = options === null || options === void 0 ? void 0 : options.handlers) !== null && _options$handlers !== void 0 ? _options$handlers : [];
|
|
152
|
-
var
|
|
167
|
+
var getSourceForActor = (_options$getSourceFor = options === null || options === void 0 ? void 0 : options.getSourceForActor) !== null && _options$getSourceFor !== void 0 ? _options$getSourceFor : function (actorIdentifier) {
|
|
168
|
+
assertInternalActorIndentifier(actorIdentifier);
|
|
169
|
+
return source;
|
|
170
|
+
};
|
|
171
|
+
var getTargetForActor = (_options$getTargetFor = options === null || options === void 0 ? void 0 : options.getTargetForActor) !== null && _options$getTargetFor !== void 0 ? _options$getTargetFor : function (actorIdentifier) {
|
|
172
|
+
assertInternalActorIndentifier(actorIdentifier);
|
|
173
|
+
return source;
|
|
174
|
+
};
|
|
175
|
+
var operationAvailability = DataChecker.check(getSourceForActor, getTargetForActor, (_options$defaultActor = options === null || options === void 0 ? void 0 : options.defaultActorIdentifier) !== null && _options$defaultActor !== void 0 ? _options$defaultActor : INTERNAL_ACTOR_IDENTIFIER_DO_NOT_USE, selector, handlers, this._operationLoader, this._getDataID, this._shouldProcessClientComponents);
|
|
153
176
|
return getAvailabilityStatus(operationAvailability, operationLastWrittenAt, rootEntry === null || rootEntry === void 0 ? void 0 : rootEntry.fetchTime, this._queryCacheExpirationTime);
|
|
154
177
|
};
|
|
155
178
|
|
|
@@ -234,7 +257,7 @@ var RelayModernStore = /*#__PURE__*/function () {
|
|
|
234
257
|
|
|
235
258
|
_proto.lookup = function lookup(selector) {
|
|
236
259
|
var source = this.getSource();
|
|
237
|
-
var snapshot = RelayReader.read(source, selector);
|
|
260
|
+
var snapshot = RelayReader.read(source, selector, this._resolverCache);
|
|
238
261
|
|
|
239
262
|
if (process.env.NODE_ENV !== "production") {
|
|
240
263
|
deepFreeze(snapshot);
|
|
@@ -264,6 +287,14 @@ var RelayModernStore = /*#__PURE__*/function () {
|
|
|
264
287
|
this._globalInvalidationEpoch = this._currentWriteEpoch;
|
|
265
288
|
}
|
|
266
289
|
|
|
290
|
+
if (RelayFeatureFlags.ENABLE_RELAY_RESOLVERS) {
|
|
291
|
+
// When a record is updated, we need to also handle records that depend on it,
|
|
292
|
+
// specifically Relay Resolver result records containing results based on the
|
|
293
|
+
// updated records. This both adds to updatedRecordIDs and invalidates any
|
|
294
|
+
// cached data as needed.
|
|
295
|
+
this._resolverCache.invalidateDataIDs(this._updatedRecordIDs);
|
|
296
|
+
}
|
|
297
|
+
|
|
267
298
|
var source = this.getSource();
|
|
268
299
|
var updatedOwners = [];
|
|
269
300
|
|
|
@@ -322,9 +353,8 @@ var RelayModernStore = /*#__PURE__*/function () {
|
|
|
322
353
|
};
|
|
323
354
|
|
|
324
355
|
_proto.publish = function publish(source, idsMarkedForInvalidation) {
|
|
325
|
-
var
|
|
356
|
+
var target = this._getMutableRecordSource();
|
|
326
357
|
|
|
327
|
-
var target = (_this$_optimisticSour3 = this._optimisticSource) !== null && _this$_optimisticSour3 !== void 0 ? _this$_optimisticSour3 : this._recordSource;
|
|
328
358
|
updateTargetFromSource(target, source, // We increment the current epoch at the end of the set of updates,
|
|
329
359
|
// in notify(). Here, we pass what will be the incremented value of
|
|
330
360
|
// the epoch to use to write to invalidated records.
|
|
@@ -375,6 +405,10 @@ var RelayModernStore = /*#__PURE__*/function () {
|
|
|
375
405
|
|
|
376
406
|
_proto.toJSON = function toJSON() {
|
|
377
407
|
return 'RelayModernStore()';
|
|
408
|
+
};
|
|
409
|
+
|
|
410
|
+
_proto.getEpoch = function getEpoch() {
|
|
411
|
+
return this._currentWriteEpoch;
|
|
378
412
|
} // Internal API
|
|
379
413
|
;
|
|
380
414
|
|