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,20 +10,21 @@
10
10
  // flowlint ambiguous-object-type:error
11
11
  'use strict';
12
12
 
13
- var RelayFeatureFlags = require('../util/RelayFeatureFlags');
13
+ var deepFreeze = require('../util/deepFreeze');
14
14
 
15
- var RelayReader = require('./RelayReader');
15
+ var recycleNodesInto = require('../util/recycleNodesInto');
16
16
 
17
- var deepFreeze = require('../util/deepFreeze');
17
+ var RelayFeatureFlags = require('../util/RelayFeatureFlags');
18
18
 
19
19
  var hasOverlappingIDs = require('./hasOverlappingIDs');
20
20
 
21
- var recycleNodesInto = require('../util/recycleNodesInto');
21
+ var RelayReader = require('./RelayReader');
22
22
 
23
23
  var RelayStoreSubscriptions = /*#__PURE__*/function () {
24
- function RelayStoreSubscriptions(log) {
24
+ function RelayStoreSubscriptions(log, resolverCache) {
25
25
  this._subscriptions = new Set();
26
26
  this.__log = log;
27
+ this._resolverCache = resolverCache;
27
28
  }
28
29
 
29
30
  var _proto = RelayStoreSubscriptions.prototype;
@@ -50,6 +51,8 @@ var RelayStoreSubscriptions = /*#__PURE__*/function () {
50
51
  };
51
52
 
52
53
  _proto.snapshotSubscriptions = function snapshotSubscriptions(source) {
54
+ var _this2 = this;
55
+
53
56
  this._subscriptions.forEach(function (subscription) {
54
57
  // Backup occurs after writing a new "final" payload(s) and before (re)applying
55
58
  // optimistic changes. Each subscription's `snapshot` represents what was *last
@@ -69,7 +72,7 @@ var RelayStoreSubscriptions = /*#__PURE__*/function () {
69
72
  }
70
73
 
71
74
  var snapshot = subscription.snapshot;
72
- var backup = RelayReader.read(source, snapshot.selector);
75
+ var backup = RelayReader.read(source, snapshot.selector, _this2._resolverCache);
73
76
  var nextData = recycleNodesInto(snapshot.data, backup.data);
74
77
  backup.data = nextData; // backup owns the snapshot and can safely mutate
75
78
 
@@ -90,6 +93,7 @@ var RelayStoreSubscriptions = /*#__PURE__*/function () {
90
93
  subscription.snapshot = {
91
94
  data: subscription.snapshot.data,
92
95
  isMissingData: backup.isMissingData,
96
+ missingClientEdges: backup.missingClientEdges,
93
97
  seenRecords: backup.seenRecords,
94
98
  selector: backup.selector,
95
99
  missingRequiredFields: backup.missingRequiredFields
@@ -101,12 +105,12 @@ var RelayStoreSubscriptions = /*#__PURE__*/function () {
101
105
  };
102
106
 
103
107
  _proto.updateSubscriptions = function updateSubscriptions(source, updatedRecordIDs, updatedOwners, sourceOperation) {
104
- var _this2 = this;
108
+ var _this3 = this;
105
109
 
106
110
  var hasUpdatedRecords = updatedRecordIDs.size !== 0;
107
111
 
108
112
  this._subscriptions.forEach(function (subscription) {
109
- var owner = _this2._updateSubscription(source, subscription, updatedRecordIDs, hasUpdatedRecords, sourceOperation);
113
+ var owner = _this3._updateSubscription(source, subscription, updatedRecordIDs, hasUpdatedRecords, sourceOperation);
110
114
 
111
115
  if (owner != null) {
112
116
  updatedOwners.push(owner);
@@ -134,11 +138,12 @@ var RelayStoreSubscriptions = /*#__PURE__*/function () {
134
138
  return;
135
139
  }
136
140
 
137
- var nextSnapshot = hasOverlappingUpdates || !backup ? RelayReader.read(source, snapshot.selector) : backup;
141
+ var nextSnapshot = hasOverlappingUpdates || !backup ? RelayReader.read(source, snapshot.selector, this._resolverCache) : backup;
138
142
  var nextData = recycleNodesInto(snapshot.data, nextSnapshot.data);
139
143
  nextSnapshot = {
140
144
  data: nextData,
141
145
  isMissingData: nextSnapshot.isMissingData,
146
+ missingClientEdges: nextSnapshot.missingClientEdges,
142
147
  seenRecords: nextSnapshot.seenRecords,
143
148
  selector: nextSnapshot.selector,
144
149
  missingRequiredFields: nextSnapshot.missingRequiredFields
@@ -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.
@@ -14,14 +14,14 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
14
14
 
15
15
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
16
16
 
17
- var RelayConcreteNode = require('../util/RelayConcreteNode');
18
-
19
17
  var getRelayHandleKey = require('../util/getRelayHandleKey');
20
18
 
21
- var invariant = require('invariant');
19
+ var RelayConcreteNode = require('../util/RelayConcreteNode');
22
20
 
23
21
  var stableCopy = require('../util/stableCopy');
24
22
 
23
+ var invariant = require('invariant');
24
+
25
25
  var VARIABLE = RelayConcreteNode.VARIABLE,
26
26
  LITERAL = RelayConcreteNode.LITERAL,
27
27
  OBJECT_VALUE = RelayConcreteNode.OBJECT_VALUE,
@@ -122,8 +122,8 @@ function getStorageKey(field, variables) {
122
122
  return field.storageKey;
123
123
  }
124
124
 
125
- var args = field.args,
126
- name = field.name;
125
+ var args = typeof field.args === 'undefined' ? undefined : field.args;
126
+ var name = field.name;
127
127
  return args && args.length !== 0 ? formatStorageKey(name, getArgumentValues(args, variables)) : name;
128
128
  }
129
129
  /**
@@ -175,8 +175,7 @@ function formatStorageKey(name, argValues) {
175
175
 
176
176
 
177
177
  function getStableVariableValue(name, variables) {
178
- !variables.hasOwnProperty(name) ? process.env.NODE_ENV !== "production" ? invariant(false, 'getVariableValue(): Undefined variable `%s`.', name) : invariant(false) : void 0; // $FlowFixMe[cannot-write]
179
-
178
+ !variables.hasOwnProperty(name) ? process.env.NODE_ENV !== "production" ? invariant(false, 'getVariableValue(): Undefined variable `%s`.', name) : invariant(false) : void 0;
180
179
  return stableCopy(variables[name]);
181
180
  }
182
181
 
@@ -193,6 +192,8 @@ function getModuleOperationKey(documentName) {
193
192
 
194
193
 
195
194
  var RelayStoreUtils = {
195
+ ACTOR_IDENTIFIER_KEY: '__actorIdentifier',
196
+ CLIENT_EDGE_TRAVERSAL_PATH: '__clientEdgeTraversalPath',
196
197
  FRAGMENTS_KEY: '__fragments',
197
198
  FRAGMENT_OWNER_KEY: '__fragmentOwner',
198
199
  FRAGMENT_PROP_NAME_KEY: '__fragmentPropName',
@@ -206,6 +207,10 @@ var RelayStoreUtils = {
206
207
  TYPENAME_KEY: '__typename',
207
208
  INVALIDATED_AT_KEY: '__invalidated_at',
208
209
  IS_WITHIN_UNMATCHED_TYPE_REFINEMENT: '__isWithinUnmatchedTypeRefinement',
210
+ RELAY_RESOLVER_VALUE_KEY: '__resolverValue',
211
+ RELAY_RESOLVER_INVALIDATION_KEY: '__resolverValueMayBeInvalid',
212
+ RELAY_RESOLVER_INPUTS_KEY: '__resolverInputValues',
213
+ RELAY_RESOLVER_READER_SELECTOR_KEY: '__resolverReaderSelector',
209
214
  formatStorageKey: formatStorageKey,
210
215
  getArgumentValue: getArgumentValue,
211
216
  getArgumentValues: getArgumentValues,
@@ -0,0 +1,213 @@
1
+ /**
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ *
8
+ * @format
9
+ */
10
+ // flowlint ambiguous-object-type:error
11
+ 'use strict';
12
+
13
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
14
+
15
+ var _createForOfIteratorHelper2 = _interopRequireDefault(require("@babel/runtime/helpers/createForOfIteratorHelper"));
16
+
17
+ var recycleNodesInto = require('../util/recycleNodesInto');
18
+
19
+ var _require = require('./ClientID'),
20
+ generateClientID = _require.generateClientID;
21
+
22
+ var RelayModernRecord = require('./RelayModernRecord');
23
+
24
+ var _require2 = require('./RelayStoreUtils'),
25
+ RELAY_RESOLVER_INPUTS_KEY = _require2.RELAY_RESOLVER_INPUTS_KEY,
26
+ RELAY_RESOLVER_INVALIDATION_KEY = _require2.RELAY_RESOLVER_INVALIDATION_KEY,
27
+ RELAY_RESOLVER_READER_SELECTOR_KEY = _require2.RELAY_RESOLVER_READER_SELECTOR_KEY,
28
+ RELAY_RESOLVER_VALUE_KEY = _require2.RELAY_RESOLVER_VALUE_KEY,
29
+ getStorageKey = _require2.getStorageKey;
30
+
31
+ var warning = require("fbjs/lib/warning");
32
+
33
+ // $FlowFixMe[unclear-type] - will always be empty
34
+ var emptySet = new Set();
35
+
36
+ var NoopResolverCache = /*#__PURE__*/function () {
37
+ function NoopResolverCache() {}
38
+
39
+ var _proto = NoopResolverCache.prototype;
40
+
41
+ _proto.readFromCacheOrEvaluate = function readFromCacheOrEvaluate(record, field, variables, evaluate, getDataForResolverFragment) {
42
+ return [evaluate().resolverResult, undefined];
43
+ };
44
+
45
+ _proto.invalidateDataIDs = function invalidateDataIDs(updatedDataIDs) {};
46
+
47
+ return NoopResolverCache;
48
+ }();
49
+
50
+ function addDependencyEdge(edges, from, to) {
51
+ var set = edges.get(from);
52
+
53
+ if (!set) {
54
+ set = new Set();
55
+ edges.set(from, set);
56
+ }
57
+
58
+ set.add(to);
59
+ }
60
+
61
+ var RecordResolverCache = /*#__PURE__*/function () {
62
+ function RecordResolverCache(getRecordSource) {
63
+ this._resolverIDToRecordIDs = new Map();
64
+ this._recordIDToResolverIDs = new Map();
65
+ this._getRecordSource = getRecordSource;
66
+ }
67
+
68
+ var _proto2 = RecordResolverCache.prototype;
69
+
70
+ _proto2.readFromCacheOrEvaluate = function readFromCacheOrEvaluate(record, field, variables, evaluate, getDataForResolverFragment) {
71
+ var recordSource = this._getRecordSource();
72
+
73
+ var recordID = RelayModernRecord.getDataID(record);
74
+ var storageKey = getStorageKey(field, variables);
75
+ var linkedID = RelayModernRecord.getLinkedRecordID(record, storageKey);
76
+ var linkedRecord = linkedID == null ? null : recordSource.get(linkedID);
77
+
78
+ if (linkedRecord == null || this._isInvalid(linkedRecord, getDataForResolverFragment)) {
79
+ var _linkedID;
80
+
81
+ // Cache miss; evaluate the selector and store the result in a new record:
82
+ linkedID = (_linkedID = linkedID) !== null && _linkedID !== void 0 ? _linkedID : generateClientID(recordID, storageKey);
83
+ linkedRecord = RelayModernRecord.create(linkedID, '__RELAY_RESOLVER__');
84
+ var evaluationResult = evaluate();
85
+ RelayModernRecord.setValue(linkedRecord, RELAY_RESOLVER_VALUE_KEY, evaluationResult.resolverResult);
86
+ RelayModernRecord.setValue(linkedRecord, RELAY_RESOLVER_INPUTS_KEY, evaluationResult.fragmentValue);
87
+ RelayModernRecord.setValue(linkedRecord, RELAY_RESOLVER_READER_SELECTOR_KEY, evaluationResult.readerSelector);
88
+ recordSource.set(linkedID, linkedRecord); // Link the resolver value record to the resolver field of the record being read:
89
+
90
+ var nextRecord = RelayModernRecord.clone(record);
91
+ RelayModernRecord.setLinkedRecordID(nextRecord, storageKey, linkedID);
92
+ recordSource.set(RelayModernRecord.getDataID(nextRecord), nextRecord); // Put records observed by the resolver into the dependency graph:
93
+
94
+ var resolverID = evaluationResult.resolverID;
95
+ addDependencyEdge(this._resolverIDToRecordIDs, resolverID, linkedID);
96
+ addDependencyEdge(this._recordIDToResolverIDs, recordID, resolverID);
97
+
98
+ var _iterator = (0, _createForOfIteratorHelper2["default"])(evaluationResult.seenRecordIDs),
99
+ _step;
100
+
101
+ try {
102
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
103
+ var seenRecordID = _step.value;
104
+ addDependencyEdge(this._recordIDToResolverIDs, seenRecordID, resolverID);
105
+ }
106
+ } catch (err) {
107
+ _iterator.e(err);
108
+ } finally {
109
+ _iterator.f();
110
+ }
111
+ } // $FlowFixMe[incompatible-type] - will always be empty
112
+
113
+
114
+ var answer = linkedRecord[RELAY_RESOLVER_VALUE_KEY];
115
+ return [answer, linkedID];
116
+ };
117
+
118
+ _proto2.invalidateDataIDs = function invalidateDataIDs(updatedDataIDs) {
119
+ var recordSource = this._getRecordSource();
120
+
121
+ var visited = new Set();
122
+ var recordsToVisit = Array.from(updatedDataIDs);
123
+
124
+ while (recordsToVisit.length) {
125
+ var recordID = recordsToVisit.pop();
126
+ updatedDataIDs.add(recordID);
127
+
128
+ var _iterator2 = (0, _createForOfIteratorHelper2["default"])((_this$_recordIDToReso = this._recordIDToResolverIDs.get(recordID)) !== null && _this$_recordIDToReso !== void 0 ? _this$_recordIDToReso : emptySet),
129
+ _step2;
130
+
131
+ try {
132
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
133
+ var _this$_recordIDToReso;
134
+
135
+ var fragment = _step2.value;
136
+
137
+ if (!visited.has(fragment)) {
138
+ var _iterator3 = (0, _createForOfIteratorHelper2["default"])((_this$_resolverIDToRe = this._resolverIDToRecordIDs.get(fragment)) !== null && _this$_resolverIDToRe !== void 0 ? _this$_resolverIDToRe : emptySet),
139
+ _step3;
140
+
141
+ try {
142
+ for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
143
+ var _this$_resolverIDToRe;
144
+
145
+ var anotherRecordID = _step3.value;
146
+
147
+ this._markInvalidatedResolverRecord(anotherRecordID, recordSource, updatedDataIDs);
148
+
149
+ if (!visited.has(anotherRecordID)) {
150
+ recordsToVisit.push(anotherRecordID);
151
+ }
152
+ }
153
+ } catch (err) {
154
+ _iterator3.e(err);
155
+ } finally {
156
+ _iterator3.f();
157
+ }
158
+ }
159
+ }
160
+ } catch (err) {
161
+ _iterator2.e(err);
162
+ } finally {
163
+ _iterator2.f();
164
+ }
165
+ }
166
+ };
167
+
168
+ _proto2._markInvalidatedResolverRecord = function _markInvalidatedResolverRecord(dataID, recordSource, // Written to
169
+ updatedDataIDs) // Mutated in place
170
+ {
171
+ var record = recordSource.get(dataID);
172
+
173
+ if (!record) {
174
+ process.env.NODE_ENV !== "production" ? warning(false, 'Expected a resolver record with ID %s, but it was missing.', dataID) : void 0;
175
+ return;
176
+ }
177
+
178
+ var nextRecord = RelayModernRecord.clone(record);
179
+ RelayModernRecord.setValue(nextRecord, RELAY_RESOLVER_INVALIDATION_KEY, true);
180
+ recordSource.set(dataID, nextRecord);
181
+ };
182
+
183
+ _proto2._isInvalid = function _isInvalid(record, getDataForResolverFragment) {
184
+ if (!RelayModernRecord.getValue(record, RELAY_RESOLVER_INVALIDATION_KEY)) {
185
+ return false;
186
+ }
187
+
188
+ var originalInputs = RelayModernRecord.getValue(record, RELAY_RESOLVER_INPUTS_KEY); // $FlowFixMe[incompatible-type] - storing values in records is not typed
189
+
190
+ var readerSelector = RelayModernRecord.getValue(record, RELAY_RESOLVER_READER_SELECTOR_KEY);
191
+
192
+ if (originalInputs == null || readerSelector == null) {
193
+ process.env.NODE_ENV !== "production" ? warning(false, 'Expected previous inputs and reader selector on resolver record with ID %s, but they were missing.', RelayModernRecord.getDataID(record)) : void 0;
194
+ return true;
195
+ }
196
+
197
+ var latestValues = getDataForResolverFragment(readerSelector);
198
+ var recycled = recycleNodesInto(originalInputs, latestValues);
199
+
200
+ if (recycled !== originalInputs) {
201
+ return true;
202
+ }
203
+
204
+ return false;
205
+ };
206
+
207
+ return RecordResolverCache;
208
+ }();
209
+
210
+ module.exports = {
211
+ NoopResolverCache: NoopResolverCache,
212
+ RecordResolverCache: RecordResolverCache
213
+ };
@@ -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,14 +10,18 @@
10
10
  // flowlint ambiguous-object-type:error
11
11
  'use strict';
12
12
 
13
- var invariant = require('invariant');
14
-
15
13
  var _require = require('../query/GraphQLTag'),
16
14
  getFragment = _require.getFragment;
17
15
 
18
16
  var _require2 = require('./RelayModernSelector'),
19
17
  getSelector = _require2.getSelector;
20
18
 
19
+ var invariant = require('invariant'); // When we call the user-supplied resolver function, it will in turn call
20
+ // `readFragment`, but that's a global function -- it needs information
21
+ // about what resolver is being executed, which is supplied by putting the
22
+ // info on this stack before we call the resolver function.
23
+
24
+
21
25
  var contextStack = [];
22
26
 
23
27
  function withResolverContext(context, cb) {
@@ -38,17 +42,17 @@ function withResolverContext(context, cb) {
38
42
  // - array of nullable if the privoided ref type is an array of nullable refs
39
43
 
40
44
 
41
- function readFragment(fragmentInput, fragmentRef) {
45
+ function readFragment(fragmentInput, fragmentKey) {
42
46
  if (!contextStack.length) {
43
47
  throw new Error('readFragment should be called only from within a Relay Resolver function.');
44
48
  }
45
49
 
46
50
  var context = contextStack[contextStack.length - 1];
47
51
  var fragmentNode = getFragment(fragmentInput);
48
- var fragmentSelector = getSelector(fragmentNode, fragmentRef);
52
+ var fragmentSelector = getSelector(fragmentNode, fragmentKey);
49
53
  !(fragmentSelector != null) ? process.env.NODE_ENV !== "production" ? invariant(false, "Expected a selector for the fragment of the resolver ".concat(fragmentNode.name, ", but got null.")) : invariant(false) : void 0;
50
54
  !(fragmentSelector.kind === 'SingularReaderSelector') ? process.env.NODE_ENV !== "production" ? invariant(false, "Expected a singular reader selector for the fragment of the resolver ".concat(fragmentNode.name, ", but it was plural.")) : invariant(false) : void 0;
51
- return context.getDataForResolverFragment(fragmentSelector);
55
+ return context.getDataForResolverFragment(fragmentSelector, fragmentKey);
52
56
  }
53
57
 
54
58
  module.exports = {
@@ -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.
@@ -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,16 +10,15 @@
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
13
  var _require = require('../util/RelayConcreteNode'),
18
14
  LINKED_FIELD = _require.LINKED_FIELD;
19
15
 
20
16
  var _require2 = require('./RelayStoreUtils'),
21
17
  getHandleStorageKey = _require2.getHandleStorageKey;
22
18
 
19
+ var areEqual = require("fbjs/lib/areEqual");
20
+
21
+ var invariant = require('invariant');
23
22
  /**
24
23
  * @private
25
24
  *
@@ -27,6 +26,8 @@ var _require2 = require('./RelayStoreUtils'),
27
26
  * field (on which the handle was declared) among the sibling `selections`, and
28
27
  * copying its selections into the clone.
29
28
  */
29
+
30
+
30
31
  function cloneRelayHandleSourceField(handleField, selections, variables) {
31
32
  var sourceField = selections.find(function (source) {
32
33
  return source.kind === LINKED_FIELD && source.name === handleField.name && source.alias === handleField.alias && areEqual(source.args, handleField.args);
@@ -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,22 +10,23 @@
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
13
  var _require = require('../util/RelayConcreteNode'),
18
14
  SCALAR_FIELD = _require.SCALAR_FIELD;
19
15
 
20
16
  var _require2 = require('./RelayStoreUtils'),
21
17
  getHandleStorageKey = _require2.getHandleStorageKey;
22
18
 
19
+ var areEqual = require("fbjs/lib/areEqual");
20
+
21
+ var invariant = require('invariant');
23
22
  /**
24
23
  * @private
25
24
  *
26
25
  * Creates a clone of the supplied `handleField` by finding the original scalar
27
26
  * field (on which the handle was declared) among the sibling `selections`.
28
27
  */
28
+
29
+
29
30
  function cloneRelayScalarHandleSourceField(handleField, selections, variables) {
30
31
  var sourceField = selections.find(function (source) {
31
32
  return source.kind === SCALAR_FIELD && source.name === handleField.name && source.alias === handleField.alias && areEqual(source.args, handleField.args);
@@ -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,7 +10,9 @@
10
10
  // flowlint ambiguous-object-type:error
11
11
  'use strict';
12
12
 
13
- var invariant = require('invariant');
13
+ var invariant = require('invariant'); // Ideally, we'd just import the type of the react module, but this causes Flow
14
+ // problems.
15
+
14
16
 
15
17
  var relayContext;
16
18
  var firstReact;
@@ -26,7 +28,7 @@ function createRelayContext(react) {
26
28
  firstReact = react;
27
29
  }
28
30
 
29
- !(react === firstReact) ? process.env.NODE_ENV !== "production" ? invariant(false, '[createRelayContext]: You passing a different instance of React', react.version) : invariant(false) : void 0;
31
+ !(react === firstReact) ? process.env.NODE_ENV !== "production" ? invariant(false, '[createRelayContext]: You are passing a different instance of React', react.version) : invariant(false) : void 0;
30
32
  return relayContext;
31
33
  }
32
34
 
@@ -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.
@@ -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.
@@ -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,14 +10,18 @@
10
10
  // flowlint ambiguous-object-type:error
11
11
  'use strict';
12
12
 
13
- var invariant = require('invariant');
14
-
15
13
  var _require = require('../query/GraphQLTag'),
16
14
  getInlineDataFragment = _require.getInlineDataFragment;
17
15
 
18
16
  var _require2 = require('./RelayStoreUtils'),
19
17
  FRAGMENTS_KEY = _require2.FRAGMENTS_KEY;
20
18
 
19
+ var invariant = require('invariant');
20
+ /**
21
+ * Reads an @inline data fragment that was spread into the parent fragment.
22
+ */
23
+
24
+
21
25
  function readInlineData(fragment, fragmentRef) {
22
26
  var _fragmentRef$FRAGMENT;
23
27