UNPKG

1.96 kBJavaScriptView Raw
1const {createWriteStream} = require('fs');
2const {Readable} = require('stream');
3
4class StatsSerializeStream extends Readable {
5 constructor(stats) {
6 super();
7 this._indentLevel = 0;
8 this._stringifier = this._stringify(stats);
9 }
10
11 get _indent() {
12 return ' '.repeat(this._indentLevel);
13 }
14
15 _read() {
16 let readMore = true;
17
18 while (readMore) {
19 const {value, done} = this._stringifier.next();
20
21 if (done) {
22 this.push(null);
23 readMore = false;
24 } else {
25 readMore = this.push(value);
26 }
27 }
28 }
29
30 * _stringify(obj) {
31 if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean' || obj === null) {
32 yield JSON.stringify(obj);
33 } else if (Array.isArray(obj)) {
34 yield '[';
35 this._indentLevel++;
36
37 let isFirst = true;
38 for (let item of obj) {
39 if (item === undefined) {
40 item = null;
41 }
42
43 yield `${isFirst ? '' : ','}\n${this._indent}`;
44 yield* this._stringify(item);
45 isFirst = false;
46 }
47
48 this._indentLevel--;
49 yield obj.length ? `\n${this._indent}]` : ']';
50 } else {
51 yield '{';
52 this._indentLevel++;
53
54 let isFirst = true;
55 const entries = Object.entries(obj);
56 for (const [itemKey, itemValue] of entries) {
57 if (itemValue === undefined) {
58 continue;
59 }
60
61 yield `${isFirst ? '' : ','}\n${this._indent}${JSON.stringify(itemKey)}: `;
62 yield* this._stringify(itemValue);
63 isFirst = false;
64 }
65
66 this._indentLevel--;
67 yield entries.length ? `\n${this._indent}}` : '}';
68 }
69 }
70}
71
72exports.StatsSerializeStream = StatsSerializeStream;
73exports.writeStats = writeStats;
74
75async function writeStats(stats, filepath) {
76 return new Promise((resolve, reject) => {
77 new StatsSerializeStream(stats)
78 .on('end', resolve)
79 .on('error', reject)
80 .pipe(createWriteStream(filepath));
81 });
82}