UNPKG

detox

Version:

E2E tests and automation for mobile

73 lines (57 loc) 1.95 kB
const fs = require('fs'); const { PassThrough } = require('stream'); const bunyanDebugStream = require('bunyan-debug-stream'); const multiSort = require('multi-sort-stream'); const pipe = require('multipipe'); const stripAnsi = require('strip-ansi'); const DetoxJSONLParser = require('./DetoxJSONLParser'); const { mapTransform, through } = require('./transformers'); class BunyanTransformer { /** * @param {Detox.Logger} log */ constructor(log) { this._jsonlParser = new DetoxJSONLParser(log); } /** * @param {string[]} logFilePaths */ uniteSessionLogs(logFilePaths) { const intermediate = mapTransform(BunyanTransformer.normalizeBunyanRecord); const reemitError = (err) => intermediate.emit('error', err); const jsonlStreams = logFilePaths.map(filePath => { const { readable, writable } = this._jsonlParser.createTransformer(); fs.createReadStream(filePath) .on('error', reemitError) .pipe(writable); return readable; }); const multisorted = multiSort(jsonlStreams, BunyanTransformer.compareTimestamps); return pipe(multisorted, intermediate, through()); } createPlainTransformer(bunyanOptions) { /** @type {*} */ const readable = new PassThrough({ encoding: 'utf8', objectMode: false }); const writable = bunyanDebugStream.default({ ...bunyanOptions, colors: false, out: readable, }); writable.on('error', /* istanbul ignore next */ (err) => readable.emit('error', err)); writable.on('finish', () => readable.end()); return { writable, readable, }; } static normalizeBunyanRecord(record) { const value = record.value; value.msg = stripAnsi(value.msg); value.time = new Date(value.time); return value; } static compareTimestamps(a, b) { return +(a.value.time > b.value.time) - +(a.value.time < b.value.time); } } module.exports = BunyanTransformer;