relay-runtime 0.0.0-main-2499f53f → 0.0.0-main-47d9d202

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.
package/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Relay v0.0.0-main-2499f53f
2
+ * Relay v0.0.0-main-47d9d202
3
3
  *
4
4
  * Copyright (c) Meta Platforms, Inc. and affiliates.
5
5
  *
package/index.js.flow CHANGED
@@ -59,6 +59,7 @@ const getRefetchMetadata = require('./util/getRefetchMetadata');
59
59
  const getRelayHandleKey = require('./util/getRelayHandleKey');
60
60
  const getRequestIdentifier = require('./util/getRequestIdentifier');
61
61
  const getValueAtPath = require('./util/getValueAtPath');
62
+ const handlePotentialSnapshotErrors = require('./util/handlePotentialSnapshotErrors');
62
63
  const isPromise = require('./util/isPromise');
63
64
  const isScalarAndEqual = require('./util/isScalarAndEqual');
64
65
  const recycleNodesInto = require('./util/recycleNodesInto');
@@ -68,7 +69,6 @@ const RelayError = require('./util/RelayError');
68
69
  const RelayFeatureFlags = require('./util/RelayFeatureFlags');
69
70
  const RelayProfiler = require('./util/RelayProfiler');
70
71
  const RelayReplaySubject = require('./util/RelayReplaySubject');
71
- const reportMissingRequiredFields = require('./util/reportMissingRequiredFields');
72
72
  const stableCopy = require('./util/stableCopy');
73
73
  const withProvidedVariables = require('./util/withProvidedVariables');
74
74
 
