* Gets modules in order. * @param {Chunk} chunk chunk * @param {Iterable<Module> | undefined} modules unordered modules * @param {Compilation} compilation compilation * @returns {Module[]} ordered modules
(chunk, modules, compilation)
| 694 | * @returns {Module[]} ordered modules |
| 695 | */ |
| 696 | getModulesInOrder(chunk, modules, compilation) { |
| 697 | if (!modules) return []; |
| 698 | |
| 699 | /** @type {Module[]} */ |
| 700 | const modulesList = [...modules]; |
| 701 | |
| 702 | // Get ordered list of modules per chunk group |
| 703 | // Lists are in reverse order to allow to use Array.pop() |
| 704 | const modulesByChunkGroup = Array.from( |
| 705 | chunk.groupsIterable, |
| 706 | (chunkGroup) => { |
| 707 | const sortedModules = modulesList |
| 708 | .map((module) => ({ |
| 709 | module, |
| 710 | index: chunkGroup.getModulePostOrderIndex(module) |
| 711 | })) |
| 712 | .filter((item) => item.index !== undefined) |
| 713 | .sort( |
| 714 | (a, b) => |
| 715 | /** @type {number} */ (b.index) - /** @type {number} */ (a.index) |
| 716 | ) |
| 717 | .map((item) => item.module); |
| 718 | |
| 719 | return { list: sortedModules, set: new Set(sortedModules) }; |
| 720 | } |
| 721 | ); |
| 722 | |
| 723 | if (modulesByChunkGroup.length === 1) { |
| 724 | return modulesByChunkGroup[0].list.reverse(); |
| 725 | } |
| 726 | |
| 727 | const boundCompareModulesByFullName = compareModulesByFullName( |
| 728 | compilation.compiler |
| 729 | ); |
| 730 | |
| 731 | /** |
| 732 | * Compares module lists. |
| 733 | * @param {{ list: Module[] }} a a |
| 734 | * @param {{ list: Module[] }} b b |
| 735 | * @returns {-1 | 0 | 1} result |
| 736 | */ |
| 737 | const compareModuleLists = ({ list: a }, { list: b }) => { |
| 738 | if (a.length === 0) { |
| 739 | return b.length === 0 ? 0 : 1; |
| 740 | } |
| 741 | if (b.length === 0) return -1; |
| 742 | return boundCompareModulesByFullName(a[a.length - 1], b[b.length - 1]); |
| 743 | }; |
| 744 | |
| 745 | modulesByChunkGroup.sort(compareModuleLists); |
| 746 | |
| 747 | /** @type {Module[]} */ |
| 748 | const finalModules = []; |
| 749 | |
| 750 | for (;;) { |
| 751 | /** @type {Set<Module>} */ |
| 752 | const failedModules = new Set(); |
| 753 | const list = modulesByChunkGroup[0].list; |
no test coverage detected