1
1
import { GraphQLFieldConfig , GraphQLSchema } from 'graphql' ;
2
+ import { asArray } from './helpers.js' ;
2
3
import { MapperKind } from './Interfaces.js' ;
3
4
import { mapSchema } from './mapSchema.js' ;
4
5
import {
@@ -8,25 +9,30 @@ import {
8
9
SchemaExtensions ,
9
10
} from './types.js' ;
10
11
11
- function handleDirectiveExtensions ( extensions : any = { } ) {
12
+ function handleDirectiveExtensions ( extensions : any , removeDirectives : boolean ) {
13
+ extensions = extensions || { } ;
14
+ const { directives : existingDirectives , ...rest } = extensions ;
12
15
const finalExtensions : any = {
13
- ...extensions ,
16
+ ...rest ,
14
17
} ;
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 ] ) ] ;
21
23
}
24
+ finalExtensions . directives = directives ;
22
25
}
23
26
}
24
27
return finalExtensions ;
25
28
}
26
29
27
- export function extractExtensionsFromSchema ( schema : GraphQLSchema ) : SchemaExtensions {
30
+ export function extractExtensionsFromSchema (
31
+ schema : GraphQLSchema ,
32
+ removeDirectives = false ,
33
+ ) : SchemaExtensions {
28
34
const result : SchemaExtensions = {
29
- schemaExtensions : handleDirectiveExtensions ( schema . extensions ) ,
35
+ schemaExtensions : handleDirectiveExtensions ( schema . extensions , removeDirectives ) ,
30
36
types : { } ,
31
37
} ;
32
38
@@ -35,28 +41,28 @@ export function extractExtensionsFromSchema(schema: GraphQLSchema): SchemaExtens
35
41
result . types [ type . name ] = {
36
42
fields : { } ,
37
43
type : 'object' ,
38
- extensions : handleDirectiveExtensions ( type . extensions ) ,
44
+ extensions : handleDirectiveExtensions ( type . extensions , removeDirectives ) ,
39
45
} ;
40
46
return type ;
41
47
} ,
42
48
[ MapperKind . INTERFACE_TYPE ] : type => {
43
49
result . types [ type . name ] = {
44
50
fields : { } ,
45
51
type : 'interface' ,
46
- extensions : handleDirectiveExtensions ( type . extensions ) ,
52
+ extensions : handleDirectiveExtensions ( type . extensions , removeDirectives ) ,
47
53
} ;
48
54
return type ;
49
55
} ,
50
56
[ MapperKind . FIELD ] : ( field , fieldName , typeName ) => {
51
57
( result . types [ typeName ] as ObjectTypeExtensions ) . fields [ fieldName ] = {
52
58
arguments : { } ,
53
- extensions : handleDirectiveExtensions ( field . extensions ) ,
59
+ extensions : handleDirectiveExtensions ( field . extensions , removeDirectives ) ,
54
60
} ;
55
61
const args = ( field as GraphQLFieldConfig < any , any > ) . args ;
56
62
if ( args != null ) {
57
63
for ( const argName in args ) {
58
64
( result . types [ typeName ] as ObjectTypeExtensions ) . fields [ fieldName ] . arguments [ argName ] =
59
- handleDirectiveExtensions ( args [ argName ] . extensions ) ;
65
+ handleDirectiveExtensions ( args [ argName ] . extensions , removeDirectives ) ;
60
66
}
61
67
}
62
68
return field ;
@@ -65,41 +71,42 @@ export function extractExtensionsFromSchema(schema: GraphQLSchema): SchemaExtens
65
71
result . types [ type . name ] = {
66
72
values : { } ,
67
73
type : 'enum' ,
68
- extensions : handleDirectiveExtensions ( type . extensions ) ,
74
+ extensions : handleDirectiveExtensions ( type . extensions , removeDirectives ) ,
69
75
} ;
70
76
return type ;
71
77
} ,
72
78
[ MapperKind . ENUM_VALUE ] : ( value , typeName , _schema , valueName ) => {
73
79
( result . types [ typeName ] as EnumTypeExtensions ) . values [ valueName ] = handleDirectiveExtensions (
74
80
value . extensions ,
81
+ removeDirectives ,
75
82
) ;
76
83
return value ;
77
84
} ,
78
85
[ MapperKind . SCALAR_TYPE ] : type => {
79
86
result . types [ type . name ] = {
80
87
type : 'scalar' ,
81
- extensions : handleDirectiveExtensions ( type . extensions ) ,
88
+ extensions : handleDirectiveExtensions ( type . extensions , removeDirectives ) ,
82
89
} ;
83
90
return type ;
84
91
} ,
85
92
[ MapperKind . UNION_TYPE ] : type => {
86
93
result . types [ type . name ] = {
87
94
type : 'union' ,
88
- extensions : handleDirectiveExtensions ( type . extensions ) ,
95
+ extensions : handleDirectiveExtensions ( type . extensions , removeDirectives ) ,
89
96
} ;
90
97
return type ;
91
98
} ,
92
99
[ MapperKind . INPUT_OBJECT_TYPE ] : type => {
93
100
result . types [ type . name ] = {
94
101
fields : { } ,
95
102
type : 'input' ,
96
- extensions : handleDirectiveExtensions ( type . extensions ) ,
103
+ extensions : handleDirectiveExtensions ( type . extensions , removeDirectives ) ,
97
104
} ;
98
105
return type ;
99
106
} ,
100
107
[ MapperKind . INPUT_OBJECT_FIELD ] : ( field , fieldName , typeName ) => {
101
108
( result . types [ typeName ] as InputTypeExtensions ) . fields [ fieldName ] = {
102
- extensions : handleDirectiveExtensions ( field . extensions ) ,
109
+ extensions : handleDirectiveExtensions ( field . extensions , removeDirectives ) ,
103
110
} ;
104
111
return field ;
105
112
} ,
0 commit comments