Skip to content

Commit 06bb157

Browse files
authored
refactor: extract execution types to separate file (#4099)
1 parent e15c3ec commit 06bb157

11 files changed

+339
-311
lines changed

src/execution/IncrementalPublisher.ts

+25-299
Original file line numberDiff line numberDiff line change
@@ -1,174 +1,35 @@
11
import { invariant } from '../jsutils/invariant.js';
22
import { isPromise } from '../jsutils/isPromise.js';
33
import type { ObjMap } from '../jsutils/ObjMap.js';
4-
import type { Path } from '../jsutils/Path.js';
54
import { pathToArray } from '../jsutils/Path.js';
6-
import type { PromiseOrValue } from '../jsutils/PromiseOrValue.js';
75
import { promiseWithResolvers } from '../jsutils/promiseWithResolvers.js';
86

9-
import type {
10-
GraphQLError,
11-
GraphQLFormattedError,
12-
} from '../error/GraphQLError.js';
13-
14-
/**
15-
* The result of GraphQL execution.
16-
*
17-
* - `errors` is included when any errors occurred as a non-empty array.
18-
* - `data` is the result of a successful execution of the query.
19-
* - `hasNext` is true if a future payload is expected.
20-
* - `extensions` is reserved for adding non-standard properties.
21-
* - `incremental` is a list of the results from defer/stream directives.
22-
*/
23-
export interface ExecutionResult<
24-
TData = ObjMap<unknown>,
25-
TExtensions = ObjMap<unknown>,
26-
> {
27-
errors?: ReadonlyArray<GraphQLError>;
28-
data?: TData | null;
29-
extensions?: TExtensions;
30-
}
31-
32-
export interface FormattedExecutionResult<
33-
TData = ObjMap<unknown>,
34-
TExtensions = ObjMap<unknown>,
35-
> {
36-
errors?: ReadonlyArray<GraphQLFormattedError>;
37-
data?: TData | null;
38-
extensions?: TExtensions;
39-
}
40-
41-
export interface ExperimentalIncrementalExecutionResults<
42-
TData = unknown,
43-
TExtensions = ObjMap<unknown>,
44-
> {
45-
initialResult: InitialIncrementalExecutionResult<TData, TExtensions>;
46-
subsequentResults: AsyncGenerator<
47-
SubsequentIncrementalExecutionResult<TData, TExtensions>,
48-
void,
49-
void
50-
>;
51-
}
52-
53-
export interface InitialIncrementalExecutionResult<
54-
TData = ObjMap<unknown>,
55-
TExtensions = ObjMap<unknown>,
56-
> extends ExecutionResult<TData, TExtensions> {
57-
data: TData;
58-
pending: ReadonlyArray<PendingResult>;
59-
hasNext: true;
60-
extensions?: TExtensions;
61-
}
62-
63-
export interface FormattedInitialIncrementalExecutionResult<
64-
TData = ObjMap<unknown>,
65-
TExtensions = ObjMap<unknown>,
66-
> extends FormattedExecutionResult<TData, TExtensions> {
67-
data: TData;
68-
pending: ReadonlyArray<PendingResult>;
69-
hasNext: boolean;
70-
extensions?: TExtensions;
71-
}
72-
73-
export interface SubsequentIncrementalExecutionResult<
74-
TData = unknown,
75-
TExtensions = ObjMap<unknown>,
76-
> {
77-
pending?: ReadonlyArray<PendingResult>;
78-
incremental?: ReadonlyArray<IncrementalResult<TData, TExtensions>>;
79-
completed?: ReadonlyArray<CompletedResult>;
80-
hasNext: boolean;
81-
extensions?: TExtensions;
82-
}
83-
84-
export interface FormattedSubsequentIncrementalExecutionResult<
85-
TData = unknown,
86-
TExtensions = ObjMap<unknown>,
87-
> {
88-
hasNext: boolean;
89-
pending?: ReadonlyArray<PendingResult>;
90-
incremental?: ReadonlyArray<FormattedIncrementalResult<TData, TExtensions>>;
91-
completed?: ReadonlyArray<FormattedCompletedResult>;
92-
extensions?: TExtensions;
93-
}
94-
95-
interface BareDeferredGroupedFieldSetResult<TData = ObjMap<unknown>> {
96-
errors?: ReadonlyArray<GraphQLError>;
97-
data: TData;
98-
}
99-
100-
export interface IncrementalDeferResult<
101-
TData = ObjMap<unknown>,
102-
TExtensions = ObjMap<unknown>,
103-
> extends BareDeferredGroupedFieldSetResult<TData> {
104-
id: string;
105-
subPath?: ReadonlyArray<string | number>;
106-
extensions?: TExtensions;
107-
}
7+
import type { GraphQLError } from '../error/GraphQLError.js';
1088

109-
export interface FormattedIncrementalDeferResult<
110-
TData = ObjMap<unknown>,
111-
TExtensions = ObjMap<unknown>,
112-
> {
113-
errors?: ReadonlyArray<GraphQLFormattedError>;
114-
data: TData;
115-
id: string;
116-
subPath?: ReadonlyArray<string | number>;
117-
extensions?: TExtensions;
118-
}
119-
120-
interface BareStreamItemsResult<TData = ReadonlyArray<unknown>> {
121-
errors?: ReadonlyArray<GraphQLError>;
122-
items: TData;
123-
}
124-
125-
export interface IncrementalStreamResult<
126-
TData = ReadonlyArray<unknown>,
127-
TExtensions = ObjMap<unknown>,
128-
> extends BareStreamItemsResult<TData> {
129-
id: string;
130-
subPath?: ReadonlyArray<string | number>;
131-
extensions?: TExtensions;
132-
}
133-
134-
export interface FormattedIncrementalStreamResult<
135-
TData = Array<unknown>,
136-
TExtensions = ObjMap<unknown>,
137-
> {
138-
errors?: ReadonlyArray<GraphQLFormattedError>;
139-
items: TData;
140-
id: string;
141-
subPath?: ReadonlyArray<string | number>;
142-
extensions?: TExtensions;
143-
}
144-
145-
export type IncrementalResult<TData = unknown, TExtensions = ObjMap<unknown>> =
146-
| IncrementalDeferResult<TData, TExtensions>
147-
| IncrementalStreamResult<TData, TExtensions>;
148-
149-
export type FormattedIncrementalResult<
150-
TData = unknown,
151-
TExtensions = ObjMap<unknown>,
152-
> =
153-
| FormattedIncrementalDeferResult<TData, TExtensions>
154-
| FormattedIncrementalStreamResult<TData, TExtensions>;
155-
156-
export interface PendingResult {
157-
id: string;
158-
path: ReadonlyArray<string | number>;
159-
label?: string;
160-
}
161-
162-
export interface CompletedResult {
163-
id: string;
164-
errors?: ReadonlyArray<GraphQLError>;
165-
}
166-
167-
export interface FormattedCompletedResult {
168-
path: ReadonlyArray<string | number>;
169-
label?: string;
170-
errors?: ReadonlyArray<GraphQLError>;
171-
}
9+
import type {
10+
CancellableStreamRecord,
11+
CompletedResult,
12+
DeferredFragmentRecord,
13+
DeferredGroupedFieldSetResult,
14+
ExperimentalIncrementalExecutionResults,
15+
IncrementalDataRecord,
16+
IncrementalDataRecordResult,
17+
IncrementalDeferResult,
18+
IncrementalResult,
19+
IncrementalStreamResult,
20+
InitialIncrementalExecutionResult,
21+
PendingResult,
22+
StreamItemsResult,
23+
SubsequentIncrementalExecutionResult,
24+
SubsequentResultRecord,
25+
} from './types.js';
26+
import {
27+
isCancellableStreamRecord,
28+
isDeferredFragmentRecord,
29+
isDeferredGroupedFieldSetRecord,
30+
isDeferredGroupedFieldSetResult,
31+
isNonReconcilableDeferredGroupedFieldSetResult,
32+
} from './types.js';
17233

17334
export function buildIncrementalResponse(
17435
context: IncrementalPublisherContext,
@@ -657,138 +518,3 @@ class IncrementalPublisher {
657518
};
658519
}
659520
}
660-
661-
function isDeferredFragmentRecord(
662-
subsequentResultRecord: SubsequentResultRecord,
663-
): subsequentResultRecord is DeferredFragmentRecord {
664-
return 'parent' in subsequentResultRecord;
665-
}
666-
667-
function isDeferredGroupedFieldSetRecord(
668-
incrementalDataRecord: IncrementalDataRecord,
669-
): incrementalDataRecord is DeferredGroupedFieldSetRecord {
670-
return 'deferredFragmentRecords' in incrementalDataRecord;
671-
}
672-
673-
export type DeferredGroupedFieldSetResult =
674-
| ReconcilableDeferredGroupedFieldSetResult
675-
| NonReconcilableDeferredGroupedFieldSetResult;
676-
677-
function isDeferredGroupedFieldSetResult(
678-
subsequentResult: DeferredGroupedFieldSetResult | StreamItemsResult,
679-
): subsequentResult is DeferredGroupedFieldSetResult {
680-
return 'deferredFragmentRecords' in subsequentResult;
681-
}
682-
683-
interface ReconcilableDeferredGroupedFieldSetResult {
684-
deferredFragmentRecords: ReadonlyArray<DeferredFragmentRecord>;
685-
path: Array<string | number>;
686-
result: BareDeferredGroupedFieldSetResult;
687-
incrementalDataRecords: ReadonlyArray<IncrementalDataRecord> | undefined;
688-
sent?: true | undefined;
689-
errors?: never;
690-
}
691-
692-
interface NonReconcilableDeferredGroupedFieldSetResult {
693-
errors: ReadonlyArray<GraphQLError>;
694-
deferredFragmentRecords: ReadonlyArray<DeferredFragmentRecord>;
695-
path: Array<string | number>;
696-
result?: never;
697-
}
698-
699-
function isNonReconcilableDeferredGroupedFieldSetResult(
700-
deferredGroupedFieldSetResult: DeferredGroupedFieldSetResult,
701-
): deferredGroupedFieldSetResult is NonReconcilableDeferredGroupedFieldSetResult {
702-
return deferredGroupedFieldSetResult.errors !== undefined;
703-
}
704-
705-
export interface DeferredGroupedFieldSetRecord {
706-
deferredFragmentRecords: ReadonlyArray<DeferredFragmentRecord>;
707-
result: PromiseOrValue<DeferredGroupedFieldSetResult>;
708-
}
709-
710-
export interface SubsequentResultRecord {
711-
path: Path | undefined;
712-
label: string | undefined;
713-
id?: string | undefined;
714-
}
715-
716-
/** @internal */
717-
export class DeferredFragmentRecord implements SubsequentResultRecord {
718-
path: Path | undefined;
719-
label: string | undefined;
720-
id?: string | undefined;
721-
parent: DeferredFragmentRecord | undefined;
722-
expectedReconcilableResults: number;
723-
results: Array<DeferredGroupedFieldSetResult>;
724-
reconcilableResults: Array<ReconcilableDeferredGroupedFieldSetResult>;
725-
children: Set<DeferredFragmentRecord>;
726-
727-
constructor(opts: {
728-
path: Path | undefined;
729-
label: string | undefined;
730-
parent: DeferredFragmentRecord | undefined;
731-
}) {
732-
this.path = opts.path;
733-
this.label = opts.label;
734-
this.parent = opts.parent;
735-
this.expectedReconcilableResults = 0;
736-
this.results = [];
737-
this.reconcilableResults = [];
738-
this.children = new Set();
739-
}
740-
}
741-
742-
export interface CancellableStreamRecord extends SubsequentResultRecord {
743-
earlyReturn: () => Promise<unknown>;
744-
}
745-
746-
function isCancellableStreamRecord(
747-
subsequentResultRecord: SubsequentResultRecord,
748-
): subsequentResultRecord is CancellableStreamRecord {
749-
return 'earlyReturn' in subsequentResultRecord;
750-
}
751-
752-
interface ReconcilableStreamItemsResult {
753-
streamRecord: SubsequentResultRecord;
754-
result: BareStreamItemsResult;
755-
incrementalDataRecords: ReadonlyArray<IncrementalDataRecord> | undefined;
756-
errors?: never;
757-
}
758-
759-
export function isReconcilableStreamItemsResult(
760-
streamItemsResult: StreamItemsResult,
761-
): streamItemsResult is ReconcilableStreamItemsResult {
762-
return streamItemsResult.result !== undefined;
763-
}
764-
765-
interface TerminatingStreamItemsResult {
766-
streamRecord: SubsequentResultRecord;
767-
result?: never;
768-
incrementalDataRecords?: never;
769-
errors?: never;
770-
}
771-
772-
interface NonReconcilableStreamItemsResult {
773-
streamRecord: SubsequentResultRecord;
774-
errors: ReadonlyArray<GraphQLError>;
775-
result?: never;
776-
}
777-
778-
export type StreamItemsResult =
779-
| ReconcilableStreamItemsResult
780-
| TerminatingStreamItemsResult
781-
| NonReconcilableStreamItemsResult;
782-
783-
export interface StreamItemsRecord {
784-
streamRecord: SubsequentResultRecord;
785-
result: PromiseOrValue<StreamItemsResult>;
786-
}
787-
788-
export type IncrementalDataRecord =
789-
| DeferredGroupedFieldSetRecord
790-
| StreamItemsRecord;
791-
792-
export type IncrementalDataRecordResult =
793-
| DeferredGroupedFieldSetResult
794-
| StreamItemsResult;

