mirror of https://github.com/webpack/webpack.git
				
				
				
			
		
			
				
	
	
		
			89 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			89 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
/*
 | 
						|
	MIT License http://www.opensource.org/licenses/mit-license.php
 | 
						|
*/
 | 
						|
"use strict";
 | 
						|
 | 
						|
const WebpackError = require("../WebpackError");
 | 
						|
 | 
						|
/** @typedef {import("../Module")} Module */
 | 
						|
/** @typedef {import("../RequestShortener")} RequestShortener */
 | 
						|
 | 
						|
/**
 | 
						|
 * @param {Module} module module to get chains from
 | 
						|
 * @param {RequestShortener} requestShortener to make readable identifiers
 | 
						|
 * @returns {string[]} all chains to the module
 | 
						|
 */
 | 
						|
const getInitialModuleChains = (module, requestShortener) => {
 | 
						|
	const queue = [
 | 
						|
		{ head: module, message: module.readableIdentifier(requestShortener) }
 | 
						|
	];
 | 
						|
	/** @type {Set<string>} */
 | 
						|
	const results = new Set();
 | 
						|
	/** @type {Set<string>} */
 | 
						|
	const incompleteResults = new Set();
 | 
						|
	/** @type {Set<Module>} */
 | 
						|
	const visitedModules = new Set();
 | 
						|
 | 
						|
	for (const chain of queue) {
 | 
						|
		const { head, message } = chain;
 | 
						|
		let final = true;
 | 
						|
		/** @type {Set<Module>} */
 | 
						|
		const alreadyReferencedModules = new Set();
 | 
						|
		for (const reason of head.reasons) {
 | 
						|
			const newHead = reason.module;
 | 
						|
			if (newHead) {
 | 
						|
				if (!newHead.getChunks().some(c => c.canBeInitial())) continue;
 | 
						|
				final = false;
 | 
						|
				if (alreadyReferencedModules.has(newHead)) continue;
 | 
						|
				alreadyReferencedModules.add(newHead);
 | 
						|
				const moduleName = newHead.readableIdentifier(requestShortener);
 | 
						|
				const detail = reason.explanation ? ` (${reason.explanation})` : "";
 | 
						|
				const newMessage = `${moduleName}${detail} --> ${message}`;
 | 
						|
				if (visitedModules.has(newHead)) {
 | 
						|
					incompleteResults.add(`... --> ${newMessage}`);
 | 
						|
					continue;
 | 
						|
				}
 | 
						|
				visitedModules.add(newHead);
 | 
						|
				queue.push({
 | 
						|
					head: newHead,
 | 
						|
					message: newMessage
 | 
						|
				});
 | 
						|
			} else {
 | 
						|
				final = false;
 | 
						|
				const newMessage = reason.explanation
 | 
						|
					? `(${reason.explanation}) --> ${message}`
 | 
						|
					: message;
 | 
						|
				results.add(newMessage);
 | 
						|
			}
 | 
						|
		}
 | 
						|
		if (final) {
 | 
						|
			results.add(message);
 | 
						|
		}
 | 
						|
	}
 | 
						|
	for (const result of incompleteResults) {
 | 
						|
		results.add(result);
 | 
						|
	}
 | 
						|
	return Array.from(results);
 | 
						|
};
 | 
						|
 | 
						|
module.exports = class WebAssemblyInInitialChunkError extends WebpackError {
 | 
						|
	/**
 | 
						|
	 * @param {Module} module WASM module
 | 
						|
	 * @param {RequestShortener} requestShortener request shortener
 | 
						|
	 */
 | 
						|
	constructor(module, requestShortener) {
 | 
						|
		const moduleChains = getInitialModuleChains(module, requestShortener);
 | 
						|
		const message = `WebAssembly module is included in initial chunk.
 | 
						|
This is not allowed, because WebAssembly download and compilation must happen asynchronous.
 | 
						|
Add an async splitpoint (i. e. import()) somewhere between your entrypoint and the WebAssembly module:
 | 
						|
${moduleChains.map(s => `* ${s}`).join("\n")}`;
 | 
						|
 | 
						|
		super(message);
 | 
						|
		this.name = "WebAssemblyInInitialChunkError";
 | 
						|
		this.hideStack = true;
 | 
						|
		this.module = module;
 | 
						|
 | 
						|
		Error.captureStackTrace(this, this.constructor);
 | 
						|
	}
 | 
						|
};
 |