diff --git a/CHANGELOG.md b/CHANGELOG.md index 653702d0..bb3605fe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,10 @@ ([#803](https://github.com/pulumi/actions/issues/803)) - bug: Fix installation on Windows. -([#851](https://github.com/pulumi/actions/pull/851)) + ([#851](https://github.com/pulumi/actions/pull/851)) + +- fix: strip ansi control characters from pull request comment + ([#859](https://github.com/pulumi/actions/pull/859)) ## 4.0.0 (2023-19-01) diff --git a/package.json b/package.json index 64809d65..79805cb5 100644 --- a/package.json +++ b/package.json @@ -48,6 +48,7 @@ "@actions/io": "^1.1.2", "@actions/tool-cache": "^2.0.1", "@pulumi/pulumi": "3.54.0", + "ansi-to-html": "^0.7.2", "dedent": "^0.7.0", "envalid": "^7.3.1", "got": "^11.8.6", diff --git a/src/libs/__tests__/pr.test.ts b/src/libs/__tests__/pr.test.ts index 867c31b5..5efb5467 100644 --- a/src/libs/__tests__/pr.test.ts +++ b/src/libs/__tests__/pr.test.ts @@ -1,4 +1,4 @@ -import * as gh from '@actions/github'; +import gh from '@actions/github'; import { Config } from '../../config'; import { handlePullRequestMessage } from '../pr'; @@ -50,7 +50,7 @@ describe('pr.ts', () => { await handlePullRequestMessage(defaultOptions, projectName, 'test'); expect(createComment).toHaveBeenCalledWith({ - body: '#### :tropical_drink: `preview` on myFirstProject/staging\n\n
\nPulumi report\n\n```\ntest\n```\n\n
', + body: '#### :tropical_drink: `preview` on myFirstProject/staging\n\n
\nPulumi report\n\n
\ntest\n
\n\n
', issue_number: 123, }); }); @@ -74,7 +74,7 @@ describe('pr.ts', () => { await handlePullRequestMessage(options, projectName, 'test'); expect(createComment).toHaveBeenCalledWith({ - body: '#### :tropical_drink: `preview` on myFirstProject/staging\n\n
\nPulumi report\n\n```\ntest\n```\n\n
', + body: '#### :tropical_drink: `preview` on myFirstProject/staging\n\n
\nPulumi report\n\n
\ntest\n
\n\n
', issue_number: 87, }); }); @@ -101,7 +101,7 @@ describe('pr.ts', () => { await handlePullRequestMessage(options, projectName, 'test'); expect(createComment).toHaveBeenCalledWith({ - body: '#### :tropical_drink: `preview` on myFirstProject/staging\n\n
\nPulumi report\n\n```\ntest\n```\n\n
', + body: '#### :tropical_drink: `preview` on myFirstProject/staging\n\n
\nPulumi report\n\n
\ntest\n
\n\n
', issue_number: 87, }); }); @@ -142,7 +142,7 @@ describe('pr.ts', () => { await handlePullRequestMessage(options, projectName, 'test'); expect(updateComment).toHaveBeenCalledWith({ comment_id: 2, - body: '#### :tropical_drink: `preview` on myFirstProject/staging\n\n
\nPulumi report\n\n```\ntest\n```\n\n
', + body: '#### :tropical_drink: `preview` on myFirstProject/staging\n\n
\nPulumi report\n\n
\ntest\n
\n\n
', }); }); }); diff --git a/src/libs/pr.ts b/src/libs/pr.ts index dbbafcec..bbe6589a 100644 --- a/src/libs/pr.ts +++ b/src/libs/pr.ts @@ -1,9 +1,23 @@ import * as core from '@actions/core'; import { context, getOctokit } from '@actions/github'; -import * as dedent from 'dedent'; +import AnsiToHtml from 'ansi-to-html'; +import dedent from 'dedent'; import invariant from 'ts-invariant'; import { Config } from '../config'; +function ansiToHtml( + message: string, + { maxLength }: { maxLength?: number } = { maxLength: undefined }, +) { + const convert = new AnsiToHtml(); + let html = convert.toHtml(message); + while (maxLength !== undefined && html.length > maxLength) { + message = message.substring(0, message.length - 1); + html = convert.toHtml(message); + } + return html; +} + export async function handlePullRequestMessage( config: Config, projectName: string, @@ -20,7 +34,7 @@ export async function handlePullRequestMessage( const summary = 'Pulumi report'; - const rawBody = output.substring(0, 64_000); + const rawBody = ansiToHtml(output, { maxLength: 64_000 }); // a line break between heading and rawBody is needed // otherwise the backticks won't work as intended const body = dedent` @@ -29,9 +43,9 @@ export async function handlePullRequestMessage(
${summary} - \`\`\` +
     ${rawBody}
-    \`\`\`
+    
${ rawBody.length === 64_000 ? '**Warn**: The output was too long and trimmed.' @@ -53,8 +67,9 @@ export async function handlePullRequestMessage( ...repo, issue_number: nr, }); - const comment = comments.find((comment) => - comment.body.startsWith(heading) && comment.body.includes(summary), + const comment = comments.find( + (comment) => + comment.body.startsWith(heading) && comment.body.includes(summary), ); // If comment exists, update it. diff --git a/tsconfig.json b/tsconfig.json index 8ade0419..baa28344 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,6 +4,7 @@ "target": "es2015", "moduleResolution": "node", "allowSyntheticDefaultImports": true, + "esModuleInterop": true, "allowJs": false, "importHelpers": true, "alwaysStrict": true, diff --git a/yarn.lock b/yarn.lock index 0174e0e6..300bbd66 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1282,6 +1282,13 @@ ansi-styles@^6.0.0: resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.1.0.tgz#87313c102b8118abd57371afab34618bf7350ed3" integrity sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ== +ansi-to-html@^0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/ansi-to-html/-/ansi-to-html-0.7.2.tgz#a92c149e4184b571eb29a0135ca001a8e2d710cb" + integrity sha512-v6MqmEpNlxF+POuyhKkidusCHWWkaLcGRURzivcU3I9tv7k4JVhFcnukrM5Rlk2rUywdZuzYAZ+kbZqWCnfN3g== + dependencies: + entities "^2.2.0" + anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" @@ -2048,6 +2055,11 @@ enquirer@^2.3.5: dependencies: ansi-colors "^4.1.1" +entities@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + envalid@^7.3.1: version "7.3.1" resolved "https://registry.yarnpkg.com/envalid/-/envalid-7.3.1.tgz#5bf6bbb4effab2d64a1991d8078b4ae38924f0d2"