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.
95 lines
2.6 KiB
95 lines
2.6 KiB
'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;
|
|
|