relay-runtime 12.0.0 → 13.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (216) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +67 -0
  3. package/handlers/RelayDefaultHandlerProvider.js.flow +3 -3
  4. package/handlers/connection/ConnectionHandler.js.flow +9 -18
  5. package/handlers/connection/ConnectionInterface.js.flow +1 -1
  6. package/handlers/connection/MutationHandlers.js.flow +8 -12
  7. package/index.js +2 -2
  8. package/index.js.flow +43 -34
  9. package/lib/handlers/RelayDefaultHandlerProvider.js +1 -1
  10. package/lib/handlers/connection/ConnectionHandler.js +13 -19
  11. package/lib/handlers/connection/ConnectionInterface.js +1 -1
  12. package/lib/handlers/connection/MutationHandlers.js +4 -7
  13. package/lib/index.js +49 -46
  14. package/lib/multi-actor-environment/ActorIdentifier.js +1 -1
  15. package/lib/multi-actor-environment/ActorSpecificEnvironment.js +9 -5
  16. package/lib/multi-actor-environment/ActorUtils.js +1 -1
  17. package/lib/multi-actor-environment/MultiActorEnvironment.js +36 -23
  18. package/lib/multi-actor-environment/MultiActorEnvironmentTypes.js +1 -1
  19. package/lib/multi-actor-environment/index.js +3 -3
  20. package/lib/mutations/RelayDeclarativeMutationConfig.js +5 -2
  21. package/lib/mutations/RelayRecordProxy.js +4 -3
  22. package/lib/mutations/RelayRecordSourceMutator.js +4 -3
  23. package/lib/mutations/RelayRecordSourceProxy.js +13 -5
  24. package/lib/mutations/RelayRecordSourceSelectorProxy.js +13 -5
  25. package/lib/mutations/applyOptimisticMutation.js +7 -7
  26. package/lib/mutations/commitLocalUpdate.js +1 -1
  27. package/lib/mutations/commitMutation.js +16 -15
  28. package/lib/mutations/readUpdatableQuery_EXPERIMENTAL.js +242 -0
  29. package/lib/mutations/validateMutation.js +7 -7
  30. package/lib/network/ConvertToExecuteFunction.js +3 -2
  31. package/lib/network/RelayNetwork.js +4 -3
  32. package/lib/network/RelayNetworkTypes.js +1 -1
  33. package/lib/network/RelayObservable.js +2 -4
  34. package/lib/network/RelayQueryResponseCache.js +3 -3
  35. package/lib/network/wrapNetworkWithLogObserver.js +3 -2
  36. package/lib/query/GraphQLTag.js +3 -2
  37. package/lib/query/PreloadableQueryRegistry.js +1 -1
  38. package/lib/query/fetchQuery.js +7 -6
  39. package/lib/query/fetchQueryInternal.js +1 -1
  40. package/lib/query/fetchQuery_DEPRECATED.js +3 -2
  41. package/lib/store/ClientID.js +8 -2
  42. package/lib/store/DataChecker.js +17 -18
  43. package/lib/store/OperationExecutor.js +14 -14
  44. package/lib/store/RelayConcreteVariables.js +7 -10
  45. package/lib/store/RelayExperimentalGraphResponseHandler.js +153 -0
  46. package/lib/store/RelayExperimentalGraphResponseTransform.js +391 -0
  47. package/lib/store/RelayModernEnvironment.js +67 -43
  48. package/lib/store/RelayModernFragmentSpecResolver.js +9 -9
  49. package/lib/store/RelayModernOperationDescriptor.js +3 -2
  50. package/lib/store/RelayModernRecord.js +13 -12
  51. package/lib/store/RelayModernSelector.js +15 -9
  52. package/lib/store/RelayModernStore.js +15 -16
  53. package/lib/store/RelayOperationTracker.js +1 -1
  54. package/lib/store/RelayOptimisticRecordSource.js +1 -1
  55. package/lib/store/RelayPublishQueue.js +12 -6
  56. package/lib/store/RelayReader.js +131 -40
  57. package/lib/store/RelayRecordSource.js +1 -1
  58. package/lib/store/RelayRecordState.js +1 -1
  59. package/lib/store/RelayReferenceMarker.js +11 -12
  60. package/lib/store/RelayResponseNormalizer.js +26 -23
  61. package/lib/store/RelayStoreReactFlightUtils.js +4 -4
  62. package/lib/store/RelayStoreSubscriptions.js +7 -5
  63. package/lib/store/RelayStoreTypes.js +1 -1
  64. package/lib/store/RelayStoreUtils.js +6 -6
  65. package/lib/store/ResolverCache.js +7 -7
  66. package/lib/store/ResolverFragments.js +12 -8
  67. package/lib/store/StoreInspector.js +1 -1
  68. package/lib/store/TypeID.js +1 -1
  69. package/lib/store/ViewerPattern.js +1 -1
  70. package/lib/store/cloneRelayHandleSourceField.js +6 -5
  71. package/lib/store/cloneRelayScalarHandleSourceField.js +6 -5
  72. package/lib/store/createFragmentSpecResolver.js +1 -1
  73. package/lib/store/createRelayContext.js +4 -2
  74. package/lib/store/defaultGetDataID.js +1 -1
  75. package/lib/store/defaultRequiredFieldLogger.js +1 -1
  76. package/lib/store/hasOverlappingIDs.js +1 -1
  77. package/lib/store/isRelayModernEnvironment.js +1 -1
  78. package/lib/store/normalizeRelayPayload.js +1 -1
  79. package/lib/store/readInlineData.js +7 -3
  80. package/lib/subscription/requestSubscription.js +4 -6
  81. package/lib/util/JSResourceTypes.flow.js +1 -1
  82. package/lib/util/NormalizationNode.js +1 -1
  83. package/lib/util/ReaderNode.js +1 -1
  84. package/lib/util/RelayConcreteNode.js +2 -1
  85. package/lib/util/RelayDefaultHandleKey.js +1 -1
  86. package/lib/util/RelayError.js +1 -1
  87. package/lib/util/RelayFeatureFlags.js +8 -3
  88. package/lib/util/RelayProfiler.js +1 -1
  89. package/lib/util/RelayReplaySubject.js +1 -1
  90. package/lib/util/RelayRuntimeTypes.js +1 -7
  91. package/lib/util/StringInterner.js +71 -0
  92. package/lib/util/createPayloadFor3DField.js +1 -1
  93. package/lib/util/deepFreeze.js +1 -1
  94. package/lib/util/generateID.js +1 -1
  95. package/lib/util/getAllRootVariables.js +29 -0
  96. package/lib/util/getFragmentIdentifier.js +16 -8
  97. package/lib/util/getOperation.js +3 -2
  98. package/lib/util/getPaginationMetadata.js +1 -1
  99. package/lib/util/getPaginationVariables.js +3 -4
  100. package/lib/util/getPendingOperationsForFragment.js +1 -1
  101. package/lib/util/getRefetchMetadata.js +1 -1
  102. package/lib/util/getRelayHandleKey.js +3 -3
  103. package/lib/util/getRequestIdentifier.js +3 -3
  104. package/lib/util/getValueAtPath.js +1 -1
  105. package/lib/util/isEmptyObject.js +1 -1
  106. package/lib/util/isPromise.js +1 -1
  107. package/lib/util/isScalarAndEqual.js +1 -1
  108. package/lib/util/recycleNodesInto.js +1 -1
  109. package/lib/util/registerEnvironmentWithDevTools.js +1 -1
  110. package/lib/util/reportMissingRequiredFields.js +1 -1
  111. package/lib/util/resolveImmediate.js +1 -1
  112. package/lib/util/stableCopy.js +1 -1
  113. package/lib/util/withDuration.js +1 -1
  114. package/multi-actor-environment/ActorIdentifier.js.flow +1 -1
  115. package/multi-actor-environment/ActorSpecificEnvironment.js.flow +28 -20
  116. package/multi-actor-environment/ActorUtils.js.flow +3 -3
  117. package/multi-actor-environment/MultiActorEnvironment.js.flow +46 -25
  118. package/multi-actor-environment/MultiActorEnvironmentTypes.js.flow +28 -12
  119. package/multi-actor-environment/index.js.flow +2 -3
  120. package/mutations/RelayDeclarativeMutationConfig.js.flow +33 -28
  121. package/mutations/RelayRecordProxy.js.flow +5 -6
  122. package/mutations/RelayRecordSourceMutator.js.flow +5 -7
  123. package/mutations/RelayRecordSourceProxy.js.flow +20 -11
  124. package/mutations/RelayRecordSourceSelectorProxy.js.flow +16 -6
  125. package/mutations/applyOptimisticMutation.js.flow +14 -15
  126. package/mutations/commitLocalUpdate.js.flow +2 -2
  127. package/mutations/commitMutation.js.flow +36 -49
  128. package/mutations/readUpdatableQuery_EXPERIMENTAL.js.flow +318 -0
  129. package/mutations/validateMutation.js.flow +20 -18
  130. package/network/ConvertToExecuteFunction.js.flow +3 -3
  131. package/network/RelayNetwork.js.flow +5 -6
  132. package/network/RelayNetworkTypes.js.flow +1 -1
  133. package/network/RelayObservable.js.flow +2 -4
  134. package/network/RelayQueryResponseCache.js.flow +4 -4
  135. package/network/wrapNetworkWithLogObserver.js.flow +9 -9
  136. package/package.json +2 -2
  137. package/query/GraphQLTag.js.flow +11 -11
  138. package/query/PreloadableQueryRegistry.js.flow +5 -3
  139. package/query/fetchQuery.js.flow +19 -19
  140. package/query/fetchQueryInternal.js.flow +7 -10
  141. package/query/fetchQuery_DEPRECATED.js.flow +7 -7
  142. package/relay-runtime.js +2 -2
  143. package/relay-runtime.min.js +3 -3
  144. package/store/ClientID.js.flow +10 -3
  145. package/store/DataChecker.js.flow +21 -30
  146. package/store/OperationExecutor.js.flow +55 -63
  147. package/store/RelayConcreteVariables.js.flow +5 -11
  148. package/store/RelayExperimentalGraphResponseHandler.js.flow +121 -0
  149. package/store/RelayExperimentalGraphResponseTransform.js.flow +470 -0
  150. package/store/RelayModernEnvironment.js.flow +57 -28
  151. package/store/RelayModernFragmentSpecResolver.js.flow +18 -20
  152. package/store/RelayModernOperationDescriptor.js.flow +11 -12
  153. package/store/RelayModernRecord.js.flow +20 -13
  154. package/store/RelayModernSelector.js.flow +25 -15
  155. package/store/RelayModernStore.js.flow +22 -26
  156. package/store/RelayOperationTracker.js.flow +12 -18
  157. package/store/RelayOptimisticRecordSource.js.flow +3 -3
  158. package/store/RelayPublishQueue.js.flow +43 -24
  159. package/store/RelayReader.js.flow +181 -68
  160. package/store/RelayRecordSource.js.flow +3 -3
  161. package/store/RelayRecordState.js.flow +1 -1
  162. package/store/RelayReferenceMarker.js.flow +13 -16
  163. package/store/RelayResponseNormalizer.js.flow +44 -42
  164. package/store/RelayStoreReactFlightUtils.js.flow +4 -5
  165. package/store/RelayStoreSubscriptions.js.flow +10 -9
  166. package/store/RelayStoreTypes.js.flow +73 -30
  167. package/store/RelayStoreUtils.js.flow +9 -10
  168. package/store/ResolverCache.js.flow +17 -15
  169. package/store/ResolverFragments.js.flow +18 -25
  170. package/store/StoreInspector.js.flow +3 -3
  171. package/store/TypeID.js.flow +2 -2
  172. package/store/ViewerPattern.js.flow +3 -3
  173. package/store/cloneRelayHandleSourceField.js.flow +6 -7
  174. package/store/cloneRelayScalarHandleSourceField.js.flow +6 -7
  175. package/store/createFragmentSpecResolver.js.flow +4 -5
  176. package/store/createRelayContext.js.flow +3 -3
  177. package/store/defaultGetDataID.js.flow +1 -1
  178. package/store/defaultRequiredFieldLogger.js.flow +1 -1
  179. package/store/hasOverlappingIDs.js.flow +1 -1
  180. package/store/isRelayModernEnvironment.js.flow +1 -1
  181. package/store/normalizeRelayPayload.js.flow +7 -8
  182. package/store/readInlineData.js.flow +8 -9
  183. package/subscription/requestSubscription.js.flow +16 -25
  184. package/util/JSResourceTypes.flow.js.flow +1 -1
  185. package/util/NormalizationNode.js.flow +1 -1
  186. package/util/ReaderNode.js.flow +10 -1
  187. package/util/RelayConcreteNode.js.flow +4 -1
  188. package/util/RelayDefaultHandleKey.js.flow +1 -1
  189. package/util/RelayError.js.flow +1 -1
  190. package/util/RelayFeatureFlags.js.flow +15 -5
  191. package/util/RelayProfiler.js.flow +1 -1
  192. package/util/RelayReplaySubject.js.flow +3 -4
  193. package/util/RelayRuntimeTypes.js.flow +70 -3
  194. package/util/StringInterner.js.flow +69 -0
  195. package/util/createPayloadFor3DField.js.flow +4 -4
  196. package/util/deepFreeze.js.flow +1 -1
  197. package/util/generateID.js.flow +1 -1
  198. package/util/getAllRootVariables.js.flow +36 -0
  199. package/util/getFragmentIdentifier.js.flow +28 -16
  200. package/util/getOperation.js.flow +3 -3
  201. package/util/getPaginationMetadata.js.flow +6 -11
  202. package/util/getPaginationVariables.js.flow +6 -10
  203. package/util/getPendingOperationsForFragment.js.flow +3 -3
  204. package/util/getRefetchMetadata.js.flow +8 -12
  205. package/util/getRelayHandleKey.js.flow +2 -3
  206. package/util/getRequestIdentifier.js.flow +4 -4
  207. package/util/getValueAtPath.js.flow +1 -1
  208. package/util/isEmptyObject.js.flow +1 -1
  209. package/util/isPromise.js.flow +1 -1
  210. package/util/isScalarAndEqual.js.flow +1 -1
  211. package/util/recycleNodesInto.js.flow +1 -1
  212. package/util/registerEnvironmentWithDevTools.js.flow +1 -1
  213. package/util/reportMissingRequiredFields.js.flow +1 -1
  214. package/util/resolveImmediate.js.flow +2 -2
  215. package/util/stableCopy.js.flow +1 -1
  216. package/util/withDuration.js.flow +1 -1
