relay-runtime 12.0.0 → 13.0.0-rc.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 (138) hide show
  1. package/handlers/RelayDefaultHandlerProvider.js.flow +2 -2
  2. package/handlers/connection/ConnectionHandler.js.flow +8 -17
  3. package/handlers/connection/MutationHandlers.js.flow +7 -11
  4. package/index.js +1 -1
  5. package/index.js.flow +40 -33
  6. package/lib/handlers/connection/ConnectionHandler.js +12 -18
  7. package/lib/handlers/connection/MutationHandlers.js +3 -6
  8. package/lib/index.js +45 -45
  9. package/lib/multi-actor-environment/ActorSpecificEnvironment.js +8 -4
  10. package/lib/multi-actor-environment/MultiActorEnvironment.js +35 -22
  11. package/lib/multi-actor-environment/index.js +2 -2
  12. package/lib/mutations/RelayDeclarativeMutationConfig.js +4 -1
  13. package/lib/mutations/RelayRecordProxy.js +3 -2
  14. package/lib/mutations/RelayRecordSourceMutator.js +3 -2
  15. package/lib/mutations/RelayRecordSourceProxy.js +12 -4
  16. package/lib/mutations/RelayRecordSourceSelectorProxy.js +12 -4
  17. package/lib/mutations/applyOptimisticMutation.js +6 -6
  18. package/lib/mutations/commitMutation.js +15 -14
  19. package/lib/mutations/readUpdatableQuery_EXPERIMENTAL.js +238 -0
  20. package/lib/mutations/validateMutation.js +6 -6
  21. package/lib/network/ConvertToExecuteFunction.js +2 -1
  22. package/lib/network/RelayNetwork.js +3 -2
  23. package/lib/network/RelayObservable.js +1 -3
  24. package/lib/network/RelayQueryResponseCache.js +2 -2
  25. package/lib/network/wrapNetworkWithLogObserver.js +2 -1
  26. package/lib/query/GraphQLTag.js +2 -1
  27. package/lib/query/fetchQuery.js +6 -5
  28. package/lib/query/fetchQuery_DEPRECATED.js +2 -1
  29. package/lib/store/ClientID.js +7 -1
  30. package/lib/store/DataChecker.js +16 -17
  31. package/lib/store/OperationExecutor.js +13 -13
  32. package/lib/store/RelayConcreteVariables.js +6 -9
  33. package/lib/store/RelayModernEnvironment.js +66 -42
  34. package/lib/store/RelayModernFragmentSpecResolver.js +8 -8
  35. package/lib/store/RelayModernOperationDescriptor.js +2 -1
  36. package/lib/store/RelayModernRecord.js +12 -11
  37. package/lib/store/RelayModernSelector.js +14 -8
  38. package/lib/store/RelayModernStore.js +14 -15
  39. package/lib/store/RelayPublishQueue.js +11 -5
  40. package/lib/store/RelayReader.js +130 -37
  41. package/lib/store/RelayReferenceMarker.js +10 -11
  42. package/lib/store/RelayResponseNormalizer.js +25 -22
  43. package/lib/store/RelayStoreReactFlightUtils.js +3 -3
  44. package/lib/store/RelayStoreSubscriptions.js +6 -4
  45. package/lib/store/RelayStoreUtils.js +5 -5
  46. package/lib/store/ResolverCache.js +6 -6
  47. package/lib/store/ResolverFragments.js +9 -5
  48. package/lib/store/cloneRelayHandleSourceField.js +5 -4
  49. package/lib/store/cloneRelayScalarHandleSourceField.js +5 -4
  50. package/lib/store/createRelayContext.js +3 -1
  51. package/lib/store/readInlineData.js +6 -2
  52. package/lib/subscription/requestSubscription.js +5 -5
  53. package/lib/util/RelayConcreteNode.js +1 -0
  54. package/lib/util/RelayFeatureFlags.js +7 -1
  55. package/lib/util/RelayRuntimeTypes.js +0 -6
  56. package/lib/util/StringInterner.js +71 -0
  57. package/lib/util/getFragmentIdentifier.js +15 -7
  58. package/lib/util/getOperation.js +2 -1
  59. package/lib/util/getPaginationVariables.js +2 -3
  60. package/lib/util/getRelayHandleKey.js +2 -2
  61. package/lib/util/getRequestIdentifier.js +2 -2
  62. package/multi-actor-environment/ActorSpecificEnvironment.js.flow +27 -19
  63. package/multi-actor-environment/ActorUtils.js.flow +2 -2
  64. package/multi-actor-environment/MultiActorEnvironment.js.flow +45 -24
  65. package/multi-actor-environment/MultiActorEnvironmentTypes.js.flow +27 -11
  66. package/multi-actor-environment/index.js.flow +1 -2
  67. package/mutations/RelayDeclarativeMutationConfig.js.flow +32 -26
  68. package/mutations/RelayRecordProxy.js.flow +4 -5
  69. package/mutations/RelayRecordSourceMutator.js.flow +4 -6
  70. package/mutations/RelayRecordSourceProxy.js.flow +19 -10
  71. package/mutations/RelayRecordSourceSelectorProxy.js.flow +15 -5
  72. package/mutations/applyOptimisticMutation.js.flow +13 -14
  73. package/mutations/commitLocalUpdate.js.flow +1 -1
  74. package/mutations/commitMutation.js.flow +35 -48
  75. package/mutations/readUpdatableQuery_EXPERIMENTAL.js.flow +309 -0
  76. package/mutations/validateMutation.js.flow +19 -17
  77. package/network/ConvertToExecuteFunction.js.flow +2 -2
  78. package/network/RelayNetwork.js.flow +4 -5
  79. package/network/RelayObservable.js.flow +1 -3
  80. package/network/RelayQueryResponseCache.js.flow +3 -3
  81. package/network/wrapNetworkWithLogObserver.js.flow +8 -7
  82. package/package.json +1 -1
  83. package/query/GraphQLTag.js.flow +9 -9
  84. package/query/PreloadableQueryRegistry.js.flow +2 -1
  85. package/query/fetchQuery.js.flow +11 -13
  86. package/query/fetchQueryInternal.js.flow +6 -9
  87. package/query/fetchQuery_DEPRECATED.js.flow +6 -6
  88. package/relay-runtime.js +2 -2
  89. package/relay-runtime.min.js +2 -2
  90. package/store/ClientID.js.flow +9 -2
  91. package/store/DataChecker.js.flow +20 -29
  92. package/store/OperationExecutor.js.flow +54 -62
  93. package/store/RelayConcreteVariables.js.flow +4 -10
  94. package/store/RelayModernEnvironment.js.flow +56 -27
  95. package/store/RelayModernFragmentSpecResolver.js.flow +17 -19
  96. package/store/RelayModernOperationDescriptor.js.flow +10 -11
  97. package/store/RelayModernRecord.js.flow +19 -12
  98. package/store/RelayModernSelector.js.flow +24 -14
  99. package/store/RelayModernStore.js.flow +21 -24
  100. package/store/RelayOperationTracker.js.flow +11 -17
  101. package/store/RelayOptimisticRecordSource.js.flow +2 -2
  102. package/store/RelayPublishQueue.js.flow +42 -23
  103. package/store/RelayReader.js.flow +180 -60
  104. package/store/RelayRecordSource.js.flow +2 -2
  105. package/store/RelayReferenceMarker.js.flow +12 -15
  106. package/store/RelayResponseNormalizer.js.flow +43 -41
  107. package/store/RelayStoreReactFlightUtils.js.flow +3 -4
  108. package/store/RelayStoreSubscriptions.js.flow +9 -8
  109. package/store/RelayStoreTypes.js.flow +72 -29
  110. package/store/RelayStoreUtils.js.flow +8 -9
  111. package/store/ResolverCache.js.flow +16 -14
  112. package/store/ResolverFragments.js.flow +15 -22
  113. package/store/StoreInspector.js.flow +2 -2
  114. package/store/TypeID.js.flow +1 -1
  115. package/store/ViewerPattern.js.flow +2 -2
  116. package/store/cloneRelayHandleSourceField.js.flow +5 -6
  117. package/store/cloneRelayScalarHandleSourceField.js.flow +5 -6
  118. package/store/createFragmentSpecResolver.js.flow +3 -4
  119. package/store/createRelayContext.js.flow +2 -2
  120. package/store/normalizeRelayPayload.js.flow +6 -7
  121. package/store/readInlineData.js.flow +7 -8
  122. package/subscription/requestSubscription.js.flow +16 -24
  123. package/util/ReaderNode.js.flow +9 -0
  124. package/util/RelayConcreteNode.js.flow +1 -0
  125. package/util/RelayFeatureFlags.js.flow +14 -2
  126. package/util/RelayReplaySubject.js.flow +2 -3
  127. package/util/RelayRuntimeTypes.js.flow +69 -2
  128. package/util/StringInterner.js.flow +69 -0
  129. package/util/createPayloadFor3DField.js.flow +3 -3
  130. package/util/getFragmentIdentifier.js.flow +27 -15
  131. package/util/getOperation.js.flow +2 -2
  132. package/util/getPaginationMetadata.js.flow +5 -7
  133. package/util/getPaginationVariables.js.flow +5 -9
  134. package/util/getPendingOperationsForFragment.js.flow +2 -2
  135. package/util/getRefetchMetadata.js.flow +6 -7
  136. package/util/getRelayHandleKey.js.flow +1 -2
  137. package/util/getRequestIdentifier.js.flow +3 -3
  138. package/util/resolveImmediate.js.flow +1 -1
