11import fs from 'fs' ;
22import yargs from 'yargs' ;
3- import { Resolvers , StuccoConfig } from '. /api' ;
3+ import { IntegrationSpecificationInput , StuccoConfig } from '@ /api.js ' ;
44import { fileURLToPath } from 'url' ;
55
6- export const exists = ( fn : string ) => fs
7- . promises
8- . stat ( fn )
9- . then ( ( ) => true )
10- . catch ( ( e ) => {
11- if ( e . code === 'ENOENT' ) {
12- return false ;
13- }
14- throw e ;
15- } )
6+ export const exists = ( fn : string ) =>
7+ fs . promises
8+ . stat ( fn )
9+ . then ( ( ) => true )
10+ . catch ( ( e ) => {
11+ if ( e . code === 'ENOENT' ) {
12+ return false ;
13+ }
14+ throw e ;
15+ } ) ;
1616
17- export const integrate = async ( stuccoJson : string , ...integrationFiles : string [ ] ) => {
18- const stuccoFileOut : StuccoConfig = await exists ( stuccoJson )
17+ export const integrate = async (
18+ stuccoJson : string ,
19+ ...integrationFiles : string [ ]
20+ ) => {
21+ const stuccoFileOut : StuccoConfig = ( await exists ( stuccoJson ) )
1922 ? JSON . parse ( fs . readFileSync ( stuccoJson , 'utf-8' ) )
2023 : { } ;
2124
2225 const res = await integrateWithConfig ( stuccoFileOut , ...integrationFiles ) ;
2326 fs . writeFileSync ( stuccoJson , JSON . stringify ( res , null , 4 ) ) ;
24- }
27+ } ;
2528
26- export const integrateWithConfig = async ( stuccoConfig : StuccoConfig , ...integrationFiles : string [ ] ) => {
27- const integrations = await Promise . all (
29+ export const integrateWithConfig = async (
30+ stuccoConfig : StuccoConfig ,
31+ ...integrationFiles : string [ ]
32+ ) => {
33+ const integrations = ( await Promise . all (
2834 integrationFiles . map ( ( integrationFile ) =>
29- import ( integrationFile ) . then ( ( mod ) => 'default' in mod ? mod . default : mod ) ,
30- )
31- ) as StuccoConfig [ ] ;
35+ import ( integrationFile ) . then ( ( mod ) =>
36+ 'default' in mod ? mod . default : mod ,
37+ ) ,
38+ ) ,
39+ ) ) as IntegrationSpecificationInput [ ] ;
40+
41+ const res : StuccoConfig = {
42+ resolvers : { } ,
43+ } ;
44+ // register integration
45+ integrations . map ( ( integration ) => {
46+ for ( const typeName in integration ) {
47+ for ( const fieldName in integration [ typeName ] ) {
48+ const { handler, ...field } = integration [ typeName ] [ fieldName ] ;
49+ res . resolvers = {
50+ ...res . resolvers ,
51+ [ `${ typeName } .${ fieldName } ` ] : {
52+ ...field ,
53+ resolve : {
54+ name : `${ typeName } .${ fieldName } .handler` ,
55+ } ,
56+ } ,
57+ } ;
58+ }
59+ }
60+ } ) ;
3261 return {
3362 ...stuccoConfig ,
3463 resolvers : {
3564 ...stuccoConfig . resolvers ,
36- ...integrations . reduce ( ( pv , cv ) => ( {
37- ...pv ,
38- ...cv . resolvers ,
39- } ) , { } as Resolvers ) ,
65+ ...res . resolvers ,
4066 } ,
4167 } ;
42- }
68+ } ;
4369
4470if ( import . meta. url . startsWith ( 'file:' ) ) {
4571 const modulePath = fileURLToPath ( import . meta. url ) ;
@@ -57,9 +83,9 @@ if (import.meta.url.startsWith('file:')) {
5783 type : 'string' ,
5884 description : 'integration file path' ,
5985 default : './src/gei/integrate.ts' ,
60- } ) . argv
86+ } ) . argv ;
6187 await integrate ( argv [ 'stucco-json' ] , argv [ 'integration-file' ] ) ;
62- }
88+ } ;
6389
6490 main ( ) . catch ( ( e ) => {
6591 console . error ( e ) ;
0 commit comments