relay-runtime 10.0.1 → 10.1.3

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 (82) hide show
  1. package/handlers/RelayDefaultHandlerProvider.js.flow +6 -0
  2. package/handlers/connection/MutationHandlers.js.flow +152 -20
  3. package/index.js +1 -1
  4. package/index.js.flow +17 -1
  5. package/lib/handlers/RelayDefaultHandlerProvider.js +9 -0
  6. package/lib/handlers/connection/MutationHandlers.js +185 -21
  7. package/lib/index.js +7 -0
  8. package/lib/mutations/RelayDeclarativeMutationConfig.js +5 -7
  9. package/lib/mutations/commitMutation.js +1 -4
  10. package/lib/mutations/validateMutation.js +28 -12
  11. package/lib/network/RelayQueryResponseCache.js +3 -7
  12. package/lib/query/GraphQLTag.js +2 -1
  13. package/lib/query/fetchQuery.js +2 -3
  14. package/lib/query/fetchQueryInternal.js +2 -3
  15. package/lib/store/DataChecker.js +85 -10
  16. package/lib/store/RelayConcreteVariables.js +2 -6
  17. package/lib/store/RelayModernEnvironment.js +81 -72
  18. package/lib/store/RelayModernFragmentSpecResolver.js +14 -7
  19. package/lib/store/RelayModernOperationDescriptor.js +6 -5
  20. package/lib/store/RelayModernQueryExecutor.js +46 -33
  21. package/lib/store/RelayModernRecord.js +3 -7
  22. package/lib/store/RelayModernStore.js +39 -137
  23. package/lib/store/RelayOperationTracker.js +7 -9
  24. package/lib/store/RelayOptimisticRecordSource.js +2 -6
  25. package/lib/store/RelayPublishQueue.js +1 -1
  26. package/lib/store/RelayReader.js +196 -33
  27. package/lib/store/RelayRecordSourceMapImpl.js +3 -5
  28. package/lib/store/RelayReferenceMarker.js +87 -5
  29. package/lib/store/RelayResponseNormalizer.js +115 -19
  30. package/lib/store/RelayStoreReactFlightUtils.js +47 -0
  31. package/lib/store/RelayStoreSubscriptions.js +162 -0
  32. package/lib/store/RelayStoreSubscriptionsUsingMapByID.js +258 -0
  33. package/lib/store/StoreInspector.js +2 -6
  34. package/lib/store/createRelayContext.js +5 -0
  35. package/lib/store/defaultRequiredFieldLogger.js +18 -0
  36. package/lib/store/normalizeRelayPayload.js +2 -6
  37. package/lib/subscription/requestSubscription.js +2 -3
  38. package/lib/util/NormalizationNode.js +1 -5
  39. package/lib/util/RelayConcreteNode.js +2 -0
  40. package/lib/util/RelayFeatureFlags.js +7 -2
  41. package/lib/util/createPayloadFor3DField.js +2 -7
  42. package/lib/util/getFragmentIdentifier.js +12 -3
  43. package/lib/util/getOperation.js +33 -0
  44. package/lib/util/isEmptyObject.js +25 -0
  45. package/lib/util/recycleNodesInto.js +4 -1
  46. package/lib/util/reportMissingRequiredFields.js +48 -0
  47. package/mutations/commitMutation.js.flow +1 -2
  48. package/mutations/validateMutation.js.flow +34 -5
  49. package/network/RelayNetworkTypes.js.flow +22 -0
  50. package/package.json +2 -2
  51. package/query/GraphQLTag.js.flow +3 -1
  52. package/query/fetchQuery.js.flow +2 -2
  53. package/query/fetchQueryInternal.js.flow +0 -5
  54. package/relay-runtime.js +2 -2
  55. package/relay-runtime.min.js +2 -2
  56. package/store/DataChecker.js.flow +68 -2
  57. package/store/RelayModernEnvironment.js.flow +107 -87
  58. package/store/RelayModernFragmentSpecResolver.js.flow +13 -1
  59. package/store/RelayModernOperationDescriptor.js.flow +5 -1
  60. package/store/RelayModernQueryExecutor.js.flow +47 -23
  61. package/store/RelayModernStore.js.flow +33 -107
  62. package/store/RelayPublishQueue.js.flow +1 -1
  63. package/store/RelayReader.js.flow +180 -15
  64. package/store/RelayReferenceMarker.js.flow +72 -5
  65. package/store/RelayResponseNormalizer.js.flow +130 -19
  66. package/store/RelayStoreReactFlightUtils.js.flow +64 -0
  67. package/store/RelayStoreSubscriptions.js.flow +168 -0
  68. package/store/RelayStoreSubscriptionsUsingMapByID.js.flow +259 -0
  69. package/store/RelayStoreTypes.js.flow +130 -37
  70. package/store/createRelayContext.js.flow +3 -0
  71. package/store/defaultRequiredFieldLogger.js.flow +23 -0
  72. package/subscription/requestSubscription.js.flow +5 -2
  73. package/util/NormalizationNode.js.flow +17 -2
  74. package/util/ReaderNode.js.flow +20 -1
  75. package/util/RelayConcreteNode.js.flow +6 -0
  76. package/util/RelayFeatureFlags.js.flow +12 -1
  77. package/util/getFragmentIdentifier.js.flow +33 -9
  78. package/util/getOperation.js.flow +40 -0
  79. package/util/getRequestIdentifier.js.flow +1 -1
  80. package/util/isEmptyObject.js.flow +25 -0
  81. package/util/recycleNodesInto.js.flow +11 -0
  82. package/util/reportMissingRequiredFields.js.flow +51 -0