@@ -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,16 +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 ClientID = require('./ClientID');
18
-
19
- var RelayFeatureFlags = require('../util/RelayFeatureFlags');
20
-
21
- var RelayModernRecord = require('./RelayModernRecord');
22
-
23
- var invariant = require('invariant');
17
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
24
18
 
25
19
  var _require = require('../util/RelayConcreteNode'),
26
20
  ACTOR_CHANGE = _require.ACTOR_CHANGE,
21
+ CLIENT_EDGE = _require.CLIENT_EDGE,
27
22
  CLIENT_EXTENSION = _require.CLIENT_EXTENSION,
28
23
  CONDITION = _require.CONDITION,
29
24
  DEFER = _require.DEFER,
@@ -33,25 +28,32 @@ var _require = require('../util/RelayConcreteNode'),
33
28
  INLINE_FRAGMENT = _require.INLINE_FRAGMENT,
34
29
  LINKED_FIELD = _require.LINKED_FIELD,
35
30
  MODULE_IMPORT = _require.MODULE_IMPORT,
36
- REQUIRED_FIELD = _require.REQUIRED_FIELD,
37
31
  RELAY_RESOLVER = _require.RELAY_RESOLVER,
32
+ REQUIRED_FIELD = _require.REQUIRED_FIELD,
38
33
  SCALAR_FIELD = _require.SCALAR_FIELD,
