Skip to content

Commit 58fd4b2

Browse files
authoredMar 24, 2021
feat(types): add TContext to stitchSchemas and executor (#2760)
* feat(types): add TContext to stitchSchemas and executor * more * Improve * Fix build
1 parent 43da6b5 commit 58fd4b2

18 files changed

+188
-176
lines changed
 

‎.changeset/honest-carpets-deny.md

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
---
2+
'@graphql-tools/batch-execute': minor
3+
'@graphql-tools/delegate': minor
4+
'@graphql-tools/links': minor
5+
'@graphql-tools/stitch': minor
6+
'@graphql-tools/utils': minor
7+
---
8+
9+
feat(types): add TContext to stitchSchemas and executor

‎packages/batch-execute/src/createBatchingExecutor.ts

+1-3
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,7 @@ import isPromise from 'is-promise';
44

55
import DataLoader from 'dataloader';
66

7-
import { ExecutionResult } from '@graphql-tools/utils';
8-
9-
import { ExecutionParams, Executor } from './types';
7+
import { ExecutionParams, Executor, ExecutionResult } from '@graphql-tools/utils';
108

119
import { mergeExecutionParams } from './mergeExecutionParams';
1210
import { splitResult } from './splitResult';

‎packages/batch-execute/src/getBatchingExecutor.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import DataLoader from 'dataloader';
22

3-
import { ExecutionParams, Executor } from './types';
3+
import { ExecutionParams, Executor } from '@graphql-tools/utils';
44
import { createBatchingExecutor } from './createBatchingExecutor';
55
import { memoize2of4 } from './memoize';
66

‎packages/batch-execute/src/mergeExecutionParams.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import {
1818
OperationTypeNode,
1919
} from 'graphql';
2020

21-
import { ExecutionParams } from './types';
21+
import { ExecutionParams } from '@graphql-tools/utils';
2222

2323
import { createPrefix } from './prefix';
2424

@@ -150,9 +150,9 @@ function aliasTopLevelFields(prefix: string, document: DocumentNode): DocumentNo
150150
};
151151
},
152152
};
153-
return visit(document, transformer, ({ [Kind.DOCUMENT]: [`definitions`] } as unknown) as VisitorKeyMap<
154-
ASTKindToNode
155-
>);
153+
return visit(document, transformer, ({
154+
[Kind.DOCUMENT]: [`definitions`],
155+
} as unknown) as VisitorKeyMap<ASTKindToNode>);
156156
}
157157

