relay-runtime 11.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 (169) hide show
  1. package/handlers/RelayDefaultHandlerProvider.js.flow +2 -2
  2. package/handlers/connection/ConnectionHandler.js.flow +8 -10
  3. package/handlers/connection/MutationHandlers.js.flow +31 -7
  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 +8 -8
  8. package/lib/handlers/connection/MutationHandlers.js +61 -5
  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 +12 -5
  25. package/lib/network/ConvertToExecuteFunction.js +2 -1
  26. package/lib/network/RelayNetwork.js +3 -2
  27. package/lib/network/RelayQueryResponseCache.js +21 -4
  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 +141 -60
  35. package/lib/store/{RelayModernQueryExecutor.js → OperationExecutor.js} +532 -195
  36. package/lib/store/RelayConcreteVariables.js +24 -4
  37. package/lib/store/RelayModernEnvironment.js +175 -234
  38. package/lib/store/RelayModernFragmentSpecResolver.js +52 -26
  39. package/lib/store/RelayModernOperationDescriptor.js +2 -1
  40. package/lib/store/RelayModernRecord.js +47 -12
  41. package/lib/store/RelayModernSelector.js +14 -8
  42. package/lib/store/RelayModernStore.js +58 -29
  43. package/lib/store/RelayOperationTracker.js +34 -24
  44. package/lib/store/RelayPublishQueue.js +41 -13
  45. package/lib/store/RelayReader.js +287 -46
  46. package/lib/store/RelayRecordSource.js +87 -3
  47. package/lib/store/RelayReferenceMarker.js +55 -31
  48. package/lib/store/RelayResponseNormalizer.js +250 -108
  49. package/lib/store/RelayStoreReactFlightUtils.js +8 -12
  50. package/lib/store/RelayStoreSubscriptions.js +14 -9
  51. package/lib/store/RelayStoreUtils.js +11 -5
  52. package/lib/store/ResolverCache.js +213 -0
  53. package/lib/store/ResolverFragments.js +61 -0
  54. package/lib/store/cloneRelayHandleSourceField.js +5 -4
  55. package/lib/store/cloneRelayScalarHandleSourceField.js +5 -4
  56. package/lib/store/createRelayContext.js +4 -2
  57. package/lib/store/defaultGetDataID.js +3 -1
  58. package/lib/store/readInlineData.js +6 -2
  59. package/lib/subscription/requestSubscription.js +35 -9
  60. package/lib/util/RelayConcreteNode.js +4 -0
  61. package/lib/util/RelayFeatureFlags.js +11 -4
  62. package/lib/util/RelayProfiler.js +17 -187
  63. package/lib/util/RelayReplaySubject.js +22 -7
  64. package/lib/util/RelayRuntimeTypes.js +0 -6
  65. package/lib/util/StringInterner.js +71 -0
  66. package/lib/util/deepFreeze.js +1 -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 +28 -16
  95. package/network/ConvertToExecuteFunction.js.flow +2 -2
  96. package/network/RelayNetwork.js.flow +4 -5
  97. package/network/RelayNetworkTypes.js.flow +17 -8
  98. package/network/RelayObservable.js.flow +1 -1
  99. package/network/RelayQueryResponseCache.js.flow +34 -20
  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 +162 -67
  111. package/store/{RelayModernQueryExecutor.js.flow → OperationExecutor.js.flow} +616 -283
  112. package/store/RelayConcreteVariables.js.flow +27 -5
  113. package/store/RelayModernEnvironment.js.flow +176 -235
  114. package/store/RelayModernFragmentSpecResolver.js.flow +55 -31
  115. package/store/RelayModernOperationDescriptor.js.flow +12 -7
  116. package/store/RelayModernRecord.js.flow +67 -11
  117. package/store/RelayModernSelector.js.flow +24 -14
  118. package/store/RelayModernStore.js.flow +72 -36
  119. package/store/RelayOperationTracker.js.flow +59 -43
  120. package/store/RelayOptimisticRecordSource.js.flow +2 -2
  121. package/store/RelayPublishQueue.js.flow +79 -34
  122. package/store/RelayReader.js.flow +351 -72
  123. package/store/RelayRecordSource.js.flow +72 -6
  124. package/store/RelayReferenceMarker.js.flow +60 -33
  125. package/store/RelayResponseNormalizer.js.flow +288 -102
  126. package/store/RelayStoreReactFlightUtils.js.flow +9 -13
  127. package/store/RelayStoreSubscriptions.js.flow +19 -11
  128. package/store/RelayStoreTypes.js.flow +210 -44
  129. package/store/RelayStoreUtils.js.flow +25 -11
  130. package/store/ResolverCache.js.flow +249 -0
  131. package/store/ResolverFragments.js.flow +121 -0
  132. package/store/StoreInspector.js.flow +2 -2
  133. package/store/TypeID.js.flow +1 -1
  134. package/store/ViewerPattern.js.flow +2 -2
  135. package/store/cloneRelayHandleSourceField.js.flow +5 -6
  136. package/store/cloneRelayScalarHandleSourceField.js.flow +5 -6
  137. package/store/createFragmentSpecResolver.js.flow +3 -4
  138. package/store/createRelayContext.js.flow +3 -3
  139. package/store/defaultGetDataID.js.flow +3 -1
  140. package/store/normalizeRelayPayload.js.flow +6 -7
  141. package/store/readInlineData.js.flow +7 -8
  142. package/subscription/requestSubscription.js.flow +54 -27
  143. package/util/NormalizationNode.js.flow +16 -3
  144. package/util/ReaderNode.js.flow +38 -2
  145. package/util/RelayConcreteNode.js.flow +4 -0
  146. package/util/RelayFeatureFlags.js.flow +24 -8
  147. package/util/RelayProfiler.js.flow +22 -194
  148. package/util/RelayReplaySubject.js.flow +9 -9
  149. package/util/RelayRuntimeTypes.js.flow +73 -4
  150. package/util/StringInterner.js.flow +69 -0
  151. package/util/createPayloadFor3DField.js.flow +3 -3
  152. package/util/deepFreeze.js.flow +2 -1
  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 +2 -1
  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,60 +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_EXTENSION = _require.CLIENT_EXTENSION,
