| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 | /*	MIT License http://www.opensource.org/licenses/mit-license.php	Author Tobias Koppers @sokra*/"use strict";const Generator = require("../Generator");const { WEBASSEMBLY_MODULE_TYPE_SYNC } = require("../ModuleTypeConstants");const WebAssemblyExportImportedDependency = require("../dependencies/WebAssemblyExportImportedDependency");const WebAssemblyImportDependency = require("../dependencies/WebAssemblyImportDependency");const { compareModulesByIdentifier } = require("../util/comparators");const memoize = require("../util/memoize");const WebAssemblyInInitialChunkError = require("./WebAssemblyInInitialChunkError");/** @typedef {import("webpack-sources").Source} Source *//** @typedef {import("../../declarations/WebpackOptions").OutputNormalized} OutputOptions *//** @typedef {import("../Compiler")} Compiler *//** @typedef {import("../Module")} Module *//** @typedef {import("../ModuleTemplate")} ModuleTemplate *//** @typedef {import("../javascript/JavascriptModulesPlugin").RenderContext} RenderContext */const getWebAssemblyGenerator = memoize(() =>	require("./WebAssemblyGenerator"));const getWebAssemblyJavascriptGenerator = memoize(() =>	require("./WebAssemblyJavascriptGenerator"));const getWebAssemblyParser = memoize(() => require("./WebAssemblyParser"));const PLUGIN_NAME = "WebAssemblyModulesPlugin";/** * @typedef {object} WebAssemblyModulesPluginOptions * @property {boolean} [mangleImports] mangle imports */class WebAssemblyModulesPlugin {	/**	 * @param {WebAssemblyModulesPluginOptions} options options	 */	constructor(options) {		this.options = options;	}	/**	 * Apply the plugin	 * @param {Compiler} compiler the compiler instance	 * @returns {void}	 */	apply(compiler) {		compiler.hooks.compilation.tap(			PLUGIN_NAME,			(compilation, { normalModuleFactory }) => {				compilation.dependencyFactories.set(					WebAssemblyImportDependency,					normalModuleFactory				);				compilation.dependencyFactories.set(					WebAssemblyExportImportedDependency,					normalModuleFactory				);				normalModuleFactory.hooks.createParser					.for(WEBASSEMBLY_MODULE_TYPE_SYNC)					.tap(PLUGIN_NAME, () => {						const WebAssemblyParser = getWebAssemblyParser();						return new WebAssemblyParser();					});				normalModuleFactory.hooks.createGenerator					.for(WEBASSEMBLY_MODULE_TYPE_SYNC)					.tap(PLUGIN_NAME, () => {						const WebAssemblyJavascriptGenerator =							getWebAssemblyJavascriptGenerator();						const WebAssemblyGenerator = getWebAssemblyGenerator();						return Generator.byType({							javascript: new WebAssemblyJavascriptGenerator(),							webassembly: new WebAssemblyGenerator(this.options)						});					});				compilation.hooks.renderManifest.tap(PLUGIN_NAME, (result, options) => {					const { chunkGraph } = compilation;					const { chunk, outputOptions, codeGenerationResults } = options;					for (const module of chunkGraph.getOrderedChunkModulesIterable(						chunk,						compareModulesByIdentifier					)) {						if (module.type === WEBASSEMBLY_MODULE_TYPE_SYNC) {							const filenameTemplate =								/** @type {NonNullable<OutputOptions["webassemblyModuleFilename"]>} */								(outputOptions.webassemblyModuleFilename);							result.push({								render: () =>									codeGenerationResults.getSource(										module,										chunk.runtime,										"webassembly"									),								filenameTemplate,								pathOptions: {									module,									runtime: chunk.runtime,									chunkGraph								},								auxiliary: true,								identifier: `webassemblyModule${chunkGraph.getModuleId(									module								)}`,								hash: chunkGraph.getModuleHash(module, chunk.runtime)							});						}					}					return result;				});				compilation.hooks.afterChunks.tap(PLUGIN_NAME, () => {					const chunkGraph = compilation.chunkGraph;					const initialWasmModules = new Set();					for (const chunk of compilation.chunks) {						if (chunk.canBeInitial()) {							for (const module of chunkGraph.getChunkModulesIterable(chunk)) {								if (module.type === WEBASSEMBLY_MODULE_TYPE_SYNC) {									initialWasmModules.add(module);								}							}						}					}					for (const module of initialWasmModules) {						compilation.errors.push(							new WebAssemblyInInitialChunkError(								module,								compilation.moduleGraph,								compilation.chunkGraph,								compilation.requestShortener							)						);					}				});			}		);	}}module.exports = WebAssemblyModulesPlugin;
 |