@@ -20,28 +20,33 @@ var _require = require('../util/RelayConcreteNode'),
20
20
  CLIENT_EXTENSION = _require.CLIENT_EXTENSION,
21
21
  CONDITION = _require.CONDITION,
22
22
  DEFER = _require.DEFER,
23
+ FLIGHT_FIELD = _require.FLIGHT_FIELD,
23
24
  FRAGMENT_SPREAD = _require.FRAGMENT_SPREAD,
24
25
  INLINE_DATA_FRAGMENT_SPREAD = _require.INLINE_DATA_FRAGMENT_SPREAD,
25
26
  INLINE_FRAGMENT = _require.INLINE_FRAGMENT,
26
27
  LINKED_FIELD = _require.LINKED_FIELD,
27
28
  MODULE_IMPORT = _require.MODULE_IMPORT,
29
+ REQUIRED_FIELD = _require.REQUIRED_FIELD,
28
30
  SCALAR_FIELD = _require.SCALAR_FIELD,
29
31
  STREAM = _require.STREAM;
30
32
 
31
- var _require2 = require('./RelayStoreUtils'),
32
- FRAGMENTS_KEY = _require2.FRAGMENTS_KEY,
33
- FRAGMENT_OWNER_KEY = _require2.FRAGMENT_OWNER_KEY,
34
- FRAGMENT_PROP_NAME_KEY = _require2.FRAGMENT_PROP_NAME_KEY,
35
- ID_KEY = _require2.ID_KEY,
36
- IS_WITHIN_UNMATCHED_TYPE_REFINEMENT = _require2.IS_WITHIN_UNMATCHED_TYPE_REFINEMENT,
37
- MODULE_COMPONENT_KEY = _require2.MODULE_COMPONENT_KEY,
38
- ROOT_ID = _require2.ROOT_ID,
39
- getArgumentValues = _require2.getArgumentValues,
40
- getStorageKey = _require2.getStorageKey,
41
- getModuleComponentKey = _require2.getModuleComponentKey;
42
-
43
- var _require3 = require('./TypeID'),
44
- generateTypeID = _require3.generateTypeID;
33
+ var _require2 = require('./RelayStoreReactFlightUtils'),
34
+ getReactFlightClientResponse = _require2.getReactFlightClientResponse;
35
+
36
+ var _require3 = require('./RelayStoreUtils'),
37
+ FRAGMENTS_KEY = _require3.FRAGMENTS_KEY,
38
+ FRAGMENT_OWNER_KEY = _require3.FRAGMENT_OWNER_KEY,
39
+ FRAGMENT_PROP_NAME_KEY = _require3.FRAGMENT_PROP_NAME_KEY,
40
+ ID_KEY = _require3.ID_KEY,
41
+ IS_WITHIN_UNMATCHED_TYPE_REFINEMENT = _require3.IS_WITHIN_UNMATCHED_TYPE_REFINEMENT,
42
+ MODULE_COMPONENT_KEY = _require3.MODULE_COMPONENT_KEY,
43
+ ROOT_ID = _require3.ROOT_ID,
44
+ getArgumentValues = _require3.getArgumentValues,
45
+ getStorageKey = _require3.getStorageKey,
46
+ getModuleComponentKey = _require3.getModuleComponentKey;
47
+
48
+ var _require4 = require('./TypeID'),
49
+ generateTypeID = _require4.generateTypeID;
45
50
 
