11import { GraphQLFieldConfig , GraphQLSchema } from 'graphql' ;
2+ import { asArray } from './helpers.js' ;
23import { MapperKind } from './Interfaces.js' ;
34import { mapSchema } from './mapSchema.js' ;
45import {
@@ -8,25 +9,30 @@ import {
89 SchemaExtensions ,
910} from './types.js' ;
1011
11- function handleDirectiveExtensions ( extensions : any = { } ) {
12+ function handleDirectiveExtensions ( extensions : any , removeDirectives : boolean ) {
13+ extensions = extensions || { } ;
14+ const { directives : existingDirectives , ...rest } = extensions ;
1215 const finalExtensions : any = {
13- ...extensions ,
16+ ...rest ,
1417 } ;
15- const directives = finalExtensions . directives ;
16- if ( directives != null ) {
17- for ( const directiveName in directives ) {
18- const directiveObj = directives [ directiveName ] ;
19- if ( ! Array . isArray ( directiveObj ) ) {
20- directives [ directiveName ] = [ directiveObj ] ;
18+ if ( ! removeDirectives ) {
19+ if ( existingDirectives != null ) {
20+ const directives = { } ;
21+ for ( const directiveName in existingDirectives ) {
22+ directives [ directiveName ] = [ ...asArray ( existingDirectives [ directiveName ] ) ] ;
2123 }
24+ finalExtensions . directives = directives ;
2225 }
2326 }
2427 return finalExtensions ;
2528}
2629
27- export function extractExtensionsFromSchema ( schema : GraphQLSchema ) : SchemaExtensions {
30+ export function extractExtensionsFromSchema (
31+ schema : GraphQLSchema ,
32+ removeDirectives = false ,
33+ ) : SchemaExtensions {
2834 const result : SchemaExtensions = {
29- schemaExtensions : handleDirectiveExtensions ( schema . extensions ) ,
35+ schemaExtensions : handleDirectiveExtensions ( schema . extensions , removeDirectives ) ,
3036 types : { } ,
3137 } ;
3238
@@ -35,28 +41,28 @@ export function extractExtensionsFromSchema(schema: GraphQLSchema): SchemaExtens
3541 result . types [ type . name ] = {
3642 fields : { } ,
3743 type : 'object' ,
38- extensions : handleDirectiveExtensions ( type . extensions ) ,
44+ extensions : handleDirectiveExtensions ( type . extensions , removeDirectives ) ,
3945 } ;
4046 return type ;
4147 } ,
4248 [ MapperKind . INTERFACE_TYPE ] : type => {
4349 result . types [ type . name ] = {
4450 fields : { } ,
4551 type : 'interface' ,
46- extensions : handleDirectiveExtensions ( type . extensions ) ,
52+ extensions : handleDirectiveExtensions ( type . extensions , removeDirectives ) ,
4753 } ;
4854 return type ;
4955 } ,
5056 [ MapperKind . FIELD ] : ( field , fieldName , typeName ) => {
5157 ( result . types [ typeName ] as ObjectTypeExtensions ) . fields [ fieldName ] = {
5258 arguments : { } ,
53- extensions : handleDirectiveExtensions ( field . extensions ) ,
59+ extensions : handleDirectiveExtensions ( field . extensions , removeDirectives ) ,
5460 } ;
5561 const args = ( field as GraphQLFieldConfig < any , any > ) . args ;
5662 if ( args != null ) {
5763 for ( const argName in args ) {
5864 ( result . types [ typeName ] as ObjectTypeExtensions ) . fields [ fieldName ] . arguments [ argName ] =
59- handleDirectiveExtensions ( args [ argName ] . extensions ) ;
65+ handleDirectiveExtensions ( args [ argName ] . extensions , removeDirectives ) ;
6066 }
6167 }
6268 return field ;
@@ -65,41 +71,42 @@ export function extractExtensionsFromSchema(schema: GraphQLSchema): SchemaExtens
6571 result . types [ type . name ] = {
6672 values : { } ,
6773 type : 'enum' ,
68- extensions : handleDirectiveExtensions ( type . extensions ) ,
74+ extensions : handleDirectiveExtensions ( type . extensions , removeDirectives ) ,
6975 } ;
7076 return type ;
7177 } ,
7278 [ MapperKind . ENUM_VALUE ] : ( value , typeName , _schema , valueName ) => {
7379 ( result . types [ typeName ] as EnumTypeExtensions ) . values [ valueName ] = handleDirectiveExtensions (
7480 value . extensions ,
81+ removeDirectives ,
7582 ) ;
7683 return value ;
7784 } ,
7885 [ MapperKind . SCALAR_TYPE ] : type => {
7986 result . types [ type . name ] = {
8087 type : 'scalar' ,
81- extensions : handleDirectiveExtensions ( type . extensions ) ,
88+ extensions : handleDirectiveExtensions ( type . extensions , removeDirectives ) ,
8289 } ;
8390 return type ;
8491 } ,
8592 [ MapperKind . UNION_TYPE ] : type => {
8693 result . types [ type . name ] = {
8794 type : 'union' ,
88- extensions : handleDirectiveExtensions ( type . extensions ) ,
95+ extensions : handleDirectiveExtensions ( type . extensions , removeDirectives ) ,
8996 } ;
9097 return type ;
9198 } ,
9299 [ MapperKind . INPUT_OBJECT_TYPE ] : type => {
93100 result . types [ type . name ] = {
94101 fields : { } ,
95102 type : 'input' ,
96- extensions : handleDirectiveExtensions ( type . extensions ) ,
103+ extensions : handleDirectiveExtensions ( type . extensions , removeDirectives ) ,
97104 } ;
98105 return type ;
99106 } ,
100107 [ MapperKind . INPUT_OBJECT_FIELD ] : ( field , fieldName , typeName ) => {
101108 ( result . types [ typeName ] as InputTypeExtensions ) . fields [ fieldName ] = {
102- extensions : handleDirectiveExtensions ( field . extensions ) ,
109+ extensions : handleDirectiveExtensions ( field . extensions , removeDirectives ) ,
103110 } ;
104111 return field ;
105112 } ,
0 commit comments