WXL
4 天以前 2cc85c64f1c64a2dbaeae276a3e2ca8420de76b7
node_modules/webpack/lib/NormalModuleFactory.js
@@ -20,6 +20,7 @@
const ModuleGraph = require("./ModuleGraph");
const { JAVASCRIPT_MODULE_TYPE_AUTO } = require("./ModuleTypeConstants");
const NormalModule = require("./NormalModule");
const { ImportPhaseUtils } = require("./dependencies/ImportPhase");
const BasicEffectRulePlugin = require("./rules/BasicEffectRulePlugin");
const BasicMatcherRulePlugin = require("./rules/BasicMatcherRulePlugin");
const ObjectMatcherRulePlugin = require("./rules/ObjectMatcherRulePlugin");
@@ -38,6 +39,7 @@
/** @typedef {import("enhanced-resolve").ResolveRequest} ResolveRequest */
/** @typedef {import("../declarations/WebpackOptions").ModuleOptionsNormalized} ModuleOptions */
/** @typedef {import("../declarations/WebpackOptions").RuleSetRule} RuleSetRule */
/** @typedef {import("./Compilation").FileSystemDependencies} FileSystemDependencies */
/** @typedef {import("./Generator")} Generator */
/** @typedef {import("./ModuleFactory").ModuleFactoryCallback} ModuleFactoryCallback */
/** @typedef {import("./ModuleFactory").ModuleFactoryCreateData} ModuleFactoryCreateData */
@@ -51,37 +53,44 @@
/** @typedef {import("./ResolverFactory")} ResolverFactory */
/** @typedef {import("./ResolverFactory").ResolverWithOptions} ResolverWithOptions */
/** @typedef {import("./dependencies/ModuleDependency")} ModuleDependency */
/** @typedef {import("./dependencies/ImportPhase").ImportPhaseType} ImportPhaseType */
/** @typedef {import("./dependencies/ImportPhase").ImportPhaseName} ImportPhaseName */
/** @typedef {import("./javascript/JavascriptParser").ImportAttributes} ImportAttributes */
/** @typedef {import("./rules/RuleSetCompiler").RuleSetRules} RuleSetRules */
/** @typedef {import("./rules/RuleSetCompiler").RuleSet} RuleSet */
/** @typedef {import("./util/fs").InputFileSystem} InputFileSystem */
/** @typedef {import("./util/identifier").AssociatedObjectForCache} AssociatedObjectForCache */
/**
 * Defines the callback type used by this module.
 * @template T
 * @typedef {import("./Compiler").Callback<T>} Callback
 */
/** @typedef {Pick<RuleSetRule, 'type' | 'sideEffects' | 'parser' | 'generator' | 'resolve' | 'layer' | 'extractSourceMap'>} ModuleSettings */
/** @typedef {Pick<RuleSetRule, "type" | "sideEffects" | "parser" | "generator" | "resolve" | "layer" | "extractSourceMap">} ModuleSettings */
/** @typedef {Partial<NormalModuleCreateData & { settings: ModuleSettings }>} CreateData */
/**
 * Defines the resolve data type used by this module.
 * @typedef {object} ResolveData
 * @property {ModuleFactoryCreateData["contextInfo"]} contextInfo
 * @property {ModuleFactoryCreateData["resolveOptions"]} resolveOptions
 * @property {string} context
 * @property {string} request
 * @property {ImportAttributes | undefined} attributes
 * @property {ImportPhaseName=} phase
 * @property {ImportAttributes=} attributes
 * @property {ModuleDependency[]} dependencies
 * @property {string} dependencyType
 * @property {CreateData} createData
 * @property {LazySet<string>} fileDependencies
 * @property {LazySet<string>} missingDependencies
 * @property {LazySet<string>} contextDependencies
 * @property {FileSystemDependencies} fileDependencies
 * @property {FileSystemDependencies} missingDependencies
 * @property {FileSystemDependencies} contextDependencies
 * @property {Module=} ignoredModule
 * @property {boolean} cacheable allow to use the unsafe cache
 */
/**
 * Defines the resource data type used by this module.
 * @typedef {object} ResourceData
 * @property {string} resource
 * @property {string=} path
@@ -91,6 +100,7 @@
 */