46
51
  function read(recordSource, selector) {
47
52
  var reader = new RelayReader(recordSource, selector);
@@ -56,6 +61,7 @@ var RelayReader = /*#__PURE__*/function () {
56
61
  function RelayReader(recordSource, selector) {
57
62
  this._isMissingData = false;
58
63
  this._isWithinUnmatchedTypeRefinement = false;
64
+ this._missingRequiredFields = null;
59
65
  this._owner = selector.owner;
60
66
  this._recordSource = recordSource;
61
67
  this._seenRecords = {};
@@ -124,7 +130,8 @@ var RelayReader = /*#__PURE__*/function () {
124
130
  data: data,
125
131
  isMissingData: this._isMissingData && isDataExpectedToBePresent,
126
132
  seenRecords: this._seenRecords,
127
- selector: this._selector
133
+ selector: this._selector,
134
+ missingRequiredFields: this._missingRequiredFields
128
135
  };
129
136
  };
130
137
 
@@ -143,9 +150,9 @@ var RelayReader = /*#__PURE__*/function () {
143
150
 
144
151
  var data = prevData || {};
145
152
 
146
- this._traverseSelections(node.selections, record, data);
153
+ var hadRequiredData = this._traverseSelections(node.selections, record, data);
147
154
 
148
- return data;
155
+ return hadRequiredData ? data : null;
149
156
  };
150
157
 
151
158
  _proto._getVariableValue = function _getVariableValue(name) {
@@ -153,11 +160,76 @@ var RelayReader = /*#__PURE__*/function () {
153
160
  return this._variables[name];
154
161
  };
155
162
 
156
- _proto._traverseSelections = function _traverseSelections(selections, record, data) {
163
+ _proto._maybeReportUnexpectedNull = function _maybeReportUnexpectedNull(fieldPath, action, record) {
164
+ var _this$_missingRequire;
165
+
166
+ if (((_this$_missingRequire = this._missingRequiredFields) === null || _this$_missingRequire === void 0 ? void 0 : _this$_missingRequire.action) === 'THROW') {
167
+ // Chained @required directives may cause a parent `@required(action:
168
+ // THROW)` field to become null, so the first missing field we
169
+ // encounter is likely to be the root cause of the error.
170
+ return;
171
+ }
172
+
173
+ var owner = this._selector.node.name;
174
+
175
+ switch (action) {
176
+ case 'THROW':
177
+ this._missingRequiredFields = {
178
+ action: action,
179
+ field: {
180
+ path: fieldPath,
181
+ owner: owner
182
+ }
183
+ };
184
+ return;
185
+
186
+ case 'LOG':
187
+ if (this._missingRequiredFields == null) {
188
+ this._missingRequiredFields = {
189
+ action: action,
190
+ fields: []
191
+ };
192
+ }
193
+
194
+ this._missingRequiredFields.fields.push({
195
+ path: fieldPath,
196
+ owner: owner
197
+ });
198
+
199
+ return;
200
+
201
+ default:
202
+ action;
203
+ }
204
+ };
205
+
206
+ _proto._traverseSelections = function _traverseSelections(selections, record, data)
207
+ /* had all expected data */
208
+ {
157
209
  for (var i = 0; i < selections.length; i++) {
158
210
  var selection = selections[i];
159
211
 
160
212
  switch (selection.kind) {
213
+ case REQUIRED_FIELD:
214
+ !RelayFeatureFlags.ENABLE_REQUIRED_DIRECTIVES ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayReader(): Encountered a `@required` directive at path "%s" in `%s` without the `ENABLE_REQUIRED_DIRECTIVES` feature flag enabled.', selection.path, this._selector.node.name) : invariant(false) : void 0;
215
+
216
+ var fieldValue = this._readRequiredField(selection, record, data);
217
+
218
+ if (fieldValue == null) {
219
+ var action = selection.action;
220
+
221
+ if (action !== 'NONE') {
222
+ this._maybeReportUnexpectedNull(selection.path, action, record);
223
+ } // We are going to throw, or our parent is going to get nulled out.
224
+ // Either way, sibling values are going to be ignored, so we can
225
+ // bail early here as an optimization.
226
+
227
+
228
+ return false;
229
+ }
230
+
231
+ break;
232
+
161
233
  case SCALAR_FIELD:
162
234
  this._readScalar(selection, record, data);
163
235
 
@@ -176,7 +248,11 @@ var RelayReader = /*#__PURE__*/function () {
176
248
  var conditionValue = this._getVariableValue(selection.condition);
177
249
 
178
250
  if (conditionValue === selection.passingValue) {
179
- this._traverseSelections(selection.selections, record, data);
251
+ var hasExpectedData = this._traverseSelections(selection.selections, record, data);
252
+
253
+ if (!hasExpectedData) {
254
+ return false;
255
+ }
180
256
  }
181
257
 
182
258
  break;
@@ -190,7 +266,11 @@ var RelayReader = /*#__PURE__*/function () {
190
266
  var typeName = RelayModernRecord.getType(record);
191
267
 
192
268
  if (typeName != null && typeName === selection.type) {
193
- this._traverseSelections(selection.selections, record, data);
269
+ var _hasExpectedData = this._traverseSelections(selection.selections, record, data);
270
+
271
+ if (!_hasExpectedData) {
272
+ return false;
273
+ }
194
274
  }
195
275
  } else if (RelayFeatureFlags.ENABLE_PRECISE_TYPE_REFINEMENT) {
196
276
  // Similar to the logic in read(): data is only expected to be present
@@ -246,15 +326,37 @@ var RelayReader = /*#__PURE__*/function () {
246
326
 
247
327
  case DEFER:
248
328
  case CLIENT_EXTENSION:
249
- var isMissingData = this._isMissingData;
329
+ {
330
+ var isMissingData = this._isMissingData;
250
331
 
251
- this._traverseSelections(selection.selections, record, data);
332
+ var _hasExpectedData2 = this._traverseSelections(selection.selections, record, data);
252
333
 
253
- this._isMissingData = isMissingData;
254
- break;
334
+ this._isMissingData = isMissingData;
335
+
336
+ if (!_hasExpectedData2) {
337
+ return false;
338
+ }
339
+
340
+ break;
341
+ }
255
342
 
256
343
  case STREAM:
257
- this._traverseSelections(selection.selections, record, data);
344
+ {
345
+ var _hasExpectedData3 = this._traverseSelections(selection.selections, record, data);
346
+
347
+ if (!_hasExpectedData3) {
348
+ return false;
349
+ }
350
+
351
+ break;
352
+ }
353
+
354
+ case FLIGHT_FIELD:
355
+ if (RelayFeatureFlags.ENABLE_REACT_FLIGHT_COMPONENT_FIELD) {
356
+ this._readFlightField(selection, record, data);
357
+ } else {
358
+ throw new Error('Flight fields are not yet supported.');
359
+ }
258
360
 
259
361
  break;
260
362
 
@@ -263,13 +365,69 @@ var RelayReader = /*#__PURE__*/function () {
263
365
  !false ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayReader(): Unexpected ast kind `%s`.', selection.kind) : invariant(false) : void 0;
264
366
  }
265
367
  }
368
+
369
+ return true;
266
370
  };
267
371
 
268
- _proto._readScalar = function _readScalar(field, record, data) {
372
+ _proto._readRequiredField = function _readRequiredField(selection, record, data) {
373
+ switch (selection.field.kind) {
374
+ case SCALAR_FIELD:
375
+ return this._readScalar(selection.field, record, data);
376
+
377
+ case LINKED_FIELD:
378
+ if (selection.field.plural) {
379
+ return this._readPluralLink(selection.field, record, data);
380
+ } else {
381
+ return this._readLink(selection.field, record, data);
382
+ }
383
+
384
+ default:
385
+ selection.field.kind;
386
+ !false ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayReader(): Unexpected ast kind `%s`.', selection.kind) : invariant(false) : void 0;
387
+ }
388
+ };
389
+
390
+ _proto._readFlightField = function _readFlightField(field, record, data) {
269
391
  var _field$alias;
270
392
 
271
393
  var applicationName = (_field$alias = field.alias) !== null && _field$alias !== void 0 ? _field$alias : field.name;
272
394
  var storageKey = getStorageKey(field, this._variables);
395
+ var reactFlightClientResponseRecordID = RelayModernRecord.getLinkedRecordID(record, storageKey);
396
+
397
+ if (reactFlightClientResponseRecordID == null) {
398
+ data[applicationName] = reactFlightClientResponseRecordID;
399
+
400
+ if (reactFlightClientResponseRecordID === undefined) {
401
+ this._isMissingData = true;
402
+ }
403
+
404
+ return reactFlightClientResponseRecordID;
405
+ }
406
+
407
+ var reactFlightClientResponseRecord = this._recordSource.get(reactFlightClientResponseRecordID);
408
+
409
+ this._seenRecords[reactFlightClientResponseRecordID] = reactFlightClientResponseRecord;
410
+
411
+ if (reactFlightClientResponseRecord == null) {
412
+ data[applicationName] = reactFlightClientResponseRecord;
413
+
414
+ if (reactFlightClientResponseRecord === undefined) {
415
+ this._isMissingData = true;
416
+ }
417
+
418
+ return reactFlightClientResponseRecord;
419
+ }
420
+
421
+ var clientResponse = getReactFlightClientResponse(reactFlightClientResponseRecord);
422
+ data[applicationName] = clientResponse;
423
+ return clientResponse;
424
+ };
425
+
426
+ _proto._readScalar = function _readScalar(field, record, data) {
427
+ var _field$alias2;
428
+
429
+ var applicationName = (_field$alias2 = field.alias) !== null && _field$alias2 !== void 0 ? _field$alias2 : field.name;
430
+ var storageKey = getStorageKey(field, this._variables);
273
431
  var value = RelayModernRecord.getValue(record, storageKey);
274
432
 
275
433
  if (value === undefined) {
@@ -277,12 +435,13 @@ var RelayReader = /*#__PURE__*/function () {
277
435
  }
278
436
 
279
437
  data[applicationName] = value;
438
+ return value;
280
439
  };
281
440
 
282
441
  _proto._readLink = function _readLink(field, record, data) {
283
- var _field$alias2;
442
+ var _field$alias3;
284
443
 
285
- var applicationName = (_field$alias2 = field.alias) !== null && _field$alias2 !== void 0 ? _field$alias2 : field.name;
444
+ var applicationName = (_field$alias3 = field.alias) !== null && _field$alias3 !== void 0 ? _field$alias3 : field.name;
286
445
  var storageKey = getStorageKey(field, this._variables);
287
446
  var linkedID = RelayModernRecord.getLinkedRecordID(record, storageKey);
288
447
 
@@ -293,21 +452,24 @@ var RelayReader = /*#__PURE__*/function () {
293
452
  this._isMissingData = true;
294
453
  }
295
454
 
296
- return;
455
+ return linkedID;
297
456
  }
298
457
 
299
458
  var prevData = data[applicationName];
300
459
  !(prevData == null || typeof prevData === 'object') ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayReader(): Expected data for field `%s` on record `%s` ' + 'to be an object, got `%s`.', applicationName, RelayModernRecord.getDataID(record), prevData) : invariant(false) : void 0; // $FlowFixMe[incompatible-variance]
301
460
 
302
- data[applicationName] = this._traverse(field, linkedID, prevData);
461
+ var value = this._traverse(field, linkedID, prevData);
462
+
463
+ data[applicationName] = value;
464
+ return value;
303
465
  };
304
466
 
305
467
  _proto._readPluralLink = function _readPluralLink(field, record, data) {
306
468
  var _this = this;
307
469
 
308
- var _field$alias3;
470
+ var _field$alias4;
309
471
 
310
- var applicationName = (_field$alias3 = field.alias) !== null && _field$alias3 !== void 0 ? _field$alias3 : field.name;
472
+ var applicationName = (_field$alias4 = field.alias) !== null && _field$alias4 !== void 0 ? _field$alias4 : field.name;
311
473
  var storageKey = getStorageKey(field, this._variables);
312
474
  var linkedIDs = RelayModernRecord.getLinkedRecordIDs(record, storageKey);
313
475
 
@@ -318,7 +480,7 @@ var RelayReader = /*#__PURE__*/function () {
318
480
  this._isMissingData = true;
319
481
  }
320
482
 
321
- return;
483
+ return linkedIDs;
322
484
  }
323
485
 
324
486
  var prevData = data[applicationName];
@@ -342,6 +504,7 @@ var RelayReader = /*#__PURE__*/function () {
342
504
  linkedArray[nextIndex] = _this._traverse(field, linkedID, prevItem);
343
505
  });
344
506
  data[applicationName] = linkedArray;
507
+ return linkedArray;
345
508
  }
346
509
  /**
347
510
  * Reads a ReaderModuleImport, which was generated from using the @module
@@ -10,11 +10,9 @@
10
10
  // flowlint ambiguous-object-type:error
11
11
  'use strict';
12
12
 
13
- function _createForOfIteratorHelper(o) { if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (o = _unsupportedIterableToArray(o))) { var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var it, normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
13
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
14
14
 
15
- function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(n); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
16
-
17
- function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
15
+ var _createForOfIteratorHelper2 = _interopRequireDefault(require("@babel/runtime/helpers/createForOfIteratorHelper"));
18
16
 
19
17
  var RelayRecordState = require('./RelayRecordState');
20
18
 
@@ -84,7 +82,7 @@ var RelayMapRecordSourceMapImpl = /*#__PURE__*/function () {
84
82
  _proto.toJSON = function toJSON() {
85
83
  var obj = {};
86
84
 
87
- var _iterator = _createForOfIteratorHelper(this._records),
85
+ var _iterator = (0, _createForOfIteratorHelper2["default"])(this._records),
88
86
  _step;
89
87
 
90
88
  try {
@@ -10,16 +10,24 @@
10
10
  // flowlint ambiguous-object-type:error
11
11
  'use strict';
12
12
 
13
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
14
+
15
+ var _createForOfIteratorHelper2 = _interopRequireDefault(require("@babel/runtime/helpers/createForOfIteratorHelper"));
16
+
13
17
  var RelayConcreteNode = require('../util/RelayConcreteNode');
14
18
 
15
19
  var RelayFeatureFlags = require('../util/RelayFeatureFlags');
16
20
 
17
21
  var RelayModernRecord = require('./RelayModernRecord');
18
22
 
23
+ var RelayStoreReactFlightUtils = require('./RelayStoreReactFlightUtils');
24
+
19
25
  var RelayStoreUtils = require('./RelayStoreUtils');
20
26
 
21
27
  var cloneRelayHandleSourceField = require('./cloneRelayHandleSourceField');
22
28
 
29
+ var getOperation = require('../util/getOperation');
30
+
23
31
  var invariant = require("fbjs/lib/invariant");
24
32
 
25
33
  var _require = require('./TypeID'),
@@ -28,6 +36,7 @@ var _require = require('./TypeID'),
28
36
  var CONDITION = RelayConcreteNode.CONDITION,
29
37
  CLIENT_EXTENSION = RelayConcreteNode.CLIENT_EXTENSION,
30
38
  DEFER = RelayConcreteNode.DEFER,
39
+ FLIGHT_FIELD = RelayConcreteNode.FLIGHT_FIELD,
31
40
  FRAGMENT_SPREAD = RelayConcreteNode.FRAGMENT_SPREAD,
32
41
  INLINE_FRAGMENT = RelayConcreteNode.INLINE_FRAGMENT,
33
42
  LINKED_FIELD = RelayConcreteNode.LINKED_FIELD,
@@ -37,7 +46,8 @@ var CONDITION = RelayConcreteNode.CONDITION,
37
46
  SCALAR_HANDLE = RelayConcreteNode.SCALAR_HANDLE,
38
47
  STREAM = RelayConcreteNode.STREAM,
39
48
  TYPE_DISCRIMINATOR = RelayConcreteNode.TYPE_DISCRIMINATOR;
40
- var getStorageKey = RelayStoreUtils.getStorageKey,
49
+ var ROOT_ID = RelayStoreUtils.ROOT_ID,
50
+ getStorageKey = RelayStoreUtils.getStorageKey,
41
51
  getModuleOperationKey = RelayStoreUtils.getModuleOperationKey;
42
52
 
43
53
  function mark(recordSource, selector, references, operationLoader) {
@@ -55,6 +65,7 @@ function mark(recordSource, selector, references, operationLoader) {
55
65
  var RelayReferenceMarker = /*#__PURE__*/function () {
56
66
  function RelayReferenceMarker(recordSource, variables, references, operationLoader) {
57
67
  this._operationLoader = operationLoader !== null && operationLoader !== void 0 ? operationLoader : null;
68
+ this._operationName = null;
58
69
  this._recordSource = recordSource;
59
70
  this._references = references;
60
71
  this._variables = variables;
@@ -63,6 +74,10 @@ var RelayReferenceMarker = /*#__PURE__*/function () {
63
74
  var _proto = RelayReferenceMarker.prototype;
64
75
 
65
76
  _proto.mark = function mark(node, dataID) {
77
+ if (node.kind === 'Operation' || node.kind === 'SplitOperation') {
78
+ this._operationName = node.name;
79
+ }
80
+
66
81
  this._traverse(node, dataID);
67
82
  };
68
83
 
@@ -127,6 +142,7 @@ var RelayReferenceMarker = /*#__PURE__*/function () {
127
142
  }
128
143
 
129
144
  break;
145
+ // $FlowFixMe[incompatible-type]
130
146
 
131
147
  case FRAGMENT_SPREAD:
132
148
  !false ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayReferenceMarker(): Unexpected fragment spread `...%s`, ' + 'expected all fragments to be inlined.', selection.name) : invariant(false) : void 0;
@@ -184,6 +200,15 @@ var RelayReferenceMarker = /*#__PURE__*/function () {
184
200
 
185
201
  break;
186
202
 
203
+ case FLIGHT_FIELD:
204
+ if (RelayFeatureFlags.ENABLE_REACT_FLIGHT_COMPONENT_FIELD) {
205
+ _this._traverseFlightField(selection, record);
206
+ } else {
207
+ throw new Error('Flight fields are not yet supported.');
208
+ }
209
+
210
+ break;
211
+
187
212
  default:
188
213
  selection;
189
214
  !false ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayReferenceMarker: Unknown AST node `%s`.', selection) : invariant(false) : void 0;
@@ -192,8 +217,10 @@ var RelayReferenceMarker = /*#__PURE__*/function () {
192
217
  };
193
218
 
194
219
  _proto._traverseModuleImport = function _traverseModuleImport(moduleImport, record) {
220
+ var _this$_operationName;
221
+
195
222
  var operationLoader = this._operationLoader;
196
- !(operationLoader !== null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayReferenceMarker: Expected an operationLoader to be configured when using `@module`.') : invariant(false) : void 0;
223
+ !(operationLoader !== null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayReferenceMarker: Expected an operationLoader to be configured when using `@module`. ' + 'Could not load fragment `%s` in operation `%s`.', moduleImport.fragmentName, (_this$_operationName = this._operationName) !== null && _this$_operationName !== void 0 ? _this$_operationName : '(unknown)') : invariant(false) : void 0;
197
224
  var operationKey = getModuleOperationKey(moduleImport.documentName);
198
225
  var operationReference = RelayModernRecord.getValue(record, operationKey);
199
226
 
@@ -201,10 +228,12 @@ var RelayReferenceMarker = /*#__PURE__*/function () {
201
228
  return;
202
229
  }
203
230
 
204
- var operation = operationLoader.get(operationReference);
231
+ var normalizationRootNode = operationLoader.get(operationReference);
232
+
233
+ if (normalizationRootNode != null) {
234
+ var selections = getOperation(normalizationRootNode).selections;
205
235
 
206
- if (operation != null) {
207
- this._traverseSelections(operation.selections, record);
236
+ this._traverseSelections(selections, record);
208
237
  } // Otherwise, if the operation is not available, we assume that the data
209
238
  // cannot have been processed yet and therefore isn't in the store to
210
239
  // begin with.
@@ -239,6 +268,59 @@ var RelayReferenceMarker = /*#__PURE__*/function () {
239
268
  });
240
269
  };
241
270
 
271
+ _proto._traverseFlightField = function _traverseFlightField(field, record) {
272
+ var storageKey = getStorageKey(field, this._variables);
273
+ var linkedID = RelayModernRecord.getLinkedRecordID(record, storageKey);
274
+
275
+ if (linkedID == null) {
276
+ return;
277
+ }
278
+
279
+ this._references.add(linkedID);
280
+
281
+ var reactFlightClientResponseRecord = this._recordSource.get(linkedID);
282
+
283
+ if (reactFlightClientResponseRecord == null) {
284
+ return;
285
+ }
286
+
287
+ var reachableQueries = RelayModernRecord.getValue(reactFlightClientResponseRecord, RelayStoreReactFlightUtils.REACT_FLIGHT_QUERIES_STORAGE_KEY);
288
+
289
+ if (!Array.isArray(reachableQueries)) {
290
+ return;
291
+ }
292
+
293
+ var operationLoader = this._operationLoader;
294
+ !(operationLoader !== null) ? process.env.NODE_ENV !== "production" ? invariant(false, 'DataChecker: Expected an operationLoader to be configured when using ' + 'React Flight') : invariant(false) : void 0; // In Flight, the variables that are in scope for reachable queries aren't
295
+ // the same as what's in scope for the outer query.
296
+
297
+ var prevVariables = this._variables; // $FlowFixMe[incompatible-cast]
298
+
299
+ var _iterator = (0, _createForOfIteratorHelper2["default"])(reachableQueries),
300
+ _step;
301
+
302
+ try {
303
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
304
+ var query = _step.value;
305
+ this._variables = query.variables;
306
+ var operationReference = query.module;
307
+ var normalizationRootNode = operationLoader.get(operationReference);
308
+
309
+ if (normalizationRootNode != null) {
310
+ var operation = getOperation(normalizationRootNode);
311
+
312
+ this._traverse(operation, ROOT_ID);
313
+ }
314
+ }
315
+ } catch (err) {
316
+ _iterator.e(err);
317
+ } finally {
318
+ _iterator.f();
319
+ }
320
+
321
+ this._variables = prevVariables;
322
+ };
323
+
242
324
  return RelayReferenceMarker;
243
325
  }();
244
326