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"