├── .watchmanconfig ├── .gitattributes ├── .gitignore ├── images ├── thread.png ├── message.png ├── reaction.png ├── sample-error.png ├── slack-result.png ├── github-actions-logo.png └── slack-result-optional.png ├── trigger_action.txt ├── index.js ├── src ├── util │ ├── escaper.js │ └── optional.js ├── reaction │ ├── build-reaction.js │ ├── build-reaction.test.js │ └── index.js ├── integration │ ├── slack-api.test.js │ ├── slack-api.js │ └── slack-api-post.js ├── message │ ├── build-message.js │ ├── build-message.test.js │ ├── index.js │ └── index.test.js ├── context.js ├── invoke.js └── update-message │ ├── build-update-message.js │ └── index.js ├── Privacy Policy.md ├── .github └── workflows │ ├── 14-slack-message-icon.yml │ ├── 2-slack-notification.yml │ ├── 1-slack-notification-with-optional-parameters.yml │ ├── 7-slack-notification-multi-channel.yml │ ├── 3-slack-reaction.yml │ ├── 5-slack-update-message.yml │ ├── 10-slack-fake-build-updates.yml │ ├── 4-slack-thread.yml │ ├── 6-slack-thread-with-broadcast.yml │ ├── 13-slack-message-blocks-backward-compatibility.yml │ ├── 11-slack-message-blocks.yml │ ├── 12-slack-message-blocks-update.yml │ ├── 8-slack-notification-line-breaks.yml │ └── 9-slack-update-message-line-breaks.yml ├── package.json ├── eslint.config.mjs ├── LICENSE.md ├── integration-test └── end-to-end.js ├── action.yml ├── jest.config.js ├── README.md └── yarn.lock /.watchmanconfig: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=lf 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | .env 3 | .cache 4 | -------------------------------------------------------------------------------- /images/thread.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/archive/github-actions-slack/HEAD/images/thread.png -------------------------------------------------------------------------------- /images/message.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/archive/github-actions-slack/HEAD/images/message.png -------------------------------------------------------------------------------- /images/reaction.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/archive/github-actions-slack/HEAD/images/reaction.png -------------------------------------------------------------------------------- /trigger_action.txt: -------------------------------------------------------------------------------- 1 | This is just a file to quickly trigger different repository actions :) 2 | ... 3 | -------------------------------------------------------------------------------- /images/sample-error.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/archive/github-actions-slack/HEAD/images/sample-error.png -------------------------------------------------------------------------------- /images/slack-result.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/archive/github-actions-slack/HEAD/images/slack-result.png -------------------------------------------------------------------------------- /images/github-actions-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/archive/github-actions-slack/HEAD/images/github-actions-logo.png -------------------------------------------------------------------------------- /images/slack-result-optional.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/archive/github-actions-slack/HEAD/images/slack-result-optional.png -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const invoke = require("./src/invoke"); 2 | 3 | const run = async () => { 4 | await invoke(); 5 | }; 6 | 7 | run(); 8 | -------------------------------------------------------------------------------- /src/util/escaper.js: -------------------------------------------------------------------------------- 1 | const restoreEscapedNewLine = (text) => 2 | text.replace(/\\r\\n/g, "\n").replace(/\\n/g, "\n"); 3 | 4 | const restoreEscapedTab = (text) => text.replace(/\\t/g, "\t"); 5 | 6 | module.exports = { restoreEscapedNewLine, restoreEscapedTab }; 7 | -------------------------------------------------------------------------------- /src/reaction/build-reaction.js: -------------------------------------------------------------------------------- 1 | const buildReaction = ( 2 | channelId = "", 3 | emojiName = "", 4 | messageTimestamp = "" 5 | ) => { 6 | const message = { 7 | channel: channelId, 8 | name: emojiName, 9 | timestamp: messageTimestamp, 10 | }; 11 | 12 | return message; 13 | }; 14 | 15 | module.exports = buildReaction; 16 | -------------------------------------------------------------------------------- /src/reaction/build-reaction.test.js: -------------------------------------------------------------------------------- 1 | describe("build reaction", () => { 2 | test("with required parameters", () => { 3 | const buildReaction = require("./build-reaction"); 4 | 5 | const reaction = buildReaction("C123", "thumbsup", "1612615118.003800"); 6 | 7 | expect(reaction).toEqual({ 8 | channel: "C123", 9 | name: "thumbsup", 10 | timestamp: "1612615118.003800", 11 | }); 12 | }); 13 | }); 14 | -------------------------------------------------------------------------------- /src/util/optional.js: -------------------------------------------------------------------------------- 1 | const context = require("../context"); 2 | 3 | const optional = () => { 4 | let opt = {}; 5 | 6 | const env = context.getEnv(); 7 | Object.keys(env) 8 | .filter((key) => !!env[key]) 9 | .filter((key) => key.toUpperCase().startsWith("INPUT_SLACK-OPTIONAL-")) 10 | .forEach((key) => { 11 | const slackKey = key.replace("INPUT_SLACK-OPTIONAL-", "").toLowerCase(); 12 | opt[slackKey] = env[key]; 13 | }); 14 | 15 | return opt; 16 | }; 17 | 18 | module.exports = { optional }; 19 | -------------------------------------------------------------------------------- /src/integration/slack-api.test.js: -------------------------------------------------------------------------------- 1 | describe("slack api", () => { 2 | test("fail when slack api wrapper returns ok is false", async () => { 3 | expect.assertions(1); 4 | 5 | const errorResponse = { 6 | ok: false, 7 | }; 8 | 9 | jest.mock("./slack-api-post", () => ({ 10 | post: function (token, path, message) { 11 | return errorResponse; 12 | }, 13 | })); 14 | 15 | const slackApi = require("./slack-api"); 16 | try { 17 | await slackApi.apiUpdateMessage(); 18 | } catch (error) { 19 | expect(error).toContain("Error!"); 20 | } 21 | }); 22 | }); 23 | -------------------------------------------------------------------------------- /Privacy Policy.md: -------------------------------------------------------------------------------- 1 | Privacy Statement 2 | 3 | This GitHub Action does not collect, process, or store any personal data for its own use or for the use of the author. Any data processed is solely defined by the user and is the full responsibility of the user and the ecosystem in which it is being used. 4 | 5 | This GitHub Action sends data to Slack as configured by the user. The user is solely responsible for any data they choose to use within the software and send to GitHub or Slack. 6 | 7 | The author of this GitHub Action assumes no liability for any data processed, transmitted, or stored within GitHub, Slack, or any other third-party service. 8 | -------------------------------------------------------------------------------- /.github/workflows/14-slack-message-icon.yml: -------------------------------------------------------------------------------- 1 | name: test-1-slack-notification-with-optional-parameters 2 | 3 | on: [push] 4 | 5 | jobs: 6 | slack-action: 7 | #if: ${{ false }} 8 | runs-on: ubuntu-20.04 9 | name: Test 14 [ubuntu-20.04] 10 | 11 | steps: 12 | - name: Send Slack Message 13 | uses: archive/github-actions-slack@master 14 | id: send-message 15 | with: 16 | slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }} 17 | slack-channel: C075RQRGDC7 18 | slack-text: "Test 14 - :cold_face: x :fire: = :joy:" 19 | slack-optional-icon_emoji: ":robot_face:" 20 | 21 | -------------------------------------------------------------------------------- /.github/workflows/2-slack-notification.yml: -------------------------------------------------------------------------------- 1 | name: test-2-slack-notification 2 | 3 | on: [push] 4 | 5 | jobs: 6 | slack-action: 7 | #if: ${{ false }} 8 | runs-on: windows-latest 9 | name: Test 2 [windows-latest] 10 | 11 | steps: 12 | - name: Send Slack Message 13 | uses: archive/github-actions-slack@master 14 | id: send-message 15 | with: 16 | slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }} 17 | slack-channel: C036UR2U8HG 18 | slack-text: Test 2 - 🤓 Event name "${{ github.event_name }}" Repo "${{ github.repository }}" 19 | 20 | - name: Result from "Send Slack Message" 21 | run: echo '${{ steps.send-message.outputs.slack-result }}' 22 | -------------------------------------------------------------------------------- /.github/workflows/1-slack-notification-with-optional-parameters.yml: -------------------------------------------------------------------------------- 1 | name: test-1-slack-notification-with-optional-parameters 2 | 3 | on: [push] 4 | 5 | jobs: 6 | slack-action: 7 | #if: ${{ false }} 8 | runs-on: ubuntu-20.04 9 | name: Test 1 [ubuntu-20.04] 10 | 11 | steps: 12 | - name: Send Slack Message 13 | uses: archive/github-actions-slack@master 14 | id: send-message 15 | with: 16 | slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }} 17 | slack-channel: C02HEBQP46T 18 | slack-text: "Test 1 - :fire:" 19 | slack-optional-icon_emoji: ":fire:" 20 | 21 | - name: Result from "Send Slack Message" 22 | run: echo '${{ steps.send-message.outputs.slack-result }}' 23 | -------------------------------------------------------------------------------- /.github/workflows/7-slack-notification-multi-channel.yml: -------------------------------------------------------------------------------- 1 | name: test-7-slack-notification-multi-channel 2 | 3 | on: [push] 4 | 5 | jobs: 6 | slack-action: 7 | #if: ${{ false }} 8 | runs-on: windows-2019 9 | name: Test 7 [windows-2019] 10 | 11 | steps: 12 | - name: Send Slack Message 13 | uses: archive/github-actions-slack@master 14 | id: send-message 15 | with: 16 | slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }} 17 | slack-channel: C036X5MRCJG,C036N6B2L5U 18 | slack-text: Test 7 - Same message multiple channels 19 | 20 | - name: Result from "Send Slack Message" 21 | run: echo '${{ steps.send-message.outputs.slack-result }}' 22 | 23 | - name: Results from "Send Slack Message" 24 | run: echo '${{ steps.send-message.outputs.slack-results }}' 25 | -------------------------------------------------------------------------------- /src/message/build-message.js: -------------------------------------------------------------------------------- 1 | const { 2 | restoreEscapedNewLine, 3 | restoreEscapedTab, 4 | } = require("../util/escaper.js"); 5 | 6 | const buildMessage = (channel = "", text = "", blocks = "", optional = {}) => { 7 | if (!channel) { 8 | throw new Error("Channel must be set"); 9 | } 10 | 11 | if (text && blocks) { 12 | throw new Error("Text OR Block must be set"); 13 | } 14 | 15 | let message; 16 | if (text) { 17 | message = { 18 | channel, 19 | text, 20 | }; 21 | 22 | message.text = restoreEscapedNewLine(message.text); 23 | message.text = restoreEscapedTab(message.text); 24 | } else { 25 | message = { 26 | channel, 27 | blocks, 28 | }; 29 | } 30 | 31 | Object.keys(optional).forEach((name) => { 32 | message[name] = optional[name]; 33 | }); 34 | 35 | return message; 36 | }; 37 | 38 | module.exports = buildMessage; 39 | -------------------------------------------------------------------------------- /src/context.js: -------------------------------------------------------------------------------- 1 | const core = require("@actions/core"); 2 | 3 | const getRequired = (name) => core.getInput(name, { required: true }); 4 | 5 | const getOptional = (name) => core.getInput(name, { required: false }); 6 | 7 | const getEnv = () => process.env; 8 | 9 | const setOutput = (name, value) => core.setOutput(name, value); 10 | 11 | const setFailed = (msg) => core.setFailed(msg); 12 | 13 | const debug = (msg) => core.debug(msg); 14 | 15 | const debugExtra = (name, json) => { 16 | core.debug("CUSTOM DEBUG " + name); 17 | 18 | const message = JSON.stringify(json, undefined, 2); 19 | core.debug(message); 20 | }; 21 | 22 | const info = (msg) => core.info(msg); 23 | 24 | const warning = (msg) => core.warning(msg); 25 | 26 | module.exports = { 27 | getRequired, 28 | getOptional, 29 | getEnv, 30 | setOutput, 31 | setFailed, 32 | debug, 33 | debugExtra, 34 | info, 35 | warning, 36 | }; 37 | -------------------------------------------------------------------------------- /src/invoke.js: -------------------------------------------------------------------------------- 1 | const context = require("./context"); 2 | const { postMessage } = require("./message"); 3 | const { addReaction } = require("./reaction"); 4 | const { updateMessage } = require("./update-message"); 5 | 6 | const jsonPretty = (data) => JSON.stringify(data, undefined, 2); 7 | 8 | const invoke = async () => { 9 | try { 10 | const func = context.getOptional("slack-function") || "send-message"; 11 | 12 | switch (func) { 13 | case "send-message": 14 | await postMessage(); 15 | break; 16 | case "send-reaction": 17 | await addReaction(); 18 | break; 19 | case "update-message": 20 | await updateMessage(); 21 | break; 22 | default: 23 | context.setFailed("Unhandled `slack-function`: " + func); 24 | break; 25 | } 26 | } catch (error) { 27 | context.setFailed("invoke failed:" + error + ":" + jsonPretty(error)); 28 | } 29 | }; 30 | 31 | module.exports = invoke; 32 | -------------------------------------------------------------------------------- /src/update-message/build-update-message.js: -------------------------------------------------------------------------------- 1 | const { 2 | restoreEscapedNewLine, 3 | restoreEscapedTab, 4 | } = require("../util/escaper.js"); 5 | 6 | const buildMessage = ( 7 | channel = "", 8 | text = "", 9 | blocks = "", 10 | ts = "", 11 | optional = {} 12 | ) => { 13 | if (!channel || !ts) { 14 | throw new Error("Channel and/or TS must be set"); 15 | } 16 | 17 | if (text && blocks) { 18 | throw new Error("Text OR Block must be set"); 19 | } 20 | 21 | let message; 22 | if (text) { 23 | message = { 24 | channel, 25 | text, 26 | ts, 27 | }; 28 | 29 | message.text = restoreEscapedNewLine(message.text); 30 | message.text = restoreEscapedTab(message.text); 31 | } else { 32 | message = { 33 | channel, 34 | ts, 35 | blocks, 36 | }; 37 | } 38 | 39 | Object.keys(optional).forEach((name) => { 40 | message[name] = optional[name]; 41 | }); 42 | 43 | return message; 44 | }; 45 | 46 | module.exports = buildMessage; 47 | -------------------------------------------------------------------------------- /src/message/build-message.test.js: -------------------------------------------------------------------------------- 1 | describe("build message", () => { 2 | test("with channel and text parameters", () => { 3 | const buildMessage = require("./build-message"); 4 | 5 | const message = buildMessage("channel", "text", null); 6 | 7 | expect(message).toEqual({ 8 | channel: "channel", 9 | text: "text", 10 | }); 11 | }); 12 | 13 | test("with channel and blocks parameters", () => { 14 | const buildMessage = require("./build-message"); 15 | 16 | const message = buildMessage("channel", null, "blocks"); 17 | 18 | expect(message).toEqual({ 19 | channel: "channel", 20 | blocks: "blocks", 21 | }); 22 | }); 23 | 24 | test("with optional parameters", () => { 25 | const buildMessage = require("./build-message"); 26 | 27 | const message = buildMessage("channel", "text", null, { key: "value" }); 28 | 29 | expect(message).toEqual({ 30 | channel: "channel", 31 | text: "text", 32 | key: "value", 33 | }); 34 | }); 35 | }); 36 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "github-actions-slack", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "repository": "git@github.com:archive/github-actions-slack.git", 6 | "license": "MIT", 7 | "scripts": { 8 | "lint": "./node_modules/.bin/eslint --fix *.js", 9 | "build": "ncc build index.js -o dist", 10 | "build-legacy": "NODE_OPTIONS=--openssl-legacy-provider ncc build index.js -o dist", 11 | "test": "jest src --config=jest.config.js", 12 | "test-debug": "node --inspect-brk node_modules/.bin/jest --runInBand src --config=jest.config.js", 13 | "deploy-wip": "rm -f dist/index.js && yarn build && git ac wip && git push", 14 | "deploy": "rm -f dist/index.js && yarn build && git ac build && git push" 15 | }, 16 | "devDependencies": { 17 | "@vercel/ncc": "^0.38.3", 18 | "eslint": "^9.18.0", 19 | "eslint-config-prettier": "^10.0.1", 20 | "eslint-plugin-prettier": "^5.2.3", 21 | "jest": "^29.7.0", 22 | "prettier": "^3.4.2" 23 | }, 24 | "dependencies": { 25 | "@actions/core": "^1.11.1", 26 | "@actions/github": "^6.0.0" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/reaction/index.js: -------------------------------------------------------------------------------- 1 | const context = require("../context"); 2 | const { apiAddReaction } = require("../integration/slack-api"); 3 | const buildMessage = require("./build-reaction"); 4 | 5 | const jsonPretty = (data) => JSON.stringify(data, undefined, 2); 6 | 7 | const addReaction = async () => { 8 | try { 9 | const token = context.getRequired("slack-bot-user-oauth-access-token"); 10 | const channelId = context.getRequired("slack-channel"); 11 | const emojiName = context.getRequired("slack-emoji-name"); 12 | const messageTimestamp = context.getRequired("slack-message-timestamp"); 13 | 14 | const payload = buildMessage(channelId, emojiName, messageTimestamp); 15 | 16 | context.debugExtra("Add Reaction PAYLOAD", payload); 17 | const result = await apiAddReaction(token, payload); 18 | context.debugExtra("Add Reaction PAYLOAD", result); 19 | 20 | const resultAsJson = jsonPretty(result); 21 | context.setOutput("slack-result", resultAsJson); 22 | } catch (error) { 23 | context.setFailed(jsonPretty(error)); 24 | } 25 | }; 26 | 27 | module.exports = { addReaction }; 28 | -------------------------------------------------------------------------------- /src/integration/slack-api.js: -------------------------------------------------------------------------------- 1 | const { post } = require("./slack-api-post"); 2 | 3 | const hasErrors = (res) => !res || !res.ok; 4 | 5 | const buildErrorMessage = (res) => { 6 | return `Error! ${JSON.stringify(res)} (response)`; 7 | }; 8 | 9 | const apiPostMessage = async (token, message) => { 10 | const path = "/api/chat.postMessage"; 11 | const res = await post(token, path, message); 12 | 13 | if (hasErrors(res)) { 14 | throw buildErrorMessage(res); 15 | } 16 | 17 | return res; 18 | }; 19 | 20 | const apiAddReaction = async (token, message) => { 21 | const path = "/api/reactions.add"; 22 | const res = await post(token, path, message); 23 | 24 | if (hasErrors(res)) { 25 | throw buildErrorMessage(res); 26 | } 27 | 28 | return res; 29 | }; 30 | 31 | const apiUpdateMessage = async (token, message) => { 32 | const path = "/api/chat.update"; 33 | const res = await post(token, path, message); 34 | 35 | if (hasErrors(res)) { 36 | throw buildErrorMessage(res); 37 | } 38 | 39 | return res; 40 | }; 41 | 42 | module.exports = { apiPostMessage, apiAddReaction, apiUpdateMessage }; 43 | -------------------------------------------------------------------------------- /eslint.config.mjs: -------------------------------------------------------------------------------- 1 | import prettier from "eslint-plugin-prettier"; 2 | import globals from "globals"; 3 | import path from "node:path"; 4 | import { fileURLToPath } from "node:url"; 5 | import js from "@eslint/js"; 6 | import { FlatCompat } from "@eslint/eslintrc"; 7 | 8 | const __filename = fileURLToPath(import.meta.url); 9 | const __dirname = path.dirname(__filename); 10 | const compat = new FlatCompat({ 11 | baseDirectory: __dirname, 12 | recommendedConfig: js.configs.recommended, 13 | allConfig: js.configs.all 14 | }); 15 | 16 | export default [...compat.extends("eslint:recommended", "plugin:prettier/recommended"), { 17 | plugins: { 18 | prettier, 19 | }, 20 | 21 | languageOptions: { 22 | globals: { 23 | ...globals.node, 24 | fetch: false, 25 | Promise: false, 26 | test: false, 27 | expect: false, 28 | jest: false, 29 | describe: false, 30 | }, 31 | 32 | ecmaVersion: 9, 33 | sourceType: "commonjs", 34 | }, 35 | 36 | rules: { 37 | "no-console": 0, 38 | }, 39 | }]; -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) Anders Jönsson 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/update-message/index.js: -------------------------------------------------------------------------------- 1 | const context = require("../context"); 2 | const { apiUpdateMessage } = require("../integration/slack-api"); 3 | const buildUpdateMessage = require("./build-update-message"); 4 | const { optional } = require("../util/optional"); 5 | 6 | const jsonPretty = (data) => JSON.stringify(data, undefined, 2); 7 | 8 | const updateMessage = async () => { 9 | try { 10 | const token = context.getRequired("slack-bot-user-oauth-access-token"); 11 | const channelId = context.getRequired("slack-channel"); 12 | const ts = context.getRequired("slack-update-message-ts"); 13 | const text = context.getOptional("slack-update-message-text"); 14 | const blocks = context.getOptional("slack-update-message-blocks"); 15 | 16 | const payload = buildUpdateMessage(channelId, text, blocks, ts, optional()); 17 | 18 | context.debugExtra("Update Message PAYLOAD", payload); 19 | const result = await apiUpdateMessage(token, payload); 20 | context.debug("Update Message RESULT", result); 21 | 22 | const resultAsJson = jsonPretty(result); 23 | context.setOutput("slack-result", resultAsJson); 24 | } catch (error) { 25 | context.debug(error); 26 | context.setFailed(jsonPretty(error)); 27 | } 28 | }; 29 | 30 | module.exports = { updateMessage }; 31 | -------------------------------------------------------------------------------- /.github/workflows/3-slack-reaction.yml: -------------------------------------------------------------------------------- 1 | name: test-3-slack-reaction 2 | 3 | on: [push] 4 | 5 | jobs: 6 | slack-action: 7 | #if: ${{ false }} 8 | runs-on: ubuntu-latest 9 | name: Test 3 [ubuntu-latest] 10 | 11 | steps: 12 | - name: Send Slack Message 13 | uses: archive/github-actions-slack@master 14 | id: send-message 15 | 16 | with: 17 | slack-function: send-message 18 | slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }} 19 | slack-channel: C036E7FSXBR 20 | slack-text: Test 3 - Message to send a react to 21 | 22 | - name: Send Slack Message Result 23 | run: echo 'Data - ${{ steps.send-message.outputs.slack-result }}' 24 | 25 | - name: Some step in between 26 | run: echo '...' 27 | 28 | - name: Send Slack Reaction To Message 29 | uses: archive/github-actions-slack@master 30 | with: 31 | slack-function: send-reaction 32 | slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }} 33 | slack-channel: ${{ fromJson(steps.send-message.outputs.slack-result).response.channel }} 34 | slack-emoji-name: thumbsup 35 | slack-message-timestamp: ${{ fromJson(steps.send-message.outputs.slack-result).response.message.ts }} 36 | 37 | - name: Send Slack Reaction To Message Result 38 | run: echo 'Data - ${{ steps.send-message.outputs.slack-result }}' 39 | -------------------------------------------------------------------------------- /src/message/index.js: -------------------------------------------------------------------------------- 1 | const context = require("../context"); 2 | const { apiPostMessage } = require("../integration/slack-api"); 3 | const buildMessage = require("./build-message"); 4 | const core = require("@actions/core"); 5 | const { optional } = require("../util/optional"); 6 | 7 | const jsonPretty = (data) => JSON.stringify(data, undefined, 2); 8 | 9 | const postMessage = async () => { 10 | try { 11 | const token = context.getRequired("slack-bot-user-oauth-access-token"); 12 | const channels = context.getRequired("slack-channel"); 13 | const text = context.getOptional("slack-text"); 14 | const blocks = context.getOptional("slack-blocks"); 15 | 16 | const results = []; 17 | for (let channel of channels.split(",")) { 18 | channel = channel.trim(); 19 | 20 | const payload = buildMessage(channel, text, blocks, optional()); 21 | 22 | context.debug("Post Message PAYLOAD", payload); 23 | const result = await apiPostMessage(token, payload); 24 | context.debug("Post Message RESULT", result); 25 | 26 | results.push(result); 27 | } 28 | 29 | // To not break backward compatibility 30 | const resultAsJson = jsonPretty(results[0]); 31 | context.setOutput("slack-result", resultAsJson); 32 | 33 | const resultsAsJson = jsonPretty(results); 34 | context.setOutput("slack-results", resultsAsJson); 35 | } catch (error) { 36 | context.setFailed(jsonPretty(error)); 37 | } 38 | }; 39 | 40 | module.exports = { postMessage }; 41 | -------------------------------------------------------------------------------- /.github/workflows/5-slack-update-message.yml: -------------------------------------------------------------------------------- 1 | name: test-5-slack-update-message 2 | 3 | on: [push] 4 | 5 | jobs: 6 | slack-action: 7 | #if: ${{ false }} 8 | runs-on: ubuntu-20.04 9 | name: Test 5 [ubuntu-20.04] 10 | 11 | steps: 12 | - name: Send Slack Message 13 | uses: archive/github-actions-slack@master 14 | id: send-message 15 | 16 | with: 17 | slack-function: send-message 18 | slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }} 19 | slack-channel: C036UR2CRRR 20 | slack-text: Test 5 - Message to update 21 | 22 | - name: Send Slack Message Result 23 | run: echo 'Data - ${{ steps.send-message.outputs.slack-result }}' 24 | 25 | - name: Some step in between 26 | run: echo '...' 27 | 28 | - name: Send Slack Reaction To Message 29 | uses: archive/github-actions-slack@master 30 | with: 31 | slack-function: update-message 32 | slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }} 33 | slack-channel: ${{ fromJson(steps.send-message.outputs.slack-result).response.channel }} 34 | slack-update-message-ts: ${{ fromJson(steps.send-message.outputs.slack-result).response.message.ts }} 35 | slack-update-message-text: Test 5.1 - Message to update - updated 36 | 37 | - name: Send Slack Reaction To Message Result 38 | run: echo 'Data - ${{ steps.send-message.outputs.slack-result }}' 39 | -------------------------------------------------------------------------------- /.github/workflows/10-slack-fake-build-updates.yml: -------------------------------------------------------------------------------- 1 | name: test-10-fake-build-updates 2 | 3 | on: [push] 4 | 5 | jobs: 6 | slack-action: 7 | #if: ${{ false }} 8 | runs-on: ubuntu-latest 9 | name: Test 10 [ubuntu-latest] 10 | 11 | steps: 12 | - name: Send build started to slack 13 | uses: archive/github-actions-slack@master 14 | id: slack-build-started 15 | 16 | with: 17 | slack-function: send-message 18 | slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }} 19 | slack-channel: C036UR31LTD 20 | slack-text: | 21 | :hourglass: Build status: Building... 22 | 23 | Please wait 😁 24 | 25 | - name: Fake build process 26 | id: fake-build-process 27 | run: | 28 | echo 'BUILD_RESULT<> $GITHUB_OUTPUT 29 | curl https://httpbin.org/json -s >> $GITHUB_OUTPUT 30 | echo 'EOF' >> $GITHUB_OUTPUT 31 | 32 | - name: Update slack with build result 33 | uses: archive/github-actions-slack@master 34 | with: 35 | slack-function: update-message 36 | slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }} 37 | slack-channel: C036UR31LTD 38 | slack-update-message-ts: ${{ fromJson(steps.slack-build-started.outputs.slack-result).response.message.ts }} 39 | slack-update-message-text: "${{ format('{0}\n\n```{1}```', ':no_entry_sign: Build status: Failed!', steps.fake-build-process.outputs.BUILD_RESULT) }}" 40 | -------------------------------------------------------------------------------- /.github/workflows/4-slack-thread.yml: -------------------------------------------------------------------------------- 1 | name: test-4-slack-thread 2 | 3 | on: [push] 4 | 5 | jobs: 6 | slack-action: 7 | #if: ${{ false }} 8 | runs-on: macos-latest 9 | name: Test 4 [macos-latest] 10 | 11 | steps: 12 | - name: Send Slack Message 13 | uses: archive/github-actions-slack@master 14 | id: send-message 15 | 16 | with: 17 | slack-function: send-message 18 | slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }} 19 | slack-channel: C036E7G0RPH 20 | slack-text: Test 4 - Message to send thread to 21 | 22 | - name: Send "Slack Message" Result 23 | run: echo 'Data - ${{ steps.send-message.outputs.slack-result }}' 24 | 25 | - name: Some step in between 26 | run: echo '...' 27 | 28 | - name: Send Thread Message 29 | uses: archive/github-actions-slack@master 30 | with: 31 | slack-function: send-message 32 | slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }} 33 | slack-channel: ${{ fromJson(steps.send-message.outputs.slack-result).response.channel }} 34 | slack-text: Test 4.1 - Reply in thread 35 | slack-optional-thread_ts: ${{ fromJson(steps.send-message.outputs.slack-result).response.message.ts }} 36 | #slack-optional-reply_broadcast: true # To broadcast thread reply in channel 37 | 38 | - name: Send "Send Thread Message" Result 39 | run: echo 'Data - ${{ steps.send-message.outputs.slack-result }}' 40 | -------------------------------------------------------------------------------- /.github/workflows/6-slack-thread-with-broadcast.yml: -------------------------------------------------------------------------------- 1 | name: test-6-slack-thread-with-broadcast 2 | 3 | on: [push] 4 | 5 | jobs: 6 | slack-action: 7 | #if: ${{ false }} 8 | runs-on: ubuntu-20.04 9 | name: Test 6 [ubuntu-20.04] 10 | 11 | steps: 12 | - name: Send Slack Message 13 | uses: archive/github-actions-slack@master 14 | id: send-message 15 | 16 | with: 17 | slack-function: send-message 18 | slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }} 19 | slack-channel: C037JJ2BTKJ 20 | slack-text: Test 6 - Message to send thread to 21 | 22 | - name: Send "Slack Message" Result 23 | run: echo 'Data - ${{ steps.send-message.outputs.slack-result }}' 24 | 25 | - name: Some step in between 26 | run: echo '...' 27 | 28 | - name: Send Thread Message 29 | uses: archive/github-actions-slack@master 30 | with: 31 | slack-function: send-message 32 | slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }} 33 | slack-channel: ${{ fromJson(steps.send-message.outputs.slack-result).response.channel }} 34 | slack-text: Test 6.1 - Reply in thread, with broadcast 35 | slack-optional-thread_ts: ${{ fromJson(steps.send-message.outputs.slack-result).response.message.ts }} 36 | slack-optional-reply_broadcast: true 37 | 38 | - name: Send "Send Thread Message" Result 39 | run: echo 'Data - ${{ steps.send-message.outputs.slack-result }}' 40 | -------------------------------------------------------------------------------- /.github/workflows/13-slack-message-blocks-backward-compatibility.yml: -------------------------------------------------------------------------------- 1 | name: test-13-slack-message-blocks 2 | 3 | on: [push, issues] 4 | 5 | jobs: 6 | slack-action: 7 | #if: ${{ false }} 8 | runs-on: ubuntu-20.04 9 | name: Test 13 [ubuntu-20.04] 10 | 11 | steps: 12 | - name: Send Slack Message (Blocks - Different Key Name) 13 | uses: archive/github-actions-slack@master 14 | id: send-message 15 | with: 16 | slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }} 17 | slack-channel: C06G1B1KLMU 18 | # This is an old format, the correct one is "slack-optional-blocks" 19 | slack-blocks: >- 20 | [ 21 | { 22 | "block_id": "text1", 23 | "type": "section", 24 | "text": { 25 | "type": "mrkdwn", 26 | "text": "TEST *TEST*" 27 | } 28 | }, 29 | { 30 | "type": "divider" 31 | }, 32 | { 33 | "block_id": "text2", 34 | "type": "context", 35 | "elements": [ 36 | { 37 | "type": "plain_text", 38 | "text": "TEST..." 39 | } 40 | ] 41 | }, 42 | { 43 | "type": "divider" 44 | } 45 | ] 46 | 47 | - name: Result from "Send Slack Message" 48 | run: echo '${{ steps.send-message.outputs.slack-result }}' 49 | -------------------------------------------------------------------------------- /.github/workflows/11-slack-message-blocks.yml: -------------------------------------------------------------------------------- 1 | name: test-11-slack-message-blocks 2 | 3 | on: [push, issues] 4 | 5 | jobs: 6 | slack-action: 7 | #if: ${{ false }} 8 | runs-on: ubuntu-20.04 9 | name: Test 11 [ubuntu-20.04] 10 | 11 | steps: 12 | - name: Send Slack Message (Blocks) 13 | uses: archive/github-actions-slack@master 14 | id: send-message 15 | with: 16 | slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }} 17 | slack-channel: C046J5U2RGC 18 | slack-optional-blocks: >- 19 | [ 20 | { 21 | "block_id": "text1", 22 | "type": "section", 23 | "text": { 24 | "type": "mrkdwn", 25 | "text": "Building repo *product-service*" 26 | } 27 | }, 28 | { 29 | "type": "divider" 30 | }, 31 | { 32 | "block_id": "text2", 33 | "type": "context", 34 | "elements": [ 35 | { 36 | "type": "image", 37 | "image_url": "https://upload.wikimedia.org/wikipedia/en/thumb/4/4c/Flag_of_Sweden.svg/1200px-Flag_of_Sweden.svg.png", 38 | "alt_text": "images" 39 | }, 40 | { 41 | "type": "plain_text", 42 | "text": "Estimated time: 1 min" 43 | } 44 | ] 45 | }, 46 | { 47 | "type": "divider" 48 | } 49 | ] 50 | 51 | - name: Result from "Send Slack Message" 52 | run: echo '${{ steps.send-message.outputs.slack-result }}' 53 | -------------------------------------------------------------------------------- /src/integration/slack-api-post.js: -------------------------------------------------------------------------------- 1 | const https = require("https"); 2 | const context = require("../context"); 3 | 4 | const getOptions = (token, path) => { 5 | return { 6 | hostname: "slack.com", 7 | port: 443, 8 | path: path, 9 | method: "POST", 10 | headers: { 11 | "Content-Type": "application/json; charset=utf-8", 12 | Authorization: `Bearer ${token}`, 13 | }, 14 | }; 15 | }; 16 | 17 | const post = (token, path, message) => { 18 | return new Promise((resolve, reject) => { 19 | const payload = JSON.stringify(message); 20 | 21 | context.debugExtra("SLACK POST PAYLOAD", payload); 22 | 23 | const options = getOptions(token, path); 24 | 25 | const req = https.request(options, (res) => { 26 | const chunks = []; 27 | 28 | res.on("data", (chunk) => { 29 | chunks.push(chunk); 30 | }); 31 | 32 | res.on("end", () => { 33 | const result = Buffer.concat(chunks).toString(); 34 | const response = JSON.parse(result); 35 | 36 | let isOk = res.statusCode >= 200 && res.statusCode <= 299; 37 | 38 | // This solves the issue that block updates returns 200 39 | // but contains ok = false in the response 40 | if ( 41 | response && 42 | response.hasOwnProperty("ok") && 43 | response.ok === false 44 | ) { 45 | isOk = false; 46 | } 47 | 48 | resolve({ 49 | statusCode: res.statusCode, 50 | statusMessage: res.statusMessage, 51 | ok: isOk, 52 | result: result, 53 | response: response, 54 | }); 55 | }); 56 | }); 57 | 58 | req.on("error", (error) => { 59 | reject(error); 60 | }); 61 | 62 | req.write(payload); 63 | req.end(); 64 | }); 65 | }; 66 | 67 | module.exports = { post }; 68 | -------------------------------------------------------------------------------- /.github/workflows/12-slack-message-blocks-update.yml: -------------------------------------------------------------------------------- 1 | name: test-12-slack-message-blocks-update 2 | 3 | on: [push, issues] 4 | 5 | jobs: 6 | slack-action: 7 | #if: ${{ false }} 8 | runs-on: ubuntu-20.04 9 | name: Test 12 [ubuntu-20.04] 10 | 11 | steps: 12 | - name: Send Slack Message (Blocks) 13 | uses: archive/github-actions-slack@master 14 | id: send-message 15 | with: 16 | slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }} 17 | slack-channel: C046FKM3TNF 18 | slack-optional-blocks: >- 19 | [ 20 | { 21 | "block_id": "text1", 22 | "type": "section", 23 | "text": { 24 | "type": "mrkdwn", 25 | "text": "Building... *please wait*" 26 | } 27 | } 28 | ] 29 | 30 | - name: Result from "Send Slack Message" 31 | run: echo '${{ steps.send-message.outputs.slack-result }}' 32 | 33 | - name: Send Slack Message (Blocks) - Update 34 | uses: archive/github-actions-slack@master 35 | id: send-message-update 36 | with: 37 | slack-function: update-message 38 | slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }} 39 | slack-channel: C046FKM3TNF 40 | slack-update-message-ts: ${{ fromJson(steps.send-message.outputs.slack-result).response.message.ts }} 41 | slack-update-message-blocks: >- 42 | [ 43 | { 44 | "block_id": "text1", 45 | "type": "section", 46 | "text": { 47 | "type": "mrkdwn", 48 | "text": "Building... *done!*" 49 | } 50 | } 51 | ] 52 | -------------------------------------------------------------------------------- /.github/workflows/8-slack-notification-line-breaks.yml: -------------------------------------------------------------------------------- 1 | name: test-8-slack-notification-line-breaks 2 | 3 | on: [push] 4 | 5 | jobs: 6 | slack-action: 7 | #if: ${{ false }} 8 | runs-on: windows-latest 9 | name: Test 8 [windows-latest] 10 | 11 | steps: 12 | - name: Send Slack Message 1/3 13 | uses: archive/github-actions-slack@master 14 | id: send-message-1 15 | with: 16 | slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }} 17 | slack-channel: C036UR2P5BM 18 | slack-text: | 19 | Test 8 - 1/3! 20 | 21 | This 22 | should 23 | have 24 | line 25 | breaks... 26 | 27 | - name: Result from "Send Slack Message" 28 | run: echo '${{ steps.send-message-1.outputs.slack-result }}' 29 | 30 | - name: Send Slack Message 2/3 31 | uses: archive/github-actions-slack@master 32 | id: send-message-2 33 | with: 34 | slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }} 35 | slack-channel: C036UR2P5BM 36 | slack-text: "Test 8 - 2/3!\n\nThis\nshould\nhave\nline\nbreaks..." 37 | 38 | - name: Result from "Send Slack Message" 39 | run: echo '${{ steps.send-message-2.outputs.slack-result }}' 40 | 41 | - name: Send Slack Message 3/3 42 | uses: archive/github-actions-slack@master 43 | id: send-message-3 44 | with: 45 | slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }} 46 | slack-channel: C036UR2P5BM 47 | slack-text: "${{ format('{0}\n\n```{1}```', 'Test 8 - 3/3', toJson(runner)) }}" 48 | 49 | - name: Result from "Send Slack Message" 50 | run: echo '${{ steps.send-message-3.outputs.slack-result }}' 51 | -------------------------------------------------------------------------------- /.github/workflows/9-slack-update-message-line-breaks.yml: -------------------------------------------------------------------------------- 1 | name: test-9-slack-update-message-line-breaks 2 | 3 | on: [push] 4 | 5 | jobs: 6 | slack-action: 7 | #if: ${{ false }} 8 | runs-on: ubuntu-latest 9 | name: Test 9 [ubuntu-latest] 10 | 11 | steps: 12 | - name: Send Slack Message 13 | uses: archive/github-actions-slack@master 14 | id: send-message-1 15 | 16 | with: 17 | slack-function: send-message 18 | slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }} 19 | slack-channel: C036UR2SJ91 20 | slack-text: Test 9 - 1/2 - Message to update 21 | 22 | - name: Send Slack Message Result 23 | run: echo 'Data - ${{ steps.send-message-1.outputs.slack-result }}' 24 | 25 | - name: Send Slack Reaction To Message 26 | uses: archive/github-actions-slack@master 27 | with: 28 | slack-function: update-message 29 | slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }} 30 | slack-channel: ${{ fromJson(steps.send-message-1.outputs.slack-result).response.channel }} 31 | slack-update-message-ts: ${{ fromJson(steps.send-message-1.outputs.slack-result).response.message.ts }} 32 | slack-update-message-text: | 33 | Test 9.1 - 1/2 34 | 35 | Message to update 36 | 37 | Updated! 38 | 39 | - name: Send Slack Reaction To Message Result 40 | run: echo 'Data - ${{ steps.send-message-1.outputs.slack-result }}' 41 | 42 | - name: Send Slack Message 43 | uses: archive/github-actions-slack@master 44 | id: send-message-2 45 | 46 | with: 47 | slack-function: send-message 48 | slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }} 49 | slack-channel: C036UR2SJ91 50 | slack-text: Test 9 - 2/2 - Message to update 51 | 52 | - name: Send Slack Message Result 53 | run: echo 'Data - ${{ steps.send-message-2.outputs.slack-result }}' 54 | 55 | - name: Some step in between 56 | run: echo '...' 57 | 58 | - name: Send Slack Reaction To Message 59 | uses: archive/github-actions-slack@master 60 | with: 61 | slack-function: update-message 62 | slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }} 63 | slack-channel: ${{ fromJson(steps.send-message-2.outputs.slack-result).response.channel }} 64 | slack-update-message-ts: ${{ fromJson(steps.send-message-2.outputs.slack-result).response.message.ts }} 65 | slack-update-message-text: "${{ format('{0}\n\n{1}', 'Test 9.1 - 2/2', toJson(runner)) }}" 66 | 67 | - name: Send Slack Reaction To Message Result 68 | run: echo 'Data - ${{ steps.send-message-2.outputs.slack-result }}' 69 | -------------------------------------------------------------------------------- /integration-test/end-to-end.js: -------------------------------------------------------------------------------- 1 | const assert = require("assert"); 2 | 3 | const { 4 | apiPostMessage, 5 | apiAddReaction, 6 | apiUpdateMessage, 7 | } = require("../src/integration/slack-api"); 8 | const buildMessage = require("../src/message/build-message"); 9 | const buildReaction = require("../src/reaction/build-reaction"); 10 | const buildUpdateMessage = require("../src/update-message/build-update-message"); 11 | 12 | const testSendMessage = async (channel, token, text, optional = {}) => { 13 | const message = buildMessage(channel, text, null, { 14 | icon_emoji: ":fire:", 15 | ...optional, 16 | }); 17 | const result = await apiPostMessage(token, message); 18 | assert.strictEqual(result.statusCode, 200); 19 | 20 | return result; 21 | }; 22 | 23 | const testSendReaction = async (channel, token) => { 24 | const message = buildMessage(channel, "Test 2 - testSendReaction 🤓", null, { 25 | icon_emoji: ":fire:", 26 | }); 27 | const messageToReactTo = await apiPostMessage(token, message); 28 | 29 | const reaction = buildReaction( 30 | process.env.CHANNEL, 31 | "thumbsup", 32 | messageToReactTo.response.message.ts 33 | ); 34 | const result = await apiAddReaction(token, reaction); 35 | assert.strictEqual(result.statusCode, 200); 36 | 37 | return result; 38 | }; 39 | 40 | const testSendThread = async (channel, token) => { 41 | const messageToThreadTo = await testSendMessage( 42 | channel, 43 | token, 44 | "Test 3 - testSendThread" 45 | ); 46 | 47 | const result = await testSendMessage( 48 | channel, 49 | token, 50 | "Test 3 - Reply testSendThread", 51 | { thread_ts: messageToThreadTo.response.message.ts } 52 | ); 53 | assert.strictEqual(result.statusCode, 200); 54 | 55 | return result; 56 | }; 57 | 58 | const testUpdateMessage = async (channel, token) => { 59 | const messageToUpdate = await testSendMessage( 60 | channel, 61 | token, 62 | "Test 4 - testUpdateMessage" 63 | ); 64 | 65 | const message = buildUpdateMessage( 66 | process.env.CHANNEL, 67 | "Test 4 - testUpdateMessage - Updated!", 68 | null, 69 | messageToUpdate.response.message.ts 70 | ); 71 | 72 | const result = await apiUpdateMessage(token, message); 73 | assert.strictEqual(result.statusCode, 200); 74 | 75 | return result; 76 | }; 77 | 78 | (async () => { 79 | if (!process.env.BOT_USER_OAUTH_ACCESS_TOKEN || !process.env.CHANNEL) { 80 | console.error("Missing env values"); 81 | return; 82 | } 83 | 84 | console.log("Running Tests"); 85 | 86 | await testSendMessage( 87 | process.env.CHANNEL, 88 | process.env.BOT_USER_OAUTH_ACCESS_TOKEN, 89 | "Test 1 - testSendMessage" 90 | ); 91 | 92 | await testSendReaction( 93 | process.env.CHANNEL, 94 | process.env.BOT_USER_OAUTH_ACCESS_TOKEN 95 | ); 96 | 97 | await testSendThread( 98 | process.env.CHANNEL, 99 | process.env.BOT_USER_OAUTH_ACCESS_TOKEN 100 | ); 101 | 102 | await testUpdateMessage( 103 | process.env.CHANNEL, 104 | process.env.BOT_USER_OAUTH_ACCESS_TOKEN 105 | ); 106 | })(); 107 | -------------------------------------------------------------------------------- /src/message/index.test.js: -------------------------------------------------------------------------------- 1 | test("message with required (token, channel and text)", async () => { 2 | mockSlackArguments({ 3 | "slack-bot-user-oauth-access-token": "some-token", 4 | "slack-channel": "some-channel", 5 | "slack-text": "some-text", 6 | }); 7 | 8 | const mockApi = mockIntegrationFns(); 9 | 10 | const { postMessage } = require("./index"); 11 | await postMessage(); 12 | 13 | const requestPayload = mockApi.getApiPostMessagePayload(); 14 | 15 | expect(requestPayload.channel).toBe("some-channel"); 16 | expect(requestPayload.text).toBe("some-text"); 17 | }); 18 | 19 | test("message with optional", async () => { 20 | mockSlackArguments( 21 | { 22 | "slack-bot-user-oauth-access-token": "some-token", 23 | "slack-channel": "some-channel", 24 | "slack-text": "some-text", 25 | }, 26 | { 27 | "INPUT_SLACK-OPTIONAL-ICON_EMOJI": ":some-emoji:", 28 | "INPUT_SLACK-OPTIONAL-ICON_URL": "https://", 29 | } 30 | ); 31 | 32 | const mockApi = mockIntegrationFns(); 33 | 34 | const { postMessage } = require("./index"); 35 | await postMessage(); 36 | 37 | const requestPayload = mockApi.getApiPostMessagePayload(); 38 | expect(requestPayload.icon_emoji).toBe(":some-emoji:"); 39 | expect(requestPayload.icon_url).toBe("https://"); 40 | }); 41 | 42 | test("message ignore empty optionals", async () => { 43 | mockSlackArguments( 44 | { 45 | "slack-bot-user-oauth-access-token": "some-token", 46 | "slack-channel": "some-channel", 47 | "slack-text": "some-text", 48 | }, 49 | { 50 | "INPUT_SLACK-OPTIONAL-ICON_EMOJI": "", 51 | "INPUT_SLACK-OPTIONAL-ICON_URL": "", 52 | } 53 | ); 54 | 55 | const mockApi = mockIntegrationFns(); 56 | 57 | const { postMessage } = require("./index"); 58 | await postMessage(); 59 | 60 | const requestPayload = mockApi.getApiPostMessagePayload(); 61 | expect(requestPayload.icon_emoji).not.toBeDefined(); 62 | expect(requestPayload.icon_url).not.toBeDefined(); 63 | }); 64 | 65 | const mockSlackArguments = (mockRequired, mockEnv = []) => { 66 | jest.mock("../context", () => ({ 67 | getRequired: function (key) { 68 | return mockRequired[key]; 69 | }, 70 | getOptional: function (key) { 71 | return mockRequired[key]; 72 | }, 73 | getEnv: function () { 74 | return mockEnv; 75 | }, 76 | setOutput: function () { 77 | //console.debug("Test setOutput: " + arguments); 78 | }, 79 | setFailed: function (ex) { 80 | console.error("Test setFailed: " + ex); 81 | }, 82 | debug: function (ex) { 83 | //console.debug("Test debug: " + ex); 84 | }, 85 | debugExtra: function (ex) { 86 | //console.debug("Test debugExtra: " + ex); 87 | }, 88 | info: function (ex) { 89 | //console.info("Test info: " + ex); 90 | }, 91 | warning: function (ex) { 92 | console.warn("Test warning: " + ex); 93 | }, 94 | })); 95 | }; 96 | 97 | const mockIntegrationFns = () => { 98 | const mockFns = { 99 | apiPostMessage: jest.fn(), 100 | apiAddReaction: jest.fn(), 101 | apiUpdateMessage: jest.fn(), 102 | }; 103 | 104 | jest.mock("../integration/slack-api", () => mockFns); 105 | 106 | function getApiPostMessagePayload() { 107 | return mockFns.apiPostMessage.mock.calls[0][1]; 108 | } 109 | 110 | return { 111 | getApiPostMessagePayload, 112 | }; 113 | }; 114 | -------------------------------------------------------------------------------- /action.yml: -------------------------------------------------------------------------------- 1 | name: "💬 Send Message to Slack 🚀" 2 | description: "From Github Action to Slack. Easy to use. Supports Slack's optional arguments. Pure JavaScript = Fast." 3 | branding: 4 | icon: "message-circle" 5 | color: "orange" 6 | inputs: 7 | slack-bot-user-oauth-access-token: 8 | description: "Bot User OAuth Access Token" 9 | required: true 10 | slack-channel: 11 | description: "Channel" 12 | required: true 13 | slack-text: 14 | description: "Text" 15 | required: false 16 | slack-blocks: 17 | description: "Blocks" 18 | required: false 19 | #slack-optional-as_user: - THIS HAS BEEN DEPRECATED BY SLACK - https://twitter.com/SlackAPI/status/1288171767887024130 20 | # description: "https://api.slack.com/methods/chat.postMessage#arg_as_user" 21 | # required: false 22 | slack-optional-attachments: 23 | description: "https://api.slack.com/methods/chat.postMessage#arg_attachments" 24 | required: false 25 | slack-optional-blocks: 26 | description: "https://api.slack.com/methods/chat.postMessage#arg_blocks" 27 | required: false 28 | slack-optional-icon_emoji: 29 | description: "https://api.slack.com/methods/chat.postMessage#arg_icon_emoji" 30 | required: false 31 | slack-optional-icon_url: 32 | description: "https://api.slack.com/methods/chat.postMessage#arg_icon_url" 33 | required: false 34 | slack-optional-link_names: 35 | description: "https://api.slack.com/methods/chat.postMessage#arg_link_names" 36 | required: false 37 | slack-optional-mrkdwn: 38 | description: "https://api.slack.com/methods/chat.postMessage#arg_mrkdwn" 39 | required: false 40 | slack-optional-parse: 41 | description: "https://api.slack.com/methods/chat.postMessage#arg_parse" 42 | required: false 43 | slack-optional-reply_broadcast: 44 | description: "https://api.slack.com/methods/chat.postMessage#arg_reply_broadcast" 45 | required: false 46 | slack-optional-thread_ts: 47 | description: "https://api.slack.com/methods/chat.postMessage#arg_thread_ts" 48 | required: false 49 | slack-optional-unfurl_links: 50 | description: "https://api.slack.com/methods/chat.postMessage#arg_unfurl_links" 51 | required: false 52 | slack-optional-unfurl_media: 53 | description: "https://api.slack.com/methods/chat.postMessage#arg_unfurl_media" 54 | required: false 55 | slack-optional-username: 56 | description: "https://api.slack.com/methods/chat.postMessage#arg_username" 57 | required: false 58 | slack-function: 59 | description: send-message (https://api.slack.com/methods/chat.postMessage) or send-reaction (https://api.slack.com/methods/reactions.add) or update-message (https://api.slack.com/methods/chat.update) 60 | required: false 61 | slack-emoji-name: 62 | description: "https://api.slack.com/methods/reactions.add#arg_name" 63 | required: false 64 | slack-message-timestamp: 65 | description: https://api.slack.com/methods/reactions.add#arg_timestamp" 66 | required: false 67 | slack-update-message-ts: 68 | description: https://api.slack.com/methods/chat.update#ts 69 | required: false 70 | slack-update-message-text: 71 | description: https://api.slack.com/methods/chat.update#text 72 | required: false 73 | slack-update-message-blocks: 74 | description: https://api.slack.com/methods/chat.update#blocks 75 | required: false 76 | 77 | outputs: 78 | slack-result: 79 | description: "The result from the post to slack" 80 | runs: 81 | using: "node20" 82 | main: "dist/index.js" 83 | -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | // For a detailed explanation regarding each configuration property, visit: 2 | // https://jestjs.io/docs/en/configuration.html 3 | 4 | module.exports = { 5 | // All imported modules in your tests should be mocked automatically 6 | // automock: false, 7 | 8 | // Stop running tests after `n` failures 9 | // bail: 0, 10 | 11 | // Respect "browser" field in package.json when resolving modules 12 | // browser: false, 13 | 14 | // The directory where Jest should store its cached dependency information 15 | // cacheDirectory: "/private/var/folders/6r/cftfr8t1511_j9km4pbcxqfr0000gq/T/jest_dz", 16 | 17 | // Automatically clear mock calls and instances between every test 18 | clearMocks: true, 19 | 20 | // Indicates whether the coverage information should be collected while executing the test 21 | // collectCoverage: false, 22 | 23 | // An array of glob patterns indicating a set of files for which coverage information should be collected 24 | // collectCoverageFrom: null, 25 | 26 | // The directory where Jest should output its coverage files 27 | coverageDirectory: "coverage", 28 | 29 | // An array of regexp pattern strings used to skip coverage collection 30 | // coveragePathIgnorePatterns: [ 31 | // "/node_modules/" 32 | // ], 33 | 34 | // A list of reporter names that Jest uses when writing coverage reports 35 | // coverageReporters: [ 36 | // "json", 37 | // "text", 38 | // "lcov", 39 | // "clover" 40 | // ], 41 | 42 | // An object that configures minimum threshold enforcement for coverage results 43 | // coverageThreshold: null, 44 | 45 | // A path to a custom dependency extractor 46 | // dependencyExtractor: null, 47 | 48 | // Make calling deprecated APIs throw helpful error messages 49 | // errorOnDeprecated: false, 50 | 51 | // Force coverage collection from ignored files using an array of glob patterns 52 | // forceCoverageMatch: [], 53 | 54 | // A path to a module which exports an async function that is triggered once before all test suites 55 | // globalSetup: null, 56 | 57 | // A path to a module which exports an async function that is triggered once after all test suites 58 | // globalTeardown: null, 59 | 60 | // A set of global variables that need to be available in all test environments 61 | // globals: {}, 62 | 63 | // The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers. 64 | // maxWorkers: "50%", 65 | 66 | // An array of directory names to be searched recursively up from the requiring module's location 67 | // moduleDirectories: [ 68 | // "node_modules" 69 | // ], 70 | 71 | // An array of file extensions your modules use 72 | // moduleFileExtensions: [ 73 | // "js", 74 | // "json", 75 | // "jsx", 76 | // "ts", 77 | // "tsx", 78 | // "node" 79 | // ], 80 | 81 | // A map from regular expressions to module names that allow to stub out resources with a single module 82 | // moduleNameMapper: {}, 83 | 84 | // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader 85 | // modulePathIgnorePatterns: [], 86 | 87 | // Activates notifications for test results 88 | // notify: false, 89 | 90 | // An enum that specifies notification mode. Requires { notify: true } 91 | // notifyMode: "failure-change", 92 | 93 | // A preset that is used as a base for Jest's configuration 94 | // preset: null, 95 | 96 | // Run tests from one or more projects 97 | // projects: null, 98 | 99 | // Use this configuration option to add custom reporters to Jest 100 | // reporters: undefined, 101 | 102 | // Automatically reset mock state between every test 103 | resetMocks: true, 104 | 105 | // Reset the module registry before running each individual test 106 | resetModules: true, 107 | 108 | // A path to a custom resolver 109 | // resolver: null, 110 | 111 | // Automatically restore mock state between every test 112 | //restoreMocks: true, 113 | 114 | // The root directory that Jest should scan for tests and modules within 115 | // rootDir: null, 116 | 117 | // A list of paths to directories that Jest should use to search for files in 118 | // roots: [ 119 | // "" 120 | // ], 121 | 122 | // Allows you to use a custom runner instead of Jest's default test runner 123 | // runner: "jest-runner", 124 | 125 | // The paths to modules that run some code to configure or set up the testing environment before each test 126 | // setupFiles: [], 127 | 128 | // A list of paths to modules that run some code to configure or set up the testing framework before each test 129 | // setupFilesAfterEnv: [], 130 | 131 | // A list of paths to snapshot serializer modules Jest should use for snapshot testing 132 | // snapshotSerializers: [], 133 | 134 | // The test environment that will be used for testing 135 | testEnvironment: "node", 136 | 137 | // Options that will be passed to the testEnvironment 138 | // testEnvironmentOptions: {}, 139 | 140 | // Adds a location field to test results 141 | // testLocationInResults: false, 142 | 143 | // The glob patterns Jest uses to detect test files 144 | // testMatch: [ 145 | // "**/__tests__/**/*.[jt]s?(x)", 146 | // "**/?(*.)+(spec|test).[tj]s?(x)" 147 | // ], 148 | 149 | // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped 150 | // testPathIgnorePatterns: [ 151 | // "/node_modules/" 152 | // ], 153 | 154 | // The regexp pattern or array of patterns that Jest uses to detect test files 155 | // testRegex: [], 156 | 157 | // This option allows the use of a custom results processor 158 | // testResultsProcessor: null, 159 | 160 | // This option allows use of a custom test runner 161 | // testRunner: "jasmine2", 162 | 163 | // This option sets the URL for the jsdom environment. It is reflected in properties such as location.href 164 | // testURL: "http://localhost", 165 | 166 | // Setting this value to "fake" allows the use of fake timers for functions such as "setTimeout" 167 | // timers: "real", 168 | 169 | // A map from regular expressions to paths to transformers 170 | // transform: null, 171 | 172 | // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation 173 | // transformIgnorePatterns: [ 174 | // "/node_modules/" 175 | // ], 176 | 177 | // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them 178 | // unmockedModulePathPatterns: undefined, 179 | 180 | // Indicates whether each individual test should be reported during the run 181 | verbose: true, 182 | 183 | // An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode 184 | // watchPathIgnorePatterns: [], 185 | 186 | // Whether to use watchman for file crawling 187 | // watchman: true, 188 | }; 189 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Github Action for sending message (and reactions/threads/update/blocks) to Slack 2 | 3 | — With support for Slack's optional arguments 4 | 5 | ![](https://img.shields.io/github/release/archive/github-actions-slack/all.svg) 6 | ![](https://snyk.io/test/github/archive/github-actions-slack/badge.svg) 7 | 8 | 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. 9 | 10 | The goal is to have zero npm/yarn dependencies except the two from Github that is required for an action to work (@actions/core & @actions/github). 11 | 12 | ![Slack result](./images/slack-result.png "Slack result") 13 | 14 | This action is just an HTTPS call to Slack API, so you can easily build this by yourself, or use this action or any one of the hundred other Slack actions available. 15 | 16 | ## Requirements 17 | 18 | 1. Slack Workspace and Channel(s) 19 | 1. A Slack App and Bot - the App and Bot will be used to send messages to your channel. It sounds hard, but it's not :) 20 | 1. A Github Action - the place where you wants to send Slack messages 21 | 1. Github Secret - the Slack Bot auth token, used when posting messages to Slack API 22 | 23 | ## Important 24 | 25 | With the latest changes to Slack API, please use channel id instead of channel name. E.g. use `CPPUV5KU0` instead of `test` (You can find the ID in the API calls or https://stackoverflow.com/questions/40940327/what-is-the-simplest-way-to-find-a-slack-team-id-and-a-channel-id) 26 | 27 | ## Setup 28 | 29 | This action supports: 30 | 31 | - 1. Send messages
32 | 33 | 34 | - 2. Send thread response to message
35 | 36 | 37 | - 3. Send reaction on sent messages
38 | 39 | 40 | ## 1. Send messages to Slack 41 | 42 | **Required: Github Repository Secret:** 43 | 44 | - `SLACK_BOT_USER_OAUTH_ACCESS_TOKEN` - This is the Slack App token, the credentials for allowing you to send messages from github to Slack 45 | 46 | **Required: Github Action Parameters:** 47 | 48 | - `slack-bot-user-oauth-access-token` - `SLACK_BOT_USER_OAUTH_ACCESS_TOKEN` secret 49 | 50 | - `slack-channel` - The channel/channels where you want the message (comma separated) 51 | 52 | - `slack-text` - The text of the message (or use `slack-optional-blocks`) 53 | 54 | **Optional: Github Action Parameters:** 55 | 56 | All the optional parameters that Slack supports, can be sent via the `slack-optional-xxx` parameter. 57 | 58 | | Slack parameter name | Yaml parameter name | 59 | | -------------------- | --------------------------- | 60 | | `icon_emoji` | `slack-optional-icon_emoji` | 61 | | `link_names` | `slack-optional-link_names` | 62 | 63 | and so forth. 64 | 65 | Please see Slack API documentation for all available optional parameters: https://api.slack.com/methods/chat.postMessage 66 | 67 | **Result / return value** 68 | 69 | - `slack-result` (.outputs.slack-result) - Contains the result of the sent message. This can be used for following steps like sending a reaction 70 | 71 | Sample `slack-result`: 72 | 73 | ``` 74 | { 75 | "statusCode": 200, 76 | "statusMessage": "OK", 77 | "ok": true, 78 | "result": "", 79 | "response": { 80 | "ok": true, 81 | "channel": "XXXX", 82 | "ts": "1612623790.009600", 83 | "message": { 84 | "type": "message", 85 | "subtype": "bot_message", 86 | "text": "Lipsum", 87 | "ts": "1612623790.009600", 88 | "username": "Lipsum", 89 | "bot_id": "XXXX" 90 | } 91 | } 92 | } 93 | ``` 94 | 95 | If you want to output or debug the result, add: 96 | 97 | ``` 98 | - name: Send Slack Message Result 99 | run: echo "${{ steps.send-message.outputs.slack-result }}" 100 | ``` 101 | 102 | - `slack-results` (.outputs.slack-results) - Contains an array of all the results when sending to multiple channels. This can be used for following steps like sending a reaction. See [.github/workflows/7-slack-notification-multi-channel.yml](.github/workflows/7-slack-notification-multi-channel.yml) 103 | 104 | ### Sample Action file with Slack Channel and Text 105 | 106 | [.github/workflows/2-slack-notification.yml](.github/workflows/2-slack-notification.yml) 107 | 108 | This will send a Slack message every time someone push, creates pull request or create an issue 109 | 110 | ``` 111 | name: slack-notification 112 | 113 | on: [push, pull_request, issues] 114 | 115 | jobs: 116 | slack-notifications: 117 | runs-on: ubuntu-20.04 118 | name: Sends a message to Slack when a push, a pull request or an issue is made 119 | steps: 120 | - name: Send message to Slack API 121 | uses: archive/github-actions-slack@v2.0.0 122 | id: notify 123 | with: 124 | slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }} 125 | slack-channel: CPPUV5KU0 126 | slack-text: Hello! Event "${{ github.event_name }}" in "${{ github.repository }}" 🤓 127 | - name: Result from "Send Message" 128 | run: echo "The result was ${{ steps.notify.outputs.slack-result }}" 129 | ``` 130 | 131 | ![Slack result](./images/slack-result.png "Slack result") 132 | 133 | ### Sample Action file with Slack optional parameters 134 | 135 | [.github/workflows/2-slack-notification.yml](.github/workflows/2-slack-notification.yml) 136 | 137 | ``` 138 | name: slack-notification-with-optional-parameters 139 | 140 | on: [push, pull_request, issues] 141 | 142 | jobs: 143 | slack-notification-with-optional-parameters: 144 | runs-on: ubuntu-20.04 145 | name: Sends a message to Slack when a push, a pull request or an issue is made 146 | steps: 147 | - name: Send message to Slack API 148 | uses: archive/github-actions-slack@v2.0.0 149 | id: notify 150 | with: 151 | slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }} 152 | slack-channel: CPPUV5KU0 #USE CHANNEL ID, NOT CHANNEL NAME, SINCE ID IS USED IN NEW SLACK API's 153 | slack-text: Hello! Something is burning! Or not... 154 | slack-optional-icon_emoji: ":fire:" 155 | - name: Result from "Send Message" 156 | run: echo "The result was ${{ steps.notify.outputs.slack-result }}" 157 | ``` 158 | 159 | ![Slack result](./images/slack-result-optional.png "Slack result") 160 | 161 | ## 2. Send thread response to message to Slack 162 | 163 | To send a thread response you have the same setup as for sending a message, but you add some extra optional parameters: 164 | 165 | - `slack-optional-thread_ts` - The timestamp of the message you want to reply/send thread to. You can find the timestamp in the response payload after sending a message 166 | 167 | - `slack-optional-reply_broadcast` - To broadcast thread reply in channel 168 | 169 | ### Sample Action file 170 | 171 | [.github/workflows/4-slack-thread.yml](.github/workflows/4-slack-thread.yml) 172 | 173 | See `Send Thread Message` part below: 174 | 175 | ``` 176 | name: slack-thread 177 | 178 | on: [push, issues] 179 | 180 | jobs: 181 | slack-thread: 182 | runs-on: ubuntu-20.04 183 | name: Sends a message to Slack when a push, a pull request or an issue is made 184 | 185 | steps: 186 | - name: Send Slack Message 187 | uses: archive/github-actions-slack@master 188 | id: send-message 189 | 190 | with: 191 | slack-function: send-message 192 | slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }} 193 | slack-channel: CPPUV5KU0 194 | slack-text: This is a message 195 | 196 | - name: Send "Slack Message" Result 197 | run: echo "Data - ${{ steps.send-message.outputs.slack-result }}" 198 | 199 | - name: Some step in between 200 | run: echo "..." 201 | 202 | - name: Send Thread Message 203 | uses: archive/github-actions-slack@master 204 | with: 205 | slack-function: send-message 206 | slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }} 207 | slack-channel: ${{ fromJson(steps.send-message.outputs.slack-result).response.channel }} 208 | slack-text: This is a thread reply 209 | slack-optional-thread_ts: ${{ fromJson(steps.send-message.outputs.slack-result).response.message.ts }} 210 | #slack-optional-reply_broadcast: true # To broadcast thread reply in channel 211 | 212 | - name: Send "Send Thread Message" Result 213 | run: echo "Data - ${{ steps.send-message.outputs.slack-result }}" 214 | 215 | ``` 216 | 217 | ![Slack result](./images/thread.png "Slack result") 218 | 219 | ## 3. Send reaction on sent messages to Slack 220 | 221 | **Required: Github Repository Secret:** 222 | 223 | - `SLACK_BOT_USER_OAUTH_ACCESS_TOKEN` - This is the Slack App token, the credentials for allowing you to send messages from github to Slack 224 | 225 | **Required: Github Action Parameters:** 226 | 227 | - `slack-bot-user-oauth-access-token` - `SLACK_BOT_USER_OAUTH_ACCESS_TOKEN` secret 228 | 229 | - `slack-channel` - The channel where you want the message. You can find the channel id in the response payload after sending a message 230 | 231 | - `slack-emoji-name` - The name of the emoji to send (e.g. "fire"/"thumbsup") 232 | 233 | - `slack-message-timestamp` - The unique ts/timestamp of the message you want to react to. You can find the timestamp in the response payload after sending a message 234 | 235 | **Result / return value** 236 | 237 | - `slack-result` (.outputs.slack-result) - Contains the result of the sent reaction 238 | 239 | ### Sample Action file with Slack Channel and Text 240 | 241 | [.github/workflows/3-slack-reaction.yml](.github/workflows/3-slack-reaction.yml) 242 | 243 | This will send a Slack message every time someone push, creates pull request or create an issue, and then, create a reaction to it 244 | 245 | ``` 246 | name: slack-reaction 247 | 248 | on: [push, issues] 249 | 250 | jobs: 251 | slack-reaction: 252 | runs-on: ubuntu-20.04 253 | name: Sends a message to Slack when a push, a pull request or an issue is made 254 | 255 | steps: 256 | - name: Send Slack Message 257 | uses: archive/github-actions-slack@v2.0.0 258 | id: send-message 259 | 260 | with: 261 | slack-function: send-message 262 | slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }} 263 | slack-channel: CPPUV5KU0 264 | slack-text: Time to react... 265 | 266 | - name: Send Slack Message Result 267 | run: echo "Data - ${{ steps.send-message.outputs.slack-result }}" 268 | 269 | - name: Some step in between 270 | run: echo "..." 271 | 272 | - name: Send Slack Reaction To Message 273 | uses: archive/github-actions-slack@v2.0.0 274 | with: 275 | slack-function: send-reaction 276 | slack-bot-user-oauth-access-token: ${{ secrets.SLACK_BOT_USER_OAUTH_ACCESS_TOKEN }} 277 | slack-channel: ${{ fromJson(steps.send-message.outputs.slack-result).response.channel }} 278 | slack-emoji-name: thumbsup 279 | slack-message-timestamp: ${{ fromJson(steps.send-message.outputs.slack-result).response.message.ts }} 280 | 281 | - name: Send Slack Reaction To Message Result 282 | run: echo "Data - ${{ steps.send-message.outputs.slack-result }}" 283 | ``` 284 | 285 | ![Slack result](./images/reaction.png "Slack result") 286 | 287 | ## 4. Update message 288 | 289 | Similar to Add Reaction, but with text instead. 290 | 291 | Please see [.github/workflows/5-slack-update-message.yml](.github/workflows/5-slack-update-message.yml) 292 | 293 | ## 5. Using blocks 294 | 295 | With blocks you can create more rich and complex messages / message layouts: https://api.slack.com/messaging/composing/layouts 296 | 297 | ![image](https://user-images.githubusercontent.com/351045/195956018-11f1d646-f9cb-4c67-8bf6-bb413eecc2be.png) 298 | 299 | For some examples, please see: 300 | 301 | - [.github/workflows/11-slack-message-blocks.yml](.github/workflows/11-slack-message-blocks.yml) 302 | - [.github/workflows/12-slack-message-blocks-update.yml](.github/workflows/12-slack-message-blocks-update.yml) 303 | 304 | ## How to setup your first Github Action in your repository that will call this Action 305 | 306 | ### 1. Create a Slack bot 307 | 308 | Follow this guide on how to create a Slack App and Bot for your workspace: 309 | 310 | - https://slack.com/intl/en-se/help/articles/115005265703-create-a-bot-for-your-workspace 311 | 312 | You should: 313 | 314 | 1. Create a new Slack App, https://api.slack.com/apps?new_app=1 315 | 1. Go to "Basic Information" > "Display Information" > "App icon & Preview" and add avatar for you App. This will be shown in Slack when you receive messages 316 | 1. Go to "Bot User" > "Add" and add a bot user to your Slack App 317 | 1. Go to "Install App" > "Install App to Workspace" to install your Slack App into your Slack workspace 318 | 1. Done 319 | 320 | ### 2. Save Bot Access Token on Github 321 | 322 | To be able to send messages to slack, the Action needs the Auth Token for the Slack App. Since the Auth Token is sensitive information, you should NOT place it in the yaml file of the Action, but instead in the Github Secrets area. 323 | 324 | 1. Go to your App on Slack, https://api.slack.com/apps/ 325 | 1. Go to "OAuth & Permissions" > "Bot User OAuth Access Token" 326 | 1. Copy the `Bot User OAuth Access Token` 327 | 1. Go to your Github Repo 328 | 1. Go to "Settings" > "Secrets" for the repo 329 | 1. Create a new secret called `SLACK_BOT_USER_OAUTH_ACCESS_TOKEN` with the value from `Bot User OAuth Access Token` 330 | 1. Done 331 | 332 | ### 2. Create a new Github Action 333 | 334 | 1. Go to your github repo 335 | 1. Go to actions 336 | 1. Create a new one, you can use the samples above 337 | 338 | ## Q&A 339 | 340 | ### EULA, License and Privacy Policy 341 | Please see `LICENSE.md` and `Privacy Policy`. 342 | 343 | ### It's not working 344 | 345 | Please look at the individual steps on your Github Action. Maybe you have forgotten to set Channel or Token: 346 | 347 | ![Sample Error](./images/sample-error.png "Sample Error") 348 | 349 | To debug action and see what payload is being sent to slack, enable debugging: https://docs.github.com/en/actions/configuring-and-managing-workflows/managing-a-workflow-run#enabling-debug-logging (`ACTIONS_RUNNER_DEBUG=true` and `ACTIONS_STEP_DEBUG=true` under `Settings > Secrets`) 350 | 351 | ### What information about the repo etc is available? 352 | 353 | You can easily print everything you have while running the action. It can be a good way to see what you can send to Slack. 354 | 355 | ``` 356 | on: push 357 | 358 | jobs: 359 | one: 360 | runs-on: ubuntu-20.04 361 | steps: 362 | - name: Dump GitHub context 363 | env: 364 | GITHUB_CONTEXT: ${{ toJson(github) }} 365 | run: echo "$GITHUB_CONTEXT" 366 | - name: Dump job context 367 | env: 368 | JOB_CONTEXT: ${{ toJson(job) }} 369 | run: echo "$JOB_CONTEXT" 370 | - name: Dump steps context 371 | env: 372 | STEPS_CONTEXT: ${{ toJson(steps) }} 373 | run: echo "$STEPS_CONTEXT" 374 | - name: Dump runner context 375 | env: 376 | RUNNER_CONTEXT: ${{ toJson(runner) }} 377 | run: echo "$RUNNER_CONTEXT" 378 | - name: Dump strategy context 379 | env: 380 | STRATEGY_CONTEXT: ${{ toJson(strategy) }} 381 | run: echo "$STRATEGY_CONTEXT" 382 | - name: Dump matrix context 383 | env: 384 | MATRIX_CONTEXT: ${{ toJson(matrix) }} 385 | run: echo "$MATRIX_CONTEXT" 386 | ``` 387 | 388 | From: https://help.github.com/en/github/automating-your-workflow-with-github-actions/contexts-and-expression-syntax-for-github-actions 389 | 390 | ### Why JavaScript and not Shell/etc? 391 | 392 | _"JavaScript actions can run directly on any of the GitHub-hosted virtual machines, and separate the action code from the environment used to run the code. Using a JavaScript action simplifies the action code and executes faster than a Docker container action."_ 393 | (https://help.github.com/en/github/automating-your-workflow-with-github-actions/about-actions) 394 | 395 | ### How does the Action JavaScript code work 396 | 397 | It's simple, it just takes all the parameters and does an HTTPS POST to api.slack.com. 398 | 399 | ### I want another avatar to be used in Slack 400 | 401 | By default the avatar in Slack will be the same as for the Slack App you created. If you want to change this based on action, look at the https://api.slack.com/methods/chat.postMessage `icon_emoji` parameter. 402 | 403 | ### Why did you build your own? 404 | 405 | It was a good way to learn more about Github Actions 406 | 407 | ### Why should I use this? 408 | 409 | This action is just an HTTPS POST to Slack API, so you can easily build this by yourself, or use this, or use any other action available on the marketplace :) 410 | 411 | ## Development and testing 412 | 413 | See package.json for `yarn lint`, `yarn test`, etc. 414 | 415 | Remember to create the dist with `yarn build`. 416 | 417 | To run local integration test (from this repository): 418 | 419 | ``` 420 | env BOT_USER_OAUTH_ACCESS_TOKEN= CHANNEL= node integration-test/end-to-end.js 421 | ``` 422 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@actions/core@^1.11.1": 6 | version "1.11.1" 7 | resolved "https://registry.yarnpkg.com/@actions/core/-/core-1.11.1.tgz#ae683aac5112438021588030efb53b1adb86f172" 8 | integrity sha512-hXJCSrkwfA46Vd9Z3q4cpEpHB1rL5NG04+/rbqW9d3+CSvtB1tYe8UTpAlixa1vj0m/ULglfEK2UKxMGxCxv5A== 9 | dependencies: 10 | "@actions/exec" "^1.1.1" 11 | "@actions/http-client" "^2.0.1" 12 | 13 | "@actions/exec@^1.1.1": 14 | version "1.1.1" 15 | resolved "https://registry.yarnpkg.com/@actions/exec/-/exec-1.1.1.tgz#2e43f28c54022537172819a7cf886c844221a611" 16 | integrity sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w== 17 | dependencies: 18 | "@actions/io" "^1.0.1" 19 | 20 | "@actions/github@^6.0.0": 21 | version "6.0.0" 22 | resolved "https://registry.yarnpkg.com/@actions/github/-/github-6.0.0.tgz#65883433f9d81521b782a64cc1fd45eef2191ea7" 23 | integrity sha512-alScpSVnYmjNEXboZjarjukQEzgCRmjMv6Xj47fsdnqGS73bjJNDpiiXmp8jr0UZLdUB6d9jW63IcmddUP+l0g== 24 | dependencies: 25 | "@actions/http-client" "^2.2.0" 26 | "@octokit/core" "^5.0.1" 27 | "@octokit/plugin-paginate-rest" "^9.0.0" 28 | "@octokit/plugin-rest-endpoint-methods" "^10.0.0" 29 | 30 | "@actions/http-client@^2.0.1", "@actions/http-client@^2.2.0": 31 | version "2.2.3" 32 | resolved "https://registry.yarnpkg.com/@actions/http-client/-/http-client-2.2.3.tgz#31fc0b25c0e665754ed39a9f19a8611fc6dab674" 33 | integrity sha512-mx8hyJi/hjFvbPokCg4uRd4ZX78t+YyRPtnKWwIl+RzNaVuFpQHfmlGVfsKEJN8LwTCvL+DfVgAM04XaHkm6bA== 34 | dependencies: 35 | tunnel "^0.0.6" 36 | undici "^5.25.4" 37 | 38 | "@actions/io@^1.0.1": 39 | version "1.1.3" 40 | resolved "https://registry.yarnpkg.com/@actions/io/-/io-1.1.3.tgz#4cdb6254da7962b07473ff5c335f3da485d94d71" 41 | integrity sha512-wi9JjgKLYS7U/z8PPbco+PvTb/nRWjeoFlJ1Qer83k/3C5PHQi28hiVdeE2kHXmIL99mQFawx8qt/JPjZilJ8Q== 42 | 43 | "@ampproject/remapping@^2.2.0": 44 | version "2.3.0" 45 | resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" 46 | integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== 47 | dependencies: 48 | "@jridgewell/gen-mapping" "^0.3.5" 49 | "@jridgewell/trace-mapping" "^0.3.24" 50 | 51 | "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.0", "@babel/code-frame@^7.26.2": 52 | version "7.26.2" 53 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" 54 | integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== 55 | dependencies: 56 | "@babel/helper-validator-identifier" "^7.25.9" 57 | js-tokens "^4.0.0" 58 | picocolors "^1.0.0" 59 | 60 | "@babel/compat-data@^7.26.5": 61 | version "7.26.5" 62 | resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.5.tgz#df93ac37f4417854130e21d72c66ff3d4b897fc7" 63 | integrity sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg== 64 | 65 | "@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.23.9": 66 | version "7.26.0" 67 | resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.0.tgz#d78b6023cc8f3114ccf049eb219613f74a747b40" 68 | integrity sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg== 69 | dependencies: 70 | "@ampproject/remapping" "^2.2.0" 71 | "@babel/code-frame" "^7.26.0" 72 | "@babel/generator" "^7.26.0" 73 | "@babel/helper-compilation-targets" "^7.25.9" 74 | "@babel/helper-module-transforms" "^7.26.0" 75 | "@babel/helpers" "^7.26.0" 76 | "@babel/parser" "^7.26.0" 77 | "@babel/template" "^7.25.9" 78 | "@babel/traverse" "^7.25.9" 79 | "@babel/types" "^7.26.0" 80 | convert-source-map "^2.0.0" 81 | debug "^4.1.0" 82 | gensync "^1.0.0-beta.2" 83 | json5 "^2.2.3" 84 | semver "^6.3.1" 85 | 86 | "@babel/generator@^7.26.0", "@babel/generator@^7.26.5", "@babel/generator@^7.7.2": 87 | version "7.26.5" 88 | resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.5.tgz#e44d4ab3176bbcaf78a5725da5f1dc28802a9458" 89 | integrity sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw== 90 | dependencies: 91 | "@babel/parser" "^7.26.5" 92 | "@babel/types" "^7.26.5" 93 | "@jridgewell/gen-mapping" "^0.3.5" 94 | "@jridgewell/trace-mapping" "^0.3.25" 95 | jsesc "^3.0.2" 96 | 97 | "@babel/helper-compilation-targets@^7.25.9": 98 | version "7.26.5" 99 | resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz#75d92bb8d8d51301c0d49e52a65c9a7fe94514d8" 100 | integrity sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA== 101 | dependencies: 102 | "@babel/compat-data" "^7.26.5" 103 | "@babel/helper-validator-option" "^7.25.9" 104 | browserslist "^4.24.0" 105 | lru-cache "^5.1.1" 106 | semver "^6.3.1" 107 | 108 | "@babel/helper-module-imports@^7.25.9": 109 | version "7.25.9" 110 | resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715" 111 | integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== 112 | dependencies: 113 | "@babel/traverse" "^7.25.9" 114 | "@babel/types" "^7.25.9" 115 | 116 | "@babel/helper-module-transforms@^7.26.0": 117 | version "7.26.0" 118 | resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz#8ce54ec9d592695e58d84cd884b7b5c6a2fdeeae" 119 | integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw== 120 | dependencies: 121 | "@babel/helper-module-imports" "^7.25.9" 122 | "@babel/helper-validator-identifier" "^7.25.9" 123 | "@babel/traverse" "^7.25.9" 124 | 125 | "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.8.0": 126 | version "7.26.5" 127 | resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz#18580d00c9934117ad719392c4f6585c9333cc35" 128 | integrity sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg== 129 | 130 | "@babel/helper-string-parser@^7.25.9": 131 | version "7.25.9" 132 | resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" 133 | integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== 134 | 135 | "@babel/helper-validator-identifier@^7.25.9": 136 | version "7.25.9" 137 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" 138 | integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== 139 | 140 | "@babel/helper-validator-option@^7.25.9": 141 | version "7.25.9" 142 | resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" 143 | integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== 144 | 145 | "@babel/helpers@^7.26.0": 146 | version "7.26.0" 147 | resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.26.0.tgz#30e621f1eba5aa45fe6f4868d2e9154d884119a4" 148 | integrity sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw== 149 | dependencies: 150 | "@babel/template" "^7.25.9" 151 | "@babel/types" "^7.26.0" 152 | 153 | "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.9", "@babel/parser@^7.26.0", "@babel/parser@^7.26.5": 154 | version "7.26.5" 155 | resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.5.tgz#6fec9aebddef25ca57a935c86dbb915ae2da3e1f" 156 | integrity sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw== 157 | dependencies: 158 | "@babel/types" "^7.26.5" 159 | 160 | "@babel/plugin-syntax-async-generators@^7.8.4": 161 | version "7.8.4" 162 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d" 163 | integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== 164 | dependencies: 165 | "@babel/helper-plugin-utils" "^7.8.0" 166 | 167 | "@babel/plugin-syntax-bigint@^7.8.3": 168 | version "7.8.3" 169 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea" 170 | integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== 171 | dependencies: 172 | "@babel/helper-plugin-utils" "^7.8.0" 173 | 174 | "@babel/plugin-syntax-class-properties@^7.12.13": 175 | version "7.12.13" 176 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" 177 | integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== 178 | dependencies: 179 | "@babel/helper-plugin-utils" "^7.12.13" 180 | 181 | "@babel/plugin-syntax-class-static-block@^7.14.5": 182 | version "7.14.5" 183 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz#195df89b146b4b78b3bf897fd7a257c84659d406" 184 | integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== 185 | dependencies: 186 | "@babel/helper-plugin-utils" "^7.14.5" 187 | 188 | "@babel/plugin-syntax-import-attributes@^7.24.7": 189 | version "7.26.0" 190 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz#3b1412847699eea739b4f2602c74ce36f6b0b0f7" 191 | integrity sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A== 192 | dependencies: 193 | "@babel/helper-plugin-utils" "^7.25.9" 194 | 195 | "@babel/plugin-syntax-import-meta@^7.10.4": 196 | version "7.10.4" 197 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" 198 | integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== 199 | dependencies: 200 | "@babel/helper-plugin-utils" "^7.10.4" 201 | 202 | "@babel/plugin-syntax-json-strings@^7.8.3": 203 | version "7.8.3" 204 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a" 205 | integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== 206 | dependencies: 207 | "@babel/helper-plugin-utils" "^7.8.0" 208 | 209 | "@babel/plugin-syntax-jsx@^7.7.2": 210 | version "7.25.9" 211 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz#a34313a178ea56f1951599b929c1ceacee719290" 212 | integrity sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA== 213 | dependencies: 214 | "@babel/helper-plugin-utils" "^7.25.9" 215 | 216 | "@babel/plugin-syntax-logical-assignment-operators@^7.10.4": 217 | version "7.10.4" 218 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" 219 | integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== 220 | dependencies: 221 | "@babel/helper-plugin-utils" "^7.10.4" 222 | 223 | "@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": 224 | version "7.8.3" 225 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9" 226 | integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== 227 | dependencies: 228 | "@babel/helper-plugin-utils" "^7.8.0" 229 | 230 | "@babel/plugin-syntax-numeric-separator@^7.10.4": 231 | version "7.10.4" 232 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97" 233 | integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== 234 | dependencies: 235 | "@babel/helper-plugin-utils" "^7.10.4" 236 | 237 | "@babel/plugin-syntax-object-rest-spread@^7.8.3": 238 | version "7.8.3" 239 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" 240 | integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== 241 | dependencies: 242 | "@babel/helper-plugin-utils" "^7.8.0" 243 | 244 | "@babel/plugin-syntax-optional-catch-binding@^7.8.3": 245 | version "7.8.3" 246 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1" 247 | integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== 248 | dependencies: 249 | "@babel/helper-plugin-utils" "^7.8.0" 250 | 251 | "@babel/plugin-syntax-optional-chaining@^7.8.3": 252 | version "7.8.3" 253 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a" 254 | integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== 255 | dependencies: 256 | "@babel/helper-plugin-utils" "^7.8.0" 257 | 258 | "@babel/plugin-syntax-private-property-in-object@^7.14.5": 259 | version "7.14.5" 260 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz#0dc6671ec0ea22b6e94a1114f857970cd39de1ad" 261 | integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== 262 | dependencies: 263 | "@babel/helper-plugin-utils" "^7.14.5" 264 | 265 | "@babel/plugin-syntax-top-level-await@^7.14.5": 266 | version "7.14.5" 267 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c" 268 | integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== 269 | dependencies: 270 | "@babel/helper-plugin-utils" "^7.14.5" 271 | 272 | "@babel/plugin-syntax-typescript@^7.7.2": 273 | version "7.25.9" 274 | resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz#67dda2b74da43727cf21d46cf9afef23f4365399" 275 | integrity sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ== 276 | dependencies: 277 | "@babel/helper-plugin-utils" "^7.25.9" 278 | 279 | "@babel/template@^7.25.9", "@babel/template@^7.3.3": 280 | version "7.25.9" 281 | resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016" 282 | integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== 283 | dependencies: 284 | "@babel/code-frame" "^7.25.9" 285 | "@babel/parser" "^7.25.9" 286 | "@babel/types" "^7.25.9" 287 | 288 | "@babel/traverse@^7.25.9": 289 | version "7.26.5" 290 | resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.5.tgz#6d0be3e772ff786456c1a37538208286f6e79021" 291 | integrity sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ== 292 | dependencies: 293 | "@babel/code-frame" "^7.26.2" 294 | "@babel/generator" "^7.26.5" 295 | "@babel/parser" "^7.26.5" 296 | "@babel/template" "^7.25.9" 297 | "@babel/types" "^7.26.5" 298 | debug "^4.3.1" 299 | globals "^11.1.0" 300 | 301 | "@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.25.9", "@babel/types@^7.26.0", "@babel/types@^7.26.5", "@babel/types@^7.3.3": 302 | version "7.26.5" 303 | resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.5.tgz#7a1e1c01d28e26d1fe7f8ec9567b3b92b9d07747" 304 | integrity sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg== 305 | dependencies: 306 | "@babel/helper-string-parser" "^7.25.9" 307 | "@babel/helper-validator-identifier" "^7.25.9" 308 | 309 | "@bcoe/v8-coverage@^0.2.3": 310 | version "0.2.3" 311 | resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" 312 | integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== 313 | 314 | "@eslint-community/eslint-utils@^4.2.0": 315 | version "4.4.1" 316 | resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz#d1145bf2c20132d6400495d6df4bf59362fd9d56" 317 | integrity sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA== 318 | dependencies: 319 | eslint-visitor-keys "^3.4.3" 320 | 321 | "@eslint-community/regexpp@^4.12.1": 322 | version "4.12.1" 323 | resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz#cfc6cffe39df390a3841cde2abccf92eaa7ae0e0" 324 | integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== 325 | 326 | "@eslint/config-array@^0.19.0": 327 | version "0.19.1" 328 | resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.19.1.tgz#734aaea2c40be22bbb1f2a9dac687c57a6a4c984" 329 | integrity sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA== 330 | dependencies: 331 | "@eslint/object-schema" "^2.1.5" 332 | debug "^4.3.1" 333 | minimatch "^3.1.2" 334 | 335 | "@eslint/core@^0.10.0": 336 | version "0.10.0" 337 | resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.10.0.tgz#23727063c21b335f752dbb3a16450f6f9cbc9091" 338 | integrity sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw== 339 | dependencies: 340 | "@types/json-schema" "^7.0.15" 341 | 342 | "@eslint/eslintrc@^3.2.0": 343 | version "3.2.0" 344 | resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.2.0.tgz#57470ac4e2e283a6bf76044d63281196e370542c" 345 | integrity sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w== 346 | dependencies: 347 | ajv "^6.12.4" 348 | debug "^4.3.2" 349 | espree "^10.0.1" 350 | globals "^14.0.0" 351 | ignore "^5.2.0" 352 | import-fresh "^3.2.1" 353 | js-yaml "^4.1.0" 354 | minimatch "^3.1.2" 355 | strip-json-comments "^3.1.1" 356 | 357 | "@eslint/js@9.18.0": 358 | version "9.18.0" 359 | resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.18.0.tgz#3356f85d18ed3627ab107790b53caf7e1e3d1e84" 360 | integrity sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA== 361 | 362 | "@eslint/object-schema@^2.1.5": 363 | version "2.1.5" 364 | resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.5.tgz#8670a8f6258a2be5b2c620ff314a1d984c23eb2e" 365 | integrity sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ== 366 | 367 | "@eslint/plugin-kit@^0.2.5": 368 | version "0.2.5" 369 | resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.2.5.tgz#ee07372035539e7847ef834e3f5e7b79f09e3a81" 370 | integrity sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A== 371 | dependencies: 372 | "@eslint/core" "^0.10.0" 373 | levn "^0.4.1" 374 | 375 | "@fastify/busboy@^2.0.0": 376 | version "2.1.1" 377 | resolved "https://registry.yarnpkg.com/@fastify/busboy/-/busboy-2.1.1.tgz#b9da6a878a371829a0502c9b6c1c143ef6663f4d" 378 | integrity sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA== 379 | 380 | "@humanfs/core@^0.19.1": 381 | version "0.19.1" 382 | resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77" 383 | integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== 384 | 385 | "@humanfs/node@^0.16.6": 386 | version "0.16.6" 387 | resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.6.tgz#ee2a10eaabd1131987bf0488fd9b820174cd765e" 388 | integrity sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw== 389 | dependencies: 390 | "@humanfs/core" "^0.19.1" 391 | "@humanwhocodes/retry" "^0.3.0" 392 | 393 | "@humanwhocodes/module-importer@^1.0.1": 394 | version "1.0.1" 395 | resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" 396 | integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== 397 | 398 | "@humanwhocodes/retry@^0.3.0": 399 | version "0.3.1" 400 | resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.1.tgz#c72a5c76a9fbaf3488e231b13dc52c0da7bab42a" 401 | integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== 402 | 403 | "@humanwhocodes/retry@^0.4.1": 404 | version "0.4.1" 405 | resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.1.tgz#9a96ce501bc62df46c4031fbd970e3cc6b10f07b" 406 | integrity sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA== 407 | 408 | "@istanbuljs/load-nyc-config@^1.0.0": 409 | version "1.1.0" 410 | resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" 411 | integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== 412 | dependencies: 413 | camelcase "^5.3.1" 414 | find-up "^4.1.0" 415 | get-package-type "^0.1.0" 416 | js-yaml "^3.13.1" 417 | resolve-from "^5.0.0" 418 | 419 | "@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": 420 | version "0.1.3" 421 | resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" 422 | integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== 423 | 424 | "@jest/console@^29.7.0": 425 | version "29.7.0" 426 | resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.7.0.tgz#cd4822dbdb84529265c5a2bdb529a3c9cc950ffc" 427 | integrity sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg== 428 | dependencies: 429 | "@jest/types" "^29.6.3" 430 | "@types/node" "*" 431 | chalk "^4.0.0" 432 | jest-message-util "^29.7.0" 433 | jest-util "^29.7.0" 434 | slash "^3.0.0" 435 | 436 | "@jest/core@^29.7.0": 437 | version "29.7.0" 438 | resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.7.0.tgz#b6cccc239f30ff36609658c5a5e2291757ce448f" 439 | integrity sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg== 440 | dependencies: 441 | "@jest/console" "^29.7.0" 442 | "@jest/reporters" "^29.7.0" 443 | "@jest/test-result" "^29.7.0" 444 | "@jest/transform" "^29.7.0" 445 | "@jest/types" "^29.6.3" 446 | "@types/node" "*" 447 | ansi-escapes "^4.2.1" 448 | chalk "^4.0.0" 449 | ci-info "^3.2.0" 450 | exit "^0.1.2" 451 | graceful-fs "^4.2.9" 452 | jest-changed-files "^29.7.0" 453 | jest-config "^29.7.0" 454 | jest-haste-map "^29.7.0" 455 | jest-message-util "^29.7.0" 456 | jest-regex-util "^29.6.3" 457 | jest-resolve "^29.7.0" 458 | jest-resolve-dependencies "^29.7.0" 459 | jest-runner "^29.7.0" 460 | jest-runtime "^29.7.0" 461 | jest-snapshot "^29.7.0" 462 | jest-util "^29.7.0" 463 | jest-validate "^29.7.0" 464 | jest-watcher "^29.7.0" 465 | micromatch "^4.0.4" 466 | pretty-format "^29.7.0" 467 | slash "^3.0.0" 468 | strip-ansi "^6.0.0" 469 | 470 | "@jest/environment@^29.7.0": 471 | version "29.7.0" 472 | resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.7.0.tgz#24d61f54ff1f786f3cd4073b4b94416383baf2a7" 473 | integrity sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw== 474 | dependencies: 475 | "@jest/fake-timers" "^29.7.0" 476 | "@jest/types" "^29.6.3" 477 | "@types/node" "*" 478 | jest-mock "^29.7.0" 479 | 480 | "@jest/expect-utils@^29.7.0": 481 | version "29.7.0" 482 | resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.7.0.tgz#023efe5d26a8a70f21677d0a1afc0f0a44e3a1c6" 483 | integrity sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA== 484 | dependencies: 485 | jest-get-type "^29.6.3" 486 | 487 | "@jest/expect@^29.7.0": 488 | version "29.7.0" 489 | resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.7.0.tgz#76a3edb0cb753b70dfbfe23283510d3d45432bf2" 490 | integrity sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ== 491 | dependencies: 492 | expect "^29.7.0" 493 | jest-snapshot "^29.7.0" 494 | 495 | "@jest/fake-timers@^29.7.0": 496 | version "29.7.0" 497 | resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.7.0.tgz#fd91bf1fffb16d7d0d24a426ab1a47a49881a565" 498 | integrity sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ== 499 | dependencies: 500 | "@jest/types" "^29.6.3" 501 | "@sinonjs/fake-timers" "^10.0.2" 502 | "@types/node" "*" 503 | jest-message-util "^29.7.0" 504 | jest-mock "^29.7.0" 505 | jest-util "^29.7.0" 506 | 507 | "@jest/globals@^29.7.0": 508 | version "29.7.0" 509 | resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.7.0.tgz#8d9290f9ec47ff772607fa864ca1d5a2efae1d4d" 510 | integrity sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ== 511 | dependencies: 512 | "@jest/environment" "^29.7.0" 513 | "@jest/expect" "^29.7.0" 514 | "@jest/types" "^29.6.3" 515 | jest-mock "^29.7.0" 516 | 517 | "@jest/reporters@^29.7.0": 518 | version "29.7.0" 519 | resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.7.0.tgz#04b262ecb3b8faa83b0b3d321623972393e8f4c7" 520 | integrity sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg== 521 | dependencies: 522 | "@bcoe/v8-coverage" "^0.2.3" 523 | "@jest/console" "^29.7.0" 524 | "@jest/test-result" "^29.7.0" 525 | "@jest/transform" "^29.7.0" 526 | "@jest/types" "^29.6.3" 527 | "@jridgewell/trace-mapping" "^0.3.18" 528 | "@types/node" "*" 529 | chalk "^4.0.0" 530 | collect-v8-coverage "^1.0.0" 531 | exit "^0.1.2" 532 | glob "^7.1.3" 533 | graceful-fs "^4.2.9" 534 | istanbul-lib-coverage "^3.0.0" 535 | istanbul-lib-instrument "^6.0.0" 536 | istanbul-lib-report "^3.0.0" 537 | istanbul-lib-source-maps "^4.0.0" 538 | istanbul-reports "^3.1.3" 539 | jest-message-util "^29.7.0" 540 | jest-util "^29.7.0" 541 | jest-worker "^29.7.0" 542 | slash "^3.0.0" 543 | string-length "^4.0.1" 544 | strip-ansi "^6.0.0" 545 | v8-to-istanbul "^9.0.1" 546 | 547 | "@jest/schemas@^29.6.3": 548 | version "29.6.3" 549 | resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" 550 | integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== 551 | dependencies: 552 | "@sinclair/typebox" "^0.27.8" 553 | 554 | "@jest/source-map@^29.6.3": 555 | version "29.6.3" 556 | resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.6.3.tgz#d90ba772095cf37a34a5eb9413f1b562a08554c4" 557 | integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== 558 | dependencies: 559 | "@jridgewell/trace-mapping" "^0.3.18" 560 | callsites "^3.0.0" 561 | graceful-fs "^4.2.9" 562 | 563 | "@jest/test-result@^29.7.0": 564 | version "29.7.0" 565 | resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.7.0.tgz#8db9a80aa1a097bb2262572686734baed9b1657c" 566 | integrity sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA== 567 | dependencies: 568 | "@jest/console" "^29.7.0" 569 | "@jest/types" "^29.6.3" 570 | "@types/istanbul-lib-coverage" "^2.0.0" 571 | collect-v8-coverage "^1.0.0" 572 | 573 | "@jest/test-sequencer@^29.7.0": 574 | version "29.7.0" 575 | resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz#6cef977ce1d39834a3aea887a1726628a6f072ce" 576 | integrity sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw== 577 | dependencies: 578 | "@jest/test-result" "^29.7.0" 579 | graceful-fs "^4.2.9" 580 | jest-haste-map "^29.7.0" 581 | slash "^3.0.0" 582 | 583 | "@jest/transform@^29.7.0": 584 | version "29.7.0" 585 | resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.7.0.tgz#df2dd9c346c7d7768b8a06639994640c642e284c" 586 | integrity sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw== 587 | dependencies: 588 | "@babel/core" "^7.11.6" 589 | "@jest/types" "^29.6.3" 590 | "@jridgewell/trace-mapping" "^0.3.18" 591 | babel-plugin-istanbul "^6.1.1" 592 | chalk "^4.0.0" 593 | convert-source-map "^2.0.0" 594 | fast-json-stable-stringify "^2.1.0" 595 | graceful-fs "^4.2.9" 596 | jest-haste-map "^29.7.0" 597 | jest-regex-util "^29.6.3" 598 | jest-util "^29.7.0" 599 | micromatch "^4.0.4" 600 | pirates "^4.0.4" 601 | slash "^3.0.0" 602 | write-file-atomic "^4.0.2" 603 | 604 | "@jest/types@^29.6.3": 605 | version "29.6.3" 606 | resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" 607 | integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== 608 | dependencies: 609 | "@jest/schemas" "^29.6.3" 610 | "@types/istanbul-lib-coverage" "^2.0.0" 611 | "@types/istanbul-reports" "^3.0.0" 612 | "@types/node" "*" 613 | "@types/yargs" "^17.0.8" 614 | chalk "^4.0.0" 615 | 616 | "@jridgewell/gen-mapping@^0.3.5": 617 | version "0.3.8" 618 | resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142" 619 | integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== 620 | dependencies: 621 | "@jridgewell/set-array" "^1.2.1" 622 | "@jridgewell/sourcemap-codec" "^1.4.10" 623 | "@jridgewell/trace-mapping" "^0.3.24" 624 | 625 | "@jridgewell/resolve-uri@^3.1.0": 626 | version "3.1.2" 627 | resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" 628 | integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== 629 | 630 | "@jridgewell/set-array@^1.2.1": 631 | version "1.2.1" 632 | resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" 633 | integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== 634 | 635 | "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": 636 | version "1.5.0" 637 | resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" 638 | integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== 639 | 640 | "@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": 641 | version "0.3.25" 642 | resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" 643 | integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== 644 | dependencies: 645 | "@jridgewell/resolve-uri" "^3.1.0" 646 | "@jridgewell/sourcemap-codec" "^1.4.14" 647 | 648 | "@octokit/auth-token@^4.0.0": 649 | version "4.0.0" 650 | resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-4.0.0.tgz#40d203ea827b9f17f42a29c6afb93b7745ef80c7" 651 | integrity sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA== 652 | 653 | "@octokit/core@^5.0.1": 654 | version "5.2.0" 655 | resolved "https://registry.yarnpkg.com/@octokit/core/-/core-5.2.0.tgz#ddbeaefc6b44a39834e1bb2e58a49a117672a7ea" 656 | integrity sha512-1LFfa/qnMQvEOAdzlQymH0ulepxbxnCYAKJZfMci/5XJyIHWgEYnDmgnKakbTh7CH2tFQ5O60oYDvns4i9RAIg== 657 | dependencies: 658 | "@octokit/auth-token" "^4.0.0" 659 | "@octokit/graphql" "^7.1.0" 660 | "@octokit/request" "^8.3.1" 661 | "@octokit/request-error" "^5.1.0" 662 | "@octokit/types" "^13.0.0" 663 | before-after-hook "^2.2.0" 664 | universal-user-agent "^6.0.0" 665 | 666 | "@octokit/endpoint@^9.0.1": 667 | version "9.0.5" 668 | resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-9.0.5.tgz#e6c0ee684e307614c02fc6ac12274c50da465c44" 669 | integrity sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw== 670 | dependencies: 671 | "@octokit/types" "^13.1.0" 672 | universal-user-agent "^6.0.0" 673 | 674 | "@octokit/graphql@^7.1.0": 675 | version "7.1.0" 676 | resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-7.1.0.tgz#9bc1c5de92f026648131f04101cab949eeffe4e0" 677 | integrity sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ== 678 | dependencies: 679 | "@octokit/request" "^8.3.0" 680 | "@octokit/types" "^13.0.0" 681 | universal-user-agent "^6.0.0" 682 | 683 | "@octokit/openapi-types@^20.0.0": 684 | version "20.0.0" 685 | resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-20.0.0.tgz#9ec2daa0090eeb865ee147636e0c00f73790c6e5" 686 | integrity sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA== 687 | 688 | "@octokit/openapi-types@^23.0.1": 689 | version "23.0.1" 690 | resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-23.0.1.tgz#3721646ecd36b596ddb12650e0e89d3ebb2dd50e" 691 | integrity sha512-izFjMJ1sir0jn0ldEKhZ7xegCTj/ObmEDlEfpFrx4k/JyZSMRHbO3/rBwgE7f3m2DHt+RrNGIVw4wSmwnm3t/g== 692 | 693 | "@octokit/plugin-paginate-rest@^9.0.0": 694 | version "9.2.1" 695 | resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.2.1.tgz#2e2a2f0f52c9a4b1da1a3aa17dabe3c459b9e401" 696 | integrity sha512-wfGhE/TAkXZRLjksFXuDZdmGnJQHvtU/joFQdweXUgzo1XwvBCD4o4+75NtFfjfLK5IwLf9vHTfSiU3sLRYpRw== 697 | dependencies: 698 | "@octokit/types" "^12.6.0" 699 | 700 | "@octokit/plugin-rest-endpoint-methods@^10.0.0": 701 | version "10.4.1" 702 | resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-10.4.1.tgz#41ba478a558b9f554793075b2e20cd2ef973be17" 703 | integrity sha512-xV1b+ceKV9KytQe3zCVqjg+8GTGfDYwaT1ATU5isiUyVtlVAO3HNdzpS4sr4GBx4hxQ46s7ITtZrAsxG22+rVg== 704 | dependencies: 705 | "@octokit/types" "^12.6.0" 706 | 707 | "@octokit/request-error@^5.1.0": 708 | version "5.1.0" 709 | resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-5.1.0.tgz#ee4138538d08c81a60be3f320cd71063064a3b30" 710 | integrity sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q== 711 | dependencies: 712 | "@octokit/types" "^13.1.0" 713 | deprecation "^2.0.0" 714 | once "^1.4.0" 715 | 716 | "@octokit/request@^8.3.0", "@octokit/request@^8.3.1": 717 | version "8.4.0" 718 | resolved "https://registry.yarnpkg.com/@octokit/request/-/request-8.4.0.tgz#7f4b7b1daa3d1f48c0977ad8fffa2c18adef8974" 719 | integrity sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw== 720 | dependencies: 721 | "@octokit/endpoint" "^9.0.1" 722 | "@octokit/request-error" "^5.1.0" 723 | "@octokit/types" "^13.1.0" 724 | universal-user-agent "^6.0.0" 725 | 726 | "@octokit/types@^12.6.0": 727 | version "12.6.0" 728 | resolved "https://registry.yarnpkg.com/@octokit/types/-/types-12.6.0.tgz#8100fb9eeedfe083aae66473bd97b15b62aedcb2" 729 | integrity sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw== 730 | dependencies: 731 | "@octokit/openapi-types" "^20.0.0" 732 | 733 | "@octokit/types@^13.0.0", "@octokit/types@^13.1.0": 734 | version "13.7.0" 735 | resolved "https://registry.yarnpkg.com/@octokit/types/-/types-13.7.0.tgz#22d0e26a8c9f53599bfb907213d8ccde547f36aa" 736 | integrity sha512-BXfRP+3P3IN6fd4uF3SniaHKOO4UXWBfkdR3vA8mIvaoO/wLjGN5qivUtW0QRitBHHMcfC41SLhNVYIZZE+wkA== 737 | dependencies: 738 | "@octokit/openapi-types" "^23.0.1" 739 | 740 | "@pkgr/core@^0.1.0": 741 | version "0.1.1" 742 | resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.1.1.tgz#1ec17e2edbec25c8306d424ecfbf13c7de1aaa31" 743 | integrity sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA== 744 | 745 | "@sinclair/typebox@^0.27.8": 746 | version "0.27.8" 747 | resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" 748 | integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== 749 | 750 | "@sinonjs/commons@^3.0.0": 751 | version "3.0.1" 752 | resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" 753 | integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== 754 | dependencies: 755 | type-detect "4.0.8" 756 | 757 | "@sinonjs/fake-timers@^10.0.2": 758 | version "10.3.0" 759 | resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz#55fdff1ecab9f354019129daf4df0dd4d923ea66" 760 | integrity sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA== 761 | dependencies: 762 | "@sinonjs/commons" "^3.0.0" 763 | 764 | "@types/babel__core@^7.1.14": 765 | version "7.20.5" 766 | resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.5.tgz#3df15f27ba85319caa07ba08d0721889bb39c017" 767 | integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== 768 | dependencies: 769 | "@babel/parser" "^7.20.7" 770 | "@babel/types" "^7.20.7" 771 | "@types/babel__generator" "*" 772 | "@types/babel__template" "*" 773 | "@types/babel__traverse" "*" 774 | 775 | "@types/babel__generator@*": 776 | version "7.6.8" 777 | resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.8.tgz#f836c61f48b1346e7d2b0d93c6dacc5b9535d3ab" 778 | integrity sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw== 779 | dependencies: 780 | "@babel/types" "^7.0.0" 781 | 782 | "@types/babel__template@*": 783 | version "7.4.4" 784 | resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" 785 | integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== 786 | dependencies: 787 | "@babel/parser" "^7.1.0" 788 | "@babel/types" "^7.0.0" 789 | 790 | "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": 791 | version "7.20.6" 792 | resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.6.tgz#8dc9f0ae0f202c08d8d4dab648912c8d6038e3f7" 793 | integrity sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg== 794 | dependencies: 795 | "@babel/types" "^7.20.7" 796 | 797 | "@types/estree@^1.0.6": 798 | version "1.0.6" 799 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" 800 | integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== 801 | 802 | "@types/graceful-fs@^4.1.3": 803 | version "4.1.9" 804 | resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" 805 | integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== 806 | dependencies: 807 | "@types/node" "*" 808 | 809 | "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": 810 | version "2.0.6" 811 | resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" 812 | integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== 813 | 814 | "@types/istanbul-lib-report@*": 815 | version "3.0.3" 816 | resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" 817 | integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== 818 | dependencies: 819 | "@types/istanbul-lib-coverage" "*" 820 | 821 | "@types/istanbul-reports@^3.0.0": 822 | version "3.0.4" 823 | resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" 824 | integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== 825 | dependencies: 826 | "@types/istanbul-lib-report" "*" 827 | 828 | "@types/json-schema@^7.0.15": 829 | version "7.0.15" 830 | resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" 831 | integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== 832 | 833 | "@types/node@*": 834 | version "22.10.7" 835 | resolved "https://registry.yarnpkg.com/@types/node/-/node-22.10.7.tgz#14a1ca33fd0ebdd9d63593ed8d3fbc882a6d28d7" 836 | integrity sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg== 837 | dependencies: 838 | undici-types "~6.20.0" 839 | 840 | "@types/stack-utils@^2.0.0": 841 | version "2.0.3" 842 | resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" 843 | integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== 844 | 845 | "@types/yargs-parser@*": 846 | version "21.0.3" 847 | resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" 848 | integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== 849 | 850 | "@types/yargs@^17.0.8": 851 | version "17.0.33" 852 | resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.33.tgz#8c32303da83eec050a84b3c7ae7b9f922d13e32d" 853 | integrity sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA== 854 | dependencies: 855 | "@types/yargs-parser" "*" 856 | 857 | "@vercel/ncc@^0.38.3": 858 | version "0.38.3" 859 | resolved "https://registry.yarnpkg.com/@vercel/ncc/-/ncc-0.38.3.tgz#5475eeee3ac0f1a439f237596911525a490a88b5" 860 | integrity sha512-rnK6hJBS6mwc+Bkab+PGPs9OiS0i/3kdTO+CkI8V0/VrW3vmz7O2Pxjw/owOlmo6PKEIxRSeZKv/kuL9itnpYA== 861 | 862 | acorn-jsx@^5.3.2: 863 | version "5.3.2" 864 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" 865 | integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== 866 | 867 | acorn@^8.14.0: 868 | version "8.14.0" 869 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.0.tgz#063e2c70cac5fb4f6467f0b11152e04c682795b0" 870 | integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== 871 | 872 | ajv@^6.12.4: 873 | version "6.12.6" 874 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 875 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 876 | dependencies: 877 | fast-deep-equal "^3.1.1" 878 | fast-json-stable-stringify "^2.0.0" 879 | json-schema-traverse "^0.4.1" 880 | uri-js "^4.2.2" 881 | 882 | ansi-escapes@^4.2.1: 883 | version "4.3.2" 884 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" 885 | integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== 886 | dependencies: 887 | type-fest "^0.21.3" 888 | 889 | ansi-regex@^5.0.1: 890 | version "5.0.1" 891 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 892 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 893 | 894 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 895 | version "4.3.0" 896 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 897 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 898 | dependencies: 899 | color-convert "^2.0.1" 900 | 901 | ansi-styles@^5.0.0: 902 | version "5.2.0" 903 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b" 904 | integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== 905 | 906 | anymatch@^3.0.3: 907 | version "3.1.3" 908 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" 909 | integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== 910 | dependencies: 911 | normalize-path "^3.0.0" 912 | picomatch "^2.0.4" 913 | 914 | argparse@^1.0.7: 915 | version "1.0.10" 916 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 917 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 918 | dependencies: 919 | sprintf-js "~1.0.2" 920 | 921 | argparse@^2.0.1: 922 | version "2.0.1" 923 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 924 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 925 | 926 | babel-jest@^29.7.0: 927 | version "29.7.0" 928 | resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.7.0.tgz#f4369919225b684c56085998ac63dbd05be020d5" 929 | integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== 930 | dependencies: 931 | "@jest/transform" "^29.7.0" 932 | "@types/babel__core" "^7.1.14" 933 | babel-plugin-istanbul "^6.1.1" 934 | babel-preset-jest "^29.6.3" 935 | chalk "^4.0.0" 936 | graceful-fs "^4.2.9" 937 | slash "^3.0.0" 938 | 939 | babel-plugin-istanbul@^6.1.1: 940 | version "6.1.1" 941 | resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz#fa88ec59232fd9b4e36dbbc540a8ec9a9b47da73" 942 | integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== 943 | dependencies: 944 | "@babel/helper-plugin-utils" "^7.0.0" 945 | "@istanbuljs/load-nyc-config" "^1.0.0" 946 | "@istanbuljs/schema" "^0.1.2" 947 | istanbul-lib-instrument "^5.0.4" 948 | test-exclude "^6.0.0" 949 | 950 | babel-plugin-jest-hoist@^29.6.3: 951 | version "29.6.3" 952 | resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz#aadbe943464182a8922c3c927c3067ff40d24626" 953 | integrity sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg== 954 | dependencies: 955 | "@babel/template" "^7.3.3" 956 | "@babel/types" "^7.3.3" 957 | "@types/babel__core" "^7.1.14" 958 | "@types/babel__traverse" "^7.0.6" 959 | 960 | babel-preset-current-node-syntax@^1.0.0: 961 | version "1.1.0" 962 | resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz#9a929eafece419612ef4ae4f60b1862ebad8ef30" 963 | integrity sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw== 964 | dependencies: 965 | "@babel/plugin-syntax-async-generators" "^7.8.4" 966 | "@babel/plugin-syntax-bigint" "^7.8.3" 967 | "@babel/plugin-syntax-class-properties" "^7.12.13" 968 | "@babel/plugin-syntax-class-static-block" "^7.14.5" 969 | "@babel/plugin-syntax-import-attributes" "^7.24.7" 970 | "@babel/plugin-syntax-import-meta" "^7.10.4" 971 | "@babel/plugin-syntax-json-strings" "^7.8.3" 972 | "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" 973 | "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" 974 | "@babel/plugin-syntax-numeric-separator" "^7.10.4" 975 | "@babel/plugin-syntax-object-rest-spread" "^7.8.3" 976 | "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" 977 | "@babel/plugin-syntax-optional-chaining" "^7.8.3" 978 | "@babel/plugin-syntax-private-property-in-object" "^7.14.5" 979 | "@babel/plugin-syntax-top-level-await" "^7.14.5" 980 | 981 | babel-preset-jest@^29.6.3: 982 | version "29.6.3" 983 | resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz#fa05fa510e7d493896d7b0dd2033601c840f171c" 984 | integrity sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA== 985 | dependencies: 986 | babel-plugin-jest-hoist "^29.6.3" 987 | babel-preset-current-node-syntax "^1.0.0" 988 | 989 | balanced-match@^1.0.0: 990 | version "1.0.2" 991 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 992 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 993 | 994 | before-after-hook@^2.2.0: 995 | version "2.2.3" 996 | resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" 997 | integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== 998 | 999 | brace-expansion@^1.1.7: 1000 | version "1.1.11" 1001 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 1002 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 1003 | dependencies: 1004 | balanced-match "^1.0.0" 1005 | concat-map "0.0.1" 1006 | 1007 | braces@^3.0.3: 1008 | version "3.0.3" 1009 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" 1010 | integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== 1011 | dependencies: 1012 | fill-range "^7.1.1" 1013 | 1014 | browserslist@^4.24.0: 1015 | version "4.24.4" 1016 | resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.4.tgz#c6b2865a3f08bcb860a0e827389003b9fe686e4b" 1017 | integrity sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A== 1018 | dependencies: 1019 | caniuse-lite "^1.0.30001688" 1020 | electron-to-chromium "^1.5.73" 1021 | node-releases "^2.0.19" 1022 | update-browserslist-db "^1.1.1" 1023 | 1024 | bser@2.1.1: 1025 | version "2.1.1" 1026 | resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" 1027 | integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== 1028 | dependencies: 1029 | node-int64 "^0.4.0" 1030 | 1031 | buffer-from@^1.0.0: 1032 | version "1.1.2" 1033 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" 1034 | integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== 1035 | 1036 | callsites@^3.0.0: 1037 | version "3.1.0" 1038 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 1039 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 1040 | 1041 | camelcase@^5.3.1: 1042 | version "5.3.1" 1043 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" 1044 | integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== 1045 | 1046 | camelcase@^6.2.0: 1047 | version "6.3.0" 1048 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" 1049 | integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== 1050 | 1051 | caniuse-lite@^1.0.30001688: 1052 | version "1.0.30001695" 1053 | resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001695.tgz#39dfedd8f94851132795fdf9b79d29659ad9c4d4" 1054 | integrity sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw== 1055 | 1056 | chalk@^4.0.0: 1057 | version "4.1.2" 1058 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 1059 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 1060 | dependencies: 1061 | ansi-styles "^4.1.0" 1062 | supports-color "^7.1.0" 1063 | 1064 | char-regex@^1.0.2: 1065 | version "1.0.2" 1066 | resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" 1067 | integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== 1068 | 1069 | ci-info@^3.2.0: 1070 | version "3.9.0" 1071 | resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" 1072 | integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== 1073 | 1074 | cjs-module-lexer@^1.0.0: 1075 | version "1.4.1" 1076 | resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz#707413784dbb3a72aa11c2f2b042a0bef4004170" 1077 | integrity sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA== 1078 | 1079 | cliui@^8.0.1: 1080 | version "8.0.1" 1081 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" 1082 | integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== 1083 | dependencies: 1084 | string-width "^4.2.0" 1085 | strip-ansi "^6.0.1" 1086 | wrap-ansi "^7.0.0" 1087 | 1088 | co@^4.6.0: 1089 | version "4.6.0" 1090 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 1091 | integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== 1092 | 1093 | collect-v8-coverage@^1.0.0: 1094 | version "1.0.2" 1095 | resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" 1096 | integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== 1097 | 1098 | color-convert@^2.0.1: 1099 | version "2.0.1" 1100 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 1101 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 1102 | dependencies: 1103 | color-name "~1.1.4" 1104 | 1105 | color-name@~1.1.4: 1106 | version "1.1.4" 1107 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 1108 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 1109 | 1110 | concat-map@0.0.1: 1111 | version "0.0.1" 1112 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 1113 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 1114 | 1115 | convert-source-map@^2.0.0: 1116 | version "2.0.0" 1117 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" 1118 | integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== 1119 | 1120 | create-jest@^29.7.0: 1121 | version "29.7.0" 1122 | resolved "https://registry.yarnpkg.com/create-jest/-/create-jest-29.7.0.tgz#a355c5b3cb1e1af02ba177fe7afd7feee49a5320" 1123 | integrity sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q== 1124 | dependencies: 1125 | "@jest/types" "^29.6.3" 1126 | chalk "^4.0.0" 1127 | exit "^0.1.2" 1128 | graceful-fs "^4.2.9" 1129 | jest-config "^29.7.0" 1130 | jest-util "^29.7.0" 1131 | prompts "^2.0.1" 1132 | 1133 | cross-spawn@^7.0.3, cross-spawn@^7.0.6: 1134 | version "7.0.6" 1135 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" 1136 | integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== 1137 | dependencies: 1138 | path-key "^3.1.0" 1139 | shebang-command "^2.0.0" 1140 | which "^2.0.1" 1141 | 1142 | debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2: 1143 | version "4.4.0" 1144 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" 1145 | integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== 1146 | dependencies: 1147 | ms "^2.1.3" 1148 | 1149 | dedent@^1.0.0: 1150 | version "1.5.3" 1151 | resolved "https://registry.yarnpkg.com/dedent/-/dedent-1.5.3.tgz#99aee19eb9bae55a67327717b6e848d0bf777e5a" 1152 | integrity sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== 1153 | 1154 | deep-is@^0.1.3: 1155 | version "0.1.4" 1156 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" 1157 | integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== 1158 | 1159 | deepmerge@^4.2.2: 1160 | version "4.3.1" 1161 | resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" 1162 | integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== 1163 | 1164 | deprecation@^2.0.0: 1165 | version "2.3.1" 1166 | resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" 1167 | integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== 1168 | 1169 | detect-newline@^3.0.0: 1170 | version "3.1.0" 1171 | resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" 1172 | integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== 1173 | 1174 | diff-sequences@^29.6.3: 1175 | version "29.6.3" 1176 | resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.6.3.tgz#4deaf894d11407c51efc8418012f9e70b84ea921" 1177 | integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== 1178 | 1179 | electron-to-chromium@^1.5.73: 1180 | version "1.5.83" 1181 | resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.83.tgz#3f74078f0c83e24bf7e692eaa855a998d1bec34f" 1182 | integrity sha512-LcUDPqSt+V0QmI47XLzZrz5OqILSMGsPFkDYus22rIbgorSvBYEFqq854ltTmUdHkY92FSdAAvsh4jWEULMdfQ== 1183 | 1184 | emittery@^0.13.1: 1185 | version "0.13.1" 1186 | resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" 1187 | integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== 1188 | 1189 | emoji-regex@^8.0.0: 1190 | version "8.0.0" 1191 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 1192 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 1193 | 1194 | error-ex@^1.3.1: 1195 | version "1.3.2" 1196 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" 1197 | integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== 1198 | dependencies: 1199 | is-arrayish "^0.2.1" 1200 | 1201 | escalade@^3.1.1, escalade@^3.2.0: 1202 | version "3.2.0" 1203 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" 1204 | integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== 1205 | 1206 | escape-string-regexp@^2.0.0: 1207 | version "2.0.0" 1208 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" 1209 | integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== 1210 | 1211 | escape-string-regexp@^4.0.0: 1212 | version "4.0.0" 1213 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 1214 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 1215 | 1216 | eslint-config-prettier@^10.0.1: 1217 | version "10.0.1" 1218 | resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-10.0.1.tgz#fbb03bfc8db0651df9ce4e8b7150d11c5fe3addf" 1219 | integrity sha512-lZBts941cyJyeaooiKxAtzoPHTN+GbQTJFAIdQbRhA4/8whaAraEh47Whw/ZFfrjNSnlAxqfm9i0XVAEkULjCw== 1220 | 1221 | eslint-plugin-prettier@^5.2.3: 1222 | version "5.2.3" 1223 | resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.3.tgz#c4af01691a6fa9905207f0fbba0d7bea0902cce5" 1224 | integrity sha512-qJ+y0FfCp/mQYQ/vWQ3s7eUlFEL4PyKfAJxsnYTJ4YT73nsJBWqmEpFryxV9OeUiqmsTsYJ5Y+KDNaeP31wrRw== 1225 | dependencies: 1226 | prettier-linter-helpers "^1.0.0" 1227 | synckit "^0.9.1" 1228 | 1229 | eslint-scope@^8.2.0: 1230 | version "8.2.0" 1231 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.2.0.tgz#377aa6f1cb5dc7592cfd0b7f892fd0cf352ce442" 1232 | integrity sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A== 1233 | dependencies: 1234 | esrecurse "^4.3.0" 1235 | estraverse "^5.2.0" 1236 | 1237 | eslint-visitor-keys@^3.4.3: 1238 | version "3.4.3" 1239 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" 1240 | integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== 1241 | 1242 | eslint-visitor-keys@^4.2.0: 1243 | version "4.2.0" 1244 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz#687bacb2af884fcdda8a6e7d65c606f46a14cd45" 1245 | integrity sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw== 1246 | 1247 | eslint@^9.18.0: 1248 | version "9.18.0" 1249 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.18.0.tgz#c95b24de1183e865de19f607fda6518b54827850" 1250 | integrity sha512-+waTfRWQlSbpt3KWE+CjrPPYnbq9kfZIYUqapc0uBXyjTp8aYXZDsUH16m39Ryq3NjAVP4tjuF7KaukeqoCoaA== 1251 | dependencies: 1252 | "@eslint-community/eslint-utils" "^4.2.0" 1253 | "@eslint-community/regexpp" "^4.12.1" 1254 | "@eslint/config-array" "^0.19.0" 1255 | "@eslint/core" "^0.10.0" 1256 | "@eslint/eslintrc" "^3.2.0" 1257 | "@eslint/js" "9.18.0" 1258 | "@eslint/plugin-kit" "^0.2.5" 1259 | "@humanfs/node" "^0.16.6" 1260 | "@humanwhocodes/module-importer" "^1.0.1" 1261 | "@humanwhocodes/retry" "^0.4.1" 1262 | "@types/estree" "^1.0.6" 1263 | "@types/json-schema" "^7.0.15" 1264 | ajv "^6.12.4" 1265 | chalk "^4.0.0" 1266 | cross-spawn "^7.0.6" 1267 | debug "^4.3.2" 1268 | escape-string-regexp "^4.0.0" 1269 | eslint-scope "^8.2.0" 1270 | eslint-visitor-keys "^4.2.0" 1271 | espree "^10.3.0" 1272 | esquery "^1.5.0" 1273 | esutils "^2.0.2" 1274 | fast-deep-equal "^3.1.3" 1275 | file-entry-cache "^8.0.0" 1276 | find-up "^5.0.0" 1277 | glob-parent "^6.0.2" 1278 | ignore "^5.2.0" 1279 | imurmurhash "^0.1.4" 1280 | is-glob "^4.0.0" 1281 | json-stable-stringify-without-jsonify "^1.0.1" 1282 | lodash.merge "^4.6.2" 1283 | minimatch "^3.1.2" 1284 | natural-compare "^1.4.0" 1285 | optionator "^0.9.3" 1286 | 1287 | espree@^10.0.1, espree@^10.3.0: 1288 | version "10.3.0" 1289 | resolved "https://registry.yarnpkg.com/espree/-/espree-10.3.0.tgz#29267cf5b0cb98735b65e64ba07e0ed49d1eed8a" 1290 | integrity sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg== 1291 | dependencies: 1292 | acorn "^8.14.0" 1293 | acorn-jsx "^5.3.2" 1294 | eslint-visitor-keys "^4.2.0" 1295 | 1296 | esprima@^4.0.0: 1297 | version "4.0.1" 1298 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 1299 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 1300 | 1301 | esquery@^1.5.0: 1302 | version "1.6.0" 1303 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" 1304 | integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== 1305 | dependencies: 1306 | estraverse "^5.1.0" 1307 | 1308 | esrecurse@^4.3.0: 1309 | version "4.3.0" 1310 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" 1311 | integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== 1312 | dependencies: 1313 | estraverse "^5.2.0" 1314 | 1315 | estraverse@^5.1.0, estraverse@^5.2.0: 1316 | version "5.3.0" 1317 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" 1318 | integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== 1319 | 1320 | esutils@^2.0.2: 1321 | version "2.0.3" 1322 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 1323 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 1324 | 1325 | execa@^5.0.0: 1326 | version "5.1.1" 1327 | resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" 1328 | integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== 1329 | dependencies: 1330 | cross-spawn "^7.0.3" 1331 | get-stream "^6.0.0" 1332 | human-signals "^2.1.0" 1333 | is-stream "^2.0.0" 1334 | merge-stream "^2.0.0" 1335 | npm-run-path "^4.0.1" 1336 | onetime "^5.1.2" 1337 | signal-exit "^3.0.3" 1338 | strip-final-newline "^2.0.0" 1339 | 1340 | exit@^0.1.2: 1341 | version "0.1.2" 1342 | resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" 1343 | integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== 1344 | 1345 | expect@^29.7.0: 1346 | version "29.7.0" 1347 | resolved "https://registry.yarnpkg.com/expect/-/expect-29.7.0.tgz#578874590dcb3214514084c08115d8aee61e11bc" 1348 | integrity sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw== 1349 | dependencies: 1350 | "@jest/expect-utils" "^29.7.0" 1351 | jest-get-type "^29.6.3" 1352 | jest-matcher-utils "^29.7.0" 1353 | jest-message-util "^29.7.0" 1354 | jest-util "^29.7.0" 1355 | 1356 | fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: 1357 | version "3.1.3" 1358 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 1359 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 1360 | 1361 | fast-diff@^1.1.2: 1362 | version "1.3.0" 1363 | resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" 1364 | integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== 1365 | 1366 | fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: 1367 | version "2.1.0" 1368 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 1369 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 1370 | 1371 | fast-levenshtein@^2.0.6: 1372 | version "2.0.6" 1373 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 1374 | integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== 1375 | 1376 | fb-watchman@^2.0.0: 1377 | version "2.0.2" 1378 | resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.2.tgz#e9524ee6b5c77e9e5001af0f85f3adbb8623255c" 1379 | integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== 1380 | dependencies: 1381 | bser "2.1.1" 1382 | 1383 | file-entry-cache@^8.0.0: 1384 | version "8.0.0" 1385 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" 1386 | integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== 1387 | dependencies: 1388 | flat-cache "^4.0.0" 1389 | 1390 | fill-range@^7.1.1: 1391 | version "7.1.1" 1392 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" 1393 | integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== 1394 | dependencies: 1395 | to-regex-range "^5.0.1" 1396 | 1397 | find-up@^4.0.0, find-up@^4.1.0: 1398 | version "4.1.0" 1399 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" 1400 | integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== 1401 | dependencies: 1402 | locate-path "^5.0.0" 1403 | path-exists "^4.0.0" 1404 | 1405 | find-up@^5.0.0: 1406 | version "5.0.0" 1407 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 1408 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 1409 | dependencies: 1410 | locate-path "^6.0.0" 1411 | path-exists "^4.0.0" 1412 | 1413 | flat-cache@^4.0.0: 1414 | version "4.0.1" 1415 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" 1416 | integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== 1417 | dependencies: 1418 | flatted "^3.2.9" 1419 | keyv "^4.5.4" 1420 | 1421 | flatted@^3.2.9: 1422 | version "3.3.2" 1423 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.2.tgz#adba1448a9841bec72b42c532ea23dbbedef1a27" 1424 | integrity sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA== 1425 | 1426 | fs.realpath@^1.0.0: 1427 | version "1.0.0" 1428 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 1429 | integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== 1430 | 1431 | fsevents@^2.3.2: 1432 | version "2.3.3" 1433 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" 1434 | integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== 1435 | 1436 | function-bind@^1.1.2: 1437 | version "1.1.2" 1438 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" 1439 | integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== 1440 | 1441 | gensync@^1.0.0-beta.2: 1442 | version "1.0.0-beta.2" 1443 | resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" 1444 | integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== 1445 | 1446 | get-caller-file@^2.0.5: 1447 | version "2.0.5" 1448 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 1449 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 1450 | 1451 | get-package-type@^0.1.0: 1452 | version "0.1.0" 1453 | resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" 1454 | integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== 1455 | 1456 | get-stream@^6.0.0: 1457 | version "6.0.1" 1458 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" 1459 | integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== 1460 | 1461 | glob-parent@^6.0.2: 1462 | version "6.0.2" 1463 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" 1464 | integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== 1465 | dependencies: 1466 | is-glob "^4.0.3" 1467 | 1468 | glob@^7.1.3, glob@^7.1.4: 1469 | version "7.2.3" 1470 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" 1471 | integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== 1472 | dependencies: 1473 | fs.realpath "^1.0.0" 1474 | inflight "^1.0.4" 1475 | inherits "2" 1476 | minimatch "^3.1.1" 1477 | once "^1.3.0" 1478 | path-is-absolute "^1.0.0" 1479 | 1480 | globals@^11.1.0: 1481 | version "11.12.0" 1482 | resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" 1483 | integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== 1484 | 1485 | globals@^14.0.0: 1486 | version "14.0.0" 1487 | resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" 1488 | integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== 1489 | 1490 | graceful-fs@^4.2.9: 1491 | version "4.2.11" 1492 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" 1493 | integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== 1494 | 1495 | has-flag@^4.0.0: 1496 | version "4.0.0" 1497 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 1498 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 1499 | 1500 | hasown@^2.0.2: 1501 | version "2.0.2" 1502 | resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" 1503 | integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== 1504 | dependencies: 1505 | function-bind "^1.1.2" 1506 | 1507 | html-escaper@^2.0.0: 1508 | version "2.0.2" 1509 | resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" 1510 | integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== 1511 | 1512 | human-signals@^2.1.0: 1513 | version "2.1.0" 1514 | resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" 1515 | integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== 1516 | 1517 | ignore@^5.2.0: 1518 | version "5.3.2" 1519 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" 1520 | integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== 1521 | 1522 | import-fresh@^3.2.1: 1523 | version "3.3.0" 1524 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" 1525 | integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== 1526 | dependencies: 1527 | parent-module "^1.0.0" 1528 | resolve-from "^4.0.0" 1529 | 1530 | import-local@^3.0.2: 1531 | version "3.2.0" 1532 | resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260" 1533 | integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== 1534 | dependencies: 1535 | pkg-dir "^4.2.0" 1536 | resolve-cwd "^3.0.0" 1537 | 1538 | imurmurhash@^0.1.4: 1539 | version "0.1.4" 1540 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 1541 | integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== 1542 | 1543 | inflight@^1.0.4: 1544 | version "1.0.6" 1545 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1546 | integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== 1547 | dependencies: 1548 | once "^1.3.0" 1549 | wrappy "1" 1550 | 1551 | inherits@2: 1552 | version "2.0.4" 1553 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 1554 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 1555 | 1556 | is-arrayish@^0.2.1: 1557 | version "0.2.1" 1558 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 1559 | integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== 1560 | 1561 | is-core-module@^2.16.0: 1562 | version "2.16.1" 1563 | resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" 1564 | integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== 1565 | dependencies: 1566 | hasown "^2.0.2" 1567 | 1568 | is-extglob@^2.1.1: 1569 | version "2.1.1" 1570 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 1571 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 1572 | 1573 | is-fullwidth-code-point@^3.0.0: 1574 | version "3.0.0" 1575 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 1576 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 1577 | 1578 | is-generator-fn@^2.0.0: 1579 | version "2.1.0" 1580 | resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" 1581 | integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== 1582 | 1583 | is-glob@^4.0.0, is-glob@^4.0.3: 1584 | version "4.0.3" 1585 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 1586 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 1587 | dependencies: 1588 | is-extglob "^2.1.1" 1589 | 1590 | is-number@^7.0.0: 1591 | version "7.0.0" 1592 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 1593 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 1594 | 1595 | is-stream@^2.0.0: 1596 | version "2.0.1" 1597 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" 1598 | integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== 1599 | 1600 | isexe@^2.0.0: 1601 | version "2.0.0" 1602 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1603 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 1604 | 1605 | istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: 1606 | version "3.2.2" 1607 | resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" 1608 | integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== 1609 | 1610 | istanbul-lib-instrument@^5.0.4: 1611 | version "5.2.1" 1612 | resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz#d10c8885c2125574e1c231cacadf955675e1ce3d" 1613 | integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== 1614 | dependencies: 1615 | "@babel/core" "^7.12.3" 1616 | "@babel/parser" "^7.14.7" 1617 | "@istanbuljs/schema" "^0.1.2" 1618 | istanbul-lib-coverage "^3.2.0" 1619 | semver "^6.3.0" 1620 | 1621 | istanbul-lib-instrument@^6.0.0: 1622 | version "6.0.3" 1623 | resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz#fa15401df6c15874bcb2105f773325d78c666765" 1624 | integrity sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q== 1625 | dependencies: 1626 | "@babel/core" "^7.23.9" 1627 | "@babel/parser" "^7.23.9" 1628 | "@istanbuljs/schema" "^0.1.3" 1629 | istanbul-lib-coverage "^3.2.0" 1630 | semver "^7.5.4" 1631 | 1632 | istanbul-lib-report@^3.0.0: 1633 | version "3.0.1" 1634 | resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" 1635 | integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== 1636 | dependencies: 1637 | istanbul-lib-coverage "^3.0.0" 1638 | make-dir "^4.0.0" 1639 | supports-color "^7.1.0" 1640 | 1641 | istanbul-lib-source-maps@^4.0.0: 1642 | version "4.0.1" 1643 | resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" 1644 | integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== 1645 | dependencies: 1646 | debug "^4.1.1" 1647 | istanbul-lib-coverage "^3.0.0" 1648 | source-map "^0.6.1" 1649 | 1650 | istanbul-reports@^3.1.3: 1651 | version "3.1.7" 1652 | resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" 1653 | integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== 1654 | dependencies: 1655 | html-escaper "^2.0.0" 1656 | istanbul-lib-report "^3.0.0" 1657 | 1658 | jest-changed-files@^29.7.0: 1659 | version "29.7.0" 1660 | resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-29.7.0.tgz#1c06d07e77c78e1585d020424dedc10d6e17ac3a" 1661 | integrity sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w== 1662 | dependencies: 1663 | execa "^5.0.0" 1664 | jest-util "^29.7.0" 1665 | p-limit "^3.1.0" 1666 | 1667 | jest-circus@^29.7.0: 1668 | version "29.7.0" 1669 | resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.7.0.tgz#b6817a45fcc835d8b16d5962d0c026473ee3668a" 1670 | integrity sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw== 1671 | dependencies: 1672 | "@jest/environment" "^29.7.0" 1673 | "@jest/expect" "^29.7.0" 1674 | "@jest/test-result" "^29.7.0" 1675 | "@jest/types" "^29.6.3" 1676 | "@types/node" "*" 1677 | chalk "^4.0.0" 1678 | co "^4.6.0" 1679 | dedent "^1.0.0" 1680 | is-generator-fn "^2.0.0" 1681 | jest-each "^29.7.0" 1682 | jest-matcher-utils "^29.7.0" 1683 | jest-message-util "^29.7.0" 1684 | jest-runtime "^29.7.0" 1685 | jest-snapshot "^29.7.0" 1686 | jest-util "^29.7.0" 1687 | p-limit "^3.1.0" 1688 | pretty-format "^29.7.0" 1689 | pure-rand "^6.0.0" 1690 | slash "^3.0.0" 1691 | stack-utils "^2.0.3" 1692 | 1693 | jest-cli@^29.7.0: 1694 | version "29.7.0" 1695 | resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-29.7.0.tgz#5592c940798e0cae677eec169264f2d839a37995" 1696 | integrity sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg== 1697 | dependencies: 1698 | "@jest/core" "^29.7.0" 1699 | "@jest/test-result" "^29.7.0" 1700 | "@jest/types" "^29.6.3" 1701 | chalk "^4.0.0" 1702 | create-jest "^29.7.0" 1703 | exit "^0.1.2" 1704 | import-local "^3.0.2" 1705 | jest-config "^29.7.0" 1706 | jest-util "^29.7.0" 1707 | jest-validate "^29.7.0" 1708 | yargs "^17.3.1" 1709 | 1710 | jest-config@^29.7.0: 1711 | version "29.7.0" 1712 | resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.7.0.tgz#bcbda8806dbcc01b1e316a46bb74085a84b0245f" 1713 | integrity sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ== 1714 | dependencies: 1715 | "@babel/core" "^7.11.6" 1716 | "@jest/test-sequencer" "^29.7.0" 1717 | "@jest/types" "^29.6.3" 1718 | babel-jest "^29.7.0" 1719 | chalk "^4.0.0" 1720 | ci-info "^3.2.0" 1721 | deepmerge "^4.2.2" 1722 | glob "^7.1.3" 1723 | graceful-fs "^4.2.9" 1724 | jest-circus "^29.7.0" 1725 | jest-environment-node "^29.7.0" 1726 | jest-get-type "^29.6.3" 1727 | jest-regex-util "^29.6.3" 1728 | jest-resolve "^29.7.0" 1729 | jest-runner "^29.7.0" 1730 | jest-util "^29.7.0" 1731 | jest-validate "^29.7.0" 1732 | micromatch "^4.0.4" 1733 | parse-json "^5.2.0" 1734 | pretty-format "^29.7.0" 1735 | slash "^3.0.0" 1736 | strip-json-comments "^3.1.1" 1737 | 1738 | jest-diff@^29.7.0: 1739 | version "29.7.0" 1740 | resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.7.0.tgz#017934a66ebb7ecf6f205e84699be10afd70458a" 1741 | integrity sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw== 1742 | dependencies: 1743 | chalk "^4.0.0" 1744 | diff-sequences "^29.6.3" 1745 | jest-get-type "^29.6.3" 1746 | pretty-format "^29.7.0" 1747 | 1748 | jest-docblock@^29.7.0: 1749 | version "29.7.0" 1750 | resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.7.0.tgz#8fddb6adc3cdc955c93e2a87f61cfd350d5d119a" 1751 | integrity sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g== 1752 | dependencies: 1753 | detect-newline "^3.0.0" 1754 | 1755 | jest-each@^29.7.0: 1756 | version "29.7.0" 1757 | resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.7.0.tgz#162a9b3f2328bdd991beaabffbb74745e56577d1" 1758 | integrity sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ== 1759 | dependencies: 1760 | "@jest/types" "^29.6.3" 1761 | chalk "^4.0.0" 1762 | jest-get-type "^29.6.3" 1763 | jest-util "^29.7.0" 1764 | pretty-format "^29.7.0" 1765 | 1766 | jest-environment-node@^29.7.0: 1767 | version "29.7.0" 1768 | resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz#0b93e111dda8ec120bc8300e6d1fb9576e164376" 1769 | integrity sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw== 1770 | dependencies: 1771 | "@jest/environment" "^29.7.0" 1772 | "@jest/fake-timers" "^29.7.0" 1773 | "@jest/types" "^29.6.3" 1774 | "@types/node" "*" 1775 | jest-mock "^29.7.0" 1776 | jest-util "^29.7.0" 1777 | 1778 | jest-get-type@^29.6.3: 1779 | version "29.6.3" 1780 | resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.6.3.tgz#36f499fdcea197c1045a127319c0481723908fd1" 1781 | integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== 1782 | 1783 | jest-haste-map@^29.7.0: 1784 | version "29.7.0" 1785 | resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.7.0.tgz#3c2396524482f5a0506376e6c858c3bbcc17b104" 1786 | integrity sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA== 1787 | dependencies: 1788 | "@jest/types" "^29.6.3" 1789 | "@types/graceful-fs" "^4.1.3" 1790 | "@types/node" "*" 1791 | anymatch "^3.0.3" 1792 | fb-watchman "^2.0.0" 1793 | graceful-fs "^4.2.9" 1794 | jest-regex-util "^29.6.3" 1795 | jest-util "^29.7.0" 1796 | jest-worker "^29.7.0" 1797 | micromatch "^4.0.4" 1798 | walker "^1.0.8" 1799 | optionalDependencies: 1800 | fsevents "^2.3.2" 1801 | 1802 | jest-leak-detector@^29.7.0: 1803 | version "29.7.0" 1804 | resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz#5b7ec0dadfdfec0ca383dc9aa016d36b5ea4c728" 1805 | integrity sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw== 1806 | dependencies: 1807 | jest-get-type "^29.6.3" 1808 | pretty-format "^29.7.0" 1809 | 1810 | jest-matcher-utils@^29.7.0: 1811 | version "29.7.0" 1812 | resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz#ae8fec79ff249fd592ce80e3ee474e83a6c44f12" 1813 | integrity sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g== 1814 | dependencies: 1815 | chalk "^4.0.0" 1816 | jest-diff "^29.7.0" 1817 | jest-get-type "^29.6.3" 1818 | pretty-format "^29.7.0" 1819 | 1820 | jest-message-util@^29.7.0: 1821 | version "29.7.0" 1822 | resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.7.0.tgz#8bc392e204e95dfe7564abbe72a404e28e51f7f3" 1823 | integrity sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w== 1824 | dependencies: 1825 | "@babel/code-frame" "^7.12.13" 1826 | "@jest/types" "^29.6.3" 1827 | "@types/stack-utils" "^2.0.0" 1828 | chalk "^4.0.0" 1829 | graceful-fs "^4.2.9" 1830 | micromatch "^4.0.4" 1831 | pretty-format "^29.7.0" 1832 | slash "^3.0.0" 1833 | stack-utils "^2.0.3" 1834 | 1835 | jest-mock@^29.7.0: 1836 | version "29.7.0" 1837 | resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.7.0.tgz#4e836cf60e99c6fcfabe9f99d017f3fdd50a6347" 1838 | integrity sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw== 1839 | dependencies: 1840 | "@jest/types" "^29.6.3" 1841 | "@types/node" "*" 1842 | jest-util "^29.7.0" 1843 | 1844 | jest-pnp-resolver@^1.2.2: 1845 | version "1.2.3" 1846 | resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz#930b1546164d4ad5937d5540e711d4d38d4cad2e" 1847 | integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== 1848 | 1849 | jest-regex-util@^29.6.3: 1850 | version "29.6.3" 1851 | resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.6.3.tgz#4a556d9c776af68e1c5f48194f4d0327d24e8a52" 1852 | integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== 1853 | 1854 | jest-resolve-dependencies@^29.7.0: 1855 | version "29.7.0" 1856 | resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz#1b04f2c095f37fc776ff40803dc92921b1e88428" 1857 | integrity sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA== 1858 | dependencies: 1859 | jest-regex-util "^29.6.3" 1860 | jest-snapshot "^29.7.0" 1861 | 1862 | jest-resolve@^29.7.0: 1863 | version "29.7.0" 1864 | resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.7.0.tgz#64d6a8992dd26f635ab0c01e5eef4399c6bcbc30" 1865 | integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== 1866 | dependencies: 1867 | chalk "^4.0.0" 1868 | graceful-fs "^4.2.9" 1869 | jest-haste-map "^29.7.0" 1870 | jest-pnp-resolver "^1.2.2" 1871 | jest-util "^29.7.0" 1872 | jest-validate "^29.7.0" 1873 | resolve "^1.20.0" 1874 | resolve.exports "^2.0.0" 1875 | slash "^3.0.0" 1876 | 1877 | jest-runner@^29.7.0: 1878 | version "29.7.0" 1879 | resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.7.0.tgz#809af072d408a53dcfd2e849a4c976d3132f718e" 1880 | integrity sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ== 1881 | dependencies: 1882 | "@jest/console" "^29.7.0" 1883 | "@jest/environment" "^29.7.0" 1884 | "@jest/test-result" "^29.7.0" 1885 | "@jest/transform" "^29.7.0" 1886 | "@jest/types" "^29.6.3" 1887 | "@types/node" "*" 1888 | chalk "^4.0.0" 1889 | emittery "^0.13.1" 1890 | graceful-fs "^4.2.9" 1891 | jest-docblock "^29.7.0" 1892 | jest-environment-node "^29.7.0" 1893 | jest-haste-map "^29.7.0" 1894 | jest-leak-detector "^29.7.0" 1895 | jest-message-util "^29.7.0" 1896 | jest-resolve "^29.7.0" 1897 | jest-runtime "^29.7.0" 1898 | jest-util "^29.7.0" 1899 | jest-watcher "^29.7.0" 1900 | jest-worker "^29.7.0" 1901 | p-limit "^3.1.0" 1902 | source-map-support "0.5.13" 1903 | 1904 | jest-runtime@^29.7.0: 1905 | version "29.7.0" 1906 | resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.7.0.tgz#efecb3141cf7d3767a3a0cc8f7c9990587d3d817" 1907 | integrity sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ== 1908 | dependencies: 1909 | "@jest/environment" "^29.7.0" 1910 | "@jest/fake-timers" "^29.7.0" 1911 | "@jest/globals" "^29.7.0" 1912 | "@jest/source-map" "^29.6.3" 1913 | "@jest/test-result" "^29.7.0" 1914 | "@jest/transform" "^29.7.0" 1915 | "@jest/types" "^29.6.3" 1916 | "@types/node" "*" 1917 | chalk "^4.0.0" 1918 | cjs-module-lexer "^1.0.0" 1919 | collect-v8-coverage "^1.0.0" 1920 | glob "^7.1.3" 1921 | graceful-fs "^4.2.9" 1922 | jest-haste-map "^29.7.0" 1923 | jest-message-util "^29.7.0" 1924 | jest-mock "^29.7.0" 1925 | jest-regex-util "^29.6.3" 1926 | jest-resolve "^29.7.0" 1927 | jest-snapshot "^29.7.0" 1928 | jest-util "^29.7.0" 1929 | slash "^3.0.0" 1930 | strip-bom "^4.0.0" 1931 | 1932 | jest-snapshot@^29.7.0: 1933 | version "29.7.0" 1934 | resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.7.0.tgz#c2c574c3f51865da1bb329036778a69bf88a6be5" 1935 | integrity sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw== 1936 | dependencies: 1937 | "@babel/core" "^7.11.6" 1938 | "@babel/generator" "^7.7.2" 1939 | "@babel/plugin-syntax-jsx" "^7.7.2" 1940 | "@babel/plugin-syntax-typescript" "^7.7.2" 1941 | "@babel/types" "^7.3.3" 1942 | "@jest/expect-utils" "^29.7.0" 1943 | "@jest/transform" "^29.7.0" 1944 | "@jest/types" "^29.6.3" 1945 | babel-preset-current-node-syntax "^1.0.0" 1946 | chalk "^4.0.0" 1947 | expect "^29.7.0" 1948 | graceful-fs "^4.2.9" 1949 | jest-diff "^29.7.0" 1950 | jest-get-type "^29.6.3" 1951 | jest-matcher-utils "^29.7.0" 1952 | jest-message-util "^29.7.0" 1953 | jest-util "^29.7.0" 1954 | natural-compare "^1.4.0" 1955 | pretty-format "^29.7.0" 1956 | semver "^7.5.3" 1957 | 1958 | jest-util@^29.7.0: 1959 | version "29.7.0" 1960 | resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" 1961 | integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== 1962 | dependencies: 1963 | "@jest/types" "^29.6.3" 1964 | "@types/node" "*" 1965 | chalk "^4.0.0" 1966 | ci-info "^3.2.0" 1967 | graceful-fs "^4.2.9" 1968 | picomatch "^2.2.3" 1969 | 1970 | jest-validate@^29.7.0: 1971 | version "29.7.0" 1972 | resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.7.0.tgz#7bf705511c64da591d46b15fce41400d52147d9c" 1973 | integrity sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw== 1974 | dependencies: 1975 | "@jest/types" "^29.6.3" 1976 | camelcase "^6.2.0" 1977 | chalk "^4.0.0" 1978 | jest-get-type "^29.6.3" 1979 | leven "^3.1.0" 1980 | pretty-format "^29.7.0" 1981 | 1982 | jest-watcher@^29.7.0: 1983 | version "29.7.0" 1984 | resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.7.0.tgz#7810d30d619c3a62093223ce6bb359ca1b28a2f2" 1985 | integrity sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g== 1986 | dependencies: 1987 | "@jest/test-result" "^29.7.0" 1988 | "@jest/types" "^29.6.3" 1989 | "@types/node" "*" 1990 | ansi-escapes "^4.2.1" 1991 | chalk "^4.0.0" 1992 | emittery "^0.13.1" 1993 | jest-util "^29.7.0" 1994 | string-length "^4.0.1" 1995 | 1996 | jest-worker@^29.7.0: 1997 | version "29.7.0" 1998 | resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" 1999 | integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== 2000 | dependencies: 2001 | "@types/node" "*" 2002 | jest-util "^29.7.0" 2003 | merge-stream "^2.0.0" 2004 | supports-color "^8.0.0" 2005 | 2006 | jest@^29.7.0: 2007 | version "29.7.0" 2008 | resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" 2009 | integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== 2010 | dependencies: 2011 | "@jest/core" "^29.7.0" 2012 | "@jest/types" "^29.6.3" 2013 | import-local "^3.0.2" 2014 | jest-cli "^29.7.0" 2015 | 2016 | js-tokens@^4.0.0: 2017 | version "4.0.0" 2018 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 2019 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 2020 | 2021 | js-yaml@^3.13.1: 2022 | version "3.14.1" 2023 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" 2024 | integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== 2025 | dependencies: 2026 | argparse "^1.0.7" 2027 | esprima "^4.0.0" 2028 | 2029 | js-yaml@^4.1.0: 2030 | version "4.1.0" 2031 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" 2032 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 2033 | dependencies: 2034 | argparse "^2.0.1" 2035 | 2036 | jsesc@^3.0.2: 2037 | version "3.1.0" 2038 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" 2039 | integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== 2040 | 2041 | json-buffer@3.0.1: 2042 | version "3.0.1" 2043 | resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" 2044 | integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== 2045 | 2046 | json-parse-even-better-errors@^2.3.0: 2047 | version "2.3.1" 2048 | resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" 2049 | integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== 2050 | 2051 | json-schema-traverse@^0.4.1: 2052 | version "0.4.1" 2053 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 2054 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 2055 | 2056 | json-stable-stringify-without-jsonify@^1.0.1: 2057 | version "1.0.1" 2058 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 2059 | integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== 2060 | 2061 | json5@^2.2.3: 2062 | version "2.2.3" 2063 | resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" 2064 | integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== 2065 | 2066 | keyv@^4.5.4: 2067 | version "4.5.4" 2068 | resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" 2069 | integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== 2070 | dependencies: 2071 | json-buffer "3.0.1" 2072 | 2073 | kleur@^3.0.3: 2074 | version "3.0.3" 2075 | resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" 2076 | integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== 2077 | 2078 | leven@^3.1.0: 2079 | version "3.1.0" 2080 | resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" 2081 | integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== 2082 | 2083 | levn@^0.4.1: 2084 | version "0.4.1" 2085 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" 2086 | integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== 2087 | dependencies: 2088 | prelude-ls "^1.2.1" 2089 | type-check "~0.4.0" 2090 | 2091 | lines-and-columns@^1.1.6: 2092 | version "1.2.4" 2093 | resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" 2094 | integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== 2095 | 2096 | locate-path@^5.0.0: 2097 | version "5.0.0" 2098 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" 2099 | integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== 2100 | dependencies: 2101 | p-locate "^4.1.0" 2102 | 2103 | locate-path@^6.0.0: 2104 | version "6.0.0" 2105 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 2106 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 2107 | dependencies: 2108 | p-locate "^5.0.0" 2109 | 2110 | lodash.merge@^4.6.2: 2111 | version "4.6.2" 2112 | resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" 2113 | integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== 2114 | 2115 | lru-cache@^5.1.1: 2116 | version "5.1.1" 2117 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" 2118 | integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== 2119 | dependencies: 2120 | yallist "^3.0.2" 2121 | 2122 | make-dir@^4.0.0: 2123 | version "4.0.0" 2124 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" 2125 | integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== 2126 | dependencies: 2127 | semver "^7.5.3" 2128 | 2129 | makeerror@1.0.12: 2130 | version "1.0.12" 2131 | resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" 2132 | integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== 2133 | dependencies: 2134 | tmpl "1.0.5" 2135 | 2136 | merge-stream@^2.0.0: 2137 | version "2.0.0" 2138 | resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" 2139 | integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== 2140 | 2141 | micromatch@^4.0.4: 2142 | version "4.0.8" 2143 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" 2144 | integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== 2145 | dependencies: 2146 | braces "^3.0.3" 2147 | picomatch "^2.3.1" 2148 | 2149 | mimic-fn@^2.1.0: 2150 | version "2.1.0" 2151 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" 2152 | integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== 2153 | 2154 | minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: 2155 | version "3.1.2" 2156 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 2157 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 2158 | dependencies: 2159 | brace-expansion "^1.1.7" 2160 | 2161 | ms@^2.1.3: 2162 | version "2.1.3" 2163 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 2164 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 2165 | 2166 | natural-compare@^1.4.0: 2167 | version "1.4.0" 2168 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 2169 | integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== 2170 | 2171 | node-int64@^0.4.0: 2172 | version "0.4.0" 2173 | resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" 2174 | integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== 2175 | 2176 | node-releases@^2.0.19: 2177 | version "2.0.19" 2178 | resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" 2179 | integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== 2180 | 2181 | normalize-path@^3.0.0: 2182 | version "3.0.0" 2183 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 2184 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 2185 | 2186 | npm-run-path@^4.0.1: 2187 | version "4.0.1" 2188 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" 2189 | integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== 2190 | dependencies: 2191 | path-key "^3.0.0" 2192 | 2193 | once@^1.3.0, once@^1.4.0: 2194 | version "1.4.0" 2195 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 2196 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 2197 | dependencies: 2198 | wrappy "1" 2199 | 2200 | onetime@^5.1.2: 2201 | version "5.1.2" 2202 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" 2203 | integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== 2204 | dependencies: 2205 | mimic-fn "^2.1.0" 2206 | 2207 | optionator@^0.9.3: 2208 | version "0.9.4" 2209 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" 2210 | integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== 2211 | dependencies: 2212 | deep-is "^0.1.3" 2213 | fast-levenshtein "^2.0.6" 2214 | levn "^0.4.1" 2215 | prelude-ls "^1.2.1" 2216 | type-check "^0.4.0" 2217 | word-wrap "^1.2.5" 2218 | 2219 | p-limit@^2.2.0: 2220 | version "2.3.0" 2221 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" 2222 | integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== 2223 | dependencies: 2224 | p-try "^2.0.0" 2225 | 2226 | p-limit@^3.0.2, p-limit@^3.1.0: 2227 | version "3.1.0" 2228 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 2229 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 2230 | dependencies: 2231 | yocto-queue "^0.1.0" 2232 | 2233 | p-locate@^4.1.0: 2234 | version "4.1.0" 2235 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" 2236 | integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== 2237 | dependencies: 2238 | p-limit "^2.2.0" 2239 | 2240 | p-locate@^5.0.0: 2241 | version "5.0.0" 2242 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 2243 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 2244 | dependencies: 2245 | p-limit "^3.0.2" 2246 | 2247 | p-try@^2.0.0: 2248 | version "2.2.0" 2249 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" 2250 | integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== 2251 | 2252 | parent-module@^1.0.0: 2253 | version "1.0.1" 2254 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 2255 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 2256 | dependencies: 2257 | callsites "^3.0.0" 2258 | 2259 | parse-json@^5.2.0: 2260 | version "5.2.0" 2261 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" 2262 | integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== 2263 | dependencies: 2264 | "@babel/code-frame" "^7.0.0" 2265 | error-ex "^1.3.1" 2266 | json-parse-even-better-errors "^2.3.0" 2267 | lines-and-columns "^1.1.6" 2268 | 2269 | path-exists@^4.0.0: 2270 | version "4.0.0" 2271 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 2272 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 2273 | 2274 | path-is-absolute@^1.0.0: 2275 | version "1.0.1" 2276 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 2277 | integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== 2278 | 2279 | path-key@^3.0.0, path-key@^3.1.0: 2280 | version "3.1.1" 2281 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 2282 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 2283 | 2284 | path-parse@^1.0.7: 2285 | version "1.0.7" 2286 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" 2287 | integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== 2288 | 2289 | picocolors@^1.0.0, picocolors@^1.1.1: 2290 | version "1.1.1" 2291 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" 2292 | integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== 2293 | 2294 | picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: 2295 | version "2.3.1" 2296 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 2297 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 2298 | 2299 | pirates@^4.0.4: 2300 | version "4.0.6" 2301 | resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" 2302 | integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== 2303 | 2304 | pkg-dir@^4.2.0: 2305 | version "4.2.0" 2306 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" 2307 | integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== 2308 | dependencies: 2309 | find-up "^4.0.0" 2310 | 2311 | prelude-ls@^1.2.1: 2312 | version "1.2.1" 2313 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" 2314 | integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== 2315 | 2316 | prettier-linter-helpers@^1.0.0: 2317 | version "1.0.0" 2318 | resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" 2319 | integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== 2320 | dependencies: 2321 | fast-diff "^1.1.2" 2322 | 2323 | prettier@^3.4.2: 2324 | version "3.4.2" 2325 | resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.4.2.tgz#a5ce1fb522a588bf2b78ca44c6e6fe5aa5a2b13f" 2326 | integrity sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ== 2327 | 2328 | pretty-format@^29.7.0: 2329 | version "29.7.0" 2330 | resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.7.0.tgz#ca42c758310f365bfa71a0bda0a807160b776812" 2331 | integrity sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ== 2332 | dependencies: 2333 | "@jest/schemas" "^29.6.3" 2334 | ansi-styles "^5.0.0" 2335 | react-is "^18.0.0" 2336 | 2337 | prompts@^2.0.1: 2338 | version "2.4.2" 2339 | resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.2.tgz#7b57e73b3a48029ad10ebd44f74b01722a4cb069" 2340 | integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== 2341 | dependencies: 2342 | kleur "^3.0.3" 2343 | sisteransi "^1.0.5" 2344 | 2345 | punycode@^2.1.0: 2346 | version "2.3.1" 2347 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" 2348 | integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== 2349 | 2350 | pure-rand@^6.0.0: 2351 | version "6.1.0" 2352 | resolved "https://registry.yarnpkg.com/pure-rand/-/pure-rand-6.1.0.tgz#d173cf23258231976ccbdb05247c9787957604f2" 2353 | integrity sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA== 2354 | 2355 | react-is@^18.0.0: 2356 | version "18.3.1" 2357 | resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.3.1.tgz#e83557dc12eae63a99e003a46388b1dcbb44db7e" 2358 | integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== 2359 | 2360 | require-directory@^2.1.1: 2361 | version "2.1.1" 2362 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 2363 | integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== 2364 | 2365 | resolve-cwd@^3.0.0: 2366 | version "3.0.0" 2367 | resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" 2368 | integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== 2369 | dependencies: 2370 | resolve-from "^5.0.0" 2371 | 2372 | resolve-from@^4.0.0: 2373 | version "4.0.0" 2374 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 2375 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 2376 | 2377 | resolve-from@^5.0.0: 2378 | version "5.0.0" 2379 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" 2380 | integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== 2381 | 2382 | resolve.exports@^2.0.0: 2383 | version "2.0.3" 2384 | resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.3.tgz#41955e6f1b4013b7586f873749a635dea07ebe3f" 2385 | integrity sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A== 2386 | 2387 | resolve@^1.20.0: 2388 | version "1.22.10" 2389 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" 2390 | integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== 2391 | dependencies: 2392 | is-core-module "^2.16.0" 2393 | path-parse "^1.0.7" 2394 | supports-preserve-symlinks-flag "^1.0.0" 2395 | 2396 | semver@^6.3.0, semver@^6.3.1: 2397 | version "6.3.1" 2398 | resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" 2399 | integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== 2400 | 2401 | semver@^7.5.3, semver@^7.5.4: 2402 | version "7.6.3" 2403 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" 2404 | integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== 2405 | 2406 | shebang-command@^2.0.0: 2407 | version "2.0.0" 2408 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 2409 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 2410 | dependencies: 2411 | shebang-regex "^3.0.0" 2412 | 2413 | shebang-regex@^3.0.0: 2414 | version "3.0.0" 2415 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 2416 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 2417 | 2418 | signal-exit@^3.0.3, signal-exit@^3.0.7: 2419 | version "3.0.7" 2420 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" 2421 | integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== 2422 | 2423 | sisteransi@^1.0.5: 2424 | version "1.0.5" 2425 | resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" 2426 | integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== 2427 | 2428 | slash@^3.0.0: 2429 | version "3.0.0" 2430 | resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" 2431 | integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== 2432 | 2433 | source-map-support@0.5.13: 2434 | version "0.5.13" 2435 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.13.tgz#31b24a9c2e73c2de85066c0feb7d44767ed52932" 2436 | integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== 2437 | dependencies: 2438 | buffer-from "^1.0.0" 2439 | source-map "^0.6.0" 2440 | 2441 | source-map@^0.6.0, source-map@^0.6.1: 2442 | version "0.6.1" 2443 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 2444 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 2445 | 2446 | sprintf-js@~1.0.2: 2447 | version "1.0.3" 2448 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 2449 | integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== 2450 | 2451 | stack-utils@^2.0.3: 2452 | version "2.0.6" 2453 | resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.6.tgz#aaf0748169c02fc33c8232abccf933f54a1cc34f" 2454 | integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== 2455 | dependencies: 2456 | escape-string-regexp "^2.0.0" 2457 | 2458 | string-length@^4.0.1: 2459 | version "4.0.2" 2460 | resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" 2461 | integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== 2462 | dependencies: 2463 | char-regex "^1.0.2" 2464 | strip-ansi "^6.0.0" 2465 | 2466 | string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: 2467 | version "4.2.3" 2468 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 2469 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 2470 | dependencies: 2471 | emoji-regex "^8.0.0" 2472 | is-fullwidth-code-point "^3.0.0" 2473 | strip-ansi "^6.0.1" 2474 | 2475 | strip-ansi@^6.0.0, strip-ansi@^6.0.1: 2476 | version "6.0.1" 2477 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 2478 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 2479 | dependencies: 2480 | ansi-regex "^5.0.1" 2481 | 2482 | strip-bom@^4.0.0: 2483 | version "4.0.0" 2484 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" 2485 | integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== 2486 | 2487 | strip-final-newline@^2.0.0: 2488 | version "2.0.0" 2489 | resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" 2490 | integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== 2491 | 2492 | strip-json-comments@^3.1.1: 2493 | version "3.1.1" 2494 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 2495 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 2496 | 2497 | supports-color@^7.1.0: 2498 | version "7.2.0" 2499 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 2500 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 2501 | dependencies: 2502 | has-flag "^4.0.0" 2503 | 2504 | supports-color@^8.0.0: 2505 | version "8.1.1" 2506 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" 2507 | integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== 2508 | dependencies: 2509 | has-flag "^4.0.0" 2510 | 2511 | supports-preserve-symlinks-flag@^1.0.0: 2512 | version "1.0.0" 2513 | resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" 2514 | integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== 2515 | 2516 | synckit@^0.9.1: 2517 | version "0.9.2" 2518 | resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.9.2.tgz#a3a935eca7922d48b9e7d6c61822ee6c3ae4ec62" 2519 | integrity sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw== 2520 | dependencies: 2521 | "@pkgr/core" "^0.1.0" 2522 | tslib "^2.6.2" 2523 | 2524 | test-exclude@^6.0.0: 2525 | version "6.0.0" 2526 | resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" 2527 | integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== 2528 | dependencies: 2529 | "@istanbuljs/schema" "^0.1.2" 2530 | glob "^7.1.4" 2531 | minimatch "^3.0.4" 2532 | 2533 | tmpl@1.0.5: 2534 | version "1.0.5" 2535 | resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" 2536 | integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== 2537 | 2538 | to-regex-range@^5.0.1: 2539 | version "5.0.1" 2540 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 2541 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 2542 | dependencies: 2543 | is-number "^7.0.0" 2544 | 2545 | tslib@^2.6.2: 2546 | version "2.8.1" 2547 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" 2548 | integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== 2549 | 2550 | tunnel@^0.0.6: 2551 | version "0.0.6" 2552 | resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" 2553 | integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== 2554 | 2555 | type-check@^0.4.0, type-check@~0.4.0: 2556 | version "0.4.0" 2557 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" 2558 | integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== 2559 | dependencies: 2560 | prelude-ls "^1.2.1" 2561 | 2562 | type-detect@4.0.8: 2563 | version "4.0.8" 2564 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" 2565 | integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== 2566 | 2567 | type-fest@^0.21.3: 2568 | version "0.21.3" 2569 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" 2570 | integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== 2571 | 2572 | undici-types@~6.20.0: 2573 | version "6.20.0" 2574 | resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.20.0.tgz#8171bf22c1f588d1554d55bf204bc624af388433" 2575 | integrity sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg== 2576 | 2577 | undici@^5.25.4: 2578 | version "5.28.5" 2579 | resolved "https://registry.yarnpkg.com/undici/-/undici-5.28.5.tgz#b2b94b6bf8f1d919bc5a6f31f2c01deb02e54d4b" 2580 | integrity sha512-zICwjrDrcrUE0pyyJc1I2QzBkLM8FINsgOrt6WjA+BgajVq9Nxu2PbFFXUrAggLfDXlZGZBVZYw7WNV5KiBiBA== 2581 | dependencies: 2582 | "@fastify/busboy" "^2.0.0" 2583 | 2584 | universal-user-agent@^6.0.0: 2585 | version "6.0.1" 2586 | resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.1.tgz#15f20f55da3c930c57bddbf1734c6654d5fd35aa" 2587 | integrity sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ== 2588 | 2589 | update-browserslist-db@^1.1.1: 2590 | version "1.1.2" 2591 | resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz#97e9c96ab0ae7bcac08e9ae5151d26e6bc6b5580" 2592 | integrity sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg== 2593 | dependencies: 2594 | escalade "^3.2.0" 2595 | picocolors "^1.1.1" 2596 | 2597 | uri-js@^4.2.2: 2598 | version "4.4.1" 2599 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" 2600 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 2601 | dependencies: 2602 | punycode "^2.1.0" 2603 | 2604 | v8-to-istanbul@^9.0.1: 2605 | version "9.3.0" 2606 | resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz#b9572abfa62bd556c16d75fdebc1a411d5ff3175" 2607 | integrity sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA== 2608 | dependencies: 2609 | "@jridgewell/trace-mapping" "^0.3.12" 2610 | "@types/istanbul-lib-coverage" "^2.0.1" 2611 | convert-source-map "^2.0.0" 2612 | 2613 | walker@^1.0.8: 2614 | version "1.0.8" 2615 | resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" 2616 | integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== 2617 | dependencies: 2618 | makeerror "1.0.12" 2619 | 2620 | which@^2.0.1: 2621 | version "2.0.2" 2622 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 2623 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 2624 | dependencies: 2625 | isexe "^2.0.0" 2626 | 2627 | word-wrap@^1.2.5: 2628 | version "1.2.5" 2629 | resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" 2630 | integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== 2631 | 2632 | wrap-ansi@^7.0.0: 2633 | version "7.0.0" 2634 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 2635 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 2636 | dependencies: 2637 | ansi-styles "^4.0.0" 2638 | string-width "^4.1.0" 2639 | strip-ansi "^6.0.0" 2640 | 2641 | wrappy@1: 2642 | version "1.0.2" 2643 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2644 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== 2645 | 2646 | write-file-atomic@^4.0.2: 2647 | version "4.0.2" 2648 | resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" 2649 | integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== 2650 | dependencies: 2651 | imurmurhash "^0.1.4" 2652 | signal-exit "^3.0.7" 2653 | 2654 | y18n@^5.0.5: 2655 | version "5.0.8" 2656 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" 2657 | integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== 2658 | 2659 | yallist@^3.0.2: 2660 | version "3.1.1" 2661 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" 2662 | integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== 2663 | 2664 | yargs-parser@^21.1.1: 2665 | version "21.1.1" 2666 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" 2667 | integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== 2668 | 2669 | yargs@^17.3.1: 2670 | version "17.7.2" 2671 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" 2672 | integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== 2673 | dependencies: 2674 | cliui "^8.0.1" 2675 | escalade "^3.1.1" 2676 | get-caller-file "^2.0.5" 2677 | require-directory "^2.1.1" 2678 | string-width "^4.2.3" 2679 | y18n "^5.0.5" 2680 | yargs-parser "^21.1.1" 2681 | 2682 | yocto-queue@^0.1.0: 2683 | version "0.1.0" 2684 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 2685 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 2686 | --------------------------------------------------------------------------------