34
- DEFER = _require.DEFER,
35
- FLIGHT_FIELD = _require.FLIGHT_FIELD,
36
- FRAGMENT_SPREAD = _require.FRAGMENT_SPREAD,
37
- INLINE_FRAGMENT = _require.INLINE_FRAGMENT,
38
- LINKED_FIELD = _require.LINKED_FIELD,
39
- LINKED_HANDLE = _require.LINKED_HANDLE,
40
- MODULE_IMPORT = _require.MODULE_IMPORT,
41
- SCALAR_FIELD = _require.SCALAR_FIELD,
42
- SCALAR_HANDLE = _require.SCALAR_HANDLE,
43
- STREAM = _require.STREAM,
44
- TYPE_DISCRIMINATOR = _require.TYPE_DISCRIMINATOR;
45
-
46
- var _require2 = require('./ClientID'),
47
- generateClientID = _require2.generateClientID,
48
- isClientID = _require2.isClientID;
49
-
50
- var _require3 = require('./RelayModernSelector'),
51
- createNormalizationSelector = _require3.createNormalizationSelector;
52
-
53
- var _require4 = require('./RelayStoreReactFlightUtils'),
54
- refineToReactFlightPayloadData = _require4.refineToReactFlightPayloadData,
55
- REACT_FLIGHT_QUERIES_STORAGE_KEY = _require4.REACT_FLIGHT_QUERIES_STORAGE_KEY,
56
- REACT_FLIGHT_TREE_STORAGE_KEY = _require4.REACT_FLIGHT_TREE_STORAGE_KEY,
57
- REACT_FLIGHT_TYPE_NAME = _require4.REACT_FLIGHT_TYPE_NAME;
58
-
59
- var _require5 = require('./RelayStoreUtils'),
60
- getArgumentValues = _require5.getArgumentValues,
61
- getHandleStorageKey = _require5.getHandleStorageKey,
62
- getModuleComponentKey = _require5.getModuleComponentKey,
63
- getModuleOperationKey = _require5.getModuleOperationKey,
64
- getStorageKey = _require5.getStorageKey,
65
- TYPENAME_KEY = _require5.TYPENAME_KEY,
66
- ROOT_ID = _require5.ROOT_ID,
67
- ROOT_TYPE = _require5.ROOT_TYPE;
68
-
69
- var _require6 = require('./TypeID'),
70
- generateTypeID = _require6.generateTypeID,
71
- TYPE_SCHEMA_TYPE = _require6.TYPE_SCHEMA_TYPE;
72
-
73
80
  /**
74
81
  * Normalizes the results of a query and standard GraphQL response, writing the
75
82
  * normalized records/fields into the given MutableRecordSource.
@@ -90,18 +97,20 @@ function normalize(recordSource, selector, response, options) {
90
97
 
91
98
  var RelayResponseNormalizer = /*#__PURE__*/function () {
92
99
  function RelayResponseNormalizer(recordSource, variables, options) {
100
+ this._actorIdentifier = options.actorIdentifier;
93
101
  this._getDataId = options.getDataID;
94
102
  this._handleFieldPayloads = [];
95
103
  this._treatMissingFieldsAsNull = options.treatMissingFieldsAsNull;
96
104
  this._incrementalPlaceholders = [];
97
105
  this._isClientExtension = false;
98
106
  this._isUnmatchedAbstractType = false;
99
- this._moduleImportPayloads = [];
107
+ this._followupPayloads = [];
100
108
  this._path = options.path ? (0, _toConsumableArray2["default"])(options.path) : [];
101
109
  this._recordSource = recordSource;
102
110
  this._variables = variables;
103
111
  this._reactFlightPayloadDeserializer = options.reactFlightPayloadDeserializer;
104
112
  this._reactFlightServerErrorHandler = options.reactFlightServerErrorHandler;
113
+ this._shouldProcessClientComponents = options.shouldProcessClientComponents;
105
114
  }
106
115
 
107
116
  var _proto = RelayResponseNormalizer.prototype;
@@ -117,7 +126,7 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
117
126
  errors: null,
118
127
  fieldPayloads: this._handleFieldPayloads,
119
128
  incrementalPlaceholders: this._incrementalPlaceholders,
120
- moduleImportPayloads: this._moduleImportPayloads,
129
+ followupPayloads: this._followupPayloads,
121
130
  source: this._recordSource,
122
131
  isFinal: false
123
132
  };
