relay-runtime 18.2.0 → 19.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 (81) hide show
  1. package/experimental.js +1 -1
  2. package/experimental.js.flow +8 -6
  3. package/index.js +1 -1
  4. package/index.js.flow +3 -0
  5. package/lib/experimental.js +5 -2
  6. package/lib/index.js +3 -0
  7. package/lib/multi-actor-environment/ActorSpecificEnvironment.js +1 -1
  8. package/lib/mutations/RelayRecordSourceProxy.js +2 -1
  9. package/lib/mutations/createUpdatableProxy.js +1 -1
  10. package/lib/mutations/validateMutation.js +2 -2
  11. package/lib/network/RelayObservable.js +1 -3
  12. package/lib/network/wrapNetworkWithLogObserver.js +2 -2
  13. package/lib/query/fetchQuery.js +1 -1
  14. package/lib/store/DataChecker.js +4 -5
  15. package/lib/store/OperationExecutor.js +11 -0
  16. package/lib/store/RelayModernEnvironment.js +13 -4
  17. package/lib/store/RelayModernFragmentSpecResolver.js +4 -4
  18. package/lib/store/RelayModernStore.js +43 -21
  19. package/lib/store/RelayPublishQueue.js +11 -15
  20. package/lib/store/RelayReader.js +131 -151
  21. package/lib/store/RelayReferenceMarker.js +3 -4
  22. package/lib/store/RelayResponseNormalizer.js +47 -26
  23. package/lib/store/RelayStoreSubscriptions.js +2 -2
  24. package/lib/store/RelayStoreUtils.js +8 -0
  25. package/lib/store/ResolverFragments.js +2 -2
  26. package/lib/store/createRelayLoggingContext.js +17 -0
  27. package/lib/store/generateTypenamePrefixedDataID.js +9 -0
  28. package/lib/store/live-resolvers/LiveResolverCache.js +2 -1
  29. package/lib/store/live-resolvers/resolverDataInjector.js +4 -4
  30. package/lib/store/observeFragmentExperimental.js +60 -13
  31. package/lib/store/observeQueryExperimental.js +21 -0
  32. package/lib/util/RelayFeatureFlags.js +6 -1
  33. package/lib/util/handlePotentialSnapshotErrors.js +11 -8
  34. package/multi-actor-environment/ActorSpecificEnvironment.js.flow +1 -0
  35. package/mutations/RelayRecordSourceProxy.js.flow +4 -0
  36. package/mutations/createUpdatableProxy.js.flow +1 -1
  37. package/mutations/validateMutation.js.flow +3 -3
  38. package/network/RelayNetworkTypes.js.flow +3 -0
  39. package/network/RelayObservable.js.flow +1 -5
  40. package/network/wrapNetworkWithLogObserver.js.flow +19 -1
  41. package/package.json +1 -1
  42. package/query/fetchQuery.js.flow +1 -1
  43. package/store/DataChecker.js.flow +5 -2
  44. package/store/OperationExecutor.js.flow +12 -1
  45. package/store/RelayExperimentalGraphResponseTransform.js.flow +4 -4
  46. package/store/RelayModernEnvironment.js.flow +22 -6
  47. package/store/RelayModernFragmentSpecResolver.js.flow +6 -6
  48. package/store/RelayModernSelector.js.flow +2 -0
  49. package/store/RelayModernStore.js.flow +74 -27
  50. package/store/RelayPublishQueue.js.flow +32 -21
  51. package/store/RelayReader.js.flow +159 -96
  52. package/store/RelayReferenceMarker.js.flow +3 -4
  53. package/store/RelayResponseNormalizer.js.flow +93 -67
  54. package/store/RelayStoreSubscriptions.js.flow +2 -2
  55. package/store/RelayStoreTypes.js.flow +33 -4
  56. package/store/RelayStoreUtils.js.flow +29 -0
  57. package/store/ResolverCache.js.flow +2 -2
  58. package/store/ResolverFragments.js.flow +5 -3
  59. package/store/StoreInspector.js.flow +5 -0
  60. package/store/createRelayContext.js.flow +3 -2
  61. package/store/createRelayLoggingContext.js.flow +46 -0
  62. package/store/generateTypenamePrefixedDataID.js.flow +25 -0
  63. package/store/live-resolvers/LiveResolverCache.js.flow +2 -1
  64. package/store/live-resolvers/resolverDataInjector.js.flow +10 -6
  65. package/store/observeFragmentExperimental.js.flow +82 -28
  66. package/store/observeQueryExperimental.js.flow +61 -0
  67. package/store/waitForFragmentExperimental.js.flow +4 -3
  68. package/util/NormalizationNode.js.flow +2 -1
  69. package/util/RelayConcreteNode.js.flow +2 -0
  70. package/util/RelayError.js.flow +1 -0
  71. package/util/RelayFeatureFlags.js.flow +18 -0
  72. package/util/RelayRuntimeTypes.js.flow +6 -3
  73. package/util/getPaginationVariables.js.flow +2 -0
  74. package/util/handlePotentialSnapshotErrors.js.flow +23 -11
  75. package/util/registerEnvironmentWithDevTools.js.flow +4 -2
  76. package/util/withProvidedVariables.js.flow +1 -0
  77. package/util/withStartAndDuration.js.flow +3 -0
  78. package/relay-runtime-experimental.js +0 -4
  79. package/relay-runtime-experimental.min.js +0 -9
  80. package/relay-runtime.js +0 -4
  81. package/relay-runtime.min.js +0 -9
