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.
- package/experimental.js +1 -1
- package/index.js +1 -1
- package/lib/query/fetchQuery.js +1 -1
- package/lib/store/RelayModernFragmentSpecResolver.js +1 -4
- package/lib/store/RelayReader.js +31 -29
- package/lib/store/RelayStoreSubscriptions.js +0 -2
- package/lib/store/observeFragmentExperimental.js +1 -1
- package/lib/util/handlePotentialSnapshotErrors.js +9 -30
- package/package.json +1 -1
- package/query/fetchQuery.js.flow +0 -1
- package/relay-runtime-experimental.js +2 -2
- package/relay-runtime-experimental.min.js +2 -2
- package/relay-runtime.js +2 -2
- package/relay-runtime.min.js +2 -2
- package/store/RelayModernFragmentSpecResolver.js.flow +0 -6
- package/store/RelayReader.js.flow +26 -23
- package/store/RelayStoreSubscriptions.js.flow +0 -2
- package/store/RelayStoreTypes.js.flow +3 -4
- package/store/observeFragmentExperimental.js.flow +0 -1
- package/util/handlePotentialSnapshotErrors.js.flow +2 -27
|
@@ -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
|
-
|
|
780
|
-
this.
|
|
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
|
-
|
|
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
|
}
|