@@ -146,7 +155,7 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
146
155
  break;
147
156
 
148
157
  case CONDITION:
149
- var conditionValue = this._getVariableValue(selection.condition);
158
+ var conditionValue = Boolean(this._getVariableValue(selection.condition));
150
159
 
151
160
  if (conditionValue === selection.passingValue) {
152
161
  this._traverseSelections(selection, record, data);
@@ -156,8 +165,12 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
156
165
 
157
166
  case FRAGMENT_SPREAD:
158
167
  {
168
+ var prevVariables = this._variables;
169
+ this._variables = getLocalVariables(this._variables, selection.fragment.argumentDefinitions, selection.args);
170
+
159
171
  this._traverseSelections(selection.fragment, record, data);
160
172
 
173
+ this._variables = prevVariables;
161
174
  break;
162
175
  }
163
176
 
@@ -171,7 +184,7 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
171
184
  if (_typeName === selection.type) {
172
185
  this._traverseSelections(selection, record, data);
173
186
  }
174
- } else if (RelayFeatureFlags.ENABLE_PRECISE_TYPE_REFINEMENT) {
187
+ } else {
175
188
  var implementsInterface = data.hasOwnProperty(abstractKey);
176
189
 
177
190
  var _typeName2 = RelayModernRecord.getType(record);
@@ -191,18 +204,6 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
191
204
  if (implementsInterface) {
192
205
  this._traverseSelections(selection, record, data);
193
206
  }
194
- } else {
195
- // legacy behavior for abstract refinements: always normalize even
196
- // if the type doesn't conform, but track if the type matches or not
197
- // for determining whether response fields are expected to be present
198
- var _implementsInterface = data.hasOwnProperty(abstractKey);
199
-
200
- var parentIsUnmatchedAbstractType = this._isUnmatchedAbstractType;
201
- this._isUnmatchedAbstractType = this._isUnmatchedAbstractType || !_implementsInterface;
202
-
203
- this._traverseSelections(selection, record, data);
204
-
205
- this._isUnmatchedAbstractType = parentIsUnmatchedAbstractType;
206
207
  }