@@ -4,9 +4,9 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
5
5
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
6
6
  var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
7
- var _createForOfIteratorHelper2 = _interopRequireDefault(require("@babel/runtime/helpers/createForOfIteratorHelper"));
8
7
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
9
8
  var _excluded = ["message"];
9
+ var RelayFeatureFlags = require('../util/RelayFeatureFlags');
10
10
  var _require = require('./live-resolvers/LiveResolverSuspenseSentinel'),
11
11
  isSuspenseSentinel = _require.isSuspenseSentinel;
12
12
  var RelayConcreteVariables = require('./RelayConcreteVariables');
@@ -36,15 +36,15 @@ function read(recordSource, selector, resolverCache, resolverContext) {
36
36
  }
37
37
  var RelayReader = /*#__PURE__*/function () {
38
38
  function RelayReader(recordSource, selector, resolverCache, resolverContext) {
39
- var _selector$clientEdgeT, _this$_owner$node$ope;
39
+ var _selector$clientEdgeT, _ref, _this$_owner$node$ope, _this$_owner$node$ope2;
40
40
  this._clientEdgeTraversalPath = (_selector$clientEdgeT = selector.clientEdgeTraversalPath) !== null && _selector$clientEdgeT !== void 0 && _selector$clientEdgeT.length ? (0, _toConsumableArray2["default"])(selector.clientEdgeTraversalPath) : [];
41
41
  this._missingClientEdges = [];
42
42
  this._missingLiveResolverFields = [];
43
43
  this._isMissingData = false;
44
44
  this._isWithinUnmatchedTypeRefinement = false;
45
- this._errorResponseFields = null;
45
+ this._fieldErrors = null;
46
46
  this._owner = selector.owner;
47
- this._useExecTimeResolvers = (_this$_owner$node$ope = this._owner.node.operation.use_exec_time_resolvers) !== null && _this$_owner$node$ope !== void 0 ? _this$_owner$node$ope : false;
47
+ this._useExecTimeResolvers = (_ref = (_this$_owner$node$ope = this._owner.node.operation.use_exec_time_resolvers) !== null && _this$_owner$node$ope !== void 0 ? _this$_owner$node$ope : ((_this$_owner$node$ope2 = this._owner.node.operation.exec_time_resolvers_enabled_provider) === null || _this$_owner$node$ope2 === void 0 ? void 0 : _this$_owner$node$ope2.get()) === true) !== null && _ref !== void 0 ? _ref : false;
48
48
  this._recordSource = recordSource;
49
49
  this._seenRecords = new Set();
50
50
  this._selector = selector;
@@ -92,37 +92,30 @@ var RelayReader = /*#__PURE__*/function () {
92
92
  missingLiveResolverFields: this._missingLiveResolverFields,
93
93
  seenRecords: this._seenRecords,
94
94
  selector: this._selector,
95
- errorResponseFields: this._errorResponseFields
95
+ fieldErrors: this._fieldErrors
96
96
  };
97
97
  };
98
- _proto._maybeAddErrorResponseFields = function _maybeAddErrorResponseFields(record, storageKey) {
98
+ _proto._maybeAddFieldErrors = function _maybeAddFieldErrors(record, storageKey) {
99
99
  var errors = RelayModernRecord.getErrors(record, storageKey);
100
100
  if (errors == null) {
101
101
  return;
102
102
  }
103
103
  var owner = this._fragmentName;
104
- if (this._errorResponseFields == null) {
105
- this._errorResponseFields = [];
106
- }
107
- var _iterator = (0, _createForOfIteratorHelper2["default"])(errors),
108
- _step;
109
- try {
110
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
111
- var _error$path, _this$_selector$node$2, _this$_selector$node$3;
112
- var error = _step.value;
113
- this._errorResponseFields.push({
114
- kind: 'relay_field_payload.error',
115
- owner: owner,
116
- fieldPath: ((_error$path = error.path) !== null && _error$path !== void 0 ? _error$path : []).join('.'),
117
- error: error,
118
- shouldThrow: (_this$_selector$node$2 = (_this$_selector$node$3 = this._selector.node.metadata) === null || _this$_selector$node$3 === void 0 ? void 0 : _this$_selector$node$3.throwOnFieldError) !== null && _this$_selector$node$2 !== void 0 ? _this$_selector$node$2 : false,
119
- handled: false
120
- });
121
- }
122
- } catch (err) {
123
- _iterator.e(err);
124
- } finally {
125
- _iterator.f();
104
+ if (this._fieldErrors == null) {
105
+ this._fieldErrors = [];
106
+ }
107
+ for (var i = 0; i < errors.length; i++) {
108
+ var _error$path, _this$_selector$node$2, _this$_selector$node$3;
109
+ var error = errors[i];
110
+ this._fieldErrors.push({
111
+ kind: 'relay_field_payload.error',
112
+ owner: owner,
113
+ fieldPath: ((_error$path = error.path) !== null && _error$path !== void 0 ? _error$path : []).join('.'),
114
+ error: error,
115
+ shouldThrow: (_this$_selector$node$2 = (_this$_selector$node$3 = this._selector.node.metadata) === null || _this$_selector$node$3 === void 0 ? void 0 : _this$_selector$node$3.throwOnFieldError) !== null && _this$_selector$node$2 !== void 0 ? _this$_selector$node$2 : false,
116
+ handled: false,
117
+ uiContext: undefined
118
+ });
126
119
  }
127
120
  };
128
121
  _proto._markDataAsMissing = function _markDataAsMissing(fieldName) {
@@ -130,19 +123,21 @@ var RelayReader = /*#__PURE__*/function () {
130
123
  if (this._isWithinUnmatchedTypeRefinement) {
131
124
  return;
132
125
  }
133
- if (this._errorResponseFields == null) {
134
- this._errorResponseFields = [];
126
+ if (this._fieldErrors == null) {
127
+ this._fieldErrors = [];
135
128
  }
136
129
  var owner = this._fragmentName;
137
- this._errorResponseFields.push(((_this$_selector$node$4 = (_this$_selector$node$5 = this._selector.node.metadata) === null || _this$_selector$node$5 === void 0 ? void 0 : _this$_selector$node$5.throwOnFieldError) !== null && _this$_selector$node$4 !== void 0 ? _this$_selector$node$4 : false) ? {
130
+ this._fieldErrors.push(((_this$_selector$node$4 = (_this$_selector$node$5 = this._selector.node.metadata) === null || _this$_selector$node$5 === void 0 ? void 0 : _this$_selector$node$5.throwOnFieldError) !== null && _this$_selector$node$4 !== void 0 ? _this$_selector$node$4 : false) ? {
138
131
  kind: 'missing_expected_data.throw',
139
132
  owner: owner,
140
133
  fieldPath: fieldName,
141
- handled: false
134
+ handled: false,
135
+ uiContext: undefined
142
136
  } : {
143
137
  kind: 'missing_expected_data.log',
144
138
  owner: owner,
145
- fieldPath: fieldName
139
+ fieldPath: fieldName,
140
+ uiContext: undefined
146
141
  });
147
142
  this._isMissingData = true;
148
143
  if (this._clientEdgeTraversalPath.length) {
@@ -177,8 +172,8 @@ var RelayReader = /*#__PURE__*/function () {
177
172
  return;
178
173
  }
179
174
  var owner = this._fragmentName;
180
- if (this._errorResponseFields == null) {
181
- this._errorResponseFields = [];
175
+ if (this._fieldErrors == null) {
176
+ this._fieldErrors = [];
182
177
  }
183
178
  var fieldName;
184
179
  if (selection.field.linkedField != null) {
@@ -190,18 +185,20 @@ var RelayReader = /*#__PURE__*/function () {
190
185
  }
191
186
  switch (selection.action) {
192
187
  case 'THROW':
193
- this._errorResponseFields.push({
188
+ this._fieldErrors.push({
194
189
  kind: 'missing_required_field.throw',
195
190
  fieldPath: fieldName,
196
191
  owner: owner,
197
- handled: false
192
+ handled: false,
193
+ uiContext: undefined
198
194
  });
199
195
  return;
200
196
  case 'LOG':
201
- this._errorResponseFields.push({
197
+ this._fieldErrors.push({
202
198
  kind: 'missing_required_field.log',
203
199
  fieldPath: fieldName,
204
- owner: owner
200
+ owner: owner,
201
+ uiContext: undefined
205
202
  });
206
203
  return;
207
204
  default:
@@ -222,33 +219,33 @@ var RelayReader = /*#__PURE__*/function () {
222
219
  value = this._asResult(_value);
223
220
  break;
224
221
  case 'NULL':
225
- if (this._errorResponseFields != null && this._errorResponseFields.length > 0) {
222
+ if (this._fieldErrors != null && this._fieldErrors.length > 0) {
226
223
  value = null;
227
224
  }
228
225
  break;
229
226
  default:
230
227
  to;
231
228
  }
232
- var childrenErrorResponseFields = this._errorResponseFields;
233
- this._errorResponseFields = previousResponseFields;
234
- if (childrenErrorResponseFields != null) {
235
- if (this._errorResponseFields == null) {
236
- this._errorResponseFields = [];
229
+ var childrenFieldErrors = this._fieldErrors;
230
+ this._fieldErrors = previousResponseFields;
231
+ if (childrenFieldErrors != null) {
232
+ if (this._fieldErrors == null) {
233
+ this._fieldErrors = [];
237
234
  }
238
- for (var i = 0; i < childrenErrorResponseFields.length; i++) {
239
- this._errorResponseFields.push(markFieldErrorHasHandled(childrenErrorResponseFields[i]));
235
+ for (var i = 0; i < childrenFieldErrors.length; i++) {
236
+ this._fieldErrors.push(markFieldErrorHasHandled(childrenFieldErrors[i]));
240
237
  }
241
238
  }
242
239
  return value;
243
240
  };
244
241
  _proto._asResult = function _asResult(value) {
245
- if (this._errorResponseFields == null || this._errorResponseFields.length === 0) {
242
+ if (this._fieldErrors == null || this._fieldErrors.length === 0) {
246
243
  return {
247
244
  ok: true,
248
245
  value: value
249
246
  };
250
247
  }
251
- var errors = this._errorResponseFields.map(function (error) {
248
+ var errors = this._fieldErrors.map(function (error) {
252
249
  switch (error.kind) {
253
250
  case 'relay_field_payload.error':
254
251
  var _error$error = error.error,
@@ -272,7 +269,7 @@ var RelayReader = /*#__PURE__*/function () {
272
269
  return null;
273
270
  default:
274
271
  error.kind;
275
- !false ? process.env.NODE_ENV !== "production" ? invariant(false, 'Unexpected error errorResponseField kind: %s', error.kind) : invariant(false) : void 0;
272
+ !false ? process.env.NODE_ENV !== "production" ? invariant(false, 'Unexpected error fieldError kind: %s', error.kind) : invariant(false) : void 0;
276
273
  }
277
274
  }).filter(Boolean);
278
275
  return {
@@ -293,8 +290,8 @@ var RelayReader = /*#__PURE__*/function () {
293
290
  case 'CatchField':
294
291
  {
295
292
  var _selection$field$back, _selection$field, _field$alias;
296
- var previousResponseFields = this._errorResponseFields;
297
- this._errorResponseFields = null;
293
+ var previousResponseFields = this._fieldErrors;
294
+ this._fieldErrors = null;
298
295
  var catchFieldValue = this._readClientSideDirectiveField(selection, record, data);
299
296
  var field = (_selection$field$back = (_selection$field = selection.field) === null || _selection$field === void 0 ? void 0 : _selection$field.backingField) !== null && _selection$field$back !== void 0 ? _selection$field$back : selection.field;
300
297
  var fieldName = (_field$alias = field === null || field === void 0 ? void 0 : field.alias) !== null && _field$alias !== void 0 ? _field$alias : field === null || field === void 0 ? void 0 : field.name;
@@ -409,12 +406,26 @@ var RelayReader = /*#__PURE__*/function () {
409
406
  return this._readLink(selection.field, record, data);
410
407
  }
411
408
  case 'RelayResolver':
412
- return this._readResolverField(selection.field, record, data);
413
409
  case 'RelayLiveResolver':
414
- return this._readResolverField(selection.field, record, data);
410
+ {
411
+ if (this._useExecTimeResolvers) {
412
+ return this._readScalar(selection.field, record, data);
413
+ } else {
414
+ return this._readResolverField(selection.field, record, data);
415
+ }
416
+ }
415
417
  case 'ClientEdgeToClientObject':
416
418
  case 'ClientEdgeToServerObject':
417
- return this._readClientEdge(selection.field, record, data);
419
+ if (this._useExecTimeResolvers && (selection.field.backingField.kind === 'RelayResolver' || selection.field.backingField.kind === 'RelayLiveResolver')) {
420
+ var field = selection.field;
421
+ if (field.linkedField.plural) {
422
+ return this._readPluralLink(field.linkedField, record, data);
423
+ } else {
424
+ return this._readLink(field.linkedField, record, data);
425
+ }
426
+ } else {
427
+ return this._readClientEdge(selection.field, record, data);
428
+ }
418
429
  case 'AliasedInlineFragmentSpread':
419
430
  return this._readAliasedInlineFragment(selection.field, record, data);
420
431
  default:
@@ -425,8 +436,8 @@ var RelayReader = /*#__PURE__*/function () {
425
436
  _proto._readResolverField = function _readResolverField(field, record, data) {
426
437
  var _field$alias2;
427
438
  var parentRecordID = RelayModernRecord.getDataID(record);
428
- var prevErrors = this._errorResponseFields;
429
- this._errorResponseFields = null;
439
+ var prevErrors = this._fieldErrors;
440
+ this._fieldErrors = null;
430
441
  var result = this._readResolverFieldImpl(field, parentRecordID);
431
442
  var fieldName = (_field$alias2 = field.alias) !== null && _field$alias2 !== void 0 ? _field$alias2 : field.name;
432
443
  this._prependPreviousErrors(prevErrors, fieldName);
@@ -442,14 +453,14 @@ var RelayReader = /*#__PURE__*/function () {
442
453
  return {
443
454
  data: snapshot.data,
444
455
  isMissingData: snapshot.isMissingData,
445
- errorResponseFields: snapshot.errorResponseFields
456
+ fieldErrors: snapshot.fieldErrors
446
457
  };
447
458
  }
448
459
  snapshot = read(_this._recordSource, singularReaderSelector, _this._resolverCache);
449
460
  return {
450
461
  data: snapshot.data,
451
462
  isMissingData: snapshot.isMissingData,
452
- errorResponseFields: snapshot.errorResponseFields
463
+ fieldErrors: snapshot.fieldErrors
453
464
  };
454
465
  };
455
466
  var evaluate = function evaluate() {
@@ -494,56 +505,33 @@ var RelayReader = /*#__PURE__*/function () {
494
505
  return result;
495
506
  };
496
507
  _proto._propagateResolverMetadata = function _propagateResolverMetadata(fieldPath, cachedSnapshot, resolverError, seenRecord, suspenseID, updatedDataIDs) {
508
+ var _this2 = this;
497
509
  if (cachedSnapshot != null) {
498
510
  if (cachedSnapshot.missingClientEdges != null) {
499
- var _iterator2 = (0, _createForOfIteratorHelper2["default"])(cachedSnapshot.missingClientEdges),
500
- _step2;
501
- try {
502
- for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
503
- var missing = _step2.value;
504
- this._missingClientEdges.push(missing);
505
- }
506
- } catch (err) {
507
- _iterator2.e(err);
508
- } finally {
509
- _iterator2.f();
511
+ for (var i = 0; i < cachedSnapshot.missingClientEdges.length; i++) {
512
+ var missing = cachedSnapshot.missingClientEdges[i];
513
+ this._missingClientEdges.push(missing);
510
514
  }
511
515
  }
512
516
  if (cachedSnapshot.missingLiveResolverFields != null) {
513
517
  this._isMissingData = this._isMissingData || cachedSnapshot.missingLiveResolverFields.length > 0;
514
- var _iterator3 = (0, _createForOfIteratorHelper2["default"])(cachedSnapshot.missingLiveResolverFields),
515
- _step3;
516
- try {
517
- for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
518
- var missingResolverField = _step3.value;
519
- this._missingLiveResolverFields.push(missingResolverField);
520
- }
521
- } catch (err) {
522
- _iterator3.e(err);
523
- } finally {
524
- _iterator3.f();
518
+ for (var _i = 0; _i < cachedSnapshot.missingLiveResolverFields.length; _i++) {
519
+ var missingResolverField = cachedSnapshot.missingLiveResolverFields[_i];
520
+ this._missingLiveResolverFields.push(missingResolverField);
525
521
  }
526
522
  }
527
- if (cachedSnapshot.errorResponseFields != null) {
528
- if (this._errorResponseFields == null) {
529
- this._errorResponseFields = [];
523
+ if (cachedSnapshot.fieldErrors != null) {
524
+ if (this._fieldErrors == null) {
525
+ this._fieldErrors = [];
530
526
  }
531
- var _iterator4 = (0, _createForOfIteratorHelper2["default"])(cachedSnapshot.errorResponseFields),
532
- _step4;
533
- try {
534
- for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
535
- var _this$_selector$node$6;
536
- var error = _step4.value;
537
- if (((_this$_selector$node$6 = this._selector.node.metadata) === null || _this$_selector$node$6 === void 0 ? void 0 : _this$_selector$node$6.throwOnFieldError) === true) {
538
- this._errorResponseFields.push(error);
539
- } else {
540
- this._errorResponseFields.push(markFieldErrorHasHandled(error));
541
- }
527
+ for (var _i2 = 0; _i2 < cachedSnapshot.fieldErrors.length; _i2++) {
528
+ var _this$_selector$node$6;
529
+ var error = cachedSnapshot.fieldErrors[_i2];
530
+ if (((_this$_selector$node$6 = this._selector.node.metadata) === null || _this$_selector$node$6 === void 0 ? void 0 : _this$_selector$node$6.throwOnFieldError) === true) {
531
+ this._fieldErrors.push(error);
532
+ } else {
533
+ this._fieldErrors.push(markFieldErrorHasHandled(error));
542
534
  }
543
- } catch (err) {
544
- _iterator4.e(err);
545
- } finally {
546
- _iterator4.f();
547
535
  }
548
536
  }
549
537
  this._isMissingData = this._isMissingData || cachedSnapshot.isMissingData;
@@ -556,12 +544,13 @@ var RelayReader = /*#__PURE__*/function () {
556
544
  owner: this._fragmentName,
557
545
  error: resolverError,
558
546
  shouldThrow: (_this$_selector$node$7 = (_this$_selector$node$8 = this._selector.node.metadata) === null || _this$_selector$node$8 === void 0 ? void 0 : _this$_selector$node$8.throwOnFieldError) !== null && _this$_selector$node$7 !== void 0 ? _this$_selector$node$7 : false,
559
- handled: false
547
+ handled: false,
548
+ uiContext: undefined
560
549
  };
561
- if (this._errorResponseFields == null) {
562
- this._errorResponseFields = [errorEvent];
550
+ if (this._fieldErrors == null) {
551
+ this._fieldErrors = [errorEvent];
563
552
  } else {
564
- this._errorResponseFields.push(errorEvent);
553
+ this._fieldErrors.push(errorEvent);
565
554
  }
566
555
  }
567
556
  if (seenRecord != null) {
@@ -572,22 +561,13 @@ var RelayReader = /*#__PURE__*/function () {
572
561
  this._missingLiveResolverFields.push(suspenseID);
573
562
  }
574
563
  if (updatedDataIDs != null) {
575
- var _iterator5 = (0, _createForOfIteratorHelper2["default"])(updatedDataIDs),
576
- _step5;
577
- try {
578
- for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
579
- var recordID = _step5.value;
580
- this._updatedDataIDs.add(recordID);
581
- }
582
- } catch (err) {
583
- _iterator5.e(err);
584
- } finally {
585
- _iterator5.f();
586
- }
564
+ updatedDataIDs.forEach(function (recordID) {
565
+ _this2._updatedDataIDs.add(recordID);
566
+ });
587
567
  }
588
568
  };
589
569
  _proto._readClientEdge = function _readClientEdge(field, record, data) {
590
- var _this2 = this;
570
+ var _this3 = this;
591
571
  var _backingField$alias;
592
572
  var backingField = field.backingField;
593
573
  !(backingField.kind !== 'ClientExtension') ? process.env.NODE_ENV !== "production" ? invariant(false, 'Client extension client edges are not yet implemented.') : invariant(false) : void 0;
@@ -607,21 +587,21 @@ var RelayReader = /*#__PURE__*/function () {
607
587
  storeIDs = clientEdgeResolverResponse.map(function (itemResponse) {
608
588
  var _field$concreteType;
609
589
  var concreteType = (_field$concreteType = field.concreteType) !== null && _field$concreteType !== void 0 ? _field$concreteType : itemResponse.__typename;
610
- !(typeof concreteType === 'string') ? process.env.NODE_ENV !== "production" ? invariant(false, 'Expected resolver for field at `%s` in `%s` modeling an edge to an abstract type to return an object with a `__typename` property.', backingField.path, _this2._owner.identifier) : invariant(false) : void 0;
611
- var localId = extractIdFromResponse(itemResponse, backingField.path, _this2._owner.identifier);
612
- var id = _this2._resolverCache.ensureClientRecord(localId, concreteType);
590
+ !(typeof concreteType === 'string') ? process.env.NODE_ENV !== "production" ? invariant(false, 'Expected resolver for field at `%s` in `%s` modeling an edge to an abstract type to return an object with a `__typename` property.', backingField.path, _this3._owner.identifier) : invariant(false) : void 0;
591
+ var localId = extractIdFromResponse(itemResponse, backingField.path, _this3._owner.identifier);
592
+ var id = _this3._resolverCache.ensureClientRecord(localId, concreteType);
613
593
  var modelResolvers = field.modelResolvers;
614
594
  if (modelResolvers != null) {
615
595
  var modelResolver = modelResolvers[concreteType];
616
- !(modelResolver !== undefined) ? process.env.NODE_ENV !== "production" ? invariant(false, 'Invalid `__typename` returned by resolver at `%s` in `%s`. Expected one of %s but got `%s`.', backingField.path, _this2._owner.identifier, Object.keys(modelResolvers).join(', '), concreteType) : invariant(false) : void 0;
617
- var model = _this2._readResolverFieldImpl(modelResolver, id);
596
+ !(modelResolver !== undefined) ? process.env.NODE_ENV !== "production" ? invariant(false, 'Invalid `__typename` returned by resolver at `%s` in `%s`. Expected one of %s but got `%s`.', backingField.path, _this3._owner.identifier, Object.keys(modelResolvers).join(', '), concreteType) : invariant(false) : void 0;
597
+ var model = _this3._readResolverFieldImpl(modelResolver, id);
618
598
  return model != null ? id : null;
619
599
  }
620
600
  return id;
621
601
  });
622
602
  } else {
623
603
  storeIDs = clientEdgeResolverResponse.map(function (obj) {
624
- return extractIdFromResponse(obj, backingField.path, _this2._owner.identifier);
604
+ return extractIdFromResponse(obj, backingField.path, _this3._owner.identifier);
625
605
  });
626
606
  }
627
607
  this._clientEdgeTraversalPath.push(null);
@@ -665,8 +645,8 @@ var RelayReader = /*#__PURE__*/function () {
665
645
  this._clientEdgeTraversalPath.push(traversalPathSegment);
666
646
  var prevData = data[fieldName];
667
647
  !(prevData == null || typeof prevData === 'object') ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayReader(): Expected data for field at `%s` in `%s` on record `%s` ' + 'to be an object, got `%s`.', backingField.path, this._owner.identifier, RelayModernRecord.getDataID(record), prevData) : invariant(false) : void 0;
668
- var prevErrors = this._errorResponseFields;
669
- this._errorResponseFields = null;
648
+ var prevErrors = this._fieldErrors;
649
+ this._fieldErrors = null;
670
650
  var edgeValue = this._traverse(field.linkedField, storeID, prevData);
671
651
  this._prependPreviousErrors(prevErrors, fieldName);
672
652
  this._clientEdgeTraversalPath.pop();
@@ -679,8 +659,8 @@ var RelayReader = /*#__PURE__*/function () {
679
659
  var fieldName = (_field$alias3 = field.alias) !== null && _field$alias3 !== void 0 ? _field$alias3 : field.name;
680
660
  var storageKey = getStorageKey(field, this._variables);
681
661
  var value = RelayModernRecord.getValue(record, storageKey);
682
- if (value === null) {
683
- this._maybeAddErrorResponseFields(record, storageKey);
662
+ if (value === null || RelayFeatureFlags.ENABLE_NONCOMPLIANT_ERROR_HANDLING_ON_LISTS && Array.isArray(value) && value.length === 0) {
663
+ this._maybeAddFieldErrors(record, storageKey);
684
664
  } else if (value === undefined) {
685
665
  this._markDataAsMissing(fieldName);
686
666
  }
@@ -695,7 +675,7 @@ var RelayReader = /*#__PURE__*/function () {
695
675
  if (linkedID == null) {
696
676
  data[fieldName] = linkedID;
697
677
  if (linkedID === null) {
698
- this._maybeAddErrorResponseFields(record, storageKey);
678
+ this._maybeAddFieldErrors(record, storageKey);
699
679
  } else if (linkedID === undefined) {
700
680
  this._markDataAsMissing(fieldName);
701
681
  }
@@ -703,29 +683,29 @@ var RelayReader = /*#__PURE__*/function () {
703
683
  }
704
684
  var prevData = data[fieldName];
705
685
  !(prevData == null || typeof prevData === 'object') ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayReader(): Expected data for field `%s` at `%s` on record `%s` ' + 'to be an object, got `%s`.', fieldName, this._owner.identifier, RelayModernRecord.getDataID(record), prevData) : invariant(false) : void 0;
706
- var prevErrors = this._errorResponseFields;
707
- this._errorResponseFields = null;
686
+ var prevErrors = this._fieldErrors;
687
+ this._fieldErrors = null;
708
688
  var value = this._traverse(field, linkedID, prevData);
709
689
  this._prependPreviousErrors(prevErrors, fieldName);
710
690
  data[fieldName] = value;
711
691
  return value;
712
692
  };
713
693
  _proto._prependPreviousErrors = function _prependPreviousErrors(prevErrors, fieldNameOrIndex) {
714
- if (this._errorResponseFields != null) {
715
- for (var i = 0; i < this._errorResponseFields.length; i++) {
716
- var event = this._errorResponseFields[i];
694
+ if (this._fieldErrors != null) {
695
+ for (var i = 0; i < this._fieldErrors.length; i++) {
696
+ var event = this._fieldErrors[i];
717
697
  if (event.owner === this._fragmentName && (event.kind === 'missing_expected_data.throw' || event.kind === 'missing_expected_data.log' || event.kind === 'missing_required_field.throw' || event.kind === 'missing_required_field.log')) {
718
698
  event.fieldPath = "".concat(fieldNameOrIndex, ".").concat(event.fieldPath);
719
699
  }
720
700
  }
721
701
  if (prevErrors != null) {
722
- for (var _i = this._errorResponseFields.length - 1; _i >= 0; _i--) {
723
- prevErrors.push(this._errorResponseFields[_i]);
702
+ for (var _i3 = this._fieldErrors.length - 1; _i3 >= 0; _i3--) {
703
+ prevErrors.push(this._fieldErrors[_i3]);
724
704
  }
725
- this._errorResponseFields = prevErrors;
705
+ this._fieldErrors = prevErrors;
726
706
  }
727
707
  } else {
728
- this._errorResponseFields = prevErrors;
708
+ this._fieldErrors = prevErrors;
729
709
  }
730
710
  };
731
711
  _proto._readActorChange = function _readActorChange(field, record, data) {
@@ -738,7 +718,7 @@ var RelayReader = /*#__PURE__*/function () {
738
718
  if (externalRef === undefined) {
739
719
  this._markDataAsMissing(fieldName);
740
720
  } else if (externalRef === null) {
741
- this._maybeAddErrorResponseFields(record, storageKey);
721
+ this._maybeAddFieldErrors(record, storageKey);
742
722
  }
743
723
  return data[fieldName];
744
724
  }
@@ -757,13 +737,13 @@ var RelayReader = /*#__PURE__*/function () {
757
737
  _proto._readPluralLink = function _readPluralLink(field, record, data) {
758
738
  var storageKey = getStorageKey(field, this._variables);
759
739
  var linkedIDs = RelayModernRecord.getLinkedRecordIDs(record, storageKey);
760
- if (linkedIDs === null) {
761
- this._maybeAddErrorResponseFields(record, storageKey);
740
+ if (linkedIDs === null || RelayFeatureFlags.ENABLE_NONCOMPLIANT_ERROR_HANDLING_ON_LISTS && Array.isArray(linkedIDs) && linkedIDs.length === 0) {
741
+ this._maybeAddFieldErrors(record, storageKey);
762
742
  }
763
743
  return this._readLinkedIds(field, linkedIDs, record, data);
764
744
  };
765
745
  _proto._readLinkedIds = function _readLinkedIds(field, linkedIDs, record, data) {
766
- var _this3 = this;
746
+ var _this4 = this;
767
747
  var _field$alias6;
768
748
  var fieldName = (_field$alias6 = field.alias) !== null && _field$alias6 !== void 0 ? _field$alias6 : field.name;
769
749
  if (linkedIDs == null) {
@@ -775,32 +755,32 @@ var RelayReader = /*#__PURE__*/function () {
775
755
  }
776
756
  var prevData = data[fieldName];
777
757
  !(prevData == null || Array.isArray(prevData)) ? process.env.NODE_ENV !== "production" ? invariant(false, 'RelayReader(): Expected data for field `%s` on record `%s` ' + 'to be an array, got `%s`.', fieldName, RelayModernRecord.getDataID(record), prevData) : invariant(false) : void 0;
778
- var prevErrors = this._errorResponseFields;
779
- this._errorResponseFields = null;
758
+ var prevErrors = this._fieldErrors;
759
+ this._fieldErrors = null;
780
760
  var linkedArray = prevData || [];
781
761
  linkedIDs.forEach(function (linkedID, nextIndex) {
782
762
  if (linkedID == null) {
783
763
  if (linkedID === undefined) {
784
- _this3._markDataAsMissing(String(nextIndex));
764
+ _this4._markDataAsMissing(String(nextIndex));
785
765
  }
786
766
  linkedArray[nextIndex] = linkedID;
787
767
  return;
788
768
  }
789
769
  var prevItem = linkedArray[nextIndex];
790
770
  !(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`.', fieldName, RelayModernRecord.getDataID(record), prevItem) : invariant(false) : void 0;
791
- var prevErrors = _this3._errorResponseFields;
792
- _this3._errorResponseFields = null;
793
- linkedArray[nextIndex] = _this3._traverse(field, linkedID, prevItem);
794
- _this3._prependPreviousErrors(prevErrors, nextIndex);
771
+ var prevErrors = _this4._fieldErrors;
772
+ _this4._fieldErrors = null;
773
+ linkedArray[nextIndex] = _this4._traverse(field, linkedID, prevItem);
774
+ _this4._prependPreviousErrors(prevErrors, nextIndex);
795
775
  });
796
776
  this._prependPreviousErrors(prevErrors, fieldName);
797
777
  data[fieldName] = linkedArray;
798
778
  return linkedArray;
799
779
  };
800
780
  _proto._readModuleImport = function _readModuleImport(moduleImport, record, data) {
801
- var _moduleImport$compone;
802
781
  var componentKey = getModuleComponentKey(moduleImport.documentName);
803
- var component = (_moduleImport$compone = moduleImport.componentModuleProvider) !== null && _moduleImport$compone !== void 0 ? _moduleImport$compone : RelayModernRecord.getValue(record, componentKey);
782
+ var relayStoreComponent = RelayModernRecord.getValue(record, componentKey);
783
+ var component = relayStoreComponent !== undefined ? relayStoreComponent : moduleImport.componentModuleProvider;
804
784
  if (component == null) {
805
785
  if (component === undefined) {
806
786
  this._markDataAsMissing('<module-import>');
@@ -816,8 +796,8 @@ var RelayReader = /*#__PURE__*/function () {
816
796
  data[MODULE_COMPONENT_KEY] = component;
817
797
  };
818
798
  _proto._readAliasedInlineFragment = function _readAliasedInlineFragment(aliasedInlineFragment, record, data) {
819
- var prevErrors = this._errorResponseFields;
820
- this._errorResponseFields = null;
799
+ var prevErrors = this._fieldErrors;
800
+ this._fieldErrors = null;
821
801
  var fieldValue = this._readInlineFragment(aliasedInlineFragment.fragment, record, {}, true);
822
802
  this._prependPreviousErrors(prevErrors, aliasedInlineFragment.name);
823
803
  if (fieldValue === false) {
@@ -12,7 +12,8 @@ var RelayStoreUtils = require('./RelayStoreUtils');
12
12
  var _require2 = require('./TypeID'),
13
13
  generateTypeID = _require2.generateTypeID;
14
14
  var invariant = require('invariant');
15
- var getStorageKey = RelayStoreUtils.getStorageKey,
15
+ var getReadTimeResolverStorageKey = RelayStoreUtils.getReadTimeResolverStorageKey,
16
+ getStorageKey = RelayStoreUtils.getStorageKey,
16
17
  getModuleOperationKey = RelayStoreUtils.getModuleOperationKey;
17
18
  function mark(recordSource, selector, references, operationLoader, shouldProcessClientComponents) {
18
19
  var dataID = selector.dataID,
@@ -123,8 +124,6 @@ var RelayReferenceMarker = /*#__PURE__*/function () {
123
124
  _this._traverseSelections(selection.fragment.selections, record);
124
125
  break;
125
126
  case 'RelayResolver':
126
- _this._traverseResolverField(selection, record);
127
- break;
128
127
  case 'RelayLiveResolver':
129
128
  _this._traverseResolverField(selection, record);
130
129
  break;
@@ -195,7 +194,7 @@ var RelayReferenceMarker = /*#__PURE__*/function () {
195
194
  }
196
195
  };
197
196
  _proto._traverseResolverField = function _traverseResolverField(field, record) {
198
- var storageKey = getStorageKey(field, this._variables);
197
+ var storageKey = getReadTimeResolverStorageKey(field, this._variables);
199
198
  var dataID = RelayModernRecord.getLinkedRecordID(record, storageKey);
200
199
  if (dataID != null) {
201
200
  this._references.add(dataID);