22
33const path = require ( 'path' ) ;
44const fs = require ( 'fs' ) ;
5- const os = require ( "os" ) ;
5+ const findNodeModules = require ( 'find-node-modules' ) ;
66const ts = require ( 'typescript' ) ;
77
88const formatHost = {
@@ -14,26 +14,29 @@ function reportDiagnostic(diagnostic) {
1414 console . log ( "TS Error" , diagnostic . code , ":" , ts . flattenDiagnosticMessageText ( diagnostic . messageText , formatHost . getNewLine ( ) ) ) ;
1515}
1616
17+ const [ nodeModules ] = findNodeModules ( { cwd : process . argv [ 1 ] , relative : false } ) ;
18+
1719const getArg = ( argName ) => {
1820 const argIndex = process . argv . indexOf ( argName ) ;
1921 return argIndex !== - 1 ? process . argv [ argIndex + 1 ] : null ;
2022} ;
2123
2224const outDirArg = getArg ( '--outputDir' ) ;
25+
2326const outputDir = outDirArg
2427 ? path . resolve ( './' , outDirArg )
25- : path . resolve ( __dirname , '../../ @types/__federated_types/' ) ;
28+ : path . resolve ( nodeModules , '@types/__federated_types/' ) ;
2629
2730const findFederationConfig = ( base ) => {
2831 let files = fs . readdirSync ( base ) ;
2932 let queue = [ ] ;
3033
31- for ( let i = 0 ; i < files . length ; i ++ ) {
34+ for ( let i = 0 ; i < files . length ; i ++ ) {
3235 const file = files [ i ] ;
3336 const newBase = path . join ( base , file ) ;
3437 if ( file === 'federation.config.json' ) {
3538 return path . resolve ( './' , newBase ) ;
36- } else if ( fs . statSync ( newBase ) . isDirectory ( ) && ! newBase . includes ( 'node_modules' ) ) {
39+ } else if ( fs . statSync ( newBase ) . isDirectory ( ) && ! newBase . includes ( 'node_modules' ) ) {
3740 queue . push ( newBase ) ;
3841 }
3942 }
@@ -54,8 +57,14 @@ console.log(`Using config file: ${federationConfigPath}`);
5457
5558const federationConfig = require ( federationConfigPath ) ;
5659const compileFiles = Object . values ( federationConfig . exposes ) ;
60+ const compileKeys = Object . keys ( federationConfig . exposes ) ;
5761const outFile = path . resolve ( outputDir , `${ federationConfig . name } .d.ts` ) ;
5862
63+ function getModuleDeclareName ( exposeName ) {
64+ // windows paths 🤦
65+ return path . join ( federationConfig . name , exposeName ) . replace ( / [ \\ / ] / g, '/' ) ;
66+ }
67+
5968try {
6069 if ( fs . existsSync ( outFile ) ) {
6170 fs . unlinkSync ( outFile ) ;
@@ -89,28 +98,41 @@ try {
8998 }
9099
91100 moduleNames . forEach ( ( name ) => {
92- const regex = RegExp ( `"${ name } ` , 'g' ) ;
93- typing = typing . replace ( regex , `"${ federationConfig . name } /${ name } ` ) ;
101+ // exposeName - relative name of exposed component (if not found - just take moduleName)
102+ const [ exposeName = name , ...aliases ] = compileKeys . filter ( key => federationConfig . exposes [ key ] . endsWith ( name ) ) ;
103+ const regex = RegExp ( `"${ name } "` , 'g' ) ;
104+
105+ const moduleDeclareName = getModuleDeclareName ( exposeName ) ;
106+
107+ // language=TypeScript
108+ const createAliasModule = name => `
109+ declare module "${ getModuleDeclareName ( name ) } " {
110+ export * from "${ moduleDeclareName } "
111+ }
112+ ` ;
113+
114+ typing = [
115+ typing . replace ( regex , `"${ moduleDeclareName } "` ) ,
116+ ...aliases . map ( createAliasModule ) ,
117+ ] . join ( '\n' ) ;
94118 } ) ;
95119
96120 console . log ( 'writing typing file:' , outFile ) ;
97121
98122 fs . writeFileSync ( outFile , typing ) ;
99123
100124 // if we are writing to the node_modules/@types directory, add a package.json file
101- if ( outputDir . includes ( os . platform ( ) === "win32"
102- ? "node_modules\\@types"
103- : "node_modules/@types" ) ) {
125+ if ( outputDir . includes ( path . join ( 'node_modules' , '@types' ) ) ) {
104126 const packageJsonPath = path . resolve ( outputDir , 'package.json' ) ;
105127
106128 if ( ! fs . existsSync ( packageJsonPath ) ) {
107- console . log ( 'writing package.json:' , packageJsonPath ) ;
129+ console . debug ( 'writing package.json:' , packageJsonPath ) ;
108130 fs . copyFileSync ( path . resolve ( __dirname , 'typings.package.tmpl.json' ) , packageJsonPath ) ;
109131 } else {
110- console . log ( packageJsonPath , 'already exists' ) ;
132+ console . debug ( packageJsonPath , 'already exists' ) ;
111133 }
112134 } else {
113- console . log ( 'not writing to node modules, dont need a package.json' ) ;
135+ console . debug ( 'not writing to node modules, dont need a package.json' ) ;
114136 }
115137
116138 // write/update the index.d.ts file
@@ -128,7 +150,7 @@ try {
128150 }
129151 }
130152
131- console . log ( 'Success!' ) ;
153+ console . debug ( 'Success!' ) ;
132154} catch ( e ) {
133155 console . error ( `ERROR:` , e ) ;
134156 process . exit ( 1 ) ;
0 commit comments