@sentre/craco-plugins
Version:
Craco plugins for CRA
64 lines (62 loc) • 2.51 kB
JavaScript
;
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
var fs = require('fs');
var path = require('path');
var Module = require('module');
var nodeEval = require('node-eval');
var _require = require('./utils'),
hash = _require.hash;
var pathSep = path.sep;
var buildManifest = function buildManifest(exports, values) {
var assets = {};
var transformedAssets = {};
var transform = function transform(value) {
if (typeof value === 'string') return buildName(value);
if (Array.isArray(value)) return value.map(function (filename) {
return transform(filename);
});
throw new Error("The assets with type of ".concat(_typeof(value), " is not supported!"));
};
exports.forEach(function (key) {
assets[key] = values[key];
transformedAssets[key] = transform(values[key]);
});
return {
assets: assets,
transformedAssets: transformedAssets
};
};
var buildName = function buildName(filepath) {
var filename = filepath.split(pathSep)[filepath.split(pathSep).length - 1];
var name = filename.split('.');
var ext = name.pop();
var buf = fs.readFileSync(filepath);
name.push(hash(buf).substring(0, 16));
name.push(ext);
return 'static/asset/' + name.join('.');
};
module.exports = function (content) {
var _this = this;
var _this$getOptions = this.getOptions(),
outputFile = _this$getOptions.outputFile,
extensions = _this$getOptions.extensions,
exports = _this$getOptions.exports;
// Convert image to path in the 'require' statement
extensions.forEach(function (ext) {
Module._extensions[ext] = function (module, filename) {
module._compile("module.exports=\"".concat(filename, "\""), filename);
};
});
var values = nodeEval(content, this.resourcePath);
var _buildManifest = buildManifest(exports, values),
assets = _buildManifest.assets,
transformedAssets = _buildManifest.transformedAssets;
Object.values(assets).flat().forEach(function (filepath) {
_this.addDependency(filepath);
var buf = fs.readFileSync(filepath);
var filename = buildName(filepath);
_this.emitFile(filename, buf);
});
this.emitFile(outputFile + '.json', JSON.stringify(transformedAssets));
return content;
};