207
208
 
208
209
  break;
@@ -210,26 +211,23 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
210
211
 
211
212
  case TYPE_DISCRIMINATOR:
212
213
  {
213
- if (RelayFeatureFlags.ENABLE_PRECISE_TYPE_REFINEMENT) {
214
- var _abstractKey = selection.abstractKey;
214
+ var _abstractKey = selection.abstractKey;
215
215
 
216
- var _implementsInterface2 = data.hasOwnProperty(_abstractKey);
216
+ var _implementsInterface = data.hasOwnProperty(_abstractKey);
217
217
 
218
- var _typeName3 = RelayModernRecord.getType(record);
218
+ var _typeName3 = RelayModernRecord.getType(record);
219
219
 
220
- var _typeID = generateTypeID(_typeName3);
220
+ var _typeID = generateTypeID(_typeName3);
221
221
 
222
- var _typeRecord = this._recordSource.get(_typeID);
222
+ var _typeRecord = this._recordSource.get(_typeID);
223
223
 
224
- if (_typeRecord == null) {
225
- _typeRecord = RelayModernRecord.create(_typeID, TYPE_SCHEMA_TYPE);
224
+ if (_typeRecord == null) {
225
+ _typeRecord = RelayModernRecord.create(_typeID, TYPE_SCHEMA_TYPE);
226
226
 
227
- this._recordSource.set(_typeID, _typeRecord);
228
- }
229
-
230
- RelayModernRecord.setValue(_typeRecord, _abstractKey, _implementsInterface2);
227
+ this._recordSource.set(_typeID, _typeRecord);
231
228
  }
232
229
 
230
+ RelayModernRecord.setValue(_typeRecord, _abstractKey, _implementsInterface);
233
231
  break;
234
232
  }
235
233
 
@@ -240,12 +238,17 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
240
238
  var handleKey = getHandleStorageKey(selection, this._variables);
241
239
 
242
240
  this._handleFieldPayloads.push({
241
+ /* $FlowFixMe[class-object-subtyping] added when improving typing
242
+ * for this parameters */
243
243
  args: args,
244
244
  dataID: RelayModernRecord.getDataID(record),
245
245
  fieldKey: fieldKey,
246
246
  handle: selection.handle,
247
247
  handleKey: handleKey,
248
- 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) : {}
249
252
  });
250
253
 
251
254
  break;
@@ -274,6 +277,15 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
274
277
  this._isClientExtension = isClientExtension;
275
278
  break;
276
279
 
280
+ case CLIENT_COMPONENT:
281
+ if (this._shouldProcessClientComponents === false) {
282
+ break;
283
+ }
284
+
285
+ this._traverseSelections(selection.fragment, record, data);
286
+
287
+ break;
288
+
277
289
  case FLIGHT_FIELD:
