'use strict';
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.isInitialOrHasNoParents = isInitialOrHasNoParents;
|
|
exports.isInvalidOrder = isInvalidOrder;
|
|
exports.getOrder = getOrder;
|
|
exports.getLoaderObject = getLoaderObject;
|
|
exports.mergeOptions = mergeOptions;
|
|
exports.isString = isString;
|
|
exports.isFunction = isFunction;
|
|
exports.isType = isType;
|
|
/* eslint-disable
|
|
no-param-reassign
|
|
*/
|
|
function isInitialOrHasNoParents(chunk) {
|
|
let parentCount = 0;
|
|
|
|
for (const chunkGroup of chunk.groupsIterable) {
|
|
parentCount += chunkGroup.getNumberOfParents();
|
|
}
|
|
|
|
return chunk.isOnlyInitial() || parentCount === 0;
|
|
}
|
|
|
|
function isInvalidOrder(a, b) {
|
|
// Async chunks' modules don't get turned into ExtractedModule
|
|
// instances for some reason. This is a temporary fix that
|
|
// moves the isInvalidOrder check inside a condition.
|
|
if (a.getPrevModules && b.getPrevModules) {
|
|
const bBeforeA = a.getPrevModules().indexOf(b) >= 0;
|
|
const aBeforeB = b.getPrevModules().indexOf(a) >= 0;
|
|
|
|
return aBeforeB && bBeforeA;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
function getOrder(a, b) {
|
|
// Async chunks' modules don't get turned into ExtractedModule
|
|
// instances for some reason. This is a temporary fix that
|
|
// moves the custom sorting logic inside a condition.
|
|
if (a.getOriginalModule && b.getOriginalModule) {
|
|
const aOrder = a.getOrder();
|
|
const bOrder = b.getOrder();
|
|
if (aOrder < bOrder) return -1;
|
|
if (aOrder > bOrder) return 1;
|
|
|
|
// We are trying to use the underlying index2 property
|
|
// of the original module, but this property seems
|
|
// to be set to null most of the time. It makes
|
|
// sorting with it pointless. We should look
|
|
// into saving the index, index2 and depth
|
|
// props (maybe inside ExtractedModule).
|
|
const aIndex = a.getOriginalModule().index2;
|
|
const bIndex = b.getOriginalModule().index2;
|
|
if (aIndex < bIndex) return -1;
|
|
if (aIndex > bIndex) return 1;
|
|
|
|
const bBeforeA = a.getPrevModules().indexOf(b) >= 0;
|
|
const aBeforeB = b.getPrevModules().indexOf(a) >= 0;
|
|
if (aBeforeB && !bBeforeA) return -1;
|
|
if (!aBeforeB && bBeforeA) return 1;
|
|
|
|
// Sorting by id is the default behavior of webpack
|
|
// and it keeps the modules in the correct order,
|
|
// except for async imports. That's the reason
|
|
// it is inside the conditional branch
|
|
if (a.id < b.id) return -1;
|
|
if (a.id > b.id) return 1;
|
|
}
|
|
|
|
// Sorting by identifier breaks the order of async imported
|
|
// modules either because webpack sorts them by default,
|
|
// or because they are processed in the correct order
|
|
// in the first place, or maybe because the modules
|
|
// aren't ExtractedModule instances in this case.
|
|
// Returning 0 keeps the already correct order.
|
|
/*
|
|
const ai = a.identifier();
|
|
const bi = b.identifier();
|
|
if (ai < bi) return -1;
|
|
if (ai > bi) return 1;
|
|
*/
|
|
|
|
return 0;
|
|
}
|
|
|
|
function getLoaderObject(loader) {
|
|
if (isString(loader)) {
|
|
return { loader };
|
|
}
|
|
return loader;
|
|
}
|
|
|
|
function mergeOptions(a, b) {
|
|
if (!b) return a;
|
|
Object.keys(b).forEach(key => {
|
|
a[key] = b[key];
|
|
});
|
|
return a;
|
|
}
|
|
|
|
function isString(a) {
|
|
return typeof a === 'string';
|
|
}
|
|
|
|
function isFunction(a) {
|
|
return typeof a === 'function';
|
|
}
|
|
|
|
function isType(type, obj) {
|
|
return Object.prototype.toString.call(obj) === `[object ${type}]`;
|
|
}
|