| | |
| | | /** @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 |
| | |
| | | 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 |
| | |
| | | * 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; |
| | |
| | | }; |
| | | |
| | | /** |
| | | * 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() : ""; |
| | |
| | | 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) { |
| | |
| | | } |
| | | /** @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} */ |
| | |
| | | } |
| | | |
| | | /** |
| | | * 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} |
| | | */ |
| | |
| | | } |
| | | |
| | | /** |
| | | * 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() { |
| | |
| | | } |
| | | |
| | | /** |
| | | * 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} |
| | | */ |
| | |
| | | |
| | | /* 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() { |
| | |
| | | } |
| | | |
| | | /** |
| | | * 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() { |
| | |
| | | } |
| | | |
| | | /** |
| | | * 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 |
| | | */ |
| | |
| | | } |
| | | |
| | | /** |
| | | * 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 |
| | |
| | | } |
| | | |
| | | /** |
| | | * 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. |
| | | */ |
| | |
| | | } |
| | | |
| | | /** |
| | | * 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 |
| | |
| | | } |
| | | |
| | | /** |
| | | * Removes a chunk from this group. |
| | | * @param {Chunk} chunk chunk to remove |
| | | * @returns {boolean} returns true if chunk was removed |
| | | */ |
| | |
| | | } |
| | | |
| | | /** |
| | | * 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() { |
| | |
| | | } |
| | | |
| | | /** |
| | | * 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 |
| | | */ |
| | |
| | | } |
| | | |
| | | /** |
| | | * Returns the child chunk groups reachable from this group. |
| | | * @returns {ChunkGroup[]} returns the children of this group |
| | | */ |
| | | getChildren() { |
| | |
| | | } |
| | | |
| | | /** |
| | | * 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 |
| | | */ |
| | |
| | | } |
| | | |
| | | /** |
| | | * 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 |
| | | */ |
| | |
| | | } |
| | | |
| | | /** |
| | | * Returns the parent chunk groups that can lead to this group. |
| | | * @returns {ChunkGroup[]} returns the parents of this group |
| | | */ |
| | | getParents() { |
| | |
| | | } |
| | | |
| | | /** |
| | | * 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 |
| | | */ |
| | |
| | | } |
| | | |
| | | /** |
| | | * 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 |
| | | */ |
| | |
| | | } |
| | | |
| | | /** |
| | | * 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 |
| | | */ |
| | |
| | | } |
| | | |
| | | /** |
| | | * Returns the async dependency blocks that create or reference this group. |
| | | * @returns {AsyncDependenciesBlock[]} an array containing the blocks |
| | | */ |
| | | getBlocks() { |
| | |
| | | } |
| | | |
| | | /** |
| | | * Checks whether an async dependency block is associated with this group. |
| | | * @param {AsyncDependenciesBlock} block block |
| | | * @returns {boolean} true, if block exists |
| | | */ |
| | |
| | | } |
| | | |
| | | /** |
| | | * Exposes the group's async dependency blocks as an iterable. |
| | | * @returns {Iterable<AsyncDependenciesBlock>} blocks |
| | | */ |
| | | get blocksIterable() { |
| | |
| | | } |
| | | |
| | | /** |
| | | * Associates an async dependency block with this chunk group. |
| | | * @param {AsyncDependenciesBlock} block a block |
| | | * @returns {boolean} false, if block was already added |
| | | */ |
| | |
| | | } |
| | | |
| | | /** |
| | | * 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 |
| | |
| | | } |
| | | |
| | | /** |
| | | * 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) { |
| | |
| | | } |
| | | |
| | | /** |
| | | * 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() { |
| | |
| | | * 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; |
| | |
| | | } |
| | | |
| | | /** |
| | | * 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)) { |
| | |
| | | } |
| | | |
| | | /** |
| | | * 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} |
| | |
| | | } |
| | | |
| | | /** |
| | | * 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 |
| | | */ |
| | |
| | | } |
| | | |
| | | /** |
| | | * 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} |
| | |
| | | } |
| | | |
| | | /** |
| | | * 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 |
| | | */ |