-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathrewritePathsWithExposedFederatedModules.ts
More file actions
67 lines (55 loc) · 2.43 KB
/
rewritePathsWithExposedFederatedModules.ts
File metadata and controls
67 lines (55 loc) · 2.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import fs from 'node:fs';
import path from 'node:path';
import { mkdirp } from 'mkdirp';
import { PREFIX_NOT_FOR_IMPORT } from '../constants';
import { getLogger } from '../helpers';
import type { CommonLogger, FederationConfig } from '../models';
import { includeTypesFromNodeModules, substituteAliasedModules } from './helpers';
export function rewritePathsWithExposedFederatedModules(
federationConfig: FederationConfig,
outFile: string,
typings: string,
logger: CommonLogger = getLogger(),
): void {
const regexDeclareModule = /declare module "(.*)"/g;
const declaredModulePaths = Array.from(typings.matchAll(regexDeclareModule), match => match[1]);
logger.groupCollapsed(
'[rewritePathsWithExposedFederatedModules] Collected module declaration paths',
`(${declaredModulePaths.length} declarations)`,
);
logger.log(
declaredModulePaths.length > 20 ? 'first 20 items:' : '',
declaredModulePaths.slice(0, 20),
);
logger.groupEnd();
let typingsUpdated: string = typings;
// Replace and prefix paths by exposed remote names
declaredModulePaths.forEach(importPath => {
// Aliases are not included in the emitted declarations hence the need to use `endsWith`
const [exposedModuleKey, ...exposedModuleNameAliases] = Object.keys(federationConfig.exposes)
.filter(
key =>
federationConfig.exposes[key].endsWith(importPath) ||
federationConfig.exposes[key].replace(/\.[^./]*$/, '').endsWith(importPath),
)
.map(key => key.replace(/^\.\//, ''));
let federatedModulePath = exposedModuleKey
? `${federationConfig.name}/${exposedModuleKey}`
: `${PREFIX_NOT_FOR_IMPORT}/${federationConfig.name}/${importPath}`;
federatedModulePath = federatedModulePath.replace(/\/index$/, '');
// language=TypeScript
const createAliasModule = (modulePath: string) => `
declare module "${federationConfig.name}/${modulePath}" {
export * from "${federatedModulePath}"
}
`;
typingsUpdated = [
typingsUpdated.replace(RegExp(`"${importPath}"`, 'g'), `"${federatedModulePath}"`),
...exposedModuleNameAliases.map(createAliasModule),
].join('\n');
});
typingsUpdated = substituteAliasedModules(federationConfig.name, typingsUpdated, logger);
typingsUpdated = includeTypesFromNodeModules(federationConfig, typingsUpdated, logger);
mkdirp.sync(path.dirname(outFile));
fs.writeFileSync(outFile, typingsUpdated.replace(/\r\n/g, '\n'));
}