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.
@@ -14,13 +14,11 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
14
14
 
15
15
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
16
16
 
17
- var RelayFeatureFlags = require('../util/RelayFeatureFlags');
18
-
19
- var RelayModernRecord = require('./RelayModernRecord');
20
-
21
- var invariant = require('invariant');
17
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
22
18
 
23
19
  var _require = require('../util/RelayConcreteNode'),
20
+ ACTOR_CHANGE = _require.ACTOR_CHANGE,
21
+ CLIENT_EDGE = _require.CLIENT_EDGE,
24
22
  CLIENT_EXTENSION = _require.CLIENT_EXTENSION,
25
23
  CONDITION = _require.CONDITION,
26
24
  DEFER = _require.DEFER,
@@ -30,34 +28,46 @@ var _require = require('../util/RelayConcreteNode'),
30
28
  INLINE_FRAGMENT = _require.INLINE_FRAGMENT,
31
29
  LINKED_FIELD = _require.LINKED_FIELD,
32
30
  MODULE_IMPORT = _require.MODULE_IMPORT,
33
- REQUIRED_FIELD = _require.REQUIRED_FIELD,
34
31
  RELAY_RESOLVER = _require.RELAY_RESOLVER,
32
+ REQUIRED_FIELD = _require.REQUIRED_FIELD,
35
33
  SCALAR_FIELD = _require.SCALAR_FIELD,
36
34
  STREAM = _require.STREAM;
37
35
 
36
+ var RelayFeatureFlags = require('../util/RelayFeatureFlags');
37
+
38
+ var ClientID = require('./ClientID');
39
+
40
+ var RelayModernRecord = require('./RelayModernRecord');
41
+
38
42
  var _require2 = require('./RelayStoreReactFlightUtils'),
39
43
  getReactFlightClientResponse = _require2.getReactFlightClientResponse;
40
44
 
41
45
  var _require3 = require('./RelayStoreUtils'),
42
- FRAGMENTS_KEY = _require3.FRAGMENTS_KEY,
46
+ CLIENT_EDGE_TRAVERSAL_PATH = _require3.CLIENT_EDGE_TRAVERSAL_PATH,
43
47
  FRAGMENT_OWNER_KEY = _require3.FRAGMENT_OWNER_KEY,
44
48
  FRAGMENT_PROP_NAME_KEY = _require3.FRAGMENT_PROP_NAME_KEY,
49
+ FRAGMENTS_KEY = _require3.FRAGMENTS_KEY,
45
50
  ID_KEY = _require3.ID_KEY,
46
51
  IS_WITHIN_UNMATCHED_TYPE_REFINEMENT = _require3.IS_WITHIN_UNMATCHED_TYPE_REFINEMENT,
47
52
  MODULE_COMPONENT_KEY = _require3.MODULE_COMPONENT_KEY,
48
53
  ROOT_ID = _require3.ROOT_ID,
49
54
  getArgumentValues = _require3.getArgumentValues,
50
- getStorageKey = _require3.getStorageKey,
51
- getModuleComponentKey = _require3.getModuleComponentKey;
55
+ getModuleComponentKey = _require3.getModuleComponentKey,
56
+ getStorageKey = _require3.getStorageKey;
57
+
58
+ var _require4 = require('./ResolverCache'),
59
+ NoopResolverCache = _require4.NoopResolverCache;
52
60
 
53
- var _require4 = require('./ResolverFragments'),
54
- withResolverContext = _require4.withResolverContext;
61
+ var _require5 = require('./ResolverFragments'),
62
+ withResolverContext = _require5.withResolverContext;
55
63
 
56
- var _require5 = require('./TypeID'),
57
- generateTypeID = _require5.generateTypeID;
64
+ var _require6 = require('./TypeID'),
65
+ generateTypeID = _require6.generateTypeID;
58
66
 
