1 |
|
2 |
|
3 | import type {Asset, BundleGraph} from '@parcel/types';
|
4 | import nullthrows from 'nullthrows';
|
5 |
|
6 | export type BundleReport = {|
|
7 | bundles: Array<{|
|
8 | filePath: string,
|
9 | size: number,
|
10 | time: number,
|
11 | largestAssets: Array<{filePath: string, size: number, time: number}>,
|
12 | totalAssets: number
|
13 | |}>
|
14 | |};
|
15 |
|
16 | export default function generateBundleReport(
|
17 | bundleGraph: BundleGraph,
|
18 | largestAssetCount: number = 10
|
19 | ): BundleReport {
|
20 | let bundles = [];
|
21 | bundleGraph.traverseBundles(bundle => {
|
22 | bundles.push(bundle);
|
23 | });
|
24 | bundles.sort((a, b) => b.stats.size - a.stats.size);
|
25 |
|
26 | return {
|
27 | bundles: bundles.map(bundle => {
|
28 | let assets: Array<Asset> = [];
|
29 | bundle.traverseAssets(asset => {
|
30 | assets.push(asset);
|
31 | });
|
32 | assets.sort((a, b) => b.stats.size - a.stats.size);
|
33 |
|
34 | return {
|
35 | filePath: nullthrows(bundle.filePath),
|
36 | size: bundle.stats.size,
|
37 | time: bundle.stats.time,
|
38 | largestAssets: assets.slice(0, largestAssetCount).map(asset => ({
|
39 | filePath: asset.filePath,
|
40 | size: asset.stats.size,
|
41 | time: asset.stats.time
|
42 | })),
|
43 | totalAssets: assets.length
|
44 | };
|
45 | })
|
46 | };
|
47 | }
|