158158
/**

‎packages/batch-execute/src/types.ts

-15
This file was deleted.

‎packages/delegate/src/Subschema.ts

+11-16
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,36 @@
11
import { GraphQLSchema } from 'graphql';
22

3-
import {
4-
SubschemaConfig,
5-
Transform,
6-
MergedTypeConfig,
7-
CreateProxyingResolverFn,
8-
Subscriber,
9-
Executor,
10-
BatchingOptions,
11-
} from './types';
3+
import { SubschemaConfig, Transform, MergedTypeConfig, CreateProxyingResolverFn, BatchingOptions } from './types';
124

135
import { applySchemaTransforms } from './applySchemaTransforms';
6+
import { Executor, Subscriber } from '@graphql-tools/utils';
147

158
export function isSubschema(value: any): value is Subschema {
169
return Boolean(value.transformedSchema);
1710
}
1811

19-
interface ISubschema extends SubschemaConfig {
12+
interface ISubschema<K = any, V = any, C = K, TContext = Record<string, any>>
13+
extends SubschemaConfig<K, V, C, TContext> {
2014
transformedSchema: GraphQLSchema;
2115
}
2216

23-
export class Subschema<K = any, V = any, C = K> implements ISubschema {
17+
export class Subschema<K = any, V = any, C = K, TContext = Record<string, any>>
18+
implements ISubschema<K, V, C, TContext> {
2419
public schema: GraphQLSchema;
2520

2621
public rootValue?: Record<string, any>;
27-
public executor?: Executor;
28-
public subscriber?: Subscriber;
22+
public executor?: Executor<TContext>;
23+
public subscriber?: Subscriber<TContext>;
2924
public batch?: boolean;
3025
public batchingOptions?: BatchingOptions<K, V, C>;
3126

32-
public createProxyingResolver?: CreateProxyingResolverFn;
27+
public createProxyingResolver?: CreateProxyingResolverFn<TContext>;
3328
public transforms: Array<Transform>;
3429
public transformedSchema: GraphQLSchema;
3530

36-
public merge?: Record<string, MergedTypeConfig>;
31+
public merge?: Record<string, MergedTypeConfig<any, any, TContext>>;
3732

38-
constructor(config: SubschemaConfig) {
33+
constructor(config: SubschemaConfig<K, V, C, TContext>) {
3934
this.schema = config.schema;
4035

4136
this.rootValue = config.rootValue;

‎packages/delegate/src/delegateToSchema.ts

+7-13
Original file line numberDiff line numberDiff line change
@@ -19,25 +19,19 @@ import AggregateError from '@ardatan/aggregate-error';
1919

2020
import { getBatchingExecutor } from '@graphql-tools/batch-execute';
2121

22-
import { mapAsyncIterator, ExecutionResult } from '@graphql-tools/utils';
22+
import { mapAsyncIterator, ExecutionResult, Executor, ExecutionParams } from '@graphql-tools/utils';
2323

24-
import {
25-
IDelegateToSchemaOptions,
26-
IDelegateRequestOptions,
27-
SubschemaConfig,
28-
ExecutionParams,
29-
StitchingInfo,
30-
Transform,
31-
Executor,
32-
} from './types';
24+
import { IDelegateToSchemaOptions, IDelegateRequestOptions, SubschemaConfig, StitchingInfo, Transform } from './types';
3325

3426
import { isSubschemaConfig } from './subschemaConfig';
3527
import { Subschema } from './Subschema';
3628
import { createRequestFromInfo, getDelegatingOperation } from './createRequest';
3729
import { Transformer } from './Transformer';
3830
import { memoize2 } from './memoize';
3931

40-
export function delegateToSchema(options: IDelegateToSchemaOptions): any {
32+
export function delegateToSchema<TContext = Record<string, any>, TArgs = any>(
33+
options: IDelegateToSchemaOptions<TContext, TArgs>
34+
): any {
4135
const {
4236
info,
4337
operationName,
@@ -83,7 +77,7 @@ function getDelegationReturnType(
8377
return rootType.getFields()[fieldName].type;
8478
}
8579

86-
export function delegateRequest({
80+
export function delegateRequest<TContext = Record<string, any>, TArgs = any>({
8781
request,
8882
schema: subschemaOrSubschemaConfig,
8983
rootValue,
@@ -99,7 +93,7 @@ export function delegateRequest({
9993
skipValidation,
10094
skipTypeMerging,
10195
binding,
102-
}: IDelegateRequestOptions) {
96+
}: IDelegateRequestOptions<TContext, TArgs>) {
10397
let operationDefinition: OperationDefinitionNode;
10498
let targetOperation: OperationTypeNode;
10599
let targetFieldName: string;

‎packages/delegate/src/types.ts

+28-50
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import {
33
GraphQLOutputType,
44
SelectionSetNode,
55
FieldNode,
6-
DocumentNode,
76
GraphQLResolveInfo,
87
GraphQLFieldResolver,
98
FragmentDefinitionNode,
@@ -15,7 +14,7 @@ import {
1514

1615
import DataLoader from 'dataloader';
1716

18-
import { Request, TypeMap, ExecutionResult } from '@graphql-tools/utils';
17+
import { ExecutionParams, ExecutionResult, Executor, Request, Subscriber, TypeMap } from '@graphql-tools/utils';
1918

2019
import { Subschema } from './Subschema';
2120
import { OBJECT_SUBSCHEMA_SYMBOL, FIELD_SUBSCHEMA_MAP_SYMBOL, UNPATHED_ERRORS_SYMBOL } from './symbols';
@@ -60,7 +59,7 @@ export interface DelegationContext {
6059
export type DelegationBinding = (delegationContext: DelegationContext) => Array<Transform>;
6160

6261
export interface IDelegateToSchemaOptions<TContext = Record<string, any>, TArgs = Record<string, any>> {
63-
schema: GraphQLSchema | SubschemaConfig;
62+
schema: GraphQLSchema | SubschemaConfig<any, any, any, TContext>;
6463
operationName?: string;
6564
operation?: OperationTypeNode;
6665
fieldName?: string;
@@ -79,7 +78,8 @@ export interface IDelegateToSchemaOptions<TContext = Record<string, any>, TArgs
7978
binding?: DelegationBinding;
8079
}
8180

82-
export interface IDelegateRequestOptions extends Omit<IDelegateToSchemaOptions, 'info'> {
81+
export interface IDelegateRequestOptions<TContext = Record<string, any>, TArgs = Record<string, any>>
82+
extends Omit<IDelegateToSchemaOptions<TContext, TArgs>, 'info'> {
8383
request: Request;
8484
info?: GraphQLResolveInfo;
8585
}
@@ -107,7 +107,7 @@ export interface ICreateRequest {
107107
fieldNodes?: ReadonlyArray<FieldNode>;
108108
}
109109

110-
export interface MergedTypeInfo {
110+
export interface MergedTypeInfo<TContext = Record<string, any>> {
111111
typeName: string;
112112
selectionSet?: SelectionSetNode;
113113
targetSubschemas: Map<Subschema, Array<Subschema>>;
@@ -116,67 +116,45 @@ export interface MergedTypeInfo {
116116
typeMaps: Map<GraphQLSchema | SubschemaConfig, TypeMap>;
117117
selectionSets: Map<Subschema, SelectionSetNode>;
118118
fieldSelectionSets: Map<Subschema, Record<string, SelectionSetNode>>;
119-
resolvers: Map<Subschema, MergedTypeResolver>;
119+
resolvers: Map<Subschema, MergedTypeResolver<TContext>>;
120120
}
121121

122-
export interface ExecutionParams<TArgs = Record<string, any>, TContext = any> {
123-
document: DocumentNode;
124-
variables?: TArgs;
125-
extensions?: Record<string, any>;
126-
context?: TContext;
127-
info?: GraphQLResolveInfo;
128-
}
129-
130-
export type AsyncExecutor = <
131-
TReturn = Record<string, any>,
132-
TArgs = Record<string, any>,
133-
TContext = Record<string, any>
134-
>(
135-
params: ExecutionParams<TArgs, TContext>
136-
) => Promise<ExecutionResult<TReturn>>;
137-
export type SyncExecutor = <TReturn = Record<string, any>, TArgs = Record<string, any>, TContext = Record<string, any>>(
138-
params: ExecutionParams<TArgs, TContext>
139-
) => ExecutionResult<TReturn>;
140-
export type Executor = <TReturn = Record<string, any>, TArgs = Record<string, any>, TContext = Record<string, any>>(
141-
params: ExecutionParams<TArgs, TContext>
142-
) => ExecutionResult<TReturn> | Promise<ExecutionResult<TReturn>>;
143-
export type Subscriber = <TReturn = Record<string, any>, TArgs = Record<string, any>, TContext = Record<string, any>>(
144-
params: ExecutionParams<TArgs, TContext>
145-
) => Promise<AsyncIterator<ExecutionResult<TReturn>> | ExecutionResult<TReturn>>;
146-
147-
export interface ICreateProxyingResolverOptions {
148-
subschemaConfig: SubschemaConfig;
122+
export interface ICreateProxyingResolverOptions<TContext = Record<string, any>> {
123+
subschemaConfig: SubschemaConfig<any, any, any, TContext>;
149124
transformedSchema?: GraphQLSchema;
150125
operation?: OperationTypeNode;
151126
fieldName?: string;
152127
}
153128

154-
export type CreateProxyingResolverFn = (options: ICreateProxyingResolverOptions) => GraphQLFieldResolver<any, any>;
129+
export type CreateProxyingResolverFn<TContext = Record<string, any>> = (
130+
options: ICreateProxyingResolverOptions<TContext>
131+
) => GraphQLFieldResolver<any, TContext>;
155132

156133
export interface BatchingOptions<K = any, V = any, C = K> {
157134
extensionsReducer?: (mergedExtensions: Record<string, any>, executionParams: ExecutionParams) => Record<string, any>;
158135
dataLoaderOptions?: DataLoader.Options<K, V, C>;
159136
}
160137

161-
export interface SubschemaConfig<K = any, V = any, C = K> {
138+
export interface SubschemaConfig<K = any, V = any, C = K, TContext = Record<string, any>> {
162139
schema: GraphQLSchema;
163-
createProxyingResolver?: CreateProxyingResolverFn;
140+
createProxyingResolver?: CreateProxyingResolverFn<TContext>;
164141
transforms?: Array<Transform>;
165-
merge?: Record<string, MergedTypeConfig>;
142+
merge?: Record<string, MergedTypeConfig<any, any, TContext>>;
166143
rootValue?: Record<string, any>;
167-
executor?: Executor;
168-
subscriber?: Subscriber;
144+
executor?: Executor<TContext>;
145+
subscriber?: Subscriber<TContext>;
169146
batch?: boolean;
170147
batchingOptions?: BatchingOptions<K, V, C>;
171148
}
172149

173-
export interface MergedTypeConfig<K = any, V = any> extends MergedTypeResolverOptions<K, V> {
150+
export interface MergedTypeConfig<K = any, V = any, TContext = Record<string, any>>
151+
extends MergedTypeResolverOptions<K, V> {
174152
selectionSet?: string;
175153
fields?: Record<string, MergedFieldConfig>;
176154
computedFields?: Record<string, { selectionSet?: string }>;
177155
key?: (originalResult: any) => K;
178156
canonical?: boolean;
179-
resolve?: MergedTypeResolver;
157+
resolve?: MergedTypeResolver<TContext>;
180158
}
181159

182160
export interface MergedTypeResolverOptions<K = any, V = any> {
@@ -192,26 +170,26 @@ export interface MergedFieldConfig {
192170
canonical?: boolean;
193171
}
194172

195-
export type MergedTypeResolver = (
173+
export type MergedTypeResolver<TContext = Record<string, any>> = (
196174
originalResult: any,
197-
context: Record<string, any>,
175+
context: TContext,
198176
info: GraphQLResolveInfo,
199-
subschema: GraphQLSchema | SubschemaConfig,
177+
subschema: GraphQLSchema | SubschemaConfig<any, any, any, TContext>,
200178
selectionSet: SelectionSetNode,
201179
key?: any
202180
) => any;
203181

204-
export interface StitchingInfo {
205-
subschemaMap: Map<GraphQLSchema | SubschemaConfig, Subschema>;
182+
export interface StitchingInfo<TContext = Record<string, any>> {
183+
subschemaMap: Map<GraphQLSchema | SubschemaConfig<any, any, any, TContext>, Subschema<any, any, any, TContext>>;
206184
selectionSetsByType: Record<string, SelectionSetNode>;
207185
selectionSetsByField: Record<string, Record<string, SelectionSetNode>>;
208186
dynamicSelectionSetsByField: Record<string, Record<string, Array<(node: FieldNode) => SelectionSetNode>>>;
209-
mergedTypes: Record<string, MergedTypeInfo>;
187+
mergedTypes: Record<string, MergedTypeInfo<TContext>>;
210188
}
211189

212-
export interface ExternalObject {
190+
export interface ExternalObject<TContext = Record<string, any>> {
213191
key: any;
214-
[OBJECT_SUBSCHEMA_SYMBOL]: GraphQLSchema | SubschemaConfig;
215-
[FIELD_SUBSCHEMA_MAP_SYMBOL]: Record<string, GraphQLSchema | SubschemaConfig>;
192+
[OBJECT_SUBSCHEMA_SYMBOL]: GraphQLSchema | SubschemaConfig<any, any, any, TContext>;
193+
[FIELD_SUBSCHEMA_MAP_SYMBOL]: Record<string, GraphQLSchema | SubschemaConfig<any, any, any, TContext>>;
216194
[UNPATHED_ERRORS_SYMBOL]: Array<GraphQLError>;
217195
}

‎packages/links/src/linkToExecutor.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@ import { ApolloLink, execute } from '@apollo/client/link/core';
22
import { Observable } from '@apollo/client/utilities';
33
import { toPromise } from '@apollo/client/link/utils';
44

5-
import { AsyncExecutor, ExecutionParams } from '@graphql-tools/delegate';
6-
import { ExecutionResult } from '@graphql-tools/utils';
5+
import { AsyncExecutor, ExecutionParams, ExecutionResult } from '@graphql-tools/utils';
76

87
export const linkToExecutor = (link: ApolloLink): AsyncExecutor => <TReturn, TArgs, TContext>(
98
params: ExecutionParams<TArgs, TContext>

‎packages/links/src/linkToSubscriber.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
import { ApolloLink, execute } from '@apollo/client/link/core';
22
import { Observable } from '@apollo/client/utilities';
33

4-
import { ExecutionResult, observableToAsyncIterable } from '@graphql-tools/utils';
5-
import { Subscriber, ExecutionParams } from '@graphql-tools/delegate';
4+
import { Subscriber, ExecutionParams, ExecutionResult, observableToAsyncIterable } from '@graphql-tools/utils';
65

76
export const linkToSubscriber = (link: ApolloLink): Subscriber => async <TReturn, TArgs, TContext>(
87
params: ExecutionParams<TArgs, TContext>

‎packages/loaders/url/src/index.ts

+9-5
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22
/// <reference lib="dom" />
33
import { print, IntrospectionOptions, DocumentNode, GraphQLResolveInfo, Kind, parse, buildASTSchema } from 'graphql';
44
import {
5+
AsyncExecutor,
6+
Executor,
7+
Subscriber,
8+
SyncExecutor,
59
SchemaPointerSingle,
610
Source,
711
DocumentLoader,
@@ -11,7 +15,7 @@ import {
1115
} from '@graphql-tools/utils';
1216
import { isWebUri } from 'valid-url';
1317
import { fetch as crossFetch } from 'cross-fetch';
14-
import { AsyncExecutor, Executor, SubschemaConfig, Subscriber, SyncExecutor } from '@graphql-tools/delegate';
18+
import { SubschemaConfig } from '@graphql-tools/delegate';
1519
import { introspectSchema, wrapSchema } from '@graphql-tools/wrap';
1620
import { createClient } from 'graphql-ws';
1721
import WebSocket from 'isomorphic-ws';
@@ -260,11 +264,11 @@ export class UrlLoader implements DocumentLoader<LoadFromUrlOptions> {
260264
url: WS_URL,
261265
webSocketImpl,
262266
});
263-
return async <TReturn>({ document, variables }: { document: DocumentNode; variables: any }) => {
267+
return async ({ document, variables }: { document: DocumentNode; variables: any }) => {
264268
const query = print(document);
265269
return observableToAsyncIterable({
266270
subscribe: observer => {
267-
const unsubscribe = subscriptionClient.subscribe<TReturn>(
271+
const unsubscribe = subscriptionClient.subscribe(
268272
{
269273
query,
270274
variables,
@@ -280,7 +284,7 @@ export class UrlLoader implements DocumentLoader<LoadFromUrlOptions> {
280284
}
281285

282286
buildSSESubscriber(pointer: string, eventSourceOptions?: SubscriptionOptions['eventSourceOptions']): Subscriber {
283-
return async <TReturn>({ document, variables }: { document: DocumentNode; variables: any }) => {
287+
return async ({ document, variables }: { document: DocumentNode; variables: any }) => {
284288
const query = print(document);
285289
return observableToAsyncIterable({
286290
subscribe: observer => {
@@ -296,7 +300,7 @@ export class UrlLoader implements DocumentLoader<LoadFromUrlOptions> {
296300
...eventSourceOptions,
297301
},
298302
onNext: data => {
299-
const parsedData: TReturn = JSON.parse(data);
303+
const parsedData = JSON.parse(data);
300304
observer.next(parsedData);
301305
},
302306
onError: data => {

‎packages/stitch/src/stitchSchemas.ts

+8-8
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import { createStitchingInfo, completeStitchingInfo, addStitchingInfo } from './
2828
import { isolateComputedFields } from './isolateComputedFields';
2929
import { defaultSubschemaConfigTransforms } from './subschemaConfigTransforms';
3030

31-
export function stitchSchemas({
31+
export function stitchSchemas<TContext = Record<string, any>>({
3232
subschemas = [],
3333
types = [],
3434
typeDefs,
@@ -48,14 +48,14 @@ export function stitchSchemas({
4848
parseOptions = {},
4949
pruningOptions,
5050
updateResolversInPlace,
51-
}: IStitchSchemasOptions): GraphQLSchema {
51+
}: IStitchSchemasOptions<TContext>): GraphQLSchema {
5252
if (typeof resolverValidationOptions !== 'object') {
5353
throw new Error('Expected `resolverValidationOptions` to be an object');
5454
}
5555

5656
let transformedSubschemas: Array<Subschema> = [];
57-
const subschemaMap: Map<GraphQLSchema | SubschemaConfig, Subschema> = new Map();
58-
const originalSubschemaMap: Map<Subschema, GraphQLSchema | SubschemaConfig> = new Map();
57+
const subschemaMap: Map<GraphQLSchema | SubschemaConfig<any, any, any, TContext>, Subschema> = new Map();
58+
const originalSubschemaMap: Map<Subschema, GraphQLSchema | SubschemaConfig<any, any, any, TContext>> = new Map();
5959

6060
subschemas.forEach(subschemaOrSubschemaArray => {
6161
if (Array.isArray(subschemaOrSubschemaArray)) {
@@ -192,11 +192,11 @@ export function stitchSchemas({
192192
return schema;
193193
}
194194

195-
function applySubschemaConfigTransforms(
196-
subschemaConfigTransforms: Array<SubschemaConfigTransform>,
197-
subschemaOrSubschemaConfig: GraphQLSchema | SubschemaConfig,
195+
function applySubschemaConfigTransforms<TContext = Record<string, any>>(
196+
subschemaConfigTransforms: Array<SubschemaConfigTransform<TContext>>,
197+
subschemaOrSubschemaConfig: GraphQLSchema | SubschemaConfig<any, any, any, TContext>,
198198
subschemaMap: Map<GraphQLSchema | SubschemaConfig, Subschema>,
199-
originalSubschemaMap: Map<Subschema, GraphQLSchema | SubschemaConfig>
199+
originalSubschemaMap: Map<Subschema, GraphQLSchema | SubschemaConfig<any, any, any, TContext>>
200200
): Array<Subschema> {
201201
const subschemaConfig = isSubschemaConfig(subschemaOrSubschemaConfig)
202202
? subschemaOrSubschemaConfig

‎packages/stitch/src/types.ts

+50-42
Original file line numberDiff line numberDiff line change
@@ -15,78 +15,86 @@ import { ITypeDefinitions, TypeMap } from '@graphql-tools/utils';
1515
import { MergedTypeResolver, Subschema, SubschemaConfig } from '@graphql-tools/delegate';
1616
import { IExecutableSchemaDefinition } from '@graphql-tools/schema';
1717

18-
export interface MergeTypeCandidate {
18+
export interface MergeTypeCandidate<TContext = Record<string, any>> {
1919
type: GraphQLNamedType;
20-
subschema?: GraphQLSchema | SubschemaConfig;
21-
transformedSubschema?: Subschema;
20+
subschema?: GraphQLSchema | SubschemaConfig<any, any, any, TContext>;
21+
transformedSubschema?: Subschema<any, any, any, TContext>;
2222
}
2323

24-
export interface MergeFieldConfigCandidate {
25-
fieldConfig: GraphQLFieldConfig<any, any>;
24+
export interface MergeFieldConfigCandidate<TContext = Record<string, any>> {
25+
fieldConfig: GraphQLFieldConfig<any, TContext>;
2626
fieldName: string;
2727
type: GraphQLObjectType | GraphQLInterfaceType;
28-
subschema?: GraphQLSchema | SubschemaConfig;
29-
transformedSubschema?: Subschema;
28+
subschema?: GraphQLSchema | SubschemaConfig<any, any, any, TContext>;
29+
transformedSubschema?: Subschema<any, any, any, TContext>;
3030
}
3131

32-
export interface MergeInputFieldConfigCandidate {
32+
export interface MergeInputFieldConfigCandidate<TContext = Record<string, any>> {
3333
inputFieldConfig: GraphQLInputFieldConfig;
3434
fieldName: string;
3535
type: GraphQLInputObjectType;
36-
subschema?: GraphQLSchema | SubschemaConfig;
37-
transformedSubschema?: Subschema;
36+
subschema?: GraphQLSchema | SubschemaConfig<any, any, any, TContext>;
37+
transformedSubschema?: Subschema<any, any, any, TContext>;
3838
}
3939

40-
export interface MergeEnumValueConfigCandidate {
40+
export interface MergeEnumValueConfigCandidate<TContext = Record<string, any>> {
4141
enumValueConfig: GraphQLEnumValueConfig;
4242
enumValue: string;
4343
type: GraphQLEnumType;
44-
subschema?: GraphQLSchema | SubschemaConfig;
45-
transformedSubschema?: Subschema;
44+
subschema?: GraphQLSchema | SubschemaConfig<any, any, any, TContext>;
45+
transformedSubschema?: Subschema<any, any, any, TContext>;
4646
}
4747

48-
export type MergeTypeFilter = (mergeTypeCandidates: Array<MergeTypeCandidate>, typeName: string) => boolean;
48+
export type MergeTypeFilter<TContext = Record<string, any>> = (
49+
mergeTypeCandidates: Array<MergeTypeCandidate<TContext>>,
50+
typeName: string
51+
) => boolean;
4952

50-
export interface MergedTypeInfo {
53+
export interface MergedTypeInfo<TContext = Record<string, any>> {
5154
typeName: string;
52-
targetSubschemas: Map<Subschema, Array<Subschema>>;
53-
uniqueFields: Record<string, Subschema>;
54-
nonUniqueFields: Record<string, Array<Subschema>>;
55-
typeMaps: Map<GraphQLSchema | SubschemaConfig, TypeMap>;
56-
selectionSets: Map<Subschema, SelectionSetNode>;
57-
fieldSelectionSets: Map<Subschema, Record<string, SelectionSetNode>>;
58-
resolvers: Map<Subschema, MergedTypeResolver>;
55+
targetSubschemas: Map<Subschema<any, any, any, TContext>, Array<Subschema<any, any, any, TContext>>>;
56+
uniqueFields: Record<string, Subschema<any, any, any, TContext>>;
57+
nonUniqueFields: Record<string, Array<Subschema<any, any, any, TContext>>>;
58+
typeMaps: Map<GraphQLSchema | SubschemaConfig<any, any, any, TContext>, TypeMap>;
59+
selectionSets: Map<Subschema<any, any, any, TContext>, SelectionSetNode>;
60+
fieldSelectionSets: Map<Subschema<any, any, any, TContext>, Record<string, SelectionSetNode>>;
61+
resolvers: Map<Subschema<any, any, any, TContext>, MergedTypeResolver<TContext>>;
5962
}
6063

61-
export interface StitchingInfo {
62-
subschemaMap: Map<GraphQLSchema | SubschemaConfig, Subschema>;
64+
export interface StitchingInfo<TContext = Record<string, any>> {
65+
subschemaMap: Map<GraphQLSchema | SubschemaConfig<any, any, any, TContext>, Subschema<any, any, any, TContext>>;
6366
selectionSetsByType: Record<string, SelectionSetNode>;
6467
selectionSetsByField: Record<string, Record<string, SelectionSetNode>>;
6568
dynamicSelectionSetsByField: Record<string, Record<string, Array<(node: FieldNode) => SelectionSetNode>>>;
66-
mergedTypes: Record<string, MergedTypeInfo>;
69+
mergedTypes: Record<string, MergedTypeInfo<TContext>>;
6770
}
6871

69-
export interface IStitchSchemasOptions<TContext = any> extends Omit<IExecutableSchemaDefinition<TContext>, 'typeDefs'> {
70-
subschemas?: Array<GraphQLSchema | SubschemaConfig | Array<SubschemaConfig>>;
72+
export interface IStitchSchemasOptions<TContext = Record<string, any>>
73+
extends Omit<IExecutableSchemaDefinition<TContext>, 'typeDefs'> {
74+
subschemas?: Array<
75+
GraphQLSchema | SubschemaConfig<any, any, any, TContext> | Array<SubschemaConfig<any, any, any, TContext>>
76+
>;
7177
typeDefs?: ITypeDefinitions;
7278
types?: Array<GraphQLNamedType>;
7379
onTypeConflict?: OnTypeConflict;
7480
mergeDirectives?: boolean;
75-
mergeTypes?: boolean | Array<string> | MergeTypeFilter;
76-
typeMergingOptions?: TypeMergingOptions;
77-
subschemaConfigTransforms?: Array<SubschemaConfigTransform>;
81+
mergeTypes?: boolean | Array<string> | MergeTypeFilter<TContext>;
82+
typeMergingOptions?: TypeMergingOptions<TContext>;
83+
subschemaConfigTransforms?: Array<SubschemaConfigTransform<TContext>>;
7884
}
7985

80-
export type SubschemaConfigTransform = (subschemaConfig: SubschemaConfig) => SubschemaConfig;
86+
export type SubschemaConfigTransform<TContext = Record<string, any>> = (
87+
subschemaConfig: SubschemaConfig<any, any, any, TContext>
88+
) => SubschemaConfig<any, any, any, TContext>;
8189

82-
export interface TypeMergingOptions {
90+
export interface TypeMergingOptions<TContext = Record<string, any>> {
8391
validationSettings?: ValidationSettings;
8492
validationScopes?: Record<string, ValidationSettings>;
85-
typeCandidateMerger?: (candidates: Array<MergeTypeCandidate>) => MergeTypeCandidate;
86-
typeDescriptionsMerger?: (candidates: Array<MergeTypeCandidate>) => string;
87-
fieldConfigMerger?: (candidates: Array<MergeFieldConfigCandidate>) => GraphQLFieldConfig<any, any>;
88-
inputFieldConfigMerger?: (candidates: Array<MergeInputFieldConfigCandidate>) => GraphQLInputFieldConfig;
89-
enumValueConfigMerger?: (candidates: Array<MergeEnumValueConfigCandidate>) => GraphQLEnumValueConfig;
93+
typeCandidateMerger?: (candidates: Array<MergeTypeCandidate<TContext>>) => MergeTypeCandidate<TContext>;
94+
typeDescriptionsMerger?: (candidates: Array<MergeTypeCandidate<TContext>>) => string;
95+
fieldConfigMerger?: (candidates: Array<MergeFieldConfigCandidate<TContext>>) => GraphQLFieldConfig<any, any>;
96+
inputFieldConfigMerger?: (candidates: Array<MergeInputFieldConfigCandidate<TContext>>) => GraphQLInputFieldConfig;
97+
enumValueConfigMerger?: (candidates: Array<MergeEnumValueConfigCandidate<TContext>>) => GraphQLEnumValueConfig;
9098
}
9199

92100
export enum ValidationLevel {
@@ -101,17 +109,17 @@ export interface ValidationSettings {
101109
proxiableScalars?: Record<string, Array<string>>;
102110
}
103111

104-
export type OnTypeConflict = (
112+
export type OnTypeConflict<TContext = Record<string, any>> = (
105113
left: GraphQLNamedType,
106114
right: GraphQLNamedType,
107115
info?: {
108116
left: {
109-
subschema?: GraphQLSchema | SubschemaConfig;
110-
transformedSubschema?: Subschema;
117+
subschema?: GraphQLSchema | SubschemaConfig<any, any, any, TContext>;
118+
transformedSubschema?: Subschema<any, any, any, TContext>;
111119
};
112120
right: {
113-
subschema?: GraphQLSchema | SubschemaConfig;
114-
transformedSubschema?: Subschema;
121+
subschema?: GraphQLSchema | SubschemaConfig<any, any, any, TContext>;
122+
transformedSubschema?: Subschema<any, any, any, TContext>;
115123
};
116124
}
117125
) => GraphQLNamedType;

‎packages/utils/src/executor.ts

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { DocumentNode, GraphQLResolveInfo } from 'graphql';
2+
import { ExecutionResult } from './Interfaces';
3+
4+
export interface ExecutionParams<TArgs = Record<string, any>, TContext = any> {
5+
document: DocumentNode;
6+
variables?: TArgs;
7+
extensions?: Record<string, any>;
8+
context?: TContext;
9+
info?: GraphQLResolveInfo;
10+
}
11+
12+
export type AsyncExecutor<TBaseContext = Record<string, any>> = <
13+
TReturn = Record<string, any>,
14+
TArgs = Record<string, any>,
15+
TContext = TBaseContext
16+
>(
17+
params: ExecutionParams<TArgs, TContext>
18+
) => Promise<ExecutionResult<TReturn>>;
19+
export type SyncExecutor<TBaseContext = Record<string, any>> = <
20+
TReturn = Record<string, any>,
21+
TArgs = Record<string, any>,
22+
TContext = TBaseContext
23+
>(
24+
params: ExecutionParams<TArgs, TContext>
25+
) => ExecutionResult<TReturn>;
26+
export type Executor<TBaseContext = Record<string, any>> = <
27+
TReturn = Record<string, any>,
28+
TArgs = Record<string, any>,
29+
TContext = TBaseContext
30+
>(
31+
params: ExecutionParams<TArgs, TContext>
32+
) => ExecutionResult<TReturn> | Promise<ExecutionResult<TReturn>>;
33+
export type Subscriber<TBaseContext = Record<string, any>> = <
34+
TReturn = Record<string, any>,
35+
TArgs = Record<string, any>,
36+
TContext = TBaseContext
37+
>(
38+
params: ExecutionParams<TArgs, TContext>
39+
) => Promise<AsyncIterator<ExecutionResult<TReturn>> | ExecutionResult<TReturn>>;

‎packages/utils/src/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -49,3 +49,4 @@ export * from './valueMatchesCriteria';
4949
export * from './isAsyncIterable';
5050
export * from './isDocumentNode';
5151
export * from './astFromValueUntyped';
52+
export * from './executor';

‎packages/wrap/src/introspect.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@ import {
88
IntrospectionQuery,
99
} from 'graphql';
1010

11-
import { ExecutionResult } from '@graphql-tools/utils';
12-
import { AsyncExecutor, Executor, SyncExecutor } from '@graphql-tools/delegate';
11+
import { AsyncExecutor, Executor, SyncExecutor, ExecutionResult } from '@graphql-tools/utils';
1312
import AggregateError from '@ardatan/aggregate-error';
1413
import isPromise from 'is-promise';
1514

‎packages/wrap/src/makeRemoteExecutableSchema.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import { buildSchema, GraphQLFieldResolver, GraphQLSchema } from 'graphql';
22

33
import { IMakeRemoteExecutableSchemaOptions } from './types';
4-
import { Executor, Subscriber, delegateToSchema } from '@graphql-tools/delegate';
4+
import { delegateToSchema } from '@graphql-tools/delegate';
55

66
import { wrapSchema } from './wrapSchema';
7+
import { Executor, Subscriber } from '@graphql-tools/utils';
78

89
export function makeRemoteExecutableSchema({
910
schema: schemaOrTypeDefs,

‎packages/wrap/src/types.ts

+15-12
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,17 @@ import {
1212
GraphQLError,
1313
GraphQLEnumValueConfig,
1414
} from 'graphql';
15-
import { Executor, Subscriber, DelegationContext } from '@graphql-tools/delegate';
16-
import { Request } from '@graphql-tools/utils';
15+
import { DelegationContext } from '@graphql-tools/delegate';
16+
import { Executor, Subscriber, Request } from '@graphql-tools/utils';
1717

18-
export interface IMakeRemoteExecutableSchemaOptions {
18+
export interface IMakeRemoteExecutableSchemaOptions<TContext = Record<string, any>> {
1919
schema: GraphQLSchema | string;
20-
executor?: Executor;
21-
subscriber?: Subscriber;
22-
createResolver?: (executor: Executor, subscriber: Subscriber) => GraphQLFieldResolver<any, any>;
20+
executor?: Executor<TContext>;
21+
subscriber?: Subscriber<TContext>;
22+
createResolver?: (
23+
executor: Executor<TContext>,
24+
subscriber: Subscriber<TContext>
25+
) => GraphQLFieldResolver<any, TContext>;
2326
buildSchemaOptions?: BuildSchemaOptions;
2427
}
2528

@@ -44,17 +47,17 @@ export type InputObjectNodeTransformer = (
4447
delegationContext?: DelegationContext
4548
) => ObjectValueNode;
4649

47-
export type FieldTransformer = (
50+
export type FieldTransformer<TContext = Record<string, any>> = (
4851
typeName: string,
4952
fieldName: string,
50-
fieldConfig: GraphQLFieldConfig<any, any>
51-
) => GraphQLFieldConfig<any, any> | [string, GraphQLFieldConfig<any, any>] | null | undefined;
53+
fieldConfig: GraphQLFieldConfig<any, TContext>
54+
) => GraphQLFieldConfig<any, TContext> | [string, GraphQLFieldConfig<any, TContext>] | null | undefined;
5255

53-
export type RootFieldTransformer = (
56+
export type RootFieldTransformer<TContext = Record<string, any>> = (
5457
operation: 'Query' | 'Mutation' | 'Subscription',
5558
fieldName: string,
56-
fieldConfig: GraphQLFieldConfig<any, any>
57-
) => GraphQLFieldConfig<any, any> | [string, GraphQLFieldConfig<any, any>] | null | undefined;
59+
fieldConfig: GraphQLFieldConfig<any, TContext>
60+
) => GraphQLFieldConfig<any, TContext> | [string, GraphQLFieldConfig<any, TContext>] | null | undefined;
5861

5962
export type EnumValueTransformer = (
6063
typeName: string,

0 commit comments

Comments
 (0)
Please sign in to comment.