| /* |
| MIT License http://www.opensource.org/licenses/mit-license.php |
| Author Sean Larkin @thelarkinn |
| */ |
| "use strict"; |
| const EntrypointsOverSizeLimitWarning = require("./EntrypointsOverSizeLimitWarning"); |
| const AssetsOverSizeLimitWarning = require("./AssetsOverSizeLimitWarning"); |
| const NoAsyncChunksWarning = require("./NoAsyncChunksWarning"); |
| |
| module.exports = class SizeLimitsPlugin { |
| constructor(options) { |
| this.hints = options.hints; |
| this.maxAssetSize = options.maxAssetSize; |
| this.maxEntrypointSize = options.maxEntrypointSize; |
| this.assetFilter = options.assetFilter; |
| } |
| apply(compiler) { |
| const entrypointSizeLimit = this.maxEntrypointSize; |
| const assetSizeLimit = this.maxAssetSize; |
| const hints = this.hints; |
| const assetFilter = this.assetFilter || (asset => !asset.endsWith(".map")); |
| |
| compiler.hooks.afterEmit.tap("SizeLimitsPlugin", compilation => { |
| const warnings = []; |
| |
| const getEntrypointSize = entrypoint => |
| entrypoint.getFiles().reduce((currentSize, file) => { |
| if (assetFilter(file) && compilation.assets[file]) { |
| return currentSize + compilation.assets[file].size(); |
| } |
| |
| return currentSize; |
| }, 0); |
| |
| const assetsOverSizeLimit = []; |
| for (const assetName of Object.keys(compilation.assets)) { |
| if (!assetFilter(assetName)) { |
| continue; |
| } |
| |
| const asset = compilation.assets[assetName]; |
| const size = asset.size(); |
| if (size > assetSizeLimit) { |
| assetsOverSizeLimit.push({ |
| name: assetName, |
| size: size |
| }); |
| asset.isOverSizeLimit = true; |
| } |
| } |
| |
| const entrypointsOverLimit = []; |
| for (const pair of compilation.entrypoints) { |
| const name = pair[0]; |
| const entry = pair[1]; |
| const size = getEntrypointSize(entry); |
| |
| if (size > entrypointSizeLimit) { |
| entrypointsOverLimit.push({ |
| name: name, |
| size: size, |
| files: entry.getFiles().filter(assetFilter) |
| }); |
| entry.isOverSizeLimit = true; |
| } |
| } |
| |
| if (hints) { |
| // 1. Individual Chunk: Size < 250kb |
| // 2. Collective Initial Chunks [entrypoint] (Each Set?): Size < 250kb |
| // 3. No Async Chunks |
| // if !1, then 2, if !2 return |
| if (assetsOverSizeLimit.length > 0) { |
| warnings.push( |
| new AssetsOverSizeLimitWarning(assetsOverSizeLimit, assetSizeLimit) |
| ); |
| } |
| if (entrypointsOverLimit.length > 0) { |
| warnings.push( |
| new EntrypointsOverSizeLimitWarning( |
| entrypointsOverLimit, |
| entrypointSizeLimit |
| ) |
| ); |
| } |
| |
| if (warnings.length > 0) { |
| const hasAsyncChunks = |
| compilation.chunks.filter(chunk => !chunk.canBeInitial()).length > |
| 0; |
| |
| if (!hasAsyncChunks) { |
| warnings.push(new NoAsyncChunksWarning()); |
| } |
| |
| if (hints === "error") { |
| compilation.errors.push(...warnings); |
| } else { |
| compilation.warnings.push(...warnings); |
| } |
| } |
| } |
| }); |
| } |
| }; |