src/execution/__tests__/defer-test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import { execute, experimentalExecuteIncrementally } from '../execute.js';
2020
import type {
2121
InitialIncrementalExecutionResult,
2222
SubsequentIncrementalExecutionResult,
23-
} from '../IncrementalPublisher.js';
23+
} from '../types.js';
2424

2525
const friendType = new GraphQLObjectType({
2626
fields: {

src/execution/__tests__/lists-test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import { GraphQLSchema } from '../../type/schema.js';
1919
import { buildSchema } from '../../utilities/buildASTSchema.js';
2020

2121
import { execute, executeSync } from '../execute.js';
22-
import type { ExecutionResult } from '../IncrementalPublisher.js';
22+
import type { ExecutionResult } from '../types.js';
2323

2424
describe('Execute: Accepts any iterable as list value', () => {
2525
function complete(rootValue: unknown) {

src/execution/__tests__/nonnull-test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import { GraphQLSchema } from '../../type/schema.js';
1414
import { buildSchema } from '../../utilities/buildASTSchema.js';
1515

1616
import { execute, executeSync } from '../execute.js';
17-
import type { ExecutionResult } from '../IncrementalPublisher.js';
17+
import type { ExecutionResult } from '../types.js';
1818

1919
const syncError = new Error('sync');
2020
const syncNonNullError = new Error('syncNonNull');

src/execution/__tests__/oneof-test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { parse } from '../../language/parser.js';
77
import { buildSchema } from '../../utilities/buildASTSchema.js';
88

99
import { execute } from '../execute.js';
10-
import type { ExecutionResult } from '../IncrementalPublisher.js';
10+
import type { ExecutionResult } from '../types.js';
1111

1212
const schema = buildSchema(`
1313
type Query {

src/execution/__tests__/stream-test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import { experimentalExecuteIncrementally } from '../execute.js';
2222
import type {
2323
InitialIncrementalExecutionResult,
2424
SubsequentIncrementalExecutionResult,
25-
} from '../IncrementalPublisher.js';
25+
} from '../types.js';
2626

2727
const friendType = new GraphQLObjectType({
2828
fields: {

src/execution/__tests__/subscribe-test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import { GraphQLSchema } from '../../type/schema.js';
2222

2323
import type { ExecutionArgs } from '../execute.js';
2424
import { createSourceEventStream, subscribe } from '../execute.js';
25-
import type { ExecutionResult } from '../IncrementalPublisher.js';
25+
import type { ExecutionResult } from '../types.js';
2626

2727
import { SimplePubSub } from './simplePubSub.js';
2828

0 commit comments

Comments
 (0)