123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- "use strict";
- const {
- createWriteStream
- } = require('fs');
- const {
- Readable
- } = require('stream');
- class StatsSerializeStream extends Readable {
- constructor(stats) {
- super();
- this._indentLevel = 0;
- this._stringifier = this._stringify(stats);
- }
- get _indent() {
- return ' '.repeat(this._indentLevel);
- }
- _read() {
- let readMore = true;
- while (readMore) {
- const {
- value,
- done
- } = this._stringifier.next();
- if (done) {
- this.push(null);
- readMore = false;
- } else {
- readMore = this.push(value);
- }
- }
- }
- *_stringify(obj) {
- if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean' || obj === null) {
- yield JSON.stringify(obj);
- } else if (Array.isArray(obj)) {
- yield '[';
- this._indentLevel++;
- let isFirst = true;
- for (let item of obj) {
- if (item === undefined) {
- item = null;
- }
- yield `${isFirst ? '' : ','}\n${this._indent}`;
- yield* this._stringify(item);
- isFirst = false;
- }
- this._indentLevel--;
- yield obj.length ? `\n${this._indent}]` : ']';
- } else {
- yield '{';
- this._indentLevel++;
- let isFirst = true;
- const entries = Object.entries(obj);
- for (const [itemKey, itemValue] of entries) {
- if (itemValue === undefined) {
- continue;
- }
- yield `${isFirst ? '' : ','}\n${this._indent}${JSON.stringify(itemKey)}: `;
- yield* this._stringify(itemValue);
- isFirst = false;
- }
- this._indentLevel--;
- yield entries.length ? `\n${this._indent}}` : '}';
- }
- }
- }
- exports.StatsSerializeStream = StatsSerializeStream;
- exports.writeStats = writeStats;
- async function writeStats(stats, filepath) {
- return new Promise((resolve, reject) => {
- new StatsSerializeStream(stats).on('end', resolve).on('error', reject).pipe(createWriteStream(filepath));
- });
- }
|