@dr.pogodin/babel-plugin-transform-assets
Version:
Transforms importing of asset files at compile time using Babel
73 lines (72 loc) • 2.11 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = transformAssets;
var _fs = _interopRequireDefault(require("fs"));
var _path = require("path");
var _enhancedResolve = _interopRequireDefault(require("enhanced-resolve"));
var _loaderUtils = require("loader-utils");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
const defaultOptions = {
name: '[name].[ext]?[sha512:hash:base64:7]'
};
function transformAssets({
types: t
}) {
function resolveModulePath(filename) {
const dir = (0, _path.dirname)(filename);
if ((0, _path.isAbsolute)(dir)) {
return dir;
}
if (process.env.PWD) {
return (0, _path.resolve)(process.env.PWD, dir);
}
return (0, _path.resolve)(dir);
}
return {
visitor: {
CallExpression(path, {
file,
opts
}) {
const currentConfig = {
...defaultOptions,
...opts
};
if (typeof currentConfig.name !== 'string') {
return;
}
currentConfig.extensions = currentConfig.extensions || [];
const {
callee: {
name: calleeName
},
arguments: args
} = path.node;
if (calleeName !== 'require' || !args.length || !t.isStringLiteral(args[0])) {
return;
}
if (currentConfig.extensions.find(ext => args[0].value.endsWith(ext))) {
const [{
value: filePath
}] = args;
if (!t.isExpressionStatement(path.parent)) {
const from = resolveModulePath(file.opts.filename);
const resourcePath = _enhancedResolve.default.sync(from, filePath);
const p = (0, _loaderUtils.interpolateName)({
resourcePath
}, currentConfig.name, {
context: from,
content: _fs.default.readFileSync(resourcePath)
});
path.replaceWith(t.StringLiteral(p));
/* eslint-enable */
} else {
path.remove();
}
}
}
}
};
}