in build/src/utils/config.js [331:427]
function getSortedDefinitionBuildList(page, pageTotal, definitionsToSkip) {
page = page || 1;
pageTotal = pageTotal || 1;
definitionsToSkip = definitionsToSkip || [];
// Bucket definitions by parent
const parentBuckets = {};
const dupeBuckets = [];
const noParentList = [];
let total = 0;
for (let definitionId in config.definitionBuildSettings) {
// If paged build, ensure this definition should be included
if (typeof config.definitionBuildSettings[definitionId] === 'object') {
if (definitionsToSkip.indexOf(definitionId) < 0) {
let parentId = config.definitionBuildSettings[definitionId].parent;
if (parentId) {
// if multi-parent, merge the buckets
if (typeof parentId !== 'string') {
parentId = createMultiParentBucket(parentId, parentBuckets, dupeBuckets);
}
bucketDefinition(definitionId, parentId, parentBuckets);
} else {
noParentList.push(definitionId);
}
total++;
} else {
console.log(`(*) Skipping ${definitionId}.`)
}
}
}
// Remove duplicate buckets that are no longer needed
dupeBuckets.forEach((currentBucketId) => {
parentBuckets[currentBucketId] = undefined;
});
// Remove parents from no parent list - they are in their buckets already
for (let parentId in parentBuckets) {
if (parentId) {
noParentList.splice(noParentList.indexOf(parentId), 1);
}
}
const allPages = [];
let pageTotalMinusDedicatedPages = pageTotal;
// Remove items that need their own buckets and add the buckets
if (config.needsDedicatedPage) {
// Remove skipped items from list that needs dedicated page
const filteredNeedsDedicatedPage = config.needsDedicatedPage.reduce((prev, current) => (definitionsToSkip.indexOf(current) < 0 ? prev.concat(current) : prev), []);
if (pageTotal > filteredNeedsDedicatedPage.length) {
pageTotalMinusDedicatedPages = pageTotal - filteredNeedsDedicatedPage.length;
filteredNeedsDedicatedPage.forEach((definitionId) => {
allPages.push([definitionId]);
const definitionIndex = noParentList.indexOf(definitionId);
if (definitionIndex > -1) {
noParentList.splice(definitionIndex, 1);
total--;
}
});
} else {
console.log(`(!) Not enough pages to give dedicated pages to ${JSON.stringify(filteredNeedsDedicatedPage, null, 4)}. Adding them to other pages.`);
}
}
// Create pages and distribute entries with no parents
const pageSize = Math.floor(total / pageTotalMinusDedicatedPages);
for (let bucketId in parentBuckets) {
let bucket = parentBuckets[bucketId];
if (typeof bucket === 'object') {
if (noParentList.length > 0 && bucket.length < pageSize) {
const toConcat = noParentList.splice(0, pageSize - bucket.length);
bucket = bucket.concat(toConcat);
}
allPages.push(bucket);
}
}
while (noParentList.length > 0) {
const noParentPage = noParentList.splice(0, noParentList.length > pageSize ? pageSize : noParentList.length);
allPages.push(noParentPage);
}
if (allPages.length > pageTotal) {
// If too many pages, add extra pages to last one
console.log(`(!) Not enough pages to for target page size. Adding excess definitions to last page.`);
for (let i = pageTotal; i < allPages.length; i++) {
allPages[pageTotal - 1] = allPages[pageTotal - 1].concat(allPages[i]);
allPages.splice(i, 1);
}
} else if (allPages.length < pageTotal) {
// If too few, add some empty pages
for (let i = allPages.length; i < pageTotal; i++) {
allPages.push([]);
}
}
console.log(`(*) Builds paginated as follows: ${JSON.stringify(allPages, null, 4)}\n(*) Processing page ${page} of ${pageTotal}.\n`);
return allPages[page - 1];
}