1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- '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;
|