39
34
  STREAM = _require.STREAM;
40
35
 
36
+ var RelayFeatureFlags = require('../util/RelayFeatureFlags');
37
+
38
+ var ClientID = require('./ClientID');
39
+
40
+ var RelayModernRecord = require('./RelayModernRecord');
41
+
41
42
  var _require2 = require('./RelayStoreReactFlightUtils'),
42
43
  getReactFlightClientResponse = _require2.getReactFlightClientResponse;
43
44
 
44
45
  var _require3 = require('./RelayStoreUtils'),
45
- FRAGMENTS_KEY = _require3.FRAGMENTS_KEY,
46
+ CLIENT_EDGE_TRAVERSAL_PATH = _require3.CLIENT_EDGE_TRAVERSAL_PATH,
46
47
  FRAGMENT_OWNER_KEY = _require3.FRAGMENT_OWNER_KEY,
47
48
  FRAGMENT_PROP_NAME_KEY = _require3.FRAGMENT_PROP_NAME_KEY,
49
+ FRAGMENTS_KEY = _require3.FRAGMENTS_KEY,
48
50
  ID_KEY = _require3.ID_KEY,
49
51
  IS_WITHIN_UNMATCHED_TYPE_REFINEMENT = _require3.IS_WITHIN_UNMATCHED_TYPE_REFINEMENT,
