relay-runtime 11.0.1 → 13.0.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (169) hide show
  1. package/handlers/RelayDefaultHandlerProvider.js.flow +2 -2
  2. package/handlers/connection/ConnectionHandler.js.flow +8 -17
  3. package/handlers/connection/MutationHandlers.js.flow +7 -11
  4. package/index.js +1 -1
  5. package/index.js.flow +60 -36
  6. package/lib/handlers/RelayDefaultHandlerProvider.js +1 -1
  7. package/lib/handlers/connection/ConnectionHandler.js +13 -19
  8. package/lib/handlers/connection/MutationHandlers.js +4 -7
  9. package/lib/index.js +58 -43
  10. package/lib/multi-actor-environment/ActorIdentifier.js +33 -0
  11. package/lib/multi-actor-environment/ActorSpecificEnvironment.js +152 -0
  12. package/lib/multi-actor-environment/ActorUtils.js +27 -0
  13. package/lib/multi-actor-environment/MultiActorEnvironment.js +419 -0
  14. package/lib/multi-actor-environment/MultiActorEnvironmentTypes.js +11 -0
  15. package/lib/multi-actor-environment/index.js +21 -0
  16. package/lib/mutations/RelayDeclarativeMutationConfig.js +4 -1
  17. package/lib/mutations/RelayRecordProxy.js +3 -2
  18. package/lib/mutations/RelayRecordSourceMutator.js +3 -2
  19. package/lib/mutations/RelayRecordSourceProxy.js +12 -4
  20. package/lib/mutations/RelayRecordSourceSelectorProxy.js +18 -5
  21. package/lib/mutations/applyOptimisticMutation.js +6 -6
  22. package/lib/mutations/commitMutation.js +14 -10
  23. package/lib/mutations/readUpdatableQuery_EXPERIMENTAL.js +238 -0
  24. package/lib/mutations/validateMutation.js +10 -5
  25. package/lib/network/ConvertToExecuteFunction.js +2 -1
  26. package/lib/network/RelayNetwork.js +3 -2
  27. package/lib/network/RelayQueryResponseCache.js +21 -5
  28. package/lib/network/wrapNetworkWithLogObserver.js +79 -0
  29. package/lib/query/GraphQLTag.js +3 -2
  30. package/lib/query/fetchQuery.js +6 -5
  31. package/lib/query/fetchQueryInternal.js +1 -1
  32. package/lib/query/fetchQuery_DEPRECATED.js +2 -1
  33. package/lib/store/ClientID.js +7 -1
  34. package/lib/store/DataChecker.js +123 -54
  35. package/lib/store/{RelayModernQueryExecutor.js → OperationExecutor.js} +518 -200
  36. package/lib/store/RelayConcreteVariables.js +26 -8
  37. package/lib/store/RelayExperimentalGraphResponseHandler.js +153 -0
  38. package/lib/store/RelayExperimentalGraphResponseTransform.js +391 -0
  39. package/lib/store/RelayModernEnvironment.js +175 -240
  40. package/lib/store/RelayModernFragmentSpecResolver.js +52 -26
  41. package/lib/store/RelayModernOperationDescriptor.js +2 -1
  42. package/lib/store/RelayModernRecord.js +47 -12
  43. package/lib/store/RelayModernSelector.js +14 -8
  44. package/lib/store/RelayModernStore.js +56 -28
  45. package/lib/store/RelayOperationTracker.js +34 -24
  46. package/lib/store/RelayPublishQueue.js +41 -13
  47. package/lib/store/RelayReader.js +288 -48
  48. package/lib/store/RelayRecordSource.js +87 -3
  49. package/lib/store/RelayReferenceMarker.js +34 -22
  50. package/lib/store/RelayResponseNormalizer.js +211 -110
  51. package/lib/store/RelayStoreReactFlightUtils.js +4 -10
  52. package/lib/store/RelayStoreSubscriptions.js +14 -9
  53. package/lib/store/RelayStoreUtils.js +12 -7
  54. package/lib/store/ResolverCache.js +213 -0
  55. package/lib/store/ResolverFragments.js +61 -0
  56. package/lib/store/cloneRelayHandleSourceField.js +5 -4
  57. package/lib/store/cloneRelayScalarHandleSourceField.js +5 -4
  58. package/lib/store/createRelayContext.js +4 -2
  59. package/lib/store/readInlineData.js +6 -2
  60. package/lib/subscription/requestSubscription.js +34 -25
  61. package/lib/util/RelayConcreteNode.js +3 -0
  62. package/lib/util/RelayFeatureFlags.js +10 -4
  63. package/lib/util/RelayProfiler.js +17 -187
  64. package/lib/util/RelayReplaySubject.js +22 -7
  65. package/lib/util/RelayRuntimeTypes.js +0 -6
  66. package/lib/util/StringInterner.js +71 -0
  67. package/lib/util/getFragmentIdentifier.js +15 -7
  68. package/lib/util/getOperation.js +2 -1
  69. package/lib/util/getPaginationMetadata.js +41 -0
  70. package/lib/util/getPaginationVariables.js +66 -0
  71. package/lib/util/getPendingOperationsForFragment.js +55 -0
  72. package/lib/util/getRefetchMetadata.js +36 -0
  73. package/lib/util/getRelayHandleKey.js +2 -2
  74. package/lib/util/getRequestIdentifier.js +2 -2
  75. package/lib/util/getValueAtPath.js +51 -0
  76. package/lib/util/isEmptyObject.js +1 -1
  77. package/lib/util/registerEnvironmentWithDevTools.js +26 -0
  78. package/lib/util/withDuration.js +31 -0
  79. package/multi-actor-environment/ActorIdentifier.js.flow +43 -0
  80. package/multi-actor-environment/ActorSpecificEnvironment.js.flow +225 -0
  81. package/multi-actor-environment/ActorUtils.js.flow +33 -0
  82. package/multi-actor-environment/MultiActorEnvironment.js.flow +506 -0
  83. package/multi-actor-environment/MultiActorEnvironmentTypes.js.flow +261 -0
  84. package/multi-actor-environment/index.js.flow +26 -0
  85. package/mutations/RelayDeclarativeMutationConfig.js.flow +32 -26
  86. package/mutations/RelayRecordProxy.js.flow +4 -5
  87. package/mutations/RelayRecordSourceMutator.js.flow +4 -6
  88. package/mutations/RelayRecordSourceProxy.js.flow +19 -10
  89. package/mutations/RelayRecordSourceSelectorProxy.js.flow +22 -7
  90. package/mutations/applyOptimisticMutation.js.flow +13 -14
  91. package/mutations/commitLocalUpdate.js.flow +1 -1
  92. package/mutations/commitMutation.js.flow +35 -46
  93. package/mutations/readUpdatableQuery_EXPERIMENTAL.js.flow +309 -0
  94. package/mutations/validateMutation.js.flow +26 -16
  95. package/network/ConvertToExecuteFunction.js.flow +2 -2
  96. package/network/RelayNetwork.js.flow +4 -5
  97. package/network/RelayNetworkTypes.js.flow +5 -4
  98. package/network/RelayObservable.js.flow +1 -1
  99. package/network/RelayQueryResponseCache.js.flow +34 -21
  100. package/network/wrapNetworkWithLogObserver.js.flow +100 -0
  101. package/package.json +3 -2
  102. package/query/GraphQLTag.js.flow +9 -9
  103. package/query/PreloadableQueryRegistry.js.flow +2 -1
  104. package/query/fetchQuery.js.flow +11 -13
  105. package/query/fetchQueryInternal.js.flow +6 -9
  106. package/query/fetchQuery_DEPRECATED.js.flow +6 -6
  107. package/relay-runtime.js +2 -2
  108. package/relay-runtime.min.js +2 -2
  109. package/store/ClientID.js.flow +14 -3
  110. package/store/DataChecker.js.flow +141 -59
  111. package/store/{RelayModernQueryExecutor.js.flow → OperationExecutor.js.flow} +605 -303
  112. package/store/RelayConcreteVariables.js.flow +27 -8
  113. package/store/RelayExperimentalGraphResponseHandler.js.flow +124 -0
  114. package/store/RelayExperimentalGraphResponseTransform.js.flow +475 -0
  115. package/store/RelayModernEnvironment.js.flow +173 -240
  116. package/store/RelayModernFragmentSpecResolver.js.flow +55 -31
  117. package/store/RelayModernOperationDescriptor.js.flow +12 -7
  118. package/store/RelayModernRecord.js.flow +67 -11
  119. package/store/RelayModernSelector.js.flow +24 -14
  120. package/store/RelayModernStore.js.flow +66 -36
  121. package/store/RelayOperationTracker.js.flow +59 -43
  122. package/store/RelayOptimisticRecordSource.js.flow +2 -2
  123. package/store/RelayPublishQueue.js.flow +79 -34
  124. package/store/RelayReader.js.flow +351 -73
  125. package/store/RelayRecordSource.js.flow +72 -6
  126. package/store/RelayReferenceMarker.js.flow +40 -26
  127. package/store/RelayResponseNormalizer.js.flow +258 -99
  128. package/store/RelayStoreReactFlightUtils.js.flow +4 -11
  129. package/store/RelayStoreSubscriptions.js.flow +19 -11
  130. package/store/RelayStoreTypes.js.flow +209 -43
  131. package/store/RelayStoreUtils.js.flow +24 -11
  132. package/store/ResolverCache.js.flow +249 -0
  133. package/store/ResolverFragments.js.flow +121 -0
  134. package/store/StoreInspector.js.flow +2 -2
  135. package/store/TypeID.js.flow +1 -1
  136. package/store/ViewerPattern.js.flow +2 -2
  137. package/store/cloneRelayHandleSourceField.js.flow +5 -6
  138. package/store/cloneRelayScalarHandleSourceField.js.flow +5 -6
  139. package/store/createFragmentSpecResolver.js.flow +3 -4
  140. package/store/createRelayContext.js.flow +3 -3
  141. package/store/normalizeRelayPayload.js.flow +6 -7
  142. package/store/readInlineData.js.flow +7 -8
  143. package/subscription/requestSubscription.js.flow +53 -41
  144. package/util/NormalizationNode.js.flow +10 -3
  145. package/util/ReaderNode.js.flow +38 -2
  146. package/util/RelayConcreteNode.js.flow +5 -0
  147. package/util/RelayFeatureFlags.js.flow +24 -10
  148. package/util/RelayProfiler.js.flow +22 -194
  149. package/util/RelayReplaySubject.js.flow +9 -9
  150. package/util/RelayRuntimeTypes.js.flow +72 -3
  151. package/util/StringInterner.js.flow +69 -0
  152. package/util/createPayloadFor3DField.js.flow +3 -3
  153. package/util/getFragmentIdentifier.js.flow +27 -15
  154. package/util/getOperation.js.flow +2 -2
  155. package/util/getPaginationMetadata.js.flow +72 -0
  156. package/util/getPaginationVariables.js.flow +108 -0
  157. package/util/getPendingOperationsForFragment.js.flow +62 -0
  158. package/util/getRefetchMetadata.js.flow +79 -0
  159. package/util/getRelayHandleKey.js.flow +1 -2
  160. package/util/getRequestIdentifier.js.flow +3 -3
  161. package/util/getValueAtPath.js.flow +46 -0
  162. package/util/isEmptyObject.js.flow +1 -0
  163. package/util/registerEnvironmentWithDevTools.js.flow +33 -0
  164. package/util/resolveImmediate.js.flow +1 -1
  165. package/util/withDuration.js.flow +32 -0
  166. package/lib/store/RelayRecordSourceMapImpl.js +0 -107
  167. package/lib/store/RelayStoreSubscriptionsUsingMapByID.js +0 -318
  168. package/store/RelayRecordSourceMapImpl.js.flow +0 -91
  169. package/store/RelayStoreSubscriptionsUsingMapByID.js.flow +0 -283
