UNPKG

3.72 kBJavaScriptView Raw
1import { GraphQLInputObjectType, GraphQLInterfaceType, GraphQLObjectType, } from 'graphql';
2import { MapperKind, } from './Interfaces.js';
3import { mapSchema } from './mapSchema.js';
4export function filterSchema({ schema, typeFilter = () => true, fieldFilter = undefined, rootFieldFilter = undefined, objectFieldFilter = undefined, interfaceFieldFilter = undefined, inputObjectFieldFilter = undefined, argumentFilter = undefined, directiveFilter = undefined, enumValueFilter = undefined, }) {
5 const filteredSchema = mapSchema(schema, {
6 [MapperKind.QUERY]: (type) => filterRootFields(type, 'Query', rootFieldFilter, argumentFilter),
7 [MapperKind.MUTATION]: (type) => filterRootFields(type, 'Mutation', rootFieldFilter, argumentFilter),
8 [MapperKind.SUBSCRIPTION]: (type) => filterRootFields(type, 'Subscription', rootFieldFilter, argumentFilter),
9 [MapperKind.OBJECT_TYPE]: (type) => typeFilter(type.name, type)
10 ? filterElementFields(GraphQLObjectType, type, objectFieldFilter || fieldFilter, argumentFilter)
11 : null,
12 [MapperKind.INTERFACE_TYPE]: (type) => typeFilter(type.name, type)
13 ? filterElementFields(GraphQLInterfaceType, type, interfaceFieldFilter || fieldFilter, argumentFilter)
14 : null,
15 [MapperKind.INPUT_OBJECT_TYPE]: (type) => typeFilter(type.name, type)
16 ? filterElementFields(GraphQLInputObjectType, type, inputObjectFieldFilter || fieldFilter)
17 : null,
18 [MapperKind.UNION_TYPE]: (type) => typeFilter(type.name, type) ? undefined : null,
19 [MapperKind.ENUM_TYPE]: (type) => typeFilter(type.name, type) ? undefined : null,
20 [MapperKind.SCALAR_TYPE]: (type) => typeFilter(type.name, type) ? undefined : null,
21 [MapperKind.DIRECTIVE]: directive => directiveFilter && !directiveFilter(directive.name, directive) ? null : undefined,
22 [MapperKind.ENUM_VALUE]: (valueConfig, typeName, _schema, externalValue) => enumValueFilter && !enumValueFilter(typeName, externalValue, valueConfig) ? null : undefined,
23 });
24 return filteredSchema;
25}
26function filterRootFields(type, operation, rootFieldFilter, argumentFilter) {
27 if (rootFieldFilter || argumentFilter) {
28 const config = type.toConfig();
29 for (const fieldName in config.fields) {
30 const field = config.fields[fieldName];
31 if (rootFieldFilter && !rootFieldFilter(operation, fieldName, config.fields[fieldName])) {
32 delete config.fields[fieldName];
33 }
34 else if (argumentFilter && field.args) {
35 for (const argName in field.args) {
36 if (!argumentFilter(type.name, fieldName, argName, field.args[argName])) {
37 delete field.args[argName];
38 }
39 }
40 }
41 }
42 return new GraphQLObjectType(config);
43 }
44 return type;
45}
46function filterElementFields(ElementConstructor, type, fieldFilter, argumentFilter) {
47 if (fieldFilter || argumentFilter) {
48 const config = type.toConfig();
49 for (const fieldName in config.fields) {
50 const field = config.fields[fieldName];
51 if (fieldFilter && !fieldFilter(type.name, fieldName, config.fields[fieldName])) {
52 delete config.fields[fieldName];
53 }
54 else if (argumentFilter && 'args' in field) {
55 for (const argName in field.args) {
56 if (!argumentFilter(type.name, fieldName, argName, field.args[argName])) {
57 delete field.args[argName];
58 }
59 }
60 }
61 }
62 return new ElementConstructor(config);
63 }
64}