WXL
4 天以前 2cc85c64f1c64a2dbaeae276a3e2ca8420de76b7
node_modules/webpack/lib/sharing/ConsumeSharedPlugin.js
@@ -10,7 +10,6 @@
const WebpackError = require("../WebpackError");
const { parseOptions } = require("../container/options");
const LazySet = require("../util/LazySet");
const createSchemaValidation = require("../util/create-schema-validation");
const { parseRange } = require("../util/semver");
const ConsumeSharedFallbackDependency = require("./ConsumeSharedFallbackDependency");
const ConsumeSharedModule = require("./ConsumeSharedModule");
@@ -26,19 +25,11 @@
/** @typedef {import("enhanced-resolve").ResolveContext} ResolveContext */
/** @typedef {import("../../declarations/plugins/sharing/ConsumeSharedPlugin").ConsumeSharedPluginOptions} ConsumeSharedPluginOptions */
/** @typedef {import("../Compiler")} Compiler */
/** @typedef {import("../Compilation").FileSystemDependencies} FileSystemDependencies */
/** @typedef {import("../ResolverFactory").ResolveOptionsWithDependencyType} ResolveOptionsWithDependencyType */
/** @typedef {import("../util/semver").SemVerRange} SemVerRange */
/** @typedef {import("./ConsumeSharedModule").ConsumeOptions} ConsumeOptions */
/** @typedef {import("./utils").DescriptionFile} DescriptionFile */
const validate = createSchemaValidation(
   require("../../schemas/plugins/sharing/ConsumeSharedPlugin.check"),
   () => require("../../schemas/plugins/sharing/ConsumeSharedPlugin.json"),
   {
      name: "Consume Shared Plugin",
      baseDataPath: "options"
   }
);
/** @type {ResolveOptionsWithDependencyType} */
const RESOLVE_OPTIONS = { dependencyType: "esm" };
@@ -46,16 +37,41 @@
class ConsumeSharedPlugin {
   /**
    * Creates an instance of ConsumeSharedPlugin.
    * @param {ConsumeSharedPluginOptions} options options
    */
   constructor(options) {
      if (typeof options !== "string") {
         validate(options);
      this.options = options;
   }
   /**
    * Applies the plugin by registering its hooks on the compiler.
    * @param {Compiler} compiler the compiler instance
    * @returns {void}
    */
   apply(compiler) {
      // TODO webpack 6 remove string support
      if (typeof this.options !== "string") {
         compiler.hooks.validate.tap(PLUGIN_NAME, () => {
            compiler.validate(
               () =>
                  require("../../schemas/plugins/sharing/ConsumeSharedPlugin.json"),
               this.options,
               {
                  name: "Consume Shared Plugin",
                  baseDataPath: "options"
               },
               (options) =>
                  require("../../schemas/plugins/sharing/ConsumeSharedPlugin.check")(
                     options
                  )
            );
         });
      }
      /** @type {[string, ConsumeOptions][]} */
      this._consumes = parseOptions(
         options.consumes,
      const consumes = parseOptions(
         this.options.consumes,
         (item, key) => {
            if (Array.isArray(item)) throw new Error("Unexpected array in options");
            /** @type {ConsumeOptions} */
@@ -64,7 +80,7 @@
                  ? // item is a request/key
                     {
                        import: key,
                        shareScope: options.shareScope || "default",
                        shareScope: this.options.shareScope || "default",
                        shareKey: key,
                        requiredVersion: undefined,
                        packageName: undefined,
@@ -76,7 +92,7 @@
                     // item is a version
                     {
                        import: key,
                        shareScope: options.shareScope || "default",
                        shareScope: this.options.shareScope || "default",
                        shareKey: key,
                        requiredVersion: parseRange(item),
                        strictVersion: true,
@@ -88,7 +104,7 @@
         },
         (item, key) => ({
            import: item.import === false ? undefined : item.import || key,
            shareScope: item.shareScope || options.shareScope || "default",
            shareScope: item.shareScope || this.options.shareScope || "default",
            shareKey: item.shareKey || key,
            requiredVersion:
               typeof item.requiredVersion === "string"
@@ -103,14 +119,7 @@
            eager: Boolean(item.eager)
         })
      );
   }
   /**
    * Apply the plugin
    * @param {Compiler} compiler the compiler instance
    * @returns {void}
    */
   apply(compiler) {
      compiler.hooks.thisCompilation.tap(
         PLUGIN_NAME,
         (compilation, { normalModuleFactory }) => {
@@ -119,13 +128,15 @@
               normalModuleFactory
            );
            /** @type {Map<string, ConsumeOptions>} */
            /** @typedef {Map<string, ConsumeOptions>} Consumes */
            /** @type {Consumes} */
            let unresolvedConsumes;
            /** @type {Map<string, ConsumeOptions>} */
            /** @type {Consumes} */
            let resolvedConsumes;
            /** @type {Map<string, ConsumeOptions>} */
            /** @type {Consumes} */
            let prefixedConsumes;
            const promise = resolveMatchedConfigs(compilation, this._consumes).then(
            const promise = resolveMatchedConfigs(compilation, consumes).then(
               ({ resolved, unresolved, prefixed }) => {
                  resolvedConsumes = resolved;
                  unresolvedConsumes = unresolved;
@@ -139,6 +150,7 @@
            );
            /**
             * Creates a consume shared module.
             * @param {string} context issuer directory
             * @param {string} request request
             * @param {ConsumeOptions} config options
@@ -146,6 +158,7 @@
             */
            const createConsumeSharedModule = (context, request, config) => {
               /**
                * Required version warning.
                * @param {string} details details
                */
               const requiredVersionWarning = (details) => {
@@ -157,10 +170,11 @@
               };
               const directFallback =
                  config.import &&
                  /^(\.\.?(\/|$)|\/|[A-Za-z]:|\\\\)/.test(config.import);
                  /^(?:\.\.?(?:\/|$)|\/|[A-Z]:|\\\\)/i.test(config.import);
               return Promise.all([
                  new Promise(
                     /**
                      * Handles the callback logic for this hook.
                      * @param {(value?: string) => void} resolve resolve
                      */
                     (resolve) => {
@@ -168,7 +182,7 @@
                           resolve();
                           return;
                        }
                        /** @typedef {ResolveContext} */
                        /** @type {ResolveContext & { fileDependencies: FileSystemDependencies, contextDependencies: FileSystemDependencies, missingDependencies: FileSystemDependencies }} */
                        const resolveContext = {
                           fileDependencies: new LazySet(),
                           contextDependencies: new LazySet(),
@@ -204,6 +218,7 @@
                  ),
                  new Promise(
                     /**
                      * Handles the name callback for this hook.
                      * @param {(value?: SemVerRange) => void} resolve resolve
                      */
                     (resolve) => {
@@ -213,13 +228,13 @@
                        }
                        let packageName = config.packageName;
                        if (packageName === undefined) {
                           if (/^(\/|[A-Za-z]:|\\\\)/.test(request)) {
                           if (/^(?:\/|[A-Z]:|\\\\)/i.test(request)) {
                              // For relative or absolute requests we don't automatically use a packageName.
                              // If wished one can specify one with the packageName option.
                              resolve();
                              return;
                           }
                           const match = /^((?:@[^\\/]+[\\/])?[^\\/]+)/.exec(request);
                           const match = /^(?:@[^\\/]+[\\/])?[^\\/]+/.exec(request);
                           if (!match) {
                              requiredVersionWarning(
                                 "Unable to extract the package name from request."