@@ -16,28 +16,29 @@ var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/obje
16
16
 
17
17
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
18
18
 
19
- var RelayFeatureFlags = require('../util/RelayFeatureFlags');
19
+ var getPendingOperationsForFragment = require('../util/getPendingOperationsForFragment');
20
20
 
21
- var areEqual = require("fbjs/lib/areEqual");
21
+ var isScalarAndEqual = require('../util/isScalarAndEqual');
22
22
 
23
- var invariant = require("fbjs/lib/invariant");
23
+ var recycleNodesInto = require('../util/recycleNodesInto');
24
24
 
25
- var isScalarAndEqual = require('../util/isScalarAndEqual');
25
+ var RelayFeatureFlags = require('../util/RelayFeatureFlags');
26
26
 
27
27
  var reportMissingRequiredFields = require('../util/reportMissingRequiredFields');
28
28
 
29
- var warning = require("fbjs/lib/warning");
29
+ var _require = require('./RelayModernOperationDescriptor'),
30
+ createRequestDescriptor = _require.createRequestDescriptor;
30
31
 
31
- var _require = require('../query/fetchQueryInternal'),
32
- getPromiseForActiveRequest = _require.getPromiseForActiveRequest;
32
+ var _require2 = require('./RelayModernSelector'),
33
+ areEqualSelectors = _require2.areEqualSelectors,
34
+ createReaderSelector = _require2.createReaderSelector,
35
+ getSelectorsFromObject = _require2.getSelectorsFromObject;
33
36
 
