relay-runtime 11.0.0-rc.0 → 12.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/handlers/connection/ConnectionHandler.js.flow +7 -0
  2. package/handlers/connection/MutationHandlers.js.flow +28 -0
  3. package/index.js +1 -1
  4. package/index.js.flow +20 -3
  5. package/lib/handlers/RelayDefaultHandlerProvider.js +1 -1
  6. package/lib/handlers/connection/ConnectionHandler.js +12 -6
  7. package/lib/handlers/connection/MutationHandlers.js +67 -8
  8. package/lib/index.js +15 -0
  9. package/lib/multi-actor-environment/ActorIdentifier.js +33 -0
  10. package/lib/multi-actor-environment/ActorSpecificEnvironment.js +148 -0
  11. package/lib/multi-actor-environment/ActorUtils.js +27 -0
  12. package/lib/multi-actor-environment/MultiActorEnvironment.js +406 -0
  13. package/lib/multi-actor-environment/MultiActorEnvironmentTypes.js +11 -0
  14. package/lib/multi-actor-environment/index.js +21 -0
  15. package/lib/mutations/RelayRecordProxy.js +1 -1
  16. package/lib/mutations/RelayRecordSourceMutator.js +1 -1
  17. package/lib/mutations/RelayRecordSourceProxy.js +1 -1
  18. package/lib/mutations/RelayRecordSourceSelectorProxy.js +7 -2
  19. package/lib/mutations/applyOptimisticMutation.js +1 -1
  20. package/lib/mutations/commitMutation.js +5 -2
  21. package/lib/mutations/validateMutation.js +39 -17
  22. package/lib/network/RelayNetwork.js +1 -1
  23. package/lib/network/RelayObservable.js +3 -1
  24. package/lib/network/RelayQueryResponseCache.js +20 -3
  25. package/lib/network/wrapNetworkWithLogObserver.js +78 -0
  26. package/lib/query/GraphQLTag.js +1 -1
  27. package/lib/query/fetchQuery.js +1 -1
  28. package/lib/query/fetchQueryInternal.js +1 -1
  29. package/lib/store/DataChecker.js +132 -50
  30. package/lib/store/{RelayModernQueryExecutor.js → OperationExecutor.js} +524 -187
  31. package/lib/store/RelayConcreteVariables.js +29 -4
  32. package/lib/store/RelayModernEnvironment.js +137 -220
  33. package/lib/store/RelayModernFragmentSpecResolver.js +49 -23
  34. package/lib/store/RelayModernRecord.js +36 -2
  35. package/lib/store/RelayModernSelector.js +1 -1
  36. package/lib/store/RelayModernStore.js +53 -22
  37. package/lib/store/RelayOperationTracker.js +34 -24
  38. package/lib/store/RelayPublishQueue.js +30 -8
  39. package/lib/store/RelayReader.js +177 -29
  40. package/lib/store/RelayRecordSource.js +87 -3
  41. package/lib/store/RelayReferenceMarker.js +53 -28
  42. package/lib/store/RelayResponseNormalizer.js +247 -108
  43. package/lib/store/RelayStoreReactFlightUtils.js +7 -11
  44. package/lib/store/RelayStoreSubscriptions.js +8 -5
  45. package/lib/store/RelayStoreUtils.js +10 -4
  46. package/lib/store/ResolverCache.js +213 -0
  47. package/lib/store/ResolverFragments.js +57 -0
  48. package/lib/store/cloneRelayHandleSourceField.js +1 -1
  49. package/lib/store/cloneRelayScalarHandleSourceField.js +1 -1
  50. package/lib/store/createRelayContext.js +2 -2
  51. package/lib/store/defaultGetDataID.js +3 -1
  52. package/lib/store/readInlineData.js +1 -1
  53. package/lib/subscription/requestSubscription.js +32 -6
  54. package/lib/util/RelayConcreteNode.js +3 -0
  55. package/lib/util/RelayFeatureFlags.js +5 -4
  56. package/lib/util/RelayProfiler.js +17 -187
  57. package/lib/util/RelayReplaySubject.js +22 -7
  58. package/lib/util/deepFreeze.js +1 -0
  59. package/lib/util/getPaginationMetadata.js +41 -0
  60. package/lib/util/getPaginationVariables.js +67 -0
  61. package/lib/util/getPendingOperationsForFragment.js +55 -0
  62. package/lib/util/getRefetchMetadata.js +36 -0
  63. package/lib/util/getRelayHandleKey.js +1 -1
  64. package/lib/util/getRequestIdentifier.js +1 -1
  65. package/lib/util/getValueAtPath.js +51 -0
  66. package/lib/util/isEmptyObject.js +1 -1
  67. package/lib/util/registerEnvironmentWithDevTools.js +26 -0
  68. package/lib/util/withDuration.js +31 -0
  69. package/multi-actor-environment/ActorIdentifier.js.flow +43 -0
  70. package/multi-actor-environment/ActorSpecificEnvironment.js.flow +217 -0
  71. package/multi-actor-environment/ActorUtils.js.flow +33 -0
  72. package/multi-actor-environment/MultiActorEnvironment.js.flow +485 -0
  73. package/multi-actor-environment/MultiActorEnvironmentTypes.js.flow +245 -0
  74. package/multi-actor-environment/index.js.flow +27 -0
  75. package/mutations/RelayRecordSourceSelectorProxy.js.flow +7 -2
  76. package/mutations/commitMutation.js.flow +3 -1
  77. package/mutations/validateMutation.js.flow +42 -16
  78. package/network/RelayNetworkTypes.js.flow +17 -8
  79. package/network/RelayObservable.js.flow +2 -0
  80. package/network/RelayQueryResponseCache.js.flow +31 -17
  81. package/network/wrapNetworkWithLogObserver.js.flow +99 -0
  82. package/package.json +3 -2
  83. package/relay-runtime.js +2 -2
  84. package/relay-runtime.min.js +2 -2
  85. package/store/ClientID.js.flow +5 -1
  86. package/store/DataChecker.js.flow +148 -44
  87. package/store/{RelayModernQueryExecutor.js.flow → OperationExecutor.js.flow} +578 -237
  88. package/store/RelayConcreteVariables.js.flow +31 -1
  89. package/store/RelayModernEnvironment.js.flow +132 -220
  90. package/store/RelayModernFragmentSpecResolver.js.flow +40 -14
  91. package/store/RelayModernOperationDescriptor.js.flow +9 -3
  92. package/store/RelayModernRecord.js.flow +49 -0
  93. package/store/RelayModernStore.js.flow +57 -17
  94. package/store/RelayOperationTracker.js.flow +56 -34
  95. package/store/RelayPublishQueue.js.flow +37 -11
  96. package/store/RelayReader.js.flow +186 -27
  97. package/store/RelayRecordSource.js.flow +72 -6
  98. package/store/RelayReferenceMarker.js.flow +51 -21
  99. package/store/RelayResponseNormalizer.js.flow +251 -67
  100. package/store/RelayStoreReactFlightUtils.js.flow +6 -9
  101. package/store/RelayStoreSubscriptions.js.flow +10 -3
  102. package/store/RelayStoreTypes.js.flow +144 -21
  103. package/store/RelayStoreUtils.js.flow +19 -4
  104. package/store/ResolverCache.js.flow +247 -0
  105. package/store/ResolverFragments.js.flow +128 -0
  106. package/store/createRelayContext.js.flow +1 -1
  107. package/store/defaultGetDataID.js.flow +3 -1
  108. package/subscription/requestSubscription.js.flow +43 -8
  109. package/util/NormalizationNode.js.flow +16 -3
  110. package/util/ReaderNode.js.flow +29 -2
  111. package/util/RelayConcreteNode.js.flow +3 -0
  112. package/util/RelayFeatureFlags.js.flow +10 -6
  113. package/util/RelayProfiler.js.flow +22 -194
  114. package/util/RelayReplaySubject.js.flow +7 -6
  115. package/util/RelayRuntimeTypes.js.flow +4 -2
  116. package/util/deepFreeze.js.flow +2 -1
  117. package/util/getPaginationMetadata.js.flow +74 -0
  118. package/util/getPaginationVariables.js.flow +112 -0
  119. package/util/getPendingOperationsForFragment.js.flow +62 -0
  120. package/util/getRefetchMetadata.js.flow +80 -0
  121. package/util/getValueAtPath.js.flow +46 -0
  122. package/util/isEmptyObject.js.flow +2 -1
  123. package/util/registerEnvironmentWithDevTools.js.flow +33 -0
  124. package/util/withDuration.js.flow +32 -0
  125. package/lib/store/RelayRecordSourceMapImpl.js +0 -107
  126. package/lib/store/RelayStoreSubscriptionsUsingMapByID.js +0 -318
  127. package/store/RelayRecordSourceMapImpl.js.flow +0 -91
  128. package/store/RelayStoreSubscriptionsUsingMapByID.js.flow +0 -283
