webpack
Version:
Packs CommonJs/AMD modules for the browser. Allows to split your codebase into multiple bundles, which can be loaded on demand. Support loaders to preprocess files, i.e. json, jsx, es7, css, less, ... and your custom stuff.
65 lines (60 loc) • 1.79 kB
JavaScript
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Florent Cailhol @ooflorent
*/
;
/** @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;