@@ -8,41 +8,62 @@ import {
88 GraphQLSchema ,
99} from 'graphql' ;
1010
11- import { MapperKind , FieldFilter , RootFieldFilter , TypeFilter } from './Interfaces' ;
11+ import { MapperKind , FieldFilter , RootFieldFilter , TypeFilter , ArgumentFilter } from './Interfaces' ;
1212
1313import { mapSchema } from './mapSchema' ;
1414
1515import { Constructor } from './types' ;
1616
1717export function filterSchema ( {
1818 schema,
19- rootFieldFilter = ( ) => true ,
2019 typeFilter = ( ) => true ,
21- fieldFilter = ( ) => true ,
22- objectFieldFilter = ( ) => true ,
23- interfaceFieldFilter = ( ) => true ,
20+ fieldFilter = undefined ,
21+ rootFieldFilter = undefined ,
22+ objectFieldFilter = undefined ,
23+ interfaceFieldFilter = undefined ,
24+ inputObjectFieldFilter = undefined ,
25+ argumentFilter = undefined ,
2426} : {
2527 schema : GraphQLSchema ;
2628 rootFieldFilter ?: RootFieldFilter ;
2729 typeFilter ?: TypeFilter ;
2830 fieldFilter ?: FieldFilter ;
2931 objectFieldFilter ?: FieldFilter ;
3032 interfaceFieldFilter ?: FieldFilter ;
33+ inputObjectFieldFilter ?: FieldFilter ;
34+ argumentFilter ?: ArgumentFilter ;
3135} ) : GraphQLSchema {
3236 const filteredSchema : GraphQLSchema = mapSchema ( schema , {
3337 [ MapperKind . QUERY ] : ( type : GraphQLObjectType ) => filterRootFields ( type , 'Query' , rootFieldFilter ) ,
3438 [ MapperKind . MUTATION ] : ( type : GraphQLObjectType ) => filterRootFields ( type , 'Mutation' , rootFieldFilter ) ,
3539 [ MapperKind . SUBSCRIPTION ] : ( type : GraphQLObjectType ) => filterRootFields ( type , 'Subscription' , rootFieldFilter ) ,
3640 [ MapperKind . OBJECT_TYPE ] : ( type : GraphQLObjectType ) =>
3741 typeFilter ( type . name , type )
38- ? filterElementFields < GraphQLObjectType > ( type , objectFieldFilter || fieldFilter , GraphQLObjectType )
42+ ? filterElementFields < GraphQLObjectType > (
43+ GraphQLObjectType ,
44+ type ,
45+ objectFieldFilter || fieldFilter ,
46+ argumentFilter
47+ )
3948 : null ,
4049 [ MapperKind . INTERFACE_TYPE ] : ( type : GraphQLInterfaceType ) =>
4150 typeFilter ( type . name , type )
42- ? filterElementFields < GraphQLInterfaceType > ( type , interfaceFieldFilter , GraphQLInterfaceType )
51+ ? filterElementFields < GraphQLInterfaceType > (
52+ GraphQLInterfaceType ,
53+ type ,
54+ interfaceFieldFilter || fieldFilter ,
55+ argumentFilter
56+ )
57+ : null ,
58+ [ MapperKind . INPUT_OBJECT_TYPE ] : ( type : GraphQLInputObjectType ) =>
59+ typeFilter ( type . name , type )
60+ ? filterElementFields < GraphQLInputObjectType > (
61+ GraphQLInputObjectType ,
62+ type ,
63+ inputObjectFieldFilter || fieldFilter
64+ )
4365 : null ,
4466 [ MapperKind . UNION_TYPE ] : ( type : GraphQLUnionType ) => ( typeFilter ( type . name , type ) ? undefined : null ) ,
45- [ MapperKind . INPUT_OBJECT_TYPE ] : ( type : GraphQLInputObjectType ) => ( typeFilter ( type . name , type ) ? undefined : null ) ,
4667 [ MapperKind . ENUM_TYPE ] : ( type : GraphQLEnumType ) => ( typeFilter ( type . name , type ) ? undefined : null ) ,
4768 [ MapperKind . SCALAR_TYPE ] : ( type : GraphQLScalarType ) => ( typeFilter ( type . name , type ) ? undefined : null ) ,
4869 } ) ;
@@ -53,27 +74,41 @@ export function filterSchema({
5374function filterRootFields (
5475 type : GraphQLObjectType ,
5576 operation : 'Query' | 'Mutation' | 'Subscription' ,
56- rootFieldFilter : RootFieldFilter
77+ rootFieldFilter ? : RootFieldFilter
5778) : GraphQLObjectType {
58- const config = type . toConfig ( ) ;
59- Object . keys ( config . fields ) . forEach ( fieldName => {
60- if ( ! rootFieldFilter ( operation , fieldName , config . fields [ fieldName ] ) ) {
61- delete config . fields [ fieldName ] ;
62- }
63- } ) ;
64- return new GraphQLObjectType ( config ) ;
79+ if ( rootFieldFilter ) {
80+ const config = type . toConfig ( ) ;
81+ Object . keys ( config . fields ) . forEach ( fieldName => {
82+ if ( ! rootFieldFilter ( operation , fieldName , config . fields [ fieldName ] ) ) {
83+ delete config . fields [ fieldName ] ;
84+ }
85+ } ) ;
86+ return new GraphQLObjectType ( config ) ;
87+ }
88+ return type ;
6589}
6690
6791function filterElementFields < ElementType > (
68- type : GraphQLObjectType | GraphQLInterfaceType ,
69- fieldFilter : FieldFilter ,
70- ElementConstructor : Constructor < ElementType >
71- ) : ElementType {
72- const config = type . toConfig ( ) ;
73- Object . keys ( config . fields ) . forEach ( fieldName => {
74- if ( ! fieldFilter ( type . name , fieldName , config . fields [ fieldName ] ) ) {
75- delete config . fields [ fieldName ] ;
92+ ElementConstructor : Constructor < ElementType > ,
93+ type : GraphQLObjectType | GraphQLInterfaceType | GraphQLInputObjectType ,
94+ fieldFilter ?: FieldFilter ,
95+ argumentFilter ?: ArgumentFilter
96+ ) : ElementType | undefined {
97+ if ( fieldFilter || argumentFilter ) {
98+ if ( ! fieldFilter ) fieldFilter = ( ) => true ;
99+
100+ const config = type . toConfig ( ) ;
101+ for ( const [ fieldName , field ] of Object . entries ( config . fields ) ) {
102+ if ( ! fieldFilter ( type . name , fieldName , config . fields [ fieldName ] ) ) {
103+ delete config . fields [ fieldName ] ;
104+ } else if ( argumentFilter && 'args' in field ) {
105+ for ( const argName of Object . keys ( field . args ) ) {
106+ if ( ! argumentFilter ( type . name , fieldName , argName , field . args [ argName ] ) ) {
107+ delete field . args [ argName ] ;
108+ }
109+ }
110+ }
76111 }
77- } ) ;
78- return new ElementConstructor ( config ) ;
112+ return new ElementConstructor ( config ) ;
113+ }
79114}
0 commit comments