@@ -20,55 +20,62 @@ var RelayFeatureFlags = require('../util/RelayFeatureFlags');
20
20
 
21
21
  var RelayModernRecord = require('./RelayModernRecord');
22
22
 
23
- var RelayProfiler = require('../util/RelayProfiler');
24
-
25
23
  var areEqual = require("fbjs/lib/areEqual");
26
24
 
27
- var invariant = require("fbjs/lib/invariant");
25
+ var invariant = require('invariant');
28
26
 
29
27
  var warning = require("fbjs/lib/warning");
30
28
 
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;
29
+ var _require = require('../multi-actor-environment/ActorUtils'),
30
+ ACTOR_IDENTIFIER_FIELD_NAME = _require.ACTOR_IDENTIFIER_FIELD_NAME,
31
+ getActorIdentifierFromPayload = _require.getActorIdentifierFromPayload;
32
+
33
+ var _require2 = require('../util/RelayConcreteNode'),
34
+ ACTOR_CHANGE = _require2.ACTOR_CHANGE,
35
+ CONDITION = _require2.CONDITION,
36
+ CLIENT_COMPONENT = _require2.CLIENT_COMPONENT,
37
+ CLIENT_EXTENSION = _require2.CLIENT_EXTENSION,
38
+ DEFER = _require2.DEFER,
39
+ FLIGHT_FIELD = _require2.FLIGHT_FIELD,
40
+ FRAGMENT_SPREAD = _require2.FRAGMENT_SPREAD,
41
+ INLINE_FRAGMENT = _require2.INLINE_FRAGMENT,
42
+ LINKED_FIELD = _require2.LINKED_FIELD,
43
+ LINKED_HANDLE = _require2.LINKED_HANDLE,
44
+ MODULE_IMPORT = _require2.MODULE_IMPORT,
45
+ SCALAR_FIELD = _require2.SCALAR_FIELD,
46
+ SCALAR_HANDLE = _require2.SCALAR_HANDLE,
47
+ STREAM = _require2.STREAM,
48
+ TYPE_DISCRIMINATOR = _require2.TYPE_DISCRIMINATOR;
49
+
50
+ var _require3 = require('./ClientID'),
51
+ generateClientID = _require3.generateClientID,
52
+ isClientID = _require3.isClientID;
53
+
54
+ var _require4 = require('./RelayConcreteVariables'),
55
+ getLocalVariables = _require4.getLocalVariables;
56
+
57
+ var _require5 = require('./RelayModernSelector'),
58
+ createNormalizationSelector = _require5.createNormalizationSelector;
59
+
60
+ var _require6 = require('./RelayStoreReactFlightUtils'),
61
+ refineToReactFlightPayloadData = _require6.refineToReactFlightPayloadData,
62
+ REACT_FLIGHT_EXECUTABLE_DEFINITIONS_STORAGE_KEY = _require6.REACT_FLIGHT_EXECUTABLE_DEFINITIONS_STORAGE_KEY,
63
+ REACT_FLIGHT_TREE_STORAGE_KEY = _require6.REACT_FLIGHT_TREE_STORAGE_KEY,
64
+ REACT_FLIGHT_TYPE_NAME = _require6.REACT_FLIGHT_TYPE_NAME;
65
+
66
+ var _require7 = require('./RelayStoreUtils'),
67
+ getArgumentValues = _require7.getArgumentValues,
68
+ getHandleStorageKey = _require7.getHandleStorageKey,
69
+ getModuleComponentKey = _require7.getModuleComponentKey,
70
+ getModuleOperationKey = _require7.getModuleOperationKey,
71
+ getStorageKey = _require7.getStorageKey,
72
+ TYPENAME_KEY = _require7.TYPENAME_KEY,
73
+ ROOT_ID = _require7.ROOT_ID,
74
+ ROOT_TYPE = _require7.ROOT_TYPE;
75
+
76
+ var _require8 = require('./TypeID'),
77
+ generateTypeID = _require8.generateTypeID,
78
+ TYPE_SCHEMA_TYPE = _require8.TYPE_SCHEMA_TYPE;
72
79
 
