WXL
3 天以前 9bce51f651aad297ef9eb6df832bfdaf1de05d84
node_modules/webpack/lib/ChunkGroup.js
@@ -24,6 +24,9 @@
/** @typedef {{ module: Module | null, loc: DependencyLocation, request: string }} OriginRecord */
/**
 * Describes the scheduling hints that can be attached to a chunk group.
 * These values influence how child groups are ordered for preload/prefetch
 * and how their fetch priority is exposed to runtime code.
 * @typedef {object} RawChunkGroupOptions
 * @property {number=} preloadOrder
 * @property {number=} prefetchOrder
@@ -35,6 +38,8 @@
let debugId = 5000;
/**
 * Materializes a sortable set as an array without changing its current order.
 * Used with `SortableSet` caches that expect a stable array result.
 * @template T
 * @param {SortableSet<T>} set set to convert to array.
 * @returns {T[]} the array format of existing set
@@ -45,7 +50,7 @@
 * A convenience method used to sort chunks based on their id's
 * @param {ChunkGroup} a first sorting comparator
 * @param {ChunkGroup} b second sorting comparator
 * @returns {1|0|-1} a sorting index to determine order
 * @returns {1 | 0 | -1} a sorting index to determine order
 */
const sortById = (a, b) => {
   if (a.id < b.id) return -1;
@@ -54,9 +59,11 @@
};
/**
 * Orders origin records by referencing module and then by source location.
 * This keeps origin metadata deterministic for hashing and diagnostics.
 * @param {OriginRecord} a the first comparator in sort
 * @param {OriginRecord} b the second comparator in sort
 * @returns {1|-1|0} returns sorting order as index
 * @returns {1 | -1 | 0} returns sorting order as index
 */
const sortOrigin = (a, b) => {
   const aIdent = a.module ? a.module.identifier() : "";
@@ -66,9 +73,14 @@
   return compareLocations(a.loc, b.loc);
};
/**
 * Represents a connected group of chunks along with the parent/child
 * relationships, async blocks, and traversal metadata webpack tracks for it.
 */
class ChunkGroup {
   /**
    * Creates an instance of ChunkGroup.
    * Creates a chunk group and initializes the relationship sets and ordering
    * metadata used while building and optimizing the chunk graph.
    * @param {string | ChunkGroupOptions=} options chunk group options passed to chunkGroup
    */
   constructor(options) {
@@ -79,28 +91,33 @@
      }
      /** @type {number} */
      this.groupDebugId = debugId++;
      this.options = /** @type {ChunkGroupOptions} */ (options);
      /** @type {ChunkGroupOptions} */
      this.options = options;
      /** @type {SortableSet<ChunkGroup>} */
      this._children = new SortableSet(undefined, sortById);
      /** @type {SortableSet<ChunkGroup>} */
      this._parents = new SortableSet(undefined, sortById);
      /** @type {SortableSet<ChunkGroup>} */
      this._asyncEntrypoints = new SortableSet(undefined, sortById);
      /** @type {SortableSet<AsyncDependenciesBlock>} */
      this._blocks = new SortableSet();
      /** @type {Chunk[]} */
      this.chunks = [];
      /** @type {OriginRecord[]} */
      this.origins = [];
      /** @typedef {Map<Module, number>} OrderIndices */
      /** Indices in top-down order */
      /**
       * @private
       * @type {Map<Module, number>}
       * @type {OrderIndices}
       */
      this._modulePreOrderIndices = new Map();
      /** Indices in bottom-up order */
      /**
       * @private
       * @type {Map<Module, number>}
       * @type {OrderIndices}
       */
      this._modulePostOrderIndices = new Map();
      /** @type {number | undefined} */
@@ -108,7 +125,9 @@
   }
   /**
    * when a new chunk is added to a chunkGroup, addingOptions will occur.
    * Merges additional options into the chunk group.
    * Order-based options are combined by taking the higher priority, while
    * unsupported conflicts surface as an explicit error.
    * @param {ChunkGroupOptions} options the chunkGroup options passed to addOptions
    * @returns {void}
    */
