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
@@ -16,61 +16,67 @@ var _createForOfIteratorHelper2 = _interopRequireDefault(require("@babel/runtime
16
16
 
17
17
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
18
18
 
19
+ var _require = require('../multi-actor-environment/ActorUtils'),
20
+ ACTOR_IDENTIFIER_FIELD_NAME = _require.ACTOR_IDENTIFIER_FIELD_NAME,
21
+ getActorIdentifierFromPayload = _require.getActorIdentifierFromPayload;
22
+
23
+ var _require2 = require('../util/RelayConcreteNode'),
24
+ ACTOR_CHANGE = _require2.ACTOR_CHANGE,
25
+ CLIENT_COMPONENT = _require2.CLIENT_COMPONENT,
26
+ CLIENT_EXTENSION = _require2.CLIENT_EXTENSION,
27
+ CONDITION = _require2.CONDITION,
28
+ DEFER = _require2.DEFER,
29
+ FLIGHT_FIELD = _require2.FLIGHT_FIELD,
30
+ FRAGMENT_SPREAD = _require2.FRAGMENT_SPREAD,
31
+ INLINE_FRAGMENT = _require2.INLINE_FRAGMENT,
32
+ LINKED_FIELD = _require2.LINKED_FIELD,
33
+ LINKED_HANDLE = _require2.LINKED_HANDLE,
34
+ MODULE_IMPORT = _require2.MODULE_IMPORT,
35
+ SCALAR_FIELD = _require2.SCALAR_FIELD,
36
+ SCALAR_HANDLE = _require2.SCALAR_HANDLE,
37
+ STREAM = _require2.STREAM,
38
+ TYPE_DISCRIMINATOR = _require2.TYPE_DISCRIMINATOR;
39
+
19
40
  var RelayFeatureFlags = require('../util/RelayFeatureFlags');
20
41
 
42
+ var _require3 = require('./ClientID'),
43
+ generateClientID = _require3.generateClientID,
44
+ isClientID = _require3.isClientID;
45
+
46
+ var _require4 = require('./RelayConcreteVariables'),
47
+ getLocalVariables = _require4.getLocalVariables;
48
+
21
49
  var RelayModernRecord = require('./RelayModernRecord');
22
50
 
23
- var RelayProfiler = require('../util/RelayProfiler');
51
+ var _require5 = require('./RelayModernSelector'),
52
+ createNormalizationSelector = _require5.createNormalizationSelector;
53
+
54
+ var _require6 = require('./RelayStoreReactFlightUtils'),
55
+ REACT_FLIGHT_EXECUTABLE_DEFINITIONS_STORAGE_KEY = _require6.REACT_FLIGHT_EXECUTABLE_DEFINITIONS_STORAGE_KEY,
56
+ REACT_FLIGHT_TREE_STORAGE_KEY = _require6.REACT_FLIGHT_TREE_STORAGE_KEY,
57
+ REACT_FLIGHT_TYPE_NAME = _require6.REACT_FLIGHT_TYPE_NAME,
58
+ refineToReactFlightPayloadData = _require6.refineToReactFlightPayloadData;
59
+
60
+ var _require7 = require('./RelayStoreUtils'),
61
+ ROOT_ID = _require7.ROOT_ID,
62
+ ROOT_TYPE = _require7.ROOT_TYPE,
63
+ TYPENAME_KEY = _require7.TYPENAME_KEY,
64
+ getArgumentValues = _require7.getArgumentValues,
65
+ getHandleStorageKey = _require7.getHandleStorageKey,
66
+ getModuleComponentKey = _require7.getModuleComponentKey,
67
+ getModuleOperationKey = _require7.getModuleOperationKey,
68
+ getStorageKey = _require7.getStorageKey;
69
+
70
+ var _require8 = require('./TypeID'),
71
+ TYPE_SCHEMA_TYPE = _require8.TYPE_SCHEMA_TYPE,
72
+ generateTypeID = _require8.generateTypeID;
24
73
 
25
74
  var areEqual = require("fbjs/lib/areEqual");
26
75
 
27
- var invariant = require("fbjs/lib/invariant");
76
+ var invariant = require('invariant');
28
77
 
29
78
  var warning = require("fbjs/lib/warning");
30
79
 
31
- var _require = require('../util/RelayConcreteNode'),
32
- CONDITION = _require.CONDITION,
33
- CLIENT_COMPONENT = _require.CLIENT_COMPONENT,
34
- CLIENT_EXTENSION = _require.CLIENT_EXTENSION,
35
- DEFER = _require.DEFER,
36
- FLIGHT_FIELD = _require.FLIGHT_FIELD,
37
- FRAGMENT_SPREAD = _require.FRAGMENT_SPREAD,
38
- INLINE_FRAGMENT = _require.INLINE_FRAGMENT,
39
- LINKED_FIELD = _require.LINKED_FIELD,
40
- LINKED_HANDLE = _require.LINKED_HANDLE,
41
- MODULE_IMPORT = _require.MODULE_IMPORT,
42
- SCALAR_FIELD = _require.SCALAR_FIELD,
43
- SCALAR_HANDLE = _require.SCALAR_HANDLE,
44
- STREAM = _require.STREAM,
45
- TYPE_DISCRIMINATOR = _require.TYPE_DISCRIMINATOR;
46
-
47
- var _require2 = require('./ClientID'),
48
- generateClientID = _require2.generateClientID,
49
- isClientID = _require2.isClientID;
50
-
51
- var _require3 = require('./RelayModernSelector'),
52
- createNormalizationSelector = _require3.createNormalizationSelector;
53
-
54
- var _require4 = require('./RelayStoreReactFlightUtils'),
55
- refineToReactFlightPayloadData = _require4.refineToReactFlightPayloadData,
56
- REACT_FLIGHT_EXECUTABLE_DEFINITIONS_STORAGE_KEY = _require4.REACT_FLIGHT_EXECUTABLE_DEFINITIONS_STORAGE_KEY,
57
- REACT_FLIGHT_TREE_STORAGE_KEY = _require4.REACT_FLIGHT_TREE_STORAGE_KEY,
58
- REACT_FLIGHT_TYPE_NAME = _require4.REACT_FLIGHT_TYPE_NAME;
59
-
60
- var _require5 = require('./RelayStoreUtils'),
61
- getArgumentValues = _require5.getArgumentValues,
62
- getHandleStorageKey = _require5.getHandleStorageKey,
63
- getModuleComponentKey = _require5.getModuleComponentKey,
64
- getModuleOperationKey = _require5.getModuleOperationKey,
65
- getStorageKey = _require5.getStorageKey,
66
- TYPENAME_KEY = _require5.TYPENAME_KEY,
67
- ROOT_ID = _require5.ROOT_ID,
68
- ROOT_TYPE = _require5.ROOT_TYPE;
69
-
70
- var _require6 = require('./TypeID'),
71
- generateTypeID = _require6.generateTypeID,
72
- TYPE_SCHEMA_TYPE = _require6.TYPE_SCHEMA_TYPE;
73
-
74
80
  /**
75
81
  * Normalizes the results of a query and standard GraphQL response, writing the
76
82
  * normalized records/fields into the given MutableRecordSource.
@@ -91,13 +97,14 @@ function normalize(recordSource, selector, response, options) {
91
97
 
92
98
  var RelayResponseNormalizer = /*#__PURE__*/function () {
93
99
  function RelayResponseNormalizer(recordSource, variables, options) {
100
+ this._actorIdentifier = options.actorIdentifier;
94
101
  this._getDataId = options.getDataID;
95
102
  this._handleFieldPayloads = [];
96
103
  this._treatMissingFieldsAsNull = options.treatMissingFieldsAsNull;
97
104
  this._incrementalPlaceholders = [];
98
105
  this._isClientExtension = false;
99
106
  this._isUnmatchedAbstractType = false;
100
- this._moduleImportPayloads = [];
107
+ this._followupPayloads = [];
101
108
  this._path = options.path ? (0, _toConsumableArray2["default"])(options.path) : [];
102
109
  this._recordSource = recordSource;
103
110
  this._variables = variables;
@@ -119,15 +126,14 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
119
126
  errors: null,
120
127
  fieldPayloads: this._handleFieldPayloads,
121
128
  incrementalPlaceholders: this._incrementalPlaceholders,
122
- moduleImportPayloads: this._moduleImportPayloads,
129
+ followupPayloads: this._followupPayloads,
123
130
  source: this._recordSource,
124
131
  isFinal: false
125
132
  };
126
133
  };
127
134
 
128
135
  _proto._getVariableValue = function _getVariableValue(name) {
129
- !this._variables.hasOwnProperty(name) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer(): Undefined variable `%s`.', name) : invariant(false) : void 0; // $FlowFixMe[cannot-write]
130
-
136
+ !this._variables.hasOwnProperty(name) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer(): Undefined variable `%s`.', name) : invariant(false) : void 0;
131
137
  return this._variables[name];
132
138
  };
133
139
 
@@ -149,7 +155,7 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
149
155
  break;
150
156
 
151
157
  case CONDITION:
152
- var conditionValue = this._getVariableValue(selection.condition);
158
+ var conditionValue = Boolean(this._getVariableValue(selection.condition));
153
159
 
154
160
  if (conditionValue === selection.passingValue) {
155
161
  this._traverseSelections(selection, record, data);
@@ -159,8 +165,12 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
159
165
 
160
166
  case FRAGMENT_SPREAD:
161
167
  {
168
+ var prevVariables = this._variables;
169
+ this._variables = getLocalVariables(this._variables, selection.fragment.argumentDefinitions, selection.args);
170
+
162
171
  this._traverseSelections(selection.fragment, record, data);
163
172
 
173
+ this._variables = prevVariables;
164
174
  break;
165
175
  }
166
176
 
@@ -174,7 +184,7 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
174
184
  if (_typeName === selection.type) {
175
185
  this._traverseSelections(selection, record, data);
176
186
  }
177
- } else if (RelayFeatureFlags.ENABLE_PRECISE_TYPE_REFINEMENT) {
187
+ } else {
178
188
  var implementsInterface = data.hasOwnProperty(abstractKey);
179
189
 
180
190
  var _typeName2 = RelayModernRecord.getType(record);
@@ -194,18 +204,6 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
194
204
  if (implementsInterface) {
195
205
  this._traverseSelections(selection, record, data);
196
206
  }
197
- } else {
198
- // legacy behavior for abstract refinements: always normalize even
199
- // if the type doesn't conform, but track if the type matches or not
200
- // for determining whether response fields are expected to be present
201
- var _implementsInterface = data.hasOwnProperty(abstractKey);
202
-
203
- var parentIsUnmatchedAbstractType = this._isUnmatchedAbstractType;
204
- this._isUnmatchedAbstractType = this._isUnmatchedAbstractType || !_implementsInterface;
205
-
206
- this._traverseSelections(selection, record, data);
207
-
208
- this._isUnmatchedAbstractType = parentIsUnmatchedAbstractType;
209
207
  }
210
208
 
211
209
  break;
@@ -213,26 +211,23 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
213
211
 
214
212
  case TYPE_DISCRIMINATOR:
215
213
  {
216
- if (RelayFeatureFlags.ENABLE_PRECISE_TYPE_REFINEMENT) {
217
- var _abstractKey = selection.abstractKey;
214
+ var _abstractKey = selection.abstractKey;
218
215
 
219
- var _implementsInterface2 = data.hasOwnProperty(_abstractKey);
216
+ var _implementsInterface = data.hasOwnProperty(_abstractKey);
220
217
 
221
- var _typeName3 = RelayModernRecord.getType(record);
218
+ var _typeName3 = RelayModernRecord.getType(record);
222
219
 
223
- var _typeID = generateTypeID(_typeName3);
220
+ var _typeID = generateTypeID(_typeName3);
224
221
 
225
- var _typeRecord = this._recordSource.get(_typeID);
222
+ var _typeRecord = this._recordSource.get(_typeID);
226
223
 
227
- if (_typeRecord == null) {
228
- _typeRecord = RelayModernRecord.create(_typeID, TYPE_SCHEMA_TYPE);
224
+ if (_typeRecord == null) {
225
+ _typeRecord = RelayModernRecord.create(_typeID, TYPE_SCHEMA_TYPE);
229
226
 
230
- this._recordSource.set(_typeID, _typeRecord);
231
- }
232
-
233
- RelayModernRecord.setValue(_typeRecord, _abstractKey, _implementsInterface2);
227
+ this._recordSource.set(_typeID, _typeRecord);
234
228
  }
235
229
 
230
+ RelayModernRecord.setValue(_typeRecord, _abstractKey, _implementsInterface);
236
231
  break;
237
232
  }
238
233
 
@@ -243,12 +238,17 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
243
238
  var handleKey = getHandleStorageKey(selection, this._variables);
244
239
 
245
240
  this._handleFieldPayloads.push({
241
+ /* $FlowFixMe[class-object-subtyping] added when improving typing
242
+ * for this parameters */
246
243
  args: args,
247
244
  dataID: RelayModernRecord.getDataID(record),
248
245
  fieldKey: fieldKey,
249
246
  handle: selection.handle,
250
247
  handleKey: handleKey,
251
- handleArgs: selection.handleArgs ? getArgumentValues(selection.handleArgs, this._variables) : {}
248
+ handleArgs: selection.handleArgs ?
249
+ /* $FlowFixMe[class-object-subtyping] added when improving typing
250
+ * for this parameters */
251
+ getArgumentValues(selection.handleArgs, this._variables) : {}
252
252
  });
253
253
 
254
254
  break;
@@ -295,6 +295,11 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
295
295
 
296
296
  break;
297
297
 
298
+ case ACTOR_CHANGE:
299
+ this._normalizeActorChange(node, selection, record, data);
300
+
301
+ break;
302
+
298
303
  default:
299
304
  selection;
300
305
  !false ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer(): Unexpected ast kind `%s`.', selection.kind) : invariant(false) : void 0;
@@ -322,7 +327,8 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
322
327
  label: defer.label,
323
328
  path: (0, _toConsumableArray2["default"])(this._path),
324
329
  selector: createNormalizationSelector(defer, RelayModernRecord.getDataID(record), this._variables),
325
- typeName: RelayModernRecord.getType(record)
330
+ typeName: RelayModernRecord.getType(record),
331
+ actorIdentifier: this._actorIdentifier
326
332
  });
327
333
  }