73
80
  /**
74
81
  * Normalizes the results of a query and standard GraphQL response, writing the
@@ -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,14 +126,15 @@ 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
  };
124
133
  };
125
134
 
126
135
  _proto._getVariableValue = function _getVariableValue(name) {
127
- !this._variables.hasOwnProperty(name) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer(): Undefined variable `%s`.', name) : invariant(false) : void 0;
136
+ !this._variables.hasOwnProperty(name) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer(): Undefined variable `%s`.', name) : invariant(false) : void 0; // $FlowFixMe[cannot-write]
137
+
128
138
  return this._variables[name];
129
139
  };
130
140
 
@@ -146,7 +156,7 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
146
156
  break;
147
157
 
148
158
  case CONDITION:
149
- var conditionValue = this._getVariableValue(selection.condition);
159
+ var conditionValue = Boolean(this._getVariableValue(selection.condition));
150
160
 
151
161
  if (conditionValue === selection.passingValue) {
152
162
  this._traverseSelections(selection, record, data);
@@ -156,8 +166,12 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
156
166
 
157
167
  case FRAGMENT_SPREAD:
158
168
  {
169
+ var prevVariables = this._variables;
170
+ this._variables = getLocalVariables(this._variables, selection.fragment.argumentDefinitions, selection.args);
171
+
159
172
  this._traverseSelections(selection.fragment, record, data);
160
173
 
174
+ this._variables = prevVariables;
161
175
  break;
162
176
  }
163
177
 
@@ -171,7 +185,7 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
171
185
  if (_typeName === selection.type) {
172
186
  this._traverseSelections(selection, record, data);
173
187
  }
174
- } else if (RelayFeatureFlags.ENABLE_PRECISE_TYPE_REFINEMENT) {
188
+ } else {
175
189
  var implementsInterface = data.hasOwnProperty(abstractKey);
176
190
 
177
191
  var _typeName2 = RelayModernRecord.getType(record);
@@ -191,18 +205,6 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
191
205
  if (implementsInterface) {
192
206
  this._traverseSelections(selection, record, data);
193
207
  }
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
208
  }
207
209
 
208
210
  break;
@@ -210,26 +212,23 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
210
212
 
211
213
  case TYPE_DISCRIMINATOR:
212
214
  {
213
- if (RelayFeatureFlags.ENABLE_PRECISE_TYPE_REFINEMENT) {
214
- var _abstractKey = selection.abstractKey;
215
-
216
- var _implementsInterface2 = data.hasOwnProperty(_abstractKey);
215
+ var _abstractKey = selection.abstractKey;
217
216
 
218
- var _typeName3 = RelayModernRecord.getType(record);
217
+ var _implementsInterface = data.hasOwnProperty(_abstractKey);
219
218
 
220
- var _typeID = generateTypeID(_typeName3);
219
+ var _typeName3 = RelayModernRecord.getType(record);
221
220
 
222
- var _typeRecord = this._recordSource.get(_typeID);
221
+ var _typeID = generateTypeID(_typeName3);
223
222
 
224
- if (_typeRecord == null) {
225
- _typeRecord = RelayModernRecord.create(_typeID, TYPE_SCHEMA_TYPE);
223
+ var _typeRecord = this._recordSource.get(_typeID);
226
224
 
227
- this._recordSource.set(_typeID, _typeRecord);
228
- }
225
+ if (_typeRecord == null) {
226
+ _typeRecord = RelayModernRecord.create(_typeID, TYPE_SCHEMA_TYPE);
229
227
 
230
- RelayModernRecord.setValue(_typeRecord, _abstractKey, _implementsInterface2);
228
+ this._recordSource.set(_typeID, _typeRecord);
231
229
  }
232
230
 
231
+ RelayModernRecord.setValue(_typeRecord, _abstractKey, _implementsInterface);
233
232
  break;
234
233
  }
235
234
 
@@ -240,12 +239,17 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
240
239
  var handleKey = getHandleStorageKey(selection, this._variables);
241
240
 
242
241
  this._handleFieldPayloads.push({
242
+ /* $FlowFixMe[class-object-subtyping] added when improving typing
243
+ * for this parameters */
243
244
  args: args,
