-
Notifications
You must be signed in to change notification settings - Fork 3
/
index.js
108 lines (86 loc) · 3.15 KB
/
index.js
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
const pathLib = require("path");
const types = require("@babel/types");
const { err, partition } = require("./src/misc");
const { collectEsmExports } = require("./src/collect-esm-exports");
const { collectCjsExports } = require("./src/collect-cjs-exports");
const { resolveLogLevel, DEBUG, INFO } = require("./src/log");
const cachedResolvers = {};
function getCachedExports({
logLevel,
moduleName,
barrelFilePath,
moduleType,
}) {
if (cachedResolvers[moduleName]) {
return cachedResolvers[moduleName];
}
if (moduleType === "esm") {
cachedResolvers[moduleName] = collectEsmExports(barrelFilePath);
}
if (moduleType === "commonjs") {
cachedResolvers[moduleName] = collectCjsExports(barrelFilePath);
}
logLevel >= INFO && console.log(`[resolve-barrel-files] '${moduleName}' exports:`, cachedResolvers[moduleName]);
return cachedResolvers[moduleName];
}
module.exports = function() {
return {
visitor: {
ImportDeclaration: function(path, state) {
const moduleName = path.node.source.value;
const sourceConfig = state.opts?.[moduleName];
if (!sourceConfig) {
return;
}
const transforms = [];
const mainBarrelPath = sourceConfig.mainBarrelPath;
const mainBarrelFolder = pathLib.join(mainBarrelPath, "..");
const moduleType = sourceConfig.moduleType || "commonjs";
const logLevel = resolveLogLevel(sourceConfig.logLevel);
logLevel >= DEBUG
&& console.log(`[resolve-barrel-files] Resolving ${moduleType} imports from ${mainBarrelPath}`);
const exports = getCachedExports({
logLevel,
moduleName,
barrelFilePath: mainBarrelPath,
moduleType,
});
const [fullImports, memberImports] = partition(
specifier => specifier.type !== "ImportSpecifier",
path.node.specifiers,
);
if (fullImports.length) {
err("Full imports are not supported");
}
for (const memberImport of memberImports) {
const importName = memberImport.imported.name;
const localName = memberImport.local.name;
const exportInfo = exports[importName];
if (!exports[importName]) {
logLevel >= DEBUG
&& console.log(
`[${moduleName}] No export info found for ${importName}, are you sure this is a ${moduleType} module?`,
);
continue;
}
const importFrom = pathLib.join(mainBarrelFolder, exportInfo.importPath);
logLevel >= DEBUG && console.log(`[${moduleName}] Resolving '${importName}' to ${importFrom}`);
let newImportSpecifier = memberImport;
if (exportInfo.importAlias) {
newImportSpecifier = types.importSpecifier(
types.identifier(localName),
types.identifier(exportInfo.importAlias),
);
}
transforms.push(types.importDeclaration(
[newImportSpecifier],
types.stringLiteral(importFrom),
));
}
if (transforms.length > 0) {
path.replaceWithMultiple(transforms);
}
},
},
};
};