328
334
  };
@@ -348,7 +354,8 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
348
354
  path: (0, _toConsumableArray2["default"])(this._path),
349
355
  parentID: RelayModernRecord.getDataID(record),
350
356
  node: stream,
351
- variables: this._variables
357
+ variables: this._variables,
358
+ actorIdentifier: this._actorIdentifier
352
359
  });
353
360
  }
354
361
  };
@@ -364,13 +371,16 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
364
371
  RelayModernRecord.setValue(record, operationKey, operationReference !== null && operationReference !== void 0 ? operationReference : null);
365
372
 
366
373
  if (operationReference != null) {
367
- this._moduleImportPayloads.push({
374
+ this._followupPayloads.push({
375
+ kind: 'ModuleImportPayload',
376
+ args: moduleImport.args,
368
377
  data: data,
369
378
  dataID: RelayModernRecord.getDataID(record),
370
379
  operationReference: operationReference,
371
380
  path: (0, _toConsumableArray2["default"])(this._path),
372
381
  typeName: typeName,
373
- variables: this._variables
382
+ variables: this._variables,
383
+ actorIdentifier: this._actorIdentifier
374
384
  });
375
385
  }
376
386
  };
@@ -411,7 +421,11 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
411
421
 
412
422
  if (process.env.NODE_ENV !== "production") {
413
423
  if (selection.kind === SCALAR_FIELD) {
414
- 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);
415
429
  }
416
430
  }