244
245
  dataID: RelayModernRecord.getDataID(record),
245
246
  fieldKey: fieldKey,
246
247
  handle: selection.handle,
247
248
  handleKey: handleKey,
248
- handleArgs: selection.handleArgs ? getArgumentValues(selection.handleArgs, this._variables) : {}
249
+ handleArgs: selection.handleArgs ?
250
+ /* $FlowFixMe[class-object-subtyping] added when improving typing
251
+ * for this parameters */
252
+ getArgumentValues(selection.handleArgs, this._variables) : {}
249
253
  });
250
254
 
251
255
  break;
@@ -274,6 +278,15 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
274
278
  this._isClientExtension = isClientExtension;
275
279
  break;
276
280
 
281
+ case CLIENT_COMPONENT:
282
+ if (this._shouldProcessClientComponents === false) {
283
+ break;
284
+ }
285
+
286
+ this._traverseSelections(selection.fragment, record, data);
287
+
288
+ break;
289
+
277
290
  case FLIGHT_FIELD:
278
291
  if (RelayFeatureFlags.ENABLE_REACT_FLIGHT_COMPONENT_FIELD) {
279
292
  this._normalizeFlightField(node, selection, record, data);
@@ -283,6 +296,11 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
283
296
 
284
297
  break;
285
298
 
299
+ case ACTOR_CHANGE:
300
+ this._normalizeActorChange(node, selection, record, data);
301
+
302
+ break;
303
+
286
304
  default:
287
305
  selection;
288
306
  !false ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayResponseNormalizer(): Unexpected ast kind `%s`.', selection.kind) : invariant(false) : void 0;
@@ -310,7 +328,8 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
310
328
  label: defer.label,
311
329
  path: (0, _toConsumableArray2["default"])(this._path),
312
330
  selector: createNormalizationSelector(defer, RelayModernRecord.getDataID(record), this._variables),
313
- typeName: RelayModernRecord.getType(record)
331
+ typeName: RelayModernRecord.getType(record),
332
+ actorIdentifier: this._actorIdentifier
314
333
  });
