webpack-merge-and-include-globally
Version:
Merge multiple files (js,css..) into single file to include somewhere
349 lines (287 loc) • 12.5 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var fs = require('fs');
var glob = require('glob');
var _require = require('es6-promisify'),
promisify = _require.promisify;
var revHash = require('rev-hash');
var _require2 = require('webpack'),
sources = _require2.sources,
Compilation = _require2.Compilation;
var plugin = {
name: 'MergeIntoFile'
};
var readFile = promisify(fs.readFile);
var listFiles = promisify(glob);
var joinContent = /*#__PURE__*/function () {
var _ref = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(promises, separator) {
return _regenerator["default"].wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
return _context2.abrupt("return", promises.reduce( /*#__PURE__*/function () {
var _ref2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee(acc, curr) {
return _regenerator["default"].wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
_context.t2 = "";
_context.next = 3;
return acc;
case 3:
_context.t3 = _context.sent;
_context.t1 = _context.t2.concat.call(_context.t2, _context.t3);
_context.next = 7;
return acc;
case 7:
if (!_context.sent.length) {
_context.next = 11;
break;
}
_context.t4 = separator;
_context.next = 12;
break;
case 11:
_context.t4 = '';
case 12:
_context.t5 = _context.t4;
_context.t0 = _context.t1.concat.call(_context.t1, _context.t5);
_context.next = 16;
return curr;
case 16:
_context.t6 = _context.sent;
return _context.abrupt("return", _context.t0.concat.call(_context.t0, _context.t6));
case 18:
case "end":
return _context.stop();
}
}
}, _callee);
}));
return function (_x3, _x4) {
return _ref2.apply(this, arguments);
};
}(), ''));
case 1:
case "end":
return _context2.stop();
}
}
}, _callee2);
}));
return function joinContent(_x, _x2) {
return _ref.apply(this, arguments);
};
}();
var MergeIntoFile = /*#__PURE__*/function () {
function MergeIntoFile(options, onComplete) {
(0, _classCallCheck2["default"])(this, MergeIntoFile);
this.options = options;
this.onComplete = onComplete;
}
(0, _createClass2["default"])(MergeIntoFile, [{
key: "apply",
value: function apply(compiler) {
var _this = this;
if (compiler.hooks) {
var emitHookSet = false;
compiler.hooks.thisCompilation.tap(plugin.name, function (compilation) {
if (compilation.hooks.processAssets) {
compilation.hooks.processAssets.tapAsync({
name: plugin.name,
stage: Compilation.PROCESS_ASSETS_STAGE_ADDITIONAL
}, function (_, callback) {
return _this.run(compilation, callback);
});
} else if (!emitHookSet) {
emitHookSet = true;
compiler.hooks.emit.tapAsync(plugin.name, _this.run.bind(_this));
}
});
} else {
compiler.plugin('emit', this.run.bind(this));
}
}
}, {
key: "run",
value: function run(compilation, callback) {
var _this2 = this;
var _this$options = this.options,
files = _this$options.files,
transform = _this$options.transform,
encoding = _this$options.encoding,
chunks = _this$options.chunks,
hash = _this$options.hash,
transformFileName = _this$options.transformFileName;
if (chunks && compilation.chunks && compilation.chunks.filter(function (chunk) {
return chunks.indexOf(chunk.name) >= 0 && chunk.rendered;
}).length === 0) {
if (typeof callback === 'function') {
callback();
}
return;
}
var generatedFiles = {};
var filesCanonical = [];
if (!Array.isArray(files)) {
Object.keys(files).forEach(function (newFile) {
filesCanonical.push({
src: files[newFile],
dest: newFile
});
});
} else {
filesCanonical = files;
}
filesCanonical.forEach(function (fileTransform) {
if (typeof fileTransform.dest === 'string') {
var destFileName = fileTransform.dest;
fileTransform.dest = function (code) {
return (0, _defineProperty2["default"])({}, destFileName, transform && transform[destFileName] ? transform[destFileName](code) : code);
};
}
});
var finalPromises = filesCanonical.map( /*#__PURE__*/function () {
var _ref4 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(fileTransform) {
var _this2$options$separa, separator, listOfLists, flattenedList, filesContentPromises, content, resultsFiles, resultsFile;
return _regenerator["default"].wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
_this2$options$separa = _this2.options.separator, separator = _this2$options$separa === void 0 ? '\n' : _this2$options$separa;
_context3.next = 3;
return Promise.all(fileTransform.src.map(function (path) {
return listFiles(path, null);
}));
case 3:
listOfLists = _context3.sent;
flattenedList = Array.prototype.concat.apply([], listOfLists);
filesContentPromises = flattenedList.map(function (path) {
return readFile(path, encoding || 'utf-8');
});
_context3.next = 8;
return joinContent(filesContentPromises, separator);
case 8:
content = _context3.sent;
_context3.next = 11;
return fileTransform.dest(content);
case 11:
resultsFiles = _context3.sent;
_context3.t0 = _regenerator["default"].keys(resultsFiles);
case 13:
if ((_context3.t1 = _context3.t0()).done) {
_context3.next = 21;
break;
}
resultsFile = _context3.t1.value;
if (!((0, _typeof2["default"])(resultsFiles[resultsFile]) === 'object')) {
_context3.next = 19;
break;
}
_context3.next = 18;
return resultsFiles[resultsFile];
case 18:
resultsFiles[resultsFile] = _context3.sent;
case 19:
_context3.next = 13;
break;
case 21:
Object.keys(resultsFiles).forEach(function (newFileName) {
var newFileNameHashed = newFileName;
var hasTransformFileNameFn = typeof transformFileName === 'function';
if (hash || hasTransformFileNameFn) {
var hashPart = MergeIntoFile.getHashOfRelatedFile(compilation.assets, newFileName) || revHash(resultsFiles[newFileName]);
if (hasTransformFileNameFn) {
var extensionPattern = /\.[^.]*$/g;
var fileNameBase = newFileName.replace(extensionPattern, '');
var _newFileName$match = newFileName.match(extensionPattern),
_newFileName$match2 = (0, _slicedToArray2["default"])(_newFileName$match, 1),
extension = _newFileName$match2[0];
newFileNameHashed = transformFileName(fileNameBase, extension, hashPart);
} else {
newFileNameHashed = newFileName.replace(/(\.min)?\.\w+(\.map)?$/, function (suffix) {
return "-".concat(hashPart).concat(suffix);
});
}
var fileId = newFileName.replace(/\.map$/, '').replace(/\.\w+$/, '');
if (typeof compilation.addChunk === 'function') {
var chunk = compilation.addChunk(fileId);
chunk.id = fileId;
chunk.ids = [chunk.id];
chunk.files.push(newFileNameHashed);
}
}
generatedFiles[newFileName] = newFileNameHashed;
var rawSource;
if (sources && sources.RawSource) {
rawSource = new sources.RawSource(resultsFiles[newFileName]);
} else {
rawSource = {
source: function source() {
return resultsFiles[newFileName];
},
size: function size() {
return resultsFiles[newFileName].length;
}
};
}
if (compilation.emitAsset) {
compilation.emitAsset(newFileNameHashed, rawSource);
} else {
// eslint-disable-next-line no-param-reassign
compilation.assets[newFileNameHashed] = rawSource;
}
});
case 22:
case "end":
return _context3.stop();
}
}
}, _callee3);
}));
return function (_x5) {
return _ref4.apply(this, arguments);
};
}());
Promise.all(finalPromises).then(function () {
if (_this2.onComplete) {
_this2.onComplete(generatedFiles);
}
if (typeof callback === 'function') {
callback();
}
})["catch"](function (error) {
if (typeof callback === 'function') {
callback(error);
} else {
throw new Error(error);
}
});
}
}], [{
key: "getHashOfRelatedFile",
value: function getHashOfRelatedFile(assets, fileName) {
var hashPart = null;
Object.keys(assets).forEach(function (existingFileName) {
var match = existingFileName.match(/-([0-9a-f]+)(\.min)?(\.\w+)(\.map)?$/);
var fileHashPart = match && match.length && match[1];
if (fileHashPart) {
var canonicalFileName = existingFileName.replace("-".concat(fileHashPart), '').replace(/\.map$/, '');
if (canonicalFileName === fileName.replace(/\.map$/, '')) {
hashPart = fileHashPart;
}
}
});
return hashPart;
}
}]);
return MergeIntoFile;
}();
module.exports = MergeIntoFile;