278
290
  if (RelayFeatureFlags.ENABLE_REACT_FLIGHT_COMPONENT_FIELD) {
279
291
  this._normalizeFlightField(node, selection, record, data);
@@ -283,6 +295,11 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
283
295
 
284
296
  break;
285
297
 
298
+ case ACTOR_CHANGE:
299
+ this._normalizeActorChange(node, selection, record, data);
300
+
301
+ break;
302
+
286
303
  default:
287
304
  selection;
288
305
  !false ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer(): Unexpected ast kind `%s`.', selection.kind) : invariant(false) : void 0;
@@ -310,7 +327,8 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
310
327
  label: defer.label,
311
328
  path: (0, _toConsumableArray2["default"])(this._path),
312
329
  selector: createNormalizationSelector(defer, RelayModernRecord.getDataID(record), this._variables),
313
- typeName: RelayModernRecord.getType(record)
330
+ typeName: RelayModernRecord.getType(record),
331
+ actorIdentifier: this._actorIdentifier
314
332
  });
315
333
  }
316
334
  };
@@ -336,7 +354,8 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
336
354
  path: (0, _toConsumableArray2["default"])(this._path),
337
355
  parentID: RelayModernRecord.getDataID(record),
338
356
  node: stream,
339
- variables: this._variables
357
+ variables: this._variables,
358
+ actorIdentifier: this._actorIdentifier
340
359
  });
341
360
  }
342
361
  };
@@ -352,13 +371,16 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
352
371
  RelayModernRecord.setValue(record, operationKey, operationReference !== null && operationReference !== void 0 ? operationReference : null);
353
372
 
354
373
  if (operationReference != null) {
355
- this._moduleImportPayloads.push({
374
+ this._followupPayloads.push({
375
+ kind: 'ModuleImportPayload',
376
+ args: moduleImport.args,
356
377
  data: data,
357
378
  dataID: RelayModernRecord.getDataID(record),
358
379
  operationReference: operationReference,
359
380
  path: (0, _toConsumableArray2["default"])(this._path),
360
381
  typeName: typeName,
361
- variables: this._variables
382
+ variables: this._variables,
383
+ actorIdentifier: this._actorIdentifier
362
384
  });
363
385
  }
364
386
  };
@@ -399,7 +421,11 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
399
421
 
400
422
  if (process.env.NODE_ENV !== "production") {
401
423
  if (selection.kind === SCALAR_FIELD) {
402
- 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);
403
429
  }
404
430
  }
405
431
 
@@ -429,19 +455,97 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
429
455
  }
430
456
  };
431
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
+
432
516
  _proto._normalizeFlightField = function _normalizeFlightField(parent, selection, record, data) {
433
517
  var responseKey = selection.alias || selection.name;
434
518
  var storageKey = getStorageKey(selection, this._variables);
435
519
  var fieldValue = data[responseKey];
436
520
 
437
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
+
438
541
  RelayModernRecord.setValue(record, storageKey, null);
439
542
  return;
440
543
  }
441
544
 
442
545
  var reactFlightPayload = refineToReactFlightPayloadData(fieldValue);
546
+ var reactFlightPayloadDeserializer = this._reactFlightPayloadDeserializer;
443
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;
444
- !(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;
445
549
 
446
550
  if (reactFlightPayload.errors.length > 0) {
447
551
  if (typeof this._reactFlightServerErrorHandler === 'function') {
@@ -449,22 +553,7 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
449
553
  } else {
450
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;
451
555
  }
452
- } // This typically indicates that a fatal server error prevented rows from
453
- // being written. When this occurs, we should not continue normalization of
454
- // the Flight field because the row response is malformed.
455
- //
456
- // Receiving empty rows is OK because it can indicate the start of a stream.
457
-
458
-
459
- if (reactFlightPayload.tree == null) {
460
- 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;
461
- return;
462
- } // We store the deserialized reactFlightClientResponse in a separate
463
- // record and link it to the parent record. This is so we can GC the Flight
464
- // tree later even if the parent record is still reachable.
465
-
466
-
467
- var reactFlightClientResponse = this._reactFlightPayloadDeserializer(reactFlightPayload.tree);
556
+ }
468
557
 
