Skip to content

Commit 145acee

Browse files
committed
use completePromiseCatchingErrors within executeField
1 parent a0036ff commit 145acee

File tree

3 files changed

+46
-44
lines changed

3 files changed

+46
-44
lines changed

src/execution/__tests__/nonnull-test.ts

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,16 @@ describe('Execute: handles non-nullable types', () => {
259259
path: ['syncNest', 'syncNest', 'sync'],
260260
locations: [{ line: 6, column: 22 }],
261261
},
262+
{
263+
message: promiseError.message,
264+
path: ['syncNest', 'promise'],
265+
locations: [{ line: 5, column: 11 }],
266+
},
267+
{
268+
message: promiseError.message,
269+
path: ['syncNest', 'syncNest', 'promise'],
270+
locations: [{ line: 6, column: 27 }],
271+
},
262272
{
263273
message: syncError.message,
264274
path: ['syncNest', 'promiseNest', 'sync'],
@@ -274,21 +284,6 @@ describe('Execute: handles non-nullable types', () => {
274284
path: ['promiseNest', 'syncNest', 'sync'],
275285
locations: [{ line: 12, column: 22 }],
276286
},
277-
{
278-
message: promiseError.message,
279-
path: ['syncNest', 'promise'],
280-
locations: [{ line: 5, column: 11 }],
281-
},
282-
{
283-
message: promiseError.message,
284-
path: ['syncNest', 'syncNest', 'promise'],
285-
locations: [{ line: 6, column: 27 }],
286-
},
287-
{
288-
message: syncError.message,
289-
path: ['promiseNest', 'promiseNest', 'sync'],
290-
locations: [{ line: 13, column: 25 }],
291-
},
292287
{
293288
message: promiseError.message,
294289
path: ['syncNest', 'promiseNest', 'promise'],
@@ -304,6 +299,11 @@ describe('Execute: handles non-nullable types', () => {
304299
path: ['promiseNest', 'syncNest', 'promise'],
305300
locations: [{ line: 12, column: 27 }],
306301
},
302+
{
303+
message: syncError.message,
304+
path: ['promiseNest', 'promiseNest', 'sync'],
305+
locations: [{ line: 13, column: 25 }],
306+
},
307307
{
308308
message: promiseError.message,
309309
path: ['promiseNest', 'promiseNest', 'promise'],

src/execution/__tests__/stream-test.ts

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1174,6 +1174,9 @@ describe('Execute: stream directive', () => {
11741174
],
11751175
},
11761176
],
1177+
hasNext: true,
1178+
},
1179+
{
11771180
hasNext: false,
11781181
},
11791182
]);
@@ -1197,19 +1200,25 @@ describe('Execute: stream directive', () => {
11971200
} /* c8 ignore stop */,
11981201
},
11991202
});
1200-
expectJSON(result).toDeepEqual({
1201-
errors: [
1202-
{
1203-
message:
1204-
'Cannot return null for non-nullable field NestedObject.nonNullScalarField.',
1205-
locations: [{ line: 4, column: 11 }],
1206-
path: ['nestedObject', 'nonNullScalarField'],
1203+
expectJSON(result).toDeepEqual([
1204+
{
1205+
errors: [
1206+
{
1207+
message:
1208+
'Cannot return null for non-nullable field NestedObject.nonNullScalarField.',
1209+
locations: [{ line: 4, column: 11 }],
1210+
path: ['nestedObject', 'nonNullScalarField'],
1211+
},
1212+
],
1213+
data: {
1214+
nestedObject: null,
12071215
},
1208-
],
1209-
data: {
1210-
nestedObject: null,
1216+
hasNext: true,
12111217
},
1212-
});
1218+
{
1219+
hasNext: false,
1220+
},
1221+
]);
12131222
});
12141223
it('Filters payloads that are nulled by a later synchronous error', async () => {
12151224
const document = parse(`
@@ -1350,6 +1359,9 @@ describe('Execute: stream directive', () => {
13501359
],
13511360
},
13521361
],
1362+
hasNext: true,
1363+
},
1364+
{
13531365
hasNext: false,
13541366
},
13551367
]);

src/execution/execute.ts

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -715,25 +715,15 @@ function executeField(
715715
const result = resolveFn(source, args, contextValue, info);
716716

717717
if (isPromise(result)) {
718-
const completed = result.then((resolved) =>
719-
completeValue(
720-
exeContext,
721-
returnType,
722-
fieldNodes,
723-
info,
724-
path,
725-
resolved,
726-
asyncPayloadRecord,
727-
),
718+
return completePromiseCatchingErrors(
719+
exeContext,
720+
returnType,
721+
fieldNodes,
722+
info,
723+
path,
724+
result,
725+
asyncPayloadRecord,
728726
);
729-
// Note: we don't rely on a `catch` method, but we do expect "thenable"
730-
// to take a second callback for the error case.
731-
return completed.then(undefined, (rawError) => {
732-
const error = locatedError(rawError, fieldNodes, pathToArray(path));
733-
const handledError = handleFieldError(error, returnType, errors);
734-
filterSubsequentPayloads(exeContext, path, asyncPayloadRecord);
735-
return handledError;
736-
});
737727
}
738728

739729
const completed = completeValue(

0 commit comments

Comments
 (0)