50
52
  MODULE_COMPONENT_KEY = _require3.MODULE_COMPONENT_KEY,
51
53
  ROOT_ID = _require3.ROOT_ID,
52
54
  getArgumentValues = _require3.getArgumentValues,
53
- getStorageKey = _require3.getStorageKey,
54
- getModuleComponentKey = _require3.getModuleComponentKey;
55
+ getModuleComponentKey = _require3.getModuleComponentKey,
56
+ getStorageKey = _require3.getStorageKey;
55
57
 
56
58
  var _require4 = require('./ResolverCache'),
57
59
  NoopResolverCache = _require4.NoopResolverCache;
@@ -62,6 +64,8 @@ var _require5 = require('./ResolverFragments'),
62
64
  var _require6 = require('./TypeID'),
63
65
  generateTypeID = _require6.generateTypeID;
64
66
 
67
+ var invariant = require('invariant');
68
+
65
69
  function read(recordSource, selector, resolverCache) {
66
70
  var reader = new RelayReader(recordSource, selector, resolverCache !== null && resolverCache !== void 0 ? resolverCache : new NoopResolverCache());
67
71
  return reader.read();
@@ -73,6 +77,10 @@ function read(recordSource, selector, resolverCache) {
73
77
 
74
78
  var RelayReader = /*#__PURE__*/function () {
75
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 = [];
76
84
  this._isMissingData = false;
77
85
  this._isWithinUnmatchedTypeRefinement = false;
78
86
  this._missingRequiredFields = null;
@@ -152,12 +160,30 @@ var RelayReader = /*#__PURE__*/function () {
152
160
  return {
153
161
  data: data,
154
162
  isMissingData: this._isMissingData && isDataExpectedToBePresent,
163
+ missingClientEdges: RelayFeatureFlags.ENABLE_CLIENT_EDGES && this._missingClientEdges.length ? this._missingClientEdges : null,
155
164
  seenRecords: this._seenRecords,
156
165
  selector: this._selector,
157
166
  missingRequiredFields: this._missingRequiredFields
158
167
  };
159
168
  };
160
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
+
161
187
  _proto._traverse = function _traverse(node, dataID, prevData) {
162
188
  var record = this._recordSource.get(dataID);
163
189
 
@@ -165,7 +191,7 @@ var RelayReader = /*#__PURE__*/function () {
165
191
 
166
192
  if (record == null) {
167
193
  if (record === undefined) {
168
- this._isMissingData = true;
194
+ this._markDataAsMissing();
169
195
  }
170
196
 
171
197
  return record;
@@ -179,8 +205,7 @@ var RelayReader = /*#__PURE__*/function () {
179
205
  };
180
206
 
181
207
  _proto._getVariableValue = function _getVariableValue(name) {
182
- !this._variables.hasOwnProperty(name) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayReader(): Undefined variable `%s`.', name) : invariant(false) : void 0; // $FlowFixMe[cannot-write]
183
-
208
+ !this._variables.hasOwnProperty(name) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayReader(): Undefined variable `%s`.', name) : invariant(false) : void 0;
184
209
  return this._variables[name];
185
210
  };
186
211
 
@@ -235,8 +260,6 @@ var RelayReader = /*#__PURE__*/function () {
235
260
 
236
261
  switch (selection.kind) {
237
262
  case REQUIRED_FIELD:
238
- !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;
239
-
240
263
  var fieldValue = this._readRequiredField(selection, record, data);
241
264
 
242
265
  if (fieldValue == null) {
@@ -322,7 +345,7 @@ var RelayReader = /*#__PURE__*/function () {
322
345
  this._isMissingData = parentIsMissingData;
323
346
  } else if (implementsInterface == null) {
324
347
  // Don't know if the type implements the interface or not
325
- this._isMissingData = true;
348
+ this._markDataAsMissing();
326
349
  }
327
350
  }
328
351
 
@@ -359,10 +382,22 @@ var RelayReader = /*#__PURE__*/function () {
359
382
  case CLIENT_EXTENSION:
360
383
  {
361
384
  var isMissingData = this._isMissingData;
385
+ var alreadyMissingClientEdges = this._missingClientEdges.length;
386
+
387
+ if (RelayFeatureFlags.ENABLE_CLIENT_EDGES) {
388
+ this._clientEdgeTraversalPath.push(null);
389
+ }
390
+
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:
362
394
 
363
- var _hasExpectedData2 = this._traverseSelections(selection.selections, record, data);
364
395
 
365
- this._isMissingData = isMissingData;
396
+ this._isMissingData = isMissingData || this._missingClientEdges.length > alreadyMissingClientEdges;
397
+
398
+ if (RelayFeatureFlags.ENABLE_CLIENT_EDGES) {
399
+ this._clientEdgeTraversalPath.pop();
400
+ }
366
401
 
367
402
  if (!_hasExpectedData2) {
368
403
  return false;
@@ -396,6 +431,15 @@ var RelayReader = /*#__PURE__*/function () {
396
431
 
397
432
  break;
398
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
+
399
443
  default:
400
444
  selection;
401
445
  !false ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayReader(): Unexpected ast kind `%s`.', selection.kind) : invariant(false) : void 0;
@@ -435,6 +479,8 @@ var RelayReader = /*#__PURE__*/function () {
435
479
  _proto._readResolverField = function _readResolverField(field, record, data) {
436
480
  var _this = this;
437
481
 
482
+ var _field$alias;
483
+
438
484
  var resolverModule = field.resolverModule,
439
485
  fragment = field.fragment;
440
486
  var storageKey = getStorageKey(field, this._variables);
@@ -502,14 +548,53 @@ var RelayReader = /*#__PURE__*/function () {
502
548
  this._seenRecords.add(seenRecord);
503
549
  }
504
550
 
505
- data[storageKey] = result;
506
- return result;
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
581
+ });
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();
507
592
  };
508
593
 
509
594
  _proto._readFlightField = function _readFlightField(field, record, data) {
510
- var _field$alias;
595
+ var _field$alias2;
511
596
 
512
- 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;
513
598
  var storageKey = getStorageKey(field, this._variables);
514
599
  var reactFlightClientResponseRecordID = RelayModernRecord.getLinkedRecordID(record, storageKey);
515
600
 
@@ -517,7 +602,7 @@ var RelayReader = /*#__PURE__*/function () {
517
602
  data[applicationName] = reactFlightClientResponseRecordID;
518
603
 
519
604
  if (reactFlightClientResponseRecordID === undefined) {
520
- this._isMissingData = true;
605
+ this._markDataAsMissing();
521
606
  }
522
607
 
523
608
  return reactFlightClientResponseRecordID;
@@ -531,7 +616,7 @@ var RelayReader = /*#__PURE__*/function () {
531
616
  data[applicationName] = reactFlightClientResponseRecord;
532
617
 
533
618
  if (reactFlightClientResponseRecord === undefined) {
534
- this._isMissingData = true;
619
+ this._markDataAsMissing();
535
620
  }
536
621
 
537
622
  return reactFlightClientResponseRecord;
@@ -543,14 +628,14 @@ var RelayReader = /*#__PURE__*/function () {
543
628
  };
544
629
 
545
630
  _proto._readScalar = function _readScalar(field, record, data) {
546
- var _field$alias2;
631
+ var _field$alias3;
547
632
 
548
- 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;
549
634
  var storageKey = getStorageKey(field, this._variables);
550
635
  var value = RelayModernRecord.getValue(record, storageKey);
551
636
 
552
637
  if (value === undefined) {
553
- this._isMissingData = true;
638
+ this._markDataAsMissing();
554
639
  }
555
640
 
556
641
  data[applicationName] = value;
@@ -558,9 +643,9 @@ var RelayReader = /*#__PURE__*/function () {
558
643
  };
559
644
 
560
645
  _proto._readLink = function _readLink(field, record, data) {
561
- var _field$alias3;
646
+ var _field$alias4;
562
647
 
563
- 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;
564
649
  var storageKey = getStorageKey(field, this._variables);
565
650
  var linkedID = RelayModernRecord.getLinkedRecordID(record, storageKey);
566
651
 
@@ -568,7 +653,7 @@ var RelayReader = /*#__PURE__*/function () {
568
653
  data[applicationName] = linkedID;
569
654
 
570
655
  if (linkedID === undefined) {
571
- this._isMissingData = true;
656
+ this._markDataAsMissing();
572
657
  }
573
658
 
574
659
  return linkedID;
@@ -584,9 +669,9 @@ var RelayReader = /*#__PURE__*/function () {
584
669
  };
585
670
 
586
671
  _proto._readActorChange = function _readActorChange(field, record, data) {
587
- var _field$alias4;
672
+ var _field$alias5;
588
673
 
589
- var applicationName = (_field$alias4 = field.alias) !== null && _field$alias4 !== void 0 ? _field$alias4 : field.name;
674
+ var applicationName = (_field$alias5 = field.alias) !== null && _field$alias5 !== void 0 ? _field$alias5 : field.name;
590
675
  var storageKey = getStorageKey(field, this._variables);
591
676
  var externalRef = RelayModernRecord.getActorLinkedRecordID(record, storageKey);
592
677
 
@@ -594,7 +679,7 @@ var RelayReader = /*#__PURE__*/function () {
594
679
  data[applicationName] = externalRef;
595
680
 
596
681
  if (externalRef === undefined) {
597
- this._isMissingData = true;
682
+ this._markDataAsMissing();
598
683
  }
599
684
 
600
685
  return data[applicationName];
@@ -618,9 +703,9 @@ var RelayReader = /*#__PURE__*/function () {
618
703
  _proto._readPluralLink = function _readPluralLink(field, record, data) {
619
704
  var _this2 = this;
620
705
 
621
- var _field$alias5;
706
+ var _field$alias6;
622
707
 
623
- var applicationName = (_field$alias5 = field.alias) !== null && _field$alias5 !== void 0 ? _field$alias5 : field.name;
708
+ var applicationName = (_field$alias6 = field.alias) !== null && _field$alias6 !== void 0 ? _field$alias6 : field.name;
624
709
  var storageKey = getStorageKey(field, this._variables);
625
710
  var linkedIDs = RelayModernRecord.getLinkedRecordIDs(record, storageKey);
626
711
 
@@ -628,7 +713,7 @@ var RelayReader = /*#__PURE__*/function () {
628
713
  data[applicationName] = linkedIDs;
629
714
 
630
715
  if (linkedIDs === undefined) {
631
- this._isMissingData = true;
716
+ this._markDataAsMissing();
632
717
  }
633
718
 
634
719
  return linkedIDs;
@@ -640,7 +725,7 @@ var RelayReader = /*#__PURE__*/function () {
640
725
  linkedIDs.forEach(function (linkedID, nextIndex) {
641
726
  if (linkedID == null) {
642
727
  if (linkedID === undefined) {
643
- _this2._isMissingData = true;
728
+ _this2._markDataAsMissing();
644
729
  } // $FlowFixMe[cannot-write]
645
730
 
646
731
 
@@ -671,7 +756,7 @@ var RelayReader = /*#__PURE__*/function () {
671
756
 
672
757
  if (component == null) {
673
758
  if (component === undefined) {
674
- this._isMissingData = true;
759
+ this._markDataAsMissing();
675
760
  }
676
761
 
677
762
  return;
@@ -709,6 +794,12 @@ var RelayReader = /*#__PURE__*/function () {
709
794
  fragmentPointers[fragmentSpread.name] = fragmentSpread.args ? getArgumentValues(fragmentSpread.args, this._variables) : {};
710
795
  data[FRAGMENT_OWNER_KEY] = this._owner;
711
796
  data[IS_WITHIN_UNMATCHED_TYPE_REFINEMENT] = this._isWithinUnmatchedTypeRefinement;
797
+
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
+ }
802
+ }
712
803
  };
713
804
 
714
805
  _proto._createInlineDataOrResolverFragmentPointer = function _createInlineDataOrResolverFragmentPointer(fragmentSpreadOrFragment, record, data) {
@@ -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.
@@ -14,28 +14,28 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
14
14
 
15
15
  var _createForOfIteratorHelper2 = _interopRequireDefault(require("@babel/runtime/helpers/createForOfIteratorHelper"));
16
16
 
17
+ var getOperation = require('../util/getOperation');
18
+
17
19
  var RelayConcreteNode = require('../util/RelayConcreteNode');
18
20
 
19
21
  var RelayFeatureFlags = require('../util/RelayFeatureFlags');
20
22
 
23
+ var cloneRelayHandleSourceField = require('./cloneRelayHandleSourceField');
24
+
25
+ var _require = require('./RelayConcreteVariables'),
26
+ getLocalVariables = _require.getLocalVariables;
27
+
21
28
  var RelayModernRecord = require('./RelayModernRecord');
22
29
 
23
30
  var RelayStoreReactFlightUtils = require('./RelayStoreReactFlightUtils');
24
31
 
25
32
  var RelayStoreUtils = require('./RelayStoreUtils');
26
33
 
27
- var cloneRelayHandleSourceField = require('./cloneRelayHandleSourceField');
28
-
29
- var getOperation = require('../util/getOperation');
30
-
31
- var invariant = require('invariant');
32
-
33
- var _require = require('./RelayConcreteVariables'),
34
- getLocalVariables = _require.getLocalVariables;
35
-
36
34
  var _require2 = require('./TypeID'),
37
35
  generateTypeID = _require2.generateTypeID;
38
36
 
37
+ var invariant = require('invariant');
38
+
39
39
  var ACTOR_CHANGE = RelayConcreteNode.ACTOR_CHANGE,
40
40
  CONDITION = RelayConcreteNode.CONDITION,
41
41
  CLIENT_COMPONENT = RelayConcreteNode.CLIENT_COMPONENT,
@@ -100,8 +100,7 @@ var RelayReferenceMarker = /*#__PURE__*/function () {
100
100
  };
101
101
 
102
102
  _proto._getVariableValue = function _getVariableValue(name) {
103
- !this._variables.hasOwnProperty(name) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayReferenceMarker(): Undefined variable `%s`.', name) : invariant(false) : void 0; // $FlowFixMe[cannot-write]
104
-
103
+ !this._variables.hasOwnProperty(name) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayReferenceMarker(): Undefined variable `%s`.', name) : invariant(false) : void 0;
105
104
  return this._variables[name];
106
105
  };
107
106
 
@@ -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,25 +16,15 @@ var _createForOfIteratorHelper2 = _interopRequireDefault(require("@babel/runtime
16
16
 
17
17
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
18
18
 
19
- var RelayFeatureFlags = require('../util/RelayFeatureFlags');
20
-
21
- var RelayModernRecord = require('./RelayModernRecord');
22
-
23
- var areEqual = require("fbjs/lib/areEqual");
24
-
25
- var invariant = require('invariant');
26
-
27
- var warning = require("fbjs/lib/warning");
28
-
29
19
  var _require = require('../multi-actor-environment/ActorUtils'),
30
20
  ACTOR_IDENTIFIER_FIELD_NAME = _require.ACTOR_IDENTIFIER_FIELD_NAME,
31
21
  getActorIdentifierFromPayload = _require.getActorIdentifierFromPayload;
32
22
 
33
23
  var _require2 = require('../util/RelayConcreteNode'),
34
24
  ACTOR_CHANGE = _require2.ACTOR_CHANGE,
35
- CONDITION = _require2.CONDITION,
36
25
  CLIENT_COMPONENT = _require2.CLIENT_COMPONENT,
37
26
  CLIENT_EXTENSION = _require2.CLIENT_EXTENSION,
27
+ CONDITION = _require2.CONDITION,
38
28
  DEFER = _require2.DEFER,
39
29
  FLIGHT_FIELD = _require2.FLIGHT_FIELD,
40
30
  FRAGMENT_SPREAD = _require2.FRAGMENT_SPREAD,
@@ -47,6 +37,8 @@ var _require2 = require('../util/RelayConcreteNode'),
47
37
  STREAM = _require2.STREAM,
48
38
  TYPE_DISCRIMINATOR = _require2.TYPE_DISCRIMINATOR;
49
39
 
40
+ var RelayFeatureFlags = require('../util/RelayFeatureFlags');
41
+
50
42
  var _require3 = require('./ClientID'),
51
43
  generateClientID = _require3.generateClientID,
52
44
  isClientID = _require3.isClientID;
@@ -54,28 +46,36 @@ var _require3 = require('./ClientID'),
54
46
  var _require4 = require('./RelayConcreteVariables'),
55
47
  getLocalVariables = _require4.getLocalVariables;
56
48
 
49
+ var RelayModernRecord = require('./RelayModernRecord');
50
+
57
51
  var _require5 = require('./RelayModernSelector'),
58
52
  createNormalizationSelector = _require5.createNormalizationSelector;
59
53
 
60
54
  var _require6 = require('./RelayStoreReactFlightUtils'),
61
- refineToReactFlightPayloadData = _require6.refineToReactFlightPayloadData,
62
55
  REACT_FLIGHT_EXECUTABLE_DEFINITIONS_STORAGE_KEY = _require6.REACT_FLIGHT_EXECUTABLE_DEFINITIONS_STORAGE_KEY,
63
56
  REACT_FLIGHT_TREE_STORAGE_KEY = _require6.REACT_FLIGHT_TREE_STORAGE_KEY,
64
- REACT_FLIGHT_TYPE_NAME = _require6.REACT_FLIGHT_TYPE_NAME;
57
+ REACT_FLIGHT_TYPE_NAME = _require6.REACT_FLIGHT_TYPE_NAME,
58
+ refineToReactFlightPayloadData = _require6.refineToReactFlightPayloadData;
65
59
 
66
60
  var _require7 = require('./RelayStoreUtils'),
61
+ ROOT_ID = _require7.ROOT_ID,
62
+ ROOT_TYPE = _require7.ROOT_TYPE,
63
+ TYPENAME_KEY = _require7.TYPENAME_KEY,
67
64
  getArgumentValues = _require7.getArgumentValues,
68
65
  getHandleStorageKey = _require7.getHandleStorageKey,
69
66
  getModuleComponentKey = _require7.getModuleComponentKey,
70
67
  getModuleOperationKey = _require7.getModuleOperationKey,
71
- getStorageKey = _require7.getStorageKey,
72
- TYPENAME_KEY = _require7.TYPENAME_KEY,
73
- ROOT_ID = _require7.ROOT_ID,
74
- ROOT_TYPE = _require7.ROOT_TYPE;
68
+ getStorageKey = _require7.getStorageKey;
75
69
 
76
70
  var _require8 = require('./TypeID'),
77
- generateTypeID = _require8.generateTypeID,
78
- TYPE_SCHEMA_TYPE = _require8.TYPE_SCHEMA_TYPE;
71
+ TYPE_SCHEMA_TYPE = _require8.TYPE_SCHEMA_TYPE,
72
+ generateTypeID = _require8.generateTypeID;
73
+
74
+ var areEqual = require("fbjs/lib/areEqual");
75
+
76
+ var invariant = require('invariant');
77
+
78
+ var warning = require("fbjs/lib/warning");
79
79
 
80
80
  /**
81
81
  * Normalizes the results of a query and standard GraphQL response, writing the
@@ -133,8 +133,7 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
133
133
  };
134
134
 
135
135
  _proto._getVariableValue = function _getVariableValue(name) {
136
- !this._variables.hasOwnProperty(name) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer(): Undefined variable `%s`.', name) : invariant(false) : void 0; // $FlowFixMe[cannot-write]
137
-
136
+ !this._variables.hasOwnProperty(name) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer(): Undefined variable `%s`.', name) : invariant(false) : void 0;
138
137
  return this._variables[name];
139
138
  };
140
139
 
@@ -422,7 +421,11 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
422
421
 
423
422
  if (process.env.NODE_ENV !== "production") {
424
423
  if (selection.kind === SCALAR_FIELD) {
425
- this._validateConflictingFieldsWithIdenticalId(record, storageKey, fieldValue);
424
+ this._validateConflictingFieldsWithIdenticalId(record, storageKey, // When using `treatMissingFieldsAsNull` the conflicting validation raises a false positive
425
+ // because the value is set using `null` but validated using `fieldValue` which at this point
426
+ // will be `undefined`.
427
+ // Setting this to `null` matches the value that we actually set to the `fieldValue`.
428
+ null);
426
429
  }
427
430
  }
428
431
 
@@ -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,13 +10,13 @@
10
10
  // flowlint ambiguous-object-type:error
11
11
  'use strict';
12
12
 
13
- var invariant = require('invariant');
14
-
15
13
  var _require = require('./RelayModernRecord'),
16
14
  getType = _require.getType;
17
15
 
18
- // Reachable (client) executable definitions encountered while server component
16
+ var invariant = require('invariant'); // Reachable (client) executable definitions encountered while server component
19
17
  // rendering
18
+
19
+
20
20
  var REACT_FLIGHT_EXECUTABLE_DEFINITIONS_STORAGE_KEY = 'executableDefinitions';
21
21
  var REACT_FLIGHT_TREE_STORAGE_KEY = 'tree';
22
22
  var REACT_FLIGHT_TYPE_NAME = 'ReactFlightComponent';
@@ -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,15 @@
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
24
  function RelayStoreSubscriptions(log, resolverCache) {
@@ -93,6 +93,7 @@ var RelayStoreSubscriptions = /*#__PURE__*/function () {
93
93
  subscription.snapshot = {
94
94
  data: subscription.snapshot.data,
95
95
  isMissingData: backup.isMissingData,
96
+ missingClientEdges: backup.missingClientEdges,
96
97
  seenRecords: backup.seenRecords,
97
98
  selector: backup.selector,
98
99
  missingRequiredFields: backup.missingRequiredFields
@@ -142,6 +143,7 @@ var RelayStoreSubscriptions = /*#__PURE__*/function () {
142
143
  nextSnapshot = {
143
144
  data: nextData,
144
145
  isMissingData: nextSnapshot.isMissingData,
146
+ missingClientEdges: nextSnapshot.missingClientEdges,
145
147
  seenRecords: nextSnapshot.seenRecords,
146
148
  selector: nextSnapshot.selector,
147
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.