315
334
  }
316
335
  };
@@ -336,7 +355,8 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
336
355
  path: (0, _toConsumableArray2["default"])(this._path),
337
356
  parentID: RelayModernRecord.getDataID(record),
338
357
  node: stream,
339
- variables: this._variables
358
+ variables: this._variables,
359
+ actorIdentifier: this._actorIdentifier
340
360
  });
341
361
  }
342
362
  };
@@ -352,13 +372,16 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
352
372
  RelayModernRecord.setValue(record, operationKey, operationReference !== null && operationReference !== void 0 ? operationReference : null);
353
373
 
354
374
  if (operationReference != null) {
355
- this._moduleImportPayloads.push({
375
+ this._followupPayloads.push({
376
+ kind: 'ModuleImportPayload',
377
+ args: moduleImport.args,
356
378
  data: data,
357
379
  dataID: RelayModernRecord.getDataID(record),
358
380
  operationReference: operationReference,
359
381
  path: (0, _toConsumableArray2["default"])(this._path),
360
382
  typeName: typeName,
361
- variables: this._variables
383
+ variables: this._variables,
384
+ actorIdentifier: this._actorIdentifier
362
385
  });
363
386
  }
364
387
  };
@@ -429,19 +452,97 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
429
452
  }
430
453
  };
