relay-runtime 11.0.1 → 13.0.0-rc.1

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 (169) 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 +60 -36
  6. package/lib/handlers/RelayDefaultHandlerProvider.js +1 -1
  7. package/lib/handlers/connection/ConnectionHandler.js +13 -19
  8. package/lib/handlers/connection/MutationHandlers.js +4 -7
  9. package/lib/index.js +58 -43
  10. package/lib/multi-actor-environment/ActorIdentifier.js +33 -0
  11. package/lib/multi-actor-environment/ActorSpecificEnvironment.js +152 -0
  12. package/lib/multi-actor-environment/ActorUtils.js +27 -0
  13. package/lib/multi-actor-environment/MultiActorEnvironment.js +419 -0
  14. package/lib/multi-actor-environment/MultiActorEnvironmentTypes.js +11 -0
  15. package/lib/multi-actor-environment/index.js +21 -0
  16. package/lib/mutations/RelayDeclarativeMutationConfig.js +4 -1
  17. package/lib/mutations/RelayRecordProxy.js +3 -2
  18. package/lib/mutations/RelayRecordSourceMutator.js +3 -2
  19. package/lib/mutations/RelayRecordSourceProxy.js +12 -4
  20. package/lib/mutations/RelayRecordSourceSelectorProxy.js +18 -5
  21. package/lib/mutations/applyOptimisticMutation.js +6 -6
  22. package/lib/mutations/commitMutation.js +14 -10
  23. package/lib/mutations/readUpdatableQuery_EXPERIMENTAL.js +238 -0
  24. package/lib/mutations/validateMutation.js +10 -5
  25. package/lib/network/ConvertToExecuteFunction.js +2 -1
  26. package/lib/network/RelayNetwork.js +3 -2
  27. package/lib/network/RelayQueryResponseCache.js +21 -5
  28. package/lib/network/wrapNetworkWithLogObserver.js +79 -0
  29. package/lib/query/GraphQLTag.js +3 -2
  30. package/lib/query/fetchQuery.js +6 -5
  31. package/lib/query/fetchQueryInternal.js +1 -1
  32. package/lib/query/fetchQuery_DEPRECATED.js +2 -1
  33. package/lib/store/ClientID.js +7 -1
  34. package/lib/store/DataChecker.js +123 -54
  35. package/lib/store/{RelayModernQueryExecutor.js → OperationExecutor.js} +518 -200
  36. package/lib/store/RelayConcreteVariables.js +26 -8
  37. package/lib/store/RelayExperimentalGraphResponseHandler.js +153 -0
  38. package/lib/store/RelayExperimentalGraphResponseTransform.js +391 -0
  39. package/lib/store/RelayModernEnvironment.js +175 -240
  40. package/lib/store/RelayModernFragmentSpecResolver.js +52 -26
  41. package/lib/store/RelayModernOperationDescriptor.js +2 -1
  42. package/lib/store/RelayModernRecord.js +47 -12
  43. package/lib/store/RelayModernSelector.js +14 -8
  44. package/lib/store/RelayModernStore.js +56 -28
  45. package/lib/store/RelayOperationTracker.js +34 -24
  46. package/lib/store/RelayPublishQueue.js +41 -13
  47. package/lib/store/RelayReader.js +288 -48
  48. package/lib/store/RelayRecordSource.js +87 -3
  49. package/lib/store/RelayReferenceMarker.js +34 -22
  50. package/lib/store/RelayResponseNormalizer.js +211 -110
  51. package/lib/store/RelayStoreReactFlightUtils.js +4 -10
  52. package/lib/store/RelayStoreSubscriptions.js +14 -9
  53. package/lib/store/RelayStoreUtils.js +12 -7
  54. package/lib/store/ResolverCache.js +213 -0
  55. package/lib/store/ResolverFragments.js +61 -0
  56. package/lib/store/cloneRelayHandleSourceField.js +5 -4
  57. package/lib/store/cloneRelayScalarHandleSourceField.js +5 -4
  58. package/lib/store/createRelayContext.js +4 -2
  59. package/lib/store/readInlineData.js +6 -2
  60. package/lib/subscription/requestSubscription.js +34 -25
  61. package/lib/util/RelayConcreteNode.js +3 -0
  62. package/lib/util/RelayFeatureFlags.js +10 -4
  63. package/lib/util/RelayProfiler.js +17 -187
  64. package/lib/util/RelayReplaySubject.js +22 -7
  65. package/lib/util/RelayRuntimeTypes.js +0 -6
  66. package/lib/util/StringInterner.js +71 -0
  67. package/lib/util/getFragmentIdentifier.js +15 -7
  68. package/lib/util/getOperation.js +2 -1
  69. package/lib/util/getPaginationMetadata.js +41 -0
  70. package/lib/util/getPaginationVariables.js +66 -0
  71. package/lib/util/getPendingOperationsForFragment.js +55 -0
  72. package/lib/util/getRefetchMetadata.js +36 -0
  73. package/lib/util/getRelayHandleKey.js +2 -2
  74. package/lib/util/getRequestIdentifier.js +2 -2
  75. package/lib/util/getValueAtPath.js +51 -0
  76. package/lib/util/isEmptyObject.js +1 -1
  77. package/lib/util/registerEnvironmentWithDevTools.js +26 -0
  78. package/lib/util/withDuration.js +31 -0
  79. package/multi-actor-environment/ActorIdentifier.js.flow +43 -0
  80. package/multi-actor-environment/ActorSpecificEnvironment.js.flow +225 -0
  81. package/multi-actor-environment/ActorUtils.js.flow +33 -0
  82. package/multi-actor-environment/MultiActorEnvironment.js.flow +506 -0
  83. package/multi-actor-environment/MultiActorEnvironmentTypes.js.flow +261 -0
  84. package/multi-actor-environment/index.js.flow +26 -0
  85. package/mutations/RelayDeclarativeMutationConfig.js.flow +32 -26
  86. package/mutations/RelayRecordProxy.js.flow +4 -5
  87. package/mutations/RelayRecordSourceMutator.js.flow +4 -6
  88. package/mutations/RelayRecordSourceProxy.js.flow +19 -10
  89. package/mutations/RelayRecordSourceSelectorProxy.js.flow +22 -7
  90. package/mutations/applyOptimisticMutation.js.flow +13 -14
  91. package/mutations/commitLocalUpdate.js.flow +1 -1
  92. package/mutations/commitMutation.js.flow +35 -46
  93. package/mutations/readUpdatableQuery_EXPERIMENTAL.js.flow +309 -0
  94. package/mutations/validateMutation.js.flow +26 -16
  95. package/network/ConvertToExecuteFunction.js.flow +2 -2
  96. package/network/RelayNetwork.js.flow +4 -5
  97. package/network/RelayNetworkTypes.js.flow +5 -4
  98. package/network/RelayObservable.js.flow +1 -1
  99. package/network/RelayQueryResponseCache.js.flow +34 -21
  100. package/network/wrapNetworkWithLogObserver.js.flow +100 -0
  101. package/package.json +3 -2
  102. package/query/GraphQLTag.js.flow +9 -9
  103. package/query/PreloadableQueryRegistry.js.flow +2 -1
  104. package/query/fetchQuery.js.flow +11 -13
  105. package/query/fetchQueryInternal.js.flow +6 -9
  106. package/query/fetchQuery_DEPRECATED.js.flow +6 -6
  107. package/relay-runtime.js +2 -2
  108. package/relay-runtime.min.js +2 -2
  109. package/store/ClientID.js.flow +14 -3
  110. package/store/DataChecker.js.flow +141 -59
  111. package/store/{RelayModernQueryExecutor.js.flow → OperationExecutor.js.flow} +605 -303
  112. package/store/RelayConcreteVariables.js.flow +27 -8
  113. package/store/RelayExperimentalGraphResponseHandler.js.flow +124 -0
  114. package/store/RelayExperimentalGraphResponseTransform.js.flow +475 -0
  115. package/store/RelayModernEnvironment.js.flow +173 -240
  116. package/store/RelayModernFragmentSpecResolver.js.flow +55 -31
  117. package/store/RelayModernOperationDescriptor.js.flow +12 -7
  118. package/store/RelayModernRecord.js.flow +67 -11
  119. package/store/RelayModernSelector.js.flow +24 -14
  120. package/store/RelayModernStore.js.flow +66 -36
  121. package/store/RelayOperationTracker.js.flow +59 -43
  122. package/store/RelayOptimisticRecordSource.js.flow +2 -2
  123. package/store/RelayPublishQueue.js.flow +79 -34
  124. package/store/RelayReader.js.flow +351 -73
  125. package/store/RelayRecordSource.js.flow +72 -6
  126. package/store/RelayReferenceMarker.js.flow +40 -26
  127. package/store/RelayResponseNormalizer.js.flow +258 -99
  128. package/store/RelayStoreReactFlightUtils.js.flow +4 -11
  129. package/store/RelayStoreSubscriptions.js.flow +19 -11
  130. package/store/RelayStoreTypes.js.flow +209 -43
  131. package/store/RelayStoreUtils.js.flow +24 -11
  132. package/store/ResolverCache.js.flow +249 -0
  133. package/store/ResolverFragments.js.flow +121 -0
  134. package/store/StoreInspector.js.flow +2 -2
  135. package/store/TypeID.js.flow +1 -1
  136. package/store/ViewerPattern.js.flow +2 -2
  137. package/store/cloneRelayHandleSourceField.js.flow +5 -6
  138. package/store/cloneRelayScalarHandleSourceField.js.flow +5 -6
  139. package/store/createFragmentSpecResolver.js.flow +3 -4
  140. package/store/createRelayContext.js.flow +3 -3
  141. package/store/normalizeRelayPayload.js.flow +6 -7
  142. package/store/readInlineData.js.flow +7 -8
  143. package/subscription/requestSubscription.js.flow +53 -41
  144. package/util/NormalizationNode.js.flow +10 -3
  145. package/util/ReaderNode.js.flow +38 -2
  146. package/util/RelayConcreteNode.js.flow +5 -0
  147. package/util/RelayFeatureFlags.js.flow +24 -10
  148. package/util/RelayProfiler.js.flow +22 -194
  149. package/util/RelayReplaySubject.js.flow +9 -9
  150. package/util/RelayRuntimeTypes.js.flow +72 -3
  151. package/util/StringInterner.js.flow +69 -0
  152. package/util/createPayloadFor3DField.js.flow +3 -3
  153. package/util/getFragmentIdentifier.js.flow +27 -15
  154. package/util/getOperation.js.flow +2 -2
  155. package/util/getPaginationMetadata.js.flow +72 -0
  156. package/util/getPaginationVariables.js.flow +108 -0
  157. package/util/getPendingOperationsForFragment.js.flow +62 -0
  158. package/util/getRefetchMetadata.js.flow +79 -0
  159. package/util/getRelayHandleKey.js.flow +1 -2
  160. package/util/getRequestIdentifier.js.flow +3 -3
  161. package/util/getValueAtPath.js.flow +46 -0
  162. package/util/isEmptyObject.js.flow +1 -0
  163. package/util/registerEnvironmentWithDevTools.js.flow +33 -0
  164. package/util/resolveImmediate.js.flow +1 -1
  165. package/util/withDuration.js.flow +32 -0
  166. package/lib/store/RelayRecordSourceMapImpl.js +0 -107
  167. package/lib/store/RelayStoreSubscriptionsUsingMapByID.js +0 -318
  168. package/store/RelayRecordSourceMapImpl.js.flow +0 -91
  169. package/store/RelayStoreSubscriptionsUsingMapByID.js.flow +0 -283
