@@ -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