2019-04-23 14:50:11 -04:00
|
|
|
/**
|
|
|
|
* @license
|
2020-05-19 15:08:49 -04:00
|
|
|
* Copyright Google LLC All Rights Reserved.
|
2019-04-23 14:50:11 -04:00
|
|
|
*
|
|
|
|
* Use of this source code is governed by an MIT-style license that can be
|
|
|
|
* found in the LICENSE file at https://angular.io/license
|
|
|
|
*/
|
|
|
|
|
|
|
|
export interface DirectorySizeEntry {
|
|
|
|
size: number;
|
|
|
|
[filePath: string]: DirectorySizeEntry|number;
|
|
|
|
}
|
|
|
|
|
|
|
|
export interface FileSizeData {
|
|
|
|
unmapped: number;
|
|
|
|
files: DirectorySizeEntry;
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Returns a new file size data sorted by keys in ascending alphabetical order. */
|
|
|
|
export function sortFileSizeData({unmapped, files}: FileSizeData): FileSizeData {
|
|
|
|
return {unmapped, files: _sortDirectorySizeEntryObject(files)};
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Gets the name of all child size entries of the specified one. */
|
|
|
|
export function getChildEntryNames(entry: DirectorySizeEntry): string[] {
|
|
|
|
// The "size" property is reserved for the stored size value.
|
|
|
|
return Object.keys(entry).filter(key => key !== 'size');
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Returns the first size-entry that has multiple children. This is also known as
|
|
|
|
* the omitting of the common path prefix.
|
|
|
|
* */
|
|
|
|
export function omitCommonPathPrefix(entry: DirectorySizeEntry): DirectorySizeEntry {
|
|
|
|
let current: DirectorySizeEntry = entry;
|
|
|
|
while (getChildEntryNames(current).length === 1) {
|
|
|
|
const newChild = current[getChildEntryNames(current)[0]];
|
|
|
|
// Only omit the current node if it is a size entry. In case the new
|
|
|
|
// child is a holding a number, then this is a file and we don'twant
|
|
|
|
// to incorrectly omit the leaf file entries.
|
|
|
|
if (typeof newChild === 'number') {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
current = newChild;
|
|
|
|
}
|
|
|
|
return current;
|
|
|
|
}
|
|
|
|
|
|
|
|
function _sortDirectorySizeEntryObject(oldObject: DirectorySizeEntry): DirectorySizeEntry {
|
2020-04-13 19:40:21 -04:00
|
|
|
return Object.keys(oldObject).sort(_sortSizeEntryKeys).reduce((result, key) => {
|
|
|
|
if (typeof oldObject[key] === 'number') {
|
|
|
|
result[key] = oldObject[key];
|
|
|
|
} else {
|
|
|
|
result[key] = _sortDirectorySizeEntryObject(oldObject[key] as DirectorySizeEntry);
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}, {} as DirectorySizeEntry);
|
2019-04-23 14:50:11 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
function _sortSizeEntryKeys(a: string, b: string) {
|
|
|
|
// The "size" property should always be the first item in the size entry.
|
|
|
|
// This makes it easier to inspect the size of an entry in the golden.
|
|
|
|
if (a === 'size') {
|
|
|
|
return -1;
|
|
|
|
} else if (a < b) {
|
|
|
|
return -1;
|
|
|
|
} else if (a > b) {
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|