/**
 * Defines the resource scheme data type used by this module.
 * @typedef {object} ResourceSchemeData
 * @property {string=} mimetype mime type of the resource
 * @property {string=} parameters additional parameters for the resource
@@ -101,9 +111,10 @@
/** @typedef {ResourceData & { data: ResourceSchemeData & Partial<ResolveRequest> }} ResourceDataWithData */
/**
 * Defines the parsed loader request type used by this module.
 * @typedef {object} ParsedLoaderRequest
 * @property {string} loader loader
 * @property {string|undefined} options options
 * @property {string | undefined} options options
 */
/** @typedef {import("./ModuleTypeConstants").JAVASCRIPT_MODULE_TYPE_AUTO} JAVASCRIPT_MODULE_TYPE_AUTO */
@@ -137,6 +148,7 @@
const LEADING_DOT_EXTENSION_REGEX = /^[^.]/;
/**
 * Returns ident.
 * @param {LoaderItem} data data
 * @returns {string} ident
 */
@@ -157,6 +169,7 @@
};
/**
 * Stringify loaders and resource.
 * @param {LoaderItem[]} loaders loaders
 * @param {string} resource resource
 * @returns {string} stringified loaders and resource
@@ -170,6 +183,7 @@
};
/**
 * Checks whether it needs calls.
 * @param {number} times times
 * @param {(err?: null | Error) => void} callback callback
 * @returns {(err?: null | Error) => void} callback
@@ -185,6 +199,7 @@
};
/**
 * Merges global options.
 * @template T
 * @template O
 * @param {T} globalOptions global options
@@ -194,6 +209,7 @@
 */
