WXL
4 天以前 2cc85c64f1c64a2dbaeae276a3e2ca8420de76b7
node_modules/webpack/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js
@@ -8,23 +8,27 @@
const { RawSource } = require("webpack-sources");
const Generator = require("../Generator");
const InitFragment = require("../InitFragment");
const { WEBASSEMBLY_TYPES } = require("../ModuleSourceTypesConstants");
const { WEBASSEMBLY_TYPES } = require("../ModuleSourceTypeConstants");
const RuntimeGlobals = require("../RuntimeGlobals");
const Template = require("../Template");
const WebAssemblyImportDependency = require("../dependencies/WebAssemblyImportDependency");
/** @typedef {import("webpack-sources").Source} Source */
/** @typedef {import("./AsyncWebAssemblyModulesPlugin").AsyncWasmModuleClass} AsyncWasmModule */
/** @typedef {import("../Generator").GenerateContext} GenerateContext */
/** @typedef {import("../Module")} Module */
/** @typedef {import("../Module").SourceType} SourceType */
/** @typedef {import("../Module").SourceTypes} SourceTypes */
/** @typedef {import("../NormalModule")} NormalModule */
/**
 * Represents the async web assembly javascript generator runtime component.
 * @typedef {{ request: string, importVar: string, dependency: WebAssemblyImportDependency }} ImportObjRequestItem
 */
class AsyncWebAssemblyJavascriptGenerator extends Generator {
   /**
    * Returns the source types available for this module.
    * @param {NormalModule} module fresh module
    * @returns {SourceTypes} available types (do not mutate)
    */
@@ -33,15 +37,23 @@
   }
   /**
    * Returns the estimated size for the requested source type.
    * @param {NormalModule} module the module
    * @param {string=} type source type
    * @param {SourceType=} type source type
    * @returns {number} estimate size of the module
    */
   getSize(module, type) {
      // it's only estimated so this number is probably fine
      // Example: m.exports=s.v(e,_.id,"6db474f11db19c35388a")
      if (/** @type {AsyncWasmModule} */ (module).phase === "source") {
         return 44;
      }
      return 40 + module.dependencies.length * 10;
   }
   /**
    * Generates generated code for this runtime module.
    * @param {NormalModule} module module for which the code should be generated
    * @param {GenerateContext} generateContext context for generate
    * @returns {Source | null} generated code
@@ -54,6 +66,12 @@
         runtimeRequirements,
         runtime
      } = generateContext;
      // Check if this is a source phase import
      if (/** @type {AsyncWasmModule} */ (module).phase === "source") {
         return this._generateSourcePhase(module, generateContext);
      }
      runtimeRequirements.add(RuntimeGlobals.module);
      runtimeRequirements.add(RuntimeGlobals.moduleId);
      runtimeRequirements.add(RuntimeGlobals.exports);
@@ -198,6 +216,48 @@
   }
   /**
    * Generate code for source phase import (returns WebAssembly.Module)
    * @param {NormalModule} module module for which the code should be generated
    * @param {GenerateContext} generateContext context for generate
    * @returns {Source} generated code
    */
   _generateSourcePhase(module, generateContext) {
      const { chunkGraph, runtimeTemplate, runtimeRequirements, runtime } =
         generateContext;
      runtimeRequirements.add(RuntimeGlobals.module);
      runtimeRequirements.add(RuntimeGlobals.moduleId);
      runtimeRequirements.add(RuntimeGlobals.exports);
      runtimeRequirements.add(RuntimeGlobals.compileWasm);
      runtimeRequirements.add(RuntimeGlobals.asyncModule);
      runtimeRequirements.add(RuntimeGlobals.definePropertyGetters);
      // Source phase: export default WebAssembly.Module (via compileWasm)
      const compileCall = `${RuntimeGlobals.compileWasm}(${
         module.moduleArgument
      }.id, ${JSON.stringify(chunkGraph.getRenderedModuleHash(module, runtime))})`;
      // Use async module wrapper to handle the Promise from compileWasm
      return new RawSource(
         Template.asString([
            `${RuntimeGlobals.asyncModule}(${
               module.moduleArgument
            }, async ${runtimeTemplate.basicFunction(
               "__webpack_handle_async_dependencies__, __webpack_async_result__",
               [
                  "try {",
                  `var __webpack_wasm_module__ = await ${compileCall};`,
                  `${RuntimeGlobals.definePropertyGetters}(${module.exportsArgument}, { "default": ${runtimeTemplate.returningFunction("__webpack_wasm_module__")} });`,
                  "__webpack_async_result__();",
                  "} catch(e) { __webpack_async_result__(e); }"
               ]
            )}, 1);`
         ])
      );
   }
   /**
    * Generates fallback output for the provided error condition.
    * @param {Error} error the error
    * @param {NormalModule} module module for which the code should be generated
    * @param {GenerateContext} generateContext context for generate