From 34470e6ed5d24af13a0b49194fa179c43e852f5a Mon Sep 17 00:00:00 2001 From: Bharat Middha <5100938+bmiddha@users.noreply.github.com> Date: Mon, 29 Sep 2025 16:39:57 -0700 Subject: [PATCH 1/6] ProblemCollector.onProblem --- common/reviews/api/terminal.api.md | 1 + libraries/terminal/src/ProblemCollector.ts | 10 +- .../src/test/ProblemCollector.test.ts | 144 +++++++++++------- 3 files changed, 99 insertions(+), 56 deletions(-) diff --git a/common/reviews/api/terminal.api.md b/common/reviews/api/terminal.api.md index 32147a273f5..01a53e06867 100644 --- a/common/reviews/api/terminal.api.md +++ b/common/reviews/api/terminal.api.md @@ -154,6 +154,7 @@ export interface IProblemCollector { export interface IProblemCollectorOptions extends ITerminalWritableOptions { matcherJson?: IProblemMatcherJson[]; matchers?: IProblemMatcher[]; + onProblem?: (problem: IProblem) => void; } // @public diff --git a/libraries/terminal/src/ProblemCollector.ts b/libraries/terminal/src/ProblemCollector.ts index 79efb2ed3a3..4680500fc0a 100644 --- a/libraries/terminal/src/ProblemCollector.ts +++ b/libraries/terminal/src/ProblemCollector.ts @@ -22,6 +22,10 @@ export interface IProblemCollectorOptions extends ITerminalWritableOptions { * {@link @rushstack/problem-matcher#IProblemMatcher | IProblemMatcher} definitions. */ matcherJson?: IProblemMatcherJson[]; + /** + * Optional callback invoked immediately whenever a problem is produced. + */ + onProblem?: (problem: IProblem) => void; } /** @@ -33,11 +37,12 @@ export interface IProblemCollectorOptions extends ITerminalWritableOptions { * by a `"\n"` character (for example when preceded by {@link StderrLineTransform} / `StdioLineTransform`). * If a chunk does not end with a newline an error is thrown to surface incorrect pipeline wiring early. * - * @beta + * @public */ export class ProblemCollector extends TerminalWritable implements IProblemCollector { private readonly _matchers: IProblemMatcher[]; private readonly _problems: Set = new Set(); + private readonly _onProblem: ((problem: IProblem) => void) | undefined; public constructor(options: IProblemCollectorOptions) { super(options); @@ -57,6 +62,7 @@ export class ProblemCollector extends TerminalWritable implements IProblemCollec if (this._matchers.length === 0) { throw new Error('ProblemCollector requires at least one problem matcher.'); } + this._onProblem = options.onProblem; } /** @@ -87,6 +93,7 @@ export class ProblemCollector extends TerminalWritable implements IProblemCollec matcherName: matcher.name }; this._problems.add(finalized); + this._onProblem?.(finalized); } } } @@ -105,6 +112,7 @@ export class ProblemCollector extends TerminalWritable implements IProblemCollec matcherName: matcher.name }; this._problems.add(finalized); + this._onProblem?.(finalized); } } } diff --git a/libraries/terminal/src/test/ProblemCollector.test.ts b/libraries/terminal/src/test/ProblemCollector.test.ts index eacf96031d6..efc513beb95 100644 --- a/libraries/terminal/src/test/ProblemCollector.test.ts +++ b/libraries/terminal/src/test/ProblemCollector.test.ts @@ -28,8 +28,10 @@ class ErrorLineMatcher implements IProblemMatcher { describe('ProblemCollector', () => { it('collects a simple error line', () => { + const onProblemSpy = jest.fn(); const collector: ProblemCollector = new ProblemCollector({ - matchers: [new ErrorLineMatcher()] + matchers: [new ErrorLineMatcher()], + onProblem: onProblemSpy }); collector.writeChunk({ kind: TerminalChunkKind.Stdout, text: 'hello world\n' }); @@ -45,13 +47,17 @@ describe('ProblemCollector', () => { const { problems } = collector; expect(problems.size).toBe(2); - const [firstProblem, secondProblem] = Array.from(problems); - expect(firstProblem.message).toBe('something bad happened in stdout'); - expect(firstProblem.severity).toBe('error'); - expect(firstProblem.matcherName).toBe('errorLine'); - expect(secondProblem.message).toBe('something bad happened in stderr'); - expect(secondProblem.severity).toBe('error'); - expect(secondProblem.matcherName).toBe('errorLine'); + expect(onProblemSpy).toHaveBeenCalledTimes(2); + expect(onProblemSpy).toHaveBeenNthCalledWith(1, { + matcherName: 'errorLine', + message: 'something bad happened in stdout', + severity: 'error' + }); + expect(onProblemSpy).toHaveBeenNthCalledWith(2, { + matcherName: 'errorLine', + message: 'something bad happened in stderr', + severity: 'error' + }); }); }); @@ -70,16 +76,20 @@ describe('VSCodeProblemMatcherAdapter - additional location formats', () => { } satisfies IProblemMatcherJson; const matchers = parseProblemMatchersJson([matcherPattern]); - const collector = new ProblemCollector({ matchers }); + const onProblemSpy = jest.fn(); + const collector = new ProblemCollector({ matchers, onProblem: onProblemSpy }); collector.writeChunk({ kind: TerminalChunkKind.Stdout, text: 'src/a.c(10,5): something happened\n' }); collector.close(); const { problems } = collector; expect(problems.size).toBe(1); - const [firstProblem] = Array.from(problems); - expect(firstProblem.file).toBe('src/a.c'); - expect(firstProblem.line).toBe(10); - expect(firstProblem.column).toBe(5); - expect(firstProblem.message).toContain('something happened'); + expect(onProblemSpy).toHaveBeenCalledTimes(1); + expect(onProblemSpy).toHaveBeenCalledWith(1, { + matcherName: 'loc-group', + file: 'src/a.c', + line: 10, + column: 5, + message: 'something happened' + }); }); it('parses explicit endLine and endColumn groups', () => { @@ -99,18 +109,22 @@ describe('VSCodeProblemMatcherAdapter - additional location formats', () => { } satisfies IProblemMatcherJson; const matchers = parseProblemMatchersJson([matcherPattern]); - const collector = new ProblemCollector({ matchers }); + const onProblemSpy = jest.fn(); + const collector = new ProblemCollector({ matchers, onProblem: onProblemSpy }); collector.writeChunk({ kind: TerminalChunkKind.Stdout, text: 'lib/x.c(10,5,12,20): multi-line issue\n' }); collector.close(); const { problems } = collector; expect(problems.size).toBe(1); - const [firstProblem] = Array.from(problems); - expect(firstProblem.file).toBe('lib/x.c'); - expect(firstProblem.line).toBe(10); - expect(firstProblem.column).toBe(5); - expect(firstProblem.endLine).toBe(12); - expect(firstProblem.endColumn).toBe(20); - expect(firstProblem.message).toContain('multi-line issue'); + expect(onProblemSpy).toHaveBeenCalledTimes(1); + expect(onProblemSpy).toHaveBeenCalledWith(1, { + matcherName: 'end-range', + file: 'lib/x.c', + line: 10, + column: 5, + endLine: 12, + endColumn: 20, + message: 'multi-line issue' + }); }); }); @@ -131,7 +145,8 @@ describe('VSCodeProblemMatcherAdapter', () => { } satisfies IProblemMatcherJson; const matchers = parseProblemMatchersJson([matcherPattern]); - const collector = new ProblemCollector({ matchers }); + const onProblemSpy = jest.fn(); + const collector = new ProblemCollector({ matchers, onProblem: onProblemSpy }); collector.writeChunk({ kind: TerminalChunkKind.Stderr, text: "src/file.ts(10,5): error TS1005: ' ; ' expected\n" @@ -139,12 +154,16 @@ describe('VSCodeProblemMatcherAdapter', () => { collector.close(); const { problems } = collector; expect(problems.size).toBe(1); - const [firstProblem] = Array.from(problems); - expect(firstProblem.file).toBe('src/file.ts'); - expect(firstProblem.line).toBe(10); - expect(firstProblem.column).toBe(5); - expect(firstProblem.code).toBe('TS1005'); - expect(firstProblem.severity).toBe('error'); + expect(onProblemSpy).toHaveBeenCalledTimes(1); + expect(onProblemSpy).toHaveBeenCalledWith(1, { + matcherName: 'tsc-like', + file: 'src/file.ts', + line: 10, + column: 5, + code: 'TS1005', + severity: 'error', + message: "' ; ' expected" + }); }); it('converts and matches a multi-line pattern', () => { @@ -173,19 +192,23 @@ describe('VSCodeProblemMatcherAdapter', () => { ] } satisfies IProblemMatcherJson; const matchers = parseProblemMatchersJson([matcherPattern]); - const collector = new ProblemCollector({ matchers }); + const onProblemSpy = jest.fn(); + const collector = new ProblemCollector({ matchers, onProblem: onProblemSpy }); collector.writeChunk({ kind: TerminalChunkKind.Stdout, text: 'In file src/foo.c\n' }); collector.writeChunk({ kind: TerminalChunkKind.Stdout, text: 'Line 42, Col 7\n' }); collector.writeChunk({ kind: TerminalChunkKind.Stdout, text: 'error: something bad happened\n' }); collector.close(); const { problems } = collector; expect(problems.size).toBe(1); - const [firstProblem] = Array.from(problems); - expect(firstProblem.file).toBe('src/foo.c'); - expect(firstProblem.line).toBe(42); - expect(firstProblem.column).toBe(7); - expect(firstProblem.severity).toBe('error'); - expect(firstProblem.message).toContain('something bad'); + expect(onProblemSpy).toHaveBeenCalledTimes(1); + expect(onProblemSpy).toHaveBeenCalledWith(1, { + matcherName: 'multi', + file: 'src/foo.c', + line: 42, + column: 7, + severity: 'error', + message: 'something bad happened' + }); }); it('handles a multi-line pattern whose last pattern loops producing multiple problems', () => { @@ -226,7 +249,8 @@ describe('VSCodeProblemMatcherAdapter', () => { ]; const matchers = parseProblemMatchersJson([matcherPattern]); - const collector = new ProblemCollector({ matchers }); + const onProblemSpy = jest.fn(); + const collector = new ProblemCollector({ matchers, onProblem: onProblemSpy }); for (const line of errorLines) { collector.writeChunk({ kind: TerminalChunkKind.Stdout, text: line + '\n' }); } @@ -234,19 +258,19 @@ describe('VSCodeProblemMatcherAdapter', () => { const { problems } = collector; expect(problems.size).toBe(6); + expect(onProblemSpy).toHaveBeenCalledTimes(6); const problemLineNumbers: number[] = [9, 11, 19, 24, 26, 34]; - const problemsArray = Array.from(problems); for (let i = 0; i < 6; i++) { - const p = problemsArray[i]; - expect(p.file).toContain( - 'vscode-extensions/debug-certificate-manager-vscode-extension/src/certificates.ts' - ); - expect(p.line).toBe(problemLineNumbers[i]); - expect(p.column).toBe(3); // All sample lines have column 3 - expect(p.code).toBe('TS2578'); - expect(p.severity).toBe('error'); - expect(p.message).toContain('Unused @ts-expect-error directive.'); + expect(onProblemSpy).toHaveBeenNthCalledWith(i + 1, { + matcherName: 'ts-loop-errors', + file: 'vscode-extensions/debug-certificate-manager-vscode-extension/src/certificates.ts', + line: problemLineNumbers[i], + column: 3, + code: 'TS2578', + severity: 'error', + message: 'Unused @ts-expect-error directive.' + }); } }); @@ -280,19 +304,29 @@ describe('VSCodeProblemMatcherAdapter', () => { ]; const matchers = parseProblemMatchersJson([matcherPattern]); - const collector = new ProblemCollector({ matchers }); + const onProblemSpy = jest.fn(); + const collector = new ProblemCollector({ matchers, onProblem: onProblemSpy }); collector.writeChunk({ kind: TerminalChunkKind.Stdout, text: 'Start Problems\n' }); for (const l of lines) collector.writeChunk({ kind: TerminalChunkKind.Stdout, text: l + '\n' }); collector.close(); const { problems } = collector; expect(problems.size).toBe(4); + expect(onProblemSpy).toHaveBeenCalledTimes(4); - const problemsArray = Array.from(problems); - expect(problemsArray.map((p) => p.severity)).toEqual(['error', 'warning', 'error', 'info']); - expect(problemsArray.map((p) => p.code)).toEqual(['CODE100', 'CODE200', 'CODE300', 'CODE400']); - expect(problemsArray[0].file).toBe('lib/a.ts'); - expect(problemsArray[1].file).toBe('lib/b.ts'); - expect(problemsArray[2].file).toBe('lib/c.ts'); - expect(problemsArray[3].file).toBe('lib/d.ts'); + const problemCodes: string[] = ['CODE100', 'CODE200', 'CODE300', 'CODE400']; + const problemColumns: number[] = [5, 1, 9, 2]; + const problemSeverities: ('error' | 'warning' | 'info')[] = ['error', 'warning', 'error', 'info']; + const problemMessages: string[] = ['First thing', 'Second thing', 'Third thing', 'Fourth thing']; + for (let i = 0; i < 4; i++) { + expect(onProblemSpy).toHaveBeenNthCalledWith(i + 1, { + matcherName: 'loop-with-severity', + file: `lib/${String.fromCharCode('a'.charCodeAt(0) + i)}.ts`, + line: (i + 1) * 10, + column: problemColumns[i], + code: problemCodes[i], + severity: problemSeverities[i], + message: problemMessages[i] + }); + } }); }); From bebecf76cadeabd94529f4776b95fb60d587891e Mon Sep 17 00:00:00 2001 From: Bharat Middha <5100938+bmiddha@users.noreply.github.com> Date: Mon, 29 Sep 2025 16:40:11 -0700 Subject: [PATCH 2/6] rush change --- ...dha-problem-matcher-onproblem_2025-09-29-23-40.json | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 common/changes/@rushstack/terminal/bmiddha-problem-matcher-onproblem_2025-09-29-23-40.json diff --git a/common/changes/@rushstack/terminal/bmiddha-problem-matcher-onproblem_2025-09-29-23-40.json b/common/changes/@rushstack/terminal/bmiddha-problem-matcher-onproblem_2025-09-29-23-40.json new file mode 100644 index 00000000000..ee85b278dd6 --- /dev/null +++ b/common/changes/@rushstack/terminal/bmiddha-problem-matcher-onproblem_2025-09-29-23-40.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@rushstack/terminal", + "comment": "Add ProblemCollector.onProblem notification callback", + "type": "patch" + } + ], + "packageName": "@rushstack/terminal" +} \ No newline at end of file From c9ec13101be957dc7289939f2f8c21d73d3498b1 Mon Sep 17 00:00:00 2001 From: Bharat Middha <5100938+bmiddha@users.noreply.github.com> Date: Tue, 30 Sep 2025 12:47:47 -0700 Subject: [PATCH 3/6] test fixup --- .../problem-matcher/src/ProblemMatcher.ts | 6 +- .../src/test/ProblemCollector.test.ts | 59 ++++++++++++------- 2 files changed, 42 insertions(+), 23 deletions(-) diff --git a/libraries/problem-matcher/src/ProblemMatcher.ts b/libraries/problem-matcher/src/ProblemMatcher.ts index ca9ee6e4877..14f111a5c96 100644 --- a/libraries/problem-matcher/src/ProblemMatcher.ts +++ b/libraries/problem-matcher/src/ProblemMatcher.ts @@ -258,6 +258,10 @@ function finalizeProblem( captures: ICapturesMutable, defaultSeverity: ProblemSeverity | undefined ): IProblem { + // For multi-line patterns, use only the last non-empty message part + const message: string = + captures.messageParts.length > 0 ? captures.messageParts[captures.messageParts.length - 1] : ''; + return { matcherName, file: captures.file, @@ -267,7 +271,7 @@ function finalizeProblem( endColumn: captures.endColumn, severity: captures.severity || defaultSeverity, code: captures.code, - message: captures.messageParts.join('\n') + message: message }; } diff --git a/libraries/terminal/src/test/ProblemCollector.test.ts b/libraries/terminal/src/test/ProblemCollector.test.ts index efc513beb95..363080df07c 100644 --- a/libraries/terminal/src/test/ProblemCollector.test.ts +++ b/libraries/terminal/src/test/ProblemCollector.test.ts @@ -83,13 +83,17 @@ describe('VSCodeProblemMatcherAdapter - additional location formats', () => { const { problems } = collector; expect(problems.size).toBe(1); expect(onProblemSpy).toHaveBeenCalledTimes(1); - expect(onProblemSpy).toHaveBeenCalledWith(1, { + expect(onProblemSpy).toHaveBeenNthCalledWith(1, { matcherName: 'loc-group', file: 'src/a.c', line: 10, column: 5, - message: 'something happened' - }); + message: 'something happened', + code: undefined, + endColumn: undefined, + endLine: undefined, + severity: undefined + } satisfies IProblem); }); it('parses explicit endLine and endColumn groups', () => { @@ -116,15 +120,17 @@ describe('VSCodeProblemMatcherAdapter - additional location formats', () => { const { problems } = collector; expect(problems.size).toBe(1); expect(onProblemSpy).toHaveBeenCalledTimes(1); - expect(onProblemSpy).toHaveBeenCalledWith(1, { + expect(onProblemSpy).toHaveBeenNthCalledWith(1, { matcherName: 'end-range', file: 'lib/x.c', line: 10, column: 5, endLine: 12, endColumn: 20, - message: 'multi-line issue' - }); + message: 'multi-line issue', + code: undefined, + severity: undefined + } satisfies IProblem); }); }); @@ -155,15 +161,17 @@ describe('VSCodeProblemMatcherAdapter', () => { const { problems } = collector; expect(problems.size).toBe(1); expect(onProblemSpy).toHaveBeenCalledTimes(1); - expect(onProblemSpy).toHaveBeenCalledWith(1, { + expect(onProblemSpy).toHaveBeenNthCalledWith(1, { matcherName: 'tsc-like', file: 'src/file.ts', line: 10, column: 5, code: 'TS1005', severity: 'error', - message: "' ; ' expected" - }); + message: "' ; ' expected", + endColumn: undefined, + endLine: undefined + } satisfies IProblem); }); it('converts and matches a multi-line pattern', () => { @@ -201,14 +209,17 @@ describe('VSCodeProblemMatcherAdapter', () => { const { problems } = collector; expect(problems.size).toBe(1); expect(onProblemSpy).toHaveBeenCalledTimes(1); - expect(onProblemSpy).toHaveBeenCalledWith(1, { + expect(onProblemSpy).toHaveBeenNthCalledWith(1, { matcherName: 'multi', file: 'src/foo.c', line: 42, column: 7, severity: 'error', - message: 'something bad happened' - }); + message: 'something bad happened', + code: undefined, + endColumn: undefined, + endLine: undefined + } satisfies IProblem); }); it('handles a multi-line pattern whose last pattern loops producing multiple problems', () => { @@ -240,12 +251,12 @@ describe('VSCodeProblemMatcherAdapter', () => { const errorLines: string[] = [ 'Encountered 6 errors', - ' [build:typescript] vscode-extensions/debug-certificate-manager-vscode-extension/src/certificates.ts:9:3 - (TS2578) Unused @ts-expect-error directive.', - ' [build:typescript] vscode-extensions/debug-certificate-manager-vscode-extension/src/certificates.ts:11:3 - (TS2578) Unused @ts-expect-error directive.', - ' [build:typescript] vscode-extensions/debug-certificate-manager-vscode-extension/src/certificates.ts:19:3 - (TS2578) Unused @ts-expect-error directive.', - ' [build:typescript] vscode-extensions/debug-certificate-manager-vscode-extension/src/certificates.ts:24:3 - (TS2578) Unused @ts-expect-error directive.', - ' [build:typescript] vscode-extensions/debug-certificate-manager-vscode-extension/src/certificates.ts:26:3 - (TS2578) Unused @ts-expect-error directive.', - ' [build:typescript] vscode-extensions/debug-certificate-manager-vscode-extension/src/certificates.ts:34:3 - (TS2578) Unused @ts-expect-error directive.' + ' [build:typescript] vscode-extensions/debug-certificate-manager-vscode-extension/src/certificates.ts:9:3 - (TS2578) Unused @ts-expect-error directive 1.', + ' [build:typescript] vscode-extensions/debug-certificate-manager-vscode-extension/src/certificates.ts:11:3 - (TS2578) Unused @ts-expect-error directive 2.', + ' [build:typescript] vscode-extensions/debug-certificate-manager-vscode-extension/src/certificates.ts:19:3 - (TS2578) Unused @ts-expect-error directive 3.', + ' [build:typescript] vscode-extensions/debug-certificate-manager-vscode-extension/src/certificates.ts:24:3 - (TS2578) Unused @ts-expect-error directive 4.', + ' [build:typescript] vscode-extensions/debug-certificate-manager-vscode-extension/src/certificates.ts:26:3 - (TS2578) Unused @ts-expect-error directive 5.', + ' [build:typescript] vscode-extensions/debug-certificate-manager-vscode-extension/src/certificates.ts:34:3 - (TS2578) Unused @ts-expect-error directive 6.' ]; const matchers = parseProblemMatchersJson([matcherPattern]); @@ -269,8 +280,10 @@ describe('VSCodeProblemMatcherAdapter', () => { column: 3, code: 'TS2578', severity: 'error', - message: 'Unused @ts-expect-error directive.' - }); + message: `Unused @ts-expect-error directive ${i + 1}.`, + endColumn: undefined, + endLine: undefined + } satisfies IProblem); } }); @@ -325,8 +338,10 @@ describe('VSCodeProblemMatcherAdapter', () => { column: problemColumns[i], code: problemCodes[i], severity: problemSeverities[i], - message: problemMessages[i] - }); + message: problemMessages[i], + endColumn: undefined, + endLine: undefined + } satisfies IProblem); } }); }); From 023d98678166edf1793bb55ce0e891e4e337f852 Mon Sep 17 00:00:00 2001 From: Bharat Middha <5100938+bmiddha@users.noreply.github.com> Date: Tue, 30 Sep 2025 12:53:40 -0700 Subject: [PATCH 4/6] rush change --- ...dha-problem-matcher-onproblem_2025-09-30-19-53.json | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 common/changes/@rushstack/problem-matcher/bmiddha-problem-matcher-onproblem_2025-09-30-19-53.json diff --git a/common/changes/@rushstack/problem-matcher/bmiddha-problem-matcher-onproblem_2025-09-30-19-53.json b/common/changes/@rushstack/problem-matcher/bmiddha-problem-matcher-onproblem_2025-09-30-19-53.json new file mode 100644 index 00000000000..6d3b942032f --- /dev/null +++ b/common/changes/@rushstack/problem-matcher/bmiddha-problem-matcher-onproblem_2025-09-30-19-53.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@rushstack/problem-matcher", + "comment": "Fix multi-line looping problem matcher message parsing", + "type": "patch" + } + ], + "packageName": "@rushstack/problem-matcher" +} \ No newline at end of file From 64cf0ab4fc72912c22dc0b0bee026b2664337156 Mon Sep 17 00:00:00 2001 From: Bharat Middha <5100938+bmiddha@users.noreply.github.com> Date: Tue, 30 Sep 2025 13:12:33 -0700 Subject: [PATCH 5/6] rush change --- .../bmiddha-problem-matcher-onproblem_2025-09-29-23-40.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/changes/@rushstack/terminal/bmiddha-problem-matcher-onproblem_2025-09-29-23-40.json b/common/changes/@rushstack/terminal/bmiddha-problem-matcher-onproblem_2025-09-29-23-40.json index ee85b278dd6..aa97521b77d 100644 --- a/common/changes/@rushstack/terminal/bmiddha-problem-matcher-onproblem_2025-09-29-23-40.json +++ b/common/changes/@rushstack/terminal/bmiddha-problem-matcher-onproblem_2025-09-29-23-40.json @@ -3,7 +3,7 @@ { "packageName": "@rushstack/terminal", "comment": "Add ProblemCollector.onProblem notification callback", - "type": "patch" + "type": "minor" } ], "packageName": "@rushstack/terminal" From b56d89c39d2f16ac4b1036fe5b26e2783f66ac54 Mon Sep 17 00:00:00 2001 From: Bharat Middha <5100938+bmiddha@users.noreply.github.com> Date: Tue, 30 Sep 2025 13:19:23 -0700 Subject: [PATCH 6/6] fix api extractor --- libraries/terminal/src/ProblemCollector.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/terminal/src/ProblemCollector.ts b/libraries/terminal/src/ProblemCollector.ts index 4680500fc0a..64ad6d6e9d2 100644 --- a/libraries/terminal/src/ProblemCollector.ts +++ b/libraries/terminal/src/ProblemCollector.ts @@ -37,7 +37,7 @@ export interface IProblemCollectorOptions extends ITerminalWritableOptions { * by a `"\n"` character (for example when preceded by {@link StderrLineTransform} / `StdioLineTransform`). * If a chunk does not end with a newline an error is thrown to surface incorrect pipeline wiring early. * - * @public + * @beta */ export class ProblemCollector extends TerminalWritable implements IProblemCollector { private readonly _matchers: IProblemMatcher[];