@@ -16,10 +16,20 @@ var _createForOfIteratorHelper2 = _interopRequireDefault(require("@babel/runtime
16
16
 
17
17
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
18
18
 
19
- var DataChecker = require('./DataChecker');
19
+ var _require = require('../multi-actor-environment/ActorIdentifier'),
20
+ INTERNAL_ACTOR_IDENTIFIER_DO_NOT_USE = _require.INTERNAL_ACTOR_IDENTIFIER_DO_NOT_USE,
21
+ assertInternalActorIndentifier = _require.assertInternalActorIndentifier;
22
+
23
+ var deepFreeze = require('../util/deepFreeze');
20
24
 
21
25
  var RelayFeatureFlags = require('../util/RelayFeatureFlags');
22
26
 
27
+ var resolveImmediate = require('../util/resolveImmediate');
28
+
29
+ var DataChecker = require('./DataChecker');
30
+
31
+ var defaultGetDataID = require('./defaultGetDataID');
32
+
23
33
  var RelayModernRecord = require('./RelayModernRecord');
24
34
 
25
35
  var RelayOptimisticRecordSource = require('./RelayOptimisticRecordSource');
@@ -34,18 +44,6 @@ var RelayStoreSubscriptions = require('./RelayStoreSubscriptions');
34
44
 
35
45
  var RelayStoreUtils = require('./RelayStoreUtils');
36
46
 
37
- var deepFreeze = require('../util/deepFreeze');
38
-
39
- var defaultGetDataID = require('./defaultGetDataID');
40
-
41
- var invariant = require('invariant');
42
-
43
- var resolveImmediate = require('../util/resolveImmediate');
44
-
45
- var _require = require('../multi-actor-environment/ActorIdentifier'),
46
- INTERNAL_ACTOR_IDENTIFIER_DO_NOT_USE = _require.INTERNAL_ACTOR_IDENTIFIER_DO_NOT_USE,
47
- assertInternalActorIndentifier = _require.assertInternalActorIndentifier;
48
-
49
47
  var _require2 = require('./RelayStoreUtils'),
50
48
  ROOT_ID = _require2.ROOT_ID,
51
49
  ROOT_TYPE = _require2.ROOT_TYPE;
@@ -53,6 +51,8 @@ var _require2 = require('./RelayStoreUtils'),
53
51
  var _require3 = require('./ResolverCache'),
54
52
  RecordResolverCache = _require3.RecordResolverCache;
55
53
 
54
+ var invariant = require('invariant');
55
+
56
56
  var DEFAULT_RELEASE_BUFFER_SIZE = 10;
57
57
  /**
58
58
  * @public
@@ -680,8 +680,7 @@ function updateTargetFromSource(target, source, currentWriteEpoch, idsMarkedForI
680
680
  }
681
681
 
682
682
  RelayModernRecord.setValue(nextRecord, RelayStoreUtils.INVALIDATED_AT_KEY, currentWriteEpoch);
683
- invalidatedRecordIDs.add(dataID); // $FlowFixMe[incompatible-call]
684
-
683
+ invalidatedRecordIDs.add(dataID);
685
684
  target.set(dataID, nextRecord);
686
685
  });
687
686
  } // Update the target based on the changes present in source
@@ -12,16 +12,16 @@
12
12
 
13
13
  var _global$ErrorUtils$ap, _global, _global$ErrorUtils;
14
14
 
15
- var RelayReader = require('./RelayReader');
16
-
17
- var RelayRecordSource = require('./RelayRecordSource');
18
-
19
15
  var RelayRecordSourceMutator = require('../mutations/RelayRecordSourceMutator');
20
16
 
21
17
  var RelayRecordSourceProxy = require('../mutations/RelayRecordSourceProxy');
22
18
 
23
19
  var RelayRecordSourceSelectorProxy = require('../mutations/RelayRecordSourceSelectorProxy');
24
20
 
21
+ var RelayReader = require('./RelayReader');
22
+
23
+ var RelayRecordSource = require('./RelayRecordSource');
24
+
25
25
  var invariant = require('invariant');
26
26
 
27
27
  var warning = require("fbjs/lib/warning");
@@ -45,9 +45,15 @@ var RelayPublishQueue = /*#__PURE__*/function () {
45
45
  // True if the next `run()` should apply the backup and rerun all optimistic
46
46
  // updates performing a rebase.
47
47
  // Payloads to apply or Sources to publish to the store with the next `run()`.
48
+ // $FlowFixMe[unclear-type] See explanation below.
48
49
  // Optimistic updaters to add with the next `run()`.
50
+ // $FlowFixMe[unclear-type] See explanation below.
49
51
  // Optimistic updaters that are already added and might be rerun in order to
50
52
  // rebase them.
53
+ // $FlowFixMe[unclear-type] See explanation below.
54
+ // For _pendingOptimisticUpdates, _appliedOptimisticUpdates, and _pendingData,
55
+ // we want to parametrize by "any" since the type is effectively
56
+ // "the union of all T's that PublishQueue's methods were called with".
51
57
  // Garbage collection hold, should rerun gc on dispose
52
58
  function RelayPublishQueue(store, handlerProvider, getDataID) {
53
59
  this._hasStoreSnapshot = false;
@@ -301,7 +307,7 @@ var RelayPublishQueue = /*#__PURE__*/function () {
301
307
 
302
308
  var sink = RelayRecordSource.create();
303
309
  var mutator = new RelayRecordSourceMutator(this._store.getSource(), sink);
304
- var recordSourceProxy = new RelayRecordSourceProxy(mutator, this._getDataID, this._handlerProvider);
310
+ var recordSourceProxy = new RelayRecordSourceProxy(mutator, this._getDataID, this._handlerProvider); // $FlowFixMe[unclear-type] see explanation above.
305
311
 
306
312
  var processUpdate = function processUpdate(optimisticUpdate) {
307
313
  if (optimisticUpdate.storeUpdater) {
@@ -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
 
@@ -322,7 +347,7 @@ var RelayReader = /*#__PURE__*/function () {
322
347
  this._isMissingData = parentIsMissingData;
323
348
  } else if (implementsInterface == null) {
324
349
  // Don't know if the type implements the interface or not
325
- this._isMissingData = true;
350
+ this._markDataAsMissing();
326
351
  }
327
352
  }
328
353
 
@@ -359,10 +384,22 @@ var RelayReader = /*#__PURE__*/function () {
359
384
  case CLIENT_EXTENSION:
360
385
  {
361
386
  var isMissingData = this._isMissingData;
387
+ var alreadyMissingClientEdges = this._missingClientEdges.length;
388
+
389
+ if (RelayFeatureFlags.ENABLE_CLIENT_EDGES) {
390
+ this._clientEdgeTraversalPath.push(null);
391
+ }
392
+
393
+ var _hasExpectedData2 = this._traverseSelections(selection.selections, record, data); // The only case where we want to suspend due to missing data off of
394
+ // a client extension is if we reached a client edge that we might be
395
+ // able to fetch:
396
+
362
397
 
363
- var _hasExpectedData2 = this._traverseSelections(selection.selections, record, data);
398
+ this._isMissingData = isMissingData || this._missingClientEdges.length > alreadyMissingClientEdges;
364
399
 
365
- this._isMissingData = isMissingData;
400
+ if (RelayFeatureFlags.ENABLE_CLIENT_EDGES) {
401
+ this._clientEdgeTraversalPath.pop();
402
+ }
366
403
 
367
404
  if (!_hasExpectedData2) {
368
405
  return false;
@@ -396,6 +433,15 @@ var RelayReader = /*#__PURE__*/function () {
396
433
 
397
434
  break;
398
435
 
436
+ case CLIENT_EDGE:
437
+ if (RelayFeatureFlags.ENABLE_CLIENT_EDGES) {
438
+ this._readClientEdge(selection, record, data);
439
+ } else {
440
+ throw new Error('Client edges are not yet supported.');
441
+ }
442
+
443
+ break;
444
+
399
445
  default:
400
446
  selection;
401
447
  !false ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayReader(): Unexpected ast kind `%s`.', selection.kind) : invariant(false) : void 0;
@@ -435,6 +481,8 @@ var RelayReader = /*#__PURE__*/function () {
435
481
  _proto._readResolverField = function _readResolverField(field, record, data) {
436
482
  var _this = this;
437
483
 
484
+ var _field$alias;
485
+
438
486
  var resolverModule = field.resolverModule,
439
487
  fragment = field.fragment;
440
488
  var storageKey = getStorageKey(field, this._variables);
@@ -502,14 +550,53 @@ var RelayReader = /*#__PURE__*/function () {
502
550
  this._seenRecords.add(seenRecord);
503
551
  }
504
552
 
505
- data[storageKey] = result;
506
- return result;
553
+ var applicationName = (_field$alias = field.alias) !== null && _field$alias !== void 0 ? _field$alias : field.name;
554
+ data[applicationName] = result;
555
+ };
556
+
557
+ _proto._readClientEdge = function _readClientEdge(field, record, data) {
558
+ var _backingField$alias;
559
+
560
+ var backingField = field.backingField; // Because ReaderClientExtension doesn't have `alias` or `name` and so I don't know
561
+ // how to get its applicationName or storageKey yet:
562
+
563
+ !(backingField.kind !== 'ClientExtension') ? process.env.NODE_ENV !== "production" ? invariant(false, 'Client extension client edges are not yet implemented.') : invariant(false) : void 0;
564
+ var applicationName = (_backingField$alias = backingField.alias) !== null && _backingField$alias !== void 0 ? _backingField$alias : backingField.name;
565
+ var backingFieldData = {};
566
+
567
+ this._traverseSelections([backingField], record, backingFieldData);
568
+
569
+ var destinationDataID = backingFieldData[applicationName];
570
+
571
+ if (destinationDataID == null) {
572
+ data[applicationName] = destinationDataID;
573
+ return;
574
+ }
575
+
576
+ !(typeof destinationDataID === 'string') ? process.env.NODE_ENV !== "production" ? invariant(false, 'Plural client edges not are yet implemented') : invariant(false) : void 0; // FIXME support plural
577
+ // Not wrapping the push/pop in a try/finally because if we throw, the
578
+ // Reader object is not usable after that anyway.
579
+
580
+ this._clientEdgeTraversalPath.push({
581
+ readerClientEdge: field,
582
+ clientEdgeDestinationID: destinationDataID
583
+ });
584
+
585
+ var prevData = data[applicationName];
586
+ !(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;
587
+
588
+ var value = this._traverse(field.linkedField, destinationDataID, // $FlowFixMe[incompatible-variance]
589
+ prevData);
590
+
591
+ data[applicationName] = value;
592
+
593
+ this._clientEdgeTraversalPath.pop();
507
594
  };
508
595
 
509
596
  _proto._readFlightField = function _readFlightField(field, record, data) {
510
- var _field$alias;
597
+ var _field$alias2;
511
598
 
512
- var applicationName = (_field$alias = field.alias) !== null && _field$alias !== void 0 ? _field$alias : field.name;
599
+ var applicationName = (_field$alias2 = field.alias) !== null && _field$alias2 !== void 0 ? _field$alias2 : field.name;
513
600
  var storageKey = getStorageKey(field, this._variables);
514
601
  var reactFlightClientResponseRecordID = RelayModernRecord.getLinkedRecordID(record, storageKey);
515
602
 
@@ -517,7 +604,7 @@ var RelayReader = /*#__PURE__*/function () {
517
604
  data[applicationName] = reactFlightClientResponseRecordID;
518
605
 
519
606
  if (reactFlightClientResponseRecordID === undefined) {
520
- this._isMissingData = true;
607
+ this._markDataAsMissing();
521
608
  }
522
609
 
523
610
  return reactFlightClientResponseRecordID;
@@ -531,7 +618,7 @@ var RelayReader = /*#__PURE__*/function () {
531
618
  data[applicationName] = reactFlightClientResponseRecord;
532
619
 
533
620
  if (reactFlightClientResponseRecord === undefined) {
534
- this._isMissingData = true;
621
+ this._markDataAsMissing();
535
622
  }
536
623
 
537
624
  return reactFlightClientResponseRecord;
@@ -543,14 +630,14 @@ var RelayReader = /*#__PURE__*/function () {
543
630
  };
544
631
 
545
632
  _proto._readScalar = function _readScalar(field, record, data) {
546
- var _field$alias2;
633
+ var _field$alias3;
547
634
 
548
- var applicationName = (_field$alias2 = field.alias) !== null && _field$alias2 !== void 0 ? _field$alias2 : field.name;
635
+ var applicationName = (_field$alias3 = field.alias) !== null && _field$alias3 !== void 0 ? _field$alias3 : field.name;
549
636
  var storageKey = getStorageKey(field, this._variables);
550
637
  var value = RelayModernRecord.getValue(record, storageKey);
551
638
 
552
639
  if (value === undefined) {
553
- this._isMissingData = true;
640
+ this._markDataAsMissing();
554
641
  }
555
642
 
556
643
  data[applicationName] = value;
@@ -558,9 +645,9 @@ var RelayReader = /*#__PURE__*/function () {
558
645
  };
559
646
 
560
647
  _proto._readLink = function _readLink(field, record, data) {
561
- var _field$alias3;
648
+ var _field$alias4;
562
649
 
563
- var applicationName = (_field$alias3 = field.alias) !== null && _field$alias3 !== void 0 ? _field$alias3 : field.name;
650
+ var applicationName = (_field$alias4 = field.alias) !== null && _field$alias4 !== void 0 ? _field$alias4 : field.name;
564
651
  var storageKey = getStorageKey(field, this._variables);
565
652
  var linkedID = RelayModernRecord.getLinkedRecordID(record, storageKey);
566
653
 
@@ -568,7 +655,7 @@ var RelayReader = /*#__PURE__*/function () {
568
655
  data[applicationName] = linkedID;
569
656
 
570
657
  if (linkedID === undefined) {
571
- this._isMissingData = true;
658
+ this._markDataAsMissing();
572
659
  }
573
660
 
574
661
  return linkedID;
@@ -584,9 +671,9 @@ var RelayReader = /*#__PURE__*/function () {
584
671
  };
585
672
 
586
673
  _proto._readActorChange = function _readActorChange(field, record, data) {
587
- var _field$alias4;
674
+ var _field$alias5;
588
675
 
589
- var applicationName = (_field$alias4 = field.alias) !== null && _field$alias4 !== void 0 ? _field$alias4 : field.name;
676
+ var applicationName = (_field$alias5 = field.alias) !== null && _field$alias5 !== void 0 ? _field$alias5 : field.name;
590
677
  var storageKey = getStorageKey(field, this._variables);
591
678
  var externalRef = RelayModernRecord.getActorLinkedRecordID(record, storageKey);
592
679
 
@@ -594,7 +681,7 @@ var RelayReader = /*#__PURE__*/function () {
594
681
  data[applicationName] = externalRef;
595
682
 
596
683
  if (externalRef === undefined) {
597
- this._isMissingData = true;
684
+ this._markDataAsMissing();
598
685
  }
599
686
 
600
687
  return data[applicationName];
@@ -618,9 +705,9 @@ var RelayReader = /*#__PURE__*/function () {
618
705
  _proto._readPluralLink = function _readPluralLink(field, record, data) {
619
706
  var _this2 = this;
620
707
 
621
- var _field$alias5;
708
+ var _field$alias6;
622
709
 
623
- var applicationName = (_field$alias5 = field.alias) !== null && _field$alias5 !== void 0 ? _field$alias5 : field.name;
710
+ var applicationName = (_field$alias6 = field.alias) !== null && _field$alias6 !== void 0 ? _field$alias6 : field.name;
624
711
  var storageKey = getStorageKey(field, this._variables);
625
712
  var linkedIDs = RelayModernRecord.getLinkedRecordIDs(record, storageKey);
626
713
 
@@ -628,7 +715,7 @@ var RelayReader = /*#__PURE__*/function () {
628
715
  data[applicationName] = linkedIDs;
629
716
 
630
717
  if (linkedIDs === undefined) {
631
- this._isMissingData = true;
718
+ this._markDataAsMissing();
632
719
  }
633
720
 
634
721
  return linkedIDs;
@@ -640,7 +727,7 @@ var RelayReader = /*#__PURE__*/function () {
640
727
  linkedIDs.forEach(function (linkedID, nextIndex) {
641
728
  if (linkedID == null) {
642
729
  if (linkedID === undefined) {
643
- _this2._isMissingData = true;
730
+ _this2._markDataAsMissing();
644
731
  } // $FlowFixMe[cannot-write]
645
732
 
646
733
 
@@ -671,7 +758,7 @@ var RelayReader = /*#__PURE__*/function () {
671
758
 
672
759
  if (component == null) {
673
760
  if (component === undefined) {
674
- this._isMissingData = true;
761
+ this._markDataAsMissing();
675
762
  }
676
763
 
677
764
  return;
@@ -709,6 +796,12 @@ var RelayReader = /*#__PURE__*/function () {
709
796
  fragmentPointers[fragmentSpread.name] = fragmentSpread.args ? getArgumentValues(fragmentSpread.args, this._variables) : {};
710
797
  data[FRAGMENT_OWNER_KEY] = this._owner;
711
798
  data[IS_WITHIN_UNMATCHED_TYPE_REFINEMENT] = this._isWithinUnmatchedTypeRefinement;
799
+
800
+ if (RelayFeatureFlags.ENABLE_CLIENT_EDGES) {
801
+ if (this._clientEdgeTraversalPath.length > 0 && this._clientEdgeTraversalPath[this._clientEdgeTraversalPath.length - 1] !== null) {
802
+ data[CLIENT_EDGE_TRAVERSAL_PATH] = (0, _toConsumableArray2["default"])(this._clientEdgeTraversalPath);
803
+ }
804
+ }
712
805
  };
713
806
 
714
807
  _proto._createInlineDataOrResolverFragmentPointer = function _createInlineDataOrResolverFragmentPointer(fragmentSpreadOrFragment, record, data) {
@@ -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
 
@@ -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
 
@@ -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';
@@ -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