You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							88 lines
						
					
					
						
							2.7 KiB
						
					
					
				
			
		
		
	
	
							88 lines
						
					
					
						
							2.7 KiB
						
					
					
				/* | 
						|
	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); | 
						|
	} | 
						|
};
 | 
						|
 |