218 lines
7.7 KiB
JavaScript
218 lines
7.7 KiB
JavaScript
'use strict';
|
|
|
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
|
|
|
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
|
|
|
|
var fs = require('fs');
|
|
var path = require('path');
|
|
var _ = require('lodash');
|
|
|
|
var getAssetKind = require('./lib/getAssetKind');
|
|
var isHMRUpdate = require('./lib/isHMRUpdate');
|
|
var isSourceMap = require('./lib/isSourceMap');
|
|
var getDynamicImportedChildAssets = require('./lib/getDynamicImportedChildAssets');
|
|
|
|
var createQueuedWriter = require('./lib/output/createQueuedWriter');
|
|
var createOutputWriter = require('./lib/output/createOutputWriter');
|
|
|
|
function AssetsWebpackPlugin(options) {
|
|
this.options = _.merge({}, {
|
|
filename: 'webpack-assets.json',
|
|
prettyPrint: false,
|
|
update: false,
|
|
fullPath: true,
|
|
manifestFirst: true,
|
|
useCompilerPath: false,
|
|
fileTypes: ['js', 'css'],
|
|
includeAllFileTypes: true,
|
|
includeFilesWithoutChunk: false,
|
|
includeAuxiliaryAssets: false,
|
|
includeDynamicImportedAssets: false,
|
|
keepInMemory: false,
|
|
integrity: false,
|
|
removeFullPathAutoPrefix: false
|
|
}, options);
|
|
}
|
|
|
|
AssetsWebpackPlugin.prototype = {
|
|
constructor: AssetsWebpackPlugin,
|
|
|
|
apply: function apply(compiler) {
|
|
var self = this;
|
|
|
|
self.options.path = path.resolve(self.options.useCompilerPath ? compiler.options.output.path || '.' : self.options.path || '.');
|
|
self.writer = createQueuedWriter(createOutputWriter(self.options));
|
|
|
|
var afterEmit = function afterEmit(compilation, callback) {
|
|
var options = compiler.options;
|
|
var stats = compilation.getStats().toJson({
|
|
hash: true,
|
|
publicPath: true,
|
|
assets: true,
|
|
chunks: false,
|
|
modules: false,
|
|
source: false,
|
|
errorDetails: false,
|
|
timings: false
|
|
});
|
|
|
|
var assetPath = stats.publicPath && self.options.fullPath ? stats.publicPath : '';
|
|
// assetsByChunkName contains a hash with the bundle names and the produced files
|
|
// e.g. { one: 'one-bundle.js', two: 'two-bundle.js' }
|
|
// in some cases (when using a plugin or source maps) it might contain an array of produced files
|
|
// e.g. {
|
|
// main:
|
|
// [ 'index-bundle-42b6e1ec4fa8c5f0303e.js',
|
|
// 'index-bundle-42b6e1ec4fa8c5f0303e.js.map' ]
|
|
// }
|
|
// starting with webpack 5, the public path is automatically determined when possible and the path is prefaced
|
|
// with `/auto/`, the `removeAutoPrefix` option can be set to turn this off
|
|
|
|
if (self.options.removeFullPathAutoPrefix) {
|
|
if (assetPath.startsWith('auto')) {
|
|
assetPath = assetPath.substring(4);
|
|
}
|
|
}
|
|
|
|
var seenAssets = {};
|
|
var chunks = void 0;
|
|
|
|
if (self.options.entrypoints) {
|
|
chunks = Object.keys(stats.entrypoints);
|
|
if (self.options.includeFilesWithoutChunk) {
|
|
chunks.push(''); // push "unnamed" chunk
|
|
}
|
|
} else {
|
|
chunks = Object.keys(stats.assetsByChunkName);
|
|
chunks.push(''); // push "unnamed" chunk
|
|
}
|
|
|
|
var output = chunks.reduce(function (chunkMap, chunkName) {
|
|
var assets = void 0;
|
|
|
|
if (self.options.entrypoints) {
|
|
assets = chunkName ? stats.entrypoints[chunkName].assets : stats.assets;
|
|
} else {
|
|
assets = chunkName ? stats.assetsByChunkName[chunkName] : stats.assets;
|
|
}
|
|
|
|
if (self.options.includeAuxiliaryAssets && chunkName && stats.entrypoints[chunkName].auxiliaryAssets) {
|
|
assets = [].concat(_toConsumableArray(assets), _toConsumableArray(stats.entrypoints[chunkName].auxiliaryAssets));
|
|
}
|
|
|
|
if (self.options.includeDynamicImportedAssets && chunkName && stats.entrypoints[chunkName].children) {
|
|
var dynamicImportedChildAssets = getDynamicImportedChildAssets(options, stats.entrypoints[chunkName].children);
|
|
assets = [].concat(_toConsumableArray(assets), _toConsumableArray(dynamicImportedChildAssets));
|
|
}
|
|
|
|
if (!Array.isArray(assets)) {
|
|
assets = [assets];
|
|
}
|
|
var added = false;
|
|
var typeMap = assets.reduce(function (typeMap, obj) {
|
|
var asset = obj.name || obj;
|
|
|
|
if (isHMRUpdate(options, asset) || isSourceMap(options, asset) || !chunkName && seenAssets[asset]) {
|
|
return typeMap;
|
|
}
|
|
|
|
var typeName = getAssetKind(options, asset);
|
|
if (self.options.includeAllFileTypes || self.options.fileTypes.includes(typeName)) {
|
|
var combinedPath = assetPath && assetPath.slice(-1) !== '/' ? assetPath + '/' + asset : assetPath + asset;
|
|
var type = _typeof(typeMap[typeName]);
|
|
var compilationAsset = compilation.assets[asset];
|
|
var integrity = compilationAsset && compilationAsset.integrity;
|
|
var loadingBehavior = obj.loadingBehavior;
|
|
|
|
if (type === 'undefined') {
|
|
typeMap[typeName] = combinedPath;
|
|
|
|
if (self.options.integrity && integrity) {
|
|
typeMap[typeName + 'Integrity'] = integrity;
|
|
}
|
|
} else {
|
|
if (type === 'string') {
|
|
typeMap[typeName] = [typeMap[typeName]];
|
|
}
|
|
|
|
if (self.options.includeDynamicImportedAssets && loadingBehavior) {
|
|
var typeNameWithLoadingBehavior = typeName + ':' + loadingBehavior;
|
|
|
|
typeMap[typeNameWithLoadingBehavior] = typeMap[typeNameWithLoadingBehavior] || [];
|
|
typeMap[typeNameWithLoadingBehavior].push(combinedPath);
|
|
} else {
|
|
typeMap[typeName].push(combinedPath);
|
|
}
|
|
}
|
|
|
|
added = true;
|
|
seenAssets[asset] = true;
|
|
}
|
|
return typeMap;
|
|
}, {});
|
|
|
|
if (added) {
|
|
chunkMap[chunkName] = typeMap;
|
|
}
|
|
return chunkMap;
|
|
}, {});
|
|
|
|
var manifestNames = self.options.includeManifest === true ? ['manifest'] : self.options.includeManifest;
|
|
|
|
if (typeof manifestNames === 'string') {
|
|
manifestNames = [manifestNames];
|
|
}
|
|
|
|
if (manifestNames) {
|
|
for (var i = 0; i < manifestNames.length; i++) {
|
|
var manifestName = manifestNames[i];
|
|
var manifestEntry = output[manifestName];
|
|
|
|
if (manifestEntry) {
|
|
var js = manifestEntry.js || manifestEntry.mjs;
|
|
if (!Array.isArray(js)) {
|
|
js = [js];
|
|
}
|
|
var manifestAssetKey = js[js.length - 1].substr(assetPath.length);
|
|
var parentSource = compilation.assets[manifestAssetKey];
|
|
var entryText = parentSource.source();
|
|
if (!entryText) {
|
|
throw new Error('Could not locate manifest function in source', parentSource);
|
|
}
|
|
manifestEntry.text = entryText;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (self.options.metadata) {
|
|
output.metadata = self.options.metadata;
|
|
}
|
|
|
|
if (!compiler.outputFileSystem.readFile) {
|
|
compiler.outputFileSystem.readFile = fs.readFile.bind(fs);
|
|
}
|
|
|
|
if (!compiler.outputFileSystem.join) {
|
|
compiler.outputFileSystem.join = path.join.bind(path);
|
|
}
|
|
|
|
self.writer(compiler.outputFileSystem, output, function (err) {
|
|
if (err) {
|
|
compilation.errors.push(err);
|
|
}
|
|
callback();
|
|
});
|
|
};
|
|
|
|
if (compiler.hooks) {
|
|
var plugin = { name: 'AssetsWebpackPlugin' };
|
|
|
|
compiler.hooks.afterEmit.tapAsync(plugin, afterEmit);
|
|
} else {
|
|
compiler.plugin('after-emit', afterEmit);
|
|
}
|
|
}
|
|
};
|
|
|
|
module.exports = AssetsWebpackPlugin; |