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