417
431
 
@@ -441,19 +455,97 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
441
455
  }
442
456
  };
443
457
 
458
+ _proto._normalizeActorChange = function _normalizeActorChange(parent, selection, record, data) {
459
+ var _field$concreteType;
460
+
461
+ var field = selection.linkedField;
462
+ !(typeof data === 'object' && data) ? process.env.NODE_ENV !== "production" ? invariant(false, '_normalizeActorChange(): Expected data for field `%s` to be an object.', field.name) : invariant(false) : void 0;
463
+ var responseKey = field.alias || field.name;
464
+ var storageKey = getStorageKey(field, this._variables);
465
+ var fieldValue = data[responseKey];
466
+
467
+ if (fieldValue == null) {
468
+ if (fieldValue === undefined) {
469
+ var isOptionalField = this._isClientExtension || this._isUnmatchedAbstractType;
470
+
471
+ if (isOptionalField) {
472
+ return;
473
+ } else if (!this._treatMissingFieldsAsNull) {
474
+ if (process.env.NODE_ENV !== "production") {
475
+ process.env.NODE_ENV !== "production" ? warning(false, 'RelayResponseNormalizer: Payload did not contain a value ' + 'for field `%s: %s`. Check that you are parsing with the same ' + 'query that was used to fetch the payload.', responseKey, storageKey) : void 0;
476
+ }
477
+
478
+ return;
479
+ }
480
+ }
481
+
482
+ RelayModernRecord.setValue(record, storageKey, null);
483
+ return;
484
+ }
485
+
486
+ var actorIdentifier = getActorIdentifierFromPayload(fieldValue);
487
+
488
+ if (actorIdentifier == null) {
489
+ if (process.env.NODE_ENV !== "production") {
490
+ process.env.NODE_ENV !== "production" ? warning(false, 'RelayResponseNormalizer: Payload did not contain a value ' + 'for field `%s`. Check that you are parsing with the same ' + 'query that was used to fetch the payload. Payload is `%s`.', ACTOR_IDENTIFIER_FIELD_NAME, JSON.stringify(fieldValue, null, 2)) : void 0;
491
+ }
492
+
493
+ RelayModernRecord.setValue(record, storageKey, null);
494
+ return;
495
+ } // $FlowFixMe[incompatible-call]
496
+
497
+
498
+ var typeName = (_field$concreteType = field.concreteType) !== null && _field$concreteType !== void 0 ? _field$concreteType : this._getRecordType(fieldValue);
499
+ var nextID = this._getDataId( // $FlowFixMe[incompatible-call]
500
+ fieldValue, typeName) || RelayModernRecord.getLinkedRecordID(record, storageKey) || generateClientID(RelayModernRecord.getDataID(record), storageKey);
501
+ !(typeof nextID === 'string') ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer: Expected id on field `%s` to be a string.', storageKey) : invariant(false) : void 0;
502
+ RelayModernRecord.setActorLinkedRecordID(record, storageKey, actorIdentifier, nextID);
503
+
504
+ this._followupPayloads.push({
505
+ kind: 'ActorPayload',
506
+ data: fieldValue,
507
+ dataID: nextID,
508
+ path: [].concat((0, _toConsumableArray2["default"])(this._path), [responseKey]),
509
+ typeName: typeName,
510
+ variables: this._variables,
511
+ node: field,
512
+ actorIdentifier: actorIdentifier
513
+ });
514
+ };
515
+
444
516
  _proto._normalizeFlightField = function _normalizeFlightField(parent, selection, record, data) {
445
517
  var responseKey = selection.alias || selection.name;
446
518
  var storageKey = getStorageKey(selection, this._variables);
447
519
  var fieldValue = data[responseKey];
448
520
 
449
521
  if (fieldValue == null) {
522
+ if (fieldValue === undefined) {
523
+ // Flight field may be missing in the response if:
524
+ // - It is inside an abstract type refinement where the concrete type does
525
+ // not conform to the interface/union.
526
+ // However an otherwise-required field may also be missing if the server
527
+ // is configured to skip fields with `null` values, in which case the
528
+ // client is assumed to be correctly configured with
529
+ // treatMissingFieldsAsNull=true.
530
+ if (this._isUnmatchedAbstractType) {
531
+ // Field not expected to exist regardless of whether the server is pruning null
532
+ // fields or not.
533
+ return;
534
+ } else {
535
+ // Not optional and the server is not pruning null fields: field is expected
536
+ // to be present
537
+ !this._treatMissingFieldsAsNull ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer: Payload did not contain a value for ' + 'field `%s: %s`. Check that you are parsing with the same ' + 'query that was used to fetch the payload.', responseKey, storageKey) : invariant(false) : void 0;
538
+ }
539
+ }
540
+
450
541
  RelayModernRecord.setValue(record, storageKey, null);
451
542
  return;
452
543
  }
453
544
 
454
545
  var reactFlightPayload = refineToReactFlightPayloadData(fieldValue);
546
+ var reactFlightPayloadDeserializer = this._reactFlightPayloadDeserializer;
455
547
  !(reactFlightPayload != null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer: Expected React Flight payload data to be an ' + 'object with `status`, tree`, `queries` and `errors` properties, got ' + '`%s`.', fieldValue) : invariant(false) : void 0;
456
- !(typeof this._reactFlightPayloadDeserializer === 'function') ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer: Expected reactFlightPayloadDeserializer to ' + 'be a function, got `%s`.', this._reactFlightPayloadDeserializer) : invariant(false) : void 0;
548
+ !(typeof reactFlightPayloadDeserializer === 'function') ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer: Expected reactFlightPayloadDeserializer to ' + 'be a function, got `%s`.', reactFlightPayloadDeserializer) : invariant(false) : void 0;
457
549
 
458
550
  if (reactFlightPayload.errors.length > 0) {
459
551
  if (typeof this._reactFlightServerErrorHandler === 'function') {
@@ -461,22 +553,7 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
461
553
  } else {
462
554
  process.env.NODE_ENV !== "production" ? warning(false, 'RelayResponseNormalizer: Received server errors for field `%s`.\n\n' + '%s\n%s', responseKey, reactFlightPayload.errors[0].message, reactFlightPayload.errors[0].stack) : void 0;
463
555
  }
464
- } // This typically indicates that a fatal server error prevented rows from
465
- // being written. When this occurs, we should not continue normalization of
466
- // the Flight field because the row response is malformed.
467
- //
468
- // Receiving empty rows is OK because it can indicate the start of a stream.
469
-
470
-
471
- if (reactFlightPayload.tree == null) {
472
- process.env.NODE_ENV !== "production" ? warning(false, 'RelayResponseNormalizer: Expected `tree` not to be null. This ' + 'typically indicates that a fatal server error prevented any Server ' + 'Component rows from being written.') : void 0;
473
- return;
474
- } // We store the deserialized reactFlightClientResponse in a separate
475
- // record and link it to the parent record. This is so we can GC the Flight
476
- // tree later even if the parent record is still reachable.
477
-
478
-
479
- var reactFlightClientResponse = this._reactFlightPayloadDeserializer(reactFlightPayload.tree);
556
+ }
480
557
 
481
558
  var reactFlightID = generateClientID(RelayModernRecord.getDataID(record), getStorageKey(selection, this._variables));
482
559
 
@@ -488,6 +565,25 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
488
565
  this._recordSource.set(reactFlightID, reactFlightClientResponseRecord);
489
566
  }
490
567
 
568
+ if (reactFlightPayload.tree == null) {
569
+ // This typically indicates that a fatal server error prevented rows from
570
+ // being written. When this occurs, we should not continue normalization of
571
+ // the Flight field because the row response is malformed.
572
+ //
573
+ // Receiving empty rows is OK because it can indicate the start of a stream.
574
+ process.env.NODE_ENV !== "production" ? warning(false, 'RelayResponseNormalizer: Expected `tree` not to be null. This ' + 'typically indicates that a fatal server error prevented any Server ' + 'Component rows from being written.') : void 0; // We create the flight record with a null value for the tree
575
+ // and empty reachable definitions
576
+
577
+ RelayModernRecord.setValue(reactFlightClientResponseRecord, REACT_FLIGHT_TREE_STORAGE_KEY, null);
578
+ RelayModernRecord.setValue(reactFlightClientResponseRecord, REACT_FLIGHT_EXECUTABLE_DEFINITIONS_STORAGE_KEY, []);
579
+ RelayModernRecord.setLinkedRecordID(record, storageKey, reactFlightID);
580
+ return;
581
+ } // We store the deserialized reactFlightClientResponse in a separate
582
+ // record and link it to the parent record. This is so we can GC the Flight
583
+ // tree later even if the parent record is still reachable.
584
+
585
+
586
+ var reactFlightClientResponse = reactFlightPayloadDeserializer(reactFlightPayload.tree);
491
587
  RelayModernRecord.setValue(reactFlightClientResponseRecord, REACT_FLIGHT_TREE_STORAGE_KEY, reactFlightClientResponse);
492
588
  var reachableExecutableDefinitions = [];
493
589
 
@@ -499,13 +595,16 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
499
595
  var query = _step.value;
500
596
 
501
597
  if (query.response.data != null) {
502
- this._moduleImportPayloads.push({
598
+ this._followupPayloads.push({
599
+ kind: 'ModuleImportPayload',
600
+ args: null,
503
601
  data: query.response.data,
504
602
  dataID: ROOT_ID,
505
603
  operationReference: query.module,
506
604
  path: [],
507
605
  typeName: ROOT_TYPE,
508
- variables: query.variables
606
+ variables: query.variables,
607
+ actorIdentifier: this._actorIdentifier
509
608
  });
510
609
  }
511
610
 
@@ -528,13 +627,16 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
528
627
  var fragment = _step2.value;
529
628
 
530
629
  if (fragment.response.data != null) {
531
- this._moduleImportPayloads.push({
630
+ this._followupPayloads.push({
631
+ kind: 'ModuleImportPayload',
632
+ args: null,
532
633
  data: fragment.response.data,
533
634
  dataID: fragment.__id,
534
635
  operationReference: fragment.module,
535
636
  path: [],
536
637
  typeName: fragment.__typename,
537
- variables: fragment.variables
638
+ variables: fragment.variables,
639
+ actorIdentifier: this._actorIdentifier
538
640
  });
539
641
  }
540
642
 
@@ -554,12 +656,12 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
554
656
  };
555
657
 
556
658
  _proto._normalizeLink = function _normalizeLink(field, record, storageKey, fieldValue) {
557
- var _field$concreteType;
659
+ var _field$concreteType2;
558
660
 
559
661
  !(typeof fieldValue === 'object' && fieldValue) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer: Expected data for field `%s` to be an object.', storageKey) : invariant(false) : void 0;
560
662
  var nextID = this._getDataId( // $FlowFixMe[incompatible-variance]
561
663
  fieldValue, // $FlowFixMe[incompatible-variance]
562
- (_field$concreteType = field.concreteType) !== null && _field$concreteType !== void 0 ? _field$concreteType : this._getRecordType(fieldValue)) || // Reuse previously generated client IDs
664
+ (_field$concreteType2 = field.concreteType) !== null && _field$concreteType2 !== void 0 ? _field$concreteType2 : this._getRecordType(fieldValue)) || // Reuse previously generated client IDs
563
665
  RelayModernRecord.getLinkedRecordID(record, storageKey) || generateClientID(RelayModernRecord.getDataID(record), storageKey);
564
666
  !(typeof nextID === 'string') ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer: Expected id on field `%s` to be a string.', storageKey) : invariant(false) : void 0;
565
667
 
@@ -593,7 +695,7 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
593
695
  var prevIDs = RelayModernRecord.getLinkedRecordIDs(record, storageKey);
594
696
  var nextIDs = [];
595
697
  fieldValue.forEach(function (item, nextIndex) {
596
- var _field$concreteType2;
698
+ var _field$concreteType3;
597
699
 
598
700
  // validate response data
599
701
  if (item == null) {
@@ -606,7 +708,7 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
606
708
  !(typeof item === 'object') ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer: Expected elements for field `%s` to be ' + 'objects.', storageKey) : invariant(false) : void 0;
607
709
  var nextID = _this._getDataId( // $FlowFixMe[incompatible-variance]
608
710
  item, // $FlowFixMe[incompatible-variance]
609
- (_field$concreteType2 = field.concreteType) !== null && _field$concreteType2 !== void 0 ? _field$concreteType2 : _this._getRecordType(item)) || prevIDs && prevIDs[nextIndex] || // Reuse previously generated client IDs:
711
+ (_field$concreteType3 = field.concreteType) !== null && _field$concreteType3 !== void 0 ? _field$concreteType3 : _this._getRecordType(item)) || prevIDs && prevIDs[nextIndex] || // Reuse previously generated client IDs:
610
712
  generateClientID(RelayModernRecord.getDataID(record), storageKey, nextIndex);
611
713
  !(typeof nextID === 'string') ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer: Expected id of elements of field `%s` to ' + 'be strings.', storageKey) : invariant(false) : void 0;
612
714
  nextIDs.push(nextID);
@@ -645,9 +747,9 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
645
747
  ;
646
748
 
647
749
  _proto._validateRecordType = function _validateRecordType(record, field, payload) {
648
- var _field$concreteType3;
750
+ var _field$concreteType4;
649
751
 
650
- var typeName = (_field$concreteType3 = field.concreteType) !== null && _field$concreteType3 !== void 0 ? _field$concreteType3 : this._getRecordType(payload);
752
+ var typeName = (_field$concreteType4 = field.concreteType) !== null && _field$concreteType4 !== void 0 ? _field$concreteType4 : this._getRecordType(payload);
651
753
  var dataID = RelayModernRecord.getDataID(record);
652
754
  process.env.NODE_ENV !== "production" ? warning(isClientID(dataID) && dataID !== ROOT_ID || RelayModernRecord.getType(record) === typeName, 'RelayResponseNormalizer: Invalid record `%s`. Expected %s to be ' + 'consistent, but the record was assigned conflicting types `%s` ' + 'and `%s`. The GraphQL server likely violated the globally unique ' + 'id requirement by returning the same id for different objects.', dataID, TYPENAME_KEY, RelayModernRecord.getType(record), typeName) : void 0;
653
755
  }
@@ -679,7 +781,6 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
679
781
  return RelayResponseNormalizer;
680
782
  }();
681
783
 
682
- var instrumentedNormalize = RelayProfiler.instrument('RelayResponseNormalizer.normalize', normalize);
683
784
  module.exports = {
684
- normalize: instrumentedNormalize
785
+ normalize: normalize
685
786
  };
@@ -10,13 +10,13 @@
10
10
  // flowlint ambiguous-object-type:error
11
11
  'use strict';
12
12
 
13
- var invariant = require("fbjs/lib/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';
@@ -31,13 +31,7 @@ function refineToReactFlightPayloadData(payload) {
31
31
 
32
32
  function getReactFlightClientResponse(record) {
33
33
  !(getType(record) === REACT_FLIGHT_TYPE_NAME) ? process.env.NODE_ENV !== "production" ? invariant(false, 'getReactFlightClientResponse(): Expected a ReactFlightComponentRecord, ' + 'got %s.', record) : invariant(false) : void 0;
34
- var response = record[REACT_FLIGHT_TREE_STORAGE_KEY];
35
-
36
- if (response != null) {
37
- return response;
38
- }
39
-
40
- return null;
34
+ return record[REACT_FLIGHT_TREE_STORAGE_KEY];
41
35
  }
42
36
 
43
37
  module.exports = {
@@ -10,20 +10,21 @@
10
10
  // flowlint ambiguous-object-type:error
11
11
  'use strict';
12
12
 
13
- var RelayFeatureFlags = require('../util/RelayFeatureFlags');
13
+ var deepFreeze = require('../util/deepFreeze');
14
14
 
15
- var RelayReader = require('./RelayReader');
15
+ var recycleNodesInto = require('../util/recycleNodesInto');
16
16
 
17
- var deepFreeze = require('../util/deepFreeze');
17
+ var RelayFeatureFlags = require('../util/RelayFeatureFlags');
18
18
 
19
19
  var hasOverlappingIDs = require('./hasOverlappingIDs');
20
20
 
21
- var recycleNodesInto = require('../util/recycleNodesInto');
21
+ var RelayReader = require('./RelayReader');
22
22
 
23
23
  var RelayStoreSubscriptions = /*#__PURE__*/function () {
24
- function RelayStoreSubscriptions(log) {
24
+ function RelayStoreSubscriptions(log, resolverCache) {
25
25
  this._subscriptions = new Set();
26
26
  this.__log = log;
27
+ this._resolverCache = resolverCache;
27
28
  }
28
29
 
29
30
  var _proto = RelayStoreSubscriptions.prototype;
@@ -50,6 +51,8 @@ var RelayStoreSubscriptions = /*#__PURE__*/function () {
50
51
  };
51
52
 
52
53
  _proto.snapshotSubscriptions = function snapshotSubscriptions(source) {
54
+ var _this2 = this;
55
+
53
56
  this._subscriptions.forEach(function (subscription) {
54
57
  // Backup occurs after writing a new "final" payload(s) and before (re)applying
55
58
  // optimistic changes. Each subscription's `snapshot` represents what was *last
@@ -69,7 +72,7 @@ var RelayStoreSubscriptions = /*#__PURE__*/function () {
69
72
  }
70
73
 
71
74
  var snapshot = subscription.snapshot;
72
- var backup = RelayReader.read(source, snapshot.selector);
75
+ var backup = RelayReader.read(source, snapshot.selector, _this2._resolverCache);
73
76
  var nextData = recycleNodesInto(snapshot.data, backup.data);
74
77
  backup.data = nextData; // backup owns the snapshot and can safely mutate
75
78
 
@@ -90,6 +93,7 @@ var RelayStoreSubscriptions = /*#__PURE__*/function () {
90
93
  subscription.snapshot = {
91
94
  data: subscription.snapshot.data,
92
95
  isMissingData: backup.isMissingData,
96
+ missingClientEdges: backup.missingClientEdges,
93
97
  seenRecords: backup.seenRecords,
94
98
  selector: backup.selector,
95
99
  missingRequiredFields: backup.missingRequiredFields
@@ -101,12 +105,12 @@ var RelayStoreSubscriptions = /*#__PURE__*/function () {
101
105
  };
102
106
 
103
107
  _proto.updateSubscriptions = function updateSubscriptions(source, updatedRecordIDs, updatedOwners, sourceOperation) {
104
- var _this2 = this;
108
+ var _this3 = this;
105
109
 
106
110
  var hasUpdatedRecords = updatedRecordIDs.size !== 0;
107
111
 
108
112
  this._subscriptions.forEach(function (subscription) {
109
- var owner = _this2._updateSubscription(source, subscription, updatedRecordIDs, hasUpdatedRecords, sourceOperation);
113
+ var owner = _this3._updateSubscription(source, subscription, updatedRecordIDs, hasUpdatedRecords, sourceOperation);
110
114
 
111
115
  if (owner != null) {
112
116
  updatedOwners.push(owner);
@@ -134,11 +138,12 @@ var RelayStoreSubscriptions = /*#__PURE__*/function () {
134
138
  return;
135
139
  }
136
140
 
137
- var nextSnapshot = hasOverlappingUpdates || !backup ? RelayReader.read(source, snapshot.selector) : backup;
141
+ var nextSnapshot = hasOverlappingUpdates || !backup ? RelayReader.read(source, snapshot.selector, this._resolverCache) : backup;
138
142
  var nextData = recycleNodesInto(snapshot.data, nextSnapshot.data);
139
143
  nextSnapshot = {
140
144
  data: nextData,
141
145
  isMissingData: nextSnapshot.isMissingData,
146
+ missingClientEdges: nextSnapshot.missingClientEdges,
142
147
  seenRecords: nextSnapshot.seenRecords,
143
148
  selector: nextSnapshot.selector,
144
149
  missingRequiredFields: nextSnapshot.missingRequiredFields