@@ -141,7 +160,7 @@
   }
   /**
    * returns the name of current ChunkGroup
    * Returns the configured name of the chunk group, if one was assigned.
    * @returns {ChunkGroupOptions["name"]} returns the ChunkGroup name
    */
   get name() {
@@ -149,7 +168,7 @@
   }
   /**
    * sets a new name for current ChunkGroup
    * Updates the configured name of the chunk group.
    * @param {string | undefined} value the new name for ChunkGroup
    * @returns {void}
    */
@@ -159,7 +178,8 @@
   /* istanbul ignore next */
   /**
    * get a uniqueId for ChunkGroup, made up of its member Chunk debugId's
    * Returns a debug-only identifier derived from the group's member chunk
    * debug ids. This is primarily useful in diagnostics and assertions.
    * @returns {string} a unique concatenation of chunk debugId's
    */
   get debugId() {
@@ -167,7 +187,8 @@
   }
   /**
    * get a unique id for ChunkGroup, made up of its member Chunk id's
    * Returns an identifier derived from the ids of the chunks currently in
    * the group.
    * @returns {string} a unique concatenation of chunk ids
    */
   get id() {
@@ -175,7 +196,8 @@
   }
   /**
    * Performs an unshift of a specific chunk
    * Moves a chunk to the front of the group or inserts it when it is not
    * already present.
    * @param {Chunk} chunk chunk being unshifted
    * @returns {boolean} returns true if attempted chunk shift is accepted
    */
@@ -192,7 +214,8 @@
   }
   /**
    * inserts a chunk before another existing chunk in group
    * Inserts a chunk directly before another chunk that already belongs to the
    * group, preserving the rest of the ordering.
    * @param {Chunk} chunk Chunk being inserted
    * @param {Chunk} before Placeholder/target chunk marking new chunk insertion point
    * @returns {boolean} return true if insertion was successful
@@ -214,7 +237,7 @@
   }
   /**
    * add a chunk into ChunkGroup. Is pushed on or prepended
    * Appends a chunk to the group when it is not already a member.
    * @param {Chunk} chunk chunk being pushed into ChunkGroupS
    * @returns {boolean} returns true if chunk addition was successful.
    */
@@ -228,6 +251,8 @@
   }
   /**
    * Replaces one member chunk with another while preserving the group's
    * ordering and avoiding duplicates.
    * @param {Chunk} oldChunk chunk to be replaced
    * @param {Chunk} newChunk New chunk that will be replaced with
    * @returns {boolean | undefined} returns true if the replacement was successful
@@ -251,6 +276,7 @@
   }
   /**
    * Removes a chunk from this group.
    * @param {Chunk} chunk chunk to remove
    * @returns {boolean} returns true if chunk was removed
    */
@@ -264,6 +290,8 @@
   }
   /**
    * Indicates whether this chunk group is loaded as part of the initial page
    * load instead of being created lazily.
    * @returns {boolean} true, when this chunk group will be loaded on initial page load
    */
   isInitial() {
@@ -271,6 +299,7 @@
   }
   /**
    * Adds a child chunk group to the current group.
    * @param {ChunkGroup} group chunk group to add
    * @returns {boolean} returns true if chunk group was added
    */
@@ -281,6 +310,7 @@
   }
   /**
    * Returns the child chunk groups reachable from this group.
    * @returns {ChunkGroup[]} returns the children of this group
    */
   getChildren() {
@@ -296,6 +326,8 @@
   }
   /**
    * Removes a child chunk group and clears the corresponding parent link on
    * the removed child.
    * @param {ChunkGroup} group the chunk group to remove
    * @returns {boolean} returns true if the chunk group was removed
    */
@@ -310,6 +342,7 @@
   }
   /**
    * Records a parent chunk group relationship.
    * @param {ChunkGroup} parentChunk the parent group to be added into
    * @returns {boolean} returns true if this chunk group was added to the parent group
    */
@@ -322,6 +355,7 @@
   }
   /**
    * Returns the parent chunk groups that can lead to this group.
    * @returns {ChunkGroup[]} returns the parents of this group
    */
   getParents() {
@@ -333,6 +367,7 @@
   }
   /**
    * Checks whether the provided group is registered as a parent.
    * @param {ChunkGroup} parent the parent group
    * @returns {boolean} returns true if the parent group contains this group
    */
@@ -345,6 +380,7 @@
   }
   /**
    * Removes a parent chunk group and clears the reverse child relationship.
    * @param {ChunkGroup} chunkGroup the parent group
    * @returns {boolean} returns true if this group has been removed from the parent
    */
