| /* |
| MIT License http://www.opensource.org/licenses/mit-license.php |
| Author Florent Cailhol @ooflorent |
| */ |
| "use strict"; |
| |
| /** @typedef {import("../Module")} Module */ |
| |
| class DependencyReference { |
| // TODO webpack 5: module must be dynamic, you must pass a function returning a module |
| // This is needed to remove the hack in ConcatenatedModule |
| // The problem is that the `module` in Dependency could be replaced i. e. because of Scope Hoisting |
| /** |
| * |
| * @param {Module} module the referenced module |
| * @param {string[] | boolean} importedNames imported named from the module |
| * @param {boolean=} weak if this is a weak reference |
| * @param {number} order the order information or NaN if don't care |
| */ |
| constructor(module, importedNames, weak = false, order = NaN) { |
| // TODO webpack 5: make it a getter |
| this.module = module; |
| // true: full object |
| // false: only sideeffects/no export |
| // array of strings: the exports with this names |
| this.importedNames = importedNames; |
| this.weak = !!weak; |
| this.order = order; |
| } |
| |
| /** |
| * @param {DependencyReference[]} array an array (will be modified) |
| * @returns {DependencyReference[]} the array again |
| */ |
| static sort(array) { |
| /** @type {WeakMap<DependencyReference, number>} */ |
| const originalOrder = new WeakMap(); |
| let i = 0; |
| for (const ref of array) { |
| originalOrder.set(ref, i++); |
| } |
| return array.sort((a, b) => { |
| const aOrder = a.order; |
| const bOrder = b.order; |
| if (isNaN(aOrder)) { |
| if (!isNaN(bOrder)) { |
| return 1; |
| } |
| } else { |
| if (isNaN(bOrder)) { |
| return -1; |
| } |
| if (aOrder !== bOrder) { |
| return aOrder - bOrder; |
| } |
| } |
| const aOrg = originalOrder.get(a); |
| const bOrg = originalOrder.get(b); |
| return aOrg - bOrg; |
| }); |
| } |
| } |
| |
| module.exports = DependencyReference; |