From 80b2da0023915dc85bf4da77f93fd116635ff153 Mon Sep 17 00:00:00 2001 From: Tim108 Date: Fri, 7 Oct 2022 11:21:02 +0200 Subject: [PATCH 01/30] add optional arguments --- src/update-message/index.js | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/update-message/index.js b/src/update-message/index.js index bf55c89..1c92312 100644 --- a/src/update-message/index.js +++ b/src/update-message/index.js @@ -11,7 +11,7 @@ const updateMessage = async () => { const text = context.getRequired("slack-update-message-text"); const ts = context.getRequired("slack-update-message-ts"); - const payload = buildUpdateMessage(channelId, text, ts); + const payload = buildUpdateMessage(channelId, text, ts, optional()); context.debugExtra("Update Message PAYLOAD", payload); const result = await apiUpdateMessage(token, payload); @@ -25,4 +25,19 @@ const updateMessage = async () => { } }; +const optional = () => { + let opt = {}; + + const env = context.getEnv(); + Object.keys(env) + .filter((key) => !!env[key]) + .filter((key) => key.toUpperCase().startsWith("INPUT_SLACK-OPTIONAL-")) + .forEach((key) => { + const slackKey = key.replace("INPUT_SLACK-OPTIONAL-", "").toLowerCase(); + opt[slackKey] = env[key]; + }); + + return opt; +}; + module.exports = { updateMessage }; From 82337f0cbb876f77104f3a79551cae87ec603037 Mon Sep 17 00:00:00 2001 From: Tim108 Date: Fri, 7 Oct 2022 11:50:41 +0200 Subject: [PATCH 02/30] add blocks as proper argument --- dist/index.js | 31 +++++++++++++++++----- src/message/build-message.js | 3 ++- src/message/build-message.test.js | 6 +++-- src/message/index.js | 5 ++-- src/update-message/build-update-message.js | 3 ++- src/update-message/index.js | 5 ++-- 6 files changed, 39 insertions(+), 14 deletions(-) diff --git a/dist/index.js b/dist/index.js index 7fd1388..ccd5c7a 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1736,10 +1736,11 @@ const { restoreEscapedTab, } = __nccwpck_require__(307); -const buildMessage = (channel = "", text = "", optional = {}) => { +const buildMessage = (channel = "", text = "", blocks = "", optional = {}) => { const message = { channel, text, + blocks, }; message.text = restoreEscapedNewLine(message.text); @@ -1771,13 +1772,14 @@ const postMessage = async () => { try { const token = context.getRequired("slack-bot-user-oauth-access-token"); const channels = context.getRequired("slack-channel"); - const text = context.getRequired("slack-text"); + const text = context.getOptional("slack-text"); + const blocks = context.getOptional("slack-blocks"); const results = []; for (let channel of channels.split(",")) { channel = channel.trim(); - const payload = buildMessage(channel, text, optional()); + const payload = buildMessage(channel, text, blocks, optional()); context.debug("Post Message PAYLOAD", payload); const result = await apiPostMessage(token, payload); @@ -1881,11 +1883,12 @@ const { restoreEscapedTab, } = __nccwpck_require__(307); -const buildMessage = (channel = "", text = "", ts = "", optional = {}) => { +const buildMessage = (channel = "", text = "", blocks = "", ts = "", optional = {}) => { const message = { channel, text, ts, + blocks, }; message.text = restoreEscapedNewLine(message.text); @@ -1916,10 +1919,11 @@ const updateMessage = async () => { try { const token = context.getRequired("slack-bot-user-oauth-access-token"); const channelId = context.getRequired("slack-channel"); - const text = context.getRequired("slack-update-message-text"); const ts = context.getRequired("slack-update-message-ts"); + const text = context.getOptional("slack-update-message-text"); + const blocks = context.getOptional("slack-update-message-blocks"); - const payload = buildUpdateMessage(channelId, text, ts); + const payload = buildUpdateMessage(channelId, text, blocks, ts, optional()); context.debugExtra("Update Message PAYLOAD", payload); const result = await apiUpdateMessage(token, payload); @@ -1933,6 +1937,21 @@ const updateMessage = async () => { } }; +const optional = () => { + let opt = {}; + + const env = context.getEnv(); + Object.keys(env) + .filter((key) => !!env[key]) + .filter((key) => key.toUpperCase().startsWith("INPUT_SLACK-OPTIONAL-")) + .forEach((key) => { + const slackKey = key.replace("INPUT_SLACK-OPTIONAL-", "").toLowerCase(); + opt[slackKey] = env[key]; + }); + + return opt; +}; + module.exports = { updateMessage }; diff --git a/src/message/build-message.js b/src/message/build-message.js index 1ea9b86..602ec9e 100644 --- a/src/message/build-message.js +++ b/src/message/build-message.js @@ -3,10 +3,11 @@ const { restoreEscapedTab, } = require("../util/escaper.js"); -const buildMessage = (channel = "", text = "", optional = {}) => { +const buildMessage = (channel = "", text = "", blocks = "", optional = {}) => { const message = { channel, text, + blocks, }; message.text = restoreEscapedNewLine(message.text); diff --git a/src/message/build-message.test.js b/src/message/build-message.test.js index fba737c..1d34ea1 100644 --- a/src/message/build-message.test.js +++ b/src/message/build-message.test.js @@ -2,22 +2,24 @@ describe("build message", () => { test("with channel and text parameters", () => { const buildMessage = require("./build-message"); - const message = buildMessage("channel", "text"); + const message = buildMessage("channel", "text", "blocks"); expect(message).toEqual({ channel: "channel", text: "text", + blocks: "blocks", }); }); test("with optional parameters", () => { const buildMessage = require("./build-message"); - const message = buildMessage("channel", "text", { key: "value" }); + const message = buildMessage("channel", "text", "blocks", { key: "value" }); expect(message).toEqual({ channel: "channel", text: "text", + blocks: "blocks", key: "value", }); }); diff --git a/src/message/index.js b/src/message/index.js index 339808b..06f335c 100644 --- a/src/message/index.js +++ b/src/message/index.js @@ -9,13 +9,14 @@ const postMessage = async () => { try { const token = context.getRequired("slack-bot-user-oauth-access-token"); const channels = context.getRequired("slack-channel"); - const text = context.getRequired("slack-text"); + const text = context.getOptional("slack-text"); + const blocks = context.getOptional("slack-blocks"); const results = []; for (let channel of channels.split(",")) { channel = channel.trim(); - const payload = buildMessage(channel, text, optional()); + const payload = buildMessage(channel, text, blocks, optional()); context.debug("Post Message PAYLOAD", payload); const result = await apiPostMessage(token, payload); diff --git a/src/update-message/build-update-message.js b/src/update-message/build-update-message.js index 011ddf8..a8863c6 100644 --- a/src/update-message/build-update-message.js +++ b/src/update-message/build-update-message.js @@ -3,11 +3,12 @@ const { restoreEscapedTab, } = require("../util/escaper.js"); -const buildMessage = (channel = "", text = "", ts = "", optional = {}) => { +const buildMessage = (channel = "", text = "", blocks = "", ts = "", optional = {}) => { const message = { channel, text, ts, + blocks, }; message.text = restoreEscapedNewLine(message.text); diff --git a/src/update-message/index.js b/src/update-message/index.js index 1c92312..9e322a5 100644 --- a/src/update-message/index.js +++ b/src/update-message/index.js @@ -8,10 +8,11 @@ const updateMessage = async () => { try { const token = context.getRequired("slack-bot-user-oauth-access-token"); const channelId = context.getRequired("slack-channel"); - const text = context.getRequired("slack-update-message-text"); const ts = context.getRequired("slack-update-message-ts"); + const text = context.getOptional("slack-update-message-text"); + const blocks = context.getOptional("slack-update-message-blocks"); - const payload = buildUpdateMessage(channelId, text, ts, optional()); + const payload = buildUpdateMessage(channelId, text, blocks, ts, optional()); context.debugExtra("Update Message PAYLOAD", payload); const result = await apiUpdateMessage(token, payload); From 07d8a555a05b519ae8e4b74a1a3f43bbbef64e95 Mon Sep 17 00:00:00 2001 From: Tim108 Date: Fri, 7 Oct 2022 12:12:18 +0200 Subject: [PATCH 03/30] update argument list --- action.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/action.yml b/action.yml index c52bd68..615b125 100644 --- a/action.yml +++ b/action.yml @@ -12,7 +12,10 @@ inputs: required: true slack-text: description: "Text" - required: true + required: false + slack-blocks: + description: "Blocks" + required: false slack-optional-as_user: description: "https://api.slack.com/methods/chat.postMessage#arg_as_user" required: false @@ -67,6 +70,9 @@ inputs: slack-update-message-text: description: https://api.slack.com/methods/chat.update#text required: false + slack-update-message-blocks: + description: https://api.slack.com/methods/chat.update#blocks + required: false outputs: slack-result: From 93518533c1dd086b5718546bbbf50dad729ffc5c Mon Sep 17 00:00:00 2001 From: Anders Date: Thu, 13 Oct 2022 22:32:50 +0200 Subject: [PATCH 04/30] adding integration test --- .github/workflows/11-slack-message-blocks.yml | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 .github/workflows/11-slack-message-blocks.yml diff --git a/.github/workflows/11-slack-message-blocks.yml b/.github/workflows/11-slack-message-blocks.yml new file mode 100644 index 0000000..535e1ec --- /dev/null +++ b/.github/workflows/11-slack-message-blocks.yml @@ -0,0 +1,51 @@ +name: test-11-slack-message-blocks + +on: [push, issues] + +jobs: + slack-action: + runs-on: ubuntu-20.04 + name: Test 11 [ubuntu-20.04] + + steps: + - name: Send Slack Message + uses: archive/github-actions-slack@master + id: send-message + with: + slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }} + slack-channel: C046J5U2RGC + slack-blocks: >- + [ + { + "block_id": "text1", + "type": "section", + "text": { + "type": "mrkdwn", + "text": "Building repo *product-service*" + } + }, + { + "type": "divider" + }, + { + "block_id": "text2", + "type": "context", + "elements": [ + { + "type": "image", + "image_url": "https://upload.wikimedia.org/wikipedia/en/thumb/4/4c/Flag_of_Sweden.svg/1200px-Flag_of_Sweden.svg.png", + "alt_text": "images" + }, + { + "type": "plain_text", + "text": "Estimated time: 1 min" + } + ] + }, + { + "type": "divider" + } + ] + + - name: Result from "Send Slack Message" + run: echo '${{ steps.send-message.outputs.slack-result }}' From 9f4f5b236b0a13e736d7f5bb86f8a7f674e7f130 Mon Sep 17 00:00:00 2001 From: Anders Date: Thu, 13 Oct 2022 22:37:17 +0200 Subject: [PATCH 05/30] integration test needs to be on right branch :) --- .github/workflows/11-slack-message-blocks.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/11-slack-message-blocks.yml b/.github/workflows/11-slack-message-blocks.yml index 535e1ec..b05c057 100644 --- a/.github/workflows/11-slack-message-blocks.yml +++ b/.github/workflows/11-slack-message-blocks.yml @@ -9,7 +9,7 @@ jobs: steps: - name: Send Slack Message - uses: archive/github-actions-slack@master + uses: archive/github-actions-slack@update_message_with_blocks id: send-message with: slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }} From 452ecba7b016012703cd60d15de3cac035a2c263 Mon Sep 17 00:00:00 2001 From: Anders Date: Thu, 13 Oct 2022 22:45:49 +0200 Subject: [PATCH 06/30] integration test for update block --- ...blocks.yml => 11-slack-message-update.yml} | 2 +- .../12-slack-message-update-blocks.yml | 59 +++++++++++++++++++ 2 files changed, 60 insertions(+), 1 deletion(-) rename .github/workflows/{11-slack-message-blocks.yml => 11-slack-message-update.yml} (97%) create mode 100644 .github/workflows/12-slack-message-update-blocks.yml diff --git a/.github/workflows/11-slack-message-blocks.yml b/.github/workflows/11-slack-message-update.yml similarity index 97% rename from .github/workflows/11-slack-message-blocks.yml rename to .github/workflows/11-slack-message-update.yml index b05c057..6de1797 100644 --- a/.github/workflows/11-slack-message-blocks.yml +++ b/.github/workflows/11-slack-message-update.yml @@ -8,7 +8,7 @@ jobs: name: Test 11 [ubuntu-20.04] steps: - - name: Send Slack Message + - name: Send Slack Message (Blocks) uses: archive/github-actions-slack@update_message_with_blocks id: send-message with: diff --git a/.github/workflows/12-slack-message-update-blocks.yml b/.github/workflows/12-slack-message-update-blocks.yml new file mode 100644 index 0000000..8afa940 --- /dev/null +++ b/.github/workflows/12-slack-message-update-blocks.yml @@ -0,0 +1,59 @@ +name: test-11-slack-message-blocks + +on: [push, issues] + +jobs: + slack-action: + runs-on: ubuntu-20.04 + name: Test 11 [ubuntu-20.04] + + steps: + - name: Send Slack Message (Blocks) + uses: archive/github-actions-slack@update_message_with_blocks + id: send-message + with: + slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }} + slack-channel: C046FKM3TNF + slack-blocks: >- + [ + { + "block_id": "text1", + "type": "section", + "text": { + "type": "mrkdwn", + "text": "Building... *please wait*" + } + } + ] + + - name: Result from "Send Slack Message" + run: echo '${{ steps.send-message.outputs.slack-result }}' + + - name: Send Slack Message (Blocks) - Update + uses: archive/github-actions-slack@update_message_with_blocks + id: send-message-update + with: + slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }} + slack-channel: C046FKM3TNF + slack-update-message-blocks: >- + [ + { + "block_id": "text1", + "type": "section", + "text": { + "type": "mrkdwn", + "text": "Building..." + } + }, + { + "type": "divider" + }, + { + "block_id": "text1", + "type": "section", + "text": { + "type": "mrkdwn", + "text": "*Done* 😁" + } + } + ] From 4bd47073344005c336731aa508be7520c5d1fade Mon Sep 17 00:00:00 2001 From: Anders Date: Thu, 13 Oct 2022 22:48:32 +0200 Subject: [PATCH 07/30] Rename since they were wrong :) --- ...{11-slack-message-update.yml => 11-slack-message-blocks.yml} | 0 ...age-update-blocks.yml => 12-slack-message-blocks-update.yml} | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename .github/workflows/{11-slack-message-update.yml => 11-slack-message-blocks.yml} (100%) rename .github/workflows/{12-slack-message-update-blocks.yml => 12-slack-message-blocks-update.yml} (97%) diff --git a/.github/workflows/11-slack-message-update.yml b/.github/workflows/11-slack-message-blocks.yml similarity index 100% rename from .github/workflows/11-slack-message-update.yml rename to .github/workflows/11-slack-message-blocks.yml diff --git a/.github/workflows/12-slack-message-update-blocks.yml b/.github/workflows/12-slack-message-blocks-update.yml similarity index 97% rename from .github/workflows/12-slack-message-update-blocks.yml rename to .github/workflows/12-slack-message-blocks-update.yml index 8afa940..4b18b37 100644 --- a/.github/workflows/12-slack-message-update-blocks.yml +++ b/.github/workflows/12-slack-message-blocks-update.yml @@ -1,4 +1,4 @@ -name: test-11-slack-message-blocks +name: test-12-slack-message-blocks-update on: [push, issues] From d1ab528bd5082870474c95c72622626ca75868c5 Mon Sep 17 00:00:00 2001 From: Anders Date: Thu, 13 Oct 2022 22:51:46 +0200 Subject: [PATCH 08/30] hope to solve 'invalid_blocks_format' error --- .github/workflows/12-slack-message-blocks-update.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/12-slack-message-blocks-update.yml b/.github/workflows/12-slack-message-blocks-update.yml index 4b18b37..219fbfe 100644 --- a/.github/workflows/12-slack-message-blocks-update.yml +++ b/.github/workflows/12-slack-message-blocks-update.yml @@ -49,7 +49,7 @@ jobs: "type": "divider" }, { - "block_id": "text1", + "block_id": "text2", "type": "section", "text": { "type": "mrkdwn", From 20ac7c7fe9e16986059ac1bb7bd6c49c70c426ff Mon Sep 17 00:00:00 2001 From: Anders Date: Thu, 13 Oct 2022 22:57:20 +0200 Subject: [PATCH 09/30] hope to solve 'invalid_blocks_format' error --- .../workflows/12-slack-message-blocks-update.yml | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/.github/workflows/12-slack-message-blocks-update.yml b/.github/workflows/12-slack-message-blocks-update.yml index 219fbfe..eebfb9b 100644 --- a/.github/workflows/12-slack-message-blocks-update.yml +++ b/.github/workflows/12-slack-message-blocks-update.yml @@ -42,18 +42,7 @@ jobs: "type": "section", "text": { "type": "mrkdwn", - "text": "Building..." - } - }, - { - "type": "divider" - }, - { - "block_id": "text2", - "type": "section", - "text": { - "type": "mrkdwn", - "text": "*Done* 😁" + "text": "Building... *done!*" } } ] From 1e66227b13af6ec6bde9e988cd469e24f8049944 Mon Sep 17 00:00:00 2001 From: Anders Date: Fri, 14 Oct 2022 23:28:05 +0200 Subject: [PATCH 10/30] Sometimes slack returns 200 but with an inner error, we need to handle this --- jest.config.js | 2 +- src/integration/slack-api-post.js | 64 ++++++++++++++++++++++++++ src/integration/slack-api.js | 75 ++++++------------------------- src/integration/slack-api.test.js | 22 +++++++++ 4 files changed, 101 insertions(+), 62 deletions(-) create mode 100644 src/integration/slack-api-post.js create mode 100644 src/integration/slack-api.test.js diff --git a/jest.config.js b/jest.config.js index 9327d1b..ddf3fc5 100644 --- a/jest.config.js +++ b/jest.config.js @@ -178,7 +178,7 @@ module.exports = { // unmockedModulePathPatterns: undefined, // Indicates whether each individual test should be reported during the run - // verbose: null, + verbose: true, // An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode // watchPathIgnorePatterns: [], diff --git a/src/integration/slack-api-post.js b/src/integration/slack-api-post.js new file mode 100644 index 0000000..22a2293 --- /dev/null +++ b/src/integration/slack-api-post.js @@ -0,0 +1,64 @@ +const https = require("https"); + +const getOptions = (token, path) => { + return { + hostname: "slack.com", + port: 443, + path: path, + method: "POST", + headers: { + "Content-Type": "application/json; charset=utf-8", + Authorization: `Bearer ${token}`, + }, + }; +}; + +const post = (token, path, message) => { + return new Promise((resolve, reject) => { + const payload = JSON.stringify(message); + + const options = getOptions(token, path); + + const req = https.request(options, (res) => { + const chunks = []; + + res.on("data", (chunk) => { + chunks.push(chunk); + }); + + res.on("end", () => { + const result = Buffer.concat(chunks).toString(); + const response = JSON.parse(result); + + const isOk = res.statusCode >= 200 && res.statusCode <= 299; + + // This solves the issue that block updates returns 200 + // but contains ok = false in the response + if ( + response && + response.hasOwnProperty("ok") && + response.ok === false + ) { + isOk = false; + } + + resolve({ + statusCode: res.statusCode, + statusMessage: res.statusMessage, + ok: isOk, + result: result, + response: response, + }); + }); + }); + + req.on("error", (error) => { + reject(error); + }); + + req.write(payload); + req.end(); + }); +}; + +module.exports = { post }; diff --git a/src/integration/slack-api.js b/src/integration/slack-api.js index 485dadb..30e8ab5 100644 --- a/src/integration/slack-api.js +++ b/src/integration/slack-api.js @@ -1,85 +1,38 @@ -const https = require("https"); +const { post } = require("./slack-api-post"); -const getOptions = (token, path) => { - return { - hostname: "slack.com", - port: 443, - path: path, - method: "POST", - headers: { - "Content-Type": "application/json; charset=utf-8", - Authorization: `Bearer ${token}`, - }, - }; -}; - -const post = (token, path, message) => { - return new Promise((resolve, reject) => { - const payload = JSON.stringify(message); - - const options = getOptions(token, path); - - const req = https.request(options, (res) => { - const chunks = []; - - res.on("data", (chunk) => { - chunks.push(chunk); - }); - - res.on("end", () => { - const result = Buffer.concat(chunks).toString(); - const response = JSON.parse(result); - - resolve({ - statusCode: res.statusCode, - statusMessage: res.statusMessage, - ok: res.statusCode >= 200 && res.statusCode <= 299, - result: result, - response: response, - }); - }); - }); - - req.on("error", (error) => { - reject(error); - }); - - req.write(payload); - req.end(); - }); -}; +const hasErrors = (res) => !res || !res.ok; const apiPostMessage = async (token, message) => { const path = "/api/chat.postMessage"; - const result = await post(token, path, message); + const res = await post(token, path, message); - if (!result || !result.ok) { - throw `Error! ${JSON.stringify(response)}`; + if (hasErrors(res)) { + throw `Error! ${JSON.stringify(res)}`; } - return result; + return res; }; const apiAddReaction = async (token, message) => { const path = "/api/reactions.add"; - const result = await post(token, path, message); + const res = await post(token, path, message); - if (!result || !result.ok) { - throw `Error! ${JSON.stringify(response)}`; + if (hasErrors(res)) { + throw `Error! ${JSON.stringify(res)}`; } - return result; + return res; }; const apiUpdateMessage = async (token, message) => { const path = "/api/chat.update"; - const result = await post(token, path, message); + const res = await post(token, path, message); - if (!result || !result.ok) { - throw `Error! ${JSON.stringify(response)}`; + if (hasErrors(res)) { + throw `Error! ${JSON.stringify(res)}`; } - return result; + return res; }; module.exports = { apiPostMessage, apiAddReaction, apiUpdateMessage }; diff --git a/src/integration/slack-api.test.js b/src/integration/slack-api.test.js new file mode 100644 index 0000000..cfacdd8 --- /dev/null +++ b/src/integration/slack-api.test.js @@ -0,0 +1,22 @@ +describe("slack api", () => { + test("fail when slack api wrapper returns ok is false", async () => { + expect.assertions(1); + + const errorResponse = { + ok: false, + }; + + jest.mock("./slack-api-post", () => ({ + post: function (token, path, message) { + return errorResponse; + }, + })); + + const slackApi = require("./slack-api"); + try { + await slackApi.apiUpdateMessage(); + } catch (error) { + expect(error).toContain("Error!"); + } + }); +}); From 2bcb64c30870f9cfc3fb57f399b9c0bb2cff1f13 Mon Sep 17 00:00:00 2001 From: Anders Date: Fri, 14 Oct 2022 23:31:07 +0200 Subject: [PATCH 11/30] build --- dist/index.js | 52 +++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 38 insertions(+), 14 deletions(-) diff --git a/dist/index.js b/dist/index.js index 90dbc15..8b00ea3 100644 --- a/dist/index.js +++ b/dist/index.js @@ -2731,7 +2731,7 @@ module.exports = { /***/ }), -/***/ 202: +/***/ 451: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { const https = __nccwpck_require__(687); @@ -2766,10 +2766,22 @@ const post = (token, path, message) => { const result = Buffer.concat(chunks).toString(); const response = JSON.parse(result); + const isOk = res.statusCode >= 200 && res.statusCode <= 299; + + // This solves the issue that block updates returns 200 + // but contains ok = false in the response + if ( + response && + response.hasOwnProperty("ok") && + response.ok === false + ) { + isOk = false; + } + resolve({ statusCode: res.statusCode, statusMessage: res.statusMessage, - ok: res.statusCode >= 200 && res.statusCode <= 299, + ok: isOk, result: result, response: response, }); @@ -2785,37 +2797,49 @@ const post = (token, path, message) => { }); }; +module.exports = { post }; + + +/***/ }), + +/***/ 202: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +const { post } = __nccwpck_require__(451); + +const hasErrors = (res) => !res || !res.ok; + const apiPostMessage = async (token, message) => { const path = "/api/chat.postMessage"; - const result = await post(token, path, message); + const res = await post(token, path, message); - if (!result || !result.ok) { - throw `Error! ${JSON.stringify(response)}`; + if (hasErrors(res)) { + throw `Error! ${JSON.stringify(res)}`; } - return result; + return res; }; const apiAddReaction = async (token, message) => { const path = "/api/reactions.add"; - const result = await post(token, path, message); + const res = await post(token, path, message); - if (!result || !result.ok) { - throw `Error! ${JSON.stringify(response)}`; + if (hasErrors(res)) { + throw `Error! ${JSON.stringify(res)}`; } - return result; + return res; }; const apiUpdateMessage = async (token, message) => { const path = "/api/chat.update"; - const result = await post(token, path, message); + const res = await post(token, path, message); - if (!result || !result.ok) { - throw `Error! ${JSON.stringify(response)}`; + if (hasErrors(res)) { + throw `Error! ${JSON.stringify(res)}`; } - return result; + return res; }; module.exports = { apiPostMessage, apiAddReaction, apiUpdateMessage }; From f4d5903d145aa498e3561671deaa14c63628d693 Mon Sep 17 00:00:00 2001 From: Anders Date: Fri, 14 Oct 2022 23:33:08 +0200 Subject: [PATCH 12/30] assignment to constant variable :) --- src/integration/slack-api-post.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/integration/slack-api-post.js b/src/integration/slack-api-post.js index 22a2293..a99b191 100644 --- a/src/integration/slack-api-post.js +++ b/src/integration/slack-api-post.js @@ -30,7 +30,7 @@ const post = (token, path, message) => { const result = Buffer.concat(chunks).toString(); const response = JSON.parse(result); - const isOk = res.statusCode >= 200 && res.statusCode <= 299; + let isOk = res.statusCode >= 200 && res.statusCode <= 299; // This solves the issue that block updates returns 200 // but contains ok = false in the response From fe2c5c9abe6361039df04c6e5c8b8b0a51fb67ff Mon Sep 17 00:00:00 2001 From: Anders Date: Fri, 14 Oct 2022 23:33:38 +0200 Subject: [PATCH 13/30] build --- dist/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dist/index.js b/dist/index.js index 8b00ea3..cbe1cc8 100644 --- a/dist/index.js +++ b/dist/index.js @@ -2766,7 +2766,7 @@ const post = (token, path, message) => { const result = Buffer.concat(chunks).toString(); const response = JSON.parse(result); - const isOk = res.statusCode >= 200 && res.statusCode <= 299; + let isOk = res.statusCode >= 200 && res.statusCode <= 299; // This solves the issue that block updates returns 200 // but contains ok = false in the response From 2ec75558eb67f556c03f9a7cca754e693e29dd6b Mon Sep 17 00:00:00 2001 From: Anders Date: Fri, 14 Oct 2022 23:37:35 +0200 Subject: [PATCH 14/30] temp disable other integration tests (to speed up feedback) --- .../workflows/1-slack-notification-with-optional-parameters.yml | 1 + .github/workflows/10-slack-fake-build-updates.yml | 1 + .github/workflows/2-slack-notification.yml | 1 + .github/workflows/3-slack-reaction.yml | 1 + .github/workflows/4-slack-thread.yml | 1 + .github/workflows/5-slack-update-message.yml | 1 + .github/workflows/6-slack-thread-with-broadcast.yml | 1 + .github/workflows/7-slack-notification-multi-channel.yml | 1 + .github/workflows/8-slack-notification-line-breaks.yml | 1 + .github/workflows/9-slack-update-message-line-breaks.yml | 1 + 10 files changed, 10 insertions(+) diff --git a/.github/workflows/1-slack-notification-with-optional-parameters.yml b/.github/workflows/1-slack-notification-with-optional-parameters.yml index b56d237..55fa4b0 100644 --- a/.github/workflows/1-slack-notification-with-optional-parameters.yml +++ b/.github/workflows/1-slack-notification-with-optional-parameters.yml @@ -4,6 +4,7 @@ on: [push] jobs: slack-action: + if: ${{ false }} # temp disable runs-on: ubuntu-20.04 name: Test 1 [ubuntu-20.04] diff --git a/.github/workflows/10-slack-fake-build-updates.yml b/.github/workflows/10-slack-fake-build-updates.yml index 65d87a6..0f2f324 100644 --- a/.github/workflows/10-slack-fake-build-updates.yml +++ b/.github/workflows/10-slack-fake-build-updates.yml @@ -4,6 +4,7 @@ on: [push] jobs: slack-action: + if: ${{ false }} # temp disable runs-on: ubuntu-20.04 name: Test 10 [ubuntu-20.04] diff --git a/.github/workflows/2-slack-notification.yml b/.github/workflows/2-slack-notification.yml index c820f79..08e3a47 100644 --- a/.github/workflows/2-slack-notification.yml +++ b/.github/workflows/2-slack-notification.yml @@ -4,6 +4,7 @@ on: [push] jobs: slack-action: + if: ${{ false }} # temp disable runs-on: windows-latest name: Test 2 [windows-latest] diff --git a/.github/workflows/3-slack-reaction.yml b/.github/workflows/3-slack-reaction.yml index e03d85d..ded1e4a 100644 --- a/.github/workflows/3-slack-reaction.yml +++ b/.github/workflows/3-slack-reaction.yml @@ -4,6 +4,7 @@ on: [push] jobs: slack-action: + if: ${{ false }} # temp disable runs-on: ubuntu-latest name: Test 3 [ubuntu-latest] diff --git a/.github/workflows/4-slack-thread.yml b/.github/workflows/4-slack-thread.yml index 6b99dc3..cbf8264 100644 --- a/.github/workflows/4-slack-thread.yml +++ b/.github/workflows/4-slack-thread.yml @@ -4,6 +4,7 @@ on: [push] jobs: slack-action: + if: ${{ false }} # temp disable runs-on: macos-latest name: Test 4 [macos-latest] diff --git a/.github/workflows/5-slack-update-message.yml b/.github/workflows/5-slack-update-message.yml index dbc0145..84bcdee 100644 --- a/.github/workflows/5-slack-update-message.yml +++ b/.github/workflows/5-slack-update-message.yml @@ -4,6 +4,7 @@ on: [push] jobs: slack-action: + if: ${{ false }} # temp disable runs-on: ubuntu-20.04 name: Test 5 [ubuntu-20.04] diff --git a/.github/workflows/6-slack-thread-with-broadcast.yml b/.github/workflows/6-slack-thread-with-broadcast.yml index 2f1ff43..fe31274 100644 --- a/.github/workflows/6-slack-thread-with-broadcast.yml +++ b/.github/workflows/6-slack-thread-with-broadcast.yml @@ -4,6 +4,7 @@ on: [push] jobs: slack-action: + if: ${{ false }} # temp disable runs-on: ubuntu-20.04 name: Test 6 [ubuntu-20.04] diff --git a/.github/workflows/7-slack-notification-multi-channel.yml b/.github/workflows/7-slack-notification-multi-channel.yml index 648226f..f2f5bb5 100644 --- a/.github/workflows/7-slack-notification-multi-channel.yml +++ b/.github/workflows/7-slack-notification-multi-channel.yml @@ -4,6 +4,7 @@ on: [push] jobs: slack-action: + if: ${{ false }} # temp disable runs-on: windows-2019 name: Test 7 [windows-2019] diff --git a/.github/workflows/8-slack-notification-line-breaks.yml b/.github/workflows/8-slack-notification-line-breaks.yml index 2ac3e7d..5aa0420 100644 --- a/.github/workflows/8-slack-notification-line-breaks.yml +++ b/.github/workflows/8-slack-notification-line-breaks.yml @@ -4,6 +4,7 @@ on: [push] jobs: slack-action: + if: ${{ false }} # temp disable runs-on: windows-latest name: Test 8 [windows-latest] diff --git a/.github/workflows/9-slack-update-message-line-breaks.yml b/.github/workflows/9-slack-update-message-line-breaks.yml index 30bfa3c..cc37da9 100644 --- a/.github/workflows/9-slack-update-message-line-breaks.yml +++ b/.github/workflows/9-slack-update-message-line-breaks.yml @@ -4,6 +4,7 @@ on: [push] jobs: slack-action: + if: ${{ false }} # temp disable runs-on: ubuntu-latest name: Test 9 [ubuntu-latest] From fc907c85b9543ff18d09949fef343655589acc65 Mon Sep 17 00:00:00 2001 From: Anders Date: Fri, 14 Oct 2022 23:39:00 +0200 Subject: [PATCH 15/30] build --- dist/index.js | 3 +++ src/integration/slack-api-post.js | 3 +++ 2 files changed, 6 insertions(+) diff --git a/dist/index.js b/dist/index.js index cbe1cc8..01ea797 100644 --- a/dist/index.js +++ b/dist/index.js @@ -2753,6 +2753,9 @@ const post = (token, path, message) => { return new Promise((resolve, reject) => { const payload = JSON.stringify(message); + console.log("PAYLOAD101"); + console.log(message); + const options = getOptions(token, path); const req = https.request(options, (res) => { diff --git a/src/integration/slack-api-post.js b/src/integration/slack-api-post.js index a99b191..044d58a 100644 --- a/src/integration/slack-api-post.js +++ b/src/integration/slack-api-post.js @@ -17,6 +17,9 @@ const post = (token, path, message) => { return new Promise((resolve, reject) => { const payload = JSON.stringify(message); + console.log("PAYLOAD101"); + console.log(message); + const options = getOptions(token, path); const req = https.request(options, (res) => { From 3008666148f7949ccea1350d2ea3eaff35bc0105 Mon Sep 17 00:00:00 2001 From: Anders Date: Fri, 14 Oct 2022 23:39:48 +0200 Subject: [PATCH 16/30] temp disable other integration tests (to speed up feedback) --- .github/workflows/0-codeql-analysis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/0-codeql-analysis.yml b/.github/workflows/0-codeql-analysis.yml index 8fd84f6..70f4c07 100644 --- a/.github/workflows/0-codeql-analysis.yml +++ b/.github/workflows/0-codeql-analysis.yml @@ -22,6 +22,7 @@ on: jobs: analyze: + if: ${{ false }} # temp disable name: Analyze runs-on: ubuntu-latest permissions: From a2090c1e609eca2f5ed150c3347fed00d9200820 Mon Sep 17 00:00:00 2001 From: Anders Date: Fri, 14 Oct 2022 23:49:36 +0200 Subject: [PATCH 17/30] added missing ts to test and moved ts above text/blocks --- .../workflows/10-slack-fake-build-updates.yml | 2 +- .../workflows/12-slack-message-blocks-update.yml | 1 + .github/workflows/5-slack-update-message.yml | 3 +-- .../9-slack-update-message-line-breaks.yml | 4 ++-- src/update-message/build-update-message.js | 16 +++++++++++++++- 5 files changed, 20 insertions(+), 6 deletions(-) diff --git a/.github/workflows/10-slack-fake-build-updates.yml b/.github/workflows/10-slack-fake-build-updates.yml index 0f2f324..80aaff9 100644 --- a/.github/workflows/10-slack-fake-build-updates.yml +++ b/.github/workflows/10-slack-fake-build-updates.yml @@ -37,5 +37,5 @@ jobs: slack-function: update-message slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }} slack-channel: C036UR31LTD - slack-update-message-text: "${{ format('{0}\n\n```{1}```', ':no_entry_sign: Build status: Failed!', steps.fake-build-process.outputs.BUILD_RESULT) }}" slack-update-message-ts: ${{ fromJson(steps.slack-build-started.outputs.slack-result).response.message.ts }} + slack-update-message-text: "${{ format('{0}\n\n```{1}```', ':no_entry_sign: Build status: Failed!', steps.fake-build-process.outputs.BUILD_RESULT) }}" diff --git a/.github/workflows/12-slack-message-blocks-update.yml b/.github/workflows/12-slack-message-blocks-update.yml index eebfb9b..323f0c4 100644 --- a/.github/workflows/12-slack-message-blocks-update.yml +++ b/.github/workflows/12-slack-message-blocks-update.yml @@ -35,6 +35,7 @@ jobs: with: slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }} slack-channel: C046FKM3TNF + slack-update-message-ts: ${{ fromJson(steps.send-message.outputs.slack-result).response.message.ts }} slack-update-message-blocks: >- [ { diff --git a/.github/workflows/5-slack-update-message.yml b/.github/workflows/5-slack-update-message.yml index 84bcdee..104515a 100644 --- a/.github/workflows/5-slack-update-message.yml +++ b/.github/workflows/5-slack-update-message.yml @@ -4,7 +4,6 @@ on: [push] jobs: slack-action: - if: ${{ false }} # temp disable runs-on: ubuntu-20.04 name: Test 5 [ubuntu-20.04] @@ -31,8 +30,8 @@ jobs: slack-function: update-message slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }} slack-channel: ${{ fromJson(steps.send-message.outputs.slack-result).response.channel }} - slack-update-message-text: Test 5.1 - Message to update - updated slack-update-message-ts: ${{ fromJson(steps.send-message.outputs.slack-result).response.message.ts }} + slack-update-message-text: Test 5.1 - Message to update - updated - name: Send Slack Reaction To Message Result run: echo 'Data - ${{ steps.send-message.outputs.slack-result }}' diff --git a/.github/workflows/9-slack-update-message-line-breaks.yml b/.github/workflows/9-slack-update-message-line-breaks.yml index cc37da9..8251b77 100644 --- a/.github/workflows/9-slack-update-message-line-breaks.yml +++ b/.github/workflows/9-slack-update-message-line-breaks.yml @@ -28,13 +28,13 @@ jobs: slack-function: update-message slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }} slack-channel: ${{ fromJson(steps.send-message-1.outputs.slack-result).response.channel }} + slack-update-message-ts: ${{ fromJson(steps.send-message-1.outputs.slack-result).response.message.ts }} slack-update-message-text: | Test 9.1 - 1/2 Message to update Updated! - slack-update-message-ts: ${{ fromJson(steps.send-message-1.outputs.slack-result).response.message.ts }} - name: Send Slack Reaction To Message Result run: echo 'Data - ${{ steps.send-message-1.outputs.slack-result }}' @@ -63,8 +63,8 @@ jobs: slack-function: update-message slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }} slack-channel: ${{ fromJson(steps.send-message-2.outputs.slack-result).response.channel }} - slack-update-message-text: "${{ format('{0}\n\n{1}', 'Test 9.1 - 2/2', toJson(runner)) }}" slack-update-message-ts: ${{ fromJson(steps.send-message-2.outputs.slack-result).response.message.ts }} + slack-update-message-text: "${{ format('{0}\n\n{1}', 'Test 9.1 - 2/2', toJson(runner)) }}" - name: Send Slack Reaction To Message Result run: echo 'Data - ${{ steps.send-message-2.outputs.slack-result }}' diff --git a/src/update-message/build-update-message.js b/src/update-message/build-update-message.js index a8863c6..509eaeb 100644 --- a/src/update-message/build-update-message.js +++ b/src/update-message/build-update-message.js @@ -3,7 +3,21 @@ const { restoreEscapedTab, } = require("../util/escaper.js"); -const buildMessage = (channel = "", text = "", blocks = "", ts = "", optional = {}) => { +const buildMessage = ( + channel = "", + text = "", + blocks = "", + ts = "", + optional = {} +) => { + if (!channel || !ts) { + throw new Error("Channel and/or TS must be set"); + } + + if (!text && !blocks) { + throw new Error("Text OR Block must be set"); + } + const message = { channel, text, From b328e13d7665d443817f31d755447489321fecc9 Mon Sep 17 00:00:00 2001 From: Anders Date: Fri, 14 Oct 2022 23:49:45 +0200 Subject: [PATCH 18/30] build --- dist/index.js | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/dist/index.js b/dist/index.js index 01ea797..89a8642 100644 --- a/dist/index.js +++ b/dist/index.js @@ -3043,7 +3043,21 @@ const { restoreEscapedTab, } = __nccwpck_require__(307); -const buildMessage = (channel = "", text = "", blocks = "", ts = "", optional = {}) => { +const buildMessage = ( + channel = "", + text = "", + blocks = "", + ts = "", + optional = {} +) => { + if (!channel || !ts) { + throw new Error("Channel and/or TS must be set"); + } + + if (!text && !blocks) { + throw new Error("Text OR Block must be set"); + } + const message = { channel, text, From ee8c02c55f8ddae965bd34c1cb7466a8d69e903d Mon Sep 17 00:00:00 2001 From: Anders Date: Fri, 14 Oct 2022 23:54:58 +0200 Subject: [PATCH 19/30] build --- dist/index.js | 3 +++ src/update-message/index.js | 3 +++ 2 files changed, 6 insertions(+) diff --git a/dist/index.js b/dist/index.js index 89a8642..00ad8a0 100644 --- a/dist/index.js +++ b/dist/index.js @@ -3099,6 +3099,9 @@ const updateMessage = async () => { const payload = buildUpdateMessage(channelId, text, blocks, ts, optional()); + console.log("buildUpdateMessage101"); + console.log(payload); + context.debugExtra("Update Message PAYLOAD", payload); const result = await apiUpdateMessage(token, payload); context.debug("Update Message RESULT", result); diff --git a/src/update-message/index.js b/src/update-message/index.js index 9e322a5..15c6981 100644 --- a/src/update-message/index.js +++ b/src/update-message/index.js @@ -14,6 +14,9 @@ const updateMessage = async () => { const payload = buildUpdateMessage(channelId, text, blocks, ts, optional()); + console.log("buildUpdateMessage101"); + console.log(payload); + context.debugExtra("Update Message PAYLOAD", payload); const result = await apiUpdateMessage(token, payload); context.debug("Update Message RESULT", result); From bbb55d471cbd1314d9d7950aae975843b92f5da1 Mon Sep 17 00:00:00 2001 From: Anders Date: Fri, 14 Oct 2022 23:58:11 +0200 Subject: [PATCH 20/30] build --- .github/workflows/12-slack-message-blocks-update.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/12-slack-message-blocks-update.yml b/.github/workflows/12-slack-message-blocks-update.yml index 323f0c4..eff167d 100644 --- a/.github/workflows/12-slack-message-blocks-update.yml +++ b/.github/workflows/12-slack-message-blocks-update.yml @@ -12,6 +12,7 @@ jobs: uses: archive/github-actions-slack@update_message_with_blocks id: send-message with: + slack-function: update-message slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }} slack-channel: C046FKM3TNF slack-blocks: >- From 1f8cd0c00a3e9dc3c627dc1d5af77eb16c8a2fc2 Mon Sep 17 00:00:00 2001 From: Anders Date: Fri, 14 Oct 2022 23:59:30 +0200 Subject: [PATCH 21/30] build --- .github/workflows/11-slack-message-blocks.yml | 1 + .github/workflows/12-slack-message-blocks-update.yml | 2 +- .github/workflows/5-slack-update-message.yml | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/11-slack-message-blocks.yml b/.github/workflows/11-slack-message-blocks.yml index 6de1797..5176b0c 100644 --- a/.github/workflows/11-slack-message-blocks.yml +++ b/.github/workflows/11-slack-message-blocks.yml @@ -4,6 +4,7 @@ on: [push, issues] jobs: slack-action: + if: ${{ false }} # temp disable runs-on: ubuntu-20.04 name: Test 11 [ubuntu-20.04] diff --git a/.github/workflows/12-slack-message-blocks-update.yml b/.github/workflows/12-slack-message-blocks-update.yml index eff167d..6fc58fe 100644 --- a/.github/workflows/12-slack-message-blocks-update.yml +++ b/.github/workflows/12-slack-message-blocks-update.yml @@ -12,7 +12,6 @@ jobs: uses: archive/github-actions-slack@update_message_with_blocks id: send-message with: - slack-function: update-message slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }} slack-channel: C046FKM3TNF slack-blocks: >- @@ -34,6 +33,7 @@ jobs: uses: archive/github-actions-slack@update_message_with_blocks id: send-message-update with: + slack-function: update-message slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }} slack-channel: C046FKM3TNF slack-update-message-ts: ${{ fromJson(steps.send-message.outputs.slack-result).response.message.ts }} diff --git a/.github/workflows/5-slack-update-message.yml b/.github/workflows/5-slack-update-message.yml index 104515a..bcaa7cc 100644 --- a/.github/workflows/5-slack-update-message.yml +++ b/.github/workflows/5-slack-update-message.yml @@ -4,6 +4,7 @@ on: [push] jobs: slack-action: + if: ${{ false }} # temp disable runs-on: ubuntu-20.04 name: Test 5 [ubuntu-20.04] From 7ded302872206393b7d2dcaf41d0440a98ee25b8 Mon Sep 17 00:00:00 2001 From: Anders Date: Sat, 15 Oct 2022 00:01:42 +0200 Subject: [PATCH 22/30] build --- .../13-slack-message-blocks-fail-test.yml | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 .github/workflows/13-slack-message-blocks-fail-test.yml diff --git a/.github/workflows/13-slack-message-blocks-fail-test.yml b/.github/workflows/13-slack-message-blocks-fail-test.yml new file mode 100644 index 0000000..699a359 --- /dev/null +++ b/.github/workflows/13-slack-message-blocks-fail-test.yml @@ -0,0 +1,52 @@ +name: test-11-slack-message-blocks + +on: [push, issues] + +jobs: + slack-action: + runs-on: ubuntu-20.04 + name: Test 11 [ubuntu-20.04] + + steps: + - name: Send Slack Message (Blocks) + uses: archive/github-actions-slack@update_message_with_blocks + id: send-message + with: + slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }} + slack-channel: C046J5U2RGC + slack-function: update-message + slack-blocks: >- + [ + { + "block_id": "text1", + "type": "section", + "text": { + "type": "mrkdwn", + "text": "Building repo *product-service*" + } + }, + { + "type": "divider" + }, + { + "block_id": "text2", + "type": "context", + "elements": [ + { + "type": "image", + "image_url": "https://upload.wikimedia.org/wikipedia/en/thumb/4/4c/Flag_of_Sweden.svg/1200px-Flag_of_Sweden.svg.png", + "alt_text": "images" + }, + { + "type": "plain_text", + "text": "Estimated time: 1 min" + } + ] + }, + { + "type": "divider" + } + ] + + - name: Result from "Send Slack Message" + run: echo '${{ steps.send-message.outputs.slack-result }}' From bc63b6b86fb669c6064e3efb0ad870d66f6c0300 Mon Sep 17 00:00:00 2001 From: Anders Date: Sat, 15 Oct 2022 00:02:58 +0200 Subject: [PATCH 23/30] build --- .github/workflows/12-slack-message-blocks-update.yml | 2 +- .github/workflows/13-slack-message-blocks-fail-test.yml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/12-slack-message-blocks-update.yml b/.github/workflows/12-slack-message-blocks-update.yml index 6fc58fe..49d6b65 100644 --- a/.github/workflows/12-slack-message-blocks-update.yml +++ b/.github/workflows/12-slack-message-blocks-update.yml @@ -5,7 +5,7 @@ on: [push, issues] jobs: slack-action: runs-on: ubuntu-20.04 - name: Test 11 [ubuntu-20.04] + name: Test 12 [ubuntu-20.04] steps: - name: Send Slack Message (Blocks) diff --git a/.github/workflows/13-slack-message-blocks-fail-test.yml b/.github/workflows/13-slack-message-blocks-fail-test.yml index 699a359..1ba83cc 100644 --- a/.github/workflows/13-slack-message-blocks-fail-test.yml +++ b/.github/workflows/13-slack-message-blocks-fail-test.yml @@ -1,11 +1,11 @@ -name: test-11-slack-message-blocks +name: test-13-slack-message-blocks on: [push, issues] jobs: slack-action: runs-on: ubuntu-20.04 - name: Test 11 [ubuntu-20.04] + name: Test 13 [ubuntu-20.04] steps: - name: Send Slack Message (Blocks) From 1b51211c8603618089c5f71ce0afa30b9e47d616 Mon Sep 17 00:00:00 2001 From: Anders Date: Sat, 15 Oct 2022 00:07:59 +0200 Subject: [PATCH 24/30] build --- dist/index.js | 16 +++++++++++++--- src/integration/slack-api.js | 16 +++++++++++++--- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/dist/index.js b/dist/index.js index 00ad8a0..b7a3f03 100644 --- a/dist/index.js +++ b/dist/index.js @@ -2812,12 +2812,22 @@ const { post } = __nccwpck_require__(451); const hasErrors = (res) => !res || !res.ok; +const buildErrorMessage = (res) => { + let trace = ""; + try { + trace = JSON.stringify(console.trace()); + } catch (error) { + trace = "n/a " + error; + } + return `Error! ${JSON.stringify(res)} [${trace}]`; +}; + const apiPostMessage = async (token, message) => { const path = "/api/chat.postMessage"; const res = await post(token, path, message); if (hasErrors(res)) { - throw `Error! ${JSON.stringify(res)}`; + throw buildErrorMessage(res); } return res; @@ -2828,7 +2838,7 @@ const apiAddReaction = async (token, message) => { const res = await post(token, path, message); if (hasErrors(res)) { - throw `Error! ${JSON.stringify(res)}`; + throw buildErrorMessage(res); } return res; @@ -2839,7 +2849,7 @@ const apiUpdateMessage = async (token, message) => { const res = await post(token, path, message); if (hasErrors(res)) { - throw `Error! ${JSON.stringify(res)}`; + throw buildErrorMessage(res); } return res; diff --git a/src/integration/slack-api.js b/src/integration/slack-api.js index 30e8ab5..0ad775c 100644 --- a/src/integration/slack-api.js +++ b/src/integration/slack-api.js @@ -2,12 +2,22 @@ const { post } = require("./slack-api-post"); const hasErrors = (res) => !res || !res.ok; +const buildErrorMessage = (res) => { + let trace = ""; + try { + trace = JSON.stringify(console.trace()); + } catch (error) { + trace = "n/a " + error; + } + return `Error! ${JSON.stringify(res)} [${trace}]`; +}; + const apiPostMessage = async (token, message) => { const path = "/api/chat.postMessage"; const res = await post(token, path, message); if (hasErrors(res)) { - throw `Error! ${JSON.stringify(res)}`; + throw buildErrorMessage(res); } return res; @@ -18,7 +28,7 @@ const apiAddReaction = async (token, message) => { const res = await post(token, path, message); if (hasErrors(res)) { - throw `Error! ${JSON.stringify(res)}`; + throw buildErrorMessage(res); } return res; @@ -29,7 +39,7 @@ const apiUpdateMessage = async (token, message) => { const res = await post(token, path, message); if (hasErrors(res)) { - throw `Error! ${JSON.stringify(res)}`; + throw buildErrorMessage(res); } return res; From 201c6c13ff0aec714f9d5e9d48bac85ad5a8d538 Mon Sep 17 00:00:00 2001 From: Anders Date: Sat, 15 Oct 2022 00:11:41 +0200 Subject: [PATCH 25/30] build --- .github/workflows/0-codeql-analysis.yml | 2 +- ...-notification-with-optional-parameters.yml | 2 +- .../workflows/10-slack-fake-build-updates.yml | 2 +- .github/workflows/11-slack-message-blocks.yml | 2 +- .../12-slack-message-blocks-update.yml | 1 + .../13-slack-message-blocks-fail-test.yml | 52 ------------------- .github/workflows/2-slack-notification.yml | 2 +- .github/workflows/3-slack-reaction.yml | 2 +- .github/workflows/4-slack-thread.yml | 2 +- .github/workflows/5-slack-update-message.yml | 2 +- .../6-slack-thread-with-broadcast.yml | 2 +- .../7-slack-notification-multi-channel.yml | 2 +- .../8-slack-notification-line-breaks.yml | 2 +- .../9-slack-update-message-line-breaks.yml | 2 +- dist/index.js | 6 --- src/integration/slack-api-post.js | 3 -- src/update-message/index.js | 3 -- 17 files changed, 13 insertions(+), 76 deletions(-) delete mode 100644 .github/workflows/13-slack-message-blocks-fail-test.yml diff --git a/.github/workflows/0-codeql-analysis.yml b/.github/workflows/0-codeql-analysis.yml index 70f4c07..0e137eb 100644 --- a/.github/workflows/0-codeql-analysis.yml +++ b/.github/workflows/0-codeql-analysis.yml @@ -22,7 +22,7 @@ on: jobs: analyze: - if: ${{ false }} # temp disable + #if: ${{ false }} name: Analyze runs-on: ubuntu-latest permissions: diff --git a/.github/workflows/1-slack-notification-with-optional-parameters.yml b/.github/workflows/1-slack-notification-with-optional-parameters.yml index 55fa4b0..c7e2804 100644 --- a/.github/workflows/1-slack-notification-with-optional-parameters.yml +++ b/.github/workflows/1-slack-notification-with-optional-parameters.yml @@ -4,7 +4,7 @@ on: [push] jobs: slack-action: - if: ${{ false }} # temp disable + #if: ${{ false }} runs-on: ubuntu-20.04 name: Test 1 [ubuntu-20.04] diff --git a/.github/workflows/10-slack-fake-build-updates.yml b/.github/workflows/10-slack-fake-build-updates.yml index 80aaff9..a8c4781 100644 --- a/.github/workflows/10-slack-fake-build-updates.yml +++ b/.github/workflows/10-slack-fake-build-updates.yml @@ -4,7 +4,7 @@ on: [push] jobs: slack-action: - if: ${{ false }} # temp disable + #if: ${{ false }} runs-on: ubuntu-20.04 name: Test 10 [ubuntu-20.04] diff --git a/.github/workflows/11-slack-message-blocks.yml b/.github/workflows/11-slack-message-blocks.yml index 5176b0c..69f8ec0 100644 --- a/.github/workflows/11-slack-message-blocks.yml +++ b/.github/workflows/11-slack-message-blocks.yml @@ -4,7 +4,7 @@ on: [push, issues] jobs: slack-action: - if: ${{ false }} # temp disable + #if: ${{ false }} runs-on: ubuntu-20.04 name: Test 11 [ubuntu-20.04] diff --git a/.github/workflows/12-slack-message-blocks-update.yml b/.github/workflows/12-slack-message-blocks-update.yml index 49d6b65..cfd000a 100644 --- a/.github/workflows/12-slack-message-blocks-update.yml +++ b/.github/workflows/12-slack-message-blocks-update.yml @@ -4,6 +4,7 @@ on: [push, issues] jobs: slack-action: + #if: ${{ false }} runs-on: ubuntu-20.04 name: Test 12 [ubuntu-20.04] diff --git a/.github/workflows/13-slack-message-blocks-fail-test.yml b/.github/workflows/13-slack-message-blocks-fail-test.yml deleted file mode 100644 index 1ba83cc..0000000 --- a/.github/workflows/13-slack-message-blocks-fail-test.yml +++ /dev/null @@ -1,52 +0,0 @@ -name: test-13-slack-message-blocks - -on: [push, issues] - -jobs: - slack-action: - runs-on: ubuntu-20.04 - name: Test 13 [ubuntu-20.04] - - steps: - - name: Send Slack Message (Blocks) - uses: archive/github-actions-slack@update_message_with_blocks - id: send-message - with: - slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }} - slack-channel: C046J5U2RGC - slack-function: update-message - slack-blocks: >- - [ - { - "block_id": "text1", - "type": "section", - "text": { - "type": "mrkdwn", - "text": "Building repo *product-service*" - } - }, - { - "type": "divider" - }, - { - "block_id": "text2", - "type": "context", - "elements": [ - { - "type": "image", - "image_url": "https://upload.wikimedia.org/wikipedia/en/thumb/4/4c/Flag_of_Sweden.svg/1200px-Flag_of_Sweden.svg.png", - "alt_text": "images" - }, - { - "type": "plain_text", - "text": "Estimated time: 1 min" - } - ] - }, - { - "type": "divider" - } - ] - - - name: Result from "Send Slack Message" - run: echo '${{ steps.send-message.outputs.slack-result }}' diff --git a/.github/workflows/2-slack-notification.yml b/.github/workflows/2-slack-notification.yml index 08e3a47..fbbdf17 100644 --- a/.github/workflows/2-slack-notification.yml +++ b/.github/workflows/2-slack-notification.yml @@ -4,7 +4,7 @@ on: [push] jobs: slack-action: - if: ${{ false }} # temp disable + #if: ${{ false }} runs-on: windows-latest name: Test 2 [windows-latest] diff --git a/.github/workflows/3-slack-reaction.yml b/.github/workflows/3-slack-reaction.yml index ded1e4a..9d2e99e 100644 --- a/.github/workflows/3-slack-reaction.yml +++ b/.github/workflows/3-slack-reaction.yml @@ -4,7 +4,7 @@ on: [push] jobs: slack-action: - if: ${{ false }} # temp disable + #if: ${{ false }} runs-on: ubuntu-latest name: Test 3 [ubuntu-latest] diff --git a/.github/workflows/4-slack-thread.yml b/.github/workflows/4-slack-thread.yml index cbf8264..b390aa2 100644 --- a/.github/workflows/4-slack-thread.yml +++ b/.github/workflows/4-slack-thread.yml @@ -4,7 +4,7 @@ on: [push] jobs: slack-action: - if: ${{ false }} # temp disable + #if: ${{ false }} runs-on: macos-latest name: Test 4 [macos-latest] diff --git a/.github/workflows/5-slack-update-message.yml b/.github/workflows/5-slack-update-message.yml index bcaa7cc..06660ad 100644 --- a/.github/workflows/5-slack-update-message.yml +++ b/.github/workflows/5-slack-update-message.yml @@ -4,7 +4,7 @@ on: [push] jobs: slack-action: - if: ${{ false }} # temp disable + #if: ${{ false }} runs-on: ubuntu-20.04 name: Test 5 [ubuntu-20.04] diff --git a/.github/workflows/6-slack-thread-with-broadcast.yml b/.github/workflows/6-slack-thread-with-broadcast.yml index fe31274..59963c8 100644 --- a/.github/workflows/6-slack-thread-with-broadcast.yml +++ b/.github/workflows/6-slack-thread-with-broadcast.yml @@ -4,7 +4,7 @@ on: [push] jobs: slack-action: - if: ${{ false }} # temp disable + #if: ${{ false }} runs-on: ubuntu-20.04 name: Test 6 [ubuntu-20.04] diff --git a/.github/workflows/7-slack-notification-multi-channel.yml b/.github/workflows/7-slack-notification-multi-channel.yml index f2f5bb5..f466ef0 100644 --- a/.github/workflows/7-slack-notification-multi-channel.yml +++ b/.github/workflows/7-slack-notification-multi-channel.yml @@ -4,7 +4,7 @@ on: [push] jobs: slack-action: - if: ${{ false }} # temp disable + #if: ${{ false }} runs-on: windows-2019 name: Test 7 [windows-2019] diff --git a/.github/workflows/8-slack-notification-line-breaks.yml b/.github/workflows/8-slack-notification-line-breaks.yml index 5aa0420..d086c08 100644 --- a/.github/workflows/8-slack-notification-line-breaks.yml +++ b/.github/workflows/8-slack-notification-line-breaks.yml @@ -4,7 +4,7 @@ on: [push] jobs: slack-action: - if: ${{ false }} # temp disable + #if: ${{ false }} runs-on: windows-latest name: Test 8 [windows-latest] diff --git a/.github/workflows/9-slack-update-message-line-breaks.yml b/.github/workflows/9-slack-update-message-line-breaks.yml index 8251b77..94816f8 100644 --- a/.github/workflows/9-slack-update-message-line-breaks.yml +++ b/.github/workflows/9-slack-update-message-line-breaks.yml @@ -4,7 +4,7 @@ on: [push] jobs: slack-action: - if: ${{ false }} # temp disable + #if: ${{ false }} runs-on: ubuntu-latest name: Test 9 [ubuntu-latest] diff --git a/dist/index.js b/dist/index.js index b7a3f03..976fb95 100644 --- a/dist/index.js +++ b/dist/index.js @@ -2753,9 +2753,6 @@ const post = (token, path, message) => { return new Promise((resolve, reject) => { const payload = JSON.stringify(message); - console.log("PAYLOAD101"); - console.log(message); - const options = getOptions(token, path); const req = https.request(options, (res) => { @@ -3109,9 +3106,6 @@ const updateMessage = async () => { const payload = buildUpdateMessage(channelId, text, blocks, ts, optional()); - console.log("buildUpdateMessage101"); - console.log(payload); - context.debugExtra("Update Message PAYLOAD", payload); const result = await apiUpdateMessage(token, payload); context.debug("Update Message RESULT", result); diff --git a/src/integration/slack-api-post.js b/src/integration/slack-api-post.js index 044d58a..a99b191 100644 --- a/src/integration/slack-api-post.js +++ b/src/integration/slack-api-post.js @@ -17,9 +17,6 @@ const post = (token, path, message) => { return new Promise((resolve, reject) => { const payload = JSON.stringify(message); - console.log("PAYLOAD101"); - console.log(message); - const options = getOptions(token, path); const req = https.request(options, (res) => { diff --git a/src/update-message/index.js b/src/update-message/index.js index 15c6981..9e322a5 100644 --- a/src/update-message/index.js +++ b/src/update-message/index.js @@ -14,9 +14,6 @@ const updateMessage = async () => { const payload = buildUpdateMessage(channelId, text, blocks, ts, optional()); - console.log("buildUpdateMessage101"); - console.log(payload); - context.debugExtra("Update Message PAYLOAD", payload); const result = await apiUpdateMessage(token, payload); context.debug("Update Message RESULT", result); From 6b271396c5e56718962c2b881536dd2feb244b5b Mon Sep 17 00:00:00 2001 From: Anders Date: Sat, 15 Oct 2022 00:18:00 +0200 Subject: [PATCH 26/30] build --- dist/index.js | 8 +------- src/integration/slack-api.js | 8 +------- 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/dist/index.js b/dist/index.js index 976fb95..4eb3dc3 100644 --- a/dist/index.js +++ b/dist/index.js @@ -2810,13 +2810,7 @@ const { post } = __nccwpck_require__(451); const hasErrors = (res) => !res || !res.ok; const buildErrorMessage = (res) => { - let trace = ""; - try { - trace = JSON.stringify(console.trace()); - } catch (error) { - trace = "n/a " + error; - } - return `Error! ${JSON.stringify(res)} [${trace}]`; + return `Error! ${JSON.stringify(res)} (response)`; }; const apiPostMessage = async (token, message) => { diff --git a/src/integration/slack-api.js b/src/integration/slack-api.js index 0ad775c..621c231 100644 --- a/src/integration/slack-api.js +++ b/src/integration/slack-api.js @@ -3,13 +3,7 @@ const { post } = require("./slack-api-post"); const hasErrors = (res) => !res || !res.ok; const buildErrorMessage = (res) => { - let trace = ""; - try { - trace = JSON.stringify(console.trace()); - } catch (error) { - trace = "n/a " + error; - } - return `Error! ${JSON.stringify(res)} [${trace}]`; + return `Error! ${JSON.stringify(res)} (response)`; }; const apiPostMessage = async (token, message) => { From 102b45c92c64f6af91708a143dd74246c29bef97 Mon Sep 17 00:00:00 2001 From: Anders Date: Sat, 15 Oct 2022 00:26:47 +0200 Subject: [PATCH 27/30] text and blocks needs to be handle in the builders --- dist/index.js | 3289 -------------------- integration-test/end-to-end.js | 4 +- src/message/build-message.js | 21 +- src/message/build-message.test.js | 18 +- src/update-message/build-update-message.js | 10 +- 5 files changed, 41 insertions(+), 3301 deletions(-) delete mode 100644 dist/index.js diff --git a/dist/index.js b/dist/index.js deleted file mode 100644 index 4eb3dc3..0000000 --- a/dist/index.js +++ /dev/null @@ -1,3289 +0,0 @@ -/******/ (() => { // webpackBootstrap -/******/ var __webpack_modules__ = ({ - -/***/ 351: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.issue = exports.issueCommand = void 0; -const os = __importStar(__nccwpck_require__(37)); -const utils_1 = __nccwpck_require__(278); -/** - * Commands - * - * Command Format: - * ::name key=value,key=value::message - * - * Examples: - * ::warning::This is the message - * ::set-env name=MY_VAR::some value - */ -function issueCommand(command, properties, message) { - const cmd = new Command(command, properties, message); - process.stdout.write(cmd.toString() + os.EOL); -} -exports.issueCommand = issueCommand; -function issue(name, message = '') { - issueCommand(name, {}, message); -} -exports.issue = issue; -const CMD_STRING = '::'; -class Command { - constructor(command, properties, message) { - if (!command) { - command = 'missing.command'; - } - this.command = command; - this.properties = properties; - this.message = message; - } - toString() { - let cmdStr = CMD_STRING + this.command; - if (this.properties && Object.keys(this.properties).length > 0) { - cmdStr += ' '; - let first = true; - for (const key in this.properties) { - if (this.properties.hasOwnProperty(key)) { - const val = this.properties[key]; - if (val) { - if (first) { - first = false; - } - else { - cmdStr += ','; - } - cmdStr += `${key}=${escapeProperty(val)}`; - } - } - } - } - cmdStr += `${CMD_STRING}${escapeData(this.message)}`; - return cmdStr; - } -} -function escapeData(s) { - return utils_1.toCommandValue(s) - .replace(/%/g, '%25') - .replace(/\r/g, '%0D') - .replace(/\n/g, '%0A'); -} -function escapeProperty(s) { - return utils_1.toCommandValue(s) - .replace(/%/g, '%25') - .replace(/\r/g, '%0D') - .replace(/\n/g, '%0A') - .replace(/:/g, '%3A') - .replace(/,/g, '%2C'); -} -//# sourceMappingURL=command.js.map - -/***/ }), - -/***/ 186: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getIDToken = exports.getState = exports.saveState = exports.group = exports.endGroup = exports.startGroup = exports.info = exports.notice = exports.warning = exports.error = exports.debug = exports.isDebug = exports.setFailed = exports.setCommandEcho = exports.setOutput = exports.getBooleanInput = exports.getMultilineInput = exports.getInput = exports.addPath = exports.setSecret = exports.exportVariable = exports.ExitCode = void 0; -const command_1 = __nccwpck_require__(351); -const file_command_1 = __nccwpck_require__(717); -const utils_1 = __nccwpck_require__(278); -const os = __importStar(__nccwpck_require__(37)); -const path = __importStar(__nccwpck_require__(17)); -const oidc_utils_1 = __nccwpck_require__(41); -/** - * The code to exit an action - */ -var ExitCode; -(function (ExitCode) { - /** - * A code indicating that the action was successful - */ - ExitCode[ExitCode["Success"] = 0] = "Success"; - /** - * A code indicating that the action was a failure - */ - ExitCode[ExitCode["Failure"] = 1] = "Failure"; -})(ExitCode = exports.ExitCode || (exports.ExitCode = {})); -//----------------------------------------------------------------------- -// Variables -//----------------------------------------------------------------------- -/** - * Sets env variable for this action and future actions in the job - * @param name the name of the variable to set - * @param val the value of the variable. Non-string values will be converted to a string via JSON.stringify - */ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -function exportVariable(name, val) { - const convertedVal = utils_1.toCommandValue(val); - process.env[name] = convertedVal; - const filePath = process.env['GITHUB_ENV'] || ''; - if (filePath) { - return file_command_1.issueFileCommand('ENV', file_command_1.prepareKeyValueMessage(name, val)); - } - command_1.issueCommand('set-env', { name }, convertedVal); -} -exports.exportVariable = exportVariable; -/** - * Registers a secret which will get masked from logs - * @param secret value of the secret - */ -function setSecret(secret) { - command_1.issueCommand('add-mask', {}, secret); -} -exports.setSecret = setSecret; -/** - * Prepends inputPath to the PATH (for this action and future actions) - * @param inputPath - */ -function addPath(inputPath) { - const filePath = process.env['GITHUB_PATH'] || ''; - if (filePath) { - file_command_1.issueFileCommand('PATH', inputPath); - } - else { - command_1.issueCommand('add-path', {}, inputPath); - } - process.env['PATH'] = `${inputPath}${path.delimiter}${process.env['PATH']}`; -} -exports.addPath = addPath; -/** - * Gets the value of an input. - * Unless trimWhitespace is set to false in InputOptions, the value is also trimmed. - * Returns an empty string if the value is not defined. - * - * @param name name of the input to get - * @param options optional. See InputOptions. - * @returns string - */ -function getInput(name, options) { - const val = process.env[`INPUT_${name.replace(/ /g, '_').toUpperCase()}`] || ''; - if (options && options.required && !val) { - throw new Error(`Input required and not supplied: ${name}`); - } - if (options && options.trimWhitespace === false) { - return val; - } - return val.trim(); -} -exports.getInput = getInput; -/** - * Gets the values of an multiline input. Each value is also trimmed. - * - * @param name name of the input to get - * @param options optional. See InputOptions. - * @returns string[] - * - */ -function getMultilineInput(name, options) { - const inputs = getInput(name, options) - .split('\n') - .filter(x => x !== ''); - if (options && options.trimWhitespace === false) { - return inputs; - } - return inputs.map(input => input.trim()); -} -exports.getMultilineInput = getMultilineInput; -/** - * Gets the input value of the boolean type in the YAML 1.2 "core schema" specification. - * Support boolean input list: `true | True | TRUE | false | False | FALSE` . - * The return value is also in boolean type. - * ref: https://yaml.org/spec/1.2/spec.html#id2804923 - * - * @param name name of the input to get - * @param options optional. See InputOptions. - * @returns boolean - */ -function getBooleanInput(name, options) { - const trueValue = ['true', 'True', 'TRUE']; - const falseValue = ['false', 'False', 'FALSE']; - const val = getInput(name, options); - if (trueValue.includes(val)) - return true; - if (falseValue.includes(val)) - return false; - throw new TypeError(`Input does not meet YAML 1.2 "Core Schema" specification: ${name}\n` + - `Support boolean input list: \`true | True | TRUE | false | False | FALSE\``); -} -exports.getBooleanInput = getBooleanInput; -/** - * Sets the value of an output. - * - * @param name name of the output to set - * @param value value to store. Non-string values will be converted to a string via JSON.stringify - */ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -function setOutput(name, value) { - const filePath = process.env['GITHUB_OUTPUT'] || ''; - if (filePath) { - return file_command_1.issueFileCommand('OUTPUT', file_command_1.prepareKeyValueMessage(name, value)); - } - process.stdout.write(os.EOL); - command_1.issueCommand('set-output', { name }, utils_1.toCommandValue(value)); -} -exports.setOutput = setOutput; -/** - * Enables or disables the echoing of commands into stdout for the rest of the step. - * Echoing is disabled by default if ACTIONS_STEP_DEBUG is not set. - * - */ -function setCommandEcho(enabled) { - command_1.issue('echo', enabled ? 'on' : 'off'); -} -exports.setCommandEcho = setCommandEcho; -//----------------------------------------------------------------------- -// Results -//----------------------------------------------------------------------- -/** - * Sets the action status to failed. - * When the action exits it will be with an exit code of 1 - * @param message add error issue message - */ -function setFailed(message) { - process.exitCode = ExitCode.Failure; - error(message); -} -exports.setFailed = setFailed; -//----------------------------------------------------------------------- -// Logging Commands -//----------------------------------------------------------------------- -/** - * Gets whether Actions Step Debug is on or not - */ -function isDebug() { - return process.env['RUNNER_DEBUG'] === '1'; -} -exports.isDebug = isDebug; -/** - * Writes debug message to user log - * @param message debug message - */ -function debug(message) { - command_1.issueCommand('debug', {}, message); -} -exports.debug = debug; -/** - * Adds an error issue - * @param message error issue message. Errors will be converted to string via toString() - * @param properties optional properties to add to the annotation. - */ -function error(message, properties = {}) { - command_1.issueCommand('error', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message); -} -exports.error = error; -/** - * Adds a warning issue - * @param message warning issue message. Errors will be converted to string via toString() - * @param properties optional properties to add to the annotation. - */ -function warning(message, properties = {}) { - command_1.issueCommand('warning', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message); -} -exports.warning = warning; -/** - * Adds a notice issue - * @param message notice issue message. Errors will be converted to string via toString() - * @param properties optional properties to add to the annotation. - */ -function notice(message, properties = {}) { - command_1.issueCommand('notice', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message); -} -exports.notice = notice; -/** - * Writes info to log with console.log. - * @param message info message - */ -function info(message) { - process.stdout.write(message + os.EOL); -} -exports.info = info; -/** - * Begin an output group. - * - * Output until the next `groupEnd` will be foldable in this group - * - * @param name The name of the output group - */ -function startGroup(name) { - command_1.issue('group', name); -} -exports.startGroup = startGroup; -/** - * End an output group. - */ -function endGroup() { - command_1.issue('endgroup'); -} -exports.endGroup = endGroup; -/** - * Wrap an asynchronous function call in a group. - * - * Returns the same type as the function itself. - * - * @param name The name of the group - * @param fn The function to wrap in the group - */ -function group(name, fn) { - return __awaiter(this, void 0, void 0, function* () { - startGroup(name); - let result; - try { - result = yield fn(); - } - finally { - endGroup(); - } - return result; - }); -} -exports.group = group; -//----------------------------------------------------------------------- -// Wrapper action state -//----------------------------------------------------------------------- -/** - * Saves state for current action, the state can only be retrieved by this action's post job execution. - * - * @param name name of the state to store - * @param value value to store. Non-string values will be converted to a string via JSON.stringify - */ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -function saveState(name, value) { - const filePath = process.env['GITHUB_STATE'] || ''; - if (filePath) { - return file_command_1.issueFileCommand('STATE', file_command_1.prepareKeyValueMessage(name, value)); - } - command_1.issueCommand('save-state', { name }, utils_1.toCommandValue(value)); -} -exports.saveState = saveState; -/** - * Gets the value of an state set by this action's main execution. - * - * @param name name of the state to get - * @returns string - */ -function getState(name) { - return process.env[`STATE_${name}`] || ''; -} -exports.getState = getState; -function getIDToken(aud) { - return __awaiter(this, void 0, void 0, function* () { - return yield oidc_utils_1.OidcClient.getIDToken(aud); - }); -} -exports.getIDToken = getIDToken; -/** - * Summary exports - */ -var summary_1 = __nccwpck_require__(327); -Object.defineProperty(exports, "summary", ({ enumerable: true, get: function () { return summary_1.summary; } })); -/** - * @deprecated use core.summary - */ -var summary_2 = __nccwpck_require__(327); -Object.defineProperty(exports, "markdownSummary", ({ enumerable: true, get: function () { return summary_2.markdownSummary; } })); -/** - * Path exports - */ -var path_utils_1 = __nccwpck_require__(981); -Object.defineProperty(exports, "toPosixPath", ({ enumerable: true, get: function () { return path_utils_1.toPosixPath; } })); -Object.defineProperty(exports, "toWin32Path", ({ enumerable: true, get: function () { return path_utils_1.toWin32Path; } })); -Object.defineProperty(exports, "toPlatformPath", ({ enumerable: true, get: function () { return path_utils_1.toPlatformPath; } })); -//# sourceMappingURL=core.js.map - -/***/ }), - -/***/ 717: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -// For internal use, subject to change. -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.prepareKeyValueMessage = exports.issueFileCommand = void 0; -// We use any as a valid input type -/* eslint-disable @typescript-eslint/no-explicit-any */ -const fs = __importStar(__nccwpck_require__(147)); -const os = __importStar(__nccwpck_require__(37)); -const uuid_1 = __nccwpck_require__(840); -const utils_1 = __nccwpck_require__(278); -function issueFileCommand(command, message) { - const filePath = process.env[`GITHUB_${command}`]; - if (!filePath) { - throw new Error(`Unable to find environment variable for file command ${command}`); - } - if (!fs.existsSync(filePath)) { - throw new Error(`Missing file at path: ${filePath}`); - } - fs.appendFileSync(filePath, `${utils_1.toCommandValue(message)}${os.EOL}`, { - encoding: 'utf8' - }); -} -exports.issueFileCommand = issueFileCommand; -function prepareKeyValueMessage(key, value) { - const delimiter = `ghadelimiter_${uuid_1.v4()}`; - const convertedValue = utils_1.toCommandValue(value); - // These should realistically never happen, but just in case someone finds a - // way to exploit uuid generation let's not allow keys or values that contain - // the delimiter. - if (key.includes(delimiter)) { - throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`); - } - if (convertedValue.includes(delimiter)) { - throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`); - } - return `${key}<<${delimiter}${os.EOL}${convertedValue}${os.EOL}${delimiter}`; -} -exports.prepareKeyValueMessage = prepareKeyValueMessage; -//# sourceMappingURL=file-command.js.map - -/***/ }), - -/***/ 41: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.OidcClient = void 0; -const http_client_1 = __nccwpck_require__(255); -const auth_1 = __nccwpck_require__(526); -const core_1 = __nccwpck_require__(186); -class OidcClient { - static createHttpClient(allowRetry = true, maxRetry = 10) { - const requestOptions = { - allowRetries: allowRetry, - maxRetries: maxRetry - }; - return new http_client_1.HttpClient('actions/oidc-client', [new auth_1.BearerCredentialHandler(OidcClient.getRequestToken())], requestOptions); - } - static getRequestToken() { - const token = process.env['ACTIONS_ID_TOKEN_REQUEST_TOKEN']; - if (!token) { - throw new Error('Unable to get ACTIONS_ID_TOKEN_REQUEST_TOKEN env variable'); - } - return token; - } - static getIDTokenUrl() { - const runtimeUrl = process.env['ACTIONS_ID_TOKEN_REQUEST_URL']; - if (!runtimeUrl) { - throw new Error('Unable to get ACTIONS_ID_TOKEN_REQUEST_URL env variable'); - } - return runtimeUrl; - } - static getCall(id_token_url) { - var _a; - return __awaiter(this, void 0, void 0, function* () { - const httpclient = OidcClient.createHttpClient(); - const res = yield httpclient - .getJson(id_token_url) - .catch(error => { - throw new Error(`Failed to get ID Token. \n - Error Code : ${error.statusCode}\n - Error Message: ${error.result.message}`); - }); - const id_token = (_a = res.result) === null || _a === void 0 ? void 0 : _a.value; - if (!id_token) { - throw new Error('Response json body do not have ID Token field'); - } - return id_token; - }); - } - static getIDToken(audience) { - return __awaiter(this, void 0, void 0, function* () { - try { - // New ID Token is requested from action service - let id_token_url = OidcClient.getIDTokenUrl(); - if (audience) { - const encodedAudience = encodeURIComponent(audience); - id_token_url = `${id_token_url}&audience=${encodedAudience}`; - } - core_1.debug(`ID token url is ${id_token_url}`); - const id_token = yield OidcClient.getCall(id_token_url); - core_1.setSecret(id_token); - return id_token; - } - catch (error) { - throw new Error(`Error message: ${error.message}`); - } - }); - } -} -exports.OidcClient = OidcClient; -//# sourceMappingURL=oidc-utils.js.map - -/***/ }), - -/***/ 981: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.toPlatformPath = exports.toWin32Path = exports.toPosixPath = void 0; -const path = __importStar(__nccwpck_require__(17)); -/** - * toPosixPath converts the given path to the posix form. On Windows, \\ will be - * replaced with /. - * - * @param pth. Path to transform. - * @return string Posix path. - */ -function toPosixPath(pth) { - return pth.replace(/[\\]/g, '/'); -} -exports.toPosixPath = toPosixPath; -/** - * toWin32Path converts the given path to the win32 form. On Linux, / will be - * replaced with \\. - * - * @param pth. Path to transform. - * @return string Win32 path. - */ -function toWin32Path(pth) { - return pth.replace(/[/]/g, '\\'); -} -exports.toWin32Path = toWin32Path; -/** - * toPlatformPath converts the given path to a platform-specific path. It does - * this by replacing instances of / and \ with the platform-specific path - * separator. - * - * @param pth The path to platformize. - * @return string The platform-specific path. - */ -function toPlatformPath(pth) { - return pth.replace(/[/\\]/g, path.sep); -} -exports.toPlatformPath = toPlatformPath; -//# sourceMappingURL=path-utils.js.map - -/***/ }), - -/***/ 327: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.summary = exports.markdownSummary = exports.SUMMARY_DOCS_URL = exports.SUMMARY_ENV_VAR = void 0; -const os_1 = __nccwpck_require__(37); -const fs_1 = __nccwpck_require__(147); -const { access, appendFile, writeFile } = fs_1.promises; -exports.SUMMARY_ENV_VAR = 'GITHUB_STEP_SUMMARY'; -exports.SUMMARY_DOCS_URL = 'https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#adding-a-job-summary'; -class Summary { - constructor() { - this._buffer = ''; - } - /** - * Finds the summary file path from the environment, rejects if env var is not found or file does not exist - * Also checks r/w permissions. - * - * @returns step summary file path - */ - filePath() { - return __awaiter(this, void 0, void 0, function* () { - if (this._filePath) { - return this._filePath; - } - const pathFromEnv = process.env[exports.SUMMARY_ENV_VAR]; - if (!pathFromEnv) { - throw new Error(`Unable to find environment variable for $${exports.SUMMARY_ENV_VAR}. Check if your runtime environment supports job summaries.`); - } - try { - yield access(pathFromEnv, fs_1.constants.R_OK | fs_1.constants.W_OK); - } - catch (_a) { - throw new Error(`Unable to access summary file: '${pathFromEnv}'. Check if the file has correct read/write permissions.`); - } - this._filePath = pathFromEnv; - return this._filePath; - }); - } - /** - * Wraps content in an HTML tag, adding any HTML attributes - * - * @param {string} tag HTML tag to wrap - * @param {string | null} content content within the tag - * @param {[attribute: string]: string} attrs key-value list of HTML attributes to add - * - * @returns {string} content wrapped in HTML element - */ - wrap(tag, content, attrs = {}) { - const htmlAttrs = Object.entries(attrs) - .map(([key, value]) => ` ${key}="${value}"`) - .join(''); - if (!content) { - return `<${tag}${htmlAttrs}>`; - } - return `<${tag}${htmlAttrs}>${content}`; - } - /** - * Writes text in the buffer to the summary buffer file and empties buffer. Will append by default. - * - * @param {SummaryWriteOptions} [options] (optional) options for write operation - * - * @returns {Promise} summary instance - */ - write(options) { - return __awaiter(this, void 0, void 0, function* () { - const overwrite = !!(options === null || options === void 0 ? void 0 : options.overwrite); - const filePath = yield this.filePath(); - const writeFunc = overwrite ? writeFile : appendFile; - yield writeFunc(filePath, this._buffer, { encoding: 'utf8' }); - return this.emptyBuffer(); - }); - } - /** - * Clears the summary buffer and wipes the summary file - * - * @returns {Summary} summary instance - */ - clear() { - return __awaiter(this, void 0, void 0, function* () { - return this.emptyBuffer().write({ overwrite: true }); - }); - } - /** - * Returns the current summary buffer as a string - * - * @returns {string} string of summary buffer - */ - stringify() { - return this._buffer; - } - /** - * If the summary buffer is empty - * - * @returns {boolen} true if the buffer is empty - */ - isEmptyBuffer() { - return this._buffer.length === 0; - } - /** - * Resets the summary buffer without writing to summary file - * - * @returns {Summary} summary instance - */ - emptyBuffer() { - this._buffer = ''; - return this; - } - /** - * Adds raw text to the summary buffer - * - * @param {string} text content to add - * @param {boolean} [addEOL=false] (optional) append an EOL to the raw text (default: false) - * - * @returns {Summary} summary instance - */ - addRaw(text, addEOL = false) { - this._buffer += text; - return addEOL ? this.addEOL() : this; - } - /** - * Adds the operating system-specific end-of-line marker to the buffer - * - * @returns {Summary} summary instance - */ - addEOL() { - return this.addRaw(os_1.EOL); - } - /** - * Adds an HTML codeblock to the summary buffer - * - * @param {string} code content to render within fenced code block - * @param {string} lang (optional) language to syntax highlight code - * - * @returns {Summary} summary instance - */ - addCodeBlock(code, lang) { - const attrs = Object.assign({}, (lang && { lang })); - const element = this.wrap('pre', this.wrap('code', code), attrs); - return this.addRaw(element).addEOL(); - } - /** - * Adds an HTML list to the summary buffer - * - * @param {string[]} items list of items to render - * @param {boolean} [ordered=false] (optional) if the rendered list should be ordered or not (default: false) - * - * @returns {Summary} summary instance - */ - addList(items, ordered = false) { - const tag = ordered ? 'ol' : 'ul'; - const listItems = items.map(item => this.wrap('li', item)).join(''); - const element = this.wrap(tag, listItems); - return this.addRaw(element).addEOL(); - } - /** - * Adds an HTML table to the summary buffer - * - * @param {SummaryTableCell[]} rows table rows - * - * @returns {Summary} summary instance - */ - addTable(rows) { - const tableBody = rows - .map(row => { - const cells = row - .map(cell => { - if (typeof cell === 'string') { - return this.wrap('td', cell); - } - const { header, data, colspan, rowspan } = cell; - const tag = header ? 'th' : 'td'; - const attrs = Object.assign(Object.assign({}, (colspan && { colspan })), (rowspan && { rowspan })); - return this.wrap(tag, data, attrs); - }) - .join(''); - return this.wrap('tr', cells); - }) - .join(''); - const element = this.wrap('table', tableBody); - return this.addRaw(element).addEOL(); - } - /** - * Adds a collapsable HTML details element to the summary buffer - * - * @param {string} label text for the closed state - * @param {string} content collapsable content - * - * @returns {Summary} summary instance - */ - addDetails(label, content) { - const element = this.wrap('details', this.wrap('summary', label) + content); - return this.addRaw(element).addEOL(); - } - /** - * Adds an HTML image tag to the summary buffer - * - * @param {string} src path to the image you to embed - * @param {string} alt text description of the image - * @param {SummaryImageOptions} options (optional) addition image attributes - * - * @returns {Summary} summary instance - */ - addImage(src, alt, options) { - const { width, height } = options || {}; - const attrs = Object.assign(Object.assign({}, (width && { width })), (height && { height })); - const element = this.wrap('img', null, Object.assign({ src, alt }, attrs)); - return this.addRaw(element).addEOL(); - } - /** - * Adds an HTML section heading element - * - * @param {string} text heading text - * @param {number | string} [level=1] (optional) the heading level, default: 1 - * - * @returns {Summary} summary instance - */ - addHeading(text, level) { - const tag = `h${level}`; - const allowedTag = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'].includes(tag) - ? tag - : 'h1'; - const element = this.wrap(allowedTag, text); - return this.addRaw(element).addEOL(); - } - /** - * Adds an HTML thematic break (
) to the summary buffer - * - * @returns {Summary} summary instance - */ - addSeparator() { - const element = this.wrap('hr', null); - return this.addRaw(element).addEOL(); - } - /** - * Adds an HTML line break (
) to the summary buffer - * - * @returns {Summary} summary instance - */ - addBreak() { - const element = this.wrap('br', null); - return this.addRaw(element).addEOL(); - } - /** - * Adds an HTML blockquote to the summary buffer - * - * @param {string} text quote text - * @param {string} cite (optional) citation url - * - * @returns {Summary} summary instance - */ - addQuote(text, cite) { - const attrs = Object.assign({}, (cite && { cite })); - const element = this.wrap('blockquote', text, attrs); - return this.addRaw(element).addEOL(); - } - /** - * Adds an HTML anchor tag to the summary buffer - * - * @param {string} text link text/content - * @param {string} href hyperlink - * - * @returns {Summary} summary instance - */ - addLink(text, href) { - const element = this.wrap('a', text, { href }); - return this.addRaw(element).addEOL(); - } -} -const _summary = new Summary(); -/** - * @deprecated use `core.summary` - */ -exports.markdownSummary = _summary; -exports.summary = _summary; -//# sourceMappingURL=summary.js.map - -/***/ }), - -/***/ 278: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -// We use any as a valid input type -/* eslint-disable @typescript-eslint/no-explicit-any */ -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.toCommandProperties = exports.toCommandValue = void 0; -/** - * Sanitizes an input into a string so it can be passed into issueCommand safely - * @param input input to sanitize into a string - */ -function toCommandValue(input) { - if (input === null || input === undefined) { - return ''; - } - else if (typeof input === 'string' || input instanceof String) { - return input; - } - return JSON.stringify(input); -} -exports.toCommandValue = toCommandValue; -/** - * - * @param annotationProperties - * @returns The command properties to send with the actual annotation command - * See IssueCommandProperties: https://github.com/actions/runner/blob/main/src/Runner.Worker/ActionCommandManager.cs#L646 - */ -function toCommandProperties(annotationProperties) { - if (!Object.keys(annotationProperties).length) { - return {}; - } - return { - title: annotationProperties.title, - file: annotationProperties.file, - line: annotationProperties.startLine, - endLine: annotationProperties.endLine, - col: annotationProperties.startColumn, - endColumn: annotationProperties.endColumn - }; -} -exports.toCommandProperties = toCommandProperties; -//# sourceMappingURL=utils.js.map - -/***/ }), - -/***/ 526: -/***/ (function(__unused_webpack_module, exports) { - -"use strict"; - -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.PersonalAccessTokenCredentialHandler = exports.BearerCredentialHandler = exports.BasicCredentialHandler = void 0; -class BasicCredentialHandler { - constructor(username, password) { - this.username = username; - this.password = password; - } - prepareRequest(options) { - if (!options.headers) { - throw Error('The request has no headers'); - } - options.headers['Authorization'] = `Basic ${Buffer.from(`${this.username}:${this.password}`).toString('base64')}`; - } - // This handler cannot handle 401 - canHandleAuthentication() { - return false; - } - handleAuthentication() { - return __awaiter(this, void 0, void 0, function* () { - throw new Error('not implemented'); - }); - } -} -exports.BasicCredentialHandler = BasicCredentialHandler; -class BearerCredentialHandler { - constructor(token) { - this.token = token; - } - // currently implements pre-authorization - // TODO: support preAuth = false where it hooks on 401 - prepareRequest(options) { - if (!options.headers) { - throw Error('The request has no headers'); - } - options.headers['Authorization'] = `Bearer ${this.token}`; - } - // This handler cannot handle 401 - canHandleAuthentication() { - return false; - } - handleAuthentication() { - return __awaiter(this, void 0, void 0, function* () { - throw new Error('not implemented'); - }); - } -} -exports.BearerCredentialHandler = BearerCredentialHandler; -class PersonalAccessTokenCredentialHandler { - constructor(token) { - this.token = token; - } - // currently implements pre-authorization - // TODO: support preAuth = false where it hooks on 401 - prepareRequest(options) { - if (!options.headers) { - throw Error('The request has no headers'); - } - options.headers['Authorization'] = `Basic ${Buffer.from(`PAT:${this.token}`).toString('base64')}`; - } - // This handler cannot handle 401 - canHandleAuthentication() { - return false; - } - handleAuthentication() { - return __awaiter(this, void 0, void 0, function* () { - throw new Error('not implemented'); - }); - } -} -exports.PersonalAccessTokenCredentialHandler = PersonalAccessTokenCredentialHandler; -//# sourceMappingURL=auth.js.map - -/***/ }), - -/***/ 255: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -/* eslint-disable @typescript-eslint/no-explicit-any */ -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.HttpClient = exports.isHttps = exports.HttpClientResponse = exports.HttpClientError = exports.getProxyUrl = exports.MediaTypes = exports.Headers = exports.HttpCodes = void 0; -const http = __importStar(__nccwpck_require__(685)); -const https = __importStar(__nccwpck_require__(687)); -const pm = __importStar(__nccwpck_require__(835)); -const tunnel = __importStar(__nccwpck_require__(294)); -var HttpCodes; -(function (HttpCodes) { - HttpCodes[HttpCodes["OK"] = 200] = "OK"; - HttpCodes[HttpCodes["MultipleChoices"] = 300] = "MultipleChoices"; - HttpCodes[HttpCodes["MovedPermanently"] = 301] = "MovedPermanently"; - HttpCodes[HttpCodes["ResourceMoved"] = 302] = "ResourceMoved"; - HttpCodes[HttpCodes["SeeOther"] = 303] = "SeeOther"; - HttpCodes[HttpCodes["NotModified"] = 304] = "NotModified"; - HttpCodes[HttpCodes["UseProxy"] = 305] = "UseProxy"; - HttpCodes[HttpCodes["SwitchProxy"] = 306] = "SwitchProxy"; - HttpCodes[HttpCodes["TemporaryRedirect"] = 307] = "TemporaryRedirect"; - HttpCodes[HttpCodes["PermanentRedirect"] = 308] = "PermanentRedirect"; - HttpCodes[HttpCodes["BadRequest"] = 400] = "BadRequest"; - HttpCodes[HttpCodes["Unauthorized"] = 401] = "Unauthorized"; - HttpCodes[HttpCodes["PaymentRequired"] = 402] = "PaymentRequired"; - HttpCodes[HttpCodes["Forbidden"] = 403] = "Forbidden"; - HttpCodes[HttpCodes["NotFound"] = 404] = "NotFound"; - HttpCodes[HttpCodes["MethodNotAllowed"] = 405] = "MethodNotAllowed"; - HttpCodes[HttpCodes["NotAcceptable"] = 406] = "NotAcceptable"; - HttpCodes[HttpCodes["ProxyAuthenticationRequired"] = 407] = "ProxyAuthenticationRequired"; - HttpCodes[HttpCodes["RequestTimeout"] = 408] = "RequestTimeout"; - HttpCodes[HttpCodes["Conflict"] = 409] = "Conflict"; - HttpCodes[HttpCodes["Gone"] = 410] = "Gone"; - HttpCodes[HttpCodes["TooManyRequests"] = 429] = "TooManyRequests"; - HttpCodes[HttpCodes["InternalServerError"] = 500] = "InternalServerError"; - HttpCodes[HttpCodes["NotImplemented"] = 501] = "NotImplemented"; - HttpCodes[HttpCodes["BadGateway"] = 502] = "BadGateway"; - HttpCodes[HttpCodes["ServiceUnavailable"] = 503] = "ServiceUnavailable"; - HttpCodes[HttpCodes["GatewayTimeout"] = 504] = "GatewayTimeout"; -})(HttpCodes = exports.HttpCodes || (exports.HttpCodes = {})); -var Headers; -(function (Headers) { - Headers["Accept"] = "accept"; - Headers["ContentType"] = "content-type"; -})(Headers = exports.Headers || (exports.Headers = {})); -var MediaTypes; -(function (MediaTypes) { - MediaTypes["ApplicationJson"] = "application/json"; -})(MediaTypes = exports.MediaTypes || (exports.MediaTypes = {})); -/** - * Returns the proxy URL, depending upon the supplied url and proxy environment variables. - * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com - */ -function getProxyUrl(serverUrl) { - const proxyUrl = pm.getProxyUrl(new URL(serverUrl)); - return proxyUrl ? proxyUrl.href : ''; -} -exports.getProxyUrl = getProxyUrl; -const HttpRedirectCodes = [ - HttpCodes.MovedPermanently, - HttpCodes.ResourceMoved, - HttpCodes.SeeOther, - HttpCodes.TemporaryRedirect, - HttpCodes.PermanentRedirect -]; -const HttpResponseRetryCodes = [ - HttpCodes.BadGateway, - HttpCodes.ServiceUnavailable, - HttpCodes.GatewayTimeout -]; -const RetryableHttpVerbs = ['OPTIONS', 'GET', 'DELETE', 'HEAD']; -const ExponentialBackoffCeiling = 10; -const ExponentialBackoffTimeSlice = 5; -class HttpClientError extends Error { - constructor(message, statusCode) { - super(message); - this.name = 'HttpClientError'; - this.statusCode = statusCode; - Object.setPrototypeOf(this, HttpClientError.prototype); - } -} -exports.HttpClientError = HttpClientError; -class HttpClientResponse { - constructor(message) { - this.message = message; - } - readBody() { - return __awaiter(this, void 0, void 0, function* () { - return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () { - let output = Buffer.alloc(0); - this.message.on('data', (chunk) => { - output = Buffer.concat([output, chunk]); - }); - this.message.on('end', () => { - resolve(output.toString()); - }); - })); - }); - } -} -exports.HttpClientResponse = HttpClientResponse; -function isHttps(requestUrl) { - const parsedUrl = new URL(requestUrl); - return parsedUrl.protocol === 'https:'; -} -exports.isHttps = isHttps; -class HttpClient { - constructor(userAgent, handlers, requestOptions) { - this._ignoreSslError = false; - this._allowRedirects = true; - this._allowRedirectDowngrade = false; - this._maxRedirects = 50; - this._allowRetries = false; - this._maxRetries = 1; - this._keepAlive = false; - this._disposed = false; - this.userAgent = userAgent; - this.handlers = handlers || []; - this.requestOptions = requestOptions; - if (requestOptions) { - if (requestOptions.ignoreSslError != null) { - this._ignoreSslError = requestOptions.ignoreSslError; - } - this._socketTimeout = requestOptions.socketTimeout; - if (requestOptions.allowRedirects != null) { - this._allowRedirects = requestOptions.allowRedirects; - } - if (requestOptions.allowRedirectDowngrade != null) { - this._allowRedirectDowngrade = requestOptions.allowRedirectDowngrade; - } - if (requestOptions.maxRedirects != null) { - this._maxRedirects = Math.max(requestOptions.maxRedirects, 0); - } - if (requestOptions.keepAlive != null) { - this._keepAlive = requestOptions.keepAlive; - } - if (requestOptions.allowRetries != null) { - this._allowRetries = requestOptions.allowRetries; - } - if (requestOptions.maxRetries != null) { - this._maxRetries = requestOptions.maxRetries; - } - } - } - options(requestUrl, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('OPTIONS', requestUrl, null, additionalHeaders || {}); - }); - } - get(requestUrl, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('GET', requestUrl, null, additionalHeaders || {}); - }); - } - del(requestUrl, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('DELETE', requestUrl, null, additionalHeaders || {}); - }); - } - post(requestUrl, data, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('POST', requestUrl, data, additionalHeaders || {}); - }); - } - patch(requestUrl, data, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('PATCH', requestUrl, data, additionalHeaders || {}); - }); - } - put(requestUrl, data, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('PUT', requestUrl, data, additionalHeaders || {}); - }); - } - head(requestUrl, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('HEAD', requestUrl, null, additionalHeaders || {}); - }); - } - sendStream(verb, requestUrl, stream, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request(verb, requestUrl, stream, additionalHeaders); - }); - } - /** - * Gets a typed object from an endpoint - * Be aware that not found returns a null. Other errors (4xx, 5xx) reject the promise - */ - getJson(requestUrl, additionalHeaders = {}) { - return __awaiter(this, void 0, void 0, function* () { - additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - const res = yield this.get(requestUrl, additionalHeaders); - return this._processResponse(res, this.requestOptions); - }); - } - postJson(requestUrl, obj, additionalHeaders = {}) { - return __awaiter(this, void 0, void 0, function* () { - const data = JSON.stringify(obj, null, 2); - additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); - const res = yield this.post(requestUrl, data, additionalHeaders); - return this._processResponse(res, this.requestOptions); - }); - } - putJson(requestUrl, obj, additionalHeaders = {}) { - return __awaiter(this, void 0, void 0, function* () { - const data = JSON.stringify(obj, null, 2); - additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); - const res = yield this.put(requestUrl, data, additionalHeaders); - return this._processResponse(res, this.requestOptions); - }); - } - patchJson(requestUrl, obj, additionalHeaders = {}) { - return __awaiter(this, void 0, void 0, function* () { - const data = JSON.stringify(obj, null, 2); - additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); - const res = yield this.patch(requestUrl, data, additionalHeaders); - return this._processResponse(res, this.requestOptions); - }); - } - /** - * Makes a raw http request. - * All other methods such as get, post, patch, and request ultimately call this. - * Prefer get, del, post and patch - */ - request(verb, requestUrl, data, headers) { - return __awaiter(this, void 0, void 0, function* () { - if (this._disposed) { - throw new Error('Client has already been disposed.'); - } - const parsedUrl = new URL(requestUrl); - let info = this._prepareRequest(verb, parsedUrl, headers); - // Only perform retries on reads since writes may not be idempotent. - const maxTries = this._allowRetries && RetryableHttpVerbs.includes(verb) - ? this._maxRetries + 1 - : 1; - let numTries = 0; - let response; - do { - response = yield this.requestRaw(info, data); - // Check if it's an authentication challenge - if (response && - response.message && - response.message.statusCode === HttpCodes.Unauthorized) { - let authenticationHandler; - for (const handler of this.handlers) { - if (handler.canHandleAuthentication(response)) { - authenticationHandler = handler; - break; - } - } - if (authenticationHandler) { - return authenticationHandler.handleAuthentication(this, info, data); - } - else { - // We have received an unauthorized response but have no handlers to handle it. - // Let the response return to the caller. - return response; - } - } - let redirectsRemaining = this._maxRedirects; - while (response.message.statusCode && - HttpRedirectCodes.includes(response.message.statusCode) && - this._allowRedirects && - redirectsRemaining > 0) { - const redirectUrl = response.message.headers['location']; - if (!redirectUrl) { - // if there's no location to redirect to, we won't - break; - } - const parsedRedirectUrl = new URL(redirectUrl); - if (parsedUrl.protocol === 'https:' && - parsedUrl.protocol !== parsedRedirectUrl.protocol && - !this._allowRedirectDowngrade) { - throw new Error('Redirect from HTTPS to HTTP protocol. This downgrade is not allowed for security reasons. If you want to allow this behavior, set the allowRedirectDowngrade option to true.'); - } - // we need to finish reading the response before reassigning response - // which will leak the open socket. - yield response.readBody(); - // strip authorization header if redirected to a different hostname - if (parsedRedirectUrl.hostname !== parsedUrl.hostname) { - for (const header in headers) { - // header names are case insensitive - if (header.toLowerCase() === 'authorization') { - delete headers[header]; - } - } - } - // let's make the request with the new redirectUrl - info = this._prepareRequest(verb, parsedRedirectUrl, headers); - response = yield this.requestRaw(info, data); - redirectsRemaining--; - } - if (!response.message.statusCode || - !HttpResponseRetryCodes.includes(response.message.statusCode)) { - // If not a retry code, return immediately instead of retrying - return response; - } - numTries += 1; - if (numTries < maxTries) { - yield response.readBody(); - yield this._performExponentialBackoff(numTries); - } - } while (numTries < maxTries); - return response; - }); - } - /** - * Needs to be called if keepAlive is set to true in request options. - */ - dispose() { - if (this._agent) { - this._agent.destroy(); - } - this._disposed = true; - } - /** - * Raw request. - * @param info - * @param data - */ - requestRaw(info, data) { - return __awaiter(this, void 0, void 0, function* () { - return new Promise((resolve, reject) => { - function callbackForResult(err, res) { - if (err) { - reject(err); - } - else if (!res) { - // If `err` is not passed, then `res` must be passed. - reject(new Error('Unknown error')); - } - else { - resolve(res); - } - } - this.requestRawWithCallback(info, data, callbackForResult); - }); - }); - } - /** - * Raw request with callback. - * @param info - * @param data - * @param onResult - */ - requestRawWithCallback(info, data, onResult) { - if (typeof data === 'string') { - if (!info.options.headers) { - info.options.headers = {}; - } - info.options.headers['Content-Length'] = Buffer.byteLength(data, 'utf8'); - } - let callbackCalled = false; - function handleResult(err, res) { - if (!callbackCalled) { - callbackCalled = true; - onResult(err, res); - } - } - const req = info.httpModule.request(info.options, (msg) => { - const res = new HttpClientResponse(msg); - handleResult(undefined, res); - }); - let socket; - req.on('socket', sock => { - socket = sock; - }); - // If we ever get disconnected, we want the socket to timeout eventually - req.setTimeout(this._socketTimeout || 3 * 60000, () => { - if (socket) { - socket.end(); - } - handleResult(new Error(`Request timeout: ${info.options.path}`)); - }); - req.on('error', function (err) { - // err has statusCode property - // res should have headers - handleResult(err); - }); - if (data && typeof data === 'string') { - req.write(data, 'utf8'); - } - if (data && typeof data !== 'string') { - data.on('close', function () { - req.end(); - }); - data.pipe(req); - } - else { - req.end(); - } - } - /** - * Gets an http agent. This function is useful when you need an http agent that handles - * routing through a proxy server - depending upon the url and proxy environment variables. - * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com - */ - getAgent(serverUrl) { - const parsedUrl = new URL(serverUrl); - return this._getAgent(parsedUrl); - } - _prepareRequest(method, requestUrl, headers) { - const info = {}; - info.parsedUrl = requestUrl; - const usingSsl = info.parsedUrl.protocol === 'https:'; - info.httpModule = usingSsl ? https : http; - const defaultPort = usingSsl ? 443 : 80; - info.options = {}; - info.options.host = info.parsedUrl.hostname; - info.options.port = info.parsedUrl.port - ? parseInt(info.parsedUrl.port) - : defaultPort; - info.options.path = - (info.parsedUrl.pathname || '') + (info.parsedUrl.search || ''); - info.options.method = method; - info.options.headers = this._mergeHeaders(headers); - if (this.userAgent != null) { - info.options.headers['user-agent'] = this.userAgent; - } - info.options.agent = this._getAgent(info.parsedUrl); - // gives handlers an opportunity to participate - if (this.handlers) { - for (const handler of this.handlers) { - handler.prepareRequest(info.options); - } - } - return info; - } - _mergeHeaders(headers) { - if (this.requestOptions && this.requestOptions.headers) { - return Object.assign({}, lowercaseKeys(this.requestOptions.headers), lowercaseKeys(headers || {})); - } - return lowercaseKeys(headers || {}); - } - _getExistingOrDefaultHeader(additionalHeaders, header, _default) { - let clientHeader; - if (this.requestOptions && this.requestOptions.headers) { - clientHeader = lowercaseKeys(this.requestOptions.headers)[header]; - } - return additionalHeaders[header] || clientHeader || _default; - } - _getAgent(parsedUrl) { - let agent; - const proxyUrl = pm.getProxyUrl(parsedUrl); - const useProxy = proxyUrl && proxyUrl.hostname; - if (this._keepAlive && useProxy) { - agent = this._proxyAgent; - } - if (this._keepAlive && !useProxy) { - agent = this._agent; - } - // if agent is already assigned use that agent. - if (agent) { - return agent; - } - const usingSsl = parsedUrl.protocol === 'https:'; - let maxSockets = 100; - if (this.requestOptions) { - maxSockets = this.requestOptions.maxSockets || http.globalAgent.maxSockets; - } - // This is `useProxy` again, but we need to check `proxyURl` directly for TypeScripts's flow analysis. - if (proxyUrl && proxyUrl.hostname) { - const agentOptions = { - maxSockets, - keepAlive: this._keepAlive, - proxy: Object.assign(Object.assign({}, ((proxyUrl.username || proxyUrl.password) && { - proxyAuth: `${proxyUrl.username}:${proxyUrl.password}` - })), { host: proxyUrl.hostname, port: proxyUrl.port }) - }; - let tunnelAgent; - const overHttps = proxyUrl.protocol === 'https:'; - if (usingSsl) { - tunnelAgent = overHttps ? tunnel.httpsOverHttps : tunnel.httpsOverHttp; - } - else { - tunnelAgent = overHttps ? tunnel.httpOverHttps : tunnel.httpOverHttp; - } - agent = tunnelAgent(agentOptions); - this._proxyAgent = agent; - } - // if reusing agent across request and tunneling agent isn't assigned create a new agent - if (this._keepAlive && !agent) { - const options = { keepAlive: this._keepAlive, maxSockets }; - agent = usingSsl ? new https.Agent(options) : new http.Agent(options); - this._agent = agent; - } - // if not using private agent and tunnel agent isn't setup then use global agent - if (!agent) { - agent = usingSsl ? https.globalAgent : http.globalAgent; - } - if (usingSsl && this._ignoreSslError) { - // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process - // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options - // we have to cast it to any and change it directly - agent.options = Object.assign(agent.options || {}, { - rejectUnauthorized: false - }); - } - return agent; - } - _performExponentialBackoff(retryNumber) { - return __awaiter(this, void 0, void 0, function* () { - retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber); - const ms = ExponentialBackoffTimeSlice * Math.pow(2, retryNumber); - return new Promise(resolve => setTimeout(() => resolve(), ms)); - }); - } - _processResponse(res, options) { - return __awaiter(this, void 0, void 0, function* () { - return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { - const statusCode = res.message.statusCode || 0; - const response = { - statusCode, - result: null, - headers: {} - }; - // not found leads to null obj returned - if (statusCode === HttpCodes.NotFound) { - resolve(response); - } - // get the result from the body - function dateTimeDeserializer(key, value) { - if (typeof value === 'string') { - const a = new Date(value); - if (!isNaN(a.valueOf())) { - return a; - } - } - return value; - } - let obj; - let contents; - try { - contents = yield res.readBody(); - if (contents && contents.length > 0) { - if (options && options.deserializeDates) { - obj = JSON.parse(contents, dateTimeDeserializer); - } - else { - obj = JSON.parse(contents); - } - response.result = obj; - } - response.headers = res.message.headers; - } - catch (err) { - // Invalid resource (contents not json); leaving result obj null - } - // note that 3xx redirects are handled by the http layer. - if (statusCode > 299) { - let msg; - // if exception/error in body, attempt to get better error - if (obj && obj.message) { - msg = obj.message; - } - else if (contents && contents.length > 0) { - // it may be the case that the exception is in the body message as string - msg = contents; - } - else { - msg = `Failed request: (${statusCode})`; - } - const err = new HttpClientError(msg, statusCode); - err.result = response.result; - reject(err); - } - else { - resolve(response); - } - })); - }); - } -} -exports.HttpClient = HttpClient; -const lowercaseKeys = (obj) => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {}); -//# sourceMappingURL=index.js.map - -/***/ }), - -/***/ 835: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.checkBypass = exports.getProxyUrl = void 0; -function getProxyUrl(reqUrl) { - const usingSsl = reqUrl.protocol === 'https:'; - if (checkBypass(reqUrl)) { - return undefined; - } - const proxyVar = (() => { - if (usingSsl) { - return process.env['https_proxy'] || process.env['HTTPS_PROXY']; - } - else { - return process.env['http_proxy'] || process.env['HTTP_PROXY']; - } - })(); - if (proxyVar) { - return new URL(proxyVar); - } - else { - return undefined; - } -} -exports.getProxyUrl = getProxyUrl; -function checkBypass(reqUrl) { - if (!reqUrl.hostname) { - return false; - } - const noProxy = process.env['no_proxy'] || process.env['NO_PROXY'] || ''; - if (!noProxy) { - return false; - } - // Determine the request port - let reqPort; - if (reqUrl.port) { - reqPort = Number(reqUrl.port); - } - else if (reqUrl.protocol === 'http:') { - reqPort = 80; - } - else if (reqUrl.protocol === 'https:') { - reqPort = 443; - } - // Format the request hostname and hostname with port - const upperReqHosts = [reqUrl.hostname.toUpperCase()]; - if (typeof reqPort === 'number') { - upperReqHosts.push(`${upperReqHosts[0]}:${reqPort}`); - } - // Compare request host against noproxy - for (const upperNoProxyItem of noProxy - .split(',') - .map(x => x.trim().toUpperCase()) - .filter(x => x)) { - if (upperReqHosts.some(x => x === upperNoProxyItem)) { - return true; - } - } - return false; -} -exports.checkBypass = checkBypass; -//# sourceMappingURL=proxy.js.map - -/***/ }), - -/***/ 294: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -module.exports = __nccwpck_require__(219); - - -/***/ }), - -/***/ 219: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - - -var net = __nccwpck_require__(808); -var tls = __nccwpck_require__(404); -var http = __nccwpck_require__(685); -var https = __nccwpck_require__(687); -var events = __nccwpck_require__(361); -var assert = __nccwpck_require__(491); -var util = __nccwpck_require__(837); - - -exports.httpOverHttp = httpOverHttp; -exports.httpsOverHttp = httpsOverHttp; -exports.httpOverHttps = httpOverHttps; -exports.httpsOverHttps = httpsOverHttps; - - -function httpOverHttp(options) { - var agent = new TunnelingAgent(options); - agent.request = http.request; - return agent; -} - -function httpsOverHttp(options) { - var agent = new TunnelingAgent(options); - agent.request = http.request; - agent.createSocket = createSecureSocket; - agent.defaultPort = 443; - return agent; -} - -function httpOverHttps(options) { - var agent = new TunnelingAgent(options); - agent.request = https.request; - return agent; -} - -function httpsOverHttps(options) { - var agent = new TunnelingAgent(options); - agent.request = https.request; - agent.createSocket = createSecureSocket; - agent.defaultPort = 443; - return agent; -} - - -function TunnelingAgent(options) { - var self = this; - self.options = options || {}; - self.proxyOptions = self.options.proxy || {}; - self.maxSockets = self.options.maxSockets || http.Agent.defaultMaxSockets; - self.requests = []; - self.sockets = []; - - self.on('free', function onFree(socket, host, port, localAddress) { - var options = toOptions(host, port, localAddress); - for (var i = 0, len = self.requests.length; i < len; ++i) { - var pending = self.requests[i]; - if (pending.host === options.host && pending.port === options.port) { - // Detect the request to connect same origin server, - // reuse the connection. - self.requests.splice(i, 1); - pending.request.onSocket(socket); - return; - } - } - socket.destroy(); - self.removeSocket(socket); - }); -} -util.inherits(TunnelingAgent, events.EventEmitter); - -TunnelingAgent.prototype.addRequest = function addRequest(req, host, port, localAddress) { - var self = this; - var options = mergeOptions({request: req}, self.options, toOptions(host, port, localAddress)); - - if (self.sockets.length >= this.maxSockets) { - // We are over limit so we'll add it to the queue. - self.requests.push(options); - return; - } - - // If we are under maxSockets create a new one. - self.createSocket(options, function(socket) { - socket.on('free', onFree); - socket.on('close', onCloseOrRemove); - socket.on('agentRemove', onCloseOrRemove); - req.onSocket(socket); - - function onFree() { - self.emit('free', socket, options); - } - - function onCloseOrRemove(err) { - self.removeSocket(socket); - socket.removeListener('free', onFree); - socket.removeListener('close', onCloseOrRemove); - socket.removeListener('agentRemove', onCloseOrRemove); - } - }); -}; - -TunnelingAgent.prototype.createSocket = function createSocket(options, cb) { - var self = this; - var placeholder = {}; - self.sockets.push(placeholder); - - var connectOptions = mergeOptions({}, self.proxyOptions, { - method: 'CONNECT', - path: options.host + ':' + options.port, - agent: false, - headers: { - host: options.host + ':' + options.port - } - }); - if (options.localAddress) { - connectOptions.localAddress = options.localAddress; - } - if (connectOptions.proxyAuth) { - connectOptions.headers = connectOptions.headers || {}; - connectOptions.headers['Proxy-Authorization'] = 'Basic ' + - new Buffer(connectOptions.proxyAuth).toString('base64'); - } - - debug('making CONNECT request'); - var connectReq = self.request(connectOptions); - connectReq.useChunkedEncodingByDefault = false; // for v0.6 - connectReq.once('response', onResponse); // for v0.6 - connectReq.once('upgrade', onUpgrade); // for v0.6 - connectReq.once('connect', onConnect); // for v0.7 or later - connectReq.once('error', onError); - connectReq.end(); - - function onResponse(res) { - // Very hacky. This is necessary to avoid http-parser leaks. - res.upgrade = true; - } - - function onUpgrade(res, socket, head) { - // Hacky. - process.nextTick(function() { - onConnect(res, socket, head); - }); - } - - function onConnect(res, socket, head) { - connectReq.removeAllListeners(); - socket.removeAllListeners(); - - if (res.statusCode !== 200) { - debug('tunneling socket could not be established, statusCode=%d', - res.statusCode); - socket.destroy(); - var error = new Error('tunneling socket could not be established, ' + - 'statusCode=' + res.statusCode); - error.code = 'ECONNRESET'; - options.request.emit('error', error); - self.removeSocket(placeholder); - return; - } - if (head.length > 0) { - debug('got illegal response body from proxy'); - socket.destroy(); - var error = new Error('got illegal response body from proxy'); - error.code = 'ECONNRESET'; - options.request.emit('error', error); - self.removeSocket(placeholder); - return; - } - debug('tunneling connection has established'); - self.sockets[self.sockets.indexOf(placeholder)] = socket; - return cb(socket); - } - - function onError(cause) { - connectReq.removeAllListeners(); - - debug('tunneling socket could not be established, cause=%s\n', - cause.message, cause.stack); - var error = new Error('tunneling socket could not be established, ' + - 'cause=' + cause.message); - error.code = 'ECONNRESET'; - options.request.emit('error', error); - self.removeSocket(placeholder); - } -}; - -TunnelingAgent.prototype.removeSocket = function removeSocket(socket) { - var pos = this.sockets.indexOf(socket) - if (pos === -1) { - return; - } - this.sockets.splice(pos, 1); - - var pending = this.requests.shift(); - if (pending) { - // If we have pending requests and a socket gets closed a new one - // needs to be created to take over in the pool for the one that closed. - this.createSocket(pending, function(socket) { - pending.request.onSocket(socket); - }); - } -}; - -function createSecureSocket(options, cb) { - var self = this; - TunnelingAgent.prototype.createSocket.call(self, options, function(socket) { - var hostHeader = options.request.getHeader('host'); - var tlsOptions = mergeOptions({}, self.options, { - socket: socket, - servername: hostHeader ? hostHeader.replace(/:.*$/, '') : options.host - }); - - // 0 is dummy port for v0.6 - var secureSocket = tls.connect(0, tlsOptions); - self.sockets[self.sockets.indexOf(socket)] = secureSocket; - cb(secureSocket); - }); -} - - -function toOptions(host, port, localAddress) { - if (typeof host === 'string') { // since v0.10 - return { - host: host, - port: port, - localAddress: localAddress - }; - } - return host; // for v0.11 or later -} - -function mergeOptions(target) { - for (var i = 1, len = arguments.length; i < len; ++i) { - var overrides = arguments[i]; - if (typeof overrides === 'object') { - var keys = Object.keys(overrides); - for (var j = 0, keyLen = keys.length; j < keyLen; ++j) { - var k = keys[j]; - if (overrides[k] !== undefined) { - target[k] = overrides[k]; - } - } - } - } - return target; -} - - -var debug; -if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) { - debug = function() { - var args = Array.prototype.slice.call(arguments); - if (typeof args[0] === 'string') { - args[0] = 'TUNNEL: ' + args[0]; - } else { - args.unshift('TUNNEL:'); - } - console.error.apply(console, args); - } -} else { - debug = function() {}; -} -exports.debug = debug; // for test - - -/***/ }), - -/***/ 840: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -Object.defineProperty(exports, "v1", ({ - enumerable: true, - get: function () { - return _v.default; - } -})); -Object.defineProperty(exports, "v3", ({ - enumerable: true, - get: function () { - return _v2.default; - } -})); -Object.defineProperty(exports, "v4", ({ - enumerable: true, - get: function () { - return _v3.default; - } -})); -Object.defineProperty(exports, "v5", ({ - enumerable: true, - get: function () { - return _v4.default; - } -})); -Object.defineProperty(exports, "NIL", ({ - enumerable: true, - get: function () { - return _nil.default; - } -})); -Object.defineProperty(exports, "version", ({ - enumerable: true, - get: function () { - return _version.default; - } -})); -Object.defineProperty(exports, "validate", ({ - enumerable: true, - get: function () { - return _validate.default; - } -})); -Object.defineProperty(exports, "stringify", ({ - enumerable: true, - get: function () { - return _stringify.default; - } -})); -Object.defineProperty(exports, "parse", ({ - enumerable: true, - get: function () { - return _parse.default; - } -})); - -var _v = _interopRequireDefault(__nccwpck_require__(628)); - -var _v2 = _interopRequireDefault(__nccwpck_require__(409)); - -var _v3 = _interopRequireDefault(__nccwpck_require__(122)); - -var _v4 = _interopRequireDefault(__nccwpck_require__(120)); - -var _nil = _interopRequireDefault(__nccwpck_require__(332)); - -var _version = _interopRequireDefault(__nccwpck_require__(595)); - -var _validate = _interopRequireDefault(__nccwpck_require__(900)); - -var _stringify = _interopRequireDefault(__nccwpck_require__(950)); - -var _parse = _interopRequireDefault(__nccwpck_require__(746)); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/***/ }), - -/***/ 569: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports["default"] = void 0; - -var _crypto = _interopRequireDefault(__nccwpck_require__(113)); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function md5(bytes) { - if (Array.isArray(bytes)) { - bytes = Buffer.from(bytes); - } else if (typeof bytes === 'string') { - bytes = Buffer.from(bytes, 'utf8'); - } - - return _crypto.default.createHash('md5').update(bytes).digest(); -} - -var _default = md5; -exports["default"] = _default; - -/***/ }), - -/***/ 332: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports["default"] = void 0; -var _default = '00000000-0000-0000-0000-000000000000'; -exports["default"] = _default; - -/***/ }), - -/***/ 746: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports["default"] = void 0; - -var _validate = _interopRequireDefault(__nccwpck_require__(900)); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function parse(uuid) { - if (!(0, _validate.default)(uuid)) { - throw TypeError('Invalid UUID'); - } - - let v; - const arr = new Uint8Array(16); // Parse ########-....-....-....-............ - - arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24; - arr[1] = v >>> 16 & 0xff; - arr[2] = v >>> 8 & 0xff; - arr[3] = v & 0xff; // Parse ........-####-....-....-............ - - arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8; - arr[5] = v & 0xff; // Parse ........-....-####-....-............ - - arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8; - arr[7] = v & 0xff; // Parse ........-....-....-####-............ - - arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8; - arr[9] = v & 0xff; // Parse ........-....-....-....-############ - // (Use "/" to avoid 32-bit truncation when bit-shifting high-order bytes) - - arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff; - arr[11] = v / 0x100000000 & 0xff; - arr[12] = v >>> 24 & 0xff; - arr[13] = v >>> 16 & 0xff; - arr[14] = v >>> 8 & 0xff; - arr[15] = v & 0xff; - return arr; -} - -var _default = parse; -exports["default"] = _default; - -/***/ }), - -/***/ 814: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports["default"] = void 0; -var _default = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i; -exports["default"] = _default; - -/***/ }), - -/***/ 807: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports["default"] = rng; - -var _crypto = _interopRequireDefault(__nccwpck_require__(113)); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -const rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate - -let poolPtr = rnds8Pool.length; - -function rng() { - if (poolPtr > rnds8Pool.length - 16) { - _crypto.default.randomFillSync(rnds8Pool); - - poolPtr = 0; - } - - return rnds8Pool.slice(poolPtr, poolPtr += 16); -} - -/***/ }), - -/***/ 274: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports["default"] = void 0; - -var _crypto = _interopRequireDefault(__nccwpck_require__(113)); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function sha1(bytes) { - if (Array.isArray(bytes)) { - bytes = Buffer.from(bytes); - } else if (typeof bytes === 'string') { - bytes = Buffer.from(bytes, 'utf8'); - } - - return _crypto.default.createHash('sha1').update(bytes).digest(); -} - -var _default = sha1; -exports["default"] = _default; - -/***/ }), - -/***/ 950: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports["default"] = void 0; - -var _validate = _interopRequireDefault(__nccwpck_require__(900)); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -/** - * Convert array of 16 byte values to UUID string format of the form: - * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX - */ -const byteToHex = []; - -for (let i = 0; i < 256; ++i) { - byteToHex.push((i + 0x100).toString(16).substr(1)); -} - -function stringify(arr, offset = 0) { - // Note: Be careful editing this code! It's been tuned for performance - // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434 - const uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one - // of the following: - // - One or more input array values don't map to a hex octet (leading to - // "undefined" in the uuid) - // - Invalid input values for the RFC `version` or `variant` fields - - if (!(0, _validate.default)(uuid)) { - throw TypeError('Stringified UUID is invalid'); - } - - return uuid; -} - -var _default = stringify; -exports["default"] = _default; - -/***/ }), - -/***/ 628: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports["default"] = void 0; - -var _rng = _interopRequireDefault(__nccwpck_require__(807)); - -var _stringify = _interopRequireDefault(__nccwpck_require__(950)); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -// **`v1()` - Generate time-based UUID** -// -// Inspired by https://github.com/LiosK/UUID.js -// and http://docs.python.org/library/uuid.html -let _nodeId; - -let _clockseq; // Previous uuid creation time - - -let _lastMSecs = 0; -let _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details - -function v1(options, buf, offset) { - let i = buf && offset || 0; - const b = buf || new Array(16); - options = options || {}; - let node = options.node || _nodeId; - let clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not - // specified. We do this lazily to minimize issues related to insufficient - // system entropy. See #189 - - if (node == null || clockseq == null) { - const seedBytes = options.random || (options.rng || _rng.default)(); - - if (node == null) { - // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1) - node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]]; - } - - if (clockseq == null) { - // Per 4.2.2, randomize (14 bit) clockseq - clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff; - } - } // UUID timestamps are 100 nano-second units since the Gregorian epoch, - // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so - // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs' - // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00. - - - let msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock - // cycle to simulate higher resolution clock - - let nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs) - - const dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression - - if (dt < 0 && options.clockseq === undefined) { - clockseq = clockseq + 1 & 0x3fff; - } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new - // time interval - - - if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) { - nsecs = 0; - } // Per 4.2.1.2 Throw error if too many uuids are requested - - - if (nsecs >= 10000) { - throw new Error("uuid.v1(): Can't create more than 10M uuids/sec"); - } - - _lastMSecs = msecs; - _lastNSecs = nsecs; - _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch - - msecs += 12219292800000; // `time_low` - - const tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000; - b[i++] = tl >>> 24 & 0xff; - b[i++] = tl >>> 16 & 0xff; - b[i++] = tl >>> 8 & 0xff; - b[i++] = tl & 0xff; // `time_mid` - - const tmh = msecs / 0x100000000 * 10000 & 0xfffffff; - b[i++] = tmh >>> 8 & 0xff; - b[i++] = tmh & 0xff; // `time_high_and_version` - - b[i++] = tmh >>> 24 & 0xf | 0x10; // include version - - b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant) - - b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low` - - b[i++] = clockseq & 0xff; // `node` - - for (let n = 0; n < 6; ++n) { - b[i + n] = node[n]; - } - - return buf || (0, _stringify.default)(b); -} - -var _default = v1; -exports["default"] = _default; - -/***/ }), - -/***/ 409: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports["default"] = void 0; - -var _v = _interopRequireDefault(__nccwpck_require__(998)); - -var _md = _interopRequireDefault(__nccwpck_require__(569)); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -const v3 = (0, _v.default)('v3', 0x30, _md.default); -var _default = v3; -exports["default"] = _default; - -/***/ }), - -/***/ 998: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports["default"] = _default; -exports.URL = exports.DNS = void 0; - -var _stringify = _interopRequireDefault(__nccwpck_require__(950)); - -var _parse = _interopRequireDefault(__nccwpck_require__(746)); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function stringToBytes(str) { - str = unescape(encodeURIComponent(str)); // UTF8 escape - - const bytes = []; - - for (let i = 0; i < str.length; ++i) { - bytes.push(str.charCodeAt(i)); - } - - return bytes; -} - -const DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8'; -exports.DNS = DNS; -const URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8'; -exports.URL = URL; - -function _default(name, version, hashfunc) { - function generateUUID(value, namespace, buf, offset) { - if (typeof value === 'string') { - value = stringToBytes(value); - } - - if (typeof namespace === 'string') { - namespace = (0, _parse.default)(namespace); - } - - if (namespace.length !== 16) { - throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)'); - } // Compute hash of namespace and value, Per 4.3 - // Future: Use spread syntax when supported on all platforms, e.g. `bytes = - // hashfunc([...namespace, ... value])` - - - let bytes = new Uint8Array(16 + value.length); - bytes.set(namespace); - bytes.set(value, namespace.length); - bytes = hashfunc(bytes); - bytes[6] = bytes[6] & 0x0f | version; - bytes[8] = bytes[8] & 0x3f | 0x80; - - if (buf) { - offset = offset || 0; - - for (let i = 0; i < 16; ++i) { - buf[offset + i] = bytes[i]; - } - - return buf; - } - - return (0, _stringify.default)(bytes); - } // Function#name is not settable on some platforms (#270) - - - try { - generateUUID.name = name; // eslint-disable-next-line no-empty - } catch (err) {} // For CommonJS default export support - - - generateUUID.DNS = DNS; - generateUUID.URL = URL; - return generateUUID; -} - -/***/ }), - -/***/ 122: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports["default"] = void 0; - -var _rng = _interopRequireDefault(__nccwpck_require__(807)); - -var _stringify = _interopRequireDefault(__nccwpck_require__(950)); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function v4(options, buf, offset) { - options = options || {}; - - const rnds = options.random || (options.rng || _rng.default)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved` - - - rnds[6] = rnds[6] & 0x0f | 0x40; - rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided - - if (buf) { - offset = offset || 0; - - for (let i = 0; i < 16; ++i) { - buf[offset + i] = rnds[i]; - } - - return buf; - } - - return (0, _stringify.default)(rnds); -} - -var _default = v4; -exports["default"] = _default; - -/***/ }), - -/***/ 120: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports["default"] = void 0; - -var _v = _interopRequireDefault(__nccwpck_require__(998)); - -var _sha = _interopRequireDefault(__nccwpck_require__(274)); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -const v5 = (0, _v.default)('v5', 0x50, _sha.default); -var _default = v5; -exports["default"] = _default; - -/***/ }), - -/***/ 900: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports["default"] = void 0; - -var _regex = _interopRequireDefault(__nccwpck_require__(814)); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function validate(uuid) { - return typeof uuid === 'string' && _regex.default.test(uuid); -} - -var _default = validate; -exports["default"] = _default; - -/***/ }), - -/***/ 595: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports["default"] = void 0; - -var _validate = _interopRequireDefault(__nccwpck_require__(900)); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -function version(uuid) { - if (!(0, _validate.default)(uuid)) { - throw TypeError('Invalid UUID'); - } - - return parseInt(uuid.substr(14, 1), 16); -} - -var _default = version; -exports["default"] = _default; - -/***/ }), - -/***/ 319: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const core = __nccwpck_require__(186); - -const getRequired = (name) => core.getInput(name, { required: true }); - -const getOptional = (name) => core.getInput(name, { required: false }); - -const getEnv = () => process.env; - -const setOutput = (name, value) => core.setOutput(name, value); - -const setFailed = (msg) => core.setFailed(msg); - -const debug = (msg) => core.debug(msg); - -const debugExtra = (name, json) => { - core.debug("CUSTOM DEBUG " + name); - - const message = JSON.stringify(json, undefined, 2); - core.debug(message); -}; - -const info = (msg) => core.info(msg); - -const warning = (msg) => core.warning(msg); - -module.exports = { - getRequired, - getOptional, - getEnv, - setOutput, - setFailed, - debug, - debugExtra, - info, - warning, -}; - - -/***/ }), - -/***/ 451: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const https = __nccwpck_require__(687); - -const getOptions = (token, path) => { - return { - hostname: "slack.com", - port: 443, - path: path, - method: "POST", - headers: { - "Content-Type": "application/json; charset=utf-8", - Authorization: `Bearer ${token}`, - }, - }; -}; - -const post = (token, path, message) => { - return new Promise((resolve, reject) => { - const payload = JSON.stringify(message); - - const options = getOptions(token, path); - - const req = https.request(options, (res) => { - const chunks = []; - - res.on("data", (chunk) => { - chunks.push(chunk); - }); - - res.on("end", () => { - const result = Buffer.concat(chunks).toString(); - const response = JSON.parse(result); - - let isOk = res.statusCode >= 200 && res.statusCode <= 299; - - // This solves the issue that block updates returns 200 - // but contains ok = false in the response - if ( - response && - response.hasOwnProperty("ok") && - response.ok === false - ) { - isOk = false; - } - - resolve({ - statusCode: res.statusCode, - statusMessage: res.statusMessage, - ok: isOk, - result: result, - response: response, - }); - }); - }); - - req.on("error", (error) => { - reject(error); - }); - - req.write(payload); - req.end(); - }); -}; - -module.exports = { post }; - - -/***/ }), - -/***/ 202: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const { post } = __nccwpck_require__(451); - -const hasErrors = (res) => !res || !res.ok; - -const buildErrorMessage = (res) => { - return `Error! ${JSON.stringify(res)} (response)`; -}; - -const apiPostMessage = async (token, message) => { - const path = "/api/chat.postMessage"; - const res = await post(token, path, message); - - if (hasErrors(res)) { - throw buildErrorMessage(res); - } - - return res; -}; - -const apiAddReaction = async (token, message) => { - const path = "/api/reactions.add"; - const res = await post(token, path, message); - - if (hasErrors(res)) { - throw buildErrorMessage(res); - } - - return res; -}; - -const apiUpdateMessage = async (token, message) => { - const path = "/api/chat.update"; - const res = await post(token, path, message); - - if (hasErrors(res)) { - throw buildErrorMessage(res); - } - - return res; -}; - -module.exports = { apiPostMessage, apiAddReaction, apiUpdateMessage }; - - -/***/ }), - -/***/ 662: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const context = __nccwpck_require__(319); -const { postMessage } = __nccwpck_require__(563); -const { addReaction } = __nccwpck_require__(380); -const { updateMessage } = __nccwpck_require__(308); - -const jsonPretty = (data) => JSON.stringify(data, undefined, 2); - -const invoke = async () => { - try { - const func = context.getOptional("slack-function") || "send-message"; - - switch (func) { - case "send-message": - await postMessage(); - break; - case "send-reaction": - await addReaction(); - break; - case "update-message": - await updateMessage(); - break; - default: - context.setFailed("Unhandled `slack-function`: " + func); - break; - } - } catch (error) { - context.setFailed("invoke failed:" + error + ":" + jsonPretty(error)); - } -}; - -module.exports = invoke; - - -/***/ }), - -/***/ 690: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const { - restoreEscapedNewLine, - restoreEscapedTab, -} = __nccwpck_require__(307); - -const buildMessage = (channel = "", text = "", blocks = "", optional = {}) => { - const message = { - channel, - text, - blocks, - }; - - message.text = restoreEscapedNewLine(message.text); - message.text = restoreEscapedTab(message.text); - - Object.keys(optional).forEach((name) => { - message[name] = optional[name]; - }); - - return message; -}; - -module.exports = buildMessage; - - -/***/ }), - -/***/ 563: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const context = __nccwpck_require__(319); -const { apiPostMessage } = __nccwpck_require__(202); -const buildMessage = __nccwpck_require__(690); -const core = __nccwpck_require__(186); - -const jsonPretty = (data) => JSON.stringify(data, undefined, 2); - -const postMessage = async () => { - try { - const token = context.getRequired("slack-bot-user-oauth-access-token"); - const channels = context.getRequired("slack-channel"); - const text = context.getOptional("slack-text"); - const blocks = context.getOptional("slack-blocks"); - - const results = []; - for (let channel of channels.split(",")) { - channel = channel.trim(); - - const payload = buildMessage(channel, text, blocks, optional()); - - context.debug("Post Message PAYLOAD", payload); - const result = await apiPostMessage(token, payload); - context.debug("Post Message RESULT", result); - - results.push(result); - } - - // To not break backward compatibility - const resultAsJson = jsonPretty(results[0]); - context.setOutput("slack-result", resultAsJson); - - const resultsAsJson = jsonPretty(results); - context.setOutput("slack-results", resultsAsJson); - } catch (error) { - context.setFailed(jsonPretty(error)); - } -}; - -const optional = () => { - let opt = {}; - - const env = context.getEnv(); - Object.keys(env) - .filter((key) => !!env[key]) - .filter((key) => key.toUpperCase().startsWith("INPUT_SLACK-OPTIONAL-")) - .forEach((key) => { - const slackKey = key.replace("INPUT_SLACK-OPTIONAL-", "").toLowerCase(); - opt[slackKey] = env[key]; - }); - - return opt; -}; - -module.exports = { postMessage }; - - -/***/ }), - -/***/ 179: -/***/ ((module) => { - -const buildReaction = ( - channelId = "", - emojiName = "", - messageTimestamp = "" -) => { - const message = { - channel: channelId, - name: emojiName, - timestamp: messageTimestamp, - }; - - return message; -}; - -module.exports = buildReaction; - - -/***/ }), - -/***/ 380: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const context = __nccwpck_require__(319); -const { apiAddReaction } = __nccwpck_require__(202); -const buildMessage = __nccwpck_require__(179); - -const jsonPretty = (data) => JSON.stringify(data, undefined, 2); - -const addReaction = async () => { - try { - const token = context.getRequired("slack-bot-user-oauth-access-token"); - const channelId = context.getRequired("slack-channel"); - const emojiName = context.getRequired("slack-emoji-name"); - const messageTimestamp = context.getRequired("slack-message-timestamp"); - - const payload = buildMessage(channelId, emojiName, messageTimestamp); - - context.debugExtra("Add Reaction PAYLOAD", payload); - const result = await apiAddReaction(token, payload); - context.debugExtra("Add Reaction PAYLOAD", result); - - const resultAsJson = jsonPretty(result); - context.setOutput("slack-result", resultAsJson); - } catch (error) { - context.setFailed(jsonPretty(error)); - } -}; - -module.exports = { addReaction }; - - -/***/ }), - -/***/ 51: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const { - restoreEscapedNewLine, - restoreEscapedTab, -} = __nccwpck_require__(307); - -const buildMessage = ( - channel = "", - text = "", - blocks = "", - ts = "", - optional = {} -) => { - if (!channel || !ts) { - throw new Error("Channel and/or TS must be set"); - } - - if (!text && !blocks) { - throw new Error("Text OR Block must be set"); - } - - const message = { - channel, - text, - ts, - blocks, - }; - - message.text = restoreEscapedNewLine(message.text); - message.text = restoreEscapedTab(message.text); - - Object.keys(optional).forEach((name) => { - message[name] = optional[name]; - }); - - return message; -}; - -module.exports = buildMessage; - - -/***/ }), - -/***/ 308: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -const context = __nccwpck_require__(319); -const { apiUpdateMessage } = __nccwpck_require__(202); -const buildUpdateMessage = __nccwpck_require__(51); - -const jsonPretty = (data) => JSON.stringify(data, undefined, 2); - -const updateMessage = async () => { - try { - const token = context.getRequired("slack-bot-user-oauth-access-token"); - const channelId = context.getRequired("slack-channel"); - const ts = context.getRequired("slack-update-message-ts"); - const text = context.getOptional("slack-update-message-text"); - const blocks = context.getOptional("slack-update-message-blocks"); - - const payload = buildUpdateMessage(channelId, text, blocks, ts, optional()); - - context.debugExtra("Update Message PAYLOAD", payload); - const result = await apiUpdateMessage(token, payload); - context.debug("Update Message RESULT", result); - - const resultAsJson = jsonPretty(result); - context.setOutput("slack-result", resultAsJson); - } catch (error) { - context.debug(error); - context.setFailed(jsonPretty(error)); - } -}; - -const optional = () => { - let opt = {}; - - const env = context.getEnv(); - Object.keys(env) - .filter((key) => !!env[key]) - .filter((key) => key.toUpperCase().startsWith("INPUT_SLACK-OPTIONAL-")) - .forEach((key) => { - const slackKey = key.replace("INPUT_SLACK-OPTIONAL-", "").toLowerCase(); - opt[slackKey] = env[key]; - }); - - return opt; -}; - -module.exports = { updateMessage }; - - -/***/ }), - -/***/ 307: -/***/ ((module) => { - -const restoreEscapedNewLine = (text) => - text.replace(/\\r\\n/g, "\n").replace(/\\n/g, "\n"); - -const restoreEscapedTab = (text) => text.replace(/\\t/g, "\t"); - -module.exports = { restoreEscapedNewLine, restoreEscapedTab }; - - -/***/ }), - -/***/ 491: -/***/ ((module) => { - -"use strict"; -module.exports = require("assert"); - -/***/ }), - -/***/ 113: -/***/ ((module) => { - -"use strict"; -module.exports = require("crypto"); - -/***/ }), - -/***/ 361: -/***/ ((module) => { - -"use strict"; -module.exports = require("events"); - -/***/ }), - -/***/ 147: -/***/ ((module) => { - -"use strict"; -module.exports = require("fs"); - -/***/ }), - -/***/ 685: -/***/ ((module) => { - -"use strict"; -module.exports = require("http"); - -/***/ }), - -/***/ 687: -/***/ ((module) => { - -"use strict"; -module.exports = require("https"); - -/***/ }), - -/***/ 808: -/***/ ((module) => { - -"use strict"; -module.exports = require("net"); - -/***/ }), - -/***/ 37: -/***/ ((module) => { - -"use strict"; -module.exports = require("os"); - -/***/ }), - -/***/ 17: -/***/ ((module) => { - -"use strict"; -module.exports = require("path"); - -/***/ }), - -/***/ 404: -/***/ ((module) => { - -"use strict"; -module.exports = require("tls"); - -/***/ }), - -/***/ 837: -/***/ ((module) => { - -"use strict"; -module.exports = require("util"); - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __nccwpck_require__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ // no module.id needed -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ var threw = true; -/******/ try { -/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __nccwpck_require__); -/******/ threw = false; -/******/ } finally { -/******/ if(threw) delete __webpack_module_cache__[moduleId]; -/******/ } -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/************************************************************************/ -/******/ /* webpack/runtime/compat */ -/******/ -/******/ if (typeof __nccwpck_require__ !== 'undefined') __nccwpck_require__.ab = __dirname + "/"; -/******/ -/************************************************************************/ -var __webpack_exports__ = {}; -// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. -(() => { -const invoke = __nccwpck_require__(662); - -const run = async () => { - await invoke(); -}; - -run(); - -})(); - -module.exports = __webpack_exports__; -/******/ })() -; \ No newline at end of file diff --git a/integration-test/end-to-end.js b/integration-test/end-to-end.js index d6c5127..592259a 100644 --- a/integration-test/end-to-end.js +++ b/integration-test/end-to-end.js @@ -90,7 +90,7 @@ const testUpdateMessage = async (channel, token) => { "Test 1 - testSendMessage" ); - await testSendReaction( + /*await testSendReaction( process.env.CHANNEL, process.env.BOT_USER_OAUTH_ACCESS_TOKEN ); @@ -103,5 +103,5 @@ const testUpdateMessage = async (channel, token) => { await testUpdateMessage( process.env.CHANNEL, process.env.BOT_USER_OAUTH_ACCESS_TOKEN - ); + );*/ })(); diff --git a/src/message/build-message.js b/src/message/build-message.js index 602ec9e..192231b 100644 --- a/src/message/build-message.js +++ b/src/message/build-message.js @@ -3,15 +3,30 @@ const { restoreEscapedTab, } = require("../util/escaper.js"); -const buildMessage = (channel = "", text = "", blocks = "", optional = {}) => { +const buildMessage = ( + channel = "", + text = "", + blocks = null, + optional = {} +) => { + if (!channel) { + throw new Error("Channel must be set"); + } + + if (text && blocks) { + throw new Error("Text OR Block must be set"); + } + const message = { channel, text, blocks, }; - message.text = restoreEscapedNewLine(message.text); - message.text = restoreEscapedTab(message.text); + if (message.text) { + message.text = restoreEscapedNewLine(message.text); + message.text = restoreEscapedTab(message.text); + } Object.keys(optional).forEach((name) => { message[name] = optional[name]; diff --git a/src/message/build-message.test.js b/src/message/build-message.test.js index 1d34ea1..73e4998 100644 --- a/src/message/build-message.test.js +++ b/src/message/build-message.test.js @@ -2,11 +2,23 @@ describe("build message", () => { test("with channel and text parameters", () => { const buildMessage = require("./build-message"); - const message = buildMessage("channel", "text", "blocks"); + const message = buildMessage("channel", "text", null); expect(message).toEqual({ channel: "channel", text: "text", + blocks: null, + }); + }); + + test("with channel and blocks parameters", () => { + const buildMessage = require("./build-message"); + + const message = buildMessage("channel", null, "blocks"); + + expect(message).toEqual({ + channel: "channel", + text: null, blocks: "blocks", }); }); @@ -14,12 +26,12 @@ describe("build message", () => { test("with optional parameters", () => { const buildMessage = require("./build-message"); - const message = buildMessage("channel", "text", "blocks", { key: "value" }); + const message = buildMessage("channel", "text", null, { key: "value" }); expect(message).toEqual({ channel: "channel", text: "text", - blocks: "blocks", + blocks: null, key: "value", }); }); diff --git a/src/update-message/build-update-message.js b/src/update-message/build-update-message.js index 509eaeb..cfff04d 100644 --- a/src/update-message/build-update-message.js +++ b/src/update-message/build-update-message.js @@ -6,7 +6,7 @@ const { const buildMessage = ( channel = "", text = "", - blocks = "", + blocks = null, ts = "", optional = {} ) => { @@ -14,7 +14,7 @@ const buildMessage = ( throw new Error("Channel and/or TS must be set"); } - if (!text && !blocks) { + if (text && blocks) { throw new Error("Text OR Block must be set"); } @@ -25,8 +25,10 @@ const buildMessage = ( blocks, }; - message.text = restoreEscapedNewLine(message.text); - message.text = restoreEscapedTab(message.text); + if (message.text) { + message.text = restoreEscapedNewLine(message.text); + message.text = restoreEscapedTab(message.text); + } Object.keys(optional).forEach((name) => { message[name] = optional[name]; From 2e105ca7533e18ab4038f3c2535b40904f99bac8 Mon Sep 17 00:00:00 2001 From: Anders Date: Sat, 15 Oct 2022 00:33:09 +0200 Subject: [PATCH 28/30] wip --- dist/index.js | 3301 ++++++++++++++++++++ integration-test/end-to-end.js | 9 +- src/message/build-message.js | 7 +- src/update-message/build-update-message.js | 2 +- 4 files changed, 3308 insertions(+), 11 deletions(-) create mode 100644 dist/index.js diff --git a/dist/index.js b/dist/index.js new file mode 100644 index 0000000..e6ed49b --- /dev/null +++ b/dist/index.js @@ -0,0 +1,3301 @@ +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ 351: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.issue = exports.issueCommand = void 0; +const os = __importStar(__nccwpck_require__(37)); +const utils_1 = __nccwpck_require__(278); +/** + * Commands + * + * Command Format: + * ::name key=value,key=value::message + * + * Examples: + * ::warning::This is the message + * ::set-env name=MY_VAR::some value + */ +function issueCommand(command, properties, message) { + const cmd = new Command(command, properties, message); + process.stdout.write(cmd.toString() + os.EOL); +} +exports.issueCommand = issueCommand; +function issue(name, message = '') { + issueCommand(name, {}, message); +} +exports.issue = issue; +const CMD_STRING = '::'; +class Command { + constructor(command, properties, message) { + if (!command) { + command = 'missing.command'; + } + this.command = command; + this.properties = properties; + this.message = message; + } + toString() { + let cmdStr = CMD_STRING + this.command; + if (this.properties && Object.keys(this.properties).length > 0) { + cmdStr += ' '; + let first = true; + for (const key in this.properties) { + if (this.properties.hasOwnProperty(key)) { + const val = this.properties[key]; + if (val) { + if (first) { + first = false; + } + else { + cmdStr += ','; + } + cmdStr += `${key}=${escapeProperty(val)}`; + } + } + } + } + cmdStr += `${CMD_STRING}${escapeData(this.message)}`; + return cmdStr; + } +} +function escapeData(s) { + return utils_1.toCommandValue(s) + .replace(/%/g, '%25') + .replace(/\r/g, '%0D') + .replace(/\n/g, '%0A'); +} +function escapeProperty(s) { + return utils_1.toCommandValue(s) + .replace(/%/g, '%25') + .replace(/\r/g, '%0D') + .replace(/\n/g, '%0A') + .replace(/:/g, '%3A') + .replace(/,/g, '%2C'); +} +//# sourceMappingURL=command.js.map + +/***/ }), + +/***/ 186: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.getIDToken = exports.getState = exports.saveState = exports.group = exports.endGroup = exports.startGroup = exports.info = exports.notice = exports.warning = exports.error = exports.debug = exports.isDebug = exports.setFailed = exports.setCommandEcho = exports.setOutput = exports.getBooleanInput = exports.getMultilineInput = exports.getInput = exports.addPath = exports.setSecret = exports.exportVariable = exports.ExitCode = void 0; +const command_1 = __nccwpck_require__(351); +const file_command_1 = __nccwpck_require__(717); +const utils_1 = __nccwpck_require__(278); +const os = __importStar(__nccwpck_require__(37)); +const path = __importStar(__nccwpck_require__(17)); +const oidc_utils_1 = __nccwpck_require__(41); +/** + * The code to exit an action + */ +var ExitCode; +(function (ExitCode) { + /** + * A code indicating that the action was successful + */ + ExitCode[ExitCode["Success"] = 0] = "Success"; + /** + * A code indicating that the action was a failure + */ + ExitCode[ExitCode["Failure"] = 1] = "Failure"; +})(ExitCode = exports.ExitCode || (exports.ExitCode = {})); +//----------------------------------------------------------------------- +// Variables +//----------------------------------------------------------------------- +/** + * Sets env variable for this action and future actions in the job + * @param name the name of the variable to set + * @param val the value of the variable. Non-string values will be converted to a string via JSON.stringify + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function exportVariable(name, val) { + const convertedVal = utils_1.toCommandValue(val); + process.env[name] = convertedVal; + const filePath = process.env['GITHUB_ENV'] || ''; + if (filePath) { + return file_command_1.issueFileCommand('ENV', file_command_1.prepareKeyValueMessage(name, val)); + } + command_1.issueCommand('set-env', { name }, convertedVal); +} +exports.exportVariable = exportVariable; +/** + * Registers a secret which will get masked from logs + * @param secret value of the secret + */ +function setSecret(secret) { + command_1.issueCommand('add-mask', {}, secret); +} +exports.setSecret = setSecret; +/** + * Prepends inputPath to the PATH (for this action and future actions) + * @param inputPath + */ +function addPath(inputPath) { + const filePath = process.env['GITHUB_PATH'] || ''; + if (filePath) { + file_command_1.issueFileCommand('PATH', inputPath); + } + else { + command_1.issueCommand('add-path', {}, inputPath); + } + process.env['PATH'] = `${inputPath}${path.delimiter}${process.env['PATH']}`; +} +exports.addPath = addPath; +/** + * Gets the value of an input. + * Unless trimWhitespace is set to false in InputOptions, the value is also trimmed. + * Returns an empty string if the value is not defined. + * + * @param name name of the input to get + * @param options optional. See InputOptions. + * @returns string + */ +function getInput(name, options) { + const val = process.env[`INPUT_${name.replace(/ /g, '_').toUpperCase()}`] || ''; + if (options && options.required && !val) { + throw new Error(`Input required and not supplied: ${name}`); + } + if (options && options.trimWhitespace === false) { + return val; + } + return val.trim(); +} +exports.getInput = getInput; +/** + * Gets the values of an multiline input. Each value is also trimmed. + * + * @param name name of the input to get + * @param options optional. See InputOptions. + * @returns string[] + * + */ +function getMultilineInput(name, options) { + const inputs = getInput(name, options) + .split('\n') + .filter(x => x !== ''); + if (options && options.trimWhitespace === false) { + return inputs; + } + return inputs.map(input => input.trim()); +} +exports.getMultilineInput = getMultilineInput; +/** + * Gets the input value of the boolean type in the YAML 1.2 "core schema" specification. + * Support boolean input list: `true | True | TRUE | false | False | FALSE` . + * The return value is also in boolean type. + * ref: https://yaml.org/spec/1.2/spec.html#id2804923 + * + * @param name name of the input to get + * @param options optional. See InputOptions. + * @returns boolean + */ +function getBooleanInput(name, options) { + const trueValue = ['true', 'True', 'TRUE']; + const falseValue = ['false', 'False', 'FALSE']; + const val = getInput(name, options); + if (trueValue.includes(val)) + return true; + if (falseValue.includes(val)) + return false; + throw new TypeError(`Input does not meet YAML 1.2 "Core Schema" specification: ${name}\n` + + `Support boolean input list: \`true | True | TRUE | false | False | FALSE\``); +} +exports.getBooleanInput = getBooleanInput; +/** + * Sets the value of an output. + * + * @param name name of the output to set + * @param value value to store. Non-string values will be converted to a string via JSON.stringify + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function setOutput(name, value) { + const filePath = process.env['GITHUB_OUTPUT'] || ''; + if (filePath) { + return file_command_1.issueFileCommand('OUTPUT', file_command_1.prepareKeyValueMessage(name, value)); + } + process.stdout.write(os.EOL); + command_1.issueCommand('set-output', { name }, utils_1.toCommandValue(value)); +} +exports.setOutput = setOutput; +/** + * Enables or disables the echoing of commands into stdout for the rest of the step. + * Echoing is disabled by default if ACTIONS_STEP_DEBUG is not set. + * + */ +function setCommandEcho(enabled) { + command_1.issue('echo', enabled ? 'on' : 'off'); +} +exports.setCommandEcho = setCommandEcho; +//----------------------------------------------------------------------- +// Results +//----------------------------------------------------------------------- +/** + * Sets the action status to failed. + * When the action exits it will be with an exit code of 1 + * @param message add error issue message + */ +function setFailed(message) { + process.exitCode = ExitCode.Failure; + error(message); +} +exports.setFailed = setFailed; +//----------------------------------------------------------------------- +// Logging Commands +//----------------------------------------------------------------------- +/** + * Gets whether Actions Step Debug is on or not + */ +function isDebug() { + return process.env['RUNNER_DEBUG'] === '1'; +} +exports.isDebug = isDebug; +/** + * Writes debug message to user log + * @param message debug message + */ +function debug(message) { + command_1.issueCommand('debug', {}, message); +} +exports.debug = debug; +/** + * Adds an error issue + * @param message error issue message. Errors will be converted to string via toString() + * @param properties optional properties to add to the annotation. + */ +function error(message, properties = {}) { + command_1.issueCommand('error', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message); +} +exports.error = error; +/** + * Adds a warning issue + * @param message warning issue message. Errors will be converted to string via toString() + * @param properties optional properties to add to the annotation. + */ +function warning(message, properties = {}) { + command_1.issueCommand('warning', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message); +} +exports.warning = warning; +/** + * Adds a notice issue + * @param message notice issue message. Errors will be converted to string via toString() + * @param properties optional properties to add to the annotation. + */ +function notice(message, properties = {}) { + command_1.issueCommand('notice', utils_1.toCommandProperties(properties), message instanceof Error ? message.toString() : message); +} +exports.notice = notice; +/** + * Writes info to log with console.log. + * @param message info message + */ +function info(message) { + process.stdout.write(message + os.EOL); +} +exports.info = info; +/** + * Begin an output group. + * + * Output until the next `groupEnd` will be foldable in this group + * + * @param name The name of the output group + */ +function startGroup(name) { + command_1.issue('group', name); +} +exports.startGroup = startGroup; +/** + * End an output group. + */ +function endGroup() { + command_1.issue('endgroup'); +} +exports.endGroup = endGroup; +/** + * Wrap an asynchronous function call in a group. + * + * Returns the same type as the function itself. + * + * @param name The name of the group + * @param fn The function to wrap in the group + */ +function group(name, fn) { + return __awaiter(this, void 0, void 0, function* () { + startGroup(name); + let result; + try { + result = yield fn(); + } + finally { + endGroup(); + } + return result; + }); +} +exports.group = group; +//----------------------------------------------------------------------- +// Wrapper action state +//----------------------------------------------------------------------- +/** + * Saves state for current action, the state can only be retrieved by this action's post job execution. + * + * @param name name of the state to store + * @param value value to store. Non-string values will be converted to a string via JSON.stringify + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function saveState(name, value) { + const filePath = process.env['GITHUB_STATE'] || ''; + if (filePath) { + return file_command_1.issueFileCommand('STATE', file_command_1.prepareKeyValueMessage(name, value)); + } + command_1.issueCommand('save-state', { name }, utils_1.toCommandValue(value)); +} +exports.saveState = saveState; +/** + * Gets the value of an state set by this action's main execution. + * + * @param name name of the state to get + * @returns string + */ +function getState(name) { + return process.env[`STATE_${name}`] || ''; +} +exports.getState = getState; +function getIDToken(aud) { + return __awaiter(this, void 0, void 0, function* () { + return yield oidc_utils_1.OidcClient.getIDToken(aud); + }); +} +exports.getIDToken = getIDToken; +/** + * Summary exports + */ +var summary_1 = __nccwpck_require__(327); +Object.defineProperty(exports, "summary", ({ enumerable: true, get: function () { return summary_1.summary; } })); +/** + * @deprecated use core.summary + */ +var summary_2 = __nccwpck_require__(327); +Object.defineProperty(exports, "markdownSummary", ({ enumerable: true, get: function () { return summary_2.markdownSummary; } })); +/** + * Path exports + */ +var path_utils_1 = __nccwpck_require__(981); +Object.defineProperty(exports, "toPosixPath", ({ enumerable: true, get: function () { return path_utils_1.toPosixPath; } })); +Object.defineProperty(exports, "toWin32Path", ({ enumerable: true, get: function () { return path_utils_1.toWin32Path; } })); +Object.defineProperty(exports, "toPlatformPath", ({ enumerable: true, get: function () { return path_utils_1.toPlatformPath; } })); +//# sourceMappingURL=core.js.map + +/***/ }), + +/***/ 717: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +// For internal use, subject to change. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.prepareKeyValueMessage = exports.issueFileCommand = void 0; +// We use any as a valid input type +/* eslint-disable @typescript-eslint/no-explicit-any */ +const fs = __importStar(__nccwpck_require__(147)); +const os = __importStar(__nccwpck_require__(37)); +const uuid_1 = __nccwpck_require__(840); +const utils_1 = __nccwpck_require__(278); +function issueFileCommand(command, message) { + const filePath = process.env[`GITHUB_${command}`]; + if (!filePath) { + throw new Error(`Unable to find environment variable for file command ${command}`); + } + if (!fs.existsSync(filePath)) { + throw new Error(`Missing file at path: ${filePath}`); + } + fs.appendFileSync(filePath, `${utils_1.toCommandValue(message)}${os.EOL}`, { + encoding: 'utf8' + }); +} +exports.issueFileCommand = issueFileCommand; +function prepareKeyValueMessage(key, value) { + const delimiter = `ghadelimiter_${uuid_1.v4()}`; + const convertedValue = utils_1.toCommandValue(value); + // These should realistically never happen, but just in case someone finds a + // way to exploit uuid generation let's not allow keys or values that contain + // the delimiter. + if (key.includes(delimiter)) { + throw new Error(`Unexpected input: name should not contain the delimiter "${delimiter}"`); + } + if (convertedValue.includes(delimiter)) { + throw new Error(`Unexpected input: value should not contain the delimiter "${delimiter}"`); + } + return `${key}<<${delimiter}${os.EOL}${convertedValue}${os.EOL}${delimiter}`; +} +exports.prepareKeyValueMessage = prepareKeyValueMessage; +//# sourceMappingURL=file-command.js.map + +/***/ }), + +/***/ 41: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.OidcClient = void 0; +const http_client_1 = __nccwpck_require__(255); +const auth_1 = __nccwpck_require__(526); +const core_1 = __nccwpck_require__(186); +class OidcClient { + static createHttpClient(allowRetry = true, maxRetry = 10) { + const requestOptions = { + allowRetries: allowRetry, + maxRetries: maxRetry + }; + return new http_client_1.HttpClient('actions/oidc-client', [new auth_1.BearerCredentialHandler(OidcClient.getRequestToken())], requestOptions); + } + static getRequestToken() { + const token = process.env['ACTIONS_ID_TOKEN_REQUEST_TOKEN']; + if (!token) { + throw new Error('Unable to get ACTIONS_ID_TOKEN_REQUEST_TOKEN env variable'); + } + return token; + } + static getIDTokenUrl() { + const runtimeUrl = process.env['ACTIONS_ID_TOKEN_REQUEST_URL']; + if (!runtimeUrl) { + throw new Error('Unable to get ACTIONS_ID_TOKEN_REQUEST_URL env variable'); + } + return runtimeUrl; + } + static getCall(id_token_url) { + var _a; + return __awaiter(this, void 0, void 0, function* () { + const httpclient = OidcClient.createHttpClient(); + const res = yield httpclient + .getJson(id_token_url) + .catch(error => { + throw new Error(`Failed to get ID Token. \n + Error Code : ${error.statusCode}\n + Error Message: ${error.result.message}`); + }); + const id_token = (_a = res.result) === null || _a === void 0 ? void 0 : _a.value; + if (!id_token) { + throw new Error('Response json body do not have ID Token field'); + } + return id_token; + }); + } + static getIDToken(audience) { + return __awaiter(this, void 0, void 0, function* () { + try { + // New ID Token is requested from action service + let id_token_url = OidcClient.getIDTokenUrl(); + if (audience) { + const encodedAudience = encodeURIComponent(audience); + id_token_url = `${id_token_url}&audience=${encodedAudience}`; + } + core_1.debug(`ID token url is ${id_token_url}`); + const id_token = yield OidcClient.getCall(id_token_url); + core_1.setSecret(id_token); + return id_token; + } + catch (error) { + throw new Error(`Error message: ${error.message}`); + } + }); + } +} +exports.OidcClient = OidcClient; +//# sourceMappingURL=oidc-utils.js.map + +/***/ }), + +/***/ 981: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.toPlatformPath = exports.toWin32Path = exports.toPosixPath = void 0; +const path = __importStar(__nccwpck_require__(17)); +/** + * toPosixPath converts the given path to the posix form. On Windows, \\ will be + * replaced with /. + * + * @param pth. Path to transform. + * @return string Posix path. + */ +function toPosixPath(pth) { + return pth.replace(/[\\]/g, '/'); +} +exports.toPosixPath = toPosixPath; +/** + * toWin32Path converts the given path to the win32 form. On Linux, / will be + * replaced with \\. + * + * @param pth. Path to transform. + * @return string Win32 path. + */ +function toWin32Path(pth) { + return pth.replace(/[/]/g, '\\'); +} +exports.toWin32Path = toWin32Path; +/** + * toPlatformPath converts the given path to a platform-specific path. It does + * this by replacing instances of / and \ with the platform-specific path + * separator. + * + * @param pth The path to platformize. + * @return string The platform-specific path. + */ +function toPlatformPath(pth) { + return pth.replace(/[/\\]/g, path.sep); +} +exports.toPlatformPath = toPlatformPath; +//# sourceMappingURL=path-utils.js.map + +/***/ }), + +/***/ 327: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.summary = exports.markdownSummary = exports.SUMMARY_DOCS_URL = exports.SUMMARY_ENV_VAR = void 0; +const os_1 = __nccwpck_require__(37); +const fs_1 = __nccwpck_require__(147); +const { access, appendFile, writeFile } = fs_1.promises; +exports.SUMMARY_ENV_VAR = 'GITHUB_STEP_SUMMARY'; +exports.SUMMARY_DOCS_URL = 'https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#adding-a-job-summary'; +class Summary { + constructor() { + this._buffer = ''; + } + /** + * Finds the summary file path from the environment, rejects if env var is not found or file does not exist + * Also checks r/w permissions. + * + * @returns step summary file path + */ + filePath() { + return __awaiter(this, void 0, void 0, function* () { + if (this._filePath) { + return this._filePath; + } + const pathFromEnv = process.env[exports.SUMMARY_ENV_VAR]; + if (!pathFromEnv) { + throw new Error(`Unable to find environment variable for $${exports.SUMMARY_ENV_VAR}. Check if your runtime environment supports job summaries.`); + } + try { + yield access(pathFromEnv, fs_1.constants.R_OK | fs_1.constants.W_OK); + } + catch (_a) { + throw new Error(`Unable to access summary file: '${pathFromEnv}'. Check if the file has correct read/write permissions.`); + } + this._filePath = pathFromEnv; + return this._filePath; + }); + } + /** + * Wraps content in an HTML tag, adding any HTML attributes + * + * @param {string} tag HTML tag to wrap + * @param {string | null} content content within the tag + * @param {[attribute: string]: string} attrs key-value list of HTML attributes to add + * + * @returns {string} content wrapped in HTML element + */ + wrap(tag, content, attrs = {}) { + const htmlAttrs = Object.entries(attrs) + .map(([key, value]) => ` ${key}="${value}"`) + .join(''); + if (!content) { + return `<${tag}${htmlAttrs}>`; + } + return `<${tag}${htmlAttrs}>${content}`; + } + /** + * Writes text in the buffer to the summary buffer file and empties buffer. Will append by default. + * + * @param {SummaryWriteOptions} [options] (optional) options for write operation + * + * @returns {Promise} summary instance + */ + write(options) { + return __awaiter(this, void 0, void 0, function* () { + const overwrite = !!(options === null || options === void 0 ? void 0 : options.overwrite); + const filePath = yield this.filePath(); + const writeFunc = overwrite ? writeFile : appendFile; + yield writeFunc(filePath, this._buffer, { encoding: 'utf8' }); + return this.emptyBuffer(); + }); + } + /** + * Clears the summary buffer and wipes the summary file + * + * @returns {Summary} summary instance + */ + clear() { + return __awaiter(this, void 0, void 0, function* () { + return this.emptyBuffer().write({ overwrite: true }); + }); + } + /** + * Returns the current summary buffer as a string + * + * @returns {string} string of summary buffer + */ + stringify() { + return this._buffer; + } + /** + * If the summary buffer is empty + * + * @returns {boolen} true if the buffer is empty + */ + isEmptyBuffer() { + return this._buffer.length === 0; + } + /** + * Resets the summary buffer without writing to summary file + * + * @returns {Summary} summary instance + */ + emptyBuffer() { + this._buffer = ''; + return this; + } + /** + * Adds raw text to the summary buffer + * + * @param {string} text content to add + * @param {boolean} [addEOL=false] (optional) append an EOL to the raw text (default: false) + * + * @returns {Summary} summary instance + */ + addRaw(text, addEOL = false) { + this._buffer += text; + return addEOL ? this.addEOL() : this; + } + /** + * Adds the operating system-specific end-of-line marker to the buffer + * + * @returns {Summary} summary instance + */ + addEOL() { + return this.addRaw(os_1.EOL); + } + /** + * Adds an HTML codeblock to the summary buffer + * + * @param {string} code content to render within fenced code block + * @param {string} lang (optional) language to syntax highlight code + * + * @returns {Summary} summary instance + */ + addCodeBlock(code, lang) { + const attrs = Object.assign({}, (lang && { lang })); + const element = this.wrap('pre', this.wrap('code', code), attrs); + return this.addRaw(element).addEOL(); + } + /** + * Adds an HTML list to the summary buffer + * + * @param {string[]} items list of items to render + * @param {boolean} [ordered=false] (optional) if the rendered list should be ordered or not (default: false) + * + * @returns {Summary} summary instance + */ + addList(items, ordered = false) { + const tag = ordered ? 'ol' : 'ul'; + const listItems = items.map(item => this.wrap('li', item)).join(''); + const element = this.wrap(tag, listItems); + return this.addRaw(element).addEOL(); + } + /** + * Adds an HTML table to the summary buffer + * + * @param {SummaryTableCell[]} rows table rows + * + * @returns {Summary} summary instance + */ + addTable(rows) { + const tableBody = rows + .map(row => { + const cells = row + .map(cell => { + if (typeof cell === 'string') { + return this.wrap('td', cell); + } + const { header, data, colspan, rowspan } = cell; + const tag = header ? 'th' : 'td'; + const attrs = Object.assign(Object.assign({}, (colspan && { colspan })), (rowspan && { rowspan })); + return this.wrap(tag, data, attrs); + }) + .join(''); + return this.wrap('tr', cells); + }) + .join(''); + const element = this.wrap('table', tableBody); + return this.addRaw(element).addEOL(); + } + /** + * Adds a collapsable HTML details element to the summary buffer + * + * @param {string} label text for the closed state + * @param {string} content collapsable content + * + * @returns {Summary} summary instance + */ + addDetails(label, content) { + const element = this.wrap('details', this.wrap('summary', label) + content); + return this.addRaw(element).addEOL(); + } + /** + * Adds an HTML image tag to the summary buffer + * + * @param {string} src path to the image you to embed + * @param {string} alt text description of the image + * @param {SummaryImageOptions} options (optional) addition image attributes + * + * @returns {Summary} summary instance + */ + addImage(src, alt, options) { + const { width, height } = options || {}; + const attrs = Object.assign(Object.assign({}, (width && { width })), (height && { height })); + const element = this.wrap('img', null, Object.assign({ src, alt }, attrs)); + return this.addRaw(element).addEOL(); + } + /** + * Adds an HTML section heading element + * + * @param {string} text heading text + * @param {number | string} [level=1] (optional) the heading level, default: 1 + * + * @returns {Summary} summary instance + */ + addHeading(text, level) { + const tag = `h${level}`; + const allowedTag = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'].includes(tag) + ? tag + : 'h1'; + const element = this.wrap(allowedTag, text); + return this.addRaw(element).addEOL(); + } + /** + * Adds an HTML thematic break (
) to the summary buffer + * + * @returns {Summary} summary instance + */ + addSeparator() { + const element = this.wrap('hr', null); + return this.addRaw(element).addEOL(); + } + /** + * Adds an HTML line break (
) to the summary buffer + * + * @returns {Summary} summary instance + */ + addBreak() { + const element = this.wrap('br', null); + return this.addRaw(element).addEOL(); + } + /** + * Adds an HTML blockquote to the summary buffer + * + * @param {string} text quote text + * @param {string} cite (optional) citation url + * + * @returns {Summary} summary instance + */ + addQuote(text, cite) { + const attrs = Object.assign({}, (cite && { cite })); + const element = this.wrap('blockquote', text, attrs); + return this.addRaw(element).addEOL(); + } + /** + * Adds an HTML anchor tag to the summary buffer + * + * @param {string} text link text/content + * @param {string} href hyperlink + * + * @returns {Summary} summary instance + */ + addLink(text, href) { + const element = this.wrap('a', text, { href }); + return this.addRaw(element).addEOL(); + } +} +const _summary = new Summary(); +/** + * @deprecated use `core.summary` + */ +exports.markdownSummary = _summary; +exports.summary = _summary; +//# sourceMappingURL=summary.js.map + +/***/ }), + +/***/ 278: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +// We use any as a valid input type +/* eslint-disable @typescript-eslint/no-explicit-any */ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.toCommandProperties = exports.toCommandValue = void 0; +/** + * Sanitizes an input into a string so it can be passed into issueCommand safely + * @param input input to sanitize into a string + */ +function toCommandValue(input) { + if (input === null || input === undefined) { + return ''; + } + else if (typeof input === 'string' || input instanceof String) { + return input; + } + return JSON.stringify(input); +} +exports.toCommandValue = toCommandValue; +/** + * + * @param annotationProperties + * @returns The command properties to send with the actual annotation command + * See IssueCommandProperties: https://github.com/actions/runner/blob/main/src/Runner.Worker/ActionCommandManager.cs#L646 + */ +function toCommandProperties(annotationProperties) { + if (!Object.keys(annotationProperties).length) { + return {}; + } + return { + title: annotationProperties.title, + file: annotationProperties.file, + line: annotationProperties.startLine, + endLine: annotationProperties.endLine, + col: annotationProperties.startColumn, + endColumn: annotationProperties.endColumn + }; +} +exports.toCommandProperties = toCommandProperties; +//# sourceMappingURL=utils.js.map + +/***/ }), + +/***/ 526: +/***/ (function(__unused_webpack_module, exports) { + +"use strict"; + +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.PersonalAccessTokenCredentialHandler = exports.BearerCredentialHandler = exports.BasicCredentialHandler = void 0; +class BasicCredentialHandler { + constructor(username, password) { + this.username = username; + this.password = password; + } + prepareRequest(options) { + if (!options.headers) { + throw Error('The request has no headers'); + } + options.headers['Authorization'] = `Basic ${Buffer.from(`${this.username}:${this.password}`).toString('base64')}`; + } + // This handler cannot handle 401 + canHandleAuthentication() { + return false; + } + handleAuthentication() { + return __awaiter(this, void 0, void 0, function* () { + throw new Error('not implemented'); + }); + } +} +exports.BasicCredentialHandler = BasicCredentialHandler; +class BearerCredentialHandler { + constructor(token) { + this.token = token; + } + // currently implements pre-authorization + // TODO: support preAuth = false where it hooks on 401 + prepareRequest(options) { + if (!options.headers) { + throw Error('The request has no headers'); + } + options.headers['Authorization'] = `Bearer ${this.token}`; + } + // This handler cannot handle 401 + canHandleAuthentication() { + return false; + } + handleAuthentication() { + return __awaiter(this, void 0, void 0, function* () { + throw new Error('not implemented'); + }); + } +} +exports.BearerCredentialHandler = BearerCredentialHandler; +class PersonalAccessTokenCredentialHandler { + constructor(token) { + this.token = token; + } + // currently implements pre-authorization + // TODO: support preAuth = false where it hooks on 401 + prepareRequest(options) { + if (!options.headers) { + throw Error('The request has no headers'); + } + options.headers['Authorization'] = `Basic ${Buffer.from(`PAT:${this.token}`).toString('base64')}`; + } + // This handler cannot handle 401 + canHandleAuthentication() { + return false; + } + handleAuthentication() { + return __awaiter(this, void 0, void 0, function* () { + throw new Error('not implemented'); + }); + } +} +exports.PersonalAccessTokenCredentialHandler = PersonalAccessTokenCredentialHandler; +//# sourceMappingURL=auth.js.map + +/***/ }), + +/***/ 255: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +/* eslint-disable @typescript-eslint/no-explicit-any */ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.HttpClient = exports.isHttps = exports.HttpClientResponse = exports.HttpClientError = exports.getProxyUrl = exports.MediaTypes = exports.Headers = exports.HttpCodes = void 0; +const http = __importStar(__nccwpck_require__(685)); +const https = __importStar(__nccwpck_require__(687)); +const pm = __importStar(__nccwpck_require__(835)); +const tunnel = __importStar(__nccwpck_require__(294)); +var HttpCodes; +(function (HttpCodes) { + HttpCodes[HttpCodes["OK"] = 200] = "OK"; + HttpCodes[HttpCodes["MultipleChoices"] = 300] = "MultipleChoices"; + HttpCodes[HttpCodes["MovedPermanently"] = 301] = "MovedPermanently"; + HttpCodes[HttpCodes["ResourceMoved"] = 302] = "ResourceMoved"; + HttpCodes[HttpCodes["SeeOther"] = 303] = "SeeOther"; + HttpCodes[HttpCodes["NotModified"] = 304] = "NotModified"; + HttpCodes[HttpCodes["UseProxy"] = 305] = "UseProxy"; + HttpCodes[HttpCodes["SwitchProxy"] = 306] = "SwitchProxy"; + HttpCodes[HttpCodes["TemporaryRedirect"] = 307] = "TemporaryRedirect"; + HttpCodes[HttpCodes["PermanentRedirect"] = 308] = "PermanentRedirect"; + HttpCodes[HttpCodes["BadRequest"] = 400] = "BadRequest"; + HttpCodes[HttpCodes["Unauthorized"] = 401] = "Unauthorized"; + HttpCodes[HttpCodes["PaymentRequired"] = 402] = "PaymentRequired"; + HttpCodes[HttpCodes["Forbidden"] = 403] = "Forbidden"; + HttpCodes[HttpCodes["NotFound"] = 404] = "NotFound"; + HttpCodes[HttpCodes["MethodNotAllowed"] = 405] = "MethodNotAllowed"; + HttpCodes[HttpCodes["NotAcceptable"] = 406] = "NotAcceptable"; + HttpCodes[HttpCodes["ProxyAuthenticationRequired"] = 407] = "ProxyAuthenticationRequired"; + HttpCodes[HttpCodes["RequestTimeout"] = 408] = "RequestTimeout"; + HttpCodes[HttpCodes["Conflict"] = 409] = "Conflict"; + HttpCodes[HttpCodes["Gone"] = 410] = "Gone"; + HttpCodes[HttpCodes["TooManyRequests"] = 429] = "TooManyRequests"; + HttpCodes[HttpCodes["InternalServerError"] = 500] = "InternalServerError"; + HttpCodes[HttpCodes["NotImplemented"] = 501] = "NotImplemented"; + HttpCodes[HttpCodes["BadGateway"] = 502] = "BadGateway"; + HttpCodes[HttpCodes["ServiceUnavailable"] = 503] = "ServiceUnavailable"; + HttpCodes[HttpCodes["GatewayTimeout"] = 504] = "GatewayTimeout"; +})(HttpCodes = exports.HttpCodes || (exports.HttpCodes = {})); +var Headers; +(function (Headers) { + Headers["Accept"] = "accept"; + Headers["ContentType"] = "content-type"; +})(Headers = exports.Headers || (exports.Headers = {})); +var MediaTypes; +(function (MediaTypes) { + MediaTypes["ApplicationJson"] = "application/json"; +})(MediaTypes = exports.MediaTypes || (exports.MediaTypes = {})); +/** + * Returns the proxy URL, depending upon the supplied url and proxy environment variables. + * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com + */ +function getProxyUrl(serverUrl) { + const proxyUrl = pm.getProxyUrl(new URL(serverUrl)); + return proxyUrl ? proxyUrl.href : ''; +} +exports.getProxyUrl = getProxyUrl; +const HttpRedirectCodes = [ + HttpCodes.MovedPermanently, + HttpCodes.ResourceMoved, + HttpCodes.SeeOther, + HttpCodes.TemporaryRedirect, + HttpCodes.PermanentRedirect +]; +const HttpResponseRetryCodes = [ + HttpCodes.BadGateway, + HttpCodes.ServiceUnavailable, + HttpCodes.GatewayTimeout +]; +const RetryableHttpVerbs = ['OPTIONS', 'GET', 'DELETE', 'HEAD']; +const ExponentialBackoffCeiling = 10; +const ExponentialBackoffTimeSlice = 5; +class HttpClientError extends Error { + constructor(message, statusCode) { + super(message); + this.name = 'HttpClientError'; + this.statusCode = statusCode; + Object.setPrototypeOf(this, HttpClientError.prototype); + } +} +exports.HttpClientError = HttpClientError; +class HttpClientResponse { + constructor(message) { + this.message = message; + } + readBody() { + return __awaiter(this, void 0, void 0, function* () { + return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () { + let output = Buffer.alloc(0); + this.message.on('data', (chunk) => { + output = Buffer.concat([output, chunk]); + }); + this.message.on('end', () => { + resolve(output.toString()); + }); + })); + }); + } +} +exports.HttpClientResponse = HttpClientResponse; +function isHttps(requestUrl) { + const parsedUrl = new URL(requestUrl); + return parsedUrl.protocol === 'https:'; +} +exports.isHttps = isHttps; +class HttpClient { + constructor(userAgent, handlers, requestOptions) { + this._ignoreSslError = false; + this._allowRedirects = true; + this._allowRedirectDowngrade = false; + this._maxRedirects = 50; + this._allowRetries = false; + this._maxRetries = 1; + this._keepAlive = false; + this._disposed = false; + this.userAgent = userAgent; + this.handlers = handlers || []; + this.requestOptions = requestOptions; + if (requestOptions) { + if (requestOptions.ignoreSslError != null) { + this._ignoreSslError = requestOptions.ignoreSslError; + } + this._socketTimeout = requestOptions.socketTimeout; + if (requestOptions.allowRedirects != null) { + this._allowRedirects = requestOptions.allowRedirects; + } + if (requestOptions.allowRedirectDowngrade != null) { + this._allowRedirectDowngrade = requestOptions.allowRedirectDowngrade; + } + if (requestOptions.maxRedirects != null) { + this._maxRedirects = Math.max(requestOptions.maxRedirects, 0); + } + if (requestOptions.keepAlive != null) { + this._keepAlive = requestOptions.keepAlive; + } + if (requestOptions.allowRetries != null) { + this._allowRetries = requestOptions.allowRetries; + } + if (requestOptions.maxRetries != null) { + this._maxRetries = requestOptions.maxRetries; + } + } + } + options(requestUrl, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request('OPTIONS', requestUrl, null, additionalHeaders || {}); + }); + } + get(requestUrl, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request('GET', requestUrl, null, additionalHeaders || {}); + }); + } + del(requestUrl, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request('DELETE', requestUrl, null, additionalHeaders || {}); + }); + } + post(requestUrl, data, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request('POST', requestUrl, data, additionalHeaders || {}); + }); + } + patch(requestUrl, data, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request('PATCH', requestUrl, data, additionalHeaders || {}); + }); + } + put(requestUrl, data, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request('PUT', requestUrl, data, additionalHeaders || {}); + }); + } + head(requestUrl, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request('HEAD', requestUrl, null, additionalHeaders || {}); + }); + } + sendStream(verb, requestUrl, stream, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request(verb, requestUrl, stream, additionalHeaders); + }); + } + /** + * Gets a typed object from an endpoint + * Be aware that not found returns a null. Other errors (4xx, 5xx) reject the promise + */ + getJson(requestUrl, additionalHeaders = {}) { + return __awaiter(this, void 0, void 0, function* () { + additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); + const res = yield this.get(requestUrl, additionalHeaders); + return this._processResponse(res, this.requestOptions); + }); + } + postJson(requestUrl, obj, additionalHeaders = {}) { + return __awaiter(this, void 0, void 0, function* () { + const data = JSON.stringify(obj, null, 2); + additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); + additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); + const res = yield this.post(requestUrl, data, additionalHeaders); + return this._processResponse(res, this.requestOptions); + }); + } + putJson(requestUrl, obj, additionalHeaders = {}) { + return __awaiter(this, void 0, void 0, function* () { + const data = JSON.stringify(obj, null, 2); + additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); + additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); + const res = yield this.put(requestUrl, data, additionalHeaders); + return this._processResponse(res, this.requestOptions); + }); + } + patchJson(requestUrl, obj, additionalHeaders = {}) { + return __awaiter(this, void 0, void 0, function* () { + const data = JSON.stringify(obj, null, 2); + additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); + additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); + const res = yield this.patch(requestUrl, data, additionalHeaders); + return this._processResponse(res, this.requestOptions); + }); + } + /** + * Makes a raw http request. + * All other methods such as get, post, patch, and request ultimately call this. + * Prefer get, del, post and patch + */ + request(verb, requestUrl, data, headers) { + return __awaiter(this, void 0, void 0, function* () { + if (this._disposed) { + throw new Error('Client has already been disposed.'); + } + const parsedUrl = new URL(requestUrl); + let info = this._prepareRequest(verb, parsedUrl, headers); + // Only perform retries on reads since writes may not be idempotent. + const maxTries = this._allowRetries && RetryableHttpVerbs.includes(verb) + ? this._maxRetries + 1 + : 1; + let numTries = 0; + let response; + do { + response = yield this.requestRaw(info, data); + // Check if it's an authentication challenge + if (response && + response.message && + response.message.statusCode === HttpCodes.Unauthorized) { + let authenticationHandler; + for (const handler of this.handlers) { + if (handler.canHandleAuthentication(response)) { + authenticationHandler = handler; + break; + } + } + if (authenticationHandler) { + return authenticationHandler.handleAuthentication(this, info, data); + } + else { + // We have received an unauthorized response but have no handlers to handle it. + // Let the response return to the caller. + return response; + } + } + let redirectsRemaining = this._maxRedirects; + while (response.message.statusCode && + HttpRedirectCodes.includes(response.message.statusCode) && + this._allowRedirects && + redirectsRemaining > 0) { + const redirectUrl = response.message.headers['location']; + if (!redirectUrl) { + // if there's no location to redirect to, we won't + break; + } + const parsedRedirectUrl = new URL(redirectUrl); + if (parsedUrl.protocol === 'https:' && + parsedUrl.protocol !== parsedRedirectUrl.protocol && + !this._allowRedirectDowngrade) { + throw new Error('Redirect from HTTPS to HTTP protocol. This downgrade is not allowed for security reasons. If you want to allow this behavior, set the allowRedirectDowngrade option to true.'); + } + // we need to finish reading the response before reassigning response + // which will leak the open socket. + yield response.readBody(); + // strip authorization header if redirected to a different hostname + if (parsedRedirectUrl.hostname !== parsedUrl.hostname) { + for (const header in headers) { + // header names are case insensitive + if (header.toLowerCase() === 'authorization') { + delete headers[header]; + } + } + } + // let's make the request with the new redirectUrl + info = this._prepareRequest(verb, parsedRedirectUrl, headers); + response = yield this.requestRaw(info, data); + redirectsRemaining--; + } + if (!response.message.statusCode || + !HttpResponseRetryCodes.includes(response.message.statusCode)) { + // If not a retry code, return immediately instead of retrying + return response; + } + numTries += 1; + if (numTries < maxTries) { + yield response.readBody(); + yield this._performExponentialBackoff(numTries); + } + } while (numTries < maxTries); + return response; + }); + } + /** + * Needs to be called if keepAlive is set to true in request options. + */ + dispose() { + if (this._agent) { + this._agent.destroy(); + } + this._disposed = true; + } + /** + * Raw request. + * @param info + * @param data + */ + requestRaw(info, data) { + return __awaiter(this, void 0, void 0, function* () { + return new Promise((resolve, reject) => { + function callbackForResult(err, res) { + if (err) { + reject(err); + } + else if (!res) { + // If `err` is not passed, then `res` must be passed. + reject(new Error('Unknown error')); + } + else { + resolve(res); + } + } + this.requestRawWithCallback(info, data, callbackForResult); + }); + }); + } + /** + * Raw request with callback. + * @param info + * @param data + * @param onResult + */ + requestRawWithCallback(info, data, onResult) { + if (typeof data === 'string') { + if (!info.options.headers) { + info.options.headers = {}; + } + info.options.headers['Content-Length'] = Buffer.byteLength(data, 'utf8'); + } + let callbackCalled = false; + function handleResult(err, res) { + if (!callbackCalled) { + callbackCalled = true; + onResult(err, res); + } + } + const req = info.httpModule.request(info.options, (msg) => { + const res = new HttpClientResponse(msg); + handleResult(undefined, res); + }); + let socket; + req.on('socket', sock => { + socket = sock; + }); + // If we ever get disconnected, we want the socket to timeout eventually + req.setTimeout(this._socketTimeout || 3 * 60000, () => { + if (socket) { + socket.end(); + } + handleResult(new Error(`Request timeout: ${info.options.path}`)); + }); + req.on('error', function (err) { + // err has statusCode property + // res should have headers + handleResult(err); + }); + if (data && typeof data === 'string') { + req.write(data, 'utf8'); + } + if (data && typeof data !== 'string') { + data.on('close', function () { + req.end(); + }); + data.pipe(req); + } + else { + req.end(); + } + } + /** + * Gets an http agent. This function is useful when you need an http agent that handles + * routing through a proxy server - depending upon the url and proxy environment variables. + * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com + */ + getAgent(serverUrl) { + const parsedUrl = new URL(serverUrl); + return this._getAgent(parsedUrl); + } + _prepareRequest(method, requestUrl, headers) { + const info = {}; + info.parsedUrl = requestUrl; + const usingSsl = info.parsedUrl.protocol === 'https:'; + info.httpModule = usingSsl ? https : http; + const defaultPort = usingSsl ? 443 : 80; + info.options = {}; + info.options.host = info.parsedUrl.hostname; + info.options.port = info.parsedUrl.port + ? parseInt(info.parsedUrl.port) + : defaultPort; + info.options.path = + (info.parsedUrl.pathname || '') + (info.parsedUrl.search || ''); + info.options.method = method; + info.options.headers = this._mergeHeaders(headers); + if (this.userAgent != null) { + info.options.headers['user-agent'] = this.userAgent; + } + info.options.agent = this._getAgent(info.parsedUrl); + // gives handlers an opportunity to participate + if (this.handlers) { + for (const handler of this.handlers) { + handler.prepareRequest(info.options); + } + } + return info; + } + _mergeHeaders(headers) { + if (this.requestOptions && this.requestOptions.headers) { + return Object.assign({}, lowercaseKeys(this.requestOptions.headers), lowercaseKeys(headers || {})); + } + return lowercaseKeys(headers || {}); + } + _getExistingOrDefaultHeader(additionalHeaders, header, _default) { + let clientHeader; + if (this.requestOptions && this.requestOptions.headers) { + clientHeader = lowercaseKeys(this.requestOptions.headers)[header]; + } + return additionalHeaders[header] || clientHeader || _default; + } + _getAgent(parsedUrl) { + let agent; + const proxyUrl = pm.getProxyUrl(parsedUrl); + const useProxy = proxyUrl && proxyUrl.hostname; + if (this._keepAlive && useProxy) { + agent = this._proxyAgent; + } + if (this._keepAlive && !useProxy) { + agent = this._agent; + } + // if agent is already assigned use that agent. + if (agent) { + return agent; + } + const usingSsl = parsedUrl.protocol === 'https:'; + let maxSockets = 100; + if (this.requestOptions) { + maxSockets = this.requestOptions.maxSockets || http.globalAgent.maxSockets; + } + // This is `useProxy` again, but we need to check `proxyURl` directly for TypeScripts's flow analysis. + if (proxyUrl && proxyUrl.hostname) { + const agentOptions = { + maxSockets, + keepAlive: this._keepAlive, + proxy: Object.assign(Object.assign({}, ((proxyUrl.username || proxyUrl.password) && { + proxyAuth: `${proxyUrl.username}:${proxyUrl.password}` + })), { host: proxyUrl.hostname, port: proxyUrl.port }) + }; + let tunnelAgent; + const overHttps = proxyUrl.protocol === 'https:'; + if (usingSsl) { + tunnelAgent = overHttps ? tunnel.httpsOverHttps : tunnel.httpsOverHttp; + } + else { + tunnelAgent = overHttps ? tunnel.httpOverHttps : tunnel.httpOverHttp; + } + agent = tunnelAgent(agentOptions); + this._proxyAgent = agent; + } + // if reusing agent across request and tunneling agent isn't assigned create a new agent + if (this._keepAlive && !agent) { + const options = { keepAlive: this._keepAlive, maxSockets }; + agent = usingSsl ? new https.Agent(options) : new http.Agent(options); + this._agent = agent; + } + // if not using private agent and tunnel agent isn't setup then use global agent + if (!agent) { + agent = usingSsl ? https.globalAgent : http.globalAgent; + } + if (usingSsl && this._ignoreSslError) { + // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process + // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options + // we have to cast it to any and change it directly + agent.options = Object.assign(agent.options || {}, { + rejectUnauthorized: false + }); + } + return agent; + } + _performExponentialBackoff(retryNumber) { + return __awaiter(this, void 0, void 0, function* () { + retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber); + const ms = ExponentialBackoffTimeSlice * Math.pow(2, retryNumber); + return new Promise(resolve => setTimeout(() => resolve(), ms)); + }); + } + _processResponse(res, options) { + return __awaiter(this, void 0, void 0, function* () { + return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { + const statusCode = res.message.statusCode || 0; + const response = { + statusCode, + result: null, + headers: {} + }; + // not found leads to null obj returned + if (statusCode === HttpCodes.NotFound) { + resolve(response); + } + // get the result from the body + function dateTimeDeserializer(key, value) { + if (typeof value === 'string') { + const a = new Date(value); + if (!isNaN(a.valueOf())) { + return a; + } + } + return value; + } + let obj; + let contents; + try { + contents = yield res.readBody(); + if (contents && contents.length > 0) { + if (options && options.deserializeDates) { + obj = JSON.parse(contents, dateTimeDeserializer); + } + else { + obj = JSON.parse(contents); + } + response.result = obj; + } + response.headers = res.message.headers; + } + catch (err) { + // Invalid resource (contents not json); leaving result obj null + } + // note that 3xx redirects are handled by the http layer. + if (statusCode > 299) { + let msg; + // if exception/error in body, attempt to get better error + if (obj && obj.message) { + msg = obj.message; + } + else if (contents && contents.length > 0) { + // it may be the case that the exception is in the body message as string + msg = contents; + } + else { + msg = `Failed request: (${statusCode})`; + } + const err = new HttpClientError(msg, statusCode); + err.result = response.result; + reject(err); + } + else { + resolve(response); + } + })); + }); + } +} +exports.HttpClient = HttpClient; +const lowercaseKeys = (obj) => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {}); +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ 835: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.checkBypass = exports.getProxyUrl = void 0; +function getProxyUrl(reqUrl) { + const usingSsl = reqUrl.protocol === 'https:'; + if (checkBypass(reqUrl)) { + return undefined; + } + const proxyVar = (() => { + if (usingSsl) { + return process.env['https_proxy'] || process.env['HTTPS_PROXY']; + } + else { + return process.env['http_proxy'] || process.env['HTTP_PROXY']; + } + })(); + if (proxyVar) { + return new URL(proxyVar); + } + else { + return undefined; + } +} +exports.getProxyUrl = getProxyUrl; +function checkBypass(reqUrl) { + if (!reqUrl.hostname) { + return false; + } + const noProxy = process.env['no_proxy'] || process.env['NO_PROXY'] || ''; + if (!noProxy) { + return false; + } + // Determine the request port + let reqPort; + if (reqUrl.port) { + reqPort = Number(reqUrl.port); + } + else if (reqUrl.protocol === 'http:') { + reqPort = 80; + } + else if (reqUrl.protocol === 'https:') { + reqPort = 443; + } + // Format the request hostname and hostname with port + const upperReqHosts = [reqUrl.hostname.toUpperCase()]; + if (typeof reqPort === 'number') { + upperReqHosts.push(`${upperReqHosts[0]}:${reqPort}`); + } + // Compare request host against noproxy + for (const upperNoProxyItem of noProxy + .split(',') + .map(x => x.trim().toUpperCase()) + .filter(x => x)) { + if (upperReqHosts.some(x => x === upperNoProxyItem)) { + return true; + } + } + return false; +} +exports.checkBypass = checkBypass; +//# sourceMappingURL=proxy.js.map + +/***/ }), + +/***/ 294: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +module.exports = __nccwpck_require__(219); + + +/***/ }), + +/***/ 219: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +var net = __nccwpck_require__(808); +var tls = __nccwpck_require__(404); +var http = __nccwpck_require__(685); +var https = __nccwpck_require__(687); +var events = __nccwpck_require__(361); +var assert = __nccwpck_require__(491); +var util = __nccwpck_require__(837); + + +exports.httpOverHttp = httpOverHttp; +exports.httpsOverHttp = httpsOverHttp; +exports.httpOverHttps = httpOverHttps; +exports.httpsOverHttps = httpsOverHttps; + + +function httpOverHttp(options) { + var agent = new TunnelingAgent(options); + agent.request = http.request; + return agent; +} + +function httpsOverHttp(options) { + var agent = new TunnelingAgent(options); + agent.request = http.request; + agent.createSocket = createSecureSocket; + agent.defaultPort = 443; + return agent; +} + +function httpOverHttps(options) { + var agent = new TunnelingAgent(options); + agent.request = https.request; + return agent; +} + +function httpsOverHttps(options) { + var agent = new TunnelingAgent(options); + agent.request = https.request; + agent.createSocket = createSecureSocket; + agent.defaultPort = 443; + return agent; +} + + +function TunnelingAgent(options) { + var self = this; + self.options = options || {}; + self.proxyOptions = self.options.proxy || {}; + self.maxSockets = self.options.maxSockets || http.Agent.defaultMaxSockets; + self.requests = []; + self.sockets = []; + + self.on('free', function onFree(socket, host, port, localAddress) { + var options = toOptions(host, port, localAddress); + for (var i = 0, len = self.requests.length; i < len; ++i) { + var pending = self.requests[i]; + if (pending.host === options.host && pending.port === options.port) { + // Detect the request to connect same origin server, + // reuse the connection. + self.requests.splice(i, 1); + pending.request.onSocket(socket); + return; + } + } + socket.destroy(); + self.removeSocket(socket); + }); +} +util.inherits(TunnelingAgent, events.EventEmitter); + +TunnelingAgent.prototype.addRequest = function addRequest(req, host, port, localAddress) { + var self = this; + var options = mergeOptions({request: req}, self.options, toOptions(host, port, localAddress)); + + if (self.sockets.length >= this.maxSockets) { + // We are over limit so we'll add it to the queue. + self.requests.push(options); + return; + } + + // If we are under maxSockets create a new one. + self.createSocket(options, function(socket) { + socket.on('free', onFree); + socket.on('close', onCloseOrRemove); + socket.on('agentRemove', onCloseOrRemove); + req.onSocket(socket); + + function onFree() { + self.emit('free', socket, options); + } + + function onCloseOrRemove(err) { + self.removeSocket(socket); + socket.removeListener('free', onFree); + socket.removeListener('close', onCloseOrRemove); + socket.removeListener('agentRemove', onCloseOrRemove); + } + }); +}; + +TunnelingAgent.prototype.createSocket = function createSocket(options, cb) { + var self = this; + var placeholder = {}; + self.sockets.push(placeholder); + + var connectOptions = mergeOptions({}, self.proxyOptions, { + method: 'CONNECT', + path: options.host + ':' + options.port, + agent: false, + headers: { + host: options.host + ':' + options.port + } + }); + if (options.localAddress) { + connectOptions.localAddress = options.localAddress; + } + if (connectOptions.proxyAuth) { + connectOptions.headers = connectOptions.headers || {}; + connectOptions.headers['Proxy-Authorization'] = 'Basic ' + + new Buffer(connectOptions.proxyAuth).toString('base64'); + } + + debug('making CONNECT request'); + var connectReq = self.request(connectOptions); + connectReq.useChunkedEncodingByDefault = false; // for v0.6 + connectReq.once('response', onResponse); // for v0.6 + connectReq.once('upgrade', onUpgrade); // for v0.6 + connectReq.once('connect', onConnect); // for v0.7 or later + connectReq.once('error', onError); + connectReq.end(); + + function onResponse(res) { + // Very hacky. This is necessary to avoid http-parser leaks. + res.upgrade = true; + } + + function onUpgrade(res, socket, head) { + // Hacky. + process.nextTick(function() { + onConnect(res, socket, head); + }); + } + + function onConnect(res, socket, head) { + connectReq.removeAllListeners(); + socket.removeAllListeners(); + + if (res.statusCode !== 200) { + debug('tunneling socket could not be established, statusCode=%d', + res.statusCode); + socket.destroy(); + var error = new Error('tunneling socket could not be established, ' + + 'statusCode=' + res.statusCode); + error.code = 'ECONNRESET'; + options.request.emit('error', error); + self.removeSocket(placeholder); + return; + } + if (head.length > 0) { + debug('got illegal response body from proxy'); + socket.destroy(); + var error = new Error('got illegal response body from proxy'); + error.code = 'ECONNRESET'; + options.request.emit('error', error); + self.removeSocket(placeholder); + return; + } + debug('tunneling connection has established'); + self.sockets[self.sockets.indexOf(placeholder)] = socket; + return cb(socket); + } + + function onError(cause) { + connectReq.removeAllListeners(); + + debug('tunneling socket could not be established, cause=%s\n', + cause.message, cause.stack); + var error = new Error('tunneling socket could not be established, ' + + 'cause=' + cause.message); + error.code = 'ECONNRESET'; + options.request.emit('error', error); + self.removeSocket(placeholder); + } +}; + +TunnelingAgent.prototype.removeSocket = function removeSocket(socket) { + var pos = this.sockets.indexOf(socket) + if (pos === -1) { + return; + } + this.sockets.splice(pos, 1); + + var pending = this.requests.shift(); + if (pending) { + // If we have pending requests and a socket gets closed a new one + // needs to be created to take over in the pool for the one that closed. + this.createSocket(pending, function(socket) { + pending.request.onSocket(socket); + }); + } +}; + +function createSecureSocket(options, cb) { + var self = this; + TunnelingAgent.prototype.createSocket.call(self, options, function(socket) { + var hostHeader = options.request.getHeader('host'); + var tlsOptions = mergeOptions({}, self.options, { + socket: socket, + servername: hostHeader ? hostHeader.replace(/:.*$/, '') : options.host + }); + + // 0 is dummy port for v0.6 + var secureSocket = tls.connect(0, tlsOptions); + self.sockets[self.sockets.indexOf(socket)] = secureSocket; + cb(secureSocket); + }); +} + + +function toOptions(host, port, localAddress) { + if (typeof host === 'string') { // since v0.10 + return { + host: host, + port: port, + localAddress: localAddress + }; + } + return host; // for v0.11 or later +} + +function mergeOptions(target) { + for (var i = 1, len = arguments.length; i < len; ++i) { + var overrides = arguments[i]; + if (typeof overrides === 'object') { + var keys = Object.keys(overrides); + for (var j = 0, keyLen = keys.length; j < keyLen; ++j) { + var k = keys[j]; + if (overrides[k] !== undefined) { + target[k] = overrides[k]; + } + } + } + } + return target; +} + + +var debug; +if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) { + debug = function() { + var args = Array.prototype.slice.call(arguments); + if (typeof args[0] === 'string') { + args[0] = 'TUNNEL: ' + args[0]; + } else { + args.unshift('TUNNEL:'); + } + console.error.apply(console, args); + } +} else { + debug = function() {}; +} +exports.debug = debug; // for test + + +/***/ }), + +/***/ 840: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +Object.defineProperty(exports, "v1", ({ + enumerable: true, + get: function () { + return _v.default; + } +})); +Object.defineProperty(exports, "v3", ({ + enumerable: true, + get: function () { + return _v2.default; + } +})); +Object.defineProperty(exports, "v4", ({ + enumerable: true, + get: function () { + return _v3.default; + } +})); +Object.defineProperty(exports, "v5", ({ + enumerable: true, + get: function () { + return _v4.default; + } +})); +Object.defineProperty(exports, "NIL", ({ + enumerable: true, + get: function () { + return _nil.default; + } +})); +Object.defineProperty(exports, "version", ({ + enumerable: true, + get: function () { + return _version.default; + } +})); +Object.defineProperty(exports, "validate", ({ + enumerable: true, + get: function () { + return _validate.default; + } +})); +Object.defineProperty(exports, "stringify", ({ + enumerable: true, + get: function () { + return _stringify.default; + } +})); +Object.defineProperty(exports, "parse", ({ + enumerable: true, + get: function () { + return _parse.default; + } +})); + +var _v = _interopRequireDefault(__nccwpck_require__(628)); + +var _v2 = _interopRequireDefault(__nccwpck_require__(409)); + +var _v3 = _interopRequireDefault(__nccwpck_require__(122)); + +var _v4 = _interopRequireDefault(__nccwpck_require__(120)); + +var _nil = _interopRequireDefault(__nccwpck_require__(332)); + +var _version = _interopRequireDefault(__nccwpck_require__(595)); + +var _validate = _interopRequireDefault(__nccwpck_require__(900)); + +var _stringify = _interopRequireDefault(__nccwpck_require__(950)); + +var _parse = _interopRequireDefault(__nccwpck_require__(746)); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/***/ }), + +/***/ 569: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; + +var _crypto = _interopRequireDefault(__nccwpck_require__(113)); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function md5(bytes) { + if (Array.isArray(bytes)) { + bytes = Buffer.from(bytes); + } else if (typeof bytes === 'string') { + bytes = Buffer.from(bytes, 'utf8'); + } + + return _crypto.default.createHash('md5').update(bytes).digest(); +} + +var _default = md5; +exports["default"] = _default; + +/***/ }), + +/***/ 332: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; +var _default = '00000000-0000-0000-0000-000000000000'; +exports["default"] = _default; + +/***/ }), + +/***/ 746: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; + +var _validate = _interopRequireDefault(__nccwpck_require__(900)); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function parse(uuid) { + if (!(0, _validate.default)(uuid)) { + throw TypeError('Invalid UUID'); + } + + let v; + const arr = new Uint8Array(16); // Parse ########-....-....-....-............ + + arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24; + arr[1] = v >>> 16 & 0xff; + arr[2] = v >>> 8 & 0xff; + arr[3] = v & 0xff; // Parse ........-####-....-....-............ + + arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8; + arr[5] = v & 0xff; // Parse ........-....-####-....-............ + + arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8; + arr[7] = v & 0xff; // Parse ........-....-....-####-............ + + arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8; + arr[9] = v & 0xff; // Parse ........-....-....-....-############ + // (Use "/" to avoid 32-bit truncation when bit-shifting high-order bytes) + + arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff; + arr[11] = v / 0x100000000 & 0xff; + arr[12] = v >>> 24 & 0xff; + arr[13] = v >>> 16 & 0xff; + arr[14] = v >>> 8 & 0xff; + arr[15] = v & 0xff; + return arr; +} + +var _default = parse; +exports["default"] = _default; + +/***/ }), + +/***/ 814: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; +var _default = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i; +exports["default"] = _default; + +/***/ }), + +/***/ 807: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = rng; + +var _crypto = _interopRequireDefault(__nccwpck_require__(113)); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const rnds8Pool = new Uint8Array(256); // # of random values to pre-allocate + +let poolPtr = rnds8Pool.length; + +function rng() { + if (poolPtr > rnds8Pool.length - 16) { + _crypto.default.randomFillSync(rnds8Pool); + + poolPtr = 0; + } + + return rnds8Pool.slice(poolPtr, poolPtr += 16); +} + +/***/ }), + +/***/ 274: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; + +var _crypto = _interopRequireDefault(__nccwpck_require__(113)); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function sha1(bytes) { + if (Array.isArray(bytes)) { + bytes = Buffer.from(bytes); + } else if (typeof bytes === 'string') { + bytes = Buffer.from(bytes, 'utf8'); + } + + return _crypto.default.createHash('sha1').update(bytes).digest(); +} + +var _default = sha1; +exports["default"] = _default; + +/***/ }), + +/***/ 950: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; + +var _validate = _interopRequireDefault(__nccwpck_require__(900)); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +/** + * Convert array of 16 byte values to UUID string format of the form: + * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX + */ +const byteToHex = []; + +for (let i = 0; i < 256; ++i) { + byteToHex.push((i + 0x100).toString(16).substr(1)); +} + +function stringify(arr, offset = 0) { + // Note: Be careful editing this code! It's been tuned for performance + // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434 + const uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID. If this throws, it's likely due to one + // of the following: + // - One or more input array values don't map to a hex octet (leading to + // "undefined" in the uuid) + // - Invalid input values for the RFC `version` or `variant` fields + + if (!(0, _validate.default)(uuid)) { + throw TypeError('Stringified UUID is invalid'); + } + + return uuid; +} + +var _default = stringify; +exports["default"] = _default; + +/***/ }), + +/***/ 628: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; + +var _rng = _interopRequireDefault(__nccwpck_require__(807)); + +var _stringify = _interopRequireDefault(__nccwpck_require__(950)); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +// **`v1()` - Generate time-based UUID** +// +// Inspired by https://github.com/LiosK/UUID.js +// and http://docs.python.org/library/uuid.html +let _nodeId; + +let _clockseq; // Previous uuid creation time + + +let _lastMSecs = 0; +let _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details + +function v1(options, buf, offset) { + let i = buf && offset || 0; + const b = buf || new Array(16); + options = options || {}; + let node = options.node || _nodeId; + let clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not + // specified. We do this lazily to minimize issues related to insufficient + // system entropy. See #189 + + if (node == null || clockseq == null) { + const seedBytes = options.random || (options.rng || _rng.default)(); + + if (node == null) { + // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1) + node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]]; + } + + if (clockseq == null) { + // Per 4.2.2, randomize (14 bit) clockseq + clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff; + } + } // UUID timestamps are 100 nano-second units since the Gregorian epoch, + // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so + // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs' + // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00. + + + let msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock + // cycle to simulate higher resolution clock + + let nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs) + + const dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression + + if (dt < 0 && options.clockseq === undefined) { + clockseq = clockseq + 1 & 0x3fff; + } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new + // time interval + + + if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) { + nsecs = 0; + } // Per 4.2.1.2 Throw error if too many uuids are requested + + + if (nsecs >= 10000) { + throw new Error("uuid.v1(): Can't create more than 10M uuids/sec"); + } + + _lastMSecs = msecs; + _lastNSecs = nsecs; + _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch + + msecs += 12219292800000; // `time_low` + + const tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000; + b[i++] = tl >>> 24 & 0xff; + b[i++] = tl >>> 16 & 0xff; + b[i++] = tl >>> 8 & 0xff; + b[i++] = tl & 0xff; // `time_mid` + + const tmh = msecs / 0x100000000 * 10000 & 0xfffffff; + b[i++] = tmh >>> 8 & 0xff; + b[i++] = tmh & 0xff; // `time_high_and_version` + + b[i++] = tmh >>> 24 & 0xf | 0x10; // include version + + b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant) + + b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low` + + b[i++] = clockseq & 0xff; // `node` + + for (let n = 0; n < 6; ++n) { + b[i + n] = node[n]; + } + + return buf || (0, _stringify.default)(b); +} + +var _default = v1; +exports["default"] = _default; + +/***/ }), + +/***/ 409: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; + +var _v = _interopRequireDefault(__nccwpck_require__(998)); + +var _md = _interopRequireDefault(__nccwpck_require__(569)); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const v3 = (0, _v.default)('v3', 0x30, _md.default); +var _default = v3; +exports["default"] = _default; + +/***/ }), + +/***/ 998: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = _default; +exports.URL = exports.DNS = void 0; + +var _stringify = _interopRequireDefault(__nccwpck_require__(950)); + +var _parse = _interopRequireDefault(__nccwpck_require__(746)); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function stringToBytes(str) { + str = unescape(encodeURIComponent(str)); // UTF8 escape + + const bytes = []; + + for (let i = 0; i < str.length; ++i) { + bytes.push(str.charCodeAt(i)); + } + + return bytes; +} + +const DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8'; +exports.DNS = DNS; +const URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8'; +exports.URL = URL; + +function _default(name, version, hashfunc) { + function generateUUID(value, namespace, buf, offset) { + if (typeof value === 'string') { + value = stringToBytes(value); + } + + if (typeof namespace === 'string') { + namespace = (0, _parse.default)(namespace); + } + + if (namespace.length !== 16) { + throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)'); + } // Compute hash of namespace and value, Per 4.3 + // Future: Use spread syntax when supported on all platforms, e.g. `bytes = + // hashfunc([...namespace, ... value])` + + + let bytes = new Uint8Array(16 + value.length); + bytes.set(namespace); + bytes.set(value, namespace.length); + bytes = hashfunc(bytes); + bytes[6] = bytes[6] & 0x0f | version; + bytes[8] = bytes[8] & 0x3f | 0x80; + + if (buf) { + offset = offset || 0; + + for (let i = 0; i < 16; ++i) { + buf[offset + i] = bytes[i]; + } + + return buf; + } + + return (0, _stringify.default)(bytes); + } // Function#name is not settable on some platforms (#270) + + + try { + generateUUID.name = name; // eslint-disable-next-line no-empty + } catch (err) {} // For CommonJS default export support + + + generateUUID.DNS = DNS; + generateUUID.URL = URL; + return generateUUID; +} + +/***/ }), + +/***/ 122: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; + +var _rng = _interopRequireDefault(__nccwpck_require__(807)); + +var _stringify = _interopRequireDefault(__nccwpck_require__(950)); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function v4(options, buf, offset) { + options = options || {}; + + const rnds = options.random || (options.rng || _rng.default)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved` + + + rnds[6] = rnds[6] & 0x0f | 0x40; + rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided + + if (buf) { + offset = offset || 0; + + for (let i = 0; i < 16; ++i) { + buf[offset + i] = rnds[i]; + } + + return buf; + } + + return (0, _stringify.default)(rnds); +} + +var _default = v4; +exports["default"] = _default; + +/***/ }), + +/***/ 120: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; + +var _v = _interopRequireDefault(__nccwpck_require__(998)); + +var _sha = _interopRequireDefault(__nccwpck_require__(274)); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const v5 = (0, _v.default)('v5', 0x50, _sha.default); +var _default = v5; +exports["default"] = _default; + +/***/ }), + +/***/ 900: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; + +var _regex = _interopRequireDefault(__nccwpck_require__(814)); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function validate(uuid) { + return typeof uuid === 'string' && _regex.default.test(uuid); +} + +var _default = validate; +exports["default"] = _default; + +/***/ }), + +/***/ 595: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; + +var _validate = _interopRequireDefault(__nccwpck_require__(900)); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function version(uuid) { + if (!(0, _validate.default)(uuid)) { + throw TypeError('Invalid UUID'); + } + + return parseInt(uuid.substr(14, 1), 16); +} + +var _default = version; +exports["default"] = _default; + +/***/ }), + +/***/ 319: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +const core = __nccwpck_require__(186); + +const getRequired = (name) => core.getInput(name, { required: true }); + +const getOptional = (name) => core.getInput(name, { required: false }); + +const getEnv = () => process.env; + +const setOutput = (name, value) => core.setOutput(name, value); + +const setFailed = (msg) => core.setFailed(msg); + +const debug = (msg) => core.debug(msg); + +const debugExtra = (name, json) => { + core.debug("CUSTOM DEBUG " + name); + + const message = JSON.stringify(json, undefined, 2); + core.debug(message); +}; + +const info = (msg) => core.info(msg); + +const warning = (msg) => core.warning(msg); + +module.exports = { + getRequired, + getOptional, + getEnv, + setOutput, + setFailed, + debug, + debugExtra, + info, + warning, +}; + + +/***/ }), + +/***/ 451: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +const https = __nccwpck_require__(687); + +const getOptions = (token, path) => { + return { + hostname: "slack.com", + port: 443, + path: path, + method: "POST", + headers: { + "Content-Type": "application/json; charset=utf-8", + Authorization: `Bearer ${token}`, + }, + }; +}; + +const post = (token, path, message) => { + return new Promise((resolve, reject) => { + const payload = JSON.stringify(message); + + const options = getOptions(token, path); + + const req = https.request(options, (res) => { + const chunks = []; + + res.on("data", (chunk) => { + chunks.push(chunk); + }); + + res.on("end", () => { + const result = Buffer.concat(chunks).toString(); + const response = JSON.parse(result); + + let isOk = res.statusCode >= 200 && res.statusCode <= 299; + + // This solves the issue that block updates returns 200 + // but contains ok = false in the response + if ( + response && + response.hasOwnProperty("ok") && + response.ok === false + ) { + isOk = false; + } + + resolve({ + statusCode: res.statusCode, + statusMessage: res.statusMessage, + ok: isOk, + result: result, + response: response, + }); + }); + }); + + req.on("error", (error) => { + reject(error); + }); + + req.write(payload); + req.end(); + }); +}; + +module.exports = { post }; + + +/***/ }), + +/***/ 202: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +const { post } = __nccwpck_require__(451); + +const hasErrors = (res) => !res || !res.ok; + +const buildErrorMessage = (res) => { + return `Error! ${JSON.stringify(res)} (response)`; +}; + +const apiPostMessage = async (token, message) => { + const path = "/api/chat.postMessage"; + const res = await post(token, path, message); + + if (hasErrors(res)) { + throw buildErrorMessage(res); + } + + return res; +}; + +const apiAddReaction = async (token, message) => { + const path = "/api/reactions.add"; + const res = await post(token, path, message); + + if (hasErrors(res)) { + throw buildErrorMessage(res); + } + + return res; +}; + +const apiUpdateMessage = async (token, message) => { + const path = "/api/chat.update"; + const res = await post(token, path, message); + + if (hasErrors(res)) { + throw buildErrorMessage(res); + } + + return res; +}; + +module.exports = { apiPostMessage, apiAddReaction, apiUpdateMessage }; + + +/***/ }), + +/***/ 662: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +const context = __nccwpck_require__(319); +const { postMessage } = __nccwpck_require__(563); +const { addReaction } = __nccwpck_require__(380); +const { updateMessage } = __nccwpck_require__(308); + +const jsonPretty = (data) => JSON.stringify(data, undefined, 2); + +const invoke = async () => { + try { + const func = context.getOptional("slack-function") || "send-message"; + + switch (func) { + case "send-message": + await postMessage(); + break; + case "send-reaction": + await addReaction(); + break; + case "update-message": + await updateMessage(); + break; + default: + context.setFailed("Unhandled `slack-function`: " + func); + break; + } + } catch (error) { + context.setFailed("invoke failed:" + error + ":" + jsonPretty(error)); + } +}; + +module.exports = invoke; + + +/***/ }), + +/***/ 690: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +const { + restoreEscapedNewLine, + restoreEscapedTab, +} = __nccwpck_require__(307); + +const buildMessage = (channel = "", text = "", blocks = "", optional = {}) => { + if (!channel) { + throw new Error("Channel must be set"); + } + + if (text && blocks) { + throw new Error("Text OR Block must be set"); + } + + const message = { + channel, + text, + blocks, + }; + + if (message.text) { + message.text = restoreEscapedNewLine(message.text); + message.text = restoreEscapedTab(message.text); + } + + Object.keys(optional).forEach((name) => { + message[name] = optional[name]; + }); + + return message; +}; + +module.exports = buildMessage; + + +/***/ }), + +/***/ 563: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +const context = __nccwpck_require__(319); +const { apiPostMessage } = __nccwpck_require__(202); +const buildMessage = __nccwpck_require__(690); +const core = __nccwpck_require__(186); + +const jsonPretty = (data) => JSON.stringify(data, undefined, 2); + +const postMessage = async () => { + try { + const token = context.getRequired("slack-bot-user-oauth-access-token"); + const channels = context.getRequired("slack-channel"); + const text = context.getOptional("slack-text"); + const blocks = context.getOptional("slack-blocks"); + + const results = []; + for (let channel of channels.split(",")) { + channel = channel.trim(); + + const payload = buildMessage(channel, text, blocks, optional()); + + context.debug("Post Message PAYLOAD", payload); + const result = await apiPostMessage(token, payload); + context.debug("Post Message RESULT", result); + + results.push(result); + } + + // To not break backward compatibility + const resultAsJson = jsonPretty(results[0]); + context.setOutput("slack-result", resultAsJson); + + const resultsAsJson = jsonPretty(results); + context.setOutput("slack-results", resultsAsJson); + } catch (error) { + context.setFailed(jsonPretty(error)); + } +}; + +const optional = () => { + let opt = {}; + + const env = context.getEnv(); + Object.keys(env) + .filter((key) => !!env[key]) + .filter((key) => key.toUpperCase().startsWith("INPUT_SLACK-OPTIONAL-")) + .forEach((key) => { + const slackKey = key.replace("INPUT_SLACK-OPTIONAL-", "").toLowerCase(); + opt[slackKey] = env[key]; + }); + + return opt; +}; + +module.exports = { postMessage }; + + +/***/ }), + +/***/ 179: +/***/ ((module) => { + +const buildReaction = ( + channelId = "", + emojiName = "", + messageTimestamp = "" +) => { + const message = { + channel: channelId, + name: emojiName, + timestamp: messageTimestamp, + }; + + return message; +}; + +module.exports = buildReaction; + + +/***/ }), + +/***/ 380: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +const context = __nccwpck_require__(319); +const { apiAddReaction } = __nccwpck_require__(202); +const buildMessage = __nccwpck_require__(179); + +const jsonPretty = (data) => JSON.stringify(data, undefined, 2); + +const addReaction = async () => { + try { + const token = context.getRequired("slack-bot-user-oauth-access-token"); + const channelId = context.getRequired("slack-channel"); + const emojiName = context.getRequired("slack-emoji-name"); + const messageTimestamp = context.getRequired("slack-message-timestamp"); + + const payload = buildMessage(channelId, emojiName, messageTimestamp); + + context.debugExtra("Add Reaction PAYLOAD", payload); + const result = await apiAddReaction(token, payload); + context.debugExtra("Add Reaction PAYLOAD", result); + + const resultAsJson = jsonPretty(result); + context.setOutput("slack-result", resultAsJson); + } catch (error) { + context.setFailed(jsonPretty(error)); + } +}; + +module.exports = { addReaction }; + + +/***/ }), + +/***/ 51: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +const { + restoreEscapedNewLine, + restoreEscapedTab, +} = __nccwpck_require__(307); + +const buildMessage = ( + channel = "", + text = "", + blocks = "", + ts = "", + optional = {} +) => { + if (!channel || !ts) { + throw new Error("Channel and/or TS must be set"); + } + + if (text && blocks) { + throw new Error("Text OR Block must be set"); + } + + const message = { + channel, + text, + ts, + blocks, + }; + + if (message.text) { + message.text = restoreEscapedNewLine(message.text); + message.text = restoreEscapedTab(message.text); + } + + Object.keys(optional).forEach((name) => { + message[name] = optional[name]; + }); + + return message; +}; + +module.exports = buildMessage; + + +/***/ }), + +/***/ 308: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +const context = __nccwpck_require__(319); +const { apiUpdateMessage } = __nccwpck_require__(202); +const buildUpdateMessage = __nccwpck_require__(51); + +const jsonPretty = (data) => JSON.stringify(data, undefined, 2); + +const updateMessage = async () => { + try { + const token = context.getRequired("slack-bot-user-oauth-access-token"); + const channelId = context.getRequired("slack-channel"); + const ts = context.getRequired("slack-update-message-ts"); + const text = context.getOptional("slack-update-message-text"); + const blocks = context.getOptional("slack-update-message-blocks"); + + const payload = buildUpdateMessage(channelId, text, blocks, ts, optional()); + + context.debugExtra("Update Message PAYLOAD", payload); + const result = await apiUpdateMessage(token, payload); + context.debug("Update Message RESULT", result); + + const resultAsJson = jsonPretty(result); + context.setOutput("slack-result", resultAsJson); + } catch (error) { + context.debug(error); + context.setFailed(jsonPretty(error)); + } +}; + +const optional = () => { + let opt = {}; + + const env = context.getEnv(); + Object.keys(env) + .filter((key) => !!env[key]) + .filter((key) => key.toUpperCase().startsWith("INPUT_SLACK-OPTIONAL-")) + .forEach((key) => { + const slackKey = key.replace("INPUT_SLACK-OPTIONAL-", "").toLowerCase(); + opt[slackKey] = env[key]; + }); + + return opt; +}; + +module.exports = { updateMessage }; + + +/***/ }), + +/***/ 307: +/***/ ((module) => { + +const restoreEscapedNewLine = (text) => + text.replace(/\\r\\n/g, "\n").replace(/\\n/g, "\n"); + +const restoreEscapedTab = (text) => text.replace(/\\t/g, "\t"); + +module.exports = { restoreEscapedNewLine, restoreEscapedTab }; + + +/***/ }), + +/***/ 491: +/***/ ((module) => { + +"use strict"; +module.exports = require("assert"); + +/***/ }), + +/***/ 113: +/***/ ((module) => { + +"use strict"; +module.exports = require("crypto"); + +/***/ }), + +/***/ 361: +/***/ ((module) => { + +"use strict"; +module.exports = require("events"); + +/***/ }), + +/***/ 147: +/***/ ((module) => { + +"use strict"; +module.exports = require("fs"); + +/***/ }), + +/***/ 685: +/***/ ((module) => { + +"use strict"; +module.exports = require("http"); + +/***/ }), + +/***/ 687: +/***/ ((module) => { + +"use strict"; +module.exports = require("https"); + +/***/ }), + +/***/ 808: +/***/ ((module) => { + +"use strict"; +module.exports = require("net"); + +/***/ }), + +/***/ 37: +/***/ ((module) => { + +"use strict"; +module.exports = require("os"); + +/***/ }), + +/***/ 17: +/***/ ((module) => { + +"use strict"; +module.exports = require("path"); + +/***/ }), + +/***/ 404: +/***/ ((module) => { + +"use strict"; +module.exports = require("tls"); + +/***/ }), + +/***/ 837: +/***/ ((module) => { + +"use strict"; +module.exports = require("util"); + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __nccwpck_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ var threw = true; +/******/ try { +/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __nccwpck_require__); +/******/ threw = false; +/******/ } finally { +/******/ if(threw) delete __webpack_module_cache__[moduleId]; +/******/ } +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/compat */ +/******/ +/******/ if (typeof __nccwpck_require__ !== 'undefined') __nccwpck_require__.ab = __dirname + "/"; +/******/ +/************************************************************************/ +var __webpack_exports__ = {}; +// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. +(() => { +const invoke = __nccwpck_require__(662); + +const run = async () => { + await invoke(); +}; + +run(); + +})(); + +module.exports = __webpack_exports__; +/******/ })() +; \ No newline at end of file diff --git a/integration-test/end-to-end.js b/integration-test/end-to-end.js index 592259a..b419ece 100644 --- a/integration-test/end-to-end.js +++ b/integration-test/end-to-end.js @@ -10,7 +10,7 @@ const buildReaction = require("../src/reaction/build-reaction"); const buildUpdateMessage = require("../src/update-message/build-update-message"); const testSendMessage = async (channel, token, text, optional = {}) => { - const message = buildMessage(channel, text, { + const message = buildMessage(channel, text, null, { as_user: false, icon_emoji: ":fire:", ...optional, @@ -22,7 +22,7 @@ const testSendMessage = async (channel, token, text, optional = {}) => { }; const testSendReaction = async (channel, token) => { - const message = buildMessage(channel, "Test 2 - testSendReaction 🤓", { + const message = buildMessage(channel, "Test 2 - testSendReaction 🤓", null, { as_user: false, icon_emoji: ":fire:", }); @@ -67,6 +67,7 @@ const testUpdateMessage = async (channel, token) => { const message = buildUpdateMessage( process.env.CHANNEL, "Test 4 - testUpdateMessage - Updated!", + null, messageToUpdate.response.message.ts ); @@ -90,7 +91,7 @@ const testUpdateMessage = async (channel, token) => { "Test 1 - testSendMessage" ); - /*await testSendReaction( + await testSendReaction( process.env.CHANNEL, process.env.BOT_USER_OAUTH_ACCESS_TOKEN ); @@ -103,5 +104,5 @@ const testUpdateMessage = async (channel, token) => { await testUpdateMessage( process.env.CHANNEL, process.env.BOT_USER_OAUTH_ACCESS_TOKEN - );*/ + ); })(); diff --git a/src/message/build-message.js b/src/message/build-message.js index 192231b..ac2482a 100644 --- a/src/message/build-message.js +++ b/src/message/build-message.js @@ -3,12 +3,7 @@ const { restoreEscapedTab, } = require("../util/escaper.js"); -const buildMessage = ( - channel = "", - text = "", - blocks = null, - optional = {} -) => { +const buildMessage = (channel = "", text = "", blocks = "", optional = {}) => { if (!channel) { throw new Error("Channel must be set"); } diff --git a/src/update-message/build-update-message.js b/src/update-message/build-update-message.js index cfff04d..9a2ca46 100644 --- a/src/update-message/build-update-message.js +++ b/src/update-message/build-update-message.js @@ -6,7 +6,7 @@ const { const buildMessage = ( channel = "", text = "", - blocks = null, + blocks = "", ts = "", optional = {} ) => { From 779b57c5ac717ceb7c7d4eba57377d6f43061014 Mon Sep 17 00:00:00 2001 From: Anders Date: Sat, 15 Oct 2022 00:39:49 +0200 Subject: [PATCH 29/30] extracted optional --- dist/index.js | 295 ++++++++++++++++++------------------ src/message/index.js | 16 +- src/update-message/index.js | 16 +- src/util/optional.js | 18 +++ 4 files changed, 166 insertions(+), 179 deletions(-) create mode 100644 src/util/optional.js diff --git a/dist/index.js b/dist/index.js index e6ed49b..2fe877a 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1,7 +1,7 @@ /******/ (() => { // webpackBootstrap /******/ var __webpack_modules__ = ({ -/***/ 351: +/***/ 7351: /***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { "use strict"; @@ -27,8 +27,8 @@ var __importStar = (this && this.__importStar) || function (mod) { }; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.issue = exports.issueCommand = void 0; -const os = __importStar(__nccwpck_require__(37)); -const utils_1 = __nccwpck_require__(278); +const os = __importStar(__nccwpck_require__(2037)); +const utils_1 = __nccwpck_require__(5278); /** * Commands * @@ -100,7 +100,7 @@ function escapeProperty(s) { /***/ }), -/***/ 186: +/***/ 2186: /***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { "use strict"; @@ -135,12 +135,12 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge }; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.getIDToken = exports.getState = exports.saveState = exports.group = exports.endGroup = exports.startGroup = exports.info = exports.notice = exports.warning = exports.error = exports.debug = exports.isDebug = exports.setFailed = exports.setCommandEcho = exports.setOutput = exports.getBooleanInput = exports.getMultilineInput = exports.getInput = exports.addPath = exports.setSecret = exports.exportVariable = exports.ExitCode = void 0; -const command_1 = __nccwpck_require__(351); +const command_1 = __nccwpck_require__(7351); const file_command_1 = __nccwpck_require__(717); -const utils_1 = __nccwpck_require__(278); -const os = __importStar(__nccwpck_require__(37)); -const path = __importStar(__nccwpck_require__(17)); -const oidc_utils_1 = __nccwpck_require__(41); +const utils_1 = __nccwpck_require__(5278); +const os = __importStar(__nccwpck_require__(2037)); +const path = __importStar(__nccwpck_require__(1017)); +const oidc_utils_1 = __nccwpck_require__(8041); /** * The code to exit an action */ @@ -425,17 +425,17 @@ exports.getIDToken = getIDToken; /** * Summary exports */ -var summary_1 = __nccwpck_require__(327); +var summary_1 = __nccwpck_require__(1327); Object.defineProperty(exports, "summary", ({ enumerable: true, get: function () { return summary_1.summary; } })); /** * @deprecated use core.summary */ -var summary_2 = __nccwpck_require__(327); +var summary_2 = __nccwpck_require__(1327); Object.defineProperty(exports, "markdownSummary", ({ enumerable: true, get: function () { return summary_2.markdownSummary; } })); /** * Path exports */ -var path_utils_1 = __nccwpck_require__(981); +var path_utils_1 = __nccwpck_require__(2981); Object.defineProperty(exports, "toPosixPath", ({ enumerable: true, get: function () { return path_utils_1.toPosixPath; } })); Object.defineProperty(exports, "toWin32Path", ({ enumerable: true, get: function () { return path_utils_1.toWin32Path; } })); Object.defineProperty(exports, "toPlatformPath", ({ enumerable: true, get: function () { return path_utils_1.toPlatformPath; } })); @@ -472,10 +472,10 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.prepareKeyValueMessage = exports.issueFileCommand = void 0; // We use any as a valid input type /* eslint-disable @typescript-eslint/no-explicit-any */ -const fs = __importStar(__nccwpck_require__(147)); -const os = __importStar(__nccwpck_require__(37)); -const uuid_1 = __nccwpck_require__(840); -const utils_1 = __nccwpck_require__(278); +const fs = __importStar(__nccwpck_require__(7147)); +const os = __importStar(__nccwpck_require__(2037)); +const uuid_1 = __nccwpck_require__(5840); +const utils_1 = __nccwpck_require__(5278); function issueFileCommand(command, message) { const filePath = process.env[`GITHUB_${command}`]; if (!filePath) { @@ -508,7 +508,7 @@ exports.prepareKeyValueMessage = prepareKeyValueMessage; /***/ }), -/***/ 41: +/***/ 8041: /***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { "use strict"; @@ -524,9 +524,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge }; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.OidcClient = void 0; -const http_client_1 = __nccwpck_require__(255); -const auth_1 = __nccwpck_require__(526); -const core_1 = __nccwpck_require__(186); +const http_client_1 = __nccwpck_require__(6255); +const auth_1 = __nccwpck_require__(5526); +const core_1 = __nccwpck_require__(2186); class OidcClient { static createHttpClient(allowRetry = true, maxRetry = 10) { const requestOptions = { @@ -592,7 +592,7 @@ exports.OidcClient = OidcClient; /***/ }), -/***/ 981: +/***/ 2981: /***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { "use strict"; @@ -618,7 +618,7 @@ var __importStar = (this && this.__importStar) || function (mod) { }; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.toPlatformPath = exports.toWin32Path = exports.toPosixPath = void 0; -const path = __importStar(__nccwpck_require__(17)); +const path = __importStar(__nccwpck_require__(1017)); /** * toPosixPath converts the given path to the posix form. On Windows, \\ will be * replaced with /. @@ -657,7 +657,7 @@ exports.toPlatformPath = toPlatformPath; /***/ }), -/***/ 327: +/***/ 1327: /***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { "use strict"; @@ -673,8 +673,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge }; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.summary = exports.markdownSummary = exports.SUMMARY_DOCS_URL = exports.SUMMARY_ENV_VAR = void 0; -const os_1 = __nccwpck_require__(37); -const fs_1 = __nccwpck_require__(147); +const os_1 = __nccwpck_require__(2037); +const fs_1 = __nccwpck_require__(7147); const { access, appendFile, writeFile } = fs_1.promises; exports.SUMMARY_ENV_VAR = 'GITHUB_STEP_SUMMARY'; exports.SUMMARY_DOCS_URL = 'https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#adding-a-job-summary'; @@ -947,7 +947,7 @@ exports.summary = _summary; /***/ }), -/***/ 278: +/***/ 5278: /***/ ((__unused_webpack_module, exports) => { "use strict"; @@ -994,7 +994,7 @@ exports.toCommandProperties = toCommandProperties; /***/ }), -/***/ 526: +/***/ 5526: /***/ (function(__unused_webpack_module, exports) { "use strict"; @@ -1082,7 +1082,7 @@ exports.PersonalAccessTokenCredentialHandler = PersonalAccessTokenCredentialHand /***/ }), -/***/ 255: +/***/ 6255: /***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { "use strict"; @@ -1118,10 +1118,10 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge }; Object.defineProperty(exports, "__esModule", ({ value: true })); exports.HttpClient = exports.isHttps = exports.HttpClientResponse = exports.HttpClientError = exports.getProxyUrl = exports.MediaTypes = exports.Headers = exports.HttpCodes = void 0; -const http = __importStar(__nccwpck_require__(685)); -const https = __importStar(__nccwpck_require__(687)); -const pm = __importStar(__nccwpck_require__(835)); -const tunnel = __importStar(__nccwpck_require__(294)); +const http = __importStar(__nccwpck_require__(3685)); +const https = __importStar(__nccwpck_require__(5687)); +const pm = __importStar(__nccwpck_require__(9835)); +const tunnel = __importStar(__nccwpck_require__(4294)); var HttpCodes; (function (HttpCodes) { HttpCodes[HttpCodes["OK"] = 200] = "OK"; @@ -1694,7 +1694,7 @@ const lowercaseKeys = (obj) => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCa /***/ }), -/***/ 835: +/***/ 9835: /***/ ((__unused_webpack_module, exports) => { "use strict"; @@ -1762,27 +1762,27 @@ exports.checkBypass = checkBypass; /***/ }), -/***/ 294: +/***/ 4294: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -module.exports = __nccwpck_require__(219); +module.exports = __nccwpck_require__(4219); /***/ }), -/***/ 219: +/***/ 4219: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; -var net = __nccwpck_require__(808); -var tls = __nccwpck_require__(404); -var http = __nccwpck_require__(685); -var https = __nccwpck_require__(687); -var events = __nccwpck_require__(361); -var assert = __nccwpck_require__(491); -var util = __nccwpck_require__(837); +var net = __nccwpck_require__(1808); +var tls = __nccwpck_require__(4404); +var http = __nccwpck_require__(3685); +var https = __nccwpck_require__(5687); +var events = __nccwpck_require__(2361); +var assert = __nccwpck_require__(9491); +var util = __nccwpck_require__(3837); exports.httpOverHttp = httpOverHttp; @@ -2042,7 +2042,7 @@ exports.debug = debug; // for test /***/ }), -/***/ 840: +/***/ 5840: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; @@ -2106,29 +2106,29 @@ Object.defineProperty(exports, "parse", ({ } })); -var _v = _interopRequireDefault(__nccwpck_require__(628)); +var _v = _interopRequireDefault(__nccwpck_require__(8628)); -var _v2 = _interopRequireDefault(__nccwpck_require__(409)); +var _v2 = _interopRequireDefault(__nccwpck_require__(6409)); -var _v3 = _interopRequireDefault(__nccwpck_require__(122)); +var _v3 = _interopRequireDefault(__nccwpck_require__(5122)); -var _v4 = _interopRequireDefault(__nccwpck_require__(120)); +var _v4 = _interopRequireDefault(__nccwpck_require__(9120)); -var _nil = _interopRequireDefault(__nccwpck_require__(332)); +var _nil = _interopRequireDefault(__nccwpck_require__(5332)); -var _version = _interopRequireDefault(__nccwpck_require__(595)); +var _version = _interopRequireDefault(__nccwpck_require__(1595)); -var _validate = _interopRequireDefault(__nccwpck_require__(900)); +var _validate = _interopRequireDefault(__nccwpck_require__(6900)); -var _stringify = _interopRequireDefault(__nccwpck_require__(950)); +var _stringify = _interopRequireDefault(__nccwpck_require__(8950)); -var _parse = _interopRequireDefault(__nccwpck_require__(746)); +var _parse = _interopRequireDefault(__nccwpck_require__(2746)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /***/ }), -/***/ 569: +/***/ 4569: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; @@ -2139,7 +2139,7 @@ Object.defineProperty(exports, "__esModule", ({ })); exports["default"] = void 0; -var _crypto = _interopRequireDefault(__nccwpck_require__(113)); +var _crypto = _interopRequireDefault(__nccwpck_require__(6113)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -2158,7 +2158,7 @@ exports["default"] = _default; /***/ }), -/***/ 332: +/***/ 5332: /***/ ((__unused_webpack_module, exports) => { "use strict"; @@ -2173,7 +2173,7 @@ exports["default"] = _default; /***/ }), -/***/ 746: +/***/ 2746: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; @@ -2184,7 +2184,7 @@ Object.defineProperty(exports, "__esModule", ({ })); exports["default"] = void 0; -var _validate = _interopRequireDefault(__nccwpck_require__(900)); +var _validate = _interopRequireDefault(__nccwpck_require__(6900)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -2251,7 +2251,7 @@ Object.defineProperty(exports, "__esModule", ({ })); exports["default"] = rng; -var _crypto = _interopRequireDefault(__nccwpck_require__(113)); +var _crypto = _interopRequireDefault(__nccwpck_require__(6113)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -2271,7 +2271,7 @@ function rng() { /***/ }), -/***/ 274: +/***/ 5274: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; @@ -2282,7 +2282,7 @@ Object.defineProperty(exports, "__esModule", ({ })); exports["default"] = void 0; -var _crypto = _interopRequireDefault(__nccwpck_require__(113)); +var _crypto = _interopRequireDefault(__nccwpck_require__(6113)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -2301,7 +2301,7 @@ exports["default"] = _default; /***/ }), -/***/ 950: +/***/ 8950: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; @@ -2312,7 +2312,7 @@ Object.defineProperty(exports, "__esModule", ({ })); exports["default"] = void 0; -var _validate = _interopRequireDefault(__nccwpck_require__(900)); +var _validate = _interopRequireDefault(__nccwpck_require__(6900)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -2347,7 +2347,7 @@ exports["default"] = _default; /***/ }), -/***/ 628: +/***/ 8628: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; @@ -2360,7 +2360,7 @@ exports["default"] = void 0; var _rng = _interopRequireDefault(__nccwpck_require__(807)); -var _stringify = _interopRequireDefault(__nccwpck_require__(950)); +var _stringify = _interopRequireDefault(__nccwpck_require__(8950)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -2461,7 +2461,7 @@ exports["default"] = _default; /***/ }), -/***/ 409: +/***/ 6409: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; @@ -2472,9 +2472,9 @@ Object.defineProperty(exports, "__esModule", ({ })); exports["default"] = void 0; -var _v = _interopRequireDefault(__nccwpck_require__(998)); +var _v = _interopRequireDefault(__nccwpck_require__(5998)); -var _md = _interopRequireDefault(__nccwpck_require__(569)); +var _md = _interopRequireDefault(__nccwpck_require__(4569)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -2484,7 +2484,7 @@ exports["default"] = _default; /***/ }), -/***/ 998: +/***/ 5998: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; @@ -2496,9 +2496,9 @@ Object.defineProperty(exports, "__esModule", ({ exports["default"] = _default; exports.URL = exports.DNS = void 0; -var _stringify = _interopRequireDefault(__nccwpck_require__(950)); +var _stringify = _interopRequireDefault(__nccwpck_require__(8950)); -var _parse = _interopRequireDefault(__nccwpck_require__(746)); +var _parse = _interopRequireDefault(__nccwpck_require__(2746)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -2569,7 +2569,7 @@ function _default(name, version, hashfunc) { /***/ }), -/***/ 122: +/***/ 5122: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; @@ -2582,7 +2582,7 @@ exports["default"] = void 0; var _rng = _interopRequireDefault(__nccwpck_require__(807)); -var _stringify = _interopRequireDefault(__nccwpck_require__(950)); +var _stringify = _interopRequireDefault(__nccwpck_require__(8950)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -2613,7 +2613,7 @@ exports["default"] = _default; /***/ }), -/***/ 120: +/***/ 9120: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; @@ -2624,9 +2624,9 @@ Object.defineProperty(exports, "__esModule", ({ })); exports["default"] = void 0; -var _v = _interopRequireDefault(__nccwpck_require__(998)); +var _v = _interopRequireDefault(__nccwpck_require__(5998)); -var _sha = _interopRequireDefault(__nccwpck_require__(274)); +var _sha = _interopRequireDefault(__nccwpck_require__(5274)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -2636,7 +2636,7 @@ exports["default"] = _default; /***/ }), -/***/ 900: +/***/ 6900: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; @@ -2660,7 +2660,7 @@ exports["default"] = _default; /***/ }), -/***/ 595: +/***/ 1595: /***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { "use strict"; @@ -2671,7 +2671,7 @@ Object.defineProperty(exports, "__esModule", ({ })); exports["default"] = void 0; -var _validate = _interopRequireDefault(__nccwpck_require__(900)); +var _validate = _interopRequireDefault(__nccwpck_require__(6900)); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -2688,10 +2688,10 @@ exports["default"] = _default; /***/ }), -/***/ 319: +/***/ 1319: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -const core = __nccwpck_require__(186); +const core = __nccwpck_require__(2186); const getRequired = (name) => core.getInput(name, { required: true }); @@ -2731,10 +2731,10 @@ module.exports = { /***/ }), -/***/ 451: +/***/ 8451: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -const https = __nccwpck_require__(687); +const https = __nccwpck_require__(5687); const getOptions = (token, path) => { return { @@ -2802,10 +2802,10 @@ module.exports = { post }; /***/ }), -/***/ 202: +/***/ 7202: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -const { post } = __nccwpck_require__(451); +const { post } = __nccwpck_require__(8451); const hasErrors = (res) => !res || !res.ok; @@ -2851,13 +2851,13 @@ module.exports = { apiPostMessage, apiAddReaction, apiUpdateMessage }; /***/ }), -/***/ 662: +/***/ 4662: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -const context = __nccwpck_require__(319); -const { postMessage } = __nccwpck_require__(563); -const { addReaction } = __nccwpck_require__(380); -const { updateMessage } = __nccwpck_require__(308); +const context = __nccwpck_require__(1319); +const { postMessage } = __nccwpck_require__(1563); +const { addReaction } = __nccwpck_require__(4380); +const { updateMessage } = __nccwpck_require__(3308); const jsonPretty = (data) => JSON.stringify(data, undefined, 2); @@ -2889,13 +2889,13 @@ module.exports = invoke; /***/ }), -/***/ 690: +/***/ 3690: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { const { restoreEscapedNewLine, restoreEscapedTab, -} = __nccwpck_require__(307); +} = __nccwpck_require__(5017); const buildMessage = (channel = "", text = "", blocks = "", optional = {}) => { if (!channel) { @@ -2929,13 +2929,14 @@ module.exports = buildMessage; /***/ }), -/***/ 563: +/***/ 1563: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -const context = __nccwpck_require__(319); -const { apiPostMessage } = __nccwpck_require__(202); -const buildMessage = __nccwpck_require__(690); -const core = __nccwpck_require__(186); +const context = __nccwpck_require__(1319); +const { apiPostMessage } = __nccwpck_require__(7202); +const buildMessage = __nccwpck_require__(3690); +const core = __nccwpck_require__(2186); +const { optional } = __nccwpck_require__(8300); const jsonPretty = (data) => JSON.stringify(data, undefined, 2); @@ -2970,27 +2971,12 @@ const postMessage = async () => { } }; -const optional = () => { - let opt = {}; - - const env = context.getEnv(); - Object.keys(env) - .filter((key) => !!env[key]) - .filter((key) => key.toUpperCase().startsWith("INPUT_SLACK-OPTIONAL-")) - .forEach((key) => { - const slackKey = key.replace("INPUT_SLACK-OPTIONAL-", "").toLowerCase(); - opt[slackKey] = env[key]; - }); - - return opt; -}; - module.exports = { postMessage }; /***/ }), -/***/ 179: +/***/ 1179: /***/ ((module) => { const buildReaction = ( @@ -3012,12 +2998,12 @@ module.exports = buildReaction; /***/ }), -/***/ 380: +/***/ 4380: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -const context = __nccwpck_require__(319); -const { apiAddReaction } = __nccwpck_require__(202); -const buildMessage = __nccwpck_require__(179); +const context = __nccwpck_require__(1319); +const { apiAddReaction } = __nccwpck_require__(7202); +const buildMessage = __nccwpck_require__(1179); const jsonPretty = (data) => JSON.stringify(data, undefined, 2); @@ -3046,13 +3032,13 @@ module.exports = { addReaction }; /***/ }), -/***/ 51: +/***/ 4051: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { const { restoreEscapedNewLine, restoreEscapedTab, -} = __nccwpck_require__(307); +} = __nccwpck_require__(5017); const buildMessage = ( channel = "", @@ -3093,12 +3079,13 @@ module.exports = buildMessage; /***/ }), -/***/ 308: +/***/ 3308: /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { -const context = __nccwpck_require__(319); -const { apiUpdateMessage } = __nccwpck_require__(202); -const buildUpdateMessage = __nccwpck_require__(51); +const context = __nccwpck_require__(1319); +const { apiUpdateMessage } = __nccwpck_require__(7202); +const buildUpdateMessage = __nccwpck_require__(4051); +const { optional } = __nccwpck_require__(8300); const jsonPretty = (data) => JSON.stringify(data, undefined, 2); @@ -3124,6 +3111,29 @@ const updateMessage = async () => { } }; +module.exports = { updateMessage }; + + +/***/ }), + +/***/ 5017: +/***/ ((module) => { + +const restoreEscapedNewLine = (text) => + text.replace(/\\r\\n/g, "\n").replace(/\\n/g, "\n"); + +const restoreEscapedTab = (text) => text.replace(/\\t/g, "\t"); + +module.exports = { restoreEscapedNewLine, restoreEscapedTab }; + + +/***/ }), + +/***/ 8300: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +const context = __nccwpck_require__(1319); + const optional = () => { let opt = {}; @@ -3139,25 +3149,12 @@ const optional = () => { return opt; }; -module.exports = { updateMessage }; - - -/***/ }), - -/***/ 307: -/***/ ((module) => { - -const restoreEscapedNewLine = (text) => - text.replace(/\\r\\n/g, "\n").replace(/\\n/g, "\n"); - -const restoreEscapedTab = (text) => text.replace(/\\t/g, "\t"); - -module.exports = { restoreEscapedNewLine, restoreEscapedTab }; +module.exports = { optional }; /***/ }), -/***/ 491: +/***/ 9491: /***/ ((module) => { "use strict"; @@ -3165,7 +3162,7 @@ module.exports = require("assert"); /***/ }), -/***/ 113: +/***/ 6113: /***/ ((module) => { "use strict"; @@ -3173,7 +3170,7 @@ module.exports = require("crypto"); /***/ }), -/***/ 361: +/***/ 2361: /***/ ((module) => { "use strict"; @@ -3181,7 +3178,7 @@ module.exports = require("events"); /***/ }), -/***/ 147: +/***/ 7147: /***/ ((module) => { "use strict"; @@ -3189,7 +3186,7 @@ module.exports = require("fs"); /***/ }), -/***/ 685: +/***/ 3685: /***/ ((module) => { "use strict"; @@ -3197,7 +3194,7 @@ module.exports = require("http"); /***/ }), -/***/ 687: +/***/ 5687: /***/ ((module) => { "use strict"; @@ -3205,7 +3202,7 @@ module.exports = require("https"); /***/ }), -/***/ 808: +/***/ 1808: /***/ ((module) => { "use strict"; @@ -3213,7 +3210,7 @@ module.exports = require("net"); /***/ }), -/***/ 37: +/***/ 2037: /***/ ((module) => { "use strict"; @@ -3221,7 +3218,7 @@ module.exports = require("os"); /***/ }), -/***/ 17: +/***/ 1017: /***/ ((module) => { "use strict"; @@ -3229,7 +3226,7 @@ module.exports = require("path"); /***/ }), -/***/ 404: +/***/ 4404: /***/ ((module) => { "use strict"; @@ -3237,7 +3234,7 @@ module.exports = require("tls"); /***/ }), -/***/ 837: +/***/ 3837: /***/ ((module) => { "use strict"; @@ -3286,7 +3283,7 @@ module.exports = require("util"); var __webpack_exports__ = {}; // This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. (() => { -const invoke = __nccwpck_require__(662); +const invoke = __nccwpck_require__(4662); const run = async () => { await invoke(); diff --git a/src/message/index.js b/src/message/index.js index 06f335c..8c19347 100644 --- a/src/message/index.js +++ b/src/message/index.js @@ -2,6 +2,7 @@ const context = require("../context"); const { apiPostMessage } = require("../integration/slack-api"); const buildMessage = require("./build-message"); const core = require("@actions/core"); +const { optional } = require("../util/optional"); const jsonPretty = (data) => JSON.stringify(data, undefined, 2); @@ -36,19 +37,4 @@ const postMessage = async () => { } }; -const optional = () => { - let opt = {}; - - const env = context.getEnv(); - Object.keys(env) - .filter((key) => !!env[key]) - .filter((key) => key.toUpperCase().startsWith("INPUT_SLACK-OPTIONAL-")) - .forEach((key) => { - const slackKey = key.replace("INPUT_SLACK-OPTIONAL-", "").toLowerCase(); - opt[slackKey] = env[key]; - }); - - return opt; -}; - module.exports = { postMessage }; diff --git a/src/update-message/index.js b/src/update-message/index.js index 9e322a5..c250c2e 100644 --- a/src/update-message/index.js +++ b/src/update-message/index.js @@ -1,6 +1,7 @@ const context = require("../context"); const { apiUpdateMessage } = require("../integration/slack-api"); const buildUpdateMessage = require("./build-update-message"); +const { optional } = require("../util/optional"); const jsonPretty = (data) => JSON.stringify(data, undefined, 2); @@ -26,19 +27,4 @@ const updateMessage = async () => { } }; -const optional = () => { - let opt = {}; - - const env = context.getEnv(); - Object.keys(env) - .filter((key) => !!env[key]) - .filter((key) => key.toUpperCase().startsWith("INPUT_SLACK-OPTIONAL-")) - .forEach((key) => { - const slackKey = key.replace("INPUT_SLACK-OPTIONAL-", "").toLowerCase(); - opt[slackKey] = env[key]; - }); - - return opt; -}; - module.exports = { updateMessage }; diff --git a/src/util/optional.js b/src/util/optional.js new file mode 100644 index 0000000..a1d1717 --- /dev/null +++ b/src/util/optional.js @@ -0,0 +1,18 @@ +const context = require("../context"); + +const optional = () => { + let opt = {}; + + const env = context.getEnv(); + Object.keys(env) + .filter((key) => !!env[key]) + .filter((key) => key.toUpperCase().startsWith("INPUT_SLACK-OPTIONAL-")) + .forEach((key) => { + const slackKey = key.replace("INPUT_SLACK-OPTIONAL-", "").toLowerCase(); + opt[slackKey] = env[key]; + }); + + return opt; +}; + +module.exports = { optional }; From fdbbefe8452bb06e31606af762530a4dc6bc51c7 Mon Sep 17 00:00:00 2001 From: Anders Date: Sat, 15 Oct 2022 00:45:31 +0200 Subject: [PATCH 30/30] added blocks in readme --- README.md | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 12baf23..1eb67a4 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Github Action for sending message (and reactions/threads/update) to Slack +# Github Action for sending message (and reactions/threads/update/blocks) to Slack — With support for Slack's optional arguments @@ -7,7 +7,7 @@ ![](https://api.codiga.io/project/30889/status/svg) ![](https://api.codiga.io/project/30889/score/svg) -This Action allows you to send messages (and reactions/threads/update) to Slack from your Github Actions. Supports Slack's required arguments as well as all the optional once. It's JavaScript-based and thus fast to run. +This Action allows you to send messages (and reactions/threads/update/blocks) to Slack from your Github Actions. Supports Slack's required arguments as well as all the optional once. It's JavaScript-based and thus fast to run. ![Slack result](./images/slack-result.png "Slack result") @@ -49,7 +49,7 @@ This action supports: - `slack-channel` - The channel/channels where you want the message (comma separated) -- `slack-text` - The text of the message +- `slack-text` - The text of the message (or use `slack-blocks`) **Optional: Github Action Parameters:** @@ -291,6 +291,15 @@ Similar to Add Reaction, but with text instead. Please see [.github/workflows/5-slack-update-message.yml](.github/workflows/5-slack-update-message.yml) +## 5. Using blocks + +With blocks you can create more rich and complex messages / message layouts: https://api.slack.com/messaging/composing/layouts + +For some examples, please see: + +- [.github/workflows/11-slack-message-blocks.yml](.github/workflows/11-slack-message-blocks.yml) +- [.github/workflows/12-slack-message-blocks-update.yml](.github/workflows/12-slack-message-blocks-update.yml) + ## How to setup your first Github Action in your repository that will call this Action ### 1. Create a Slack bot