@@ -357,6 +393,7 @@
   }
   /**
    * Registers an async entrypoint that is rooted in this chunk group.
    * @param {Entrypoint} entrypoint entrypoint to add
    * @returns {boolean} returns true if entrypoint was added
    */
@@ -371,6 +408,7 @@
   }
   /**
    * Returns the async dependency blocks that create or reference this group.
    * @returns {AsyncDependenciesBlock[]} an array containing the blocks
    */
   getBlocks() {
@@ -382,6 +420,7 @@
   }
   /**
    * Checks whether an async dependency block is associated with this group.
    * @param {AsyncDependenciesBlock} block block
    * @returns {boolean} true, if block exists
    */
@@ -390,6 +429,7 @@
   }
   /**
    * Exposes the group's async dependency blocks as an iterable.
    * @returns {Iterable<AsyncDependenciesBlock>} blocks
    */
   get blocksIterable() {
@@ -397,6 +437,7 @@
   }
   /**
    * Associates an async dependency block with this chunk group.
    * @param {AsyncDependenciesBlock} block a block
    * @returns {boolean} false, if block was already added
    */
@@ -409,6 +450,8 @@
   }
   /**
    * Records where this chunk group originated from in user code.
    * The origin is used for diagnostics, ordering, and reporting.
    * @param {Module | null} module origin module
    * @param {DependencyLocation} loc location of the reference in the origin module
    * @param {string} request request name of the reference
@@ -423,9 +466,11 @@
   }
   /**
    * Collects the emitted files produced by every chunk in the group.
    * @returns {string[]} the files contained this chunk group
    */
   getFiles() {
      /** @type {Set<string>} */
      const files = new Set();
      for (const chunk of this.chunks) {
@@ -438,6 +483,9 @@
   }
   /**
    * Disconnects this group from its parents, children, and chunks.
    * Child groups are reconnected to this group's parents so the surrounding
    * graph remains intact after removal.
    * @returns {void}
    */
   remove() {
@@ -485,7 +533,7 @@
    * Sorting values are based off of number of chunks in ChunkGroup.
    * @param {ChunkGraph} chunkGraph the chunk graph
    * @param {ChunkGroup} otherGroup the chunkGroup to compare this against
    * @returns {-1|0|1} sort position for comparison
    * @returns {-1 | 0 | 1} sort position for comparison
    */
   compareTo(chunkGraph, otherGroup) {
      if (this.chunks.length > otherGroup.chunks.length) return -1;
@@ -497,12 +545,14 @@
   }
   /**
    * Groups child chunk groups by their `*Order` options and sorts each group
    * by descending order and deterministic chunk-group comparison.
    * @param {ModuleGraph} moduleGraph the module graph
    * @param {ChunkGraph} chunkGraph the chunk graph
    * @returns {Record<string, ChunkGroup[]>} mapping from children type to ordered list of ChunkGroups
    */
   getChildrenByOrders(moduleGraph, chunkGraph) {
      /** @type {Map<string, {order: number, group: ChunkGroup}[]>} */
      /** @type {Map<string, { order: number, group: ChunkGroup }[]>} */
      const lists = new Map();
      for (const childGroup of this._children) {
         for (const key of Object.keys(childGroup.options)) {
@@ -537,7 +587,7 @@
   }
   /**
    * Sets the top-down index of a module in this ChunkGroup
    * Stores the module's top-down traversal index within this group.
    * @param {Module} module module for which the index should be set
    * @param {number} index the index of the module
    * @returns {void}
@@ -547,7 +597,7 @@
   }
   /**
    * Gets the top-down index of a module in this ChunkGroup
    * Returns the module's top-down traversal index within this group.
    * @param {Module} module the module
    * @returns {number | undefined} index
    */
@@ -556,7 +606,7 @@
   }
   /**
    * Sets the bottom-up index of a module in this ChunkGroup
    * Stores the module's bottom-up traversal index within this group.
    * @param {Module} module module for which the index should be set
    * @param {number} index the index of the module
    * @returns {void}
@@ -566,7 +616,7 @@
   }
   /**
    * Gets the bottom-up index of a module in this ChunkGroup
    * Returns the module's bottom-up traversal index within this group.
    * @param {Module} module the module
    * @returns {number | undefined} index
    */