UNPKG

@dr.pogodin/babel-plugin-transform-assets

Version:

Transforms importing of asset files at compile time using Babel

74 lines (71 loc) 2.14 kB
"use strict"; 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)); } } } } }; }