Skip to content

Commit 064eb35

Browse files
serrgJulianWielga
authored andcommitted
feat: aliases support, cleanup
fix: paths when using `npm link`
1 parent 99b4885 commit 064eb35

File tree

3 files changed

+739
-501
lines changed

3 files changed

+739
-501
lines changed

cli.js

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
const path = require('path');
44
const fs = require('fs');
5-
const os = require("os");
5+
const findNodeModules = require('find-node-modules');
66
const ts = require('typescript');
77

88
const 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+
1719
const getArg = (argName) => {
1820
const argIndex = process.argv.indexOf(argName);
1921
return argIndex !== -1 ? process.argv[argIndex + 1] : null;
2022
};
2123

2224
const outDirArg = getArg('--outputDir');
25+
2326
const outputDir = outDirArg
2427
? path.resolve('./', outDirArg)
25-
: path.resolve(__dirname, '../../@types/__federated_types/');
28+
: path.resolve(nodeModules, '@types/__federated_types/');
2629

2730
const 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

5558
const federationConfig = require(federationConfigPath);
5659
const compileFiles = Object.values(federationConfig.exposes);
60+
const compileKeys = Object.keys(federationConfig.exposes);
5761
const 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+
5968
try {
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

Comments
 (0)