/
merge-schemas.ts
58 lines (52 loc) · 2.19 KB
/
merge-schemas.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import { GraphQLSchema } from 'graphql';
import { extractExtensionsFromSchema, SchemaExtensions } from '@graphql-tools/merge';
import { IResolvers, asArray, getResolversFromSchema } from '@graphql-tools/utils';
import { makeExecutableSchema } from './makeExecutableSchema';
import { IExecutableSchemaDefinition } from './types';
/**
* Configuration object for schema merging
*/
export type MergeSchemasConfig<T = any> = Partial<IExecutableSchemaDefinition<T>> &
IExecutableSchemaDefinition<T>['parseOptions'] & {
/**
* The schemas to be merged
*/
schemas?: GraphQLSchema[];
};
/**
* Synchronously merges multiple schemas, typeDefinitions and/or resolvers into a single schema.
* @param config Configuration object
*/
export function mergeSchemas(config: MergeSchemasConfig) {
const extractedResolvers: IResolvers<any, any>[] = [];
const extractedExtensions: SchemaExtensions[] = asArray(config.extensions || []);
const schemas = config.schemas || [];
for (const schema of config.schemas || []) {
extractedResolvers.push(getResolversFromSchema(schema));
extractedExtensions.push(extractExtensionsFromSchema(schema));
}
return makeExecutableSchema({
parseOptions: config,
...config,
typeDefs: asArray(config.typeDefs || []).concat(schemas),
resolvers: asArray(config.resolvers || []).concat(extractedResolvers),
extensions: asArray(config.extensions || []).concat(extractedExtensions),
});
}
/**
* Asynchronously merges multiple schemas, typeDefinitions and/or resolvers into a single schema.
* @param config Configuration object
*/
export async function mergeSchemasAsync(config: MergeSchemasConfig) {
const schemas = config.schemas || [];
const [extractedResolvers, extractedExtensions] = await Promise.all([
Promise.all(schemas.map(async schema => getResolversFromSchema(schema))),
Promise.all(schemas.map(async schema => extractExtensionsFromSchema(schema))),
]);
return makeExecutableSchema({
...config,
typeDefs: asArray(config.typeDefs || []).concat(config.schemas || []),
resolvers: asArray(config.resolvers || []).concat(extractedResolvers),
extensions: asArray(config.extensions || []).concat(extractedExtensions),
});
}