UNPKG

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