"use strict"; // Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. // See LICENSE in the project root for license information. Object.defineProperty(exports, "__esModule", { value: true }); exports.StdioSummarizer = void 0; const ITerminalChunk_1 = require("./ITerminalChunk"); const TerminalWritable_1 = require("./TerminalWritable"); /** * Summarizes the results of a failed build task by returning a subset of `stderr` output not to exceed * a specified maximum number of lines. * * @remarks * IMPORTANT: This transform assumes that its input was prepared by {@link StderrLineTransform}, so that each * {@link ITerminalChunk.text} item is a single line terminated by a `"\n"` character. * * The {@link IStdioSummarizerOptions.leadingLines} and {@link IStdioSummarizerOptions.trailingLines} * counts specify the maximum number of lines to be returned. Any additional lines will be omitted. * For example, if `leadingLines` and `trailingLines` were set to `3`, then the summary of 16 `stderr` lines might * look like this: * * ``` * Line 1 * Line 2 * Line 3 * ...10 lines omitted... * Line 14 * Line 15 * Line 16 * ``` * * If the `stderr` output is completely empty, then the `stdout` output will be summarized instead. * * @beta */ class StdioSummarizer extends TerminalWritable_1.TerminalWritable { constructor(options) { super(options); this._abridgedOmittedLines = 0; if (!options) { options = {}; } this._leadingLines = options.leadingLines !== undefined ? options.leadingLines : 10; this._trailingLines = options.trailingLines !== undefined ? options.trailingLines : 10; this._abridgedLeading = []; this._abridgedTrailing = []; this._abridgedStderr = false; } /** * Returns the summary report. * * @remarks * The `close()` method must be called before `getReport()` can be used. */ getReport() { if (this.isOpen) { throw new Error('The summary cannot be prepared until after close() is called.'); } const report = [...this._abridgedLeading]; if (this._abridgedOmittedLines === 1) { report.push(` ...${this._abridgedOmittedLines} line omitted...\n`); } if (this._abridgedOmittedLines > 1) { report.push(` ...${this._abridgedOmittedLines} lines omitted...\n`); } report.push(...this._abridgedTrailing); return report.join(''); } onWriteChunk(chunk) { if (chunk.text.length === 0 || chunk.text[chunk.text.length - 1] !== '\n') { throw new Error('StdioSummarizer expects chunks that were separated parsed into lines by StderrLineTransform\n' + ' Invalid input: ' + JSON.stringify(chunk.text)); } if (chunk.kind === ITerminalChunk_1.TerminalChunkKind.Stderr && !this._abridgedStderr) { // The first time we see stderr, switch to capturing stderr this._abridgedStderr = true; this._abridgedLeading.length = 0; this._abridgedTrailing.length = 0; this._abridgedOmittedLines = 0; } else if (this._abridgedStderr && chunk.kind !== ITerminalChunk_1.TerminalChunkKind.Stderr) { // If we're capturing stderr, then ignore non-stderr input return; } // Did we capture enough leading lines? if (this._abridgedLeading.length < this._leadingLines) { this._abridgedLeading.push(chunk.text); return; } this._abridgedTrailing.push(chunk.text); // If we captured to many trailing lines, omit the extras while (this._abridgedTrailing.length > this._trailingLines) { this._abridgedTrailing.shift(); ++this._abridgedOmittedLines; } } } exports.StdioSummarizer = StdioSummarizer; //# sourceMappingURL=StdioSummarizer.js.map