34
- var _require2 = require('./RelayModernOperationDescriptor'),
35
- createRequestDescriptor = _require2.createRequestDescriptor;
37
+ var areEqual = require("fbjs/lib/areEqual");
36
38
 
37
- var _require3 = require('./RelayModernSelector'),
38
- areEqualSelectors = _require3.areEqualSelectors,
39
- createReaderSelector = _require3.createReaderSelector,
40
- getSelectorsFromObject = _require3.getSelectorsFromObject;
39
+ var invariant = require('invariant');
40
+
41
+ var warning = require("fbjs/lib/warning");
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
 
@@ -23,13 +23,14 @@ var _require2 = require('./RelayModernSelector'),
23
23
 
24
24
  var _require3 = require('./RelayStoreUtils'),
25
25
  ROOT_ID = _require3.ROOT_ID;
26
-
27
26
  /**
28
27
  * Creates an instance of the `OperationDescriptor` type defined in
29
28
  * `RelayStoreTypes` given an operation and some variables. The input variables
30
29
  * are filtered to exclude variables that do not match defined arguments on the
31
30
  * operation, and default values are populated for null values.
32
31
  */
32
+
33
+
33
34
  function createOperationDescriptor(request, variables, cacheConfig) {
34
35
  var dataID = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : ROOT_ID;
35
36
  var operation = request.operation;
@@ -14,25 +14,25 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
14
14
 
15
15
  var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
16
16
 
17
- var areEqual = require("fbjs/lib/areEqual");
18
-
19
17
  var deepFreeze = require('../util/deepFreeze');
20
18
 
21
- var invariant = require("fbjs/lib/invariant");
22
-
23
- var warning = require("fbjs/lib/warning");
24
-
25
19
  var _require = require('./ClientID'),
26
20
  isClientID = _require.isClientID;
27
21
 
28
22
  var _require2 = require('./RelayStoreUtils'),
23
+ ACTOR_IDENTIFIER_KEY = _require2.ACTOR_IDENTIFIER_KEY,
29
24
  ID_KEY = _require2.ID_KEY,
25
+ INVALIDATED_AT_KEY = _require2.INVALIDATED_AT_KEY,
30
26
  REF_KEY = _require2.REF_KEY,
31
27
  REFS_KEY = _require2.REFS_KEY,
32
- TYPENAME_KEY = _require2.TYPENAME_KEY,
33
- INVALIDATED_AT_KEY = _require2.INVALIDATED_AT_KEY,
34
- ROOT_ID = _require2.ROOT_ID;
28
+ ROOT_ID = _require2.ROOT_ID,
29
+ TYPENAME_KEY = _require2.TYPENAME_KEY;
30
+
31
+ var areEqual = require("fbjs/lib/areEqual");
32
+
33
+ var invariant = require('invariant');
35
34
 
35
+ var warning = require("fbjs/lib/warning");
36
36
  /**
37
37
  * @public
38
38
  *
@@ -82,6 +82,8 @@ var _require2 = require('./RelayStoreUtils'),
82
82
  *
83
83
  * Clone a record.
84
84
  */
85
+
86
+
85
87
  function clone(record) {
86
88
  return (0, _objectSpread2["default"])({}, record);
87
89
  }
@@ -171,7 +173,7 @@ function getLinkedRecordID(record, storageKey) {
171
173
  return link;
172
174
  }
173
175
 
174
- !(typeof link === 'object' && link && typeof link[REF_KEY] === 'string') ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayModernRecord.getLinkedRecordID(): Expected `%s.%s` to be a linked ID, ' + 'was `%s`.', record[ID_KEY], storageKey, JSON.stringify(link)) : invariant(false) : void 0;
176
+ !(typeof link === 'object' && link && typeof link[REF_KEY] === 'string') ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayModernRecord.getLinkedRecordID(): Expected `%s.%s` to be a linked ID, ' + 'was `%s`.%s', record[ID_KEY], storageKey, JSON.stringify(link), typeof link === 'object' && link[REFS_KEY] !== undefined ? ' It appears to be a plural linked record: did you mean to call ' + 'getLinkedRecords() instead of getLinkedRecord()?' : '') : invariant(false) : void 0;
175
177
  return link[REF_KEY];
176
178
  }
