relay-runtime 0.0.0-main-2c8089a3 → 0.0.0-main-6e1a5c6f

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.
@@ -22,7 +22,6 @@ import type {
22
22
  MissingRequiredFields,
23
23
  PluralReaderSelector,
24
24
  RelayContext,
25
- RelayResolverErrors,
26
25
  SelectorData,
27
26
  SingularReaderSelector,
28
27
  Snapshot,
@@ -230,7 +229,6 @@ class SelectorResolver {
230
229
  _isMissingData: boolean;
231
230
  _missingRequiredFields: ?MissingRequiredFields;
232
231
  _errorResponseFields: ?ErrorResponseFields;
233
- _relayResolverErrors: RelayResolverErrors;
234
232
  _rootIsQueryRenderer: boolean;
235
233
  _selector: SingularReaderSelector;
236
234
  _subscription: ?Disposable;
@@ -248,7 +246,6 @@ class SelectorResolver {
248
246
  this._isMissingData = snapshot.isMissingData;
249
247
  this._missingRequiredFields = snapshot.missingRequiredFields;
250
248
  this._errorResponseFields = snapshot.errorResponseFields;
251
- this._relayResolverErrors = snapshot.relayResolverErrors;
252
249
  this._environment = environment;
253
250
  this._rootIsQueryRenderer = rootIsQueryRenderer;
254
251
  this._selector = selector;
@@ -332,7 +329,6 @@ class SelectorResolver {
332
329
  handlePotentialSnapshotErrors(
333
330
  this._environment,
334
331
  this._missingRequiredFields,
335
- this._relayResolverErrors,
336
332
  this._errorResponseFields,
337
333
  this._selector.node.metadata?.throwOnFieldError ?? false,
338
334
  );
@@ -352,7 +348,6 @@ class SelectorResolver {
352
348
  this._isMissingData = snapshot.isMissingData;
353
349
  this._missingRequiredFields = snapshot.missingRequiredFields;
354
350
  this._errorResponseFields = snapshot.errorResponseFields;
355
- this._relayResolverErrors = snapshot.relayResolverErrors;
356
351
  this._selector = selector;
357
352
  this._subscription = this._environment.subscribe(snapshot, this._onChange);
358
353
  }
@@ -390,7 +385,6 @@ class SelectorResolver {
390
385
  this._isMissingData = snapshot.isMissingData;
391
386
  this._missingRequiredFields = snapshot.missingRequiredFields;
392
387
  this._errorResponseFields = snapshot.errorResponseFields;
393
- this._relayResolverErrors = snapshot.relayResolverErrors;
394
388
  this._callback();
395
389
  };
396
390
  }
@@ -38,7 +38,6 @@ import type {
38
38
  MissingRequiredFields,
39
39
  Record,
40
40
  RecordSource,
41
- RelayResolverErrors,
42
41
  RequestDescriptor,
43
42
  ResolverContext,
44
43
  SelectorData,
@@ -109,7 +108,6 @@ class RelayReader {
109
108
  _selector: SingularReaderSelector;
110
109
  _variables: Variables;
111
110
  _resolverCache: ResolverCache;
112
- _resolverErrors: RelayResolverErrors;
113
111
  _fragmentName: string;
114
112
  _resolverContext: ?ResolverContext;
115
113
 
@@ -134,7 +132,6 @@ class RelayReader {
134
132
  this._selector = selector;
135
133
  this._variables = selector.variables;
136
134
  this._resolverCache = resolverCache;
137
- this._resolverErrors = [];
138
135
  this._fragmentName = selector.node.name;
139
136
  this._updatedDataIDs = new Set();
140
137
  this._resolverContext = resolverContext;
@@ -197,7 +194,6 @@ class RelayReader {
197
194
  seenRecords: this._seenRecords,
198
195
  selector: this._selector,
199
196
  missingRequiredFields: this._missingRequiredFields,
200
- relayResolverErrors: this._resolverErrors,
201
197
  errorResponseFields: this._errorResponseFields,
202
198
  };
203
199
  }
@@ -347,6 +343,10 @@ class RelayReader {
347
343
  return {
348
344
  path: error.fieldPath.split('.'),
349
345
  };
346
+ case 'relay_resolver.error':
347
+ return {
348
+ message: `Relay: Error in resolver for field at ${error.fieldPath} in ${error.owner}`,
349
+ };
350
350
  default:
351
351
  (error.kind: empty);
352
352
  invariant(
@@ -357,18 +357,6 @@ class RelayReader {
357
357
  }
358
358
  });
359
359
 
360
- if (this._resolverErrors.length > 0) {
361
- if (errors == null) {
362
- errors = [];
363
- }
364
- for (let i = 0; i < this._resolverErrors.length; i++) {
365
- const resolverError = this._resolverErrors[i];
366
- errors.push({
367
- message: `Relay: Error in resolver for field at ${resolverError.fieldPath} in ${resolverError.owner}`,
368
- });
369
- }
370
- }
371
-
372
360
  // If we have a nested @required(THROW) that will throw,
373
361
  // we want to catch that error and provide it
374
362
  if (this._missingRequiredFields?.action === 'THROW') {
@@ -425,11 +413,9 @@ class RelayReader {
425
413
  case 'CatchField': {
426
414
  const previousResponseFields = this._errorResponseFields;
427
415
  const previousMissingRequiredFields = this._missingRequiredFields;
428
- const previousResolverErrors = this._resolverErrors;
429
416
 
430
417
  this._errorResponseFields = null;
431
418
  this._missingRequiredFields = null;
432
- this._resolverErrors = [];
433
419
 
434
420
  const catchFieldValue = this._readClientSideDirectiveField(
435
421
  selection,
@@ -443,7 +429,6 @@ class RelayReader {
443
429
 
444
430
  const childrenMissingRequiredFields = this._missingRequiredFields;
445
431
 
446
- this._resolverErrors = previousResolverErrors;
447
432
  this._errorResponseFields = previousResponseFields;
448
433
  this._missingRequiredFields = previousMissingRequiredFields;
449
434
 
@@ -776,8 +761,18 @@ class RelayReader {
776
761
  this._missingLiveResolverFields.push(missingResolverField);
777
762
  }
778
763
  }
779
- for (const error of cachedSnapshot.relayResolverErrors) {
780
- this._resolverErrors.push(error);
764
+ if (cachedSnapshot.errorResponseFields != null) {
765
+ if (this._errorResponseFields == null) {
766
+ this._errorResponseFields = [];
767
+ }
768
+ for (const error of cachedSnapshot.errorResponseFields) {
769
+ // TODO: In reality we should propagate _all_ errors, but
770
+ // for now we're only propagating resolver errors for backwards
771
+ // compatibility with previous behavior.
772
+ if (error.kind === 'relay_resolver.error') {
773
+ this._errorResponseFields.push(error);
774
+ }
775
+ }
781
776
  }
782
777
  this._isMissingData = this._isMissingData || cachedSnapshot.isMissingData;
783
778
  }
@@ -786,12 +781,20 @@ class RelayReader {
786
781
  // the errors can be attached to this read's snapshot. This allows the error
787
782
  // to be logged.
788
783
  if (resolverError) {
789
- this._resolverErrors.push({
784
+ const errorEvent = {
790
785
  kind: 'relay_resolver.error',
791
786
  fieldPath,
792
787
  owner: this._fragmentName,
793
788
  error: resolverError,
794
- });
789
+ shouldThrow:
790
+ this._selector.node.metadata?.throwOnFieldError ??
791
+ RelayFeatureFlags.ENABLE_FIELD_ERROR_HANDLING_THROW_BY_DEFAULT,
792
+ };
793
+ if (this._errorResponseFields == null) {
794
+ this._errorResponseFields = [errorEvent];
795
+ } else {
796
+ this._errorResponseFields.push(errorEvent);
797
+ }
795
798
  }
796
799
 
797
800
  // The resolver itself creates a record in the store. We record that we've
@@ -116,7 +116,6 @@ class RelayStoreSubscriptions implements StoreSubscriptions {
116
116
  seenRecords: backup.seenRecords,
117
117
  selector: backup.selector,
118
118
  missingRequiredFields: backup.missingRequiredFields,
119
- relayResolverErrors: backup.relayResolverErrors,
120
119
  errorResponseFields: backup.errorResponseFields,
121
120
  };
122
121
  } else {
@@ -188,7 +187,6 @@ class RelayStoreSubscriptions implements StoreSubscriptions {
188
187
  seenRecords: nextSnapshot.seenRecords,
189
188
  selector: nextSnapshot.selector,
190
189
  missingRequiredFields: nextSnapshot.missingRequiredFields,
191
- relayResolverErrors: nextSnapshot.relayResolverErrors,
192
190
  errorResponseFields: nextSnapshot.errorResponseFields,
193
191
  }: Snapshot);
194
192
  if (__DEV__) {
@@ -129,7 +129,8 @@ export type MissingRequiredFields = $ReadOnly<
129
129
  export type ErrorResponseFields = Array<
130
130
  | RelayFieldPayloadErrorEvent
131
131
  | MissingExpectedDataLogEvent
132
- | MissingExpectedDataThrowEvent,
132
+ | MissingExpectedDataThrowEvent
133
+ | RelayResolverErrorEvent,
133
134
  >;
134
135
 
135
136
  export type ClientEdgeTraversalInfo = {
@@ -145,8 +146,6 @@ export type MissingClientEdgeRequestInfo = {
145
146
  +clientEdgeDestinationID: DataID,
146
147
  };
147
148
 
148
- export type RelayResolverErrors = Array<RelayResolverErrorEvent>;
149
-
150
149
  export type MissingLiveResolverField = {
151
150
  +path: string,
152
151
  +liveStateID: DataID,
@@ -163,7 +162,6 @@ export type Snapshot = {
163
162
  +seenRecords: DataIDSet,
164
163
  +selector: SingularReaderSelector,
165
164
  +missingRequiredFields: ?MissingRequiredFields,
166
- +relayResolverErrors: RelayResolverErrors,
167
165
  +errorResponseFields: ?ErrorResponseFields,
168
166
  };
169
167
 
@@ -1337,6 +1335,7 @@ export type RelayResolverErrorEvent = {
1337
1335
  +owner: string,
1338
1336
  +fieldPath: string,
1339
1337
  +error: Error,
1338
+ +shouldThrow: boolean,
1340
1339
  };
1341
1340
 
1342
1341
  /**
@@ -213,7 +213,6 @@ function snapshotToFragmentState<TFragmentType: FragmentType, TData>(
213
213
  handlePotentialSnapshotErrors(
214
214
  environment,
215
215
  snapshot.missingRequiredFields,
216
- snapshot.relayResolverErrors,
217
216
  snapshot.errorResponseFields,
218
217
  snapshot.selector.node.metadata?.throwOnFieldError ?? false,
219
218
  );
@@ -16,31 +16,9 @@ import type {
16
16
  ErrorResponseFields,
17
17
  IEnvironment,
18
18
  MissingRequiredFields,
19
- RelayResolverErrors,
20
19
  } from '../store/RelayStoreTypes';
21
20
 
22
21
  const {RelayFieldError} = require('../store/RelayErrorTrie');
23
- const RelayFeatureFlags = require('./RelayFeatureFlags');
24
-
25
- function handleResolverErrors(
26
- environment: IEnvironment,
27
- relayResolverErrors: RelayResolverErrors,
28
- throwOnFieldError: boolean,
29
- ) {
30
- for (const resolverError of relayResolverErrors) {
31
- environment.relayFieldLogger(resolverError);
32
- }
33
-
34
- if (
35
- RelayFeatureFlags.ENABLE_FIELD_ERROR_HANDLING_THROW_BY_DEFAULT ||
36
- throwOnFieldError
37
- ) {
38
- throw new RelayFieldError(
39
- `Relay: Unexpected resolver exception`,
40
- relayResolverErrors.map(e => ({path: e.fieldPath.split('.')})),
41
- );
42
- }
43
- }
44
22
 
45
23
  function handleFieldErrors(
46
24
  environment: IEnvironment,
@@ -68,6 +46,8 @@ function handleFieldErrors(
68
46
  return {path: event.fieldPath.split('.')};
69
47
  case 'missing_expected_data.log':
70
48
  return {path: event.fieldPath.split('.')};
49
+ case 'relay_resolver.error':
50
+ return {path: event.fieldPath.split('.')};
71
51
  default:
72
52
  (event.kind: empty);
73
53
  throw new Error('Relay: Unexpected event kind');
@@ -112,14 +92,9 @@ function handleMissingRequiredFields(
112
92
  function handlePotentialSnapshotErrors(
113
93
  environment: IEnvironment,
114
94
  missingRequiredFields: ?MissingRequiredFields,
115
- relayResolverErrors: RelayResolverErrors,
116
95
  errorResponseFields: ?ErrorResponseFields,
117
96
  throwOnFieldError: boolean,
118
97
  ) {
119
- if (relayResolverErrors.length > 0) {
120
- handleResolverErrors(environment, relayResolverErrors, throwOnFieldError);
121
- }
122
-
123
98
  if (missingRequiredFields != null) {
124
99
  handleMissingRequiredFields(environment, missingRequiredFields);
125
100
  }