@@ -291,7 +291,7 @@ module.exports = {
291
291
  RelayModernSelector.getVariablesFromPluralFragment,
292
292
  getVariablesFromSingularFragment:
293
293
  RelayModernSelector.getVariablesFromSingularFragment,
294
- reportMissingRequiredFields,
294
+ handlePotentialSnapshotErrors,
295
295
  graphql: GraphQLTag.graphql,
296
296
  isFragment: GraphQLTag.isFragment,
297
297
  isInlineDataFragment: GraphQLTag.isInlineDataFragment,
package/lib/index.js CHANGED
@@ -99,6 +99,8 @@ var getRequestIdentifier = require('./util/getRequestIdentifier');
99
99
 
100
100
  var getValueAtPath = require('./util/getValueAtPath');
101
101
 
102
+ var handlePotentialSnapshotErrors = require('./util/handlePotentialSnapshotErrors');
103
+
102
104
  var isPromise = require('./util/isPromise');
103
105
 
104
106
  var isScalarAndEqual = require('./util/isScalarAndEqual');
@@ -117,8 +119,6 @@ var RelayProfiler = require('./util/RelayProfiler');
117
119
 
118
120
  var RelayReplaySubject = require('./util/RelayReplaySubject');
119
121
 
120
- var reportMissingRequiredFields = require('./util/reportMissingRequiredFields');
121
-
122
122
  var stableCopy = require('./util/stableCopy');
123
123
 
124
124
  var withProvidedVariables = require('./util/withProvidedVariables');
@@ -176,7 +176,7 @@ module.exports = {
176
176
  getVariablesFromObject: RelayModernSelector.getVariablesFromObject,
177
177
  getVariablesFromPluralFragment: RelayModernSelector.getVariablesFromPluralFragment,
178
178
  getVariablesFromSingularFragment: RelayModernSelector.getVariablesFromSingularFragment,
179
- reportMissingRequiredFields: reportMissingRequiredFields,
179
+ handlePotentialSnapshotErrors: handlePotentialSnapshotErrors,
180
180
  graphql: GraphQLTag.graphql,
181
181
  isFragment: GraphQLTag.isFragment,
182
182
  isInlineDataFragment: GraphQLTag.isInlineDataFragment,
@@ -20,7 +20,7 @@ var RelayObservable = require('../network/RelayObservable');
20
20
  var _require = require('../store/RelayModernOperationDescriptor'),
21
21
  createOperationDescriptor = _require.createOperationDescriptor;
22
22
 
23
- var reportMissingRequiredFields = require('../util/reportMissingRequiredFields');
23
+ var handlePotentialSnapshotErrors = require('../util/handlePotentialSnapshotErrors');
24
24
 
25
25
  var fetchQueryInternal = require('./fetchQueryInternal');
26
26
 
@@ -119,13 +119,10 @@ function fetchQuery(environment, query, variables, options) {
119
119
  var fetchPolicy = (_options$fetchPolicy = options === null || options === void 0 ? void 0 : options.fetchPolicy) !== null && _options$fetchPolicy !== void 0 ? _options$fetchPolicy : 'network-only';
120
120
 
121
121
  function readData(snapshot) {
122
- if (snapshot.missingRequiredFields != null) {
123
- reportMissingRequiredFields(environment, snapshot.missingRequiredFields);
124
- }
122
+ handlePotentialSnapshotErrors(environment, snapshot.missingRequiredFields, snapshot.relayResolverErrors);
125
123
  /* $FlowFixMe[incompatible-return] we assume readData returns the right
126
124
  * data just having written it from network or checked availability. */
127
125
 
128
-
129
126
  return snapshot.data;
130
127
  }
131
128
 
@@ -18,14 +18,14 @@ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/de
18
18
 
19
19
  var getPendingOperationsForFragment = require('../util/getPendingOperationsForFragment');
20
20
 
21
+ var handlePotentialSnapshotErrors = require('../util/handlePotentialSnapshotErrors');
22
+
21
23
  var isScalarAndEqual = require('../util/isScalarAndEqual');
22
24
 
23
25
  var recycleNodesInto = require('../util/recycleNodesInto');
24
26
 
25
27
  var RelayFeatureFlags = require('../util/RelayFeatureFlags');
26
28
 
27
- var reportMissingRequiredFields = require('../util/reportMissingRequiredFields');
28
-
29
29
  var _require = require('./RelayModernOperationDescriptor'),
30
30
  createRequestDescriptor = _require.createRequestDescriptor;
31
31
 
@@ -206,6 +206,7 @@ var SelectorResolver = /*#__PURE__*/function () {
206
206
  _this2._data = snapshot.data;
207
207
  _this2._isMissingData = snapshot.isMissingData;
208
208
  _this2._missingRequiredFields = snapshot.missingRequiredFields;
209
+ _this2._relayResolverErrors = snapshot.relayResolverErrors;
209
210
 
210
211
  _this2._callback();
211
212
  });
@@ -216,6 +217,7 @@ var SelectorResolver = /*#__PURE__*/function () {
216
217
  this._data = _snapshot.data;
217
218
  this._isMissingData = _snapshot.isMissingData;
218
219
  this._missingRequiredFields = _snapshot.missingRequiredFields;
220
+ this._relayResolverErrors = _snapshot.relayResolverErrors;
219
221
  this._environment = environment;
220
222
  this._rootIsQueryRenderer = rootIsQueryRenderer;
221
223
  this._selector = selector;
@@ -289,10 +291,7 @@ var SelectorResolver = /*#__PURE__*/function () {
289
291
  }
290
292
  }
291
293
 
292
- if (this._missingRequiredFields != null) {
293
- reportMissingRequiredFields(this._environment, this._missingRequiredFields);
294
- }
295
-
294
+ handlePotentialSnapshotErrors(this._environment, this._missingRequiredFields, this._relayResolverErrors);
296
295
  return this._data;
297
296
  };
298
297
 
@@ -308,6 +307,7 @@ var SelectorResolver = /*#__PURE__*/function () {
308
307
  this._data = recycleNodesInto(this._data, snapshot.data);
309
308
  this._isMissingData = snapshot.isMissingData;
310
309
  this._missingRequiredFields = snapshot.missingRequiredFields;
310
+ this._relayResolverErrors = snapshot.relayResolverErrors;
311
311
  this._selector = selector;
312
312
  this._subscription = this._environment.subscribe(snapshot, this._onChange);
313
313
  };
@@ -12,6 +12,8 @@
12
12
 
13
13
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
14
14
 
15
+ var _createForOfIteratorHelper2 = _interopRequireDefault(require("@babel/runtime/helpers/createForOfIteratorHelper"));
16
+
15
17
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
16
18
 
17
19
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
@@ -90,6 +92,7 @@ var RelayReader = /*#__PURE__*/function () {
90
92
  this._selector = selector;
91
93
  this._variables = selector.variables;
92
94
  this._resolverCache = resolverCache;
95
+ this._resolverErrors = [];
93
96
  this._fragmentName = selector.node.name;
94
97
  }
95
98
 
@@ -164,7 +167,8 @@ var RelayReader = /*#__PURE__*/function () {
164
167
  missingClientEdges: RelayFeatureFlags.ENABLE_CLIENT_EDGES && this._missingClientEdges.length ? this._missingClientEdges : null,
165
168
  seenRecords: this._seenRecords,
166
169
  selector: this._selector,
167
- missingRequiredFields: this._missingRequiredFields
170
+ missingRequiredFields: this._missingRequiredFields,
171
+ relayResolverErrors: this._resolverErrors
168
172
  };
169
173
  };
