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.
Files changed (100) hide show
  1. package/index.js +1 -1
  2. package/index.js.flow +16 -1
  3. package/lib/index.js +15 -0
  4. package/lib/multi-actor-environment/ActorIdentifier.js +11 -1
  5. package/lib/multi-actor-environment/ActorSpecificEnvironment.js +59 -19
  6. package/lib/multi-actor-environment/ActorUtils.js +27 -0
  7. package/lib/multi-actor-environment/MultiActorEnvironment.js +305 -55
  8. package/lib/multi-actor-environment/index.js +5 -1
  9. package/lib/mutations/RelayRecordSourceSelectorProxy.js +6 -1
  10. package/lib/mutations/commitMutation.js +4 -1
  11. package/lib/mutations/validateMutation.js +6 -1
  12. package/lib/network/RelayObservable.js +3 -1
  13. package/lib/network/RelayQueryResponseCache.js +19 -3
  14. package/lib/network/wrapNetworkWithLogObserver.js +78 -0
  15. package/lib/store/DataChecker.js +110 -40
  16. package/lib/store/OperationExecutor.js +478 -204
  17. package/lib/store/RelayConcreteVariables.js +21 -0
  18. package/lib/store/RelayModernEnvironment.js +41 -85
  19. package/lib/store/RelayModernFragmentSpecResolver.js +48 -22
  20. package/lib/store/RelayModernRecord.js +35 -1
  21. package/lib/store/RelayModernStore.js +48 -14
  22. package/lib/store/RelayOperationTracker.js +33 -23
  23. package/lib/store/RelayPublishQueue.js +23 -5
  24. package/lib/store/RelayReader.js +138 -44
  25. package/lib/store/RelayRecordSource.js +87 -3
  26. package/lib/store/RelayReferenceMarker.js +28 -15
  27. package/lib/store/RelayResponseNormalizer.js +164 -91
  28. package/lib/store/RelayStoreReactFlightUtils.js +1 -7
  29. package/lib/store/RelayStoreSubscriptions.js +8 -5
  30. package/lib/store/RelayStoreUtils.js +7 -2
  31. package/lib/store/ResolverCache.js +213 -0
  32. package/lib/store/ResolverFragments.js +1 -1
  33. package/lib/store/createRelayContext.js +1 -1
  34. package/lib/subscription/requestSubscription.js +27 -29
  35. package/lib/util/RelayConcreteNode.js +1 -0
  36. package/lib/util/RelayFeatureFlags.js +3 -5
  37. package/lib/util/RelayReplaySubject.js +21 -6
  38. package/lib/util/getPaginationMetadata.js +41 -0
  39. package/lib/util/getPaginationVariables.js +67 -0
  40. package/lib/util/getPendingOperationsForFragment.js +55 -0
  41. package/lib/util/getRefetchMetadata.js +36 -0
  42. package/lib/util/getValueAtPath.js +51 -0
  43. package/lib/util/isEmptyObject.js +1 -1
  44. package/lib/util/registerEnvironmentWithDevTools.js +26 -0
  45. package/lib/util/withDuration.js +31 -0
  46. package/multi-actor-environment/ActorIdentifier.js.flow +17 -1
  47. package/multi-actor-environment/ActorSpecificEnvironment.js.flow +72 -44
  48. package/multi-actor-environment/ActorUtils.js.flow +33 -0
  49. package/multi-actor-environment/MultiActorEnvironment.js.flow +332 -80
  50. package/multi-actor-environment/MultiActorEnvironmentTypes.js.flow +61 -12
  51. package/multi-actor-environment/index.js.flow +3 -0
  52. package/mutations/RelayRecordSourceSelectorProxy.js.flow +7 -2
  53. package/mutations/commitMutation.js.flow +2 -0
  54. package/mutations/validateMutation.js.flow +8 -0
  55. package/network/RelayObservable.js.flow +2 -0
  56. package/network/RelayQueryResponseCache.js.flow +31 -18
  57. package/network/wrapNetworkWithLogObserver.js.flow +99 -0
  58. package/package.json +1 -1
  59. package/relay-runtime.js +2 -2
  60. package/relay-runtime.min.js +2 -2
  61. package/store/ClientID.js.flow +5 -1
  62. package/store/DataChecker.js.flow +126 -35
  63. package/store/OperationExecutor.js.flow +528 -265
  64. package/store/RelayConcreteVariables.js.flow +26 -1
  65. package/store/RelayModernEnvironment.js.flow +41 -94
  66. package/store/RelayModernFragmentSpecResolver.js.flow +40 -14
  67. package/store/RelayModernOperationDescriptor.js.flow +9 -3
  68. package/store/RelayModernRecord.js.flow +49 -0
  69. package/store/RelayModernStore.js.flow +50 -12
  70. package/store/RelayOperationTracker.js.flow +56 -34
  71. package/store/RelayPublishQueue.js.flow +31 -8
  72. package/store/RelayReader.js.flow +148 -42
  73. package/store/RelayRecordSource.js.flow +72 -6
  74. package/store/RelayReferenceMarker.js.flow +29 -12
  75. package/store/RelayResponseNormalizer.js.flow +164 -48
  76. package/store/RelayStoreReactFlightUtils.js.flow +1 -7
  77. package/store/RelayStoreSubscriptions.js.flow +10 -3
  78. package/store/RelayStoreTypes.js.flow +128 -12
  79. package/store/RelayStoreUtils.js.flow +17 -3
  80. package/store/ResolverCache.js.flow +247 -0
  81. package/store/ResolverFragments.js.flow +6 -3
  82. package/store/createRelayContext.js.flow +1 -1
  83. package/subscription/requestSubscription.js.flow +41 -29
  84. package/util/NormalizationNode.js.flow +10 -3
  85. package/util/ReaderNode.js.flow +15 -1
  86. package/util/RelayConcreteNode.js.flow +1 -0
  87. package/util/RelayFeatureFlags.js.flow +8 -10
  88. package/util/RelayReplaySubject.js.flow +7 -6
  89. package/util/getPaginationMetadata.js.flow +74 -0
  90. package/util/getPaginationVariables.js.flow +112 -0
  91. package/util/getPendingOperationsForFragment.js.flow +62 -0
  92. package/util/getRefetchMetadata.js.flow +80 -0
  93. package/util/getValueAtPath.js.flow +46 -0
  94. package/util/isEmptyObject.js.flow +1 -0
  95. package/util/registerEnvironmentWithDevTools.js.flow +33 -0
  96. package/util/withDuration.js.flow +32 -0
  97. package/lib/store/RelayRecordSourceMapImpl.js +0 -107
  98. package/lib/store/RelayStoreSubscriptionsUsingMapByID.js +0 -318
  99. package/store/RelayRecordSourceMapImpl.js.flow +0 -91
  100. 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.__wrapNetworkWithLogObserver(config.network);
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.__wrapNetworkWithLogObserver(newNet);
82
+ return _this._network = wrapNetworkWithLogObserver(_this, newNet);
77
83
  };
