File: /var/www/design.system/node_modules/@rushstack/terminal/lib/StdioSummarizer.js
"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