@@ -10,13 +10,15 @@
10
10
  // flowlint ambiguous-object-type:error
11
11
  'use strict';
12
12
 
13
- var RelayFeatureFlags = require('../util/RelayFeatureFlags');
13
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
14
14
 
15
- var RelayModernRecord = require('./RelayModernRecord');
15
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
16
16
 
17
- var invariant = require("fbjs/lib/invariant");
17
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
18
18
 
19
19
  var _require = require('../util/RelayConcreteNode'),
20
+ ACTOR_CHANGE = _require.ACTOR_CHANGE,
21
+ CLIENT_EDGE = _require.CLIENT_EDGE,
20
22
  CLIENT_EXTENSION = _require.CLIENT_EXTENSION,
21
23
  CONDITION = _require.CONDITION,
22
24
  DEFER = _require.DEFER,
@@ -26,30 +28,46 @@ var _require = require('../util/RelayConcreteNode'),
26
28
  INLINE_FRAGMENT = _require.INLINE_FRAGMENT,
27
29
  LINKED_FIELD = _require.LINKED_FIELD,
28
30
  MODULE_IMPORT = _require.MODULE_IMPORT,
31
+ RELAY_RESOLVER = _require.RELAY_RESOLVER,
29
32
  REQUIRED_FIELD = _require.REQUIRED_FIELD,
