106 lines
2.7 KiB
JavaScript
106 lines
2.7 KiB
JavaScript
'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;
|