@@ -2,55 +2,55 @@ const { format } = require('prettier');
22
33const getBaseType = type => ( type . ofType ? getBaseType ( type . ofType ) : type ) ;
44
5- const nameMap = { } ;
5+ const generateFieldsAndValues = ( maxDepth , fields ) => {
6+ const valueArray = [ ] ;
7+ const generateFields = ( maxDepth , fields , parents = [ ] ) =>
8+ Object . values ( fields )
9+ . map ( field => {
10+ const nextFields = getBaseType ( field . type ) . _fields ;
11+ if ( ! nextFields ) {
12+ const value =
13+ [ ...parents , field . name ] . join ( '{' ) +
14+ '}' . repeat ( parents . length ) ;
15+ valueArray . push ( `'${ value } '` ) ;
16+ return `${ field . name } : '${ value } '` ;
17+ }
18+ if ( parents . length > maxDepth ) {
19+ return ;
20+ }
21+ return `${ field . name } : {
22+ ${ generateFields ( maxDepth , nextFields , [
23+ ...parents ,
24+ field . name ,
25+ ] ) }
26+ }` ;
27+ } )
28+ . filter ( Boolean ) ;
629
7- const getName = name => {
8- const mappedName =
9- Object . keys ( nameMap ) . find ( key => nameMap [ key ] === name ) ||
10- Object . keys ( nameMap ) . length ;
11- nameMap [ mappedName ] = name ;
12- return mappedName ;
30+ return [ valueArray , generateFields ( maxDepth , fields ) ] ;
1331} ;
1432
15- const generateFields = ( { type, maxDepth } , fields , parents = [ ] ) =>
16- Object . values ( fields )
17- . map ( field => {
18- const nextFields = getBaseType ( field . type ) . _fields ;
19- if ( ! nextFields ) {
20- const value = [ ...parents , field . name ]
21- . map ( name => getName ( name ) )
22- . join ( '%' ) ;
23- return `${ field . name } : ${ type ? 'string' : `'${ value } '` } ` ;
24- }
25- if ( parents . length > maxDepth ) {
26- return ;
27- }
28- return `${ field . name } : {
29- ${ generateFields ( { type, maxDepth } , nextFields , [
30- ...parents ,
31- field . name ,
32- ] ) }
33- }` ;
34- } )
35- . filter ( Boolean ) ;
36-
3733module . exports = {
3834 plugin : ( schema , _documents , { maxDepth, baseTypes } ) => {
3935 const typeMap = schema . getTypeMap ( ) ;
40- let final = Object . values ( typeMap )
36+ const final = Object . values ( typeMap )
4137 . filter ( type => baseTypes . includes ( type . name ) )
42- . map (
43- type => `export type ${ type . name } Fields = {
44- ${ generateFields ( { type : true , maxDepth } , type . _fields ) }
38+ . map ( type => {
39+ const [ values , generatedFields ] = generateFieldsAndValues (
40+ maxDepth ,
41+ type . _fields ,
42+ ) ;
43+ return `export type ${ type . name } Fields = {
44+ ${ generatedFields }
4545 };
4646 export const ${ type . name } Fields: ${ type . name } Fields = {
47- ${ generateFields ( { type : false , maxDepth } , type . _fields ) }
48- };` ,
49- )
47+ ${ generatedFields }
48+ };
49+ export type ${ type . name } Field = ${ values . join ( '|' ) } ;
50+ ` ;
51+ } )
5052 . join ( '' ) ;
5153
52- final += `export const nameMap = ${ JSON . stringify ( nameMap ) } ` ;
53-
5454 return format ( final , {
5555 parser : 'typescript' ,
5656 trailingComma : 'all' ,
0 commit comments