431
454
 
455
+ _proto._normalizeActorChange = function _normalizeActorChange(parent, selection, record, data) {
456
+ var _field$concreteType;
457
+
458
+ var field = selection.linkedField;
459
+ !(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;
460
+ var responseKey = field.alias || field.name;
461
+ var storageKey = getStorageKey(field, this._variables);
462
+ var fieldValue = data[responseKey];
463
+
464
+ if (fieldValue == null) {
465
+ if (fieldValue === undefined) {
466
+ var isOptionalField = this._isClientExtension || this._isUnmatchedAbstractType;
467
+
468
+ if (isOptionalField) {
469
+ return;
470
+ } else if (!this._treatMissingFieldsAsNull) {
471
+ if (process.env.NODE_ENV !== "production") {
472
+ 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;
473
+ }
474
+
475
+ return;
476
+ }
477
+ }
478
+
479
+ RelayModernRecord.setValue(record, storageKey, null);
480
+ return;
481
+ }
482
+
483
+ var actorIdentifier = getActorIdentifierFromPayload(fieldValue);
484
+
485
+ if (actorIdentifier == null) {
486
+ if (process.env.NODE_ENV !== "production") {
487
+ 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;
488
+ }
489
+
490
+ RelayModernRecord.setValue(record, storageKey, null);
491
+ return;
492
+ } // $FlowFixMe[incompatible-call]
493
+
494
+
495
+ var typeName = (_field$concreteType = field.concreteType) !== null && _field$concreteType !== void 0 ? _field$concreteType : this._getRecordType(fieldValue);
496
+ var nextID = this._getDataId( // $FlowFixMe[incompatible-call]
497
+ fieldValue, typeName) || RelayModernRecord.getLinkedRecordID(record, storageKey) || generateClientID(RelayModernRecord.getDataID(record), storageKey);
498
+ !(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;
499
+ RelayModernRecord.setActorLinkedRecordID(record, storageKey, actorIdentifier, nextID);
500
+
501
+ this._followupPayloads.push({
502
+ kind: 'ActorPayload',
503
+ data: fieldValue,
504
+ dataID: nextID,
505
+ path: [].concat((0, _toConsumableArray2["default"])(this._path), [responseKey]),
506
+ typeName: typeName,
507
+ variables: this._variables,
508
+ node: field,
509
+ actorIdentifier: actorIdentifier
510
+ });
511
+ };
512
+
432
513
  _proto._normalizeFlightField = function _normalizeFlightField(parent, selection, record, data) {
433
514
  var responseKey = selection.alias || selection.name;
434
515
  var storageKey = getStorageKey(selection, this._variables);
435
516
  var fieldValue = data[responseKey];
436
517
 
437
518
  if (fieldValue == null) {
519
+ if (fieldValue === undefined) {
520
+ // Flight field may be missing in the response if:
521
+ // - It is inside an abstract type refinement where the concrete type does
522
+ // not conform to the interface/union.
523
+ // However an otherwise-required field may also be missing if the server
524
+ // is configured to skip fields with `null` values, in which case the
525
+ // client is assumed to be correctly configured with
526
+ // treatMissingFieldsAsNull=true.
527
+ if (this._isUnmatchedAbstractType) {
528
+ // Field not expected to exist regardless of whether the server is pruning null
529
+ // fields or not.
530
+ return;
531
+ } else {
532
+ // Not optional and the server is not pruning null fields: field is expected
533
+ // to be present
534
+ !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;
535
+ }
536
+ }
537
+
438
538
  RelayModernRecord.setValue(record, storageKey, null);
439
539
  return;
440
540
  }
441
541
 
442
542
  var reactFlightPayload = refineToReactFlightPayloadData(fieldValue);
543
+ var reactFlightPayloadDeserializer = this._reactFlightPayloadDeserializer;
443
544
  !(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;
545
+ !(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
546
 
446
547
  if (reactFlightPayload.errors.length > 0) {
447
548
  if (typeof this._reactFlightServerErrorHandler === 'function') {
@@ -449,22 +550,7 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
449
550
  } else {
450
551
  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
552
  }
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);
553
+ }
468
554
 
469
555
  var reactFlightID = generateClientID(RelayModernRecord.getDataID(record), getStorageKey(selection, this._variables));
470
556
 
@@ -476,8 +562,27 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
476
562
  this._recordSource.set(reactFlightID, reactFlightClientResponseRecord);
477
563
  }
478
564
 
565
+ if (reactFlightPayload.tree == null) {
566
+ // This typically indicates that a fatal server error prevented rows from
567
+ // being written. When this occurs, we should not continue normalization of
568
+ // the Flight field because the row response is malformed.
569
+ //
570
+ // Receiving empty rows is OK because it can indicate the start of a stream.
571
+ 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
572
+ // and empty reachable definitions
573
+
574
+ RelayModernRecord.setValue(reactFlightClientResponseRecord, REACT_FLIGHT_TREE_STORAGE_KEY, null);
575
+ RelayModernRecord.setValue(reactFlightClientResponseRecord, REACT_FLIGHT_EXECUTABLE_DEFINITIONS_STORAGE_KEY, []);
576
+ RelayModernRecord.setLinkedRecordID(record, storageKey, reactFlightID);
577
+ return;
578
+ } // We store the deserialized reactFlightClientResponse in a separate
579
+ // record and link it to the parent record. This is so we can GC the Flight
580
+ // tree later even if the parent record is still reachable.
581
+
582
+
583
+ var reactFlightClientResponse = reactFlightPayloadDeserializer(reactFlightPayload.tree);
479
584
  RelayModernRecord.setValue(reactFlightClientResponseRecord, REACT_FLIGHT_TREE_STORAGE_KEY, reactFlightClientResponse);
480
- var reachableQueries = [];
585
+ var reachableExecutableDefinitions = [];
481
586
 
482
587
  var _iterator = (0, _createForOfIteratorHelper2["default"])(reactFlightPayload.queries),
483
588
  _step;
@@ -487,17 +592,20 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
487
592
  var query = _step.value;
488
593
 
489
594
  if (query.response.data != null) {
490
- this._moduleImportPayloads.push({
595
+ this._followupPayloads.push({
596
+ kind: 'ModuleImportPayload',
597
+ args: null,
491
598
  data: query.response.data,
492
599
  dataID: ROOT_ID,
493
600
  operationReference: query.module,
494
601
  path: [],
495
602
  typeName: ROOT_TYPE,
496
- variables: query.variables
603
+ variables: query.variables,
604
+ actorIdentifier: this._actorIdentifier
497
605
  });
498
606
  }
499
607
 
500
- reachableQueries.push({
608
+ reachableExecutableDefinitions.push({
501
609
  module: query.module,
502
610
  variables: query.variables
503
611
  });
@@ -508,17 +616,49 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
508
616
  _iterator.f();
509
617
  }
510
618
 
511
- RelayModernRecord.setValue(reactFlightClientResponseRecord, REACT_FLIGHT_QUERIES_STORAGE_KEY, reachableQueries);
619
+ var _iterator2 = (0, _createForOfIteratorHelper2["default"])(reactFlightPayload.fragments),
620
+ _step2;
621
+
622
+ try {
623
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
624
+ var fragment = _step2.value;
625
+
626
+ if (fragment.response.data != null) {
627
+ this._followupPayloads.push({
628
+ kind: 'ModuleImportPayload',
629
+ args: null,
630
+ data: fragment.response.data,
631
+ dataID: fragment.__id,
632
+ operationReference: fragment.module,
633
+ path: [],
634
+ typeName: fragment.__typename,
635
+ variables: fragment.variables,
636
+ actorIdentifier: this._actorIdentifier
637
+ });
638
+ }
639
+
640
+ reachableExecutableDefinitions.push({
641
+ module: fragment.module,
642
+ variables: fragment.variables
643
+ });
644
+ }
645
+ } catch (err) {
646
+ _iterator2.e(err);
647
+ } finally {
648
+ _iterator2.f();
649
+ }
650
+
651
+ RelayModernRecord.setValue(reactFlightClientResponseRecord, REACT_FLIGHT_EXECUTABLE_DEFINITIONS_STORAGE_KEY, reachableExecutableDefinitions);
512
652
  RelayModernRecord.setLinkedRecordID(record, storageKey, reactFlightID);
513
653
  };
514
654
 
515
655
  _proto._normalizeLink = function _normalizeLink(field, record, storageKey, fieldValue) {
516
- var _field$concreteType;
656
+ var _field$concreteType2;
517
657
 
518
658
  !(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
659
  var nextID = this._getDataId( // $FlowFixMe[incompatible-variance]
520
660
  fieldValue, // $FlowFixMe[incompatible-variance]
521
- (_field$concreteType = field.concreteType) !== null && _field$concreteType !== void 0 ? _field$concreteType : this._getRecordType(fieldValue)) || // Reuse previously generated client IDs
661
+ (_field$concreteType2 = field.concreteType) !== null && _field$concreteType2 !== void 0 ? _field$concreteType2 : this._getRecordType(fieldValue)) || // Reuse previously generated client IDs
522
662
  RelayModernRecord.getLinkedRecordID(record, storageKey) || generateClientID(RelayModernRecord.getDataID(record), storageKey);
523
663
  !(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
664
 
@@ -552,7 +692,7 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
552
692
  var prevIDs = RelayModernRecord.getLinkedRecordIDs(record, storageKey);
553
693
  var nextIDs = [];
554
694
  fieldValue.forEach(function (item, nextIndex) {
555
- var _field$concreteType2;
695
+ var _field$concreteType3;
556
696
 
557
697
  // validate response data
558
698
  if (item == null) {
@@ -565,7 +705,7 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
565
705
  !(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
706
  var nextID = _this._getDataId( // $FlowFixMe[incompatible-variance]
567
707
  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:
708
+ (_field$concreteType3 = field.concreteType) !== null && _field$concreteType3 !== void 0 ? _field$concreteType3 : _this._getRecordType(item)) || prevIDs && prevIDs[nextIndex] || // Reuse previously generated client IDs:
569
709
  generateClientID(RelayModernRecord.getDataID(record), storageKey, nextIndex);
570
710
  !(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
711
  nextIDs.push(nextID);
@@ -604,9 +744,9 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
604
744
  ;
605
745
 
606
746
  _proto._validateRecordType = function _validateRecordType(record, field, payload) {
607
- var _field$concreteType3;
747
+ var _field$concreteType4;
608
748
 
609
- var typeName = (_field$concreteType3 = field.concreteType) !== null && _field$concreteType3 !== void 0 ? _field$concreteType3 : this._getRecordType(payload);
749
+ var typeName = (_field$concreteType4 = field.concreteType) !== null && _field$concreteType4 !== void 0 ? _field$concreteType4 : this._getRecordType(payload);
610
750
  var dataID = RelayModernRecord.getDataID(record);
611
751
  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
752
  }
@@ -638,7 +778,6 @@ var RelayResponseNormalizer = /*#__PURE__*/function () {
638
778
  return RelayResponseNormalizer;
639
779
  }();
640
780
 
641
- var instrumentedNormalize = RelayProfiler.instrument('RelayResponseNormalizer.normalize', normalize);
642
781
  module.exports = {
643
- normalize: instrumentedNormalize
782
+ normalize: normalize
644
783
  };
@@ -10,17 +10,19 @@
10
10
  // flowlint ambiguous-object-type:error
11
11
  'use strict';
12
12
 
13
- var invariant = require("fbjs/lib/invariant");
13
+ var invariant = require('invariant');
14
14
 
15
15
  var _require = require('./RelayModernRecord'),
16
16
  getType = _require.getType;
17
17
 
18
- var REACT_FLIGHT_QUERIES_STORAGE_KEY = 'queries';
18
+ // Reachable (client) executable definitions encountered while server component
19
+ // rendering
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,