30
33
  SCALAR_FIELD = _require.SCALAR_FIELD,
31
34
  STREAM = _require.STREAM;
32
35
 
36
+ var RelayFeatureFlags = require('../util/RelayFeatureFlags');
37
+
38
+ var ClientID = require('./ClientID');
39
+
40
+ var RelayModernRecord = require('./RelayModernRecord');
41
+
33
42
  var _require2 = require('./RelayStoreReactFlightUtils'),
34
43
  getReactFlightClientResponse = _require2.getReactFlightClientResponse;
35
44
 
36
45
  var _require3 = require('./RelayStoreUtils'),
37
- FRAGMENTS_KEY = _require3.FRAGMENTS_KEY,
46
+ CLIENT_EDGE_TRAVERSAL_PATH = _require3.CLIENT_EDGE_TRAVERSAL_PATH,
38
47
  FRAGMENT_OWNER_KEY = _require3.FRAGMENT_OWNER_KEY,
39
48
  FRAGMENT_PROP_NAME_KEY = _require3.FRAGMENT_PROP_NAME_KEY,
49
+ FRAGMENTS_KEY = _require3.FRAGMENTS_KEY,
40
50
  ID_KEY = _require3.ID_KEY,
41
51
  IS_WITHIN_UNMATCHED_TYPE_REFINEMENT = _require3.IS_WITHIN_UNMATCHED_TYPE_REFINEMENT,
