summaryrefslogtreecommitdiff
path: root/node_modules/webpack/lib/wasm-sync/WebAssemblyModulesPlugin.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/webpack/lib/wasm-sync/WebAssemblyModulesPlugin.js')
-rw-r--r--node_modules/webpack/lib/wasm-sync/WebAssemblyModulesPlugin.js152
1 files changed, 152 insertions, 0 deletions
diff --git a/node_modules/webpack/lib/wasm-sync/WebAssemblyModulesPlugin.js b/node_modules/webpack/lib/wasm-sync/WebAssemblyModulesPlugin.js
new file mode 100644
index 00000000..dc3ff32e
--- /dev/null
+++ b/node_modules/webpack/lib/wasm-sync/WebAssemblyModulesPlugin.js
@@ -0,0 +1,152 @@
+/*
+ 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;