Files
2024-07-05 13:46:23 +02:00

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;