diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index d6dd879..e82eec0 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -15,6 +15,7 @@ jobs: - name: Comment PR with message uses: ./ + id: nrt_message with: message: | Current branch is `${{ github.head_ref }}`. @@ -55,5 +56,11 @@ jobs: comment_tag: nrt_create_if_not_exists create_if_not_exists: false + - name: Check outputs + run: | + echo "id : ${{ steps.nrt_message.outputs.id }}" + echo "body : ${{ steps.nrt_message.outputs.body }}" + echo "html_url : ${{ steps.nrt_message.outputs.html_url }}" + - name: (AFTER) Setup test cases run: rm /tmp/foobar.txt \ No newline at end of file diff --git a/.nvmrc b/.nvmrc index 6e9d5a1..5bacb9a 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -16.13.1 \ No newline at end of file +20.8.1 \ No newline at end of file diff --git a/README.md b/README.md index 959abc8..83b7dd6 100644 --- a/README.md +++ b/README.md @@ -125,6 +125,35 @@ This will delete the comment at the end of the job. | `mode` | Mode that will be used to update comment (upsert/recreate/delete) | | upsert | | `create_if_not_exists` | Whether a comment should be created even if `comment_tag` is not found | | true | + +## Outputs + +### Action outputs + +You can get some outputs from this actions : + +| Name | Description | +| --- | --- | +| `id` | Comment id that was created or updated | +| `body` | Comment body | +| `html_url` | URL of the comment created or updated | + +### Example output + +```yaml +- name: Comment PR + uses: thollander/actions-comment-pull-request@v2 + id: hello + with: + message: | + Hello world ! :wave: +- name: Check outputs + run: | + echo "id : ${{ steps.hello.outputs.id }}" + echo "body : ${{ steps.hello.outputs.body }}" + echo "html_url : ${{ steps.hello.outputs.html_url }}" +``` + ## Permissions Depending on the permissions granted to your token, you may lack some rights. diff --git a/action.yml b/action.yml index c868e86..29d3903 100644 --- a/action.yml +++ b/action.yml @@ -25,6 +25,6 @@ inputs: description: 'Whether a comment should be created even if comment_tag is not found.' default: 'true' runs: - using: 'node16' + using: 'node20' main: 'lib/index.js' post: 'lib/cleanup/index.js' diff --git a/lib/cleanup/index.js b/lib/cleanup/index.js index c38436a..4916287 100644 --- a/lib/cleanup/index.js +++ b/lib/cleanup/index.js @@ -558,7 +558,7 @@ class OidcClient { .catch(error => { throw new Error(`Failed to get ID Token. \n Error Code : ${error.statusCode}\n - Error Message: ${error.result.message}`); + Error Message: ${error.message}`); }); const id_token = (_a = res.result) === null || _a === void 0 ? void 0 : _a.value; if (!id_token) { diff --git a/lib/index.js b/lib/index.js index 1969ff3..c7410c4 100644 --- a/lib/index.js +++ b/lib/index.js @@ -558,7 +558,7 @@ class OidcClient { .catch(error => { throw new Error(`Failed to get ID Token. \n Error Code : ${error.statusCode}\n - Error Message: ${error.result.message}`); + Error Message: ${error.message}`); }); const id_token = (_a = res.result) === null || _a === void 0 ? void 0 : _a.value; if (!id_token) { @@ -9582,6 +9582,40 @@ async function run() { }); })); } + async function createComment({ owner, repo, issue_number, body, }) { + const { data: comment } = await octokit.rest.issues.createComment({ + owner, + repo, + issue_number, + body, + }); + core.setOutput('id', comment.id); + core.setOutput('body', comment.body); + core.setOutput('html_url', comment.html_url); + await addReactions(comment.id, reactions); + return comment; + } + async function updateComment({ owner, repo, comment_id, body, }) { + const { data: comment } = await octokit.rest.issues.updateComment({ + owner, + repo, + comment_id, + body, + }); + core.setOutput('id', comment.id); + core.setOutput('body', comment.body); + core.setOutput('html_url', comment.html_url); + await addReactions(comment.id, reactions); + return comment; + } + async function deleteComment({ owner, repo, comment_id }) { + const { data: comment } = await octokit.rest.issues.deleteComment({ + owner, + repo, + comment_id, + }); + return comment; + } const comment_tag_pattern = comment_tag ? `` : null; @@ -9598,25 +9632,23 @@ async function run() { } if (comment) { if (mode === 'upsert') { - await octokit.rest.issues.updateComment({ + await updateComment({ ...context.repo, comment_id: comment.id, body, }); - await addReactions(comment.id, reactions); return; } else if (mode === 'recreate') { - await octokit.rest.issues.deleteComment({ + await deleteComment({ ...context.repo, comment_id: comment.id, }); - const { data: newComment } = await octokit.rest.issues.createComment({ + await createComment({ ...context.repo, issue_number, body, }); - await addReactions(newComment.id, reactions); return; } else if (mode === 'delete') { @@ -9635,12 +9667,11 @@ async function run() { return; } } - const { data: comment } = await octokit.rest.issues.createComment({ + await createComment({ ...context.repo, issue_number, body, }); - await addReactions(comment.id, reactions); } catch (error) { if (error instanceof Error) { diff --git a/package-lock.json b/package-lock.json index f78b919..649c465 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "actions-comment-pull-request", - "version": "2.4.2", + "version": "2.5.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "actions-comment-pull-request", - "version": "2.4.2", + "version": "2.5.0", "license": "MIT", "dependencies": { "@actions/core": "^1.10.1", @@ -16,11 +16,11 @@ "@actions/tool-cache": "^2.0.1" }, "devDependencies": { - "@tsconfig/node16": "^16.1.1", - "@types/node": "^18.16.2", - "@vercel/ncc": "^0.36.1", + "@tsconfig/node20": "^20.1.2", + "@types/node": "^20.8.1", + "@vercel/ncc": "^0.38.1", "prettier": "^3.0.3", - "typescript": "^5.2.2" + "typescript": "^5.3.3" } }, "node_modules/@actions/core": { @@ -187,22 +187,25 @@ "@octokit/openapi-types": "^12.11.0" } }, - "node_modules/@tsconfig/node16": { - "version": "16.1.1", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-16.1.1.tgz", - "integrity": "sha512-+pio93ejHN4nINX4pXqfnR/fPLRtJBaT4ORaa5RH0Oc1zoYmo2B2koG+M328CQhHKn1Wj6FcOxCDFXAot9NhvA==", + "node_modules/@tsconfig/node20": { + "version": "20.1.2", + "resolved": "https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.2.tgz", + "integrity": "sha512-madaWq2k+LYMEhmcp0fs+OGaLFk0OenpHa4gmI4VEmCKX4PJntQ6fnnGADVFrVkBj0wIdAlQnK/MrlYTHsa1gQ==", "dev": true }, "node_modules/@types/node": { - "version": "18.16.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.2.tgz", - "integrity": "sha512-GQW/JL/5Fz/0I8RpeBG9lKp0+aNcXEaVL71c0D2Q0QHDTFvlYKT7an0onCUXj85anv7b4/WesqdfchLc0jtsCg==", - "dev": true + "version": "20.8.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.7.tgz", + "integrity": "sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ==", + "dev": true, + "dependencies": { + "undici-types": "~5.25.1" + } }, "node_modules/@vercel/ncc": { - "version": "0.36.1", - "resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.36.1.tgz", - "integrity": "sha512-S4cL7Taa9yb5qbv+6wLgiKVZ03Qfkc4jGRuiUQMQ8HGBD5pcNRnHeYM33zBvJE4/zJGjJJ8GScB+WmTsn9mORw==", + "version": "0.38.1", + "resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.38.1.tgz", + "integrity": "sha512-IBBb+iI2NLu4VQn3Vwldyi2QwaXt5+hTyh58ggAMoCGE6DJmPvwL3KPBWcJl1m9LYPChBLE980Jw+CS4Wokqxw==", "dev": true, "bin": { "ncc": "dist/ncc/cli.js" @@ -290,9 +293,9 @@ } }, "node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -302,6 +305,12 @@ "node": ">=14.17" } }, + "node_modules/undici-types": { + "version": "5.25.3", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz", + "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==", + "dev": true + }, "node_modules/universal-user-agent": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", @@ -492,22 +501,25 @@ "@octokit/openapi-types": "^12.11.0" } }, - "@tsconfig/node16": { - "version": "16.1.1", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-16.1.1.tgz", - "integrity": "sha512-+pio93ejHN4nINX4pXqfnR/fPLRtJBaT4ORaa5RH0Oc1zoYmo2B2koG+M328CQhHKn1Wj6FcOxCDFXAot9NhvA==", + "@tsconfig/node20": { + "version": "20.1.2", + "resolved": "https://registry.npmjs.org/@tsconfig/node20/-/node20-20.1.2.tgz", + "integrity": "sha512-madaWq2k+LYMEhmcp0fs+OGaLFk0OenpHa4gmI4VEmCKX4PJntQ6fnnGADVFrVkBj0wIdAlQnK/MrlYTHsa1gQ==", "dev": true }, "@types/node": { - "version": "18.16.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.2.tgz", - "integrity": "sha512-GQW/JL/5Fz/0I8RpeBG9lKp0+aNcXEaVL71c0D2Q0QHDTFvlYKT7an0onCUXj85anv7b4/WesqdfchLc0jtsCg==", - "dev": true + "version": "20.8.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.7.tgz", + "integrity": "sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ==", + "dev": true, + "requires": { + "undici-types": "~5.25.1" + } }, "@vercel/ncc": { - "version": "0.36.1", - "resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.36.1.tgz", - "integrity": "sha512-S4cL7Taa9yb5qbv+6wLgiKVZ03Qfkc4jGRuiUQMQ8HGBD5pcNRnHeYM33zBvJE4/zJGjJJ8GScB+WmTsn9mORw==", + "version": "0.38.1", + "resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.38.1.tgz", + "integrity": "sha512-IBBb+iI2NLu4VQn3Vwldyi2QwaXt5+hTyh58ggAMoCGE6DJmPvwL3KPBWcJl1m9LYPChBLE980Jw+CS4Wokqxw==", "dev": true }, "before-after-hook": { @@ -563,9 +575,15 @@ "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" }, "typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", + "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "dev": true + }, + "undici-types": { + "version": "5.25.3", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz", + "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==", "dev": true }, "universal-user-agent": { diff --git a/package.json b/package.json index 2195921..9db0901 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "actions-comment-pull-request", - "version": "2.4.2", + "version": "2.5.0", "description": "GitHub action for commenting pull-request", "main": "lib/main.js", "scripts": { @@ -34,10 +34,10 @@ "@actions/tool-cache": "^2.0.1" }, "devDependencies": { - "@tsconfig/node16": "^16.1.1", - "@types/node": "^18.16.2", - "@vercel/ncc": "^0.36.1", + "@tsconfig/node20": "^20.1.2", + "@types/node": "^20.8.1", + "@vercel/ncc": "^0.38.1", "prettier": "^3.0.3", - "typescript": "^5.2.2" + "typescript": "^5.3.3" } } diff --git a/src/main.ts b/src/main.ts index 4e05a8c..62e1ee8 100644 --- a/src/main.ts +++ b/src/main.ts @@ -55,6 +55,70 @@ async function run() { ); } + async function createComment({ + owner, + repo, + issue_number, + body, + }: { + owner: string; + repo: string; + issue_number: number; + body: string; + }) { + const { data: comment } = await octokit.rest.issues.createComment({ + owner, + repo, + issue_number, + body, + }); + + core.setOutput('id', comment.id); + core.setOutput('body', comment.body); + core.setOutput('html_url', comment.html_url); + + await addReactions(comment.id, reactions); + + return comment; + } + + async function updateComment({ + owner, + repo, + comment_id, + body, + }: { + owner: string; + repo: string; + comment_id: number; + body: string; + }) { + const { data: comment } = await octokit.rest.issues.updateComment({ + owner, + repo, + comment_id, + body, + }); + + core.setOutput('id', comment.id); + core.setOutput('body', comment.body); + core.setOutput('html_url', comment.html_url); + + await addReactions(comment.id, reactions); + + return comment; + } + + async function deleteComment({ owner, repo, comment_id }: { owner: string; repo: string; comment_id: number }) { + const { data: comment } = await octokit.rest.issues.deleteComment({ + owner, + repo, + comment_id, + }); + + return comment; + } + const comment_tag_pattern = comment_tag ? `` : null; @@ -75,26 +139,23 @@ async function run() { if (comment) { if (mode === 'upsert') { - await octokit.rest.issues.updateComment({ + await updateComment({ ...context.repo, comment_id: comment.id, body, }); - await addReactions(comment.id, reactions); return; } else if (mode === 'recreate') { - await octokit.rest.issues.deleteComment({ + await deleteComment({ ...context.repo, comment_id: comment.id, }); - const { data: newComment } = await octokit.rest.issues.createComment({ + await createComment({ ...context.repo, issue_number, body, }); - - await addReactions(newComment.id, reactions); return; } else if (mode === 'delete') { core.debug('Registering this comment to be deleted.'); @@ -112,13 +173,11 @@ async function run() { } } - const { data: comment } = await octokit.rest.issues.createComment({ + await createComment({ ...context.repo, issue_number, body, }); - - await addReactions(comment.id, reactions); } catch (error) { if (error instanceof Error) { core.setFailed(error.message); diff --git a/tsconfig.json b/tsconfig.json index bf8ec56..44c2c1a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "@tsconfig/node16/tsconfig.json", + "extends": "@tsconfig/node20/tsconfig.json", "compilerOptions": { "outDir": "./lib", "rootDir": "./src"