| 
									
										
										
										
											2019-04-23 20:50:11 +02:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @license | 
					
						
							| 
									
										
										
										
											2020-05-19 12:08:49 -07:00
										 |  |  |  * Copyright Google LLC All Rights Reserved. | 
					
						
							| 
									
										
										
										
											2019-04-23 20:50:11 +02: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 16:40:21 -07: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 20:50:11 +02: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; | 
					
						
							|  |  |  | } |