-
-
Notifications
You must be signed in to change notification settings - Fork 809
/
introspect.ts
86 lines (83 loc) · 2.44 KB
/
introspect.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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import {
buildClientSchema,
getIntrospectionQuery,
GraphQLSchema,
IntrospectionOptions,
IntrospectionQuery,
parse,
ParseOptions,
} from 'graphql';
import { ValueOrPromise } from 'value-or-promise';
import {
AsyncExecutor,
createGraphQLError,
ExecutionResult,
Executor,
inspect,
isAsyncIterable,
MaybePromise,
SyncExecutor,
} from '@graphql-tools/utils';
function getSchemaFromIntrospection(
introspectionResult: ExecutionResult<IntrospectionQuery>,
options?: Parameters<typeof buildClientSchema>[1],
): GraphQLSchema {
if (introspectionResult?.data?.__schema) {
return buildClientSchema(introspectionResult.data, options);
}
if (introspectionResult?.errors) {
const graphqlErrors = introspectionResult.errors.map(error =>
createGraphQLError(error.message, error),
);
if (introspectionResult.errors.length === 1) {
throw graphqlErrors[0];
} else {
throw new AggregateError(graphqlErrors, 'Could not obtain introspection result');
}
}
throw createGraphQLError(
`Could not obtain introspection result, received the following as response; \n ${inspect(
introspectionResult,
)}`,
);
}
export type SchemaFromExecutorOptions = Partial<IntrospectionOptions> &
Parameters<typeof buildClientSchema>[1] &
ParseOptions;
export function schemaFromExecutor(
executor: SyncExecutor,
context?: Record<string, any>,
options?: SchemaFromExecutorOptions,
): GraphQLSchema;
export function schemaFromExecutor(
executor: AsyncExecutor,
context?: Record<string, any>,
options?: SchemaFromExecutorOptions,
): Promise<GraphQLSchema>;
export function schemaFromExecutor(
executor: Executor,
context?: Record<string, any>,
options?: SchemaFromExecutorOptions,
): MaybePromise<GraphQLSchema>;
export function schemaFromExecutor(
executor: Executor,
context?: Record<string, any>,
options?: SchemaFromExecutorOptions,
): MaybePromise<GraphQLSchema> {
const parsedIntrospectionQuery = parse(getIntrospectionQuery(options as any), options);
return new ValueOrPromise(() =>
executor({
document: parsedIntrospectionQuery,
context,
}),
)
.then(introspection => {
if (isAsyncIterable(introspection)) {
const iterator = introspection[Symbol.asyncIterator]();
return iterator.next().then(({ value }) => value);
}
return introspection;
})
.then(introspection => getSchemaFromIntrospection(introspection, options))
.resolve();
}