177
179
  /**
@@ -189,7 +191,7 @@ function getLinkedRecordIDs(record, storageKey) {
189
191
  return links;
190
192
  }
191
193
 
192
- !(typeof links === 'object' && Array.isArray(links[REFS_KEY])) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayModernRecord.getLinkedRecordIDs(): Expected `%s.%s` to contain an array ' + 'of linked IDs, got `%s`.', record[ID_KEY], storageKey, JSON.stringify(links)) : invariant(false) : void 0; // assume items of the array are ids
194
+ !(typeof links === 'object' && Array.isArray(links[REFS_KEY])) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayModernRecord.getLinkedRecordIDs(): Expected `%s.%s` to contain an array ' + 'of linked IDs, got `%s`.%s', record[ID_KEY], storageKey, JSON.stringify(links), typeof links === 'object' && links[REF_KEY] !== undefined ? ' It appears to be a singular linked record: did you mean to call ' + 'getLinkedRecord() instead of getLinkedRecords()?' : '') : invariant(false) : void 0; // assume items of the array are ids
193
195
 
194
196
  return links[REFS_KEY];
195
197
  }
@@ -336,6 +338,37 @@ function setLinkedRecordIDs(record, storageKey, linkedIDs) {
336
338
  links[REFS_KEY] = linkedIDs;
337
339
  record[storageKey] = links;
338
340
  }
341
+ /**
342
+ * @public
343
+ *
344
+ * Set the value of a field to a reference to another record in the actor specific store.
345
+ */
346
+
347
+
348
+ function setActorLinkedRecordID(record, storageKey, actorIdentifier, linkedID) {
349
+ // See perf note above for why we aren't using computed property access.
350
+ var link = {};
351
+ link[REF_KEY] = linkedID;
352
+ link[ACTOR_IDENTIFIER_KEY] = actorIdentifier;
353
+ record[storageKey] = link;
354
+ }
355
+ /**
356
+ * @public
357
+ *
358
+ * Get link to a record and the actor identifier for the store.
359
+ */
360
+
361
+
362
+ function getActorLinkedRecordID(record, storageKey) {
363
+ var link = record[storageKey];
364
+
365
+ if (link == null) {
366
+ return link;
367
+ }
368
+
369
+ !(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;
370
+ return [link[ACTOR_IDENTIFIER_KEY], link[REF_KEY]];
371
+ }
339
372
 
340
373
  module.exports = {
341
374
  clone: clone,
@@ -352,5 +385,7 @@ module.exports = {
352
385
  setValue: setValue,
353
386
  setLinkedRecordID: setLinkedRecordID,
354
387
  setLinkedRecordIDs: setLinkedRecordIDs,
355
- update: update
388
+ update: update,
389
+ getActorLinkedRecordID: getActorLinkedRecordID,
390
+ setActorLinkedRecordID: setActorLinkedRecordID
356
391
  };
@@ -10,21 +10,21 @@
10
10
  // flowlint ambiguous-object-type:error
11
11
  'use strict';
12
12
 
13
- var areEqual = require("fbjs/lib/areEqual");
14
-
15
- var invariant = require("fbjs/lib/invariant");
16
-
17
- var warning = require("fbjs/lib/warning");
18
-
19
13
  var _require = require('./RelayConcreteVariables'),
20
14
  getFragmentVariables = _require.getFragmentVariables;
21
15
 
22
16
  var _require2 = require('./RelayStoreUtils'),
17
+ CLIENT_EDGE_TRAVERSAL_PATH = _require2.CLIENT_EDGE_TRAVERSAL_PATH,
23
18
  FRAGMENT_OWNER_KEY = _require2.FRAGMENT_OWNER_KEY,
24
19
  FRAGMENTS_KEY = _require2.FRAGMENTS_KEY,
25
20
  ID_KEY = _require2.ID_KEY,
26
21
  IS_WITHIN_UNMATCHED_TYPE_REFINEMENT = _require2.IS_WITHIN_UNMATCHED_TYPE_REFINEMENT;
27
22
 
23
+ var areEqual = require("fbjs/lib/areEqual");
24
+
25
+ var invariant = require('invariant');
26
+
27
+ var warning = require("fbjs/lib/warning");
28
28
  /**
29
29
  * @public
30
30
  *
@@ -54,18 +54,22 @@ var _require2 = require('./RelayStoreUtils'),
54
54
  * const childData = environment.lookup(childSelector).data;
55
55
  * ```
56
56
  */
57
+
58
+
57
59
  function getSingularSelector(fragment, item) {
58
60
  !(typeof item === 'object' && item !== null && !Array.isArray(item)) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayModernSelector: Expected value for fragment `%s` to be an object, got ' + '`%s`.', fragment.name, JSON.stringify(item)) : invariant(false) : void 0;
59
61
  var dataID = item[ID_KEY];
60
62
  var fragments = item[FRAGMENTS_KEY];
61
63
  var mixedOwner = item[FRAGMENT_OWNER_KEY];
62
64
  var isWithinUnmatchedTypeRefinement = item[IS_WITHIN_UNMATCHED_TYPE_REFINEMENT] === true;
65
+ var mixedClientEdgeTraversalPath = item[CLIENT_EDGE_TRAVERSAL_PATH];
63
66
 
64
- if (typeof dataID === 'string' && typeof fragments === 'object' && fragments !== null && typeof fragments[fragment.name] === 'object' && fragments[fragment.name] !== null && typeof mixedOwner === 'object' && mixedOwner !== null) {
67
+ if (typeof dataID === 'string' && typeof fragments === 'object' && fragments !== null && typeof fragments[fragment.name] === 'object' && fragments[fragment.name] !== null && typeof mixedOwner === 'object' && mixedOwner !== null && (mixedClientEdgeTraversalPath == null || Array.isArray(mixedClientEdgeTraversalPath))) {
65
68
  var owner = mixedOwner;
69
+ var clientEdgeTraversalPath = mixedClientEdgeTraversalPath;
66
70
  var argumentVariables = fragments[fragment.name];
67
71
  var fragmentVariables = getFragmentVariables(fragment, owner.variables, argumentVariables);
68
- return createReaderSelector(fragment, dataID, fragmentVariables, owner, isWithinUnmatchedTypeRefinement);
72
+ return createReaderSelector(fragment, dataID, fragmentVariables, owner, isWithinUnmatchedTypeRefinement, clientEdgeTraversalPath);
69
73
  }
70
74
 
71
75
  if (process.env.NODE_ENV !== "production") {
@@ -295,10 +299,12 @@ function areEqualSelectors(thisSelector, thatSelector) {
295
299
 
296
300
  function createReaderSelector(fragment, dataID, variables, request) {
297
301
  var isWithinUnmatchedTypeRefinement = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
302
+ var clientEdgeTraversalPath = arguments.length > 5 ? arguments[5] : undefined;
298
303
  return {
299
304
  kind: 'SingularReaderSelector',
300
305
  dataID: dataID,
301
306
  isWithinUnmatchedTypeRefinement: isWithinUnmatchedTypeRefinement,
307
+ clientEdgeTraversalPath: clientEdgeTraversalPath !== null && clientEdgeTraversalPath !== void 0 ? clientEdgeTraversalPath : null,
302
308
  node: fragment,
303
309
  variables: variables,
304
310
  owner: request
@@ -16,16 +16,24 @@ var _createForOfIteratorHelper2 = _interopRequireDefault(require("@babel/runtime
16
16
 
17
17
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
18
18
 
19
- var DataChecker = require('./DataChecker');
19
+ var _require = require('../multi-actor-environment/ActorIdentifier'),
20
+ INTERNAL_ACTOR_IDENTIFIER_DO_NOT_USE = _require.INTERNAL_ACTOR_IDENTIFIER_DO_NOT_USE,
21
+ assertInternalActorIndentifier = _require.assertInternalActorIndentifier;
22
+
23
+ var deepFreeze = require('../util/deepFreeze');
20
24
 
21
25
  var RelayFeatureFlags = require('../util/RelayFeatureFlags');
22
26
 
27
+ var resolveImmediate = require('../util/resolveImmediate');
28
+
29
+ var DataChecker = require('./DataChecker');
30
+
31
+ var defaultGetDataID = require('./defaultGetDataID');
32
+
23
33
  var RelayModernRecord = require('./RelayModernRecord');
24
34
 
25
35
  var RelayOptimisticRecordSource = require('./RelayOptimisticRecordSource');
26
36
 
27
- var RelayProfiler = require('../util/RelayProfiler');
28
-
29
37
  var RelayReader = require('./RelayReader');
30
38
 
31
39
  var RelayReferenceMarker = require('./RelayReferenceMarker');
@@ -34,21 +42,16 @@ var RelayStoreReactFlightUtils = require('./RelayStoreReactFlightUtils');
34
42
 
35
43
  var RelayStoreSubscriptions = require('./RelayStoreSubscriptions');
36
44
 
37
- var RelayStoreSubscriptionsUsingMapByID = require('./RelayStoreSubscriptionsUsingMapByID');
38
-
39
45
  var RelayStoreUtils = require('./RelayStoreUtils');
40
46
 
41
- var deepFreeze = require('../util/deepFreeze');
47
+ var _require2 = require('./RelayStoreUtils'),
48
+ ROOT_ID = _require2.ROOT_ID,
49
+ ROOT_TYPE = _require2.ROOT_TYPE;
42
50
 
43
- var defaultGetDataID = require('./defaultGetDataID');
44
-
45
- var invariant = require("fbjs/lib/invariant");
51
+ var _require3 = require('./ResolverCache'),
52
+ RecordResolverCache = _require3.RecordResolverCache;
46
53
 
47
- var resolveImmediate = require('../util/resolveImmediate');
48
-
49
- var _require = require('./RelayStoreUtils'),
50
- ROOT_ID = _require.ROOT_ID,
51
- ROOT_TYPE = _require.ROOT_TYPE;
54
+ var invariant = require('invariant');
52
55
 
53
56
  var DEFAULT_RELEASE_BUFFER_SIZE = 10;
54
57
  /**
@@ -110,7 +113,10 @@ var RelayModernStore = /*#__PURE__*/function () {
110
113
  this._releaseBuffer = [];
111
114
  this._roots = new Map();
112
115
  this._shouldScheduleGC = false;
113
- 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);
114
120
  this._updatedRecordIDs = new Set();
115
121
  this._shouldProcessClientComponents = options === null || options === void 0 ? void 0 : options.shouldProcessClientComponents;
116
122
  initializeRecordSource(this._recordSource);
@@ -124,11 +130,19 @@ var RelayModernStore = /*#__PURE__*/function () {
124
130
  return (_this$_optimisticSour = this._optimisticSource) !== null && _this$_optimisticSour !== void 0 ? _this$_optimisticSour : this._recordSource;
125
131
  };
126
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
+
127
139
  _proto.check = function check(operation, options) {
128
- var _this$_optimisticSour2, _options$target, _options$handlers;
140
+ var _options$handlers, _options$getSourceFor, _options$getTargetFor, _options$defaultActor;
129
141
 
130
142
  var selector = operation.root;
131
- var source = (_this$_optimisticSour2 = this._optimisticSource) !== null && _this$_optimisticSour2 !== void 0 ? _this$_optimisticSour2 : this._recordSource;
143
+
144
+ var source = this._getMutableRecordSource();
145
+
132
146
  var globalInvalidationEpoch = this._globalInvalidationEpoch;
133
147
 
134
148
  var rootEntry = this._roots.get(operation.request.identifier);
@@ -137,7 +151,7 @@ var RelayModernStore = /*#__PURE__*/function () {
137
151
 
138
152
  if (globalInvalidationEpoch != null) {
139
153
  // If so, check if the operation we're checking was last written
140
- // before or after invalidation occured.
154
+ // before or after invalidation occurred.
141
155
  if (operationLastWrittenAt == null || operationLastWrittenAt <= globalInvalidationEpoch) {
142
156
  // If the operation was written /before/ global invalidation occurred,
143
157
  // or if this operation has never been written to the store before,
@@ -149,9 +163,16 @@ var RelayModernStore = /*#__PURE__*/function () {
149
163
  }
150
164
  }
151
165
 
152
- var target = (_options$target = options === null || options === void 0 ? void 0 : options.target) !== null && _options$target !== void 0 ? _options$target : source;
153
166
  var handlers = (_options$handlers = options === null || options === void 0 ? void 0 : options.handlers) !== null && _options$handlers !== void 0 ? _options$handlers : [];
154
- 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);
155
176
  return getAvailabilityStatus(operationAvailability, operationLastWrittenAt, rootEntry === null || rootEntry === void 0 ? void 0 : rootEntry.fetchTime, this._queryCacheExpirationTime);
156
177
  };
157
178
 
@@ -236,7 +257,7 @@ var RelayModernStore = /*#__PURE__*/function () {
236
257
 
237
258
  _proto.lookup = function lookup(selector) {
238
259
  var source = this.getSource();
239
- var snapshot = RelayReader.read(source, selector);
260
+ var snapshot = RelayReader.read(source, selector, this._resolverCache);
240
261
 
241
262
  if (process.env.NODE_ENV !== "production") {
242
263
  deepFreeze(snapshot);
@@ -266,6 +287,14 @@ var RelayModernStore = /*#__PURE__*/function () {
266
287
  this._globalInvalidationEpoch = this._currentWriteEpoch;
267
288
  }
268
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
+
269
298
  var source = this.getSource();
270
299
  var updatedOwners = [];
271
300
 
@@ -324,9 +353,8 @@ var RelayModernStore = /*#__PURE__*/function () {
324
353
  };
325
354
 
326
355
  _proto.publish = function publish(source, idsMarkedForInvalidation) {
327
- var _this$_optimisticSour3;
356
+ var target = this._getMutableRecordSource();
328
357
 
329
- var target = (_this$_optimisticSour3 = this._optimisticSource) !== null && _this$_optimisticSour3 !== void 0 ? _this$_optimisticSour3 : this._recordSource;
330
358
  updateTargetFromSource(target, source, // We increment the current epoch at the end of the set of updates,
331
359
  // in notify(). Here, we pass what will be the incremented value of
332
360
  // the epoch to use to write to invalidated records.
@@ -377,6 +405,10 @@ var RelayModernStore = /*#__PURE__*/function () {
377
405
 
378
406
  _proto.toJSON = function toJSON() {
379
407
  return 'RelayModernStore()';
408
+ };
409
+
410
+ _proto.getEpoch = function getEpoch() {
411
+ return this._currentWriteEpoch;
380
412
  } // Internal API
381
413
  ;
382
414
 
@@ -648,8 +680,7 @@ function updateTargetFromSource(target, source, currentWriteEpoch, idsMarkedForI
648
680
  }
649
681
 
650
682
  RelayModernRecord.setValue(nextRecord, RelayStoreUtils.INVALIDATED_AT_KEY, currentWriteEpoch);
651
- invalidatedRecordIDs.add(dataID); // $FlowFixMe[incompatible-call]
652
-
683
+ invalidatedRecordIDs.add(dataID);
653
684
  target.set(dataID, nextRecord);
654
685
  });
655
686
  } // Update the target based on the changes present in source
@@ -747,7 +778,4 @@ function getAvailabilityStatus(operationAvailability, operationLastWrittenAt, op
747
778
  };
748
779
  }
749
780
 
750
- RelayProfiler.instrumentMethods(RelayModernStore.prototype, {
751
- lookup: 'RelayModernStore.prototype.lookup'
752
- });
753
781
  module.exports = RelayModernStore;