-
Notifications
You must be signed in to change notification settings - Fork 0
/
webpack-ncdu.js
75 lines (64 loc) · 1.51 KB
/
webpack-ncdu.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
const fs = require("fs");
class NcduEntry {
/** @type {string} */
name;
/** @type {number} */
asize;
/** @type {number} */
dsize;
/** @type {number} */
ino;
/** @type {number} */
dev;
}
class NcduDirectory {
/** @type {name} */
name;
/** @type {NcduEntry} */
entry;
/** @type {Record<string, NcduDirectory} */
children = {};
/**
* @param {string} name
*/
constructor(name) {
this.name = name;
}
/**
* @param {string} name
* @returns {NcduDirectory}
*/
getOrCreate(name) {
return (this.children[name] =
this.children[name] || new NcduDirectory(name));
}
toJSON() {
const entry = this.entry || { name: this.name };
const children = Object.values(this.children).map((c) => c.toJSON());
return children.length ? [entry, ...children] : entry;
}
}
class Ncdu {
root = new NcduDirectory("/");
toJSON() {
return [
1,
1,
{ progname: __filename, progver: "1.15.1", timestamp: Date.now() },
this.root,
];
}
}
const ncdu = new Ncdu();
const stdinBuffer = fs.readFileSync(0); // STDIN_FILENO = 0
/** @type {webpack.Stats} */
const stats = JSON.parse(stdinBuffer.toString());
stats.modules.forEach((module) => {
const path = module.name.split("/");
const entry = path.reduce((dir, name) => dir.getOrCreate(name), ncdu.root);
entry.entry = new NcduEntry();
entry.entry.name = path[path.length - 1];
entry.entry.dsize = module.size;
entry.entry.ino = module.id;
});
console.log(JSON.stringify(ncdu, undefined, 2));