UNPKG

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

Version:

Transforms importing of asset files at compile time using Babel

73 lines (72 loc) 2.11 kB
"use strict"; 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(); } } } } }; }