You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
2.6 KiB
96 lines
2.6 KiB
2 years ago
|
'use strict';
|
||
|
|
||
|
const { extname } = require('path');
|
||
|
|
||
|
function namedAssetImportPlugin({ types: t }) {
|
||
|
const visited = new WeakSet();
|
||
|
|
||
|
function generateNewSourcePath(loaderMap, moduleName, sourcePath) {
|
||
|
const ext = extname(sourcePath).substr(1);
|
||
|
const extMap = loaderMap[ext];
|
||
|
return extMap[moduleName]
|
||
|
? extMap[moduleName].replace(/\[path\]/, sourcePath)
|
||
|
: sourcePath;
|
||
|
}
|
||
|
|
||
|
function replaceMatchingSpecifiers(path, loaderMap, callback) {
|
||
|
const sourcePath = path.node.source.value;
|
||
|
const ext = extname(sourcePath).substr(1);
|
||
|
|
||
|
if (visited.has(path.node) || sourcePath.indexOf('!') !== -1) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (loaderMap[ext]) {
|
||
|
path.replaceWithMultiple(
|
||
|
path.node.specifiers.map(specifier => {
|
||
|
const newSpecifier = callback(specifier, sourcePath);
|
||
|
visited.add(newSpecifier);
|
||
|
|
||
|
return newSpecifier;
|
||
|
})
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return {
|
||
|
visitor: {
|
||
|
ExportNamedDeclaration(path, { opts: { loaderMap } }) {
|
||
|
if (!path.node.source) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
replaceMatchingSpecifiers(path, loaderMap, (specifier, sourcePath) => {
|
||
|
if (t.isExportDefaultSpecifier(specifier)) {
|
||
|
return t.exportDeclaration(
|
||
|
[t.exportDefaultSpecifier(t.identifier(specifier.local.name))],
|
||
|
t.stringLiteral(sourcePath)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
return t.exportNamedDeclaration(
|
||
|
null,
|
||
|
[
|
||
|
t.exportSpecifier(
|
||
|
t.identifier(specifier.local.name),
|
||
|
t.identifier(specifier.exported.name)
|
||
|
),
|
||
|
],
|
||
|
t.stringLiteral(
|
||
|
generateNewSourcePath(loaderMap, specifier.local.name, sourcePath)
|
||
|
)
|
||
|
);
|
||
|
});
|
||
|
},
|
||
|
ImportDeclaration(path, { opts: { loaderMap } }) {
|
||
|
replaceMatchingSpecifiers(path, loaderMap, (specifier, sourcePath) => {
|
||
|
if (t.isImportDefaultSpecifier(specifier)) {
|
||
|
return t.importDeclaration(
|
||
|
[t.importDefaultSpecifier(t.identifier(specifier.local.name))],
|
||
|
t.stringLiteral(sourcePath)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
return t.importDeclaration(
|
||
|
[
|
||
|
t.importSpecifier(
|
||
|
t.identifier(specifier.local.name),
|
||
|
t.identifier(specifier.imported.name)
|
||
|
),
|
||
|
],
|
||
|
t.stringLiteral(
|
||
|
generateNewSourcePath(
|
||
|
loaderMap,
|
||
|
specifier.imported.name,
|
||
|
sourcePath
|
||
|
)
|
||
|
)
|
||
|
);
|
||
|
});
|
||
|
},
|
||
|
},
|
||
|
};
|
||
|
}
|
||
|
|
||
|
module.exports = namedAssetImportPlugin;
|