const mergeGlobalOptions = (globalOptions, type, localOptions) => {
   const parts = type.split("/");
   /** @type {undefined | T} */
   let result;
   let current = "";
   for (const part of parts) {
@@ -214,6 +230,7 @@
// TODO webpack 6 remove
/**
 * Deprecation changed hook message.
 * @template {import("tapable").Hook<EXPECTED_ANY, EXPECTED_ANY>} T
 * @param {string} name name
 * @param {T} hook hook
@@ -243,6 +260,7 @@
   new BasicMatcherRulePlugin("issuer"),
   new BasicMatcherRulePlugin("compiler"),
   new BasicMatcherRulePlugin("issuerLayer"),
   new BasicMatcherRulePlugin("phase"),
   new ObjectMatcherRulePlugin("assert", "attributes", (value) => {
      if (value) {
         return (
@@ -296,16 +314,14 @@
/** @typedef {import("./css/CssParser")} CssParser */
/** @typedef {import("../declarations/WebpackOptions").CssParserOptions} CssParserOptions */
/** @typedef {import("../declarations/WebpackOptions").CssAutoParserOptions} CssAutoParserOptions */
/** @typedef {import("../declarations/WebpackOptions").CssGlobalParserOptions} CssGlobalParserOptions */
/** @typedef {import("../declarations/WebpackOptions").CssModuleParserOptions} CssModuleParserOptions */
/** @typedef {import("./css/CssGenerator")} CssGenerator */
/** @typedef {import("../declarations/WebpackOptions").CssGeneratorOptions} CssGeneratorOptions */
/** @typedef {import("../declarations/WebpackOptions").CssGlobalGeneratorOptions} CssGlobalGeneratorOptions */
/** @typedef {import("../declarations/WebpackOptions").CssModuleGeneratorOptions} CssModuleGeneratorOptions */
/** @typedef {import("../declarations/WebpackOptions").CssAutoGeneratorOptions} CssAutoGeneratorOptions */
/* eslint-disable jsdoc/type-formatting */
/**
 * Defines the shared type used by this module.
 * @typedef {[
 * [JAVASCRIPT_MODULE_TYPE_AUTO, JavascriptParser, JavascriptParserOptions, JavascriptGenerator, EmptyGeneratorOptions],
 * [JAVASCRIPT_MODULE_TYPE_DYNAMIC, JavascriptParser, JavascriptParserOptions, JavascriptGenerator, EmptyGeneratorOptions],
@@ -319,20 +335,23 @@
 * [WEBASSEMBLY_MODULE_TYPE_ASYNC, AsyncWebAssemblyParser, EmptyParserOptions, Generator, EmptyParserOptions],
 * [WEBASSEMBLY_MODULE_TYPE_SYNC, WebAssemblyParser, EmptyParserOptions, Generator, EmptyParserOptions],
 * [CSS_MODULE_TYPE, CssParser, CssParserOptions, CssGenerator, CssGeneratorOptions],
 * [CSS_MODULE_TYPE_AUTO, CssParser, CssAutoParserOptions, CssGenerator, CssAutoGeneratorOptions],
 * [CSS_MODULE_TYPE_AUTO, CssParser, CssModuleParserOptions, CssGenerator, CssModuleGeneratorOptions],
 * [CSS_MODULE_TYPE_MODULE, CssParser, CssModuleParserOptions, CssGenerator, CssModuleGeneratorOptions],
 * [CSS_MODULE_TYPE_GLOBAL, CssParser, CssGlobalParserOptions, CssGenerator, CssGlobalGeneratorOptions],
 * [CSS_MODULE_TYPE_GLOBAL, CssParser, CssModuleParserOptions, CssGenerator, CssModuleGeneratorOptions],
 * [string, Parser, ParserOptions, Generator, GeneratorOptions],
 * ]} ParsersAndGeneratorsByTypes
 */
/* eslint-enable jsdoc/type-formatting */
/**
 * Defines the extract tuple elements type used by this module.
 * @template {unknown[]} T
 * @template {number[]} I
 * @typedef {{ [K in keyof I]: K extends keyof I ? I[K] extends keyof T ? T[I[K]] : never : never }} ExtractTupleElements
 */
/**
 * Represents the normal module factory runtime component.
 * @template {unknown[]} T
 * @template {number[]} A
 * @template [R=void]
@@ -341,6 +360,7 @@
class NormalModuleFactory extends ModuleFactory {
   /**
    * Creates an instance of NormalModuleFactory.
    * @param {object} param params
    * @param {string=} param.context context
    * @param {InputFileSystem} param.fs file system
@@ -394,7 +414,9 @@
            () => new SyncBailHook(["createData", "resolveData"])
         )
      });
      /** @type {ResolverFactory} */
      this.resolverFactory = resolverFactory;
      /** @type {RuleSet} */
      this.ruleSet = ruleSetCompiler.compile([
         {
            rules: /** @type {RuleSetRules} */ (options.defaultRules)
@@ -403,7 +425,9 @@
            rules: /** @type {RuleSetRules} */ (options.rules)
         }
      ]);
      /** @type {string} */
      this.context = context || "";
      /** @type {InputFileSystem} */
      this.fs = fs;
      this._globalParserOptions = options.parser;
      this._globalGeneratorOptions = options.generator;
@@ -515,6 +539,7 @@
               dependencies,
               dependencyType,
               request,
               phase,
               attributes,
               resolveOptions,
               fileDependencies,
@@ -665,7 +690,9 @@
               const useLoadersPre = [];
               // handle .webpack[] suffix
               /** @type {string} */
               let resource;
               /** @type {RegExpExecArray | null} */
               let match;
               if (
                  matchResourceData &&
@@ -680,12 +707,14 @@
               } else {
                  settings.type = JAVASCRIPT_MODULE_TYPE_AUTO;
                  const resourceDataForRules = matchResourceData || resourceData;
                  const result = this.ruleSet.exec({
                     resource: resourceDataForRules.path,
                     realResource: resourceData.path,
                     resourceQuery: resourceDataForRules.query,
                     resourceFragment: resourceDataForRules.fragment,
                     scheme,
                     phase,
                     attributes,
                     mimetype: matchResourceData
                        ? ""
@@ -853,10 +882,11 @@
            );
            /**
             * Processes the provided string.
             * @param {string} context context
             */
            const defaultResolve = (context) => {
               if (/^($|\?)/.test(unresolvedResource)) {
               if (/^(?:$|\?)/.test(unresolvedResource)) {
                  resourceData = {
                     ...cacheParseResource(unresolvedResource),
                     resource: unresolvedResource,
@@ -957,6 +987,7 @@
   }
   /**
    * Processes the provided data.
    * @param {ModuleFactoryCreateData} data data object
    * @param {ModuleFactoryCallback} callback callback
    * @returns {void}
@@ -970,10 +1001,23 @@
      const attributes =
         /** @type {ModuleDependency & { attributes: ImportAttributes }} */
         (dependency).attributes;
      const phase =
         typeof (
            /** @type {ModuleDependency & { phase?: ImportPhaseType }} */
            (dependency).phase
         ) === "number"
            ? ImportPhaseUtils.stringify(
                  /** @type {ModuleDependency & { phase?: ImportPhaseType }} */
                  (dependency).phase
               )
            : "evaluation";
      const dependencyType = dependency.category || "";
      const contextInfo = data.contextInfo;
      /** @type {FileSystemDependencies} */
      const fileDependencies = new LazySet();
      /** @type {FileSystemDependencies} */
      const missingDependencies = new LazySet();
      /** @type {FileSystemDependencies} */
      const contextDependencies = new LazySet();
      /** @type {ResolveData} */
      const resolveData = {
@@ -981,6 +1025,7 @@
         resolveOptions,
         context,
         request,
         phase,
         attributes,
         dependencies,
         dependencyType,
@@ -1051,6 +1096,7 @@
   }
   /**
    * Processes the provided context info.
    * @param {ModuleFactoryCreateDataContextInfo} contextInfo context info
    * @param {string} context context
    * @param {string} unresolvedResource unresolved resource
@@ -1123,6 +1169,7 @@
   }
   /**
    * Resolve resource error hints.
    * @param {Error} error error
    * @param {ModuleFactoryCreateDataContextInfo} contextInfo context info
    * @param {string} context context
@@ -1188,7 +1235,7 @@
                     (err, resolvedResource) => {
                        if (!err && resolvedResource) {
                           let hint = "";
                           const match = /(\.[^.]+)(\?|$)/.exec(unresolvedResource);
                           const match = /\.[^.]+(?:\?|$)/.exec(unresolvedResource);
                           if (match) {
                              const fixedRequest = unresolvedResource.replace(
                                 /(\.[^.]+)(\?|$)/,
@@ -1248,6 +1295,7 @@
   }
   /**
    * Resolves request array.
    * @param {ModuleFactoryCreateDataContextInfo} contextInfo context info
    * @param {string} context context
    * @param {LoaderItem[]} array array
@@ -1269,6 +1317,7 @@
      asyncLib.map(
         array,
         /**
          * Handles the callback logic for this hook.
          * @param {LoaderItem} item item
          * @param {Callback<LoaderItem>} callback callback
          */
@@ -1338,12 +1387,16 @@
            );
         },
         (err, value) => {
            callback(err, /** @type {(LoaderItem)[]} */ (value));
            callback(
               /** @type {Error | null} */ (err),
               /** @type {(LoaderItem)[]} */ (value)
            );
         }
      );
   }
   /**
    * Returns parser.
    * @param {string} type type
    * @param {ParserOptions} parserOptions parser options
    * @returns {Parser} parser
@@ -1367,6 +1420,7 @@
   }
   /**
    * Creates a parser from the provided type.
    * @param {string} type type
    * @param {ParserOptions} parserOptions parser options
    * @returns {Parser} parser
@@ -1386,6 +1440,7 @@
   }
   /**
    * Returns generator.
    * @param {string} type type of generator
    * @param {GeneratorOptions} generatorOptions generator options
    * @returns {Generator} generator
@@ -1409,6 +1464,7 @@
   }
   /**
    * Creates a generator.
    * @param {string} type type of generator
    * @param {GeneratorOptions} generatorOptions generator options
    * @returns {Generator} generator
@@ -1430,6 +1486,7 @@
   }
   /**
    * Returns the resolver.
    * @param {Parameters<ResolverFactory["get"]>[0]} type type of resolver
    * @param {Parameters<ResolverFactory["get"]>[1]=} resolveOptions options
    * @returns {ReturnType<ResolverFactory["get"]>} the resolver