├── changelog-enforcer ├── action.yml └── index.js ├── get-changed-extensions ├── action.yml ├── get_changed_extensions.sh └── get_changed_extensions_pr.js ├── get-command └── action.yml ├── git-commit └── action.yml ├── git-post-store-urls-to-pr └── action.yml ├── publish-npm └── action.yml ├── ray-cli ├── action.yml └── ray_cli.sh ├── ray └── action.yml ├── setup-1password-cli └── action.yml ├── setup-cli ├── action.yml └── setup_cli.sh ├── setup-git └── action.yml ├── setup-go └── action.yml ├── setup-node └── action.yml ├── setup-npm └── action.yml ├── setup-xcode └── action.yml ├── slack-notify-pr └── action.yml ├── slack-notify-push └── action.yml └── slack-send ├── .gitignore ├── action.yml ├── dist └── index.js ├── index.js ├── package-lock.json └── package.json /changelog-enforcer/action.yml: -------------------------------------------------------------------------------- 1 | name: "Changelog enforcer" 2 | description: "Force a Changelog modification on each extension modified in PR in raycast/extensions repository" 3 | runs: 4 | using: "composite" 5 | steps: 6 | - name: Changelog enforcer 7 | uses: actions/github-script@v7 8 | with: 9 | script: | 10 | const script = require("${{ github.action_path }}/index.js") 11 | await script({ 12 | github, 13 | context, 14 | core 15 | }) 16 | -------------------------------------------------------------------------------- /changelog-enforcer/index.js: -------------------------------------------------------------------------------- 1 | module.exports = async ({ github, context, core, custom_paths }) => { 2 | try { 3 | const owner = context.repo.owner; 4 | const repo = context.repo.repo; 5 | const pullRequest = context.payload.pull_request; 6 | if (pullRequest == undefined) { 7 | core.setFailed(`Cannot find Pull Request`); 8 | } 9 | const labelNames = pullRequest.labels.map((l) => l.name); 10 | console.log(`PR labels: ${labelNames}`); 11 | const skipChangeLogLabel = "skip-changelog"; 12 | if (labelNames.includes(skipChangeLogLabel)) { 13 | console.log( 14 | `Skipping changelog checks: found "${skipChangeLogLabel}" label on PR` 15 | ); 16 | return; 17 | } 18 | 19 | let files = []; 20 | for await (const response of github.paginate.iterator( 21 | github.rest.pulls.listFiles, 22 | { 23 | owner: owner, 24 | repo: repo, 25 | pull_number: pullRequest.number, 26 | } 27 | )) { 28 | files.push(...response.data); 29 | } 30 | console.log("Files changed in the PR: " + files.length); 31 | 32 | let extensions = new Set(); 33 | let missingChangelogs = []; 34 | let caseMismatchChangelogs = []; 35 | files.forEach((file) => { 36 | const parts = file.filename.split("/"); 37 | if (parts.length > 2 && parts[0] === "extensions") { 38 | extensions.add(parts[1]); 39 | } 40 | }); 41 | console.log("Extensions changed:"); 42 | extensions.forEach((extension) => { 43 | console.log(`- ${extension}`); 44 | }); 45 | 46 | let changelogFileName = "CHANGELOG.md"; 47 | extensions.forEach((extension) => { 48 | const changelogPath = `extensions/${extension}/${changelogFileName}`; 49 | const changelogExists = files.some( 50 | (file) => file.filename === changelogPath 51 | ); 52 | if (!changelogExists) { 53 | const caseInsensitiveMatch = files.find( 54 | (file) => file.filename.toLowerCase() === changelogPath.toLowerCase() 55 | ); 56 | if (caseInsensitiveMatch) { 57 | caseMismatchChangelogs.push(extension); 58 | } else { 59 | missingChangelogs.push(extension); 60 | } 61 | } 62 | }); 63 | 64 | if (caseMismatchChangelogs.length > 0) { 65 | core.setFailed( 66 | `Changelog file found with the wrong case for extensions: ${caseMismatchChangelogs.join( 67 | ", " 68 | )}. Expected '${changelogFileName}'.` 69 | ); 70 | } else if (missingChangelogs.length > 0) { 71 | core.setFailed( 72 | `Missing ${changelogFileName} update for extensions: ${missingChangelogs.join( 73 | ", " 74 | )}` 75 | ); 76 | } 77 | } catch (error) { 78 | core.setFailed(error.message); 79 | } 80 | }; 81 | -------------------------------------------------------------------------------- /get-changed-extensions/action.yml: -------------------------------------------------------------------------------- 1 | name: "Get paths" 2 | 3 | description: "Get changed extensions" 4 | 5 | inputs: 6 | custom_paths: 7 | description: "Paths from user input for manually dispatched runs" 8 | github_event_name: 9 | description: "github.event_name" 10 | pull_request_number: 11 | description: "Pull request number" 12 | outputs: 13 | paths: 14 | description: "Paths for changed extensions" 15 | value: ${{ steps.get_changed_extensions.outputs.paths }} 16 | runs: 17 | using: "composite" 18 | steps: 19 | - name: Get changed files 20 | id: get_changed_extensions_pr 21 | uses: actions/github-script@v7 22 | with: 23 | script: | 24 | const script = require("${{ github.action_path }}/get_changed_extensions_pr.js") 25 | await script({ 26 | github, 27 | context, 28 | core, 29 | custom_paths: "${{ inputs.custom_paths }}", 30 | pull_request_number: "${{ inputs.pull_request_number }}" 31 | }) 32 | - name: Checkout Sparse 33 | if: env.sparse_checkout_directories != '' 34 | uses: actions/checkout@v4 35 | with: 36 | sparse-checkout: "${{ env.sparse_checkout_directories }}" 37 | # Use older fetch-depth + tj-changed-files logic for regular commits that doesn't have PRs to fetch from 38 | - name: Checkout fetch depth 0 39 | if: env.sparse_checkout_directories == '' 40 | uses: actions/checkout@v4 41 | with: 42 | fetch-depth: 0 43 | fetch-tags: false 44 | - name: Generate "since_last_remote_commit" 45 | if: env.sparse_checkout_directories == '' 46 | uses: haya14busa/action-cond@v1.2.1 47 | id: since_last_remote_commit 48 | with: 49 | cond: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }} 50 | if_true: "true" 51 | if_false: "false" 52 | - name: Get changed files 53 | if: env.sparse_checkout_directories == '' 54 | id: tj-changed-files 55 | uses: tj-actions/changed-files@v44.0.1 56 | with: 57 | # Fixes problems with multiple commits pushed at once to main 58 | since_last_remote_commit: ${{ steps.since_last_remote_commit.outputs.value }} 59 | separator: "," 60 | - name: Get changed extensions 61 | shell: bash 62 | id: get_changed_extensions 63 | run: | 64 | set -e -o noglob 65 | if [[ -n "${{ steps.get_changed_extensions_pr.outputs.changed_extensions }}" ]]; then 66 | echo "paths=${{ steps.get_changed_extensions_pr.outputs.changed_extensions }}" >> $GITHUB_OUTPUT 67 | else 68 | paths=$(${{ github.action_path }}/get_changed_extensions.sh "${{ inputs.custom_paths || steps.tj-changed-files.outputs.all_modified_files }}") 69 | echo "paths=$paths" >> $GITHUB_OUTPUT 70 | fi 71 | -------------------------------------------------------------------------------- /get-changed-extensions/get_changed_extensions.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -e -o noglob 4 | 5 | workspace_dir=${GITHUB_WORKSPACE} 6 | workspacer_parent_dir=$(dirname "$workspace_dir") 7 | 8 | wildcard='/**' 9 | 10 | IFS=$',' read -r -a directories <<< "$1" 11 | 12 | declare -a directories_to_search=() 13 | 14 | for dir in "${directories[@]}" ; do 15 | if ! [[ "$dir" =~ extensions/* ]] ; then 16 | continue 17 | fi 18 | absolute_dir="$workspace_dir/$dir" 19 | # create array with all directories to search 20 | # for normal case iterate upwards with all directories (try to not go above $workspace_dir) and then execute find on those 21 | # for ** case list all directories containing package.json with raycast && commands straight away 22 | 23 | if [[ "${absolute_dir}" == *"$wildcard" ]] ; then 24 | # if directory ends with wild card, find all subdirectories containing package.json, ignore node_modules folder 25 | absolute_dir=${absolute_dir%"$wildcard"} 26 | 27 | while IFS= read -r -d $'\0'; do 28 | for reply in ${REPLY[@]}; do 29 | directory=$(dirname $reply) 30 | if [[ ! " ${directories_to_search[@]} " =~ " ${directory} " ]]; then 31 | directories_to_search+=("${directory}") 32 | fi 33 | done 34 | done < <(find "$absolute_dir" -type d -name node_modules -prune -o -type f -name package.json -print0) 35 | else 36 | # for standard use case, search all parent directories as changed files may be deeper than folder containing package.json 37 | while [ "$absolute_dir" != $workspacer_parent_dir ]; 38 | do 39 | if [ -d "$absolute_dir" ]; then 40 | if [[ ! " ${directories_to_search[@]} " =~ " ${absolute_dir} " ]]; then 41 | directories_to_search+=("$absolute_dir") 42 | fi 43 | fi 44 | absolute_dir=$(dirname "$absolute_dir") 45 | done 46 | fi 47 | done 48 | 49 | declare -a extension_changed=() 50 | 51 | for dir in "${directories_to_search[@]}"; do 52 | if [ -d "$dir" ]; then 53 | # make sure package.json contains commands and raycast 54 | if [[ $(find "$dir" -maxdepth 1 -type f -name 'package.json' -exec grep -iq "commands" {} \; -exec grep -il "raycast" {} \;) ]]; then 55 | if [[ ! " ${extension_changed[@]} " =~ " ${dir} " ]]; then 56 | extension_changed+=("$dir") 57 | fi 58 | fi 59 | fi 60 | done 61 | 62 | SAVEIFS=$IFS 63 | IFS=','; 64 | echo "${extension_changed[*]}"; 65 | IFS=$SAVEIFS -------------------------------------------------------------------------------- /get-changed-extensions/get_changed_extensions_pr.js: -------------------------------------------------------------------------------- 1 | module.exports = async ({ 2 | github, 3 | context, 4 | core, 5 | custom_paths, 6 | pull_request_number, 7 | }) => { 8 | const commitSHA = context.sha; 9 | const owner = context.repo.owner; 10 | const repo = context.repo.repo; 11 | let pull_number; 12 | 13 | console.log("Custom paths: " + custom_paths); 14 | console.log("Pull request number: " + pull_request_number); 15 | 16 | let directories = new Set(); 17 | 18 | if (context.eventName === "workflow_dispatch" && custom_paths) { 19 | // wildcard case will be handled by a bash script for now as it requires full-checkout first 20 | if (custom_paths != "extensions/**") { 21 | // for defined set of paths, we handle it here to get sparse-checkout flow 22 | custom_paths.split(",").forEach((dir) => directories.add(dir)); 23 | } 24 | } else { 25 | if (pull_request_number) { 26 | pull_number = pull_request_number; 27 | } else if (context.payload.pull_request) { 28 | pull_number = context.payload.pull_request.number; 29 | } 30 | 31 | if (!pull_number) { 32 | try { 33 | await github.rest.repos 34 | .listPullRequestsAssociatedWithCommit({ 35 | owner: owner, 36 | repo: repo, 37 | commit_sha: commitSHA, 38 | }) 39 | .then(async function (response) { 40 | if (response.data.length > 0) { 41 | const pr = response.data[0]; 42 | pull_number = pr.number; 43 | } 44 | }); 45 | } catch (error) { 46 | if (error.status === 403) { 47 | // when running from private organization repository without a proper token, we may not be able to use the GitHub API 48 | // in that case we fallback to full checkout 49 | console.log( 50 | "Received a 403 error. Permission denied to access the resource." 51 | ); 52 | } else { 53 | core.setFailed(`Action failed with error: ${error.message}`); 54 | } 55 | } 56 | } 57 | 58 | if (pull_number) { 59 | console.log("Pull number: " + pull_number); 60 | let files = []; 61 | for await (const response of github.paginate.iterator( 62 | github.rest.pulls.listFiles, 63 | { 64 | owner: owner, 65 | repo: repo, 66 | pull_number: pull_number, 67 | } 68 | )) { 69 | files.push(...response.data); 70 | } 71 | console.log("Files changed in the PR: " + files.length); 72 | files.forEach((file) => { 73 | const parts = file.filename.split("/"); 74 | if (parts.length > 2 && parts[0] === "extensions") { 75 | directories.add("extensions/" + parts[1] + "/"); 76 | } 77 | }); 78 | } else { 79 | console.log("No PR found for commit " + context.sha); 80 | return; 81 | } 82 | } 83 | 84 | if (directories.size > 0) { 85 | // using environment variable for sparse-checkout due to problems with new lines in setOutput 86 | core.exportVariable( 87 | "sparse_checkout_directories", 88 | Array.from(directories).join("\n") 89 | ); 90 | 91 | const workspacePath = process.env.GITHUB_WORKSPACE; 92 | const fullPaths = Array.from(directories).map( 93 | (path) => `${workspacePath}/${path}` 94 | ); 95 | core.setOutput("changed_extensions", fullPaths.join(",")); 96 | } 97 | }; 98 | -------------------------------------------------------------------------------- /get-command/action.yml: -------------------------------------------------------------------------------- 1 | name: "Get command to execute on CLI based on github_event_name" 2 | 3 | description: "Get command to execute on CLI based on github_event_name" 4 | 5 | inputs: 6 | custom_command: 7 | description: "User defined custom command for workflow_dispatch" 8 | github_event_name: 9 | description: "github.event_name" 10 | outputs: 11 | command: 12 | description: "command" 13 | value: ${{ steps.calculate_command.outputs.command }} 14 | runs: 15 | using: "composite" 16 | steps: 17 | - name: Calculate command 18 | id: calculate_command 19 | uses: actions/github-script@v7 20 | with: 21 | script: | 22 | let event_name = "${{ inputs.github_event_name }}"; 23 | let command; 24 | if (event_name === 'push') { 25 | command = 'publish'; 26 | } else if (event_name === 'pull_request') { 27 | command = 'build'; 28 | } else { 29 | command = "${{ inputs.custom_command }}"; 30 | } 31 | core.setOutput("command", command); 32 | -------------------------------------------------------------------------------- /git-commit/action.yml: -------------------------------------------------------------------------------- 1 | name: "Git commit" 2 | 3 | description: "Git commit" 4 | 5 | inputs: 6 | message: 7 | description: "Commit messsage" 8 | required: true 9 | repo_dir: 10 | description: "Directory to add & commit" 11 | required: true 12 | auto_resolve_conflicts: 13 | description: "Use '-X ours' on rebase" 14 | required: false 15 | 16 | runs: 17 | using: "composite" 18 | steps: 19 | - name: Setup GIT 20 | uses: raycast/github-actions/setup-git@v1.17.0 21 | - name: Commit 22 | shell: bash 23 | working-directory: ${{ inputs.repo_dir }} 24 | run: | 25 | if ! [[ -z $(git status -s .) ]] ; then 26 | git add . 27 | git status . 28 | git commit --message "${{ inputs.message }}" 29 | 30 | branch_name=$(git rev-parse --abbrev-ref HEAD) 31 | git_conflicts="" && [[ "${{ inputs.auto_resolve_conflicts }}" == true ]] && git_conflicts="-X ours" 32 | git fetch origin $branch_name 33 | git rebase origin/$branch_name $git_conflicts 34 | git push -u origin $branch_name 35 | else 36 | echo "No changes, skipping sync." 37 | fi 38 | -------------------------------------------------------------------------------- /git-post-store-urls-to-pr/action.yml: -------------------------------------------------------------------------------- 1 | name: "Git Post Store URLs to PR" 2 | 3 | description: "Git Post Store URLs to PR" 4 | 5 | inputs: 6 | store_urls: 7 | description: "Store URLs to published extensions" 8 | required: true 9 | github_token: 10 | description: "Github Token" 11 | required: true 12 | 13 | runs: 14 | using: "composite" 15 | steps: 16 | - name: Setup GIT 17 | uses: raycast/github-actions/setup-git@v1.17.0 18 | - name: Check message 19 | id: check_message 20 | shell: bash 21 | run: | 22 | if [ ! -z "${{ inputs.store_urls }}" ]; then 23 | echo "message_exists=true" >> $GITHUB_OUTPUT 24 | fi 25 | - uses: mshick/add-pr-comment@v2 26 | if: ${{ steps.check_message.outputs.message_exists }} 27 | env: 28 | GITHUB_TOKEN: ${{ inputs.github_token }} 29 | with: 30 | message: | 31 | **Published to the Raycast Store:** 32 | ${{ inputs.store_urls }} 33 | allow-repeats: true 34 | -------------------------------------------------------------------------------- /publish-npm/action.yml: -------------------------------------------------------------------------------- 1 | name: "Publish NPM to a given registry" 2 | 3 | description: "Publish NPM to a given registry" 4 | 5 | inputs: 6 | npm_package_path: 7 | description: "NPM package path" 8 | npm_registry: 9 | description: "NPM registry" 10 | npm_publish_token: 11 | description: "Publish token" 12 | outputs: 13 | version: 14 | description: "version" 15 | value: ${{ steps.publish_npm.outputs.version }} 16 | runs: 17 | using: "composite" 18 | steps: 19 | - name: Setup Node 20 | uses: actions/setup-node@v4 21 | with: 22 | node-version: 20.15.1 23 | - name: Publish NPM 24 | shell: bash 25 | working-directory: ${{ inputs.npm_package_path }} 26 | id: publish_npm 27 | run: | 28 | echo "//${{ inputs.npm_registry }}/:_authToken=${{ inputs.npm_publish_token }}" >> .npmrc 29 | echo "@raycast:registry=https://${{ inputs.npm_registry }}" >> .npmrc 30 | 31 | version=`jq -r .version package.json` 32 | name=`jq -r .name package.json` 33 | public_version=`npm show $name version` 34 | 35 | echo "Candidate version: $version" 36 | echo "Registry version: $public_version" 37 | 38 | if [[ "$version" != "$public_version" ]]; then 39 | npm publish 40 | echo "version=$version" >> $GITHUB_OUTPUT 41 | else 42 | echo "Skipping API publishing" 43 | fi 44 | -------------------------------------------------------------------------------- /ray-cli/action.yml: -------------------------------------------------------------------------------- 1 | name: "Raycast CLI" 2 | 3 | description: "Raycast CLI" 4 | 5 | inputs: 6 | paths: 7 | description: "Paths to execute on" 8 | required: true 9 | command: 10 | description: "Ray CLI command (build | publish)" 11 | required: true 12 | access_token: 13 | description: "Raycast Access Token" 14 | required: false 15 | extension_schema: 16 | description: "Extension schema" 17 | required: false 18 | allow_owners_only_for_extensions: 19 | description: "Whitelist extensions allowed to have owners - each extension in new line. If not set or empty, all extensions are allowe to have it." 20 | required: false 21 | npmrc_path: 22 | description: "Path to npmrc file to access private npm packages" 23 | required: false 24 | raycast_api_alpha_npm_token: 25 | description: "NPM token for alpha version of @raycast/api" 26 | required: false 27 | outputs: 28 | store_urls: 29 | description: "Store URLs for published extensions" 30 | value: ${{ steps.ray_cli.outputs.store_urls }} 31 | runs: 32 | using: "composite" 33 | steps: 34 | - name: Execute command 35 | shell: bash 36 | id: ray_cli 37 | env: 38 | GITHUB_WORKSPACE: $GITHUB_WORKSPACE 39 | run: | 40 | set -e -o noglob 41 | ${{ github.action_path }}/ray_cli.sh "${{ inputs.command }}" "${{ inputs.paths }}" "${{ inputs.access_token }}" "${{ inputs.extension_schema }}" "${{ inputs.allow_owners_only_for_extensions }}" "${{ inputs.npmrc_path }}" "${{ inputs.raycast_api_alpha_npm_token }}" 42 | -------------------------------------------------------------------------------- /ray-cli/ray_cli.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -e -o noglob 4 | 5 | if [ -z "$1" ]; then 6 | echo "Command not provided" 7 | exit 1 8 | else 9 | command=$1 10 | fi 11 | 12 | if [ -z "$2" ]; then 13 | echo "::notice::No extensions to $command. Skipping RayCLI." 14 | exit 0 15 | else 16 | IFS=$',' read -r -a paths <<< "$2" 17 | fi 18 | 19 | if [ ! -z "$3" ]; then 20 | export RAY_TOKEN=$3 21 | access_token=$3 22 | fi 23 | 24 | if [ ! -z "$4" ]; then 25 | extension_schema=$4 26 | else 27 | extension_schema="https://www.raycast.com/schemas/extension.json" 28 | fi 29 | 30 | if [ ! -z "$5" ]; then 31 | SAVEIFS=$IFS 32 | IFS=$'\n' 33 | allow_owners_only_for_extensions=($5) 34 | IFS=$SAVEIFS 35 | fi 36 | 37 | if [ ! -z "$6" ]; then 38 | npmrc_path=$6 39 | fi 40 | 41 | if [ ! -z "$7" ]; then 42 | raycast_api_alpha_npm_token=$7 43 | fi 44 | 45 | function ray_command_from_string() { 46 | case $1 in 47 | build) 48 | ray_command="build -e dist" 49 | ray_validate_options="--skip-owner" 50 | ;; 51 | 52 | publish) 53 | ray_command="publish --skip-validation --skip-notify-raycast" 54 | ray_validate_options="" 55 | ;; 56 | 57 | *) 58 | echo "Unsupported command. 'build' | 'publish'" 59 | return 1 60 | ;; 61 | esac 62 | } 63 | ray_command_from_string $command 64 | 65 | printf "🤖 %d extensions found\n" "${#paths[@]}" 66 | printf '%s\n' "${paths[@]}" 67 | 68 | starting_dir=$PWD 69 | ray_validate="ray validate $ray_validate_options -s $extension_schema --non-interactive --emoji --exit-on-error" 70 | ray_build_publish="ray $ray_command --non-interactive --emoji --exit-on-error" 71 | ray_ci_log_file="/tmp/raycast/ray_cli.log" 72 | 73 | mkdir -p $(dirname $ray_ci_log_file) 74 | touch $ray_ci_log_file 75 | 76 | last_exit_code=0 77 | exit_code=$last_exit_code 78 | 79 | declare -a 'store_urls' 80 | 81 | for dir in "${paths[@]}" ; do 82 | extension_folder=`basename $dir` 83 | printf "\nEntering $dir\n" 84 | cd "$dir" 85 | 86 | ### Precheck package-lock existance for more readable errors 87 | if [ ! -f "./package-lock.json" ]; then 88 | echo "::error::Missing package-lock.json for $extension_folder" 89 | exit_code=1 90 | continue 91 | fi 92 | 93 | if [ -f "./yarn.lock" ]; then 94 | echo "::error::Remove yarn.lock for $extension_folder" 95 | exit_code=1 96 | continue 97 | fi 98 | 99 | git status -s 100 | 101 | ### Prevent 'owner' in package.json if needed 102 | if [ ! -z "${allow_owners_only_for_extensions}" ]; then 103 | if !(printf '%s\n' "${allow_owners_only_for_extensions[@]}" | grep -xq "$extension_folder"); then 104 | has_owner=$(jq 'has("owner")' package.json) 105 | if [ "$has_owner" == "true" ]; then 106 | echo "::error::We are restricting public organisation extensions for the moment. Ping \`@pernielsentikaer\` on Slack to discuss it. ($extension_folder)" 107 | exit_code=1 108 | continue 109 | fi 110 | else 111 | printf "Skipping 'owner' check for $extension_folder\n" 112 | fi 113 | fi 114 | 115 | ### Create .npmrc if needed 116 | cleanup_npmrc=false 117 | if [ ! -z "$npmrc_path" ]; then 118 | echo "Using npmrc from $npmrc_path" 119 | cp $npmrc_path .npmrc 120 | cleanup_npmrc=true 121 | else 122 | api_version=$(jq '.dependencies."@raycast/api"' package.json) 123 | if [[ "$api_version" == *"alpha"* ]]; then 124 | if [ -z "$raycast_api_alpha_npm_token" ]; then 125 | echo "::error::Alpha version of @raycast/api used without raycast_api_alpha_npm_token parameter" 126 | exit_code=1 127 | continue 128 | else 129 | echo "Generating .npmrc for alpha version of @raycast/api" 130 | echo "//npm.pkg.github.com/:_authToken=$raycast_api_alpha_npm_token" > .npmrc 131 | echo "@raycast:registry=https://npm.pkg.github.com" >> .npmrc 132 | echo "legacy-peer-deps=true" >> .npmrc 133 | cleanup_npmrc=true 134 | fi 135 | fi 136 | fi 137 | 138 | # npm ci doesn't allow us to silence output properly 139 | # run it silently first and if it fails run it without silencing 140 | set +e 141 | npm ci --silent 142 | last_exit_code=${?} 143 | set -e 144 | 145 | if [ $last_exit_code -ne 0 ]; then 146 | echo "::error::Npm ci failed for $extension_folder" 147 | set +e 148 | npm ci 149 | set -e 150 | exit_code=1 151 | continue 152 | fi 153 | 154 | ### Cleanup `.npmrc` 155 | if [ "$cleanup_npmrc" = true ] ; then 156 | rm .npmrc 157 | fi 158 | 159 | ### Validate 160 | set +e 161 | $ray_validate 2>&1 | tee $ray_ci_log_file ; test ${PIPESTATUS[0]} -eq 0 162 | last_exit_code=${?} 163 | set -e 164 | if [ $last_exit_code -eq 0 ]; then 165 | set +e 166 | $ray_build_publish 2>&1 | tee $ray_ci_log_file ; test ${PIPESTATUS[0]} -eq 0 167 | last_exit_code=${?} 168 | set -e 169 | fi 170 | 171 | #cleanup npm 172 | rm -rf ./node_modules 173 | 174 | if [ $exit_code -eq 0 ]; then 175 | exit_code=$last_exit_code 176 | fi 177 | if [ $last_exit_code -ne 0 ]; then 178 | error_message=`cat $ray_ci_log_file | tail -1` 179 | echo "::error title=$command failed for $extension_folder::$error_message" 180 | else 181 | if [ "$command" == "publish" ]; then 182 | author=`cat package.json | jq -r '.author | values'` 183 | owner=`cat package.json | jq -r '.owner | values'` 184 | name=`cat package.json | jq -r '.name | values'` 185 | if [ ! -z "$owner" ] 186 | then 187 | store_path="$owner/$name" 188 | else 189 | store_path="$author/$name" 190 | fi 191 | store_url="https://raycast.com/$store_path" 192 | store_urls+=("$store_url") 193 | fi 194 | fi 195 | cd $starting_dir 196 | done 197 | 198 | # encode multiline output for github actions 199 | { 200 | echo 'store_urls<> "$GITHUB_OUTPUT" 206 | 207 | exit $exit_code 208 | -------------------------------------------------------------------------------- /ray/action.yml: -------------------------------------------------------------------------------- 1 | name: "Extensions build & publish" 2 | 3 | description: "Extensions build & publish" 4 | 5 | inputs: 6 | access_token: 7 | description: "Raycast Access Token" 8 | required: false 9 | command: 10 | description: "Ray CLI command (build | publish)" 11 | required: false 12 | paths: 13 | description: "Paths to execute on" 14 | required: false 15 | cli_version: 16 | description: "CLI Version" 17 | required: false 18 | extension_schema: 19 | description: "Extension schema" 20 | required: false 21 | allow_owners_only_for_extensions: 22 | description: "Whitelist extensions allowed to have owners - each extension in new line. If not set or empty, all extensions are allowe to have it." 23 | required: false 24 | npmrc_path: 25 | description: "Path to npmrc file to access private npm packages" 26 | required: false 27 | raycast_api_alpha_npm_token: 28 | description: "NPM token for alpha version of @raycast/api" 29 | required: false 30 | outputs: 31 | command: 32 | description: "Ray CLI command executed" 33 | value: ${{ steps.get_command.outputs.command }} 34 | paths: 35 | description: "Paths for changed extensions" 36 | value: ${{ steps.get_changed_extensions.outputs.paths }} 37 | store_urls: 38 | description: "Store URLs for published extensions" 39 | value: ${{ steps.ray_cli.outputs.store_urls }} 40 | runs: 41 | using: "composite" 42 | steps: 43 | - name: Setup Node 44 | uses: actions/setup-node@v4 45 | with: 46 | node-version: 20.15.1 47 | - name: Setup CLI 48 | uses: raycast/github-actions/setup-cli@v1.17.0 49 | with: 50 | version: ${{ inputs.cli_version || '1.96.0' }} 51 | raycast_api_alpha_npm_token: ${{ inputs.raycast_api_alpha_npm_token }} 52 | - name: Get command 53 | id: get_command 54 | uses: raycast/github-actions/get-command@v1.17.0 55 | with: 56 | custom_command: ${{ inputs.command }} 57 | github_event_name: ${{ github.event_name }} 58 | - name: Get changed extensions 59 | id: get_changed_extensions 60 | uses: raycast/github-actions/get-changed-extensions@v1.17.0 61 | with: 62 | custom_paths: ${{ inputs.paths }} 63 | github_event_name: ${{ github.event_name }} 64 | - name: Ray CLI 65 | id: ray_cli 66 | uses: raycast/github-actions/ray-cli@v1.17.0 67 | with: 68 | paths: ${{ steps.get_changed_extensions.outputs.paths }} 69 | command: ${{ steps.get_command.outputs.command }} 70 | access_token: ${{ inputs.access_token }} 71 | extension_schema: ${{ inputs.extension_schema }} 72 | allow_owners_only_for_extensions: ${{ inputs.allow_owners_only_for_extensions }} 73 | npmrc_path: ${{ inputs.npmrc_path }} 74 | raycast_api_alpha_npm_token: ${{ inputs.raycast_api_alpha_npm_token }} 75 | -------------------------------------------------------------------------------- /setup-1password-cli/action.yml: -------------------------------------------------------------------------------- 1 | name: "Setup 1Password CLI" 2 | description: "Setup 1Password CLI" 3 | 4 | runs: 5 | using: "composite" 6 | steps: 7 | - name: Install 1Password CLI on Windows 8 | if: runner.os == 'Windows' 9 | shell: pwsh 10 | run: | 11 | if (Get-Command op -ErrorAction SilentlyContinue) { 12 | Write-Host "1Password CLI is already installed" 13 | exit 0 14 | } 15 | Invoke-WebRequest "https://app-updates.agilebits.com/check/1/0/CLI2/en/2.0.0/N" -OutFile op.json 16 | $opVersion = Get-Content -Raw -Path op.json | ConvertFrom-Json | select -ExpandProperty version 17 | $installDir = Join-Path -Path $pwd -ChildPath 'op' 18 | Invoke-WebRequest -Uri "https://cache.agilebits.com/dist/1P/op2/pkg/v$($opVersion)/op_windows_amd64_v$($opVersion).zip" -OutFile op.zip 19 | Expand-Archive -Path op.zip -DestinationPath $installDir -Force 20 | "$installDir" | Out-File -FilePath $env:GITHUB_PATH -Append 21 | - name: Install 1Password CLI on macOS 22 | if: runner.os == 'macOS' 23 | shell: bash 24 | run: | 25 | set -o pipefail 26 | if command -v op &> /dev/null; then 27 | echo "1Password CLI is already installed" 28 | exit 0 29 | fi 30 | brew install 1password-cli 2>&1 | grep -v "disabled for this Cask" 31 | - name: Install 1Password CLI on Linux 32 | if: runner.os == 'Linux' 33 | shell: bash 34 | run: | 35 | set -o pipefail 36 | if command -v op &> /dev/null; then 37 | echo "1Password CLI is already installed" 38 | exit 0 39 | fi 40 | 41 | if command -v apt-get &> /dev/null; then 42 | # Debian/Ubuntu 43 | curl -sS https://downloads.1password.com/linux/keys/1password.asc | sudo gpg --dearmor --output /usr/share/keyrings/1password-archive-keyring.gpg 44 | echo "deb [arch=amd64 signed-by=/usr/share/keyrings/1password-archive-keyring.gpg] https://downloads.1password.com/linux/debian/amd64 stable main" | sudo tee /etc/apt/sources.list.d/1password.list 45 | sudo mkdir -p /etc/debsig/policies/AC2D62742012EA22/ 46 | curl -sS https://downloads.1password.com/linux/debian/debsig/1password.pol | sudo tee /etc/debsig/policies/AC2D62742012EA22/1password.pol 47 | sudo mkdir -p /usr/share/debsig/keyrings/AC2D62742012EA22 48 | curl -sS https://downloads.1password.com/linux/keys/1password.asc | sudo gpg --dearmor --output /usr/share/debsig/keyrings/AC2D62742012EA22/debsig.gpg 49 | sudo apt-get update && sudo apt-get install 1password-cli 50 | elif command -v yum &> /dev/null; then 51 | # RHEL/CentOS 52 | sudo rpm --import https://downloads.1password.com/linux/keys/1password.asc 53 | sudo sh -c 'echo -e "[1password]\nname=1Password Stable Channel\nbaseurl=https://downloads.1password.com/linux/rpm/stable/\$basearch\nenabled=1\ngpgcheck=1\nrepo_gpgcheck=1\ngpgkey=\"https://downloads.1password.com/linux/keys/1password.asc\"" > /etc/yum.repos.d/1password.repo' 54 | sudo yum install 1password-cli 55 | elif command -v apk &> /dev/null; then 56 | # Alpine 57 | sudo apk add --no-cache 1password-cli 58 | else 59 | # Manual installation as fallback 60 | OP_VERSION=$(curl -s https://app-updates.agilebits.com/check/1/0/CLI2/en/2.0.0/N | grep -o '"version":"[^"]*' | cut -d'"' -f4) 61 | curl -sS -o op.zip "https://cache.agilebits.com/dist/1P/op2/pkg/v${OP_VERSION}/op_linux_amd64_v${OP_VERSION}.zip" 62 | unzip op.zip op 63 | sudo mv op /usr/local/bin/ 64 | sudo chmod +x /usr/local/bin/op 65 | rm op.zip 66 | fi 67 | -------------------------------------------------------------------------------- /setup-cli/action.yml: -------------------------------------------------------------------------------- 1 | name: "Setup Raycast CLI" 2 | 3 | description: "Setup Raycast CLI" 4 | 5 | inputs: 6 | version: 7 | description: "CLI version (format: 1.0.0)" 8 | required: true 9 | raycast_api_alpha_npm_token: 10 | description: "NPM token for alpha version of @raycast/api" 11 | required: false 12 | runs: 13 | using: "composite" 14 | steps: 15 | - name: Setup CLI 16 | shell: bash 17 | run: | 18 | ${{ github.action_path }}/setup_cli.sh "${{ inputs.version }}" "${{ inputs.raycast_api_alpha_npm_token }}" 19 | -------------------------------------------------------------------------------- /setup-cli/setup_cli.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -e 4 | 5 | version=$1 6 | raycast_api_alpha_npm_token=$2 7 | 8 | if [[ "$version" == *"alpha"* ]]; then 9 | if [ -z "$raycast_api_alpha_npm_token" ]; then 10 | echo "::error::Alpha version of @raycast/api used without raycast_api_alpha_npm_token parameter" 11 | exit 1 12 | else 13 | echo "//npm.pkg.github.com/:_authToken=$raycast_api_alpha_npm_token" > ~/.npmrc 14 | echo "@raycast:registry=https://npm.pkg.github.com" >> ~/.npmrc 15 | echo "legacy-peer-deps=true" >> ~/.npmrc 16 | cleanup_npmrc=true 17 | fi 18 | fi 19 | 20 | # npm install doesn't allow us to silence output properly 21 | # run it silently first and if it fails run it without silencing 22 | set +e 23 | npm install --global @raycast/api@$version --silent 24 | last_exit_code=${?} 25 | set -e 26 | 27 | if [ $last_exit_code -ne 0 ]; then 28 | echo "::error::Npm install --global @raycast/api failed" 29 | set +e 30 | npm install --global @raycast/api@$version 31 | set -e 32 | exit 1 33 | fi 34 | 35 | # Cleanup `.npmrc` 36 | if [ "$cleanup_npmrc" = true ] ; then 37 | rm ~/.npmrc 38 | fi 39 | 40 | ray version 41 | -------------------------------------------------------------------------------- /setup-git/action.yml: -------------------------------------------------------------------------------- 1 | name: "Setup Git" 2 | 3 | description: "Setup Git" 4 | 5 | runs: 6 | using: "composite" 7 | steps: 8 | - name: Setup git 9 | shell: bash 10 | run: | 11 | git config --global user.email "bot@raycast.com" 12 | git config --global user.name "raycastbot" 13 | -------------------------------------------------------------------------------- /setup-go/action.yml: -------------------------------------------------------------------------------- 1 | name: "Setup Go" 2 | 3 | description: "Setup Go" 4 | 5 | runs: 6 | using: "composite" 7 | steps: 8 | - name: Setup go 9 | uses: actions/setup-go@v5 10 | with: 11 | go-version: "1.22.0" 12 | -------------------------------------------------------------------------------- /setup-node/action.yml: -------------------------------------------------------------------------------- 1 | name: "Setup Node" 2 | 3 | description: "Setup Node" 4 | 5 | inputs: 6 | node-version: 7 | description: "Node version" 8 | required: true 9 | default: 18.10.0 10 | npm-version: 11 | description: "NPM version (if not defined, the default one from node-version will be used)" 12 | required: true 13 | default: 8.19.2 14 | 15 | runs: 16 | using: "composite" 17 | steps: 18 | - name: Setup node 19 | uses: actions/setup-node@v4 20 | with: 21 | node-version: "${{ inputs.node-version }}" 22 | - name: Setup npm 23 | shell: bash 24 | run: | 25 | npm install -g npm@${{ inputs.npm-version }} 26 | - name: Installed versions 27 | shell: bash 28 | run: | 29 | echo "Node version:" 30 | node -v 31 | echo "Npm version:" 32 | which npm 33 | npm -v 34 | -------------------------------------------------------------------------------- /setup-npm/action.yml: -------------------------------------------------------------------------------- 1 | name: "Setup NPM for Raycast" 2 | 3 | description: "Setup NPM for Raycast" 4 | 5 | runs: 6 | using: "composite" 7 | steps: 8 | - name: Setup npm 9 | shell: bash 10 | run: | 11 | npm install npm@8.19.2 --location=global 12 | echo "Npm path: $(which npm)" 13 | echo "Npm version: $(npm -v)" 14 | -------------------------------------------------------------------------------- /setup-xcode/action.yml: -------------------------------------------------------------------------------- 1 | name: "Setup Xcode" 2 | 3 | description: "Setup Xcode" 4 | 5 | runs: 6 | using: "composite" 7 | steps: 8 | - name: Set up Xcode version 9 | uses: maxim-lobanov/setup-xcode@v1 10 | with: 11 | xcode-version: 16.3.x 12 | -------------------------------------------------------------------------------- /slack-notify-pr/action.yml: -------------------------------------------------------------------------------- 1 | name: "Slack Pull Request Activity" 2 | description: "A GitHub action to notify Slack about pull request activities." 3 | inputs: 4 | pathToSlackStreamMapping: 5 | description: "Mapping of file paths to Slack webhook URLs" 6 | required: true 7 | type: string 8 | runs: 9 | using: "composite" 10 | steps: 11 | - name: Install slackify-markdown 12 | shell: bash 13 | run: npm install slackify-markdown 14 | 15 | - name: Notify Slack 16 | uses: actions/github-script@v7 17 | with: 18 | script: | 19 | const pathToSlackStreamMapping = JSON.parse(`${{ inputs.pathToSlackStreamMapping }}`); 20 | const slackifyMarkdown = require('slackify-markdown'); 21 | const pr = context.payload.pull_request; 22 | const action = context.payload.action; 23 | const actor = context.actor; 24 | const prEvents = { 25 | opened: { 26 | color: "#36A54F", 27 | message: "opened" 28 | }, 29 | closed: { 30 | color: "#6F42C1", 31 | message: "closed" 32 | }, 33 | ready_for_review: { 34 | color: "#36A54F", 35 | message: "ready for review" 36 | }, 37 | reopened: { 38 | color: "#36A54F", 39 | message: "reopened" 40 | } 41 | }; 42 | const eventData = prEvents[action] || { color: "#36A54F", message: action }; 43 | const slackStreams = new Set(); 44 | const streamPathMap = new Map(); 45 | 46 | const files = await github.paginate(github.rest.pulls.listFiles, { 47 | owner: context.repo.owner, 48 | repo: context.repo.repo, 49 | pull_number: pr.number, 50 | }); 51 | console.log(`Found ${files.length} changed files.`); 52 | for (const file of files) { 53 | for (const [path, slackStream] of Object.entries(pathToSlackStreamMapping)) { 54 | if (file.filename.startsWith(path)) { 55 | console.log(`Add stream for: ${file.filename}`); 56 | slackStreams.add(slackStream); 57 | streamPathMap.set(slackStream, path); 58 | } 59 | } 60 | } 61 | 62 | if (slackStreams.size === 0) { 63 | console.log("No matching files found for Slack notification."); 64 | } else { 65 | console.log(`Notifying ${slackStreams.size} Slack streams.`); 66 | } 67 | 68 | const prUrl = pr.html_url; 69 | const prTitle = pr.title; 70 | const prNumber = pr.number; 71 | const prBody = slackifyMarkdown(pr.body) || "No description provided."; 72 | const actorUrl = `https://github.com/${actor}`; 73 | const prAuthor = pr.user.login; 74 | const prAuthorUrl = `https://github.com/${prAuthor}`; 75 | const mainText = `Pull request ${eventData.message} by <${actorUrl}|${actor}>`; 76 | 77 | const prLink = `*<${prUrl}|#${prNumber}: ${prTitle}>*`; 78 | 79 | const attachmentText = action === "closed" ? `${prLink}` : `${prLink}\n\n${prBody}`; 80 | const attachment = { 81 | color: eventData.color, 82 | "mrkdwn_in": ["text"], 83 | text: attachmentText, 84 | }; 85 | 86 | const payload = { 87 | text: mainText, 88 | attachments: [attachment] 89 | }; 90 | 91 | let anyFailures = false; 92 | for (const slackStream of slackStreams) { 93 | try { 94 | const response = await fetch(slackStream, { 95 | method: 'POST', 96 | headers: { 'Content-Type': 'application/json' }, 97 | body: JSON.stringify(payload), 98 | }); 99 | 100 | const matchedPath = streamPathMap.get(slackStream); 101 | 102 | if (!response.ok) { 103 | console.error(`Slack notification failed: ${response.statusText}`); 104 | anyFailures = true; 105 | } else { 106 | console.log(`Notification sent to Slack webhook: ${slackStream} (path matched: ${matchedPath})`); 107 | } 108 | } catch (error) { 109 | console.error(`Error sending notification to Slack webhook: ${slackStream}`, error); 110 | anyFailures = true; 111 | } 112 | } 113 | 114 | if (anyFailures) { 115 | throw new Error('One or more Slack notifications failed.'); 116 | } 117 | -------------------------------------------------------------------------------- /slack-notify-push/action.yml: -------------------------------------------------------------------------------- 1 | name: "Notify Slack On Push" 2 | description: "Send a Slack notification with commit details on push with a commit history" 3 | inputs: 4 | SLACK_WEBHOOK_URL: 5 | description: "The Slack webhook URL" 6 | required: true 7 | 8 | runs: 9 | using: "composite" 10 | steps: 11 | - name: Notify Slack 12 | uses: actions/github-script@v7 13 | with: 14 | script: | 15 | const repo = context.repo; 16 | const branchName = context.ref.replace('refs/heads/', ''); 17 | const branchUrl = `https://github.com/${repo.owner}/${repo.repo}/tree/${branchName}`; 18 | const commits = context.payload.commits.map(commit => { 19 | return { 20 | shortSha: commit.id.substring(0, 7), 21 | commitUrl: `https://github.com/${repo.owner}/${repo.repo}/commit/${commit.id}`, 22 | commitTitle: commit.message.split('\n')[0] 23 | }; 24 | }); 25 | const beforeSha = context.payload.before; 26 | const afterSha = context.payload.after; 27 | const compareUrl = `https://github.com/${repo.owner}/${repo.repo}/compare/${beforeSha}...${afterSha}`; 28 | 29 | const actor = context.actor; 30 | const actorUrl = `https://github.com/${actor}`; 31 | 32 | const commitsText = commits.map(commit => `> <${commit.commitUrl}|\`${commit.shortSha}\`> - ${commit.commitTitle}`).join("\n"); 33 | const numCommits = commits.length; 34 | const commitsLabel = numCommits === 1 ? "commit" : "commits"; 35 | 36 | const payload = { 37 | blocks: [ 38 | { 39 | type: "section", 40 | text: { 41 | type: "mrkdwn", 42 | text: `<${compareUrl}|${numCommits} new ${commitsLabel}> pushed to <${branchUrl}|\`${branchName}\`> by <${actorUrl}|${actor}>` 43 | } 44 | }, 45 | { 46 | type: "section", 47 | text: { 48 | type: "mrkdwn", 49 | text: commitsText 50 | } 51 | } 52 | ] 53 | }; 54 | 55 | const response = await fetch(process.env.SLACK_WEBHOOK_URL, { 56 | method: 'POST', 57 | headers: { 'Content-Type': 'application/json' }, 58 | body: JSON.stringify(payload) 59 | }); 60 | 61 | if (!response.ok) { 62 | throw new Error(`Slack notification failed: ${response.statusText}`); 63 | } 64 | env: 65 | SLACK_WEBHOOK_URL: ${{ inputs.SLACK_WEBHOOK_URL }} 66 | -------------------------------------------------------------------------------- /slack-send/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | npm-debug.log 3 | .DS_Store -------------------------------------------------------------------------------- /slack-send/action.yml: -------------------------------------------------------------------------------- 1 | name: "Send Message To Slack" 2 | description: "Send Message To Slack" 3 | runs: 4 | using: "node20" 5 | main: "dist/index.js" 6 | inputs: 7 | text: 8 | description: "The message to send" 9 | required: true 10 | webhook: 11 | description: "Slack Webhook" 12 | required: true 13 | color: 14 | description: "The color to use: be 'good', 'warning', 'danger' or a hex code" 15 | required: false 16 | -------------------------------------------------------------------------------- /slack-send/index.js: -------------------------------------------------------------------------------- 1 | const core = require('@actions/core') 2 | const { IncomingWebhook } = require('@slack/webhook') 3 | 4 | try { 5 | if (!core.getInput('webhook')) { 6 | throw new Error("'webhook' parameter is required") 7 | } 8 | const slack = new IncomingWebhook(core.getInput('webhook')) 9 | 10 | const env = process.env 11 | const evalInput = (str) => eval(`\`${str}\``) 12 | let color = evalInput(core.getInput('color')) 13 | let text = evalInput(core.getInput('text')) 14 | if (!text) { 15 | throw new Error("'text' parameter is required!") 16 | } 17 | (async () => { 18 | if (!color) { 19 | await slack.send(text) 20 | } else { 21 | await slack.send({attachments: [{text,color}]}) 22 | } 23 | })(); 24 | } catch (error) { 25 | core.setFailed(error.message) 26 | } -------------------------------------------------------------------------------- /slack-send/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "slack-send", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "slack-send", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "@actions/core": "^1.10.0", 13 | "@actions/github": "^5.1.1", 14 | "@slack/webhook": "^6.1.0" 15 | } 16 | }, 17 | "node_modules/@actions/core": { 18 | "version": "1.10.0", 19 | "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.10.0.tgz", 20 | "integrity": "sha512-2aZDDa3zrrZbP5ZYg159sNoLRb61nQ7awl5pSvIq5Qpj81vwDzdMRKzkWJGJuwVvWpvZKx7vspJALyvaaIQyug==", 21 | "dependencies": { 22 | "@actions/http-client": "^2.0.1", 23 | "uuid": "^8.3.2" 24 | } 25 | }, 26 | "node_modules/@actions/github": { 27 | "version": "5.1.1", 28 | "resolved": "https://registry.npmjs.org/@actions/github/-/github-5.1.1.tgz", 29 | "integrity": "sha512-Nk59rMDoJaV+mHCOJPXuvB1zIbomlKS0dmSIqPGxd0enAXBnOfn4VWF+CGtRCwXZG9Epa54tZA7VIRlJDS8A6g==", 30 | "dependencies": { 31 | "@actions/http-client": "^2.0.1", 32 | "@octokit/core": "^3.6.0", 33 | "@octokit/plugin-paginate-rest": "^2.17.0", 34 | "@octokit/plugin-rest-endpoint-methods": "^5.13.0" 35 | } 36 | }, 37 | "node_modules/@actions/http-client": { 38 | "version": "2.0.1", 39 | "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.0.1.tgz", 40 | "integrity": "sha512-PIXiMVtz6VvyaRsGY268qvj57hXQEpsYogYOu2nrQhlf+XCGmZstmuZBbAybUl1nQGnvS1k1eEsQ69ZoD7xlSw==", 41 | "dependencies": { 42 | "tunnel": "^0.0.6" 43 | } 44 | }, 45 | "node_modules/@octokit/auth-token": { 46 | "version": "2.5.0", 47 | "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz", 48 | "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==", 49 | "dependencies": { 50 | "@octokit/types": "^6.0.3" 51 | } 52 | }, 53 | "node_modules/@octokit/core": { 54 | "version": "3.6.0", 55 | "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz", 56 | "integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==", 57 | "dependencies": { 58 | "@octokit/auth-token": "^2.4.4", 59 | "@octokit/graphql": "^4.5.8", 60 | "@octokit/request": "^5.6.3", 61 | "@octokit/request-error": "^2.0.5", 62 | "@octokit/types": "^6.0.3", 63 | "before-after-hook": "^2.2.0", 64 | "universal-user-agent": "^6.0.0" 65 | } 66 | }, 67 | "node_modules/@octokit/endpoint": { 68 | "version": "6.0.12", 69 | "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz", 70 | "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", 71 | "dependencies": { 72 | "@octokit/types": "^6.0.3", 73 | "is-plain-object": "^5.0.0", 74 | "universal-user-agent": "^6.0.0" 75 | } 76 | }, 77 | "node_modules/@octokit/graphql": { 78 | "version": "4.8.0", 79 | "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz", 80 | "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", 81 | "dependencies": { 82 | "@octokit/request": "^5.6.0", 83 | "@octokit/types": "^6.0.3", 84 | "universal-user-agent": "^6.0.0" 85 | } 86 | }, 87 | "node_modules/@octokit/openapi-types": { 88 | "version": "12.11.0", 89 | "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz", 90 | "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==" 91 | }, 92 | "node_modules/@octokit/plugin-paginate-rest": { 93 | "version": "2.21.3", 94 | "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz", 95 | "integrity": "sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==", 96 | "dependencies": { 97 | "@octokit/types": "^6.40.0" 98 | }, 99 | "peerDependencies": { 100 | "@octokit/core": ">=2" 101 | } 102 | }, 103 | "node_modules/@octokit/plugin-rest-endpoint-methods": { 104 | "version": "5.16.2", 105 | "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz", 106 | "integrity": "sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==", 107 | "dependencies": { 108 | "@octokit/types": "^6.39.0", 109 | "deprecation": "^2.3.1" 110 | }, 111 | "peerDependencies": { 112 | "@octokit/core": ">=3" 113 | } 114 | }, 115 | "node_modules/@octokit/request": { 116 | "version": "5.6.3", 117 | "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz", 118 | "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==", 119 | "dependencies": { 120 | "@octokit/endpoint": "^6.0.1", 121 | "@octokit/request-error": "^2.1.0", 122 | "@octokit/types": "^6.16.1", 123 | "is-plain-object": "^5.0.0", 124 | "node-fetch": "^2.6.7", 125 | "universal-user-agent": "^6.0.0" 126 | } 127 | }, 128 | "node_modules/@octokit/request-error": { 129 | "version": "2.1.0", 130 | "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz", 131 | "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", 132 | "dependencies": { 133 | "@octokit/types": "^6.0.3", 134 | "deprecation": "^2.0.0", 135 | "once": "^1.4.0" 136 | } 137 | }, 138 | "node_modules/@octokit/types": { 139 | "version": "6.41.0", 140 | "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", 141 | "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", 142 | "dependencies": { 143 | "@octokit/openapi-types": "^12.11.0" 144 | } 145 | }, 146 | "node_modules/@slack/types": { 147 | "version": "1.10.0", 148 | "resolved": "https://registry.npmjs.org/@slack/types/-/types-1.10.0.tgz", 149 | "integrity": "sha512-tA7GG7Tj479vojfV3AoxbckalA48aK6giGjNtgH6ihpLwTyHE3fIgRrvt8TWfLwW8X8dyu7vgmAsGLRG7hWWOg==", 150 | "engines": { 151 | "node": ">= 8.9.0", 152 | "npm": ">= 5.5.1" 153 | } 154 | }, 155 | "node_modules/@slack/webhook": { 156 | "version": "6.1.0", 157 | "resolved": "https://registry.npmjs.org/@slack/webhook/-/webhook-6.1.0.tgz", 158 | "integrity": "sha512-7AYNISyAjn/lA/VDwZ307K5ft5DojXgBd3DRrGoFN8XxIwIyRALdFhxBiMgAqeJH8eWoktvNwLK24R9hREEqpA==", 159 | "dependencies": { 160 | "@slack/types": "^1.2.1", 161 | "@types/node": ">=12.0.0", 162 | "axios": "^0.21.4" 163 | }, 164 | "engines": { 165 | "node": ">= 12.13.0", 166 | "npm": ">= 6.12.0" 167 | } 168 | }, 169 | "node_modules/@types/node": { 170 | "version": "18.11.9", 171 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", 172 | "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==" 173 | }, 174 | "node_modules/axios": { 175 | "version": "0.21.4", 176 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", 177 | "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", 178 | "dependencies": { 179 | "follow-redirects": "^1.14.0" 180 | } 181 | }, 182 | "node_modules/before-after-hook": { 183 | "version": "2.2.3", 184 | "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", 185 | "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==" 186 | }, 187 | "node_modules/deprecation": { 188 | "version": "2.3.1", 189 | "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", 190 | "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==" 191 | }, 192 | "node_modules/follow-redirects": { 193 | "version": "1.15.2", 194 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", 195 | "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", 196 | "funding": [ 197 | { 198 | "type": "individual", 199 | "url": "https://github.com/sponsors/RubenVerborgh" 200 | } 201 | ], 202 | "engines": { 203 | "node": ">=4.0" 204 | }, 205 | "peerDependenciesMeta": { 206 | "debug": { 207 | "optional": true 208 | } 209 | } 210 | }, 211 | "node_modules/is-plain-object": { 212 | "version": "5.0.0", 213 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", 214 | "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", 215 | "engines": { 216 | "node": ">=0.10.0" 217 | } 218 | }, 219 | "node_modules/node-fetch": { 220 | "version": "2.6.7", 221 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", 222 | "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", 223 | "dependencies": { 224 | "whatwg-url": "^5.0.0" 225 | }, 226 | "engines": { 227 | "node": "4.x || >=6.0.0" 228 | }, 229 | "peerDependencies": { 230 | "encoding": "^0.1.0" 231 | }, 232 | "peerDependenciesMeta": { 233 | "encoding": { 234 | "optional": true 235 | } 236 | } 237 | }, 238 | "node_modules/once": { 239 | "version": "1.4.0", 240 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 241 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 242 | "dependencies": { 243 | "wrappy": "1" 244 | } 245 | }, 246 | "node_modules/tr46": { 247 | "version": "0.0.3", 248 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 249 | "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" 250 | }, 251 | "node_modules/tunnel": { 252 | "version": "0.0.6", 253 | "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", 254 | "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", 255 | "engines": { 256 | "node": ">=0.6.11 <=0.7.0 || >=0.7.3" 257 | } 258 | }, 259 | "node_modules/universal-user-agent": { 260 | "version": "6.0.0", 261 | "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", 262 | "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==" 263 | }, 264 | "node_modules/uuid": { 265 | "version": "8.3.2", 266 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", 267 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", 268 | "bin": { 269 | "uuid": "dist/bin/uuid" 270 | } 271 | }, 272 | "node_modules/webidl-conversions": { 273 | "version": "3.0.1", 274 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 275 | "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" 276 | }, 277 | "node_modules/whatwg-url": { 278 | "version": "5.0.0", 279 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 280 | "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", 281 | "dependencies": { 282 | "tr46": "~0.0.3", 283 | "webidl-conversions": "^3.0.0" 284 | } 285 | }, 286 | "node_modules/wrappy": { 287 | "version": "1.0.2", 288 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 289 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" 290 | } 291 | }, 292 | "dependencies": { 293 | "@actions/core": { 294 | "version": "1.10.0", 295 | "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.10.0.tgz", 296 | "integrity": "sha512-2aZDDa3zrrZbP5ZYg159sNoLRb61nQ7awl5pSvIq5Qpj81vwDzdMRKzkWJGJuwVvWpvZKx7vspJALyvaaIQyug==", 297 | "requires": { 298 | "@actions/http-client": "^2.0.1", 299 | "uuid": "^8.3.2" 300 | } 301 | }, 302 | "@actions/github": { 303 | "version": "5.1.1", 304 | "resolved": "https://registry.npmjs.org/@actions/github/-/github-5.1.1.tgz", 305 | "integrity": "sha512-Nk59rMDoJaV+mHCOJPXuvB1zIbomlKS0dmSIqPGxd0enAXBnOfn4VWF+CGtRCwXZG9Epa54tZA7VIRlJDS8A6g==", 306 | "requires": { 307 | "@actions/http-client": "^2.0.1", 308 | "@octokit/core": "^3.6.0", 309 | "@octokit/plugin-paginate-rest": "^2.17.0", 310 | "@octokit/plugin-rest-endpoint-methods": "^5.13.0" 311 | } 312 | }, 313 | "@actions/http-client": { 314 | "version": "2.0.1", 315 | "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.0.1.tgz", 316 | "integrity": "sha512-PIXiMVtz6VvyaRsGY268qvj57hXQEpsYogYOu2nrQhlf+XCGmZstmuZBbAybUl1nQGnvS1k1eEsQ69ZoD7xlSw==", 317 | "requires": { 318 | "tunnel": "^0.0.6" 319 | } 320 | }, 321 | "@octokit/auth-token": { 322 | "version": "2.5.0", 323 | "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz", 324 | "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==", 325 | "requires": { 326 | "@octokit/types": "^6.0.3" 327 | } 328 | }, 329 | "@octokit/core": { 330 | "version": "3.6.0", 331 | "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz", 332 | "integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==", 333 | "requires": { 334 | "@octokit/auth-token": "^2.4.4", 335 | "@octokit/graphql": "^4.5.8", 336 | "@octokit/request": "^5.6.3", 337 | "@octokit/request-error": "^2.0.5", 338 | "@octokit/types": "^6.0.3", 339 | "before-after-hook": "^2.2.0", 340 | "universal-user-agent": "^6.0.0" 341 | } 342 | }, 343 | "@octokit/endpoint": { 344 | "version": "6.0.12", 345 | "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz", 346 | "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", 347 | "requires": { 348 | "@octokit/types": "^6.0.3", 349 | "is-plain-object": "^5.0.0", 350 | "universal-user-agent": "^6.0.0" 351 | } 352 | }, 353 | "@octokit/graphql": { 354 | "version": "4.8.0", 355 | "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz", 356 | "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", 357 | "requires": { 358 | "@octokit/request": "^5.6.0", 359 | "@octokit/types": "^6.0.3", 360 | "universal-user-agent": "^6.0.0" 361 | } 362 | }, 363 | "@octokit/openapi-types": { 364 | "version": "12.11.0", 365 | "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz", 366 | "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ==" 367 | }, 368 | "@octokit/plugin-paginate-rest": { 369 | "version": "2.21.3", 370 | "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz", 371 | "integrity": "sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==", 372 | "requires": { 373 | "@octokit/types": "^6.40.0" 374 | } 375 | }, 376 | "@octokit/plugin-rest-endpoint-methods": { 377 | "version": "5.16.2", 378 | "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz", 379 | "integrity": "sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==", 380 | "requires": { 381 | "@octokit/types": "^6.39.0", 382 | "deprecation": "^2.3.1" 383 | } 384 | }, 385 | "@octokit/request": { 386 | "version": "5.6.3", 387 | "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz", 388 | "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==", 389 | "requires": { 390 | "@octokit/endpoint": "^6.0.1", 391 | "@octokit/request-error": "^2.1.0", 392 | "@octokit/types": "^6.16.1", 393 | "is-plain-object": "^5.0.0", 394 | "node-fetch": "^2.6.7", 395 | "universal-user-agent": "^6.0.0" 396 | } 397 | }, 398 | "@octokit/request-error": { 399 | "version": "2.1.0", 400 | "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz", 401 | "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", 402 | "requires": { 403 | "@octokit/types": "^6.0.3", 404 | "deprecation": "^2.0.0", 405 | "once": "^1.4.0" 406 | } 407 | }, 408 | "@octokit/types": { 409 | "version": "6.41.0", 410 | "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz", 411 | "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==", 412 | "requires": { 413 | "@octokit/openapi-types": "^12.11.0" 414 | } 415 | }, 416 | "@slack/types": { 417 | "version": "1.10.0", 418 | "resolved": "https://registry.npmjs.org/@slack/types/-/types-1.10.0.tgz", 419 | "integrity": "sha512-tA7GG7Tj479vojfV3AoxbckalA48aK6giGjNtgH6ihpLwTyHE3fIgRrvt8TWfLwW8X8dyu7vgmAsGLRG7hWWOg==" 420 | }, 421 | "@slack/webhook": { 422 | "version": "6.1.0", 423 | "resolved": "https://registry.npmjs.org/@slack/webhook/-/webhook-6.1.0.tgz", 424 | "integrity": "sha512-7AYNISyAjn/lA/VDwZ307K5ft5DojXgBd3DRrGoFN8XxIwIyRALdFhxBiMgAqeJH8eWoktvNwLK24R9hREEqpA==", 425 | "requires": { 426 | "@slack/types": "^1.2.1", 427 | "@types/node": ">=12.0.0", 428 | "axios": "^0.21.4" 429 | } 430 | }, 431 | "@types/node": { 432 | "version": "18.11.9", 433 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", 434 | "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==" 435 | }, 436 | "axios": { 437 | "version": "0.21.4", 438 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", 439 | "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", 440 | "requires": { 441 | "follow-redirects": "^1.14.0" 442 | } 443 | }, 444 | "before-after-hook": { 445 | "version": "2.2.3", 446 | "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", 447 | "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==" 448 | }, 449 | "deprecation": { 450 | "version": "2.3.1", 451 | "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", 452 | "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==" 453 | }, 454 | "follow-redirects": { 455 | "version": "1.15.2", 456 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", 457 | "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" 458 | }, 459 | "is-plain-object": { 460 | "version": "5.0.0", 461 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", 462 | "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==" 463 | }, 464 | "node-fetch": { 465 | "version": "2.6.7", 466 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", 467 | "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", 468 | "requires": { 469 | "whatwg-url": "^5.0.0" 470 | } 471 | }, 472 | "once": { 473 | "version": "1.4.0", 474 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 475 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 476 | "requires": { 477 | "wrappy": "1" 478 | } 479 | }, 480 | "tr46": { 481 | "version": "0.0.3", 482 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 483 | "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" 484 | }, 485 | "tunnel": { 486 | "version": "0.0.6", 487 | "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", 488 | "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" 489 | }, 490 | "universal-user-agent": { 491 | "version": "6.0.0", 492 | "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", 493 | "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==" 494 | }, 495 | "uuid": { 496 | "version": "8.3.2", 497 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", 498 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" 499 | }, 500 | "webidl-conversions": { 501 | "version": "3.0.1", 502 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 503 | "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" 504 | }, 505 | "whatwg-url": { 506 | "version": "5.0.0", 507 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 508 | "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", 509 | "requires": { 510 | "tr46": "~0.0.3", 511 | "webidl-conversions": "^3.0.0" 512 | } 513 | }, 514 | "wrappy": { 515 | "version": "1.0.2", 516 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 517 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" 518 | } 519 | } 520 | } 521 | -------------------------------------------------------------------------------- /slack-send/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "slack-send", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "dist/index.js", 6 | "scripts": { 7 | "build": "ncc build index.js" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "@actions/core": "^1.10.0", 14 | "@actions/github": "^5.1.1", 15 | "@slack/webhook": "^6.1.0" 16 | } 17 | } 18 | --------------------------------------------------------------------------------