59
- function read(recordSource, selector) {
60
- var reader = new RelayReader(recordSource, selector);
67
+ var invariant = require('invariant');
68
+
69
+ function read(recordSource, selector, resolverCache) {
70
+ var reader = new RelayReader(recordSource, selector, resolverCache !== null && resolverCache !== void 0 ? resolverCache : new NoopResolverCache());
61
71
  return reader.read();
62
72
  }
63
73
  /**
@@ -66,7 +76,11 @@ function read(recordSource, selector) {
66
76
 
67
77
 
68
78
  var RelayReader = /*#__PURE__*/function () {
69
- function RelayReader(recordSource, selector) {
79
+ function RelayReader(recordSource, selector, resolverCache) {
80
+ var _selector$clientEdgeT;
81
+
82
+ this._clientEdgeTraversalPath = RelayFeatureFlags.ENABLE_CLIENT_EDGES && ((_selector$clientEdgeT = selector.clientEdgeTraversalPath) === null || _selector$clientEdgeT === void 0 ? void 0 : _selector$clientEdgeT.length) ? (0, _toConsumableArray2["default"])(selector.clientEdgeTraversalPath) : [];
83
+ this._missingClientEdges = [];
70
84
  this._isMissingData = false;
71
85
  this._isWithinUnmatchedTypeRefinement = false;
72
86
  this._missingRequiredFields = null;
@@ -75,6 +89,7 @@ var RelayReader = /*#__PURE__*/function () {
75
89
  this._seenRecords = new Set();
76
90
  this._selector = selector;
77
91
  this._variables = selector.variables;
92
+ this._resolverCache = resolverCache;
78
93
  }
79
94
 
80
95
  var _proto = RelayReader.prototype;
@@ -103,7 +118,15 @@ var RelayReader = /*#__PURE__*/function () {
103
118
  if (isDataExpectedToBePresent && abstractKey == null && record != null) {
104
119
  var recordType = RelayModernRecord.getType(record);
105
120
 
106
- if (recordType !== node.type && dataID !== ROOT_ID) {
121
+ if (recordType !== node.type && // The root record type is a special `__Root` type and may not match the
122
+ // type on the ast, so ignore type mismatches at the root.
123
+ // We currently detect whether we're at the root by checking against ROOT_ID,
124
+ // but this does not work for mutations/subscriptions which generate unique
125
+ // root ids. This is acceptable in practice as we don't read data for mutations/
126
+ // subscriptions in a situation where we would use isMissingData to decide whether
127
+ // to suspend or not.
128
+ // TODO T96653810: Correctly detect reading from root of mutation/subscription
129
+ dataID !== ROOT_ID) {
107
130
  isDataExpectedToBePresent = false;
108
131
  }
109
132
  } // If this is an abstract fragment (and the precise refinement GK is enabled)
@@ -112,7 +135,7 @@ var RelayReader = /*#__PURE__*/function () {
112
135
  // the interface, that itself constitutes "expected" data being missing.
113
136
 
114
137
 
115
- if (isDataExpectedToBePresent && abstractKey != null && record != null && RelayFeatureFlags.ENABLE_PRECISE_TYPE_REFINEMENT) {
138
+ if (isDataExpectedToBePresent && abstractKey != null && record != null) {
116
139
  var _recordType = RelayModernRecord.getType(record);
117
140
 
118
141
  var typeID = generateTypeID(_recordType);
@@ -137,12 +160,30 @@ var RelayReader = /*#__PURE__*/function () {
137
160
  return {
138
161
  data: data,
139
162
  isMissingData: this._isMissingData && isDataExpectedToBePresent,
163
+ missingClientEdges: RelayFeatureFlags.ENABLE_CLIENT_EDGES && this._missingClientEdges.length ? this._missingClientEdges : null,
140
164
  seenRecords: this._seenRecords,
141
165
  selector: this._selector,
142
166
  missingRequiredFields: this._missingRequiredFields
143
167
  };
144
168
  };
145
169
 
170
+ _proto._markDataAsMissing = function _markDataAsMissing() {
171
+ this._isMissingData = true;
172
+
173
+ if (RelayFeatureFlags.ENABLE_CLIENT_EDGES && this._clientEdgeTraversalPath.length) {
174
+ var top = this._clientEdgeTraversalPath[this._clientEdgeTraversalPath.length - 1]; // Top can be null if we've traversed past a client edge into an ordinary
175
+ // client extension field; we never want to fetch in response to missing
176
+ // data off of a client extension field.
177
+
178
+ if (top !== null) {
179
+ this._missingClientEdges.push({
180
+ request: top.readerClientEdge.operation,
181
+ clientEdgeDestinationID: top.clientEdgeDestinationID
182
+ });
183
+ }
184
+ }
185
+ };
186
+
146
187
  _proto._traverse = function _traverse(node, dataID, prevData) {
147
188
  var record = this._recordSource.get(dataID);
148
189
 
@@ -150,7 +191,7 @@ var RelayReader = /*#__PURE__*/function () {
150
191
 
151
192
  if (record == null) {
152
193
  if (record === undefined) {
153
- this._isMissingData = true;
194
+ this._markDataAsMissing();
154
195
  }
155
196
 
156
197
  return record;
@@ -164,8 +205,7 @@ var RelayReader = /*#__PURE__*/function () {
164
205
  };
165
206
 
166
207
  _proto._getVariableValue = function _getVariableValue(name) {
167
- !this._variables.hasOwnProperty(name) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayReader(): Undefined variable `%s`.', name) : invariant(false) : void 0; // $FlowFixMe[cannot-write]
168
-
208
+ !this._variables.hasOwnProperty(name) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayReader(): Undefined variable `%s`.', name) : invariant(false) : void 0;
169
209
  return this._variables[name];
170
210
  };
171
211
 
@@ -220,8 +260,6 @@ var RelayReader = /*#__PURE__*/function () {
220
260
 
221
261
  switch (selection.kind) {
222
262
  case REQUIRED_FIELD:
223
- !RelayFeatureFlags.ENABLE_REQUIRED_DIRECTIVES ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayReader(): Encountered a `@required` directive at path "%s" in `%s` without the `ENABLE_REQUIRED_DIRECTIVES` feature flag enabled.', selection.path, this._selector.node.name) : invariant(false) : void 0;
224
-
225
263
  var fieldValue = this._readRequiredField(selection, record, data);
226
264
 
227
265
  if (fieldValue == null) {
@@ -254,7 +292,7 @@ var RelayReader = /*#__PURE__*/function () {
254
292
  break;
255
293
 
256
294
  case CONDITION:
257
- var conditionValue = this._getVariableValue(selection.condition);
295
+ var conditionValue = Boolean(this._getVariableValue(selection.condition));
258
296
 
259
297
  if (conditionValue === selection.passingValue) {
260
298
  var hasExpectedData = this._traverseSelections(selection.selections, record, data);
@@ -281,7 +319,7 @@ var RelayReader = /*#__PURE__*/function () {
281
319
  return false;
282
320
  }
283
321
  }
284
- } else if (RelayFeatureFlags.ENABLE_PRECISE_TYPE_REFINEMENT) {
322
+ } else {
285
323
  // Similar to the logic in read(): data is only expected to be present
286
324
  // if the record is known to conform to the interface. If we don't know
287
325
  // whether the type conforms or not, that constitutes missing data.
@@ -307,12 +345,8 @@ var RelayReader = /*#__PURE__*/function () {
307
345
  this._isMissingData = parentIsMissingData;
308
346
  } else if (implementsInterface == null) {
309
347
  // Don't know if the type implements the interface or not
310
- this._isMissingData = true;
348
+ this._markDataAsMissing();
311
349
  }
312
- } else {
313
- // legacy behavior for abstract refinements: always read even
314
- // if the type doesn't conform and don't reset isMissingData
315
- this._traverseSelections(selection.selections, record, data);
316
350
  }
317
351
 
318
352
  break;
@@ -348,10 +382,22 @@ var RelayReader = /*#__PURE__*/function () {
348
382
  case CLIENT_EXTENSION:
349
383
  {
350
384
  var isMissingData = this._isMissingData;
385
+ var alreadyMissingClientEdges = this._missingClientEdges.length;
386
+
387
+ if (RelayFeatureFlags.ENABLE_CLIENT_EDGES) {
388
+ this._clientEdgeTraversalPath.push(null);
389
+ }
351
390
 
352
- var _hasExpectedData2 = this._traverseSelections(selection.selections, record, data);
391
+ var _hasExpectedData2 = this._traverseSelections(selection.selections, record, data); // The only case where we want to suspend due to missing data off of
392
+ // a client extension is if we reached a client edge that we might be
393
+ // able to fetch:
353
394
 
354
- this._isMissingData = isMissingData;
395
+
396
+ this._isMissingData = isMissingData || this._missingClientEdges.length > alreadyMissingClientEdges;
397
+
398
+ if (RelayFeatureFlags.ENABLE_CLIENT_EDGES) {
399
+ this._clientEdgeTraversalPath.pop();
400
+ }
355
401
 
356
402
  if (!_hasExpectedData2) {
357
403
  return false;
@@ -380,6 +426,20 @@ var RelayReader = /*#__PURE__*/function () {
380
426
 
381
427
  break;
382
428
 
429
+ case ACTOR_CHANGE:
430
+ this._readActorChange(selection, record, data);
431
+
432
+ break;
433
+
434
+ case CLIENT_EDGE:
435
+ if (RelayFeatureFlags.ENABLE_CLIENT_EDGES) {
436
+ this._readClientEdge(selection, record, data);
437
+ } else {
438
+ throw new Error('Client edges are not yet supported.');
439
+ }
440
+
441
+ break;
442
+
383
443
  default:
384
444
  selection;
385
445
  !false ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayReader(): Unexpected ast kind `%s`.', selection.kind) : invariant(false) : void 0;
@@ -401,50 +461,140 @@ var RelayReader = /*#__PURE__*/function () {
401
461
  return this._readLink(selection.field, record, data);
402
462
  }
403
463
 
464
+ case RELAY_RESOLVER:
465
+ if (!RelayFeatureFlags.ENABLE_RELAY_RESOLVERS) {
466
+ throw new Error('Relay Resolver fields are not yet supported.');
467
+ }
468
+
469
+ this._readResolverField(selection.field, record, data);
470
+
471
+ break;
472
+
404
473
  default:
405
474
  selection.field.kind;
406
475
  !false ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayReader(): Unexpected ast kind `%s`.', selection.kind) : invariant(false) : void 0;
407
476
  }
408
477
  };
409
478
 
410
- _proto._readResolverField = function _readResolverField(selection, record, data) {
479
+ _proto._readResolverField = function _readResolverField(field, record, data) {
411
480
  var _this = this;
412
481
 
413
- var name = selection.name,
414
- alias = selection.alias,
415
- resolverModule = selection.resolverModule,
416
- fragment = selection.fragment;
417
- var key = {
418
- __id: RelayModernRecord.getDataID(record),
419
- __fragmentOwner: this._owner,
420
- __fragments: (0, _defineProperty2["default"])({}, fragment.name, {})
421
- };
422
- var resolverContext = {
423
- getDataForResolverFragment: function getDataForResolverFragment(singularReaderSelector) {
482
+ var _field$alias;
483
+
484
+ var resolverModule = field.resolverModule,
485
+ fragment = field.fragment;
486
+ var storageKey = getStorageKey(field, this._variables);
487
+ var resolverID = ClientID.generateClientID(RelayModernRecord.getDataID(record), storageKey); // Found when reading the resolver fragment, which can happen either when
488
+ // evaluating the resolver and it calls readFragment, or when checking if the
489
+ // inputs have changed since a previous evaluation:
490
+
491
+ var fragmentValue;
492
+ var fragmentReaderSelector;
493
+ var fragmentSeenRecordIDs = new Set();
494
+
495
+ var getDataForResolverFragment = function getDataForResolverFragment(singularReaderSelector) {
496
+ if (fragmentValue != null) {
497
+ // It was already read when checking for input staleness; no need to read it again.
498
+ // Note that the variables like fragmentSeenRecordIDs in the outer closure will have
499
+ // already been set and will still be used in this case.
500
+ return fragmentValue;
501
+ }
502
+
503
+ fragmentReaderSelector = singularReaderSelector;
504
+ var existingSeenRecords = _this._seenRecords;
505
+
506
+ try {
424
507
  var _resolverFragmentData;
425
508
 
509
+ _this._seenRecords = fragmentSeenRecordIDs;
426
510
  var resolverFragmentData = {};
427
511
 
428
512
  _this._createInlineDataOrResolverFragmentPointer(singularReaderSelector.node, record, resolverFragmentData);
429
513
 
430
- var answer = (_resolverFragmentData = resolverFragmentData[FRAGMENTS_KEY]) === null || _resolverFragmentData === void 0 ? void 0 : _resolverFragmentData[fragment.name];
431
- !(typeof answer === 'object' && answer !== null) ? process.env.NODE_ENV !== "production" ? invariant(false, "Expected reader data to contain a __fragments property with a property for the fragment named ".concat(fragment.name, ", but it is missing.")) : invariant(false) : void 0;
432
- return answer;
514
+ fragmentValue = (_resolverFragmentData = resolverFragmentData[FRAGMENTS_KEY]) === null || _resolverFragmentData === void 0 ? void 0 : _resolverFragmentData[fragment.name];
515
+ !(typeof fragmentValue === 'object' && fragmentValue !== null) ? process.env.NODE_ENV !== "production" ? invariant(false, "Expected reader data to contain a __fragments property with a property for the fragment named ".concat(fragment.name, ", but it is missing.")) : invariant(false) : void 0;
516
+ return fragmentValue;
517
+ } finally {
518
+ _this._seenRecords = existingSeenRecords;
433
519
  }
434
520
  };
435
- var resolverResult = withResolverContext(resolverContext, function () {
436
- return (// $FlowFixMe[prop-missing] - resolver module's type signature is a lie
437
- resolverModule(key)
438
- );
521
+
522
+ var resolverContext = {
523
+ getDataForResolverFragment: getDataForResolverFragment
524
+ };
525
+
526
+ var _this$_resolverCache$ = this._resolverCache.readFromCacheOrEvaluate(record, field, this._variables, function () {
527
+ var key = {
528
+ __id: RelayModernRecord.getDataID(record),
529
+ __fragmentOwner: _this._owner,
530
+ __fragments: (0, _defineProperty2["default"])({}, fragment.name, {})
531
+ };
532
+ return withResolverContext(resolverContext, function () {
533
+ // $FlowFixMe[prop-missing] - resolver module's type signature is a lie
534
+ var resolverResult = resolverModule(key);
535
+ return {
536
+ resolverResult: resolverResult,
537
+ fragmentValue: fragmentValue,
538
+ resolverID: resolverID,
539
+ seenRecordIDs: fragmentSeenRecordIDs,
540
+ readerSelector: fragmentReaderSelector
541
+ };
542
+ });
543
+ }, getDataForResolverFragment),
544
+ result = _this$_resolverCache$[0],
545
+ seenRecord = _this$_resolverCache$[1];
546
+
547
+ if (seenRecord != null) {
548
+ this._seenRecords.add(seenRecord);
549
+ }
550
+
551
+ var applicationName = (_field$alias = field.alias) !== null && _field$alias !== void 0 ? _field$alias : field.name;
552
+ data[applicationName] = result;
553
+ };
554
+
555
+ _proto._readClientEdge = function _readClientEdge(field, record, data) {
556
+ var _backingField$alias;
557
+
558
+ var backingField = field.backingField; // Because ReaderClientExtension doesn't have `alias` or `name` and so I don't know
559
+ // how to get its applicationName or storageKey yet:
560
+
561
+ !(backingField.kind !== 'ClientExtension') ? process.env.NODE_ENV !== "production" ? invariant(false, 'Client extension client edges are not yet implemented.') : invariant(false) : void 0;
562
+ var applicationName = (_backingField$alias = backingField.alias) !== null && _backingField$alias !== void 0 ? _backingField$alias : backingField.name;
563
+ var backingFieldData = {};
564
+
565
+ this._traverseSelections([backingField], record, backingFieldData);
566
+
567
+ var destinationDataID = backingFieldData[applicationName];
568
+
569
+ if (destinationDataID == null) {
570
+ data[applicationName] = destinationDataID;
571
+ return;
572
+ }
573
+
574
+ !(typeof destinationDataID === 'string') ? process.env.NODE_ENV !== "production" ? invariant(false, 'Plural client edges not are yet implemented') : invariant(false) : void 0; // FIXME support plural
575
+ // Not wrapping the push/pop in a try/finally because if we throw, the
576
+ // Reader object is not usable after that anyway.
577
+
578
+ this._clientEdgeTraversalPath.push({
579
+ readerClientEdge: field,
580
+ clientEdgeDestinationID: destinationDataID
439
581
  });
440
- data[alias !== null && alias !== void 0 ? alias : name] = resolverResult;
441
- return resolverResult;
582
+
583
+ var prevData = data[applicationName];
584
+ !(prevData == null || typeof prevData === 'object') ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayReader(): Expected data for field `%s` on record `%s` ' + 'to be an object, got `%s`.', applicationName, RelayModernRecord.getDataID(record), prevData) : invariant(false) : void 0;
585
+
586
+ var value = this._traverse(field.linkedField, destinationDataID, // $FlowFixMe[incompatible-variance]
587
+ prevData);
588
+
589
+ data[applicationName] = value;
590
+
591
+ this._clientEdgeTraversalPath.pop();
442
592
  };
443
593
 
444
594
  _proto._readFlightField = function _readFlightField(field, record, data) {
445
- var _field$alias;
595
+ var _field$alias2;
446
596
 
447
- var applicationName = (_field$alias = field.alias) !== null && _field$alias !== void 0 ? _field$alias : field.name;
597
+ var applicationName = (_field$alias2 = field.alias) !== null && _field$alias2 !== void 0 ? _field$alias2 : field.name;
448
598
  var storageKey = getStorageKey(field, this._variables);
449
599
  var reactFlightClientResponseRecordID = RelayModernRecord.getLinkedRecordID(record, storageKey);
450
600
 
@@ -452,7 +602,7 @@ var RelayReader = /*#__PURE__*/function () {
452
602
  data[applicationName] = reactFlightClientResponseRecordID;
453
603
 
454
604
  if (reactFlightClientResponseRecordID === undefined) {
455
- this._isMissingData = true;
605
+ this._markDataAsMissing();
456
606
  }
457
607
 
458
608
  return reactFlightClientResponseRecordID;
@@ -466,7 +616,7 @@ var RelayReader = /*#__PURE__*/function () {
466
616
  data[applicationName] = reactFlightClientResponseRecord;
467
617
 
468
618
  if (reactFlightClientResponseRecord === undefined) {
469
- this._isMissingData = true;
619
+ this._markDataAsMissing();
470
620
  }
471
621
 
472
622
  return reactFlightClientResponseRecord;
@@ -478,14 +628,14 @@ var RelayReader = /*#__PURE__*/function () {
478
628
  };
479
629
 
480
630
  _proto._readScalar = function _readScalar(field, record, data) {
481
- var _field$alias2;
631
+ var _field$alias3;
482
632
 
483
- var applicationName = (_field$alias2 = field.alias) !== null && _field$alias2 !== void 0 ? _field$alias2 : field.name;
633
+ var applicationName = (_field$alias3 = field.alias) !== null && _field$alias3 !== void 0 ? _field$alias3 : field.name;
484
634
  var storageKey = getStorageKey(field, this._variables);
485
635
  var value = RelayModernRecord.getValue(record, storageKey);
486
636
 
487
637
  if (value === undefined) {
488
- this._isMissingData = true;
638
+ this._markDataAsMissing();
489
639
  }
490
640
 
491
641
  data[applicationName] = value;
@@ -493,9 +643,9 @@ var RelayReader = /*#__PURE__*/function () {
493
643
  };
494
644
 
495
645
  _proto._readLink = function _readLink(field, record, data) {
496
- var _field$alias3;
646
+ var _field$alias4;
497
647
 
498
- var applicationName = (_field$alias3 = field.alias) !== null && _field$alias3 !== void 0 ? _field$alias3 : field.name;
648
+ var applicationName = (_field$alias4 = field.alias) !== null && _field$alias4 !== void 0 ? _field$alias4 : field.name;
499
649
  var storageKey = getStorageKey(field, this._variables);
500
650
  var linkedID = RelayModernRecord.getLinkedRecordID(record, storageKey);
501
651
 
@@ -503,7 +653,7 @@ var RelayReader = /*#__PURE__*/function () {
503
653
  data[applicationName] = linkedID;
504
654
 
505
655
  if (linkedID === undefined) {
506
- this._isMissingData = true;
656
+ this._markDataAsMissing();
507
657
  }
508
658
 
509
659
  return linkedID;
@@ -518,12 +668,44 @@ var RelayReader = /*#__PURE__*/function () {
518
668
  return value;
519
669
  };
520
670
 
671
+ _proto._readActorChange = function _readActorChange(field, record, data) {
672
+ var _field$alias5;
673
+
674
+ var applicationName = (_field$alias5 = field.alias) !== null && _field$alias5 !== void 0 ? _field$alias5 : field.name;
675
+ var storageKey = getStorageKey(field, this._variables);
676
+ var externalRef = RelayModernRecord.getActorLinkedRecordID(record, storageKey);
677
+
678
+ if (externalRef == null) {
679
+ data[applicationName] = externalRef;
680
+
681
+ if (externalRef === undefined) {
682
+ this._markDataAsMissing();
683
+ }
684
+
685
+ return data[applicationName];
686
+ }
687
+
688
+ var actorIdentifier = externalRef[0],
689
+ dataID = externalRef[1];
690
+ var fragmentRef = {};
691
+
692
+ this._createFragmentPointer(field.fragmentSpread, {
693
+ __id: dataID
694
+ }, fragmentRef);
695
+
696
+ data[applicationName] = {
697
+ __fragmentRef: fragmentRef,
698
+ __viewer: actorIdentifier
699
+ };
700
+ return data[applicationName];
701
+ };
702
+
521
703
  _proto._readPluralLink = function _readPluralLink(field, record, data) {
522
704
  var _this2 = this;
523
705
 
524
- var _field$alias4;
706
+ var _field$alias6;
525
707
 
526
- var applicationName = (_field$alias4 = field.alias) !== null && _field$alias4 !== void 0 ? _field$alias4 : field.name;
708
+ var applicationName = (_field$alias6 = field.alias) !== null && _field$alias6 !== void 0 ? _field$alias6 : field.name;
527
709
  var storageKey = getStorageKey(field, this._variables);
528
710
  var linkedIDs = RelayModernRecord.getLinkedRecordIDs(record, storageKey);
529
711
 
@@ -531,7 +713,7 @@ var RelayReader = /*#__PURE__*/function () {
531
713
  data[applicationName] = linkedIDs;
532
714
 
533
715
  if (linkedIDs === undefined) {
534
- this._isMissingData = true;
716
+ this._markDataAsMissing();
535
717
  }
536
718
 
537
719
  return linkedIDs;
@@ -543,7 +725,7 @@ var RelayReader = /*#__PURE__*/function () {
543
725
  linkedIDs.forEach(function (linkedID, nextIndex) {
544
726
  if (linkedID == null) {
545
727
  if (linkedID === undefined) {
546
- _this2._isMissingData = true;
728
+ _this2._markDataAsMissing();
547
729
  } // $FlowFixMe[cannot-write]
548
730
 
549
731
 
@@ -574,7 +756,7 @@ var RelayReader = /*#__PURE__*/function () {
574
756
 
575
757
  if (component == null) {
576
758
  if (component === undefined) {
577
- this._isMissingData = true;
759
+ this._markDataAsMissing();
578
760
  }
579
761
 
580
762
  return;
@@ -588,7 +770,7 @@ var RelayReader = /*#__PURE__*/function () {
588
770
  this._createFragmentPointer({
589
771
  kind: 'FragmentSpread',
590
772
  name: moduleImport.fragmentName,
591
- args: null
773
+ args: moduleImport.args
592
774
  }, record, data);
593
775
 
594
776
  data[FRAGMENT_PROP_NAME_KEY] = moduleImport.fragmentPropName;
@@ -611,9 +793,12 @@ var RelayReader = /*#__PURE__*/function () {
611
793
 
612
794
  fragmentPointers[fragmentSpread.name] = fragmentSpread.args ? getArgumentValues(fragmentSpread.args, this._variables) : {};
613
795
  data[FRAGMENT_OWNER_KEY] = this._owner;
796
+ data[IS_WITHIN_UNMATCHED_TYPE_REFINEMENT] = this._isWithinUnmatchedTypeRefinement;
614
797
 
615
- if (RelayFeatureFlags.ENABLE_PRECISE_TYPE_REFINEMENT) {
616
- data[IS_WITHIN_UNMATCHED_TYPE_REFINEMENT] = this._isWithinUnmatchedTypeRefinement;
798
+ if (RelayFeatureFlags.ENABLE_CLIENT_EDGES) {
799
+ if (this._clientEdgeTraversalPath.length > 0 && this._clientEdgeTraversalPath[this._clientEdgeTraversalPath.length - 1] !== null) {
800
+ data[CLIENT_EDGE_TRAVERSAL_PATH] = (0, _toConsumableArray2["default"])(this._clientEdgeTraversalPath);
801
+ }
617
802
  }
618
803
  };
619
804
 
@@ -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,15 +10,99 @@
10
10
  // flowlint ambiguous-object-type:error
11
11
  'use strict';
12
12
 
13
- var RelayRecordSourceMapImpl = require('./RelayRecordSourceMapImpl');
13
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
14
+
15
+ var _createForOfIteratorHelper2 = _interopRequireDefault(require("@babel/runtime/helpers/createForOfIteratorHelper"));
16
+
17
+ var RelayRecordState = require('./RelayRecordState');
18
+
19
+ var EXISTENT = RelayRecordState.EXISTENT,
20
+ NONEXISTENT = RelayRecordState.NONEXISTENT,
21
+ UNKNOWN = RelayRecordState.UNKNOWN;
22
+ /**
23
+ * An implementation of the `MutableRecordSource` interface (defined in
24
+ * `RelayStoreTypes`) that holds all records in memory (JS Map).
25
+ */
14
26
 
15
27
  var RelayRecordSource = /*#__PURE__*/function () {
16
28
  function RelayRecordSource(records) {
17
- return RelayRecordSource.create(records);
29
+ var _this = this;
30
+
31
+ this._records = new Map();
32
+
33
+ if (records != null) {
34
+ Object.keys(records).forEach(function (key) {
35
+ _this._records.set(key, records[key]);
36
+ });
37
+ }
18
38
  }
19
39
 
20
40
  RelayRecordSource.create = function create(records) {
21
- return new RelayRecordSourceMapImpl(records);
41
+ return new RelayRecordSource(records);
42
+ };
43
+
44
+ var _proto = RelayRecordSource.prototype;
45
+
46
+ _proto.clear = function clear() {
47
+ this._records = new Map();
48
+ };
49
+
50
+ _proto["delete"] = function _delete(dataID) {
51
+ this._records.set(dataID, null);
52
+ };
53
+
54
+ _proto.get = function get(dataID) {
55
+ return this._records.get(dataID);
56
+ };
57
+
58
+ _proto.getRecordIDs = function getRecordIDs() {
59
+ return Array.from(this._records.keys());
60
+ };
61
+
62
+ _proto.getStatus = function getStatus(dataID) {
63
+ if (!this._records.has(dataID)) {
64
+ return UNKNOWN;
65
+ }
66
+
67
+ return this._records.get(dataID) == null ? NONEXISTENT : EXISTENT;
68
+ };
69
+
70
+ _proto.has = function has(dataID) {
71
+ return this._records.has(dataID);
72
+ };
73
+
74
+ _proto.remove = function remove(dataID) {
75
+ this._records["delete"](dataID);
76
+ };
77
+
78
+ _proto.set = function set(dataID, record) {
79
+ this._records.set(dataID, record);
80
+ };
81
+
82
+ _proto.size = function size() {
83
+ return this._records.size;
84
+ };
85
+
86
+ _proto.toJSON = function toJSON() {
87
+ var obj = {};
88
+
89
+ var _iterator = (0, _createForOfIteratorHelper2["default"])(this._records),
90
+ _step;
91
+
92
+ try {
93
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
94
+ var _step$value = _step.value,
95
+ key = _step$value[0],
96
+ value = _step$value[1];
97
+ obj[key] = value;
98
+ }
99
+ } catch (err) {
100
+ _iterator.e(err);
101
+ } finally {
102
+ _iterator.f();
103
+ }
104
+
105
+ return obj;
22
106
  };
23
107
 
24
108
  return RelayRecordSource;