170
174
 
@@ -497,6 +501,8 @@ var RelayReader = /*#__PURE__*/function () {
497
501
  var fragmentReaderSelector;
498
502
  var fragmentMissingRequiredFields;
499
503
  var previousMissingRequriedFields;
504
+ var currentResolverErrors;
505
+ var previousResolverErrors;
500
506
  var fragmentSeenRecordIDs = new Set();
501
507
 
502
508
  var getDataForResolverFragment = function getDataForResolverFragment(singularReaderSelector) {
@@ -517,16 +523,20 @@ var RelayReader = /*#__PURE__*/function () {
517
523
  var resolverFragmentData = {};
518
524
  previousMissingRequriedFields = _this._missingRequiredFields;
519
525
  _this._missingRequiredFields = null;
526
+ previousResolverErrors = _this._resolverErrors;
527
+ _this._resolverErrors = [];
520
528
 
521
529
  _this._createInlineDataOrResolverFragmentPointer(singularReaderSelector.node, record, resolverFragmentData);
522
530
 
523
531
  fragmentMissingRequiredFields = _this._missingRequiredFields;
532
+ currentResolverErrors = _this._resolverErrors;
524
533
  fragmentValue = (_resolverFragmentData = resolverFragmentData[FRAGMENTS_KEY]) === null || _resolverFragmentData === void 0 ? void 0 : _resolverFragmentData[fragment.name];
525
534
  !(typeof fragmentValue === 'object' && fragmentValue !== null) ? process.env.NODE_ENV !== "production" ? invariant(false, "Expected reader data to contain a __fragments property with a property for the fragment named ".concat(fragment.name, ", but it is missing.")) : invariant(false) : void 0;
526
535
  return fragmentValue;
527
536
  } finally {
528
537
  _this._seenRecords = existingSeenRecords;
529
538
  _this._missingRequiredFields = previousMissingRequriedFields;
539
+ _this._resolverErrors = previousResolverErrors;
530
540
  }
531
541
  };
532
542
 
@@ -534,17 +544,35 @@ var RelayReader = /*#__PURE__*/function () {
534
544
  getDataForResolverFragment: getDataForResolverFragment
535
545
  };
536
546
 
537
- var _this$_resolverCache$ = this._resolverCache.readFromCacheOrEvaluate(record, field, this._variables, function () {
547
+ var evaluate = function evaluate() {
538
548
  var key = {
539
549
  __id: RelayModernRecord.getDataID(record),
540
550
  __fragmentOwner: _this._owner,
541
551
  __fragments: (0, _defineProperty2["default"])({}, fragment.name, {})
542
552
  };
543
553
  return withResolverContext(resolverContext, function () {
544
- // $FlowFixMe[prop-missing] - resolver module's type signature is a lie
545
- var resolverResult = resolverModule(key);
554
+ var resolverResult = null;
555
+
556
+ try {
557
+ // $FlowFixMe[prop-missing] - resolver module's type signature is a lie
558
+ resolverResult = resolverModule(key);
559
+ } catch (e) {
560
+ var _field$path;
561
+
562
+ // `field.path` is typed as nullable while we rollout compiler changes.
563
+ var path = (_field$path = field.path) !== null && _field$path !== void 0 ? _field$path : '[UNKNOWN]';
564
+ currentResolverErrors.push({
565
+ field: {
566
+ path: path,
567
+ owner: _this._fragmentName
568
+ },
569
+ error: e
570
+ });
571
+ }
572
+
546
573
  return {
547
574
  resolverResult: resolverResult,
575
+ errors: currentResolverErrors,
548
576
  fragmentValue: fragmentValue,
549
577
  resolverID: resolverID,
550
578
  seenRecordIDs: fragmentSeenRecordIDs,
@@ -552,10 +580,28 @@ var RelayReader = /*#__PURE__*/function () {
552
580
  missingRequiredFields: fragmentMissingRequiredFields
553
581
  };
554
582
  });
555
- }, getDataForResolverFragment),
583
+ };
584
+
585
+ var _this$_resolverCache$ = this._resolverCache.readFromCacheOrEvaluate(record, field, this._variables, evaluate, getDataForResolverFragment),
556
586
  result = _this$_resolverCache$[0],
557
587
  seenRecord = _this$_resolverCache$[1],
558
- missingRequiredFields = _this$_resolverCache$[2];
588
+ resolverErrors = _this$_resolverCache$[2],
589
+ missingRequiredFields = _this$_resolverCache$[3];
590
+
591
+ var _iterator = (0, _createForOfIteratorHelper2["default"])(resolverErrors),
592
+ _step;
593
+
594
+ try {
595
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
596
+ var resolverError = _step.value;
597
+
598
+ this._resolverErrors.push(resolverError);
599
+ }
600
+ } catch (err) {
601
+ _iterator.e(err);
602
+ } finally {
603
+ _iterator.f();
604
+ }
559
605
 
560
606
  if (missingRequiredFields != null) {
561
607
  this._addMissingRequiredFields(missingRequiredFields);
@@ -96,7 +96,8 @@ var RelayStoreSubscriptions = /*#__PURE__*/function () {
96
96
  missingClientEdges: backup.missingClientEdges,
97
97
  seenRecords: backup.seenRecords,
98
98
  selector: backup.selector,
99
- missingRequiredFields: backup.missingRequiredFields
99
+ missingRequiredFields: backup.missingRequiredFields,
100
+ relayResolverErrors: backup.relayResolverErrors
100
101
  };
101
102
  } else {
102
103
  subscription.stale = true;
@@ -146,7 +147,8 @@ var RelayStoreSubscriptions = /*#__PURE__*/function () {
146
147
  missingClientEdges: nextSnapshot.missingClientEdges,
147
148
  seenRecords: nextSnapshot.seenRecords,
148
149
  selector: nextSnapshot.selector,
149
- missingRequiredFields: nextSnapshot.missingRequiredFields
150
+ missingRequiredFields: nextSnapshot.missingRequiredFields,
151
+ relayResolverErrors: nextSnapshot.relayResolverErrors
150
152
  };
151
153
 
152
154
  if (process.env.NODE_ENV !== "production") {
@@ -212,6 +212,7 @@ var RelayStoreUtils = {
212
212
  RELAY_RESOLVER_INPUTS_KEY: '__resolverInputValues',
213
213
  RELAY_RESOLVER_READER_SELECTOR_KEY: '__resolverReaderSelector',
214
214
  RELAY_RESOLVER_MISSING_REQUIRED_FIELDS_KEY: '__resolverMissingRequiredFields',
215
+ RELAY_RESOLVER_ERROR_KEY: '__resolverError',
215
216
  formatStorageKey: formatStorageKey,
216
217
  getArgumentValue: getArgumentValue,
217
218
  getArgumentValues: getArgumentValues,
@@ -22,6 +22,7 @@ var _require = require('./ClientID'),
22
22
  var RelayModernRecord = require('./RelayModernRecord');
23
23
 
24
24
  var _require2 = require('./RelayStoreUtils'),
25
+ RELAY_RESOLVER_ERROR_KEY = _require2.RELAY_RESOLVER_ERROR_KEY,
25
26
  RELAY_RESOLVER_INPUTS_KEY = _require2.RELAY_RESOLVER_INPUTS_KEY,
26
27
  RELAY_RESOLVER_INVALIDATION_KEY = _require2.RELAY_RESOLVER_INVALIDATION_KEY,
27
28
  RELAY_RESOLVER_MISSING_REQUIRED_FIELDS_KEY = _require2.RELAY_RESOLVER_MISSING_REQUIRED_FIELDS_KEY,
@@ -42,9 +43,10 @@ var NoopResolverCache = /*#__PURE__*/function () {
42
43
  _proto.readFromCacheOrEvaluate = function readFromCacheOrEvaluate(record, field, variables, evaluate, getDataForResolverFragment) {
43
44
  var _evaluate = evaluate(),
44
45
  resolverResult = _evaluate.resolverResult,
45
- missingRequiredFields = _evaluate.missingRequiredFields;
46
+ missingRequiredFields = _evaluate.missingRequiredFields,
47
+ errors = _evaluate.errors;
46
48
 
47
- return [resolverResult, undefined, missingRequiredFields];
49
+ return [resolverResult, undefined, errors, missingRequiredFields];
48
50
  };
49
51
 
50
52
  _proto.invalidateDataIDs = function invalidateDataIDs(updatedDataIDs) {};
@@ -91,6 +93,7 @@ var RecordResolverCache = /*#__PURE__*/function () {
91
93
  RelayModernRecord.setValue(linkedRecord, RELAY_RESOLVER_INPUTS_KEY, evaluationResult.fragmentValue);
92
94
  RelayModernRecord.setValue(linkedRecord, RELAY_RESOLVER_READER_SELECTOR_KEY, evaluationResult.readerSelector);
93
95
  RelayModernRecord.setValue(linkedRecord, RELAY_RESOLVER_MISSING_REQUIRED_FIELDS_KEY, evaluationResult.missingRequiredFields);
96
+ RelayModernRecord.setValue(linkedRecord, RELAY_RESOLVER_ERROR_KEY, evaluationResult.errors);
94
97
  recordSource.set(linkedID, linkedRecord); // Link the resolver value record to the resolver field of the record being read:
95
98
 
96
99
  var nextRecord = RelayModernRecord.clone(record);
@@ -119,8 +122,10 @@ var RecordResolverCache = /*#__PURE__*/function () {
119
122
 
120
123
  var answer = linkedRecord[RELAY_RESOLVER_VALUE_KEY];
121
124
  var missingRequiredFields = // $FlowFixMe[incompatible-type] - casting mixed
122
- linkedRecord[RELAY_RESOLVER_MISSING_REQUIRED_FIELDS_KEY];
123
- return [answer, linkedID, missingRequiredFields];
125
+ linkedRecord[RELAY_RESOLVER_MISSING_REQUIRED_FIELDS_KEY]; // $FlowFixMe[incompatible-type] - casting mixed
126
+
127
+ var errors = linkedRecord[RELAY_RESOLVER_ERROR_KEY];
128
+ return [answer, linkedID, errors, missingRequiredFields];
124
129
  };
125
130
 
126
131
  _proto2.invalidateDataIDs = function invalidateDataIDs(updatedDataIDs) {
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
3
+ *
4
+ * This source code is licensed under the MIT license found in the
5
+ * LICENSE file in the root directory of this source tree.
6
+ *
7
+ *
8
+ * @emails oncall+relay
9
+ * @format
10
+ */
11
+ 'use strict';
12
+
13
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
14
+
15
+ var _createForOfIteratorHelper2 = _interopRequireDefault(require("@babel/runtime/helpers/createForOfIteratorHelper"));
16
+
17
+ function handlePotentialSnapshotErrors(environment, missingRequiredFields, relayResolverErrors) {
18
+ var _iterator = (0, _createForOfIteratorHelper2["default"])(relayResolverErrors),
19
+ _step;
20
+
21
+ try {
22
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
23
+ var resolverError = _step.value;
24
+ environment.requiredFieldLogger({
25
+ kind: 'relay_resolver.error',
26
+ owner: resolverError.field.owner,
27
+ fieldPath: resolverError.field.path,
28
+ error: resolverError.error
29
+ });
30
+ }
31
+ } catch (err) {
32
+ _iterator.e(err);
33
+ } finally {
34
+ _iterator.f();
35
+ }
36
+
37
+ if (missingRequiredFields != null) {
38
+ switch (missingRequiredFields.action) {
39
+ case 'THROW':
40
+ {
41
+ var _missingRequiredField = missingRequiredFields.field,
42
+ path = _missingRequiredField.path,
43
+ owner = _missingRequiredField.owner; // This gives the consumer the chance to throw their own error if they so wish.
44
+
45
+ environment.requiredFieldLogger({
46
+ kind: 'missing_field.throw',
47
+ owner: owner,
48
+ fieldPath: path
49
+ });
50
+ throw new Error("Relay: Missing @required value at path '".concat(path, "' in '").concat(owner, "'."));
51
+ }
52
+
53
+ case 'LOG':
54
+ missingRequiredFields.fields.forEach(function (_ref) {
55
+ var path = _ref.path,
56
+ owner = _ref.owner;
57
+ environment.requiredFieldLogger({
58
+ kind: 'missing_field.log',
59
+ owner: owner,
60
+ fieldPath: path
61
+ });
62
+ });
63
+ break;
64
+
65
+ default:
66
+ {
67
+ missingRequiredFields.action;
68
+ }
69
+ }
70
+ }
71
+ }
72
+
73
+ module.exports = handlePotentialSnapshotErrors;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "relay-runtime",
3
3
  "description": "A core runtime for building GraphQL-driven applications.",
4
- "version": "0.0.0-main-2499f53f",
4
+ "version": "0.0.0-main-47d9d202",
5
5
  "keywords": [
6
6
  "graphql",
7
7
  "relay"
@@ -30,7 +30,7 @@ const RelayObservable = require('../network/RelayObservable');
30
30
  const {
31
31
  createOperationDescriptor,
32
32
  } = require('../store/RelayModernOperationDescriptor');
33
- const reportMissingRequiredFields = require('../util/reportMissingRequiredFields');
33
+ const handlePotentialSnapshotErrors = require('../util/handlePotentialSnapshotErrors');
34
34
  const fetchQueryInternal = require('./fetchQueryInternal');
35
35
  const {getRequest} = require('./GraphQLTag');
36
36
  const invariant = require('invariant');
@@ -138,9 +138,11 @@ function fetchQuery<TVariables: Variables, TData, TRawResponse>(
138
138
  const fetchPolicy = options?.fetchPolicy ?? 'network-only';
139
139
 
140
140
  function readData(snapshot: Snapshot): TData {
141
- if (snapshot.missingRequiredFields != null) {
142
- reportMissingRequiredFields(environment, snapshot.missingRequiredFields);
143
- }
141
+ handlePotentialSnapshotErrors(
142
+ environment,
143
+ snapshot.missingRequiredFields,
144
+ snapshot.relayResolverErrors,
145
+ );
144
146
  /* $FlowFixMe[incompatible-return] we assume readData returns the right
145
147
  * data just having written it from network or checked availability. */
146
148
  return snapshot.data;