Skip to content

Commit 6e39558

Browse files
authored
fix incremental types (#4560)
1. the generic type parameter for deferred data extends ObjMap<uknown> while for streamed data, items is always a ReadonlyArray<StreamItemType>, so we need an additional typed parameter 2. renamed the LegacyExecutor result types to prefix with "Legacy". These types are only available to consumers via deep import. 3. provide Formatted Legacy Incremental Result types. also only available by deep imports This is a type-level BREAKING CHANGE.
1 parent 74050de commit 6e39558

6 files changed

Lines changed: 198 additions & 79 deletions

File tree

src/execution/incremental/IncrementalExecutor.ts

Lines changed: 48 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -67,29 +67,39 @@ const buildExecutionPlanFromDeferred = memoize2(
6767
* - `incremental` is a list of the results from defer/stream directives.
6868
*/
6969
export interface ExperimentalIncrementalExecutionResults<
70-
TInitial = ObjMap<unknown>,
71-
TSubsequent = unknown,
70+
TInitialData = ObjMap<unknown>,
71+
TDeferredData = ObjMap<unknown>,
72+
TStreamItem = unknown,
7273
TExtensions = ObjMap<unknown>,
7374
> {
74-
initialResult: InitialIncrementalExecutionResult<TInitial, TExtensions>;
75+
initialResult: InitialIncrementalExecutionResult<TInitialData, TExtensions>;
7576
subsequentResults: AsyncGenerator<
76-
SubsequentIncrementalExecutionResult<TSubsequent, TExtensions>,
77+
SubsequentIncrementalExecutionResult<
78+
TDeferredData,
79+
TStreamItem,
80+
TExtensions
81+
>,
7782
void,
7883
void
7984
>;
8085
}
8186

8287
export interface FormattedExperimentalIncrementalExecutionResults<
8388
TInitial = ObjMap<unknown>,
84-
TSubsequent = unknown,
89+
TDeferredData = ObjMap<unknown>,
90+
TStreamItem = unknown,
8591
TExtensions = ObjMap<unknown>,
8692
> {
8793
initialResult: FormattedInitialIncrementalExecutionResult<
8894
TInitial,
8995
TExtensions
9096
>;
9197
subsequentResults: AsyncGenerator<
92-
FormattedSubsequentIncrementalExecutionResult<TSubsequent, TExtensions>,
98+
FormattedSubsequentIncrementalExecutionResult<
99+
TDeferredData,
100+
TStreamItem,
101+
TExtensions
102+
>,
93103
void,
94104
void
95105
>;
@@ -105,91 +115,102 @@ export interface InitialIncrementalExecutionResult<
105115
}
106116

107117
export interface FormattedInitialIncrementalExecutionResult<
108-
TData = ObjMap<unknown>,
118+
TInitialData = ObjMap<unknown>,
109119
TExtensions = ObjMap<unknown>,
110-
> extends FormattedExecutionResult<TData, TExtensions> {
111-
data: TData;
120+
> extends FormattedExecutionResult<TInitialData, TExtensions> {
121+
data: TInitialData;
112122
pending: ReadonlyArray<PendingResult>;
113123
hasNext: boolean;
114124
extensions?: TExtensions;
115125
}
116126

117127
export interface SubsequentIncrementalExecutionResult<
118-
TData = unknown,
128+
TDeferredData = ObjMap<unknown>,
129+
TStreamItem = unknown,
119130
TExtensions = ObjMap<unknown>,
120131
> {
121132
pending?: ReadonlyArray<PendingResult>;
122-
incremental?: ReadonlyArray<IncrementalResult<TData, TExtensions>>;
133+
incremental?: ReadonlyArray<
134+
IncrementalResult<TDeferredData, TStreamItem, TExtensions>
135+
>;
123136
completed?: ReadonlyArray<CompletedResult>;
124137
hasNext: boolean;
125138
extensions?: TExtensions;
126139
}
127140

128141
export interface FormattedSubsequentIncrementalExecutionResult<
129-
TData = unknown,
142+
TDeferredData = ObjMap<unknown>,
143+
TStreamItem = unknown,
130144
TExtensions = ObjMap<unknown>,
131145
> {
132146
hasNext: boolean;
133147
pending?: ReadonlyArray<PendingResult>;
134-
incremental?: ReadonlyArray<FormattedIncrementalResult<TData, TExtensions>>;
148+
incremental?: ReadonlyArray<
149+
FormattedIncrementalResult<TDeferredData, TStreamItem, TExtensions>
150+
>;
135151
completed?: ReadonlyArray<FormattedCompletedResult>;
136152
extensions?: TExtensions;
137153
}
138154

139155
export interface IncrementalDeferResult<
140-
TData = ObjMap<unknown>,
156+
TDeferredData = ObjMap<unknown>,
141157
TExtensions = ObjMap<unknown>,
142158
> {
143159
id: string;
144160
subPath?: ReadonlyArray<string | number>;
145161
errors?: ReadonlyArray<GraphQLError>;
146-
data: TData;
162+
data: TDeferredData;
147163
extensions?: TExtensions;
148164
}
149165

150166
export interface FormattedIncrementalDeferResult<
151-
TData = ObjMap<unknown>,
167+
TDeferredData = ObjMap<unknown>,
152168
TExtensions = ObjMap<unknown>,
153169
> {
154170
errors?: ReadonlyArray<GraphQLFormattedError>;
155-
data: TData;
171+
data: TDeferredData;
156172
id: string;
157173
subPath?: ReadonlyArray<string | number>;
158174
extensions?: TExtensions;
159175
}
160176

161177
export interface IncrementalStreamResult<
162-
TData = ReadonlyArray<unknown>,
178+
TStreamItem = unknown,
163179
TExtensions = ObjMap<unknown>,
164180
> {
165181
id: string;
166182
subPath?: ReadonlyArray<string | number>;
167183
errors?: ReadonlyArray<GraphQLError>;
168-
items: TData;
184+
items: ReadonlyArray<TStreamItem>;
169185
extensions?: TExtensions;
170186
}
171187

172188
export interface FormattedIncrementalStreamResult<
173-
TData = Array<unknown>,
189+
TStreamItem = Array<unknown>,
174190
TExtensions = ObjMap<unknown>,
175191
> {
176192
errors?: ReadonlyArray<GraphQLFormattedError>;
177-
items: TData;
193+
items: ReadonlyArray<TStreamItem>;
178194
id: string;
179195
subPath?: ReadonlyArray<string | number>;
180196
extensions?: TExtensions;
181197
}
182198

183-
export type IncrementalResult<TData = unknown, TExtensions = ObjMap<unknown>> =
184-
| IncrementalDeferResult<TData, TExtensions>
185-
| IncrementalStreamResult<TData, TExtensions>;
199+
export type IncrementalResult<
200+
TDeferredData = ObjMap<unknown>,
201+
TStreamItem = unknown,
202+
TExtensions = ObjMap<unknown>,
203+
> =
204+
| IncrementalDeferResult<TDeferredData, TExtensions>
205+
| IncrementalStreamResult<TStreamItem, TExtensions>;
186206

187207
export type FormattedIncrementalResult<
188-
TData = unknown,
208+
TDeferredData = ObjMap<unknown>,
209+
TStreamItem = unknown,
189210
TExtensions = ObjMap<unknown>,
190211
> =
191-
| FormattedIncrementalDeferResult<TData, TExtensions>
192-
| FormattedIncrementalStreamResult<TData, TExtensions>;
212+
| FormattedIncrementalDeferResult<TDeferredData, TExtensions>
213+
| FormattedIncrementalStreamResult<TStreamItem, TExtensions>;
193214

194215
export interface PendingResult {
195216
id: string;

src/execution/legacyIncremental/BranchingIncrementalExecutor.ts

Lines changed: 114 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,17 @@ import { memoize1 } from '../../jsutils/memoize1.js';
66
import { memoize2 } from '../../jsutils/memoize2.js';
77
import type { ObjMap } from '../../jsutils/ObjMap.js';
88

9-
import type { GraphQLError } from '../../error/GraphQLError.js';
9+
import type {
10+
GraphQLError,
11+
GraphQLFormattedError,
12+
} from '../../error/GraphQLError.js';
1013

1114
import type {
1215
DeferUsage,
1316
FieldDetails,
1417
GroupedFieldSet,
1518
} from '../collectFields.js';
16-
import type { ExecutionResult } from '../Executor.js';
19+
import type { ExecutionResult, FormattedExecutionResult } from '../Executor.js';
1720
import type {
1821
DeferUsageSet,
1922
ExecutionPlan,
@@ -22,51 +25,70 @@ import { IncrementalExecutor } from '../incremental/IncrementalExecutor.js';
2225

2326
import { BranchingIncrementalPublisher } from './BranchingIncrementalPublisher.js';
2427

25-
export interface ExperimentalIncrementalExecutionResults {
26-
initialResult: InitialIncrementalExecutionResult;
28+
export interface LegacyExperimentalIncrementalExecutionResults<
29+
TInitialData = ObjMap<unknown>,
30+
TDeferredData = ObjMap<unknown>,
31+
TStreamItem = unknown,
32+
TExtensions = ObjMap<unknown>,
33+
> {
34+
initialResult: LegacyInitialIncrementalExecutionResult<
35+
TInitialData,
36+
TExtensions
37+
>;
2738
subsequentResults: AsyncGenerator<
28-
SubsequentIncrementalExecutionResult,
39+
LegacySubsequentIncrementalExecutionResult<
40+
TDeferredData,
41+
TStreamItem,
42+
TExtensions
43+
>,
2944
void,
3045
void
3146
>;
3247
}
3348

34-
export interface InitialIncrementalExecutionResult<
35-
TData = ObjMap<unknown>,
49+
export interface LegacyInitialIncrementalExecutionResult<
50+
TInitialData = ObjMap<unknown>,
3651
TExtensions = ObjMap<unknown>,
37-
> extends ExecutionResult<TData, TExtensions> {
38-
data: TData;
52+
> extends ExecutionResult<TInitialData, TExtensions> {
53+
data: TInitialData;
3954
hasNext: true;
4055
extensions?: TExtensions;
4156
}
4257

43-
export interface SubsequentIncrementalExecutionResult<
44-
TData = unknown,
58+
export interface LegacySubsequentIncrementalExecutionResult<
59+
TDeferredData = ObjMap<unknown>,
60+
TStreamItem = unknown,
4561
TExtensions = ObjMap<unknown>,
4662
> {
47-
incremental?: ReadonlyArray<IncrementalResult<TData, TExtensions>>;
63+
incremental?: ReadonlyArray<
64+
LegacyIncrementalResult<TDeferredData, TStreamItem, TExtensions>
65+
>;
4866
hasNext: boolean;
4967
extensions?: TExtensions;
5068
}
5169

52-
export type IncrementalResult<TData = unknown, TExtensions = ObjMap<unknown>> =
53-
| IncrementalDeferResult<TData, TExtensions>
54-
| IncrementalStreamResult<TData, TExtensions>;
70+
export type LegacyIncrementalResult<
71+
TDeferredData = ObjMap<unknown>,
72+
TStreamItem = unknown,
73+
TExtensions = ObjMap<unknown>,
74+
> =
75+
| LegacyIncrementalDeferResult<TDeferredData, TExtensions>
76+
| LegacyIncrementalStreamResult<TStreamItem, TExtensions>;
5577

56-
export interface IncrementalDeferResult<
57-
TData = ObjMap<unknown>,
78+
export interface LegacyIncrementalDeferResult<
79+
TDeferredData = ObjMap<unknown>,
5880
TExtensions = ObjMap<unknown>,
59-
> extends ExecutionResult<TData, TExtensions> {
81+
> extends ExecutionResult<TDeferredData, TExtensions> {
6082
path: ReadonlyArray<string | number>;
6183
label?: string;
6284
}
6385

64-
export interface IncrementalStreamResult<
65-
TData = ReadonlyArray<unknown>,
86+
export interface LegacyIncrementalStreamResult<
87+
TStreamItem = unknown,
6688
TExtensions = ObjMap<unknown>,
6789
> {
6890
errors?: ReadonlyArray<GraphQLError>;
69-
items: TData | null;
91+
items: ReadonlyArray<TStreamItem> | null;
7092
path: ReadonlyArray<string | number>;
7193
label?: string;
7294
extensions?: TExtensions;
@@ -82,11 +104,79 @@ const buildBranchingExecutionPlanFromDeferred = memoize2(
82104
buildBranchingExecutionPlan(groupedFieldSet, deferUsageSet),
83105
);
84106

107+
export interface FormattedLegacyExperimentalIncrementalExecutionResults<
108+
TInitialData = ObjMap<unknown>,
109+
TDeferredData = ObjMap<unknown>,
110+
TStreamItem = unknown,
111+
TExtensions = ObjMap<unknown>,
112+
> {
113+
initialResult: FormattedLegacyInitialIncrementalExecutionResult<
114+
TInitialData,
115+
TExtensions
116+
>;
117+
subsequentResults: AsyncGenerator<
118+
FormattedLegacySubsequentIncrementalExecutionResult<
119+
TDeferredData,
120+
TStreamItem,
121+
TExtensions
122+
>,
123+
void,
124+
void
125+
>;
126+
}
127+
128+
export interface FormattedLegacyInitialIncrementalExecutionResult<
129+
TInitialData = ObjMap<unknown>,
130+
TExtensions = ObjMap<unknown>,
131+
> extends FormattedExecutionResult<TInitialData, TExtensions> {
132+
data: TInitialData;
133+
hasNext: true;
134+
extensions?: TExtensions;
135+
}
136+
137+
export interface FormattedLegacySubsequentIncrementalExecutionResult<
138+
TDeferredData = ObjMap<unknown>,
139+
TStreamItem = unknown,
140+
TExtensions = ObjMap<unknown>,
141+
> {
142+
incremental?: ReadonlyArray<
143+
FormattedLegacyIncrementalResult<TDeferredData, TStreamItem, TExtensions>
144+
>;
145+
hasNext: boolean;
146+
extensions?: TExtensions;
147+
}
148+
149+
export type FormattedLegacyIncrementalResult<
150+
TDeferredData = ObjMap<unknown>,
151+
TStreamItem = unknown,
152+
TExtensions = ObjMap<unknown>,
153+
> =
154+
| FormattedLegacyIncrementalDeferResult<TDeferredData, TExtensions>
155+
| FormattedLegacyIncrementalStreamResult<TStreamItem, TExtensions>;
156+
157+
export interface FormattedLegacyIncrementalDeferResult<
158+
TDeferredData = ObjMap<unknown>,
159+
TExtensions = ObjMap<unknown>,
160+
> extends FormattedExecutionResult<TDeferredData, TExtensions> {
161+
path: ReadonlyArray<string | number>;
162+
label?: string;
163+
}
164+
165+
export interface FormattedLegacyIncrementalStreamResult<
166+
TStreamItem = unknown,
167+
TExtensions = ObjMap<unknown>,
168+
> {
169+
errors?: ReadonlyArray<GraphQLFormattedError>;
170+
items: ReadonlyArray<TStreamItem> | null;
171+
path: ReadonlyArray<string | number>;
172+
label?: string;
173+
extensions?: TExtensions;
174+
}
85175
/** @internal */
86-
export class BranchingIncrementalExecutor extends IncrementalExecutor<ExperimentalIncrementalExecutionResults> {
176+
export class BranchingIncrementalExecutor extends IncrementalExecutor<LegacyExperimentalIncrementalExecutionResults> {
87177
override createSubExecutor(
88178
deferUsageSet?: DeferUsageSet,
89-
): IncrementalExecutor<ExperimentalIncrementalExecutionResults> {
179+
): IncrementalExecutor<LegacyExperimentalIncrementalExecutionResults> {
90180
return new BranchingIncrementalExecutor(
91181
this.validatedExecutionArgs,
92182
this.sharedResolverAbortSignal,
@@ -96,7 +186,7 @@ export class BranchingIncrementalExecutor extends IncrementalExecutor<Experiment
96186

97187
override buildResponse(
98188
data: ObjMap<unknown> | null,
99-
): ExecutionResult | ExperimentalIncrementalExecutionResults {
189+
): ExecutionResult | LegacyExperimentalIncrementalExecutionResults {
100190
const work = this.getIncrementalWork();
101191
const { tasks, streams } = work;
102192
if (tasks?.length === 0 && streams?.length === 0) {

0 commit comments

Comments
 (0)