469
558
  var reactFlightID = generateClientID(RelayModernRecord.getDataID(record), getStorageKey(selection, this._variables));
470
559
 
@@ -476,8 +565,27 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
476
565
  this._recordSource.set(reactFlightID, reactFlightClientResponseRecord);
477
566
  }
478
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);
479
587
  RelayModernRecord.setValue(reactFlightClientResponseRecord, REACT_FLIGHT_TREE_STORAGE_KEY, reactFlightClientResponse);
480
- var reachableQueries = [];
588
+ var reachableExecutableDefinitions = [];
481
589
 
482
590
  var _iterator = (0, _createForOfIteratorHelper2["default"])(reactFlightPayload.queries),
483
591
  _step;
@@ -487,17 +595,20 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
487
595
  var query = _step.value;
488
596
 
489
597
  if (query.response.data != null) {
490
- this._moduleImportPayloads.push({
598
+ this._followupPayloads.push({
599
+ kind: 'ModuleImportPayload',
600
+ args: null,
491
601
  data: query.response.data,
492
602
  dataID: ROOT_ID,
493
603
  operationReference: query.module,
494
604
  path: [],
495
605
  typeName: ROOT_TYPE,
496
- variables: query.variables
606
+ variables: query.variables,
607
+ actorIdentifier: this._actorIdentifier
497
608
  });
498
609
  }
499
610
 
500
- reachableQueries.push({
611
+ reachableExecutableDefinitions.push({
501
612
  module: query.module,
502
613
  variables: query.variables
503
614
  });
@@ -508,17 +619,49 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
508
619
  _iterator.f();
509
620
  }
510
621
 
511
- RelayModernRecord.setValue(reactFlightClientResponseRecord, REACT_FLIGHT_QUERIES_STORAGE_KEY, reachableQueries);
622
+ var _iterator2 = (0, _createForOfIteratorHelper2["default"])(reactFlightPayload.fragments),
623
+ _step2;
624
+
625
+ try {
626
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
627
+ var fragment = _step2.value;
628
+
629
+ if (fragment.response.data != null) {
630
+ this._followupPayloads.push({
631
+ kind: 'ModuleImportPayload',
632
+ args: null,
633
+ data: fragment.response.data,
634
+ dataID: fragment.__id,
635
+ operationReference: fragment.module,
636
+ path: [],
637
+ typeName: fragment.__typename,
638
+ variables: fragment.variables,
639
+ actorIdentifier: this._actorIdentifier
640
+ });
641
+ }
642
+
643
+ reachableExecutableDefinitions.push({
644
+ module: fragment.module,
645
+ variables: fragment.variables
646
+ });
647
+ }
648
+ } catch (err) {
649
+ _iterator2.e(err);
650
+ } finally {
651
+ _iterator2.f();
652
+ }
653
+
654
+ RelayModernRecord.setValue(reactFlightClientResponseRecord, REACT_FLIGHT_EXECUTABLE_DEFINITIONS_STORAGE_KEY, reachableExecutableDefinitions);
512
655
  RelayModernRecord.setLinkedRecordID(record, storageKey, reactFlightID);
513
656
  };
514
657
 
515
658
  _proto._normalizeLink = function _normalizeLink(field, record, storageKey, fieldValue) {
516
- var _field$concreteType;
659
+ var _field$concreteType2;
517
660
 
518
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;
519
662
  var nextID = this._getDataId( // $FlowFixMe[incompatible-variance]
520
663
  fieldValue, // $FlowFixMe[incompatible-variance]
521
- (_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
522
665
  RelayModernRecord.getLinkedRecordID(record, storageKey) || generateClientID(RelayModernRecord.getDataID(record), storageKey);
523
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;
524
667
 
@@ -552,7 +695,7 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
552
695
  var prevIDs = RelayModernRecord.getLinkedRecordIDs(record, storageKey);
553
696
  var nextIDs = [];
554
697
  fieldValue.forEach(function (item, nextIndex) {
555
- var _field$concreteType2;
698
+ var _field$concreteType3;
556
699
 
557
700
  // validate response data
558
701
  if (item == null) {
@@ -565,7 +708,7 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
565
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;
566
709
  var nextID = _this._getDataId( // $FlowFixMe[incompatible-variance]
567
710
  item, // $FlowFixMe[incompatible-variance]
568
- (_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:
569
712
  generateClientID(RelayModernRecord.getDataID(record), storageKey, nextIndex);
570
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;
571
714
  nextIDs.push(nextID);
@@ -604,9 +747,9 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
604
747
  ;
605
748
 
606
749
  _proto._validateRecordType = function _validateRecordType(record, field, payload) {
607
- var _field$concreteType3;
750
+ var _field$concreteType4;
608
751
 
609
- 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);
610
753
  var dataID = RelayModernRecord.getDataID(record);
611
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;
612
755
  }
@@ -638,7 +781,6 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
638
781
  return RelayResponseNormalizer;
639
782
  }();
640
783
 
641
- var instrumentedNormalize = RelayProfiler.instrument('RelayResponseNormalizer.normalize', normalize);
642
784
  module.exports = {
643
- normalize: instrumentedNormalize
785
+ normalize: normalize
644
786
  };
@@ -10,17 +10,19 @@
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
- var REACT_FLIGHT_QUERIES_STORAGE_KEY = 'queries';
16
+ var invariant = require('invariant'); // Reachable (client) executable definitions encountered while server component
17
+ // rendering
18
+
19
+
20
+ var REACT_FLIGHT_EXECUTABLE_DEFINITIONS_STORAGE_KEY = 'executableDefinitions';
19
21
  var REACT_FLIGHT_TREE_STORAGE_KEY = 'tree';
20
22
  var REACT_FLIGHT_TYPE_NAME = 'ReactFlightComponent';
21
23
 
22
24
  function refineToReactFlightPayloadData(payload) {
23
- if (payload == null || typeof payload !== 'object' || typeof payload.status !== 'string' || !Array.isArray(payload.tree) && payload.tree !== null || !Array.isArray(payload.queries) || !Array.isArray(payload.errors)) {
25
+ if (payload == null || typeof payload !== 'object' || typeof payload.status !== 'string' || !Array.isArray(payload.tree) && payload.tree !== null || !Array.isArray(payload.queries) || !Array.isArray(payload.fragments) || !Array.isArray(payload.errors)) {
24
26
  return null;
25
27
  }
26
28
 
@@ -29,17 +31,11 @@ function refineToReactFlightPayloadData(payload) {
29
31
 
30
32
  function getReactFlightClientResponse(record) {
31
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;
32
- var response = record[REACT_FLIGHT_TREE_STORAGE_KEY];
33
-
34
- if (response != null) {
35
- return response;
36
- }
37
-
38
- return null;
34
+ return record[REACT_FLIGHT_TREE_STORAGE_KEY];
39
35
  }
40
36
 
41
37
  module.exports = {
42
- REACT_FLIGHT_QUERIES_STORAGE_KEY: REACT_FLIGHT_QUERIES_STORAGE_KEY,
38
+ REACT_FLIGHT_EXECUTABLE_DEFINITIONS_STORAGE_KEY: REACT_FLIGHT_EXECUTABLE_DEFINITIONS_STORAGE_KEY,
43
39
  REACT_FLIGHT_TREE_STORAGE_KEY: REACT_FLIGHT_TREE_STORAGE_KEY,
44
40
  REACT_FLIGHT_TYPE_NAME: REACT_FLIGHT_TYPE_NAME,
45
41
  getReactFlightClientResponse: getReactFlightClientResponse,