relay-runtime 10.0.0 → 10.1.2

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 +121 -3
  3. package/index.js +1 -1
  4. package/index.js.flow +16 -1
  5. package/lib/handlers/RelayDefaultHandlerProvider.js +9 -0
  6. package/lib/handlers/connection/MutationHandlers.js +147 -14
  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 +45 -143
  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 +200 -49
  27. package/lib/store/RelayRecordSourceMapImpl.js +3 -5
  28. package/lib/store/RelayReferenceMarker.js +87 -5
  29. package/lib/store/RelayResponseNormalizer.js +123 -54
  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 +3 -9
  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 +6 -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 +6 -9
  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 +40 -114
  62. package/store/RelayPublishQueue.js.flow +1 -1
  63. package/store/RelayReader.js.flow +184 -27
  64. package/store/RelayReferenceMarker.js.flow +72 -5
  65. package/store/RelayResponseNormalizer.js.flow +140 -50
  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/StoreInspector.js.flow +1 -3
  71. package/store/createRelayContext.js.flow +3 -0
  72. package/store/defaultRequiredFieldLogger.js.flow +23 -0
  73. package/subscription/requestSubscription.js.flow +5 -2
  74. package/util/NormalizationNode.js.flow +17 -2
  75. package/util/ReaderNode.js.flow +20 -1
  76. package/util/RelayConcreteNode.js.flow +6 -0
  77. package/util/RelayFeatureFlags.js.flow +10 -1
  78. package/util/getFragmentIdentifier.js.flow +33 -9
  79. package/util/getOperation.js.flow +40 -0
  80. package/util/isEmptyObject.js.flow +25 -0
  81. package/util/recycleNodesInto.js.flow +13 -8
  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,24 +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
- !(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;
301
- /* $FlowFixMe[incompatible-variance] (>=0.98.0 site=www,mobile,react_native_
302
- * fb,oss) This comment suppresses an error found when Flow v0.98 was
303
- * deployed. To see the error delete this comment and run Flow. */
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]
460
+
461
+ var value = this._traverse(field, linkedID, prevData);
304
462
 
305
- data[applicationName] = this._traverse(field, linkedID, prevData);
463
+ data[applicationName] = value;
464
+ return value;
306
465
  };
307
466
 
308
467
  _proto._readPluralLink = function _readPluralLink(field, record, data) {
309
468
  var _this = this;
310
469
 
311
- var _field$alias3;
470
+ var _field$alias4;
312
471
 
313
- 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;
314
473
  var storageKey = getStorageKey(field, this._variables);
315
474
  var linkedIDs = RelayModernRecord.getLinkedRecordIDs(record, storageKey);
316
475
 
@@ -321,7 +480,7 @@ var RelayReader = /*#__PURE__*/function () {
321
480
  this._isMissingData = true;
322
481
  }
323
482
 
324
- return;
483
+ return linkedIDs;
325
484
  }
326
485
 
327
486
  var prevData = data[applicationName];
@@ -331,10 +490,7 @@ var RelayReader = /*#__PURE__*/function () {
331
490
  if (linkedID == null) {
332
491
  if (linkedID === undefined) {
333
492
  _this._isMissingData = true;
334
- }
335
- /* $FlowFixMe[cannot-write] (>=0.98.0 site=www,mobile,react_native_
336
- * fb,oss) This comment suppresses an error found when Flow v0.98 was
337
- * deployed. To see the error delete this comment and run Flow. */
493
+ } // $FlowFixMe[cannot-write]
338
494
 
339
495
 
340
496
  linkedArray[nextIndex] = linkedID;
@@ -342,18 +498,13 @@ var RelayReader = /*#__PURE__*/function () {
342
498
  }
343
499
 
344
500
  var prevItem = linkedArray[nextIndex];
345
- !(prevItem == null || typeof prevItem === 'object') ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayReader(): Expected data for field `%s` on record `%s` ' + 'to be an object, got `%s`.', applicationName, RelayModernRecord.getDataID(record), prevItem) : invariant(false) : void 0;
346
- /* $FlowFixMe[cannot-write] (>=0.98.0 site=www,mobile,react_native_
347
- * fb,oss) This comment suppresses an error found when Flow v0.98 was
348
- * deployed. To see the error delete this comment and run Flow. */
349
-
350
- /* $FlowFixMe[incompatible-variance] (>=0.98.0 site=www,mobile,react_
351
- * native_fb,oss) This comment suppresses an error found when Flow v0.98
352
- * was deployed. To see the error delete this comment and run Flow. */
501
+ !(prevItem == null || typeof prevItem === 'object') ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayReader(): Expected data for field `%s` on record `%s` ' + 'to be an object, got `%s`.', applicationName, RelayModernRecord.getDataID(record), prevItem) : invariant(false) : void 0; // $FlowFixMe[cannot-write]
502
+ // $FlowFixMe[incompatible-variance]
353
503
 
354
504
  linkedArray[nextIndex] = _this._traverse(field, linkedID, prevItem);
355
505
  });
356
506
  data[applicationName] = linkedArray;
507
+ return linkedArray;
357
508
  }
358
509
  /**
359
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