| | |
| | | const Generator = require("../Generator"); |
| | | const { tryRunOrWebpackError } = require("../HookWebpackError"); |
| | | const { WEBASSEMBLY_MODULE_TYPE_ASYNC } = require("../ModuleTypeConstants"); |
| | | const NormalModule = require("../NormalModule"); |
| | | const WebAssemblyImportDependency = require("../dependencies/WebAssemblyImportDependency"); |
| | | const { compareModulesByIdOrIdentifier } = require("../util/comparators"); |
| | | const { compareModulesByFullName } = require("../util/comparators"); |
| | | const makeSerializable = require("../util/makeSerializable"); |
| | | const memoize = require("../util/memoize"); |
| | | |
| | | /** @typedef {import("webpack-sources").Source} Source */ |
| | |
| | | /** @typedef {import("../Compiler")} Compiler */ |
| | | /** @typedef {import("../DependencyTemplates")} DependencyTemplates */ |
| | | /** @typedef {import("../Module")} Module */ |
| | | /** @typedef {import("../dependencies/ImportPhase").ImportPhaseName} ImportPhaseName */ |
| | | /** @typedef {import("../NormalModule").NormalModuleCreateData} NormalModuleCreateData */ |
| | | /** @typedef {import("../ModuleGraph")} ModuleGraph */ |
| | | /** @typedef {import("../RuntimeTemplate")} RuntimeTemplate */ |
| | | /** @typedef {import("../WebpackError")} WebpackError */ |
| | | /** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */ |
| | | /** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */ |
| | | |
| | | const getAsyncWebAssemblyGenerator = memoize(() => |
| | | require("./AsyncWebAssemblyGenerator") |
| | |
| | | require("./AsyncWebAssemblyParser") |
| | | ); |
| | | |
| | | /** @typedef {NormalModule & { phase: ImportPhaseName | undefined }} AsyncWasmModuleClass */ |
| | | |
| | | class AsyncWasmModule extends NormalModule { |
| | | /** |
| | | * @param {NormalModuleCreateData & { phase: ImportPhaseName | undefined }} options options object |
| | | */ |
| | | constructor(options) { |
| | | super(options); |
| | | this.phase = options.phase; |
| | | } |
| | | |
| | | /** |
| | | * Returns the unique identifier used to reference this module. |
| | | * @returns {string} a unique identifier of the module |
| | | */ |
| | | identifier() { |
| | | let str = super.identifier(); |
| | | |
| | | if (this.phase) { |
| | | str = `${str}|${this.phase}`; |
| | | } |
| | | |
| | | return str; |
| | | } |
| | | |
| | | /** |
| | | * Assuming this module is in the cache. Update the (cached) module with |
| | | * the fresh module from the factory. Usually updates internal references |
| | | * and properties. |
| | | * @param {Module} module fresh module |
| | | * @returns {void} |
| | | */ |
| | | updateCacheModule(module) { |
| | | super.updateCacheModule(module); |
| | | const m = /** @type {AsyncWasmModule} */ (module); |
| | | this.phase = m.phase; |
| | | } |
| | | |
| | | /** |
| | | * Serializes this instance into the provided serializer context. |
| | | * @param {ObjectSerializerContext} context context |
| | | */ |
| | | serialize(context) { |
| | | const { write } = context; |
| | | write(this.phase); |
| | | super.serialize(context); |
| | | } |
| | | |
| | | /** |
| | | * @param {ObjectDeserializerContext} context context |
| | | * @returns {AsyncWasmModule} the deserialized object |
| | | */ |
| | | static deserialize(context) { |
| | | const obj = new AsyncWasmModule({ |
| | | // will be deserialized by Module |
| | | layer: /** @type {EXPECTED_ANY} */ (null), |
| | | type: "", |
| | | // will be filled by updateCacheModule |
| | | resource: "", |
| | | context: "", |
| | | request: /** @type {EXPECTED_ANY} */ (null), |
| | | userRequest: /** @type {EXPECTED_ANY} */ (null), |
| | | rawRequest: /** @type {EXPECTED_ANY} */ (null), |
| | | loaders: /** @type {EXPECTED_ANY} */ (null), |
| | | matchResource: /** @type {EXPECTED_ANY} */ (null), |
| | | parser: /** @type {EXPECTED_ANY} */ (null), |
| | | parserOptions: /** @type {EXPECTED_ANY} */ (null), |
| | | generator: /** @type {EXPECTED_ANY} */ (null), |
| | | generatorOptions: /** @type {EXPECTED_ANY} */ (null), |
| | | resolveOptions: /** @type {EXPECTED_ANY} */ (null), |
| | | extractSourceMap: /** @type {EXPECTED_ANY} */ (null), |
| | | phase: /** @type {EXPECTED_ANY} */ (null) |
| | | }); |
| | | obj.deserialize(context); |
| | | return obj; |
| | | } |
| | | |
| | | /** |
| | | * Restores this instance from the provided deserializer context. |
| | | * @param {ObjectDeserializerContext} context context |
| | | */ |
| | | deserialize(context) { |
| | | const { read } = context; |
| | | this.phase = read(); |
| | | super.deserialize(context); |
| | | } |
| | | } |
| | | |
| | | makeSerializable(AsyncWasmModule, "webpack/lib/wasm-async/AsyncWasmModule"); |
| | | |
| | | /** |
| | | * Defines the web assembly render context type used by this module. |
| | | * @typedef {object} WebAssemblyRenderContext |
| | | * @property {Chunk} chunk the chunk |
| | | * @property {DependencyTemplates} dependencyTemplates the dependency templates |
| | |
| | | */ |
| | | |
| | | /** |
| | | * Defines the compilation hooks type used by this module. |
| | | * @typedef {object} CompilationHooks |
| | | * @property {SyncWaterfallHook<[Source, Module, WebAssemblyRenderContext]>} renderModuleContent |
| | | */ |
| | | |
| | | /** |
| | | * Defines the async web assembly modules plugin options type used by this module. |
| | | * @typedef {object} AsyncWebAssemblyModulesPluginOptions |
| | | * @property {boolean=} mangleImports mangle imports |
| | | */ |
| | |
| | | |
| | | class AsyncWebAssemblyModulesPlugin { |
| | | /** |
| | | * Returns the attached hooks. |
| | | * @param {Compilation} compilation the compilation |
| | | * @returns {CompilationHooks} the attached hooks |
| | | */ |
| | |
| | | } |
| | | |
| | | /** |
| | | * Creates an instance of AsyncWebAssemblyModulesPlugin. |
| | | * @param {AsyncWebAssemblyModulesPluginOptions} options options |
| | | */ |
| | | constructor(options) { |
| | | /** @type {AsyncWebAssemblyModulesPluginOptions} */ |
| | | this.options = options; |
| | | } |
| | | |
| | | /** |
| | | * Apply the plugin |
| | | * Applies the plugin by registering its hooks on the compiler. |
| | | * @param {Compiler} compiler the compiler instance |
| | | * @returns {void} |
| | | */ |
| | |
| | | compilation.dependencyFactories.set( |
| | | WebAssemblyImportDependency, |
| | | normalModuleFactory |
| | | ); |
| | | |
| | | normalModuleFactory.hooks.createModuleClass |
| | | .for(WEBASSEMBLY_MODULE_TYPE_ASYNC) |
| | | .tap( |
| | | PLUGIN_NAME, |
| | | (createData, resolveData) => |
| | | new AsyncWasmModule({ |
| | | .../** @type {NormalModuleCreateData & { type: string }} */ |
| | | (createData), |
| | | phase: resolveData.phase |
| | | }) |
| | | ); |
| | | |
| | | normalModuleFactory.hooks.createParser |
| | |
| | | |
| | | for (const module of chunkGraph.getOrderedChunkModulesIterable( |
| | | chunk, |
| | | compareModulesByIdOrIdentifier(chunkGraph) |
| | | compareModulesByFullName(compiler) |
| | | )) { |
| | | if (module.type === WEBASSEMBLY_MODULE_TYPE_ASYNC) { |
| | | const filenameTemplate = outputOptions.webassemblyModuleFilename; |
| | |
| | | } |
| | | |
| | | /** |
| | | * Renders the newly generated source from rendering. |
| | | * @param {Module} module the rendered module |
| | | * @param {WebAssemblyRenderContext} renderContext options object |
| | | * @param {CompilationHooks} hooks hooks |