-
Notifications
You must be signed in to change notification settings - Fork 14
/
Copy pathindex.js
103 lines (97 loc) · 2.07 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
const percent = require('@does/percent');
const jsoncopy = require('jsoncopy');
const { moduleName } = require('./lib');
/**
* Chunkalyse stats file. for multiple entries fallback to children
* @param {Object} stats
* @return {Object}
*/
module.exports = stats => {
// Legacy: For single entry we use the more detailed 'modules' entry
const entries = Object.keys(stats.entrypoints || {});
if (entries.length === 1) {
return analyseModules(entries[0], stats);
}
if ('chunks' in stats) {
return analyseChunks(stats);
}
return stats.children.reduce(
(accumulator, child) => Object.assign(
accumulator,
analyseChunks(child),
),
{},
);
};
/**
* summarise chunks
* @param {Array} data.chunks
* @return {Object}
*/
const analyseChunks = ({ chunks }) => jsoncopy(chunks)
.reduce(
(accumulator, { names, size, modules }) => Object.assign(
accumulator,
{
[names.shift()]: {
size,
modules: Object.entries(
modules.reduce(
(accumulator, { name, size }) => Object.assign(
accumulator,
{
[moduleName(name)]: (accumulator[moduleName(name)] || 0) + size,
},
),
{},
),
).reduce(
(accumulator, [ name, _size ]) => Object.assign(
accumulator,
{
[name]: {
size: _size,
percent: percent(_size, size),
},
},
),
{},
),
},
},
),
{},
);
/**
* summarise modules
* @param {String} name
* @param {Array} data.modules
* @return {Object}
*/
const analyseModules = (name, { modules }, total = 0) => ({
[name]: {
modules: Object.entries(
jsoncopy(modules).reduce(
(accumulator, { name, size }) => (total = total + size) && Object.assign(
accumulator,
{
[moduleName(name)]: (accumulator[moduleName(name)] || 0) + size,
},
),
{},
),
).reduce(
(accumulator, [ name, size ]) => typeof size === 'number' ? Object.assign(
accumulator,
{
[name]: {
size,
percent: percent(size, total),
},
},
) : accumulator,
{},
),
size: total,
},
});