relay-runtime 11.0.2 → 13.0.0-rc.2

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 (219) hide show
  1. package/README.md +67 -0
  2. package/handlers/RelayDefaultHandlerProvider.js.flow +3 -3
  3. package/handlers/connection/ConnectionHandler.js.flow +9 -18
  4. package/handlers/connection/ConnectionInterface.js.flow +1 -1
  5. package/handlers/connection/MutationHandlers.js.flow +8 -12
  6. package/index.js +1 -1
  7. package/index.js.flow +57 -35
  8. package/lib/handlers/RelayDefaultHandlerProvider.js +1 -1
  9. package/lib/handlers/connection/ConnectionHandler.js +13 -19
  10. package/lib/handlers/connection/ConnectionInterface.js +1 -1
  11. package/lib/handlers/connection/MutationHandlers.js +4 -7
  12. package/lib/index.js +59 -44
  13. package/lib/multi-actor-environment/ActorIdentifier.js +12 -2
  14. package/lib/multi-actor-environment/ActorSpecificEnvironment.js +64 -20
  15. package/lib/multi-actor-environment/ActorUtils.js +27 -0
  16. package/lib/multi-actor-environment/MultiActorEnvironment.js +324 -61
  17. package/lib/multi-actor-environment/MultiActorEnvironmentTypes.js +1 -1
  18. package/lib/multi-actor-environment/index.js +6 -2
  19. package/lib/mutations/RelayDeclarativeMutationConfig.js +5 -2
  20. package/lib/mutations/RelayRecordProxy.js +4 -3
  21. package/lib/mutations/RelayRecordSourceMutator.js +4 -3
  22. package/lib/mutations/RelayRecordSourceProxy.js +13 -5
  23. package/lib/mutations/RelayRecordSourceSelectorProxy.js +19 -6
  24. package/lib/mutations/applyOptimisticMutation.js +7 -7
  25. package/lib/mutations/commitLocalUpdate.js +1 -1
  26. package/lib/mutations/commitMutation.js +15 -11
  27. package/lib/mutations/readUpdatableQuery_EXPERIMENTAL.js +242 -0
  28. package/lib/mutations/validateMutation.js +11 -6
  29. package/lib/network/ConvertToExecuteFunction.js +3 -2
  30. package/lib/network/RelayNetwork.js +4 -3
  31. package/lib/network/RelayNetworkTypes.js +1 -1
  32. package/lib/network/RelayObservable.js +1 -1
  33. package/lib/network/RelayQueryResponseCache.js +22 -6
  34. package/lib/network/wrapNetworkWithLogObserver.js +79 -0
  35. package/lib/query/GraphQLTag.js +3 -2
  36. package/lib/query/PreloadableQueryRegistry.js +1 -1
  37. package/lib/query/fetchQuery.js +7 -6
  38. package/lib/query/fetchQueryInternal.js +1 -1
  39. package/lib/query/fetchQuery_DEPRECATED.js +3 -2
  40. package/lib/store/ClientID.js +8 -2
  41. package/lib/store/DataChecker.js +124 -55
  42. package/lib/store/OperationExecutor.js +489 -215
  43. package/lib/store/RelayConcreteVariables.js +27 -9
  44. package/lib/store/RelayExperimentalGraphResponseHandler.js +153 -0
  45. package/lib/store/RelayExperimentalGraphResponseTransform.js +391 -0
  46. package/lib/store/RelayModernEnvironment.js +100 -120
  47. package/lib/store/RelayModernFragmentSpecResolver.js +53 -27
  48. package/lib/store/RelayModernOperationDescriptor.js +3 -2
  49. package/lib/store/RelayModernRecord.js +48 -13
  50. package/lib/store/RelayModernSelector.js +15 -9
  51. package/lib/store/RelayModernStore.js +56 -23
  52. package/lib/store/RelayOperationTracker.js +34 -24
  53. package/lib/store/RelayOptimisticRecordSource.js +1 -1
  54. package/lib/store/RelayPublishQueue.js +35 -11
  55. package/lib/store/RelayReader.js +257 -72
  56. package/lib/store/RelayRecordSource.js +88 -4
  57. package/lib/store/RelayRecordState.js +1 -1
  58. package/lib/store/RelayReferenceMarker.js +34 -22
  59. package/lib/store/RelayResponseNormalizer.js +172 -96
  60. package/lib/store/RelayStoreReactFlightUtils.js +5 -11
  61. package/lib/store/RelayStoreSubscriptions.js +15 -10
  62. package/lib/store/RelayStoreTypes.js +1 -1
  63. package/lib/store/RelayStoreUtils.js +13 -8
  64. package/lib/store/ResolverCache.js +213 -0
  65. package/lib/store/ResolverFragments.js +10 -6
  66. package/lib/store/StoreInspector.js +1 -1
  67. package/lib/store/TypeID.js +1 -1
  68. package/lib/store/ViewerPattern.js +1 -1
  69. package/lib/store/cloneRelayHandleSourceField.js +6 -5
  70. package/lib/store/cloneRelayScalarHandleSourceField.js +6 -5
  71. package/lib/store/createFragmentSpecResolver.js +1 -1
  72. package/lib/store/createRelayContext.js +5 -3
  73. package/lib/store/defaultGetDataID.js +1 -1
  74. package/lib/store/defaultRequiredFieldLogger.js +1 -1
  75. package/lib/store/hasOverlappingIDs.js +1 -1
  76. package/lib/store/isRelayModernEnvironment.js +1 -1
  77. package/lib/store/normalizeRelayPayload.js +1 -1
  78. package/lib/store/readInlineData.js +7 -3
  79. package/lib/subscription/requestSubscription.js +32 -34
  80. package/lib/util/JSResourceTypes.flow.js +1 -1
  81. package/lib/util/NormalizationNode.js +1 -1
  82. package/lib/util/ReaderNode.js +1 -1
  83. package/lib/util/RelayConcreteNode.js +3 -1
  84. package/lib/util/RelayDefaultHandleKey.js +1 -1
  85. package/lib/util/RelayError.js +1 -1
  86. package/lib/util/RelayFeatureFlags.js +10 -7
  87. package/lib/util/RelayProfiler.js +1 -1
  88. package/lib/util/RelayReplaySubject.js +22 -7
  89. package/lib/util/RelayRuntimeTypes.js +1 -7
  90. package/lib/util/StringInterner.js +71 -0
  91. package/lib/util/createPayloadFor3DField.js +1 -1
  92. package/lib/util/deepFreeze.js +1 -1
  93. package/lib/util/generateID.js +1 -1
  94. package/lib/util/getAllRootVariables.js +29 -0
  95. package/lib/util/getFragmentIdentifier.js +16 -8
  96. package/lib/util/getOperation.js +3 -2
  97. package/lib/util/getPaginationMetadata.js +41 -0
  98. package/lib/util/getPaginationVariables.js +66 -0
  99. package/lib/util/getPendingOperationsForFragment.js +55 -0
  100. package/lib/util/getRefetchMetadata.js +36 -0
  101. package/lib/util/getRelayHandleKey.js +3 -3
  102. package/lib/util/getRequestIdentifier.js +3 -3
  103. package/lib/util/getValueAtPath.js +51 -0
  104. package/lib/util/isEmptyObject.js +2 -2
  105. package/lib/util/isPromise.js +1 -1
  106. package/lib/util/isScalarAndEqual.js +1 -1
  107. package/lib/util/recycleNodesInto.js +1 -1
  108. package/lib/util/registerEnvironmentWithDevTools.js +26 -0
  109. package/lib/util/reportMissingRequiredFields.js +1 -1
  110. package/lib/util/resolveImmediate.js +1 -1
  111. package/lib/util/stableCopy.js +1 -1
  112. package/lib/util/withDuration.js +31 -0
  113. package/multi-actor-environment/ActorIdentifier.js.flow +18 -2
  114. package/multi-actor-environment/ActorSpecificEnvironment.js.flow +94 -58
  115. package/multi-actor-environment/ActorUtils.js.flow +33 -0
  116. package/multi-actor-environment/MultiActorEnvironment.js.flow +366 -93
  117. package/multi-actor-environment/MultiActorEnvironmentTypes.js.flow +88 -23
  118. package/multi-actor-environment/index.js.flow +3 -1
  119. package/mutations/RelayDeclarativeMutationConfig.js.flow +33 -27
  120. package/mutations/RelayRecordProxy.js.flow +5 -6
  121. package/mutations/RelayRecordSourceMutator.js.flow +5 -7
  122. package/mutations/RelayRecordSourceProxy.js.flow +20 -11
  123. package/mutations/RelayRecordSourceSelectorProxy.js.flow +23 -8
  124. package/mutations/applyOptimisticMutation.js.flow +14 -15
  125. package/mutations/commitLocalUpdate.js.flow +2 -2
  126. package/mutations/commitMutation.js.flow +36 -47
  127. package/mutations/readUpdatableQuery_EXPERIMENTAL.js.flow +318 -0
  128. package/mutations/validateMutation.js.flow +27 -17
  129. package/network/ConvertToExecuteFunction.js.flow +3 -3
  130. package/network/RelayNetwork.js.flow +5 -6
  131. package/network/RelayNetworkTypes.js.flow +1 -1
  132. package/network/RelayObservable.js.flow +2 -2
  133. package/network/RelayQueryResponseCache.js.flow +35 -22
  134. package/network/wrapNetworkWithLogObserver.js.flow +99 -0
  135. package/package.json +2 -2
  136. package/query/GraphQLTag.js.flow +11 -11
  137. package/query/PreloadableQueryRegistry.js.flow +5 -3
  138. package/query/fetchQuery.js.flow +19 -19
  139. package/query/fetchQueryInternal.js.flow +7 -10
  140. package/query/fetchQuery_DEPRECATED.js.flow +7 -7
  141. package/relay-runtime.js +2 -2
  142. package/relay-runtime.min.js +2 -2
  143. package/store/ClientID.js.flow +15 -4
  144. package/store/DataChecker.js.flow +142 -60
  145. package/store/OperationExecutor.js.flow +575 -320
  146. package/store/RelayConcreteVariables.js.flow +28 -9
  147. package/store/RelayExperimentalGraphResponseHandler.js.flow +121 -0
  148. package/store/RelayExperimentalGraphResponseTransform.js.flow +470 -0
  149. package/store/RelayModernEnvironment.js.flow +91 -115
  150. package/store/RelayModernFragmentSpecResolver.js.flow +56 -32
  151. package/store/RelayModernOperationDescriptor.js.flow +13 -8
  152. package/store/RelayModernRecord.js.flow +68 -12
  153. package/store/RelayModernSelector.js.flow +25 -15
  154. package/store/RelayModernStore.js.flow +67 -32
  155. package/store/RelayOperationTracker.js.flow +60 -44
  156. package/store/RelayOptimisticRecordSource.js.flow +3 -3
  157. package/store/RelayPublishQueue.js.flow +74 -32
  158. package/store/RelayReader.js.flow +319 -100
  159. package/store/RelayRecordSource.js.flow +73 -7
  160. package/store/RelayRecordState.js.flow +1 -1
  161. package/store/RelayReferenceMarker.js.flow +41 -27
  162. package/store/RelayResponseNormalizer.js.flow +204 -86
  163. package/store/RelayStoreReactFlightUtils.js.flow +5 -12
  164. package/store/RelayStoreSubscriptions.js.flow +20 -12
  165. package/store/RelayStoreTypes.js.flow +200 -41
  166. package/store/RelayStoreUtils.js.flow +25 -12
  167. package/store/ResolverCache.js.flow +249 -0
  168. package/store/ResolverFragments.js.flow +16 -20
  169. package/store/StoreInspector.js.flow +3 -3
  170. package/store/TypeID.js.flow +2 -2
  171. package/store/ViewerPattern.js.flow +3 -3
  172. package/store/cloneRelayHandleSourceField.js.flow +6 -7
  173. package/store/cloneRelayScalarHandleSourceField.js.flow +6 -7
  174. package/store/createFragmentSpecResolver.js.flow +4 -5
  175. package/store/createRelayContext.js.flow +4 -4
  176. package/store/defaultGetDataID.js.flow +1 -1
  177. package/store/defaultRequiredFieldLogger.js.flow +1 -1
  178. package/store/hasOverlappingIDs.js.flow +1 -1
  179. package/store/isRelayModernEnvironment.js.flow +1 -1
  180. package/store/normalizeRelayPayload.js.flow +7 -8
  181. package/store/readInlineData.js.flow +8 -9
  182. package/subscription/requestSubscription.js.flow +55 -51
  183. package/util/JSResourceTypes.flow.js.flow +1 -1
  184. package/util/NormalizationNode.js.flow +11 -4
  185. package/util/ReaderNode.js.flow +25 -2
  186. package/util/RelayConcreteNode.js.flow +5 -1
  187. package/util/RelayDefaultHandleKey.js.flow +1 -1
  188. package/util/RelayError.js.flow +1 -1
  189. package/util/RelayFeatureFlags.js.flow +23 -15
  190. package/util/RelayProfiler.js.flow +1 -1
  191. package/util/RelayReplaySubject.js.flow +10 -10
  192. package/util/RelayRuntimeTypes.js.flow +70 -3
  193. package/util/StringInterner.js.flow +69 -0
  194. package/util/createPayloadFor3DField.js.flow +4 -4
  195. package/util/deepFreeze.js.flow +1 -1
  196. package/util/generateID.js.flow +1 -1
  197. package/util/getAllRootVariables.js.flow +36 -0
  198. package/util/getFragmentIdentifier.js.flow +28 -16
  199. package/util/getOperation.js.flow +3 -3
  200. package/util/getPaginationMetadata.js.flow +69 -0
  201. package/util/getPaginationVariables.js.flow +108 -0
  202. package/util/getPendingOperationsForFragment.js.flow +62 -0
  203. package/util/getRefetchMetadata.js.flow +76 -0
  204. package/util/getRelayHandleKey.js.flow +2 -3
  205. package/util/getRequestIdentifier.js.flow +4 -4
  206. package/util/getValueAtPath.js.flow +46 -0
  207. package/util/isEmptyObject.js.flow +2 -1
  208. package/util/isPromise.js.flow +1 -1
  209. package/util/isScalarAndEqual.js.flow +1 -1
  210. package/util/recycleNodesInto.js.flow +1 -1
  211. package/util/registerEnvironmentWithDevTools.js.flow +33 -0
  212. package/util/reportMissingRequiredFields.js.flow +1 -1
  213. package/util/resolveImmediate.js.flow +2 -2
  214. package/util/stableCopy.js.flow +1 -1
  215. package/util/withDuration.js.flow +32 -0
  216. package/lib/store/RelayRecordSourceMapImpl.js +0 -107
  217. package/lib/store/RelayStoreSubscriptionsUsingMapByID.js +0 -318
  218. package/store/RelayRecordSourceMapImpl.js.flow +0 -91
  219. package/store/RelayStoreSubscriptionsUsingMapByID.js.flow +0 -283
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Copyright (c) Facebook, Inc. and its affiliates.
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
3
  *
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
@@ -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('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
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Copyright (c) Facebook, Inc. and its affiliates.
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
3
  *
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
@@ -16,10 +16,20 @@ 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');
@@ -32,22 +42,17 @@ var RelayStoreReactFlightUtils = require('./RelayStoreReactFlightUtils');
32
42
 
33
43
  var RelayStoreSubscriptions = require('./RelayStoreSubscriptions');
34
44
 
35
- var RelayStoreSubscriptionsUsingMapByID = require('./RelayStoreSubscriptionsUsingMapByID');
36
-
37
45
  var RelayStoreUtils = require('./RelayStoreUtils');
38
46
 
39
- var deepFreeze = require('../util/deepFreeze');
47
+ var _require2 = require('./RelayStoreUtils'),
48
+ ROOT_ID = _require2.ROOT_ID,
49
+ ROOT_TYPE = _require2.ROOT_TYPE;
40
50
 
41
- var defaultGetDataID = require('./defaultGetDataID');
51
+ var _require3 = require('./ResolverCache'),
52
+ RecordResolverCache = _require3.RecordResolverCache;
42
53
 
43
54
  var invariant = require('invariant');
44
55
 
45
- var resolveImmediate = require('../util/resolveImmediate');
46
-
47
- var _require = require('./RelayStoreUtils'),
48
- ROOT_ID = _require.ROOT_ID,
49
- ROOT_TYPE = _require.ROOT_TYPE;
50
-
51
56
  var DEFAULT_RELEASE_BUFFER_SIZE = 10;
52
57
  /**
53
58
  * @public
@@ -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
 
@@ -646,8 +680,7 @@ function updateTargetFromSource(target, source, currentWriteEpoch, idsMarkedForI
646
680
  }
647
681
 
648
682
  RelayModernRecord.setValue(nextRecord, RelayStoreUtils.INVALIDATED_AT_KEY, currentWriteEpoch);
649
- invalidatedRecordIDs.add(dataID); // $FlowFixMe[incompatible-call]
650
-
683
+ invalidatedRecordIDs.add(dataID);
651
684
  target.set(dataID, nextRecord);
652
685
  });
653
686
  } // Update the target based on the changes present in source
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Copyright (c) Facebook, Inc. and its affiliates.
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
3
  *
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
@@ -18,9 +18,9 @@ var invariant = require('invariant');
18
18
 
19
19
  var RelayOperationTracker = /*#__PURE__*/function () {
20
20
  function RelayOperationTracker() {
21
- this._ownersToPendingOperationsIdentifier = new Map();
22
- this._pendingOperationsToOwnersIdentifier = new Map();
23
- this._ownersIdentifierToPromise = new Map();
21
+ this._ownersToPendingOperations = new Map();
22
+ this._pendingOperationsToOwners = new Map();
23
+ this._ownersToPendingPromise = new Map();
24
24
  }
25
25
  /**
26
26
  * Update the map of current processing operations with the set of
@@ -46,19 +46,19 @@ var RelayOperationTracker = /*#__PURE__*/function () {
46
46
  var owner = _step.value;
47
47
  var ownerIdentifier = owner.identifier;
48
48
 
49
- var pendingOperationsAffectingOwner = this._ownersToPendingOperationsIdentifier.get(ownerIdentifier);
49
+ var pendingOperationsAffectingOwner = this._ownersToPendingOperations.get(ownerIdentifier);
50
50
 
51
51
  if (pendingOperationsAffectingOwner != null) {
52
52
  // In this case the `ownerIdentifier` already affected by some operations
53
53
  // We just need to detect, is it the same operation that we already
54
54
  // have in the list, or it's a new operation
55
55
  if (!pendingOperationsAffectingOwner.has(pendingOperationIdentifier)) {
56
- pendingOperationsAffectingOwner.add(pendingOperationIdentifier);
56
+ pendingOperationsAffectingOwner.set(pendingOperationIdentifier, pendingOperation);
57
57
  newlyAffectedOwnersIdentifier.add(ownerIdentifier);
58
58
  }
59
59
  } else {
60
60
  // This is a new `ownerIdentifier` that is affected by the operation
61
- this._ownersToPendingOperationsIdentifier.set(ownerIdentifier, new Set([pendingOperationIdentifier]));
61
+ this._ownersToPendingOperations.set(ownerIdentifier, new Map([[pendingOperationIdentifier, pendingOperation]]));
62
62
 
63
63
  newlyAffectedOwnersIdentifier.add(ownerIdentifier);
64
64
  }
@@ -73,10 +73,10 @@ var RelayOperationTracker = /*#__PURE__*/function () {
73
73
  if (newlyAffectedOwnersIdentifier.size === 0) {
74
74
  return;
75
75
  } // But, if some owners were affected we need to add them to
76
- // the `_pendingOperationsToOwnersIdentifier` set
76
+ // the `_pendingOperationsToOwners` set
77
77
 
78
78
 
79
- var ownersAffectedByOperationIdentifier = this._pendingOperationsToOwnersIdentifier.get(pendingOperationIdentifier) || new Set();
79
+ var ownersAffectedByPendingOperation = this._pendingOperationsToOwners.get(pendingOperationIdentifier) || new Set();
80
80
 
81
81
  var _iterator2 = (0, _createForOfIteratorHelper2["default"])(newlyAffectedOwnersIdentifier),
82
82
  _step2;
@@ -87,7 +87,7 @@ var RelayOperationTracker = /*#__PURE__*/function () {
87
87
 
88
88
  this._resolveOwnerResolvers(_ownerIdentifier);
89
89
 
90
- ownersAffectedByOperationIdentifier.add(_ownerIdentifier);
90
+ ownersAffectedByPendingOperation.add(_ownerIdentifier);
91
91
  }
92
92
  } catch (err) {
93
93
  _iterator2.e(err);
@@ -95,7 +95,7 @@ var RelayOperationTracker = /*#__PURE__*/function () {
95
95
  _iterator2.f();
96
96
  }
97
97
 
98
- this._pendingOperationsToOwnersIdentifier.set(pendingOperationIdentifier, ownersAffectedByOperationIdentifier);
98
+ this._pendingOperationsToOwners.set(pendingOperationIdentifier, ownersAffectedByPendingOperation);
99
99
  }
100
100
  /**
101
101
  * Once pending operation is completed we need to remove it
@@ -106,7 +106,7 @@ var RelayOperationTracker = /*#__PURE__*/function () {
106
106
  _proto.complete = function complete(pendingOperation) {
107
107
  var pendingOperationIdentifier = pendingOperation.identifier;
108
108
 
109
- var affectedOwnersIdentifier = this._pendingOperationsToOwnersIdentifier.get(pendingOperationIdentifier);
109
+ var affectedOwnersIdentifier = this._pendingOperationsToOwners.get(pendingOperationIdentifier);
110
110
 
111
111
  if (affectedOwnersIdentifier == null) {
112
112
  return;
@@ -125,7 +125,7 @@ var RelayOperationTracker = /*#__PURE__*/function () {
125
125
  for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
126
126
  var ownerIdentifier = _step3.value;
127
127
 
128
- var pendingOperationsAffectingOwner = this._ownersToPendingOperationsIdentifier.get(ownerIdentifier);
128
+ var pendingOperationsAffectingOwner = this._ownersToPendingOperations.get(ownerIdentifier);
129
129
 
130
130
  if (!pendingOperationsAffectingOwner) {
131
131
  continue;
@@ -155,7 +155,7 @@ var RelayOperationTracker = /*#__PURE__*/function () {
155
155
 
156
156
  this._resolveOwnerResolvers(_ownerIdentifier2);
157
157
 
158
- this._ownersToPendingOperationsIdentifier["delete"](_ownerIdentifier2);
158
+ this._ownersToPendingOperations["delete"](_ownerIdentifier2);
159
159
  } // Update all ownerIdentifier that were updated by `pendingOperationIdentifier` but still
160
160
  // are affected by other operations
161
161
 
@@ -181,30 +181,35 @@ var RelayOperationTracker = /*#__PURE__*/function () {
181
181
  _iterator5.f();
182
182
  }
183
183
 
184
- this._pendingOperationsToOwnersIdentifier["delete"](pendingOperationIdentifier);
184
+ this._pendingOperationsToOwners["delete"](pendingOperationIdentifier);
185
185
  };
186
186
 
187
187
  _proto._resolveOwnerResolvers = function _resolveOwnerResolvers(ownerIdentifier) {
188
- var promiseEntry = this._ownersIdentifierToPromise.get(ownerIdentifier);
188
+ var promiseEntry = this._ownersToPendingPromise.get(ownerIdentifier);
189
189
 
190
190
  if (promiseEntry != null) {
191
191
  promiseEntry.resolve();
192
192
  }
193
193
 
194
- this._ownersIdentifierToPromise["delete"](ownerIdentifier);
194
+ this._ownersToPendingPromise["delete"](ownerIdentifier);
195
195
  };
196
196
 
197
- _proto.getPromiseForPendingOperationsAffectingOwner = function getPromiseForPendingOperationsAffectingOwner(owner) {
197
+ _proto.getPendingOperationsAffectingOwner = function getPendingOperationsAffectingOwner(owner) {
198
198
  var ownerIdentifier = owner.identifier;
199
199
 
200
- if (!this._ownersToPendingOperationsIdentifier.has(ownerIdentifier)) {
200
+ var pendingOperationsForOwner = this._ownersToPendingOperations.get(ownerIdentifier);
201
+
202
+ if (pendingOperationsForOwner == null || pendingOperationsForOwner.size === 0) {
201
203
  return null;
202
204
  }
203
205
 
204
- var cachedPromiseEntry = this._ownersIdentifierToPromise.get(ownerIdentifier);
206
+ var cachedPromiseEntry = this._ownersToPendingPromise.get(ownerIdentifier);
205
207
 
206
208
  if (cachedPromiseEntry != null) {
207
- return cachedPromiseEntry.promise;
209
+ return {
210
+ promise: cachedPromiseEntry.promise,
211
+ pendingOperations: cachedPromiseEntry.pendingOperations
212
+ };
208
213
  }
209
214
 
210
215
  var resolve;
@@ -212,13 +217,18 @@ var RelayOperationTracker = /*#__PURE__*/function () {
212
217
  resolve = r;
213
218
  });
214
219
  !(resolve != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayOperationTracker: Expected resolver to be defined. If you' + 'are seeing this, it is likely a bug in Relay.') : invariant(false) : void 0;
220
+ var pendingOperations = Array.from(pendingOperationsForOwner.values());
215
221
 
216
- this._ownersIdentifierToPromise.set(ownerIdentifier, {
222
+ this._ownersToPendingPromise.set(ownerIdentifier, {
217
223
  promise: promise,
218
- resolve: resolve
224
+ resolve: resolve,
225
+ pendingOperations: pendingOperations
219
226
  });
220
227
 
221
- return promise;
228
+ return {
229
+ promise: promise,
230
+ pendingOperations: pendingOperations
231
+ };
222
232
  };
223
233
 
224
234
  return RelayOperationTracker;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Copyright (c) Facebook, Inc. and its affiliates.
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
3
  *
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Copyright (c) Facebook, Inc. and its affiliates.
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
3
  *
4
4
  * This source code is licensed under the MIT license found in the
5
5
  * LICENSE file in the root directory of this source tree.
@@ -10,11 +10,7 @@
10
10
  // flowlint ambiguous-object-type:error
11
11
  'use strict';
12
12
 
13
- var _global$ErrorUtils$ap, _global$ErrorUtils;
14
-
15
- var RelayReader = require('./RelayReader');
16
-
17
- var RelayRecordSource = require('./RelayRecordSource');
13
+ var _global$ErrorUtils$ap, _global, _global$ErrorUtils;
18
14
 
19
15
  var RelayRecordSourceMutator = require('../mutations/RelayRecordSourceMutator');
20
16
 
@@ -22,11 +18,15 @@ var RelayRecordSourceProxy = require('../mutations/RelayRecordSourceProxy');
22
18
 
23
19
  var RelayRecordSourceSelectorProxy = require('../mutations/RelayRecordSourceSelectorProxy');
24
20
 
21
+ var RelayReader = require('./RelayReader');
22
+
23
+ var RelayRecordSource = require('./RelayRecordSource');
24
+
25
25
  var invariant = require('invariant');
26
26
 
27
27
  var warning = require("fbjs/lib/warning");
28
28
 
29
- var applyWithGuard = (_global$ErrorUtils$ap = (_global$ErrorUtils = global.ErrorUtils) === null || _global$ErrorUtils === void 0 ? void 0 : _global$ErrorUtils.applyWithGuard) !== null && _global$ErrorUtils$ap !== void 0 ? _global$ErrorUtils$ap : function (callback, context, args, onError, name) {
29
+ var applyWithGuard = (_global$ErrorUtils$ap = (_global = global) === null || _global === void 0 ? void 0 : (_global$ErrorUtils = _global.ErrorUtils) === null || _global$ErrorUtils === void 0 ? void 0 : _global$ErrorUtils.applyWithGuard) !== null && _global$ErrorUtils$ap !== void 0 ? _global$ErrorUtils$ap : function (callback, context, args, onError, name) {
30
30
  return callback.apply(context, args);
31
31
  };
32
32
  /**
@@ -45,9 +45,15 @@ var RelayPublishQueue = /*#__PURE__*/function () {
45
45
  // True if the next `run()` should apply the backup and rerun all optimistic
46
46
  // updates performing a rebase.
47
47
  // Payloads to apply or Sources to publish to the store with the next `run()`.
48
+ // $FlowFixMe[unclear-type] See explanation below.
48
49
  // Optimistic updaters to add with the next `run()`.
50
+ // $FlowFixMe[unclear-type] See explanation below.
49
51
  // Optimistic updaters that are already added and might be rerun in order to
50
52
  // rebase them.
53
+ // $FlowFixMe[unclear-type] See explanation below.
54
+ // For _pendingOptimisticUpdates, _appliedOptimisticUpdates, and _pendingData,
55
+ // we want to parametrize by "any" since the type is effectively
56
+ // "the union of all T's that PublishQueue's methods were called with".
51
57
  // Garbage collection hold, should rerun gc on dispose
52
58
  function RelayPublishQueue(store, handlerProvider, getDataID) {
53
59
  this._hasStoreSnapshot = false;
@@ -149,11 +155,25 @@ var RelayPublishQueue = /*#__PURE__*/function () {
149
155
  ;
150
156
 
151
157
  _proto.run = function run(sourceOperation) {
158
+ var runWillClearGcHold = this._appliedOptimisticUpdates === 0 && !!this._gcHold;
159
+ var runIsANoop = // this._pendingBackupRebase is true if an applied optimistic
160
+ // update has potentially been reverted or if this._pendingData is not empty.
161
+ !this._pendingBackupRebase && this._pendingOptimisticUpdates.size === 0 && !runWillClearGcHold;
162
+
152
163
  if (process.env.NODE_ENV !== "production") {
164
+ process.env.NODE_ENV !== "production" ? warning(!runIsANoop, 'RelayPublishQueue.run was called, but the call would have been a noop.') : void 0;
153
165
  process.env.NODE_ENV !== "production" ? warning(this._isRunning !== true, 'A store update was detected within another store update. Please ' + "make sure new store updates aren't being executed within an " + 'updater function for a different update.') : void 0;
154
166
  this._isRunning = true;
155
167
  }
156
168
 
169
+ if (runIsANoop) {
170
+ if (process.env.NODE_ENV !== "production") {
171
+ this._isRunning = false;
172
+ }
173
+
174
+ return [];
175
+ }
176
+
157
177
  if (this._pendingBackupRebase) {
158
178
  if (this._hasStoreSnapshot) {
159
179
  this._store.restore();
@@ -287,7 +307,7 @@ var RelayPublishQueue = /*#__PURE__*/function () {
287
307
 
288
308
  var sink = RelayRecordSource.create();
289
309
  var mutator = new RelayRecordSourceMutator(this._store.getSource(), sink);
290
- var recordSourceProxy = new RelayRecordSourceProxy(mutator, this._getDataID, this._handlerProvider);
310
+ var recordSourceProxy = new RelayRecordSourceProxy(mutator, this._getDataID, this._handlerProvider); // $FlowFixMe[unclear-type] see explanation above.
291
311
 
292
312
  var processUpdate = function processUpdate(optimisticUpdate) {
293
313
  if (optimisticUpdate.storeUpdater) {
@@ -299,15 +319,19 @@ var RelayPublishQueue = /*#__PURE__*/function () {
299
319
  updater = optimisticUpdate.updater;
300
320
  var source = payload.source,
301
321
  fieldPayloads = payload.fieldPayloads;
302
- var recordSourceSelectorProxy = new RelayRecordSourceSelectorProxy(mutator, recordSourceProxy, operation.fragment);
303
- var selectorData;
304
322
 
305
323
  if (source) {
306
324
  recordSourceProxy.publishSource(source, fieldPayloads);
307
- selectorData = lookupSelector(source, operation.fragment);
308
325
  }
309
326
 
310
327
  if (updater) {
328
+ var selectorData;
329
+
330
+ if (source) {
331
+ selectorData = lookupSelector(source, operation.fragment);
332
+ }
333
+
334
+ var recordSourceSelectorProxy = new RelayRecordSourceSelectorProxy(mutator, recordSourceProxy, operation.fragment);
311
335
  applyWithGuard(updater, null, [recordSourceSelectorProxy, selectorData], null, 'RelayPublishQueue:applyUpdates');
312
336
  }
313
337
  }