42
52
  MODULE_COMPONENT_KEY = _require3.MODULE_COMPONENT_KEY,
43
53
  ROOT_ID = _require3.ROOT_ID,
44
54
  getArgumentValues = _require3.getArgumentValues,
45
- getStorageKey = _require3.getStorageKey,
46
- getModuleComponentKey = _require3.getModuleComponentKey;
55
+ getModuleComponentKey = _require3.getModuleComponentKey,
56
+ getStorageKey = _require3.getStorageKey;
57
+
58
+ var _require4 = require('./ResolverCache'),
59
+ NoopResolverCache = _require4.NoopResolverCache;
60
+
61
+ var _require5 = require('./ResolverFragments'),
62
+ withResolverContext = _require5.withResolverContext;
63
+
64
+ var _require6 = require('./TypeID'),
65
+ generateTypeID = _require6.generateTypeID;
47
66
 
48
- var _require4 = require('./TypeID'),
49
- generateTypeID = _require4.generateTypeID;
67
+ var invariant = require('invariant');
50
68
 
51
- function read(recordSource, selector) {
52
- var reader = new RelayReader(recordSource, selector);
69
+ function read(recordSource, selector, resolverCache) {
70
+ var reader = new RelayReader(recordSource, selector, resolverCache !== null && resolverCache !== void 0 ? resolverCache : new NoopResolverCache());
53
71
  return reader.read();
54
72
  }
55
73
  /**
@@ -58,7 +76,11 @@ function read(recordSource, selector) {
58
76
 
59
77
 
60
78
  var RelayReader = /*#__PURE__*/function () {
61
- 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 = [];
62
84
  this._isMissingData = false;
63
85
  this._isWithinUnmatchedTypeRefinement = false;
64
86
  this._missingRequiredFields = null;
@@ -67,6 +89,7 @@ var RelayReader = /*#__PURE__*/function () {
67
89
  this._seenRecords = new Set();
68
90
  this._selector = selector;
69
91
  this._variables = selector.variables;
92
+ this._resolverCache = resolverCache;
70
93
  }
71
94
 
72
95
  var _proto = RelayReader.prototype;
@@ -95,7 +118,15 @@ var RelayReader = /*#__PURE__*/function () {
95
118
  if (isDataExpectedToBePresent && abstractKey == null && record != null) {
96
119
  var recordType = RelayModernRecord.getType(record);
97
120
 
98
- 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) {
99
130
  isDataExpectedToBePresent = false;
100
131
  }
101
132
  } // If this is an abstract fragment (and the precise refinement GK is enabled)
@@ -104,7 +135,7 @@ var RelayReader = /*#__PURE__*/function () {
104
135
  // the interface, that itself constitutes "expected" data being missing.
105
136
 
106
137
 
107
- if (isDataExpectedToBePresent && abstractKey != null && record != null && RelayFeatureFlags.ENABLE_PRECISE_TYPE_REFINEMENT) {
138
+ if (isDataExpectedToBePresent && abstractKey != null && record != null) {
108
139
  var _recordType = RelayModernRecord.getType(record);
109
140
 
110
141
  var typeID = generateTypeID(_recordType);
@@ -129,12 +160,30 @@ var RelayReader = /*#__PURE__*/function () {
129
160
  return {
130
161
  data: data,
131
162
  isMissingData: this._isMissingData && isDataExpectedToBePresent,
163
+ missingClientEdges: RelayFeatureFlags.ENABLE_CLIENT_EDGES && this._missingClientEdges.length ? this._missingClientEdges : null,
132
164
  seenRecords: this._seenRecords,
133
165
  selector: this._selector,
134
166
  missingRequiredFields: this._missingRequiredFields
135
167
  };
136
168
  };
137
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
+
138
187
  _proto._traverse = function _traverse(node, dataID, prevData) {
139
188
  var record = this._recordSource.get(dataID);
140
189
 
@@ -142,7 +191,7 @@ var RelayReader = /*#__PURE__*/function () {
142
191
 
143
192
  if (record == null) {
144
193
  if (record === undefined) {
145
- this._isMissingData = true;
194
+ this._markDataAsMissing();
146
195
  }
147
196
 
148
197
  return record;
@@ -156,8 +205,7 @@ var RelayReader = /*#__PURE__*/function () {
156
205
  };
157
206
 
158
207
  _proto._getVariableValue = function _getVariableValue(name) {
159
- !this._variables.hasOwnProperty(name) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayReader(): Undefined variable `%s`.', name) : invariant(false) : void 0; // $FlowFixMe[cannot-write]
160
-
208
+ !this._variables.hasOwnProperty(name) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayReader(): Undefined variable `%s`.', name) : invariant(false) : void 0;
161
209
  return this._variables[name];
162
210
  };
163
211
 
@@ -246,7 +294,7 @@ var RelayReader = /*#__PURE__*/function () {
246
294
  break;
247
295
 
248
296
  case CONDITION:
249
- var conditionValue = this._getVariableValue(selection.condition);
297
+ var conditionValue = Boolean(this._getVariableValue(selection.condition));
250
298
 
251
299
  if (conditionValue === selection.passingValue) {
252
300
  var hasExpectedData = this._traverseSelections(selection.selections, record, data);
@@ -273,7 +321,7 @@ var RelayReader = /*#__PURE__*/function () {
273
321
  return false;
274
322
  }
275
323
  }
276
- } else if (RelayFeatureFlags.ENABLE_PRECISE_TYPE_REFINEMENT) {
324
+ } else {
277
325
  // Similar to the logic in read(): data is only expected to be present
278
326
  // if the record is known to conform to the interface. If we don't know
279
327
  // whether the type conforms or not, that constitutes missing data.
@@ -299,17 +347,24 @@ var RelayReader = /*#__PURE__*/function () {
299
347
  this._isMissingData = parentIsMissingData;
300
348
  } else if (implementsInterface == null) {
301
349
  // Don't know if the type implements the interface or not
302
- this._isMissingData = true;
350
+ this._markDataAsMissing();
303
351
  }
304
- } else {
305
- // legacy behavior for abstract refinements: always read even
306
- // if the type doesn't conform and don't reset isMissingData
307
- this._traverseSelections(selection.selections, record, data);
308
352
  }
309
353
 
310
354
  break;
311
355
  }
312
356
 
357
+ case RELAY_RESOLVER:
358
+ {
359
+ if (!RelayFeatureFlags.ENABLE_RELAY_RESOLVERS) {
360
+ throw new Error('Relay Resolver fields are not yet supported.');
361
+ }
362
+
363
+ this._readResolverField(selection, record, data);
364
+
365
+ break;
366
+ }
367
+
313
368
  case FRAGMENT_SPREAD:
314
369
  this._createFragmentPointer(selection, record, data);
315
370
 
@@ -321,7 +376,7 @@ var RelayReader = /*#__PURE__*/function () {
321
376
  break;
322
377
 
323
378
  case INLINE_DATA_FRAGMENT_SPREAD:
324
- this._createInlineDataFragmentPointer(selection, record, data);
379
+ this._createInlineDataOrResolverFragmentPointer(selection, record, data);
325
380
 
326
381
  break;
327
382
 
@@ -329,10 +384,22 @@ var RelayReader = /*#__PURE__*/function () {
329
384
  case CLIENT_EXTENSION:
330
385
  {
331
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:
332
396
 
333
- var _hasExpectedData2 = this._traverseSelections(selection.selections, record, data);
334
397
 
335
- this._isMissingData = isMissingData;
398
+ this._isMissingData = isMissingData || this._missingClientEdges.length > alreadyMissingClientEdges;
399
+
400
+ if (RelayFeatureFlags.ENABLE_CLIENT_EDGES) {
401
+ this._clientEdgeTraversalPath.pop();
402
+ }
336
403
 
337
404
  if (!_hasExpectedData2) {
338
405
  return false;
@@ -361,6 +428,20 @@ var RelayReader = /*#__PURE__*/function () {
361
428
 
362
429
  break;
363
430
 
431
+ case ACTOR_CHANGE:
432
+ this._readActorChange(selection, record, data);
433
+
434
+ break;
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
+
364
445
  default:
365
446
  selection;
366
447
  !false ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayReader(): Unexpected ast kind `%s`.', selection.kind) : invariant(false) : void 0;
@@ -382,16 +463,140 @@ var RelayReader = /*#__PURE__*/function () {
382
463
  return this._readLink(selection.field, record, data);
383
464
  }
384
465
 
466
+ case RELAY_RESOLVER:
467
+ if (!RelayFeatureFlags.ENABLE_RELAY_RESOLVERS) {
468
+ throw new Error('Relay Resolver fields are not yet supported.');
469
+ }
470
+
471
+ this._readResolverField(selection.field, record, data);
472
+
473
+ break;
474
+
385
475
  default:
386
476
  selection.field.kind;
387
477
  !false ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayReader(): Unexpected ast kind `%s`.', selection.kind) : invariant(false) : void 0;
388
478
  }
389
479
  };
390
480
 
391
- _proto._readFlightField = function _readFlightField(field, record, data) {
481
+ _proto._readResolverField = function _readResolverField(field, record, data) {
482
+ var _this = this;
483
+
392
484
  var _field$alias;
393
485
 
486
+ var resolverModule = field.resolverModule,
487
+ fragment = field.fragment;
488
+ var storageKey = getStorageKey(field, this._variables);
489
+ var resolverID = ClientID.generateClientID(RelayModernRecord.getDataID(record), storageKey); // Found when reading the resolver fragment, which can happen either when
490
+ // evaluating the resolver and it calls readFragment, or when checking if the
491
+ // inputs have changed since a previous evaluation:
492
+
493
+ var fragmentValue;
494
+ var fragmentReaderSelector;
495
+ var fragmentSeenRecordIDs = new Set();
496
+
497
+ var getDataForResolverFragment = function getDataForResolverFragment(singularReaderSelector) {
498
+ if (fragmentValue != null) {
499
+ // It was already read when checking for input staleness; no need to read it again.
500
+ // Note that the variables like fragmentSeenRecordIDs in the outer closure will have
501
+ // already been set and will still be used in this case.
502
+ return fragmentValue;
503
+ }
504
+
505
+ fragmentReaderSelector = singularReaderSelector;
506
+ var existingSeenRecords = _this._seenRecords;
507
+
508
+ try {
509
+ var _resolverFragmentData;
510
+
511
+ _this._seenRecords = fragmentSeenRecordIDs;
512
+ var resolverFragmentData = {};
513
+
514
+ _this._createInlineDataOrResolverFragmentPointer(singularReaderSelector.node, record, resolverFragmentData);
515
+
516
+ fragmentValue = (_resolverFragmentData = resolverFragmentData[FRAGMENTS_KEY]) === null || _resolverFragmentData === void 0 ? void 0 : _resolverFragmentData[fragment.name];
517
+ !(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;
518
+ return fragmentValue;
519
+ } finally {
520
+ _this._seenRecords = existingSeenRecords;
521
+ }
522
+ };
523
+
524
+ var resolverContext = {
525
+ getDataForResolverFragment: getDataForResolverFragment
526
+ };
527
+
528
+ var _this$_resolverCache$ = this._resolverCache.readFromCacheOrEvaluate(record, field, this._variables, function () {
529
+ var key = {
530
+ __id: RelayModernRecord.getDataID(record),
531
+ __fragmentOwner: _this._owner,
532
+ __fragments: (0, _defineProperty2["default"])({}, fragment.name, {})
533
+ };
534
+ return withResolverContext(resolverContext, function () {
535
+ // $FlowFixMe[prop-missing] - resolver module's type signature is a lie
536
+ var resolverResult = resolverModule(key);
537
+ return {
538
+ resolverResult: resolverResult,
539
+ fragmentValue: fragmentValue,
540
+ resolverID: resolverID,
541
+ seenRecordIDs: fragmentSeenRecordIDs,
542
+ readerSelector: fragmentReaderSelector
543
+ };
544
+ });
545
+ }, getDataForResolverFragment),
546
+ result = _this$_resolverCache$[0],
547
+ seenRecord = _this$_resolverCache$[1];
548
+
549
+ if (seenRecord != null) {
550
+ this._seenRecords.add(seenRecord);
551
+ }
552
+
394
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();
594
+ };
595
+
596
+ _proto._readFlightField = function _readFlightField(field, record, data) {
597
+ var _field$alias2;
598
+
599
+ var applicationName = (_field$alias2 = field.alias) !== null && _field$alias2 !== void 0 ? _field$alias2 : field.name;
395
600
  var storageKey = getStorageKey(field, this._variables);
396
601
  var reactFlightClientResponseRecordID = RelayModernRecord.getLinkedRecordID(record, storageKey);
397
602
 
@@ -399,7 +604,7 @@ var RelayReader = /*#__PURE__*/function () {
399
604
  data[applicationName] = reactFlightClientResponseRecordID;
400
605
 
401
606
  if (reactFlightClientResponseRecordID === undefined) {
402
- this._isMissingData = true;
607
+ this._markDataAsMissing();
403
608
  }
404
609
 
405
610
  return reactFlightClientResponseRecordID;
@@ -413,7 +618,7 @@ var RelayReader = /*#__PURE__*/function () {
413
618
  data[applicationName] = reactFlightClientResponseRecord;
414
619
 
415
620
  if (reactFlightClientResponseRecord === undefined) {
416
- this._isMissingData = true;
621
+ this._markDataAsMissing();
417
622
  }
418
623
 
419
624
  return reactFlightClientResponseRecord;
@@ -425,14 +630,14 @@ var RelayReader = /*#__PURE__*/function () {
425
630
  };
426
631
 
427
632
  _proto._readScalar = function _readScalar(field, record, data) {
428
- var _field$alias2;
633
+ var _field$alias3;
429
634
 
430
- 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;
431
636
  var storageKey = getStorageKey(field, this._variables);
432
637
  var value = RelayModernRecord.getValue(record, storageKey);
433
638
 
434
639
  if (value === undefined) {
435
- this._isMissingData = true;
640
+ this._markDataAsMissing();
436
641
  }
437
642
 
438
643
  data[applicationName] = value;
@@ -440,9 +645,9 @@ var RelayReader = /*#__PURE__*/function () {
440
645
  };
441
646
 
442
647
  _proto._readLink = function _readLink(field, record, data) {
443
- var _field$alias3;
648
+ var _field$alias4;
444
649
 
445
- 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;
446
651
  var storageKey = getStorageKey(field, this._variables);
447
652
  var linkedID = RelayModernRecord.getLinkedRecordID(record, storageKey);
448
653
 
@@ -450,7 +655,7 @@ var RelayReader = /*#__PURE__*/function () {
450
655
  data[applicationName] = linkedID;
451
656
 
452
657
  if (linkedID === undefined) {
453
- this._isMissingData = true;
658
+ this._markDataAsMissing();
454
659
  }
455
660
 
456
661
  return linkedID;
@@ -465,12 +670,44 @@ var RelayReader = /*#__PURE__*/function () {
465
670
  return value;
466
671
  };
467
672
 
673
+ _proto._readActorChange = function _readActorChange(field, record, data) {
674
+ var _field$alias5;
675
+
676
+ var applicationName = (_field$alias5 = field.alias) !== null && _field$alias5 !== void 0 ? _field$alias5 : field.name;
677
+ var storageKey = getStorageKey(field, this._variables);
678
+ var externalRef = RelayModernRecord.getActorLinkedRecordID(record, storageKey);
679
+
680
+ if (externalRef == null) {
681
+ data[applicationName] = externalRef;
682
+
683
+ if (externalRef === undefined) {
684
+ this._markDataAsMissing();
685
+ }
686
+
687
+ return data[applicationName];
688
+ }
689
+
690
+ var actorIdentifier = externalRef[0],
691
+ dataID = externalRef[1];
692
+ var fragmentRef = {};
693
+
694
+ this._createFragmentPointer(field.fragmentSpread, {
695
+ __id: dataID
696
+ }, fragmentRef);
697
+
698
+ data[applicationName] = {
699
+ __fragmentRef: fragmentRef,
700
+ __viewer: actorIdentifier
701
+ };
702
+ return data[applicationName];
703
+ };
704
+
468
705
  _proto._readPluralLink = function _readPluralLink(field, record, data) {
469
- var _this = this;
706
+ var _this2 = this;
470
707
 
471
- var _field$alias4;
708
+ var _field$alias6;
472
709
 
473
- var applicationName = (_field$alias4 = field.alias) !== null && _field$alias4 !== void 0 ? _field$alias4 : field.name;
710
+ var applicationName = (_field$alias6 = field.alias) !== null && _field$alias6 !== void 0 ? _field$alias6 : field.name;
474
711
  var storageKey = getStorageKey(field, this._variables);
475
712
  var linkedIDs = RelayModernRecord.getLinkedRecordIDs(record, storageKey);
476
713
 
@@ -478,7 +715,7 @@ var RelayReader = /*#__PURE__*/function () {
478
715
  data[applicationName] = linkedIDs;
479
716
 
480
717
  if (linkedIDs === undefined) {
481
- this._isMissingData = true;
718
+ this._markDataAsMissing();
482
719
  }
483
720
 
484
721
  return linkedIDs;
@@ -490,7 +727,7 @@ var RelayReader = /*#__PURE__*/function () {
490
727
  linkedIDs.forEach(function (linkedID, nextIndex) {
491
728
  if (linkedID == null) {
492
729
  if (linkedID === undefined) {
493
- _this._isMissingData = true;
730
+ _this2._markDataAsMissing();
494
731
  } // $FlowFixMe[cannot-write]
495
732
 
496
733
 
@@ -502,7 +739,7 @@ var RelayReader = /*#__PURE__*/function () {
502
739
  !(prevItem == null || typeof prevItem === '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), prevItem) : invariant(false) : void 0; // $FlowFixMe[cannot-write]
503
740
  // $FlowFixMe[incompatible-variance]
504
741
 
505
- linkedArray[nextIndex] = _this._traverse(field, linkedID, prevItem);
742
+ linkedArray[nextIndex] = _this2._traverse(field, linkedID, prevItem);
506
743
  });
507
744
  data[applicationName] = linkedArray;
508
745
  return linkedArray;
@@ -521,7 +758,7 @@ var RelayReader = /*#__PURE__*/function () {
521
758
 
522
759
  if (component == null) {
523
760
  if (component === undefined) {
524
- this._isMissingData = true;
761
+ this._markDataAsMissing();
525
762
  }
526
763
 
527
764
  return;
@@ -535,7 +772,7 @@ var RelayReader = /*#__PURE__*/function () {
535
772
  this._createFragmentPointer({
536
773
  kind: 'FragmentSpread',
537
774
  name: moduleImport.fragmentName,
538
- args: null
775
+ args: moduleImport.args
539
776
  }, record, data);
540
777
 
541
778
  data[FRAGMENT_PROP_NAME_KEY] = moduleImport.fragmentPropName;
@@ -558,13 +795,16 @@ var RelayReader = /*#__PURE__*/function () {
558
795
 
559
796
  fragmentPointers[fragmentSpread.name] = fragmentSpread.args ? getArgumentValues(fragmentSpread.args, this._variables) : {};
560
797
  data[FRAGMENT_OWNER_KEY] = this._owner;
798
+ data[IS_WITHIN_UNMATCHED_TYPE_REFINEMENT] = this._isWithinUnmatchedTypeRefinement;
561
799
 
562
- if (RelayFeatureFlags.ENABLE_PRECISE_TYPE_REFINEMENT) {
563
- data[IS_WITHIN_UNMATCHED_TYPE_REFINEMENT] = this._isWithinUnmatchedTypeRefinement;
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
+ }
564
804
  }
565
805
  };
566
806
 
567
- _proto._createInlineDataFragmentPointer = function _createInlineDataFragmentPointer(inlineDataFragmentSpread, record, data) {
807
+ _proto._createInlineDataOrResolverFragmentPointer = function _createInlineDataOrResolverFragmentPointer(fragmentSpreadOrFragment, record, data) {
568
808
  var fragmentPointers = data[FRAGMENTS_KEY];
569
809
 
570
810
  if (fragmentPointers == null) {
@@ -579,10 +819,10 @@ var RelayReader = /*#__PURE__*/function () {
579
819
 
580
820
  var inlineData = {};
581
821
 
582
- this._traverseSelections(inlineDataFragmentSpread.selections, record, inlineData); // $FlowFixMe[cannot-write] - writing into read-only field
822
+ this._traverseSelections(fragmentSpreadOrFragment.selections, record, inlineData); // $FlowFixMe[cannot-write] - writing into read-only field
583
823
 
584
824
 
585
- fragmentPointers[inlineDataFragmentSpread.name] = inlineData;
825
+ fragmentPointers[fragmentSpreadOrFragment.name] = inlineData;
586
826
  };
587
827
 
588
828
  return RelayReader;
@@ -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;