123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 |
- var assign = require('lodash/assign');
- var each = require('lodash/each');
- var find = require('lodash/find');
- var isArray = require('lodash/isArray');
- var isFunction = require('lodash/isFunction');
- var isRegExp = require('lodash/isRegExp');
- var keys = require('lodash/keys');
- var values = require('lodash/values');
- var webpackSources = require('webpack-sources');
- function EMPTY_FUNC() {};
- var PHASE = {
- OPTIMIZE_CHUNK_ASSETS: 'compilation.optimize-chunk-assets',
- OPTIMIZE_ASSETS: 'compilation.optimize-assets',
- EMIT: 'emit'
- };
- var PHASES = values(PHASE);
- function AssetsManipulation(lastCallWebpackPlugin, compilation) {
- this.lastCallWebpackPlugin = lastCallWebpackPlugin;
- this.compilation = compilation;
- }
- AssetsManipulation.prototype.setAsset = function(assetName, assetValue, immediate) {
- this.lastCallWebpackPlugin.setAsset(assetName, assetValue, immediate, this.compilation);
- };
- AssetsManipulation.prototype.getAsset = function(assetName) {
- var asset = assetName && this.compilation.assets[assetName] && this.compilation.assets[assetName].source();
- return asset || undefined;
- };
- function LastCallWebpackPlugin(options) {
- this.options = assign(
- {
- assetProcessors: [],
- onStart: EMPTY_FUNC,
- onEnd: EMPTY_FUNC,
- canPrint: true
- },
- options || {}
- );
- if (!isArray(this.options.assetProcessors)) {
- throw new Error('LastCallWebpackPlugin Error: invalid options.assetProcessors (must be an Array).');
- }
- each(this.options.assetProcessors, function (processor, index) {
- if (!processor) {
- throw new Error('LastCallWebpackPlugin Error: invalid options.assetProcessors[' + String(index) + '] (must be an object).');
- }
- if (!isRegExp(processor.regExp)) {
- throw new Error('LastCallWebpackPlugin Error: invalid options.assetProcessors[' + String(index) + '].regExp (must be an regular expression).');
- }
- if (!isFunction(processor.processor)) {
- throw new Error('LastCallWebpackPlugin Error: invalid options.assetProcessors[' + String(index) + '].processor (must be a function).');
- }
- if (processor.phase === undefined) {
- processor.phase = PHASE.OPTIMIZE_ASSETS;
- }
- if (!find(PHASES, function(p) { return p === processor.phase; })) {
- throw new Error('LastCallWebpackPlugin Error: invalid options.assetProcessors[' + String(index) + '].phase (must be on of: ' + PHASES.join(', ') + ').');
- }
- });
- if (!isFunction(this.options.onStart)) {
- throw new Error('LastCallWebpackPlugin Error: invalid options.onStart (must be a function).');
- }
- if (!isFunction(this.options.onEnd)) {
- throw new Error('LastCallWebpackPlugin Error: invalid options.onEnd (must be a function).');
- }
- this.initCompile();
- };
- LastCallWebpackPlugin.prototype.initCompile = function() {
- this.deleteAssetsMap = {};
- }
- LastCallWebpackPlugin.prototype.print = function() {
- if (this.options.canPrint) {
- console.log.apply(console, arguments);
- }
- };
- LastCallWebpackPlugin.prototype.onAssetError = function(assetName, asset, err) {
- this.print('Error processing file: ' + assetName);
- };
- LastCallWebpackPlugin.prototype.getAssetsAndProcessors = function(assets, phase) {
- var assetProcessors = this.options.assetProcessors;
- var assetNames = keys(assets);
- var assetsAndProcessors = [];
- each(assetNames, function (assetName) {
- each(assetProcessors, function(assetProcessor) {
- if (assetProcessor.phase === phase) {
- var regExpResult = assetProcessor.regExp.exec(assetName);
- assetProcessor.regExp.lastIndex = 0;
- if (regExpResult) {
- var assetAndProcessor = {
- assetName: assetName,
- regExp: assetProcessor.regExp,
- processor: assetProcessor.processor,
- regExpResult: regExpResult,
- };
- assetsAndProcessors.push(assetAndProcessor);
- }
- }
- });
- });
- return assetsAndProcessors;
- };
- LastCallWebpackPlugin.prototype.createAsset = function(content, originalAsset) {
- return new webpackSources.RawSource(content);
- };
- LastCallWebpackPlugin.prototype.process = function(compilation, phase, callback) {
- var self = this;
- var assetsAndProcessors = this.getAssetsAndProcessors(compilation.assets, phase);
- if (assetsAndProcessors.length <= 0) {
- return callback();
- }
- this.options.onStart(assetsAndProcessors, compilation, phase);
- var hasErrors = false;
- var promises = [];
- var assetsManipulationObject = new AssetsManipulation(self, compilation);
- each(assetsAndProcessors, function(assetAndProcessor) {
- var asset = compilation.assets[assetAndProcessor.assetName];
- var promise = assetAndProcessor
- .processor(assetAndProcessor.assetName, asset, assetsManipulationObject)
- .then(function (result) {
- if (result !== undefined) {
- self.setAsset(assetAndProcessor.assetName, result, false, compilation);
- }
- })
- .catch(function(err) {
- hasErrors = true;
- self.onAssetError(assetAndProcessor.assetName, asset, err);
- throw err;
- });
- promises.push(promise);
- });
- return Promise.all(promises)
- .then(function () {
- self.options.onEnd(assetsAndProcessors, compilation, phase);
- callback();
- })
- .catch(function (err) {
- self.options.onEnd(assetsAndProcessors, compilation, phase, err);
- callback(err);
- });
- };
- LastCallWebpackPlugin.prototype.setAsset = function(assetName, assetValue, immediate, compilation) {
- if (assetName) {
- if (assetValue === null) {
- this.deleteAssetsMap[assetName] = true;
- if (immediate) {
- delete compilation.assets[assetName];
- }
- } else {
- if (assetValue !== undefined) {
- compilation.assets[assetName] = this.createAsset(assetValue, compilation.assets[assetName]);
- }
- }
- }
- };
- LastCallWebpackPlugin.prototype.deleteAssets = function(compilation) {
- if (this.deleteAssetsMap && compilation) {
- each(keys(this.deleteAssetsMap), function(key) {
- delete compilation.assets[key];
- });
- }
- };
- LastCallWebpackPlugin.prototype.apply = function(compiler) {
- var self = this;
- compiler.plugin('compilation', function(compilation, params) {
- self.initCompile();
- compilation.plugin("optimize-chunk-assets", function(chunks, callback) {
- self.process(compilation, PHASE.OPTIMIZE_CHUNK_ASSETS, callback);
- });
- compilation.plugin("optimize-assets", function(chunks, callback) {
- self.process(compilation, PHASE.OPTIMIZE_ASSETS, callback);
- });
- });
- compiler.plugin('emit', function(compilation, callback) {
- self.process(compilation, PHASE.EMIT, callback);
- self.deleteAssets(compilation);
- });
- };
- LastCallWebpackPlugin.prototype.PHASE = PHASE;
- LastCallWebpackPlugin.PHASE = PHASE;
- module.exports = LastCallWebpackPlugin;
|