UNPKG

@sentre/craco-plugins

Version:
64 lines (62 loc) 2.51 kB
"use strict"; 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; };