78
84
 
79
85
  if (process.env.NODE_ENV !== "production") {
80
- var _require = require('./StoreInspector'),
81
- inspect = _require.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
- target: target,
246
- handlers: handlers
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 comitted to the publish queue.
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
- publishQueue: _this9._publishQueue,
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
- store: _this9._store,
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('../query/fetchQueryInternal'),
32
- getPromiseForActiveRequest = _require.getPromiseForActiveRequest;
35
+ var _require = require('./RelayModernOperationDescriptor'),
36
+ createRequestDescriptor = _require.createRequestDescriptor;
33
37
 
34
- var _require2 = require('./RelayModernOperationDescriptor'),
35
- createRequestDescriptor = _require2.createRequestDescriptor;
36
-
37
- var _require3 = require('./RelayModernSelector'),
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
- this._subscription = environment.subscribe(_snapshot, this._onChange);
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 (RelayFeatureFlags.ENABLE_RELAY_CONTAINERS_SUSPENSE === true && this._isMissingData === true) {
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 promise = (_getPromiseForActiveR = getPromiseForActiveRequest(this._environment, this._selector.owner)) !== null && _getPromiseForActiveR !== void 0 ? _getPromiseForActiveR : this._environment.getOperationTracker().getPromiseForPendingOperationsAffectingOwner(this._selector.owner);
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('./RelayStoreUtils'),
48
- ROOT_ID = _require.ROOT_ID,
49
- ROOT_TYPE = _require.ROOT_TYPE;
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._storeSubscriptions = RelayFeatureFlags.ENABLE_STORE_SUBSCRIPTIONS_REFACTOR === true ? new RelayStoreSubscriptionsUsingMapByID(options === null || options === void 0 ? void 0 : options.log) : new RelayStoreSubscriptions(options === null || options === void 0 ? void 0 : options.log);
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 _this$_optimisticSour2, _options$target, _options$handlers;
140
+ var _options$handlers, _options$getSourceFor, _options$getTargetFor, _options$defaultActor;
127
141
 
128
142
  var selector = operation.root;
129
- var source = (_this$_optimisticSour2 = this._optimisticSource) !== null && _this$_optimisticSour2 !== void 0 ? _this$_optimisticSour2 : this._recordSource;
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 occured.
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 operationAvailability = DataChecker.check(source, target, selector, handlers, this._operationLoader, this._getDataID, this._shouldProcessClientComponents);
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 _this$_optimisticSour3;
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