├── .devcontainer ├── Dockerfile └── devcontainer.json ├── .github ├── CODEOWNERS ├── ISSUE_TEMPLATE │ ├── config.yml │ └── request_marketplace_action.md ├── dependabot.yml ├── scripts │ ├── approve-or-deny-request.mjs │ ├── initialize-request.mjs │ ├── mocks │ │ ├── issue-comment-created.json │ │ └── membership-response.json │ ├── package-lock.json │ ├── package.json │ └── test.mjs └── workflows │ ├── approve-or-deny-request.yml │ ├── initialize-request.yml │ ├── pr.yml │ └── test.yml ├── .gitignore ├── .vscode └── launch.json ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── SECURITY.md ├── examples.md └── ownership.yaml /.devcontainer/Dockerfile: -------------------------------------------------------------------------------- 1 | # See here for image contents: https://github.com/microsoft/vscode-dev-containers/tree/v0.195.0/containers/javascript-node/.devcontainer/base.Dockerfile 2 | # [Choice] Node.js version (use -bullseye variants on local arm64/Apple Silicon): 16, 14, 12, 16-bullseye, 14-bullseye, 12-bullseye, 16-buster, 14-buster, 12-buster 3 | ARG VARIANT=20-bullseye 4 | FROM mcr.microsoft.com/vscode/devcontainers/javascript-node:0-${VARIANT} 5 | 6 | # [Optional] Uncomment this section to install additional OS packages. 7 | RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \ 8 | && apt-get -y install --no-install-recommends python pip 9 | 10 | # [Optional] Uncomment if you want to install an additional version of node using nvm 11 | # ARG EXTRA_NODE_VERSION=10 12 | # RUN su node -c "umask 0002 && ./usr/local/share/nvm/nvm.sh && nvm install ${EXTRA_NODE_VERSION}" 13 | 14 | # [Optional] Uncomment if you want to install more global node modules 15 | # RUN su node -c "npm install -g " 16 | 17 | # Update npm 18 | #RUN npm install -g npm -------------------------------------------------------------------------------- /.devcontainer/devcontainer.json: -------------------------------------------------------------------------------- 1 | // For format details, see https://aka.ms/devcontainer.json. For config options, see the README at: 2 | // https://github.com/microsoft/vscode-dev-containers/tree/v0.195.0/containers/javascript-node 3 | { 4 | "name": "Node.js", 5 | "build": { 6 | "dockerfile": "Dockerfile", 7 | // Update 'VARIANT' to pick a Node version: 16, 14, 12. 8 | // Append -bullseye or -buster to pin to an OS version. 9 | // Use -bullseye variants on local arm64/Apple Silicon. 10 | "args": { "VARIANT": "20-bullseye" } 11 | }, 12 | 13 | // Set *default* container specific settings.json values on container create. 14 | "settings": {}, 15 | 16 | // Add the IDs of extensions you want installed when the container is created. 17 | "extensions": [ 18 | "dbaeumer.vscode-eslint", 19 | "mikestead.dotenv", 20 | "mcright.auto-save", 21 | "donjayamanne.git-extension-pack", 22 | "redhat.vscode-yaml", 23 | "github.copilot", 24 | "ms-azuretools.vscode-docker" 25 | ], 26 | 27 | // Use 'forwardPorts' to make a list of ports inside the container available locally. 28 | // "forwardPorts": [3000], 29 | 30 | // Use 'portsAttributes' to set default properties for specific forwarded ports. More info: https://code.visualstudio.com/docs/remote/devcontainerjson-reference. 31 | "portsAttributes": { 32 | "3000": { 33 | "label": "probot", 34 | "onAutoForward": "notify", 35 | "requireLocalPort": true 36 | } 37 | }, 38 | 39 | // Use 'otherPortsAttributes' to configure any ports that aren't configured using 'portsAttributes'. 40 | // "otherPortsAttributes": { 41 | // "onAutoForward": "silent" 42 | // }, 43 | 44 | // Use 'postCreateCommand' to run commands after the container is created. 45 | "postCreateCommand": "cd .github/scripts && npm install && npm install -g nyc mocha uvu", 46 | 47 | // Comment out connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root. 48 | "remoteUser": "node" 49 | } 50 | -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @github/ps-delivery 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: true 2 | contact_links: 3 | - name: GitHub Community Support 4 | url: https://github.community/ 5 | about: Please ask and answer questions here. -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/request_marketplace_action.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: 'Request Marketplace Action' 3 | about: Request an action from the marketplace on GitHub.com 4 | title: 'Request: [MARKETPLACE_ACTION]' 5 | assignees: 'actions-approvers' 6 | --- 7 | 12 | 13 | ```json request 14 | { 15 | "owner": "actions", 16 | "repo": "toolkit", 17 | "version": "latest" 18 | } 19 | ``` 20 | 21 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # To get started with Dependabot version updates, you'll need to specify which 2 | # package ecosystems to update and where the package manifests are located. 3 | # Please see the documentation for all configuration options: 4 | # https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates 5 | 6 | version: 2 7 | updates: 8 | - package-ecosystem: "npm" # See documentation for possible values 9 | directory: ".github/scripts/" # Location of package manifests 10 | schedule: 11 | interval: "weekly" 12 | -------------------------------------------------------------------------------- /.github/scripts/approve-or-deny-request.mjs: -------------------------------------------------------------------------------- 1 | //const { Octokit } = require("@octokit/rest"); 2 | import { Octokit } from "@octokit/rest"; 3 | 4 | export default async function main(github, context, options) { 5 | 6 | let octokit = new Octokit({ 7 | auth: options.token, 8 | baseUrl: options.baseUrl 9 | }); 10 | 11 | let repoUpdate = { 12 | owner: `${options.actionsApprovedOrg}`, 13 | repo: `${options.repo}_${options.version}` 14 | } 15 | if (context.payload.comment.body.toLowerCase().includes('approve') && await isAuthorized(context, options, octokit)) { 16 | // Check GitHub.com or GHEC version 17 | let internalRepoToggle = true; 18 | if (options.baseUrl != 'https://api.github.com') { 19 | let meta = await octokit.request('GET /meta', {}); 20 | if (/^[3]{1}\.[0-4]{1}/.test(meta.data.installed_version)) { 21 | internalRepoToggle = false; 22 | } 23 | } 24 | // appove the request 25 | console.log(`Approving the request`); 26 | repoUpdate.visibility = internalRepoToggle ? 'internal' : 'public'; 27 | repoUpdate.archived = false; 28 | await updateRepoCloseIssue(context, octokit, repoUpdate); 29 | // set level of access for workflows outside of the repository 30 | if (internalRepoToggle) { 31 | await octokit.request(`PUT /repos/${repoUpdate.owner}/${repoUpdate.repo}/actions/permissions/access`, { 32 | owner: repoUpdate.owner, 33 | repo: repoUpdate.repo, 34 | access_level: 'enterprise' 35 | }); 36 | } 37 | } else if (context.payload.comment.body.toLowerCase().includes('deny') && await isAuthorized(context, options, octokit)) { 38 | // deny the request 39 | console.log(`Denying the request, archiving the repo`); 40 | repoUpdate.visibility = 'private'; 41 | repoUpdate.archived = true; 42 | await updateRepoCloseIssue(context, octokit, repoUpdate); 43 | } else { 44 | // do nothing 45 | console.log('Do nothing'); 46 | } 47 | } 48 | 49 | async function isAuthorized(context, options, octokit) { 50 | console.log(`Checking if ${context.payload.comment.user.login} is a member of ${options.adminOpsOrg}/${options.actionsApproverTeam} team`) 51 | try { 52 | let membership = await octokit.request(`GET /orgs/${options.adminOpsOrg}/teams/${options.actionsApproverTeam}/memberships/${context.payload.comment.user.login}`, { 53 | org: options.adminOpsOrg, 54 | team_slug: options.actionsApproverTeam, 55 | username: context.payload.comment.user.login 56 | }) 57 | 58 | if (membership.data.state == 'active') { 59 | console.log( "Membership active") 60 | return true; 61 | } else { 62 | console.log( "Membership not active") 63 | return false; 64 | } 65 | } catch (error) { 66 | console.log(`error: ${error}`); 67 | console.log("Error checking membership. Check the ADMIN_OPS_ORG and ACTIONS_APPROVER_TEAM variables.") 68 | throw new Error("Error checking membership"); 69 | } 70 | } 71 | 72 | async function updateRepoCloseIssue(context, octokit, repoUpdate) { 73 | // Update the repo and close the issue 74 | await octokit.request(`PATCH /repos/${repoUpdate.owner}/${repoUpdate.repo}`, repoUpdate); 75 | await octokit.request(`PATCH /repos/${context.payload.repository.owner.login}/${context.payload.repository.name}/issues/${context.payload.issue.number}`, { 76 | owner: context.payload.repository.owner.login, 77 | repo: context.payload.repository.name, 78 | issue_number: context.payload.issue.number, 79 | state: 'closed' 80 | }); 81 | } 82 | -------------------------------------------------------------------------------- /.github/scripts/initialize-request.mjs: -------------------------------------------------------------------------------- 1 | //const { Octokit } = require("@octokit/rest"); 2 | import { Octokit } from "@octokit/rest"; 3 | 4 | export default async function main(github, context, options) { 5 | // Instantiate octokit with ghtoken and baseUrl for GHES 6 | let octokit = new Octokit({ 7 | auth: options.token, 8 | baseUrl: options.baseUrl 9 | }); 10 | 11 | let exitError = false; 12 | // check if the repo already exists 13 | let repo = await octokit.request(`GET /repos/${options.actionsApprovedOrg}/${options.repo}_${options.version}`, { 14 | owner: options.actionsApprovedOrg, 15 | repo: `${options.repo}_${options.version}` 16 | }) 17 | .then(response => { 18 | // Repo exists, so we will fail the remainder of the workflow 19 | console.log(`Repo ${options.repo}_${options.version} already exists`); 20 | exitError = true; 21 | }) 22 | .catch(async error => { 23 | // Repo does not exist, so we will create it 24 | console.log(error); 25 | console.log(`Creating repo ${options.repo}_${options.version}`); 26 | let response = await octokit.request(`POST /orgs/${options.actionsApprovedOrg}/repos`, { 27 | org: options.actionsApprovedOrg, 28 | name: `${options.repo}_${options.version}`, 29 | description: `${options.owner}/${options.repo}@${options.version}`, 30 | homepage: `https://github.com/${options.owner}/${options.repo}`, 31 | visibility: 'private', 32 | has_issues: true, 33 | has_projects: false, 34 | has_wiki: false 35 | }); 36 | console.log(`Repo ${options.repo}_${options.version} created successfully`); 37 | // disable actions on the repo 38 | console.log('Disabling actions on new repo') 39 | await octokit.request(`PUT /repos/${options.actionsApprovedOrg}/${options.repo}_${options.version}/actions/permissions`, { 40 | owner: options.actionsApprovedOrg, 41 | repo: `${options.repo}_${options.version}`, 42 | enabled: false 43 | }); 44 | }); 45 | 46 | if (exitError) { 47 | throw new Error(`Repo ${options.actionsApprovedOrg}/${options.repo}_${options.version} already exists`); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /.github/scripts/mocks/issue-comment-created.json: -------------------------------------------------------------------------------- 1 | { 2 | "action": "created", 3 | "issue": { 4 | "url": "https://api.github.com/repos/Codertocat/Hello-World/issues/1", 5 | "repository_url": "https://api.github.com/repos/Codertocat/Hello-World", 6 | "labels_url": "https://api.github.com/repos/Codertocat/Hello-World/issues/1/labels{/name}", 7 | "comments_url": "https://api.github.com/repos/Codertocat/Hello-World/issues/1/comments", 8 | "events_url": "https://api.github.com/repos/Codertocat/Hello-World/issues/1/events", 9 | "html_url": "https://github.com/Codertocat/Hello-World/issues/1", 10 | "id": 444500041, 11 | "node_id": "MDU6SXNzdWU0NDQ1MDAwNDE=", 12 | "number": 1, 13 | "title": "Spelling error in the README file", 14 | "user": { 15 | "login": "Codertocat", 16 | "id": 21031067, 17 | "node_id": "MDQ6VXNlcjIxMDMxMDY3", 18 | "avatar_url": "https://avatars1.githubusercontent.com/u/21031067?v=4", 19 | "gravatar_id": "", 20 | "url": "https://api.github.com/users/Codertocat", 21 | "html_url": "https://github.com/Codertocat", 22 | "followers_url": "https://api.github.com/users/Codertocat/followers", 23 | "following_url": "https://api.github.com/users/Codertocat/following{/other_user}", 24 | "gists_url": "https://api.github.com/users/Codertocat/gists{/gist_id}", 25 | "starred_url": "https://api.github.com/users/Codertocat/starred{/owner}{/repo}", 26 | "subscriptions_url": "https://api.github.com/users/Codertocat/subscriptions", 27 | "organizations_url": "https://api.github.com/users/Codertocat/orgs", 28 | "repos_url": "https://api.github.com/users/Codertocat/repos", 29 | "events_url": "https://api.github.com/users/Codertocat/events{/privacy}", 30 | "received_events_url": "https://api.github.com/users/Codertocat/received_events", 31 | "type": "User", 32 | "site_admin": false 33 | }, 34 | "labels": [ 35 | { 36 | "id": 1362934389, 37 | "node_id": "MDU6TGFiZWwxMzYyOTM0Mzg5", 38 | "url": "https://api.github.com/repos/Codertocat/Hello-World/labels/bug", 39 | "name": "bug", 40 | "color": "d73a4a", 41 | "default": true 42 | } 43 | ], 44 | "state": "open", 45 | "locked": false, 46 | "assignee": { 47 | "login": "Codertocat", 48 | "id": 21031067, 49 | "node_id": "MDQ6VXNlcjIxMDMxMDY3", 50 | "avatar_url": "https://avatars1.githubusercontent.com/u/21031067?v=4", 51 | "gravatar_id": "", 52 | "url": "https://api.github.com/users/Codertocat", 53 | "html_url": "https://github.com/Codertocat", 54 | "followers_url": "https://api.github.com/users/Codertocat/followers", 55 | "following_url": "https://api.github.com/users/Codertocat/following{/other_user}", 56 | "gists_url": "https://api.github.com/users/Codertocat/gists{/gist_id}", 57 | "starred_url": "https://api.github.com/users/Codertocat/starred{/owner}{/repo}", 58 | "subscriptions_url": "https://api.github.com/users/Codertocat/subscriptions", 59 | "organizations_url": "https://api.github.com/users/Codertocat/orgs", 60 | "repos_url": "https://api.github.com/users/Codertocat/repos", 61 | "events_url": "https://api.github.com/users/Codertocat/events{/privacy}", 62 | "received_events_url": "https://api.github.com/users/Codertocat/received_events", 63 | "type": "User", 64 | "site_admin": false 65 | }, 66 | "assignees": [ 67 | { 68 | "login": "Codertocat", 69 | "id": 21031067, 70 | "node_id": "MDQ6VXNlcjIxMDMxMDY3", 71 | "avatar_url": "https://avatars1.githubusercontent.com/u/21031067?v=4", 72 | "gravatar_id": "", 73 | "url": "https://api.github.com/users/Codertocat", 74 | "html_url": "https://github.com/Codertocat", 75 | "followers_url": "https://api.github.com/users/Codertocat/followers", 76 | "following_url": "https://api.github.com/users/Codertocat/following{/other_user}", 77 | "gists_url": "https://api.github.com/users/Codertocat/gists{/gist_id}", 78 | "starred_url": "https://api.github.com/users/Codertocat/starred{/owner}{/repo}", 79 | "subscriptions_url": "https://api.github.com/users/Codertocat/subscriptions", 80 | "organizations_url": "https://api.github.com/users/Codertocat/orgs", 81 | "repos_url": "https://api.github.com/users/Codertocat/repos", 82 | "events_url": "https://api.github.com/users/Codertocat/events{/privacy}", 83 | "received_events_url": "https://api.github.com/users/Codertocat/received_events", 84 | "type": "User", 85 | "site_admin": false 86 | } 87 | ], 88 | "milestone": { 89 | "url": "https://api.github.com/repos/Codertocat/Hello-World/milestones/1", 90 | "html_url": "https://github.com/Codertocat/Hello-World/milestone/1", 91 | "labels_url": "https://api.github.com/repos/Codertocat/Hello-World/milestones/1/labels", 92 | "id": 4317517, 93 | "node_id": "MDk6TWlsZXN0b25lNDMxNzUxNw==", 94 | "number": 1, 95 | "title": "v1.0", 96 | "description": "Add new space flight simulator", 97 | "creator": { 98 | "login": "Codertocat", 99 | "id": 21031067, 100 | "node_id": "MDQ6VXNlcjIxMDMxMDY3", 101 | "avatar_url": "https://avatars1.githubusercontent.com/u/21031067?v=4", 102 | "gravatar_id": "", 103 | "url": "https://api.github.com/users/Codertocat", 104 | "html_url": "https://github.com/Codertocat", 105 | "followers_url": "https://api.github.com/users/Codertocat/followers", 106 | "following_url": "https://api.github.com/users/Codertocat/following{/other_user}", 107 | "gists_url": "https://api.github.com/users/Codertocat/gists{/gist_id}", 108 | "starred_url": "https://api.github.com/users/Codertocat/starred{/owner}{/repo}", 109 | "subscriptions_url": "https://api.github.com/users/Codertocat/subscriptions", 110 | "organizations_url": "https://api.github.com/users/Codertocat/orgs", 111 | "repos_url": "https://api.github.com/users/Codertocat/repos", 112 | "events_url": "https://api.github.com/users/Codertocat/events{/privacy}", 113 | "received_events_url": "https://api.github.com/users/Codertocat/received_events", 114 | "type": "User", 115 | "site_admin": false 116 | }, 117 | "open_issues": 1, 118 | "closed_issues": 0, 119 | "state": "closed", 120 | "created_at": "2019-05-15T15:20:17Z", 121 | "updated_at": "2019-05-15T15:20:18Z", 122 | "due_on": "2019-05-23T07:00:00Z", 123 | "closed_at": "2019-05-15T15:20:18Z" 124 | }, 125 | "comments": 0, 126 | "created_at": "2019-05-15T15:20:18Z", 127 | "updated_at": "2019-05-15T15:20:21Z", 128 | "closed_at": null, 129 | "author_association": "OWNER", 130 | "body": "It looks like you accidently spelled 'commit' with two 't's." 131 | }, 132 | "comment": { 133 | "url": "https://api.github.com/repos/Codertocat/Hello-World/issues/comments/492700400", 134 | "html_url": "https://github.com/Codertocat/Hello-World/issues/1#issuecomment-492700400", 135 | "issue_url": "https://api.github.com/repos/Codertocat/Hello-World/issues/1", 136 | "id": 492700400, 137 | "node_id": "MDEyOklzc3VlQ29tbWVudDQ5MjcwMDQwMA==", 138 | "user": { 139 | "login": "Codertocat", 140 | "id": 21031067, 141 | "node_id": "MDQ6VXNlcjIxMDMxMDY3", 142 | "avatar_url": "https://avatars1.githubusercontent.com/u/21031067?v=4", 143 | "gravatar_id": "", 144 | "url": "https://api.github.com/users/Codertocat", 145 | "html_url": "https://github.com/Codertocat", 146 | "followers_url": "https://api.github.com/users/Codertocat/followers", 147 | "following_url": "https://api.github.com/users/Codertocat/following{/other_user}", 148 | "gists_url": "https://api.github.com/users/Codertocat/gists{/gist_id}", 149 | "starred_url": "https://api.github.com/users/Codertocat/starred{/owner}{/repo}", 150 | "subscriptions_url": "https://api.github.com/users/Codertocat/subscriptions", 151 | "organizations_url": "https://api.github.com/users/Codertocat/orgs", 152 | "repos_url": "https://api.github.com/users/Codertocat/repos", 153 | "events_url": "https://api.github.com/users/Codertocat/events{/privacy}", 154 | "received_events_url": "https://api.github.com/users/Codertocat/received_events", 155 | "type": "User", 156 | "site_admin": false 157 | }, 158 | "created_at": "2019-05-15T15:20:21Z", 159 | "updated_at": "2019-05-15T15:20:21Z", 160 | "author_association": "OWNER", 161 | "body": "You are totally right! I'll get this fixed right away." 162 | }, 163 | "repository": { 164 | "id": 186853002, 165 | "node_id": "MDEwOlJlcG9zaXRvcnkxODY4NTMwMDI=", 166 | "name": "Hello-World", 167 | "full_name": "Codertocat/Hello-World", 168 | "private": false, 169 | "owner": { 170 | "login": "Codertocat", 171 | "id": 21031067, 172 | "node_id": "MDQ6VXNlcjIxMDMxMDY3", 173 | "avatar_url": "https://avatars1.githubusercontent.com/u/21031067?v=4", 174 | "gravatar_id": "", 175 | "url": "https://api.github.com/users/Codertocat", 176 | "html_url": "https://github.com/Codertocat", 177 | "followers_url": "https://api.github.com/users/Codertocat/followers", 178 | "following_url": "https://api.github.com/users/Codertocat/following{/other_user}", 179 | "gists_url": "https://api.github.com/users/Codertocat/gists{/gist_id}", 180 | "starred_url": "https://api.github.com/users/Codertocat/starred{/owner}{/repo}", 181 | "subscriptions_url": "https://api.github.com/users/Codertocat/subscriptions", 182 | "organizations_url": "https://api.github.com/users/Codertocat/orgs", 183 | "repos_url": "https://api.github.com/users/Codertocat/repos", 184 | "events_url": "https://api.github.com/users/Codertocat/events{/privacy}", 185 | "received_events_url": "https://api.github.com/users/Codertocat/received_events", 186 | "type": "User", 187 | "site_admin": false 188 | }, 189 | "html_url": "https://github.com/Codertocat/Hello-World", 190 | "description": null, 191 | "fork": false, 192 | "url": "https://api.github.com/repos/Codertocat/Hello-World", 193 | "forks_url": "https://api.github.com/repos/Codertocat/Hello-World/forks", 194 | "keys_url": "https://api.github.com/repos/Codertocat/Hello-World/keys{/key_id}", 195 | "collaborators_url": "https://api.github.com/repos/Codertocat/Hello-World/collaborators{/collaborator}", 196 | "teams_url": "https://api.github.com/repos/Codertocat/Hello-World/teams", 197 | "hooks_url": "https://api.github.com/repos/Codertocat/Hello-World/hooks", 198 | "issue_events_url": "https://api.github.com/repos/Codertocat/Hello-World/issues/events{/number}", 199 | "events_url": "https://api.github.com/repos/Codertocat/Hello-World/events", 200 | "assignees_url": "https://api.github.com/repos/Codertocat/Hello-World/assignees{/user}", 201 | "branches_url": "https://api.github.com/repos/Codertocat/Hello-World/branches{/branch}", 202 | "tags_url": "https://api.github.com/repos/Codertocat/Hello-World/tags", 203 | "blobs_url": "https://api.github.com/repos/Codertocat/Hello-World/git/blobs{/sha}", 204 | "git_tags_url": "https://api.github.com/repos/Codertocat/Hello-World/git/tags{/sha}", 205 | "git_refs_url": "https://api.github.com/repos/Codertocat/Hello-World/git/refs{/sha}", 206 | "trees_url": "https://api.github.com/repos/Codertocat/Hello-World/git/trees{/sha}", 207 | "statuses_url": "https://api.github.com/repos/Codertocat/Hello-World/statuses/{sha}", 208 | "languages_url": "https://api.github.com/repos/Codertocat/Hello-World/languages", 209 | "stargazers_url": "https://api.github.com/repos/Codertocat/Hello-World/stargazers", 210 | "contributors_url": "https://api.github.com/repos/Codertocat/Hello-World/contributors", 211 | "subscribers_url": "https://api.github.com/repos/Codertocat/Hello-World/subscribers", 212 | "subscription_url": "https://api.github.com/repos/Codertocat/Hello-World/subscription", 213 | "commits_url": "https://api.github.com/repos/Codertocat/Hello-World/commits{/sha}", 214 | "git_commits_url": "https://api.github.com/repos/Codertocat/Hello-World/git/commits{/sha}", 215 | "comments_url": "https://api.github.com/repos/Codertocat/Hello-World/comments{/number}", 216 | "issue_comment_url": "https://api.github.com/repos/Codertocat/Hello-World/issues/comments{/number}", 217 | "contents_url": "https://api.github.com/repos/Codertocat/Hello-World/contents/{+path}", 218 | "compare_url": "https://api.github.com/repos/Codertocat/Hello-World/compare/{base}...{head}", 219 | "merges_url": "https://api.github.com/repos/Codertocat/Hello-World/merges", 220 | "archive_url": "https://api.github.com/repos/Codertocat/Hello-World/{archive_format}{/ref}", 221 | "downloads_url": "https://api.github.com/repos/Codertocat/Hello-World/downloads", 222 | "issues_url": "https://api.github.com/repos/Codertocat/Hello-World/issues{/number}", 223 | "pulls_url": "https://api.github.com/repos/Codertocat/Hello-World/pulls{/number}", 224 | "milestones_url": "https://api.github.com/repos/Codertocat/Hello-World/milestones{/number}", 225 | "notifications_url": "https://api.github.com/repos/Codertocat/Hello-World/notifications{?since,all,participating}", 226 | "labels_url": "https://api.github.com/repos/Codertocat/Hello-World/labels{/name}", 227 | "releases_url": "https://api.github.com/repos/Codertocat/Hello-World/releases{/id}", 228 | "deployments_url": "https://api.github.com/repos/Codertocat/Hello-World/deployments", 229 | "created_at": "2019-05-15T15:19:25Z", 230 | "updated_at": "2019-05-15T15:19:27Z", 231 | "pushed_at": "2019-05-15T15:20:13Z", 232 | "git_url": "git://github.com/Codertocat/Hello-World.git", 233 | "ssh_url": "git@github.com:Codertocat/Hello-World.git", 234 | "clone_url": "https://github.com/Codertocat/Hello-World.git", 235 | "svn_url": "https://github.com/Codertocat/Hello-World", 236 | "homepage": null, 237 | "size": 0, 238 | "stargazers_count": 0, 239 | "watchers_count": 0, 240 | "language": null, 241 | "has_issues": true, 242 | "has_projects": true, 243 | "has_downloads": true, 244 | "has_wiki": true, 245 | "has_pages": true, 246 | "forks_count": 0, 247 | "mirror_url": null, 248 | "archived": false, 249 | "disabled": false, 250 | "open_issues_count": 1, 251 | "license": null, 252 | "forks": 0, 253 | "open_issues": 1, 254 | "watchers": 0, 255 | "default_branch": "master" 256 | }, 257 | "sender": { 258 | "login": "Codertocat", 259 | "id": 21031067, 260 | "node_id": "MDQ6VXNlcjIxMDMxMDY3", 261 | "avatar_url": "https://avatars1.githubusercontent.com/u/21031067?v=4", 262 | "gravatar_id": "", 263 | "url": "https://api.github.com/users/Codertocat", 264 | "html_url": "https://github.com/Codertocat", 265 | "followers_url": "https://api.github.com/users/Codertocat/followers", 266 | "following_url": "https://api.github.com/users/Codertocat/following{/other_user}", 267 | "gists_url": "https://api.github.com/users/Codertocat/gists{/gist_id}", 268 | "starred_url": "https://api.github.com/users/Codertocat/starred{/owner}{/repo}", 269 | "subscriptions_url": "https://api.github.com/users/Codertocat/subscriptions", 270 | "organizations_url": "https://api.github.com/users/Codertocat/orgs", 271 | "repos_url": "https://api.github.com/users/Codertocat/repos", 272 | "events_url": "https://api.github.com/users/Codertocat/events{/privacy}", 273 | "received_events_url": "https://api.github.com/users/Codertocat/received_events", 274 | "type": "User", 275 | "site_admin": false 276 | } 277 | } -------------------------------------------------------------------------------- /.github/scripts/mocks/membership-response.json: -------------------------------------------------------------------------------- 1 | { 2 | "url": "https://api.github.com/teams/1/memberships/octocat", 3 | "role": "maintainer", 4 | "state": "active" 5 | } -------------------------------------------------------------------------------- /.github/scripts/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "request-marketplace-action", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "request-marketplace-action", 9 | "version": "1.0.0", 10 | "license": "MIT", 11 | "dependencies": { 12 | "@octokit/rest": "^22.0.0" 13 | }, 14 | "devDependencies": { 15 | "mocha": "^11.6.0", 16 | "nock": "^14.0.5", 17 | "nyc": "^17.1.0", 18 | "uvu": "^0.5.6" 19 | } 20 | }, 21 | "node_modules/@ampproject/remapping": { 22 | "version": "2.3.0", 23 | "dev": true, 24 | "license": "Apache-2.0", 25 | "dependencies": { 26 | "@jridgewell/gen-mapping": "^0.3.5", 27 | "@jridgewell/trace-mapping": "^0.3.24" 28 | }, 29 | "engines": { 30 | "node": ">=6.0.0" 31 | } 32 | }, 33 | "node_modules/@babel/code-frame": { 34 | "version": "7.24.7", 35 | "dev": true, 36 | "license": "MIT", 37 | "dependencies": { 38 | "@babel/highlight": "^7.24.7", 39 | "picocolors": "^1.0.0" 40 | }, 41 | "engines": { 42 | "node": ">=6.9.0" 43 | } 44 | }, 45 | "node_modules/@babel/compat-data": { 46 | "version": "7.25.4", 47 | "dev": true, 48 | "license": "MIT", 49 | "engines": { 50 | "node": ">=6.9.0" 51 | } 52 | }, 53 | "node_modules/@babel/core": { 54 | "version": "7.25.2", 55 | "dev": true, 56 | "license": "MIT", 57 | "dependencies": { 58 | "@ampproject/remapping": "^2.2.0", 59 | "@babel/code-frame": "^7.24.7", 60 | "@babel/generator": "^7.25.0", 61 | "@babel/helper-compilation-targets": "^7.25.2", 62 | "@babel/helper-module-transforms": "^7.25.2", 63 | "@babel/helpers": "^7.25.0", 64 | "@babel/parser": "^7.25.0", 65 | "@babel/template": "^7.25.0", 66 | "@babel/traverse": "^7.25.2", 67 | "@babel/types": "^7.25.2", 68 | "convert-source-map": "^2.0.0", 69 | "debug": "^4.1.0", 70 | "gensync": "^1.0.0-beta.2", 71 | "json5": "^2.2.3", 72 | "semver": "^6.3.1" 73 | }, 74 | "engines": { 75 | "node": ">=6.9.0" 76 | }, 77 | "funding": { 78 | "type": "opencollective", 79 | "url": "https://opencollective.com/babel" 80 | } 81 | }, 82 | "node_modules/@babel/core/node_modules/convert-source-map": { 83 | "version": "2.0.0", 84 | "dev": true, 85 | "license": "MIT" 86 | }, 87 | "node_modules/@babel/generator": { 88 | "version": "7.25.6", 89 | "dev": true, 90 | "license": "MIT", 91 | "dependencies": { 92 | "@babel/types": "^7.25.6", 93 | "@jridgewell/gen-mapping": "^0.3.5", 94 | "@jridgewell/trace-mapping": "^0.3.25", 95 | "jsesc": "^2.5.1" 96 | }, 97 | "engines": { 98 | "node": ">=6.9.0" 99 | } 100 | }, 101 | "node_modules/@babel/helper-compilation-targets": { 102 | "version": "7.25.2", 103 | "dev": true, 104 | "license": "MIT", 105 | "dependencies": { 106 | "@babel/compat-data": "^7.25.2", 107 | "@babel/helper-validator-option": "^7.24.8", 108 | "browserslist": "^4.23.1", 109 | "lru-cache": "^5.1.1", 110 | "semver": "^6.3.1" 111 | }, 112 | "engines": { 113 | "node": ">=6.9.0" 114 | } 115 | }, 116 | "node_modules/@babel/helper-module-imports": { 117 | "version": "7.24.7", 118 | "dev": true, 119 | "license": "MIT", 120 | "dependencies": { 121 | "@babel/traverse": "^7.24.7", 122 | "@babel/types": "^7.24.7" 123 | }, 124 | "engines": { 125 | "node": ">=6.9.0" 126 | } 127 | }, 128 | "node_modules/@babel/helper-module-transforms": { 129 | "version": "7.25.2", 130 | "dev": true, 131 | "license": "MIT", 132 | "dependencies": { 133 | "@babel/helper-module-imports": "^7.24.7", 134 | "@babel/helper-simple-access": "^7.24.7", 135 | "@babel/helper-validator-identifier": "^7.24.7", 136 | "@babel/traverse": "^7.25.2" 137 | }, 138 | "engines": { 139 | "node": ">=6.9.0" 140 | }, 141 | "peerDependencies": { 142 | "@babel/core": "^7.0.0" 143 | } 144 | }, 145 | "node_modules/@babel/helper-simple-access": { 146 | "version": "7.24.7", 147 | "dev": true, 148 | "license": "MIT", 149 | "dependencies": { 150 | "@babel/traverse": "^7.24.7", 151 | "@babel/types": "^7.24.7" 152 | }, 153 | "engines": { 154 | "node": ">=6.9.0" 155 | } 156 | }, 157 | "node_modules/@babel/helper-string-parser": { 158 | "version": "7.24.8", 159 | "dev": true, 160 | "license": "MIT", 161 | "engines": { 162 | "node": ">=6.9.0" 163 | } 164 | }, 165 | "node_modules/@babel/helper-validator-identifier": { 166 | "version": "7.24.7", 167 | "dev": true, 168 | "license": "MIT", 169 | "engines": { 170 | "node": ">=6.9.0" 171 | } 172 | }, 173 | "node_modules/@babel/helper-validator-option": { 174 | "version": "7.24.8", 175 | "dev": true, 176 | "license": "MIT", 177 | "engines": { 178 | "node": ">=6.9.0" 179 | } 180 | }, 181 | "node_modules/@babel/helpers": { 182 | "version": "7.25.6", 183 | "dev": true, 184 | "license": "MIT", 185 | "dependencies": { 186 | "@babel/template": "^7.25.0", 187 | "@babel/types": "^7.25.6" 188 | }, 189 | "engines": { 190 | "node": ">=6.9.0" 191 | } 192 | }, 193 | "node_modules/@babel/highlight": { 194 | "version": "7.24.7", 195 | "dev": true, 196 | "license": "MIT", 197 | "dependencies": { 198 | "@babel/helper-validator-identifier": "^7.24.7", 199 | "chalk": "^2.4.2", 200 | "js-tokens": "^4.0.0", 201 | "picocolors": "^1.0.0" 202 | }, 203 | "engines": { 204 | "node": ">=6.9.0" 205 | } 206 | }, 207 | "node_modules/@babel/highlight/node_modules/ansi-styles": { 208 | "version": "3.2.1", 209 | "dev": true, 210 | "license": "MIT", 211 | "dependencies": { 212 | "color-convert": "^1.9.0" 213 | }, 214 | "engines": { 215 | "node": ">=4" 216 | } 217 | }, 218 | "node_modules/@babel/highlight/node_modules/chalk": { 219 | "version": "2.4.2", 220 | "dev": true, 221 | "license": "MIT", 222 | "dependencies": { 223 | "ansi-styles": "^3.2.1", 224 | "escape-string-regexp": "^1.0.5", 225 | "supports-color": "^5.3.0" 226 | }, 227 | "engines": { 228 | "node": ">=4" 229 | } 230 | }, 231 | "node_modules/@babel/highlight/node_modules/color-convert": { 232 | "version": "1.9.3", 233 | "dev": true, 234 | "license": "MIT", 235 | "dependencies": { 236 | "color-name": "1.1.3" 237 | } 238 | }, 239 | "node_modules/@babel/highlight/node_modules/color-name": { 240 | "version": "1.1.3", 241 | "dev": true, 242 | "license": "MIT" 243 | }, 244 | "node_modules/@babel/highlight/node_modules/escape-string-regexp": { 245 | "version": "1.0.5", 246 | "dev": true, 247 | "license": "MIT", 248 | "engines": { 249 | "node": ">=0.8.0" 250 | } 251 | }, 252 | "node_modules/@babel/highlight/node_modules/has-flag": { 253 | "version": "3.0.0", 254 | "dev": true, 255 | "license": "MIT", 256 | "engines": { 257 | "node": ">=4" 258 | } 259 | }, 260 | "node_modules/@babel/highlight/node_modules/supports-color": { 261 | "version": "5.5.0", 262 | "dev": true, 263 | "license": "MIT", 264 | "dependencies": { 265 | "has-flag": "^3.0.0" 266 | }, 267 | "engines": { 268 | "node": ">=4" 269 | } 270 | }, 271 | "node_modules/@babel/parser": { 272 | "version": "7.25.6", 273 | "dev": true, 274 | "license": "MIT", 275 | "dependencies": { 276 | "@babel/types": "^7.25.6" 277 | }, 278 | "bin": { 279 | "parser": "bin/babel-parser.js" 280 | }, 281 | "engines": { 282 | "node": ">=6.0.0" 283 | } 284 | }, 285 | "node_modules/@babel/template": { 286 | "version": "7.25.0", 287 | "dev": true, 288 | "license": "MIT", 289 | "dependencies": { 290 | "@babel/code-frame": "^7.24.7", 291 | "@babel/parser": "^7.25.0", 292 | "@babel/types": "^7.25.0" 293 | }, 294 | "engines": { 295 | "node": ">=6.9.0" 296 | } 297 | }, 298 | "node_modules/@babel/traverse": { 299 | "version": "7.25.6", 300 | "dev": true, 301 | "license": "MIT", 302 | "dependencies": { 303 | "@babel/code-frame": "^7.24.7", 304 | "@babel/generator": "^7.25.6", 305 | "@babel/parser": "^7.25.6", 306 | "@babel/template": "^7.25.0", 307 | "@babel/types": "^7.25.6", 308 | "debug": "^4.3.1", 309 | "globals": "^11.1.0" 310 | }, 311 | "engines": { 312 | "node": ">=6.9.0" 313 | } 314 | }, 315 | "node_modules/@babel/types": { 316 | "version": "7.25.6", 317 | "dev": true, 318 | "license": "MIT", 319 | "dependencies": { 320 | "@babel/helper-string-parser": "^7.24.8", 321 | "@babel/helper-validator-identifier": "^7.24.7", 322 | "to-fast-properties": "^2.0.0" 323 | }, 324 | "engines": { 325 | "node": ">=6.9.0" 326 | } 327 | }, 328 | "node_modules/@isaacs/cliui": { 329 | "version": "8.0.2", 330 | "dev": true, 331 | "license": "ISC", 332 | "dependencies": { 333 | "string-width": "^5.1.2", 334 | "string-width-cjs": "npm:string-width@^4.2.0", 335 | "strip-ansi": "^7.0.1", 336 | "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", 337 | "wrap-ansi": "^8.1.0", 338 | "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" 339 | }, 340 | "engines": { 341 | "node": ">=12" 342 | } 343 | }, 344 | "node_modules/@isaacs/cliui/node_modules/ansi-regex": { 345 | "version": "6.1.0", 346 | "dev": true, 347 | "license": "MIT", 348 | "engines": { 349 | "node": ">=12" 350 | }, 351 | "funding": { 352 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 353 | } 354 | }, 355 | "node_modules/@isaacs/cliui/node_modules/emoji-regex": { 356 | "version": "9.2.2", 357 | "dev": true, 358 | "license": "MIT" 359 | }, 360 | "node_modules/@isaacs/cliui/node_modules/string-width": { 361 | "version": "5.1.2", 362 | "dev": true, 363 | "license": "MIT", 364 | "dependencies": { 365 | "eastasianwidth": "^0.2.0", 366 | "emoji-regex": "^9.2.2", 367 | "strip-ansi": "^7.0.1" 368 | }, 369 | "engines": { 370 | "node": ">=12" 371 | }, 372 | "funding": { 373 | "url": "https://github.com/sponsors/sindresorhus" 374 | } 375 | }, 376 | "node_modules/@isaacs/cliui/node_modules/string-width-cjs": { 377 | "name": "string-width", 378 | "version": "4.2.3", 379 | "dev": true, 380 | "license": "MIT", 381 | "dependencies": { 382 | "emoji-regex": "^8.0.0", 383 | "is-fullwidth-code-point": "^3.0.0", 384 | "strip-ansi": "^6.0.1" 385 | }, 386 | "engines": { 387 | "node": ">=8" 388 | } 389 | }, 390 | "node_modules/@isaacs/cliui/node_modules/string-width-cjs/node_modules/ansi-regex": { 391 | "version": "5.0.1", 392 | "dev": true, 393 | "license": "MIT", 394 | "engines": { 395 | "node": ">=8" 396 | } 397 | }, 398 | "node_modules/@isaacs/cliui/node_modules/string-width-cjs/node_modules/emoji-regex": { 399 | "version": "8.0.0", 400 | "dev": true, 401 | "license": "MIT" 402 | }, 403 | "node_modules/@isaacs/cliui/node_modules/string-width-cjs/node_modules/strip-ansi": { 404 | "version": "6.0.1", 405 | "dev": true, 406 | "license": "MIT", 407 | "dependencies": { 408 | "ansi-regex": "^5.0.1" 409 | }, 410 | "engines": { 411 | "node": ">=8" 412 | } 413 | }, 414 | "node_modules/@isaacs/cliui/node_modules/strip-ansi": { 415 | "version": "7.1.0", 416 | "dev": true, 417 | "license": "MIT", 418 | "dependencies": { 419 | "ansi-regex": "^6.0.1" 420 | }, 421 | "engines": { 422 | "node": ">=12" 423 | }, 424 | "funding": { 425 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 426 | } 427 | }, 428 | "node_modules/@isaacs/cliui/node_modules/strip-ansi-cjs": { 429 | "name": "strip-ansi", 430 | "version": "6.0.1", 431 | "dev": true, 432 | "license": "MIT", 433 | "dependencies": { 434 | "ansi-regex": "^5.0.1" 435 | }, 436 | "engines": { 437 | "node": ">=8" 438 | } 439 | }, 440 | "node_modules/@isaacs/cliui/node_modules/strip-ansi-cjs/node_modules/ansi-regex": { 441 | "version": "5.0.1", 442 | "dev": true, 443 | "license": "MIT", 444 | "engines": { 445 | "node": ">=8" 446 | } 447 | }, 448 | "node_modules/@isaacs/cliui/node_modules/wrap-ansi-cjs": { 449 | "name": "wrap-ansi", 450 | "version": "7.0.0", 451 | "dev": true, 452 | "license": "MIT", 453 | "dependencies": { 454 | "ansi-styles": "^4.0.0", 455 | "string-width": "^4.1.0", 456 | "strip-ansi": "^6.0.0" 457 | }, 458 | "engines": { 459 | "node": ">=10" 460 | }, 461 | "funding": { 462 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 463 | } 464 | }, 465 | "node_modules/@isaacs/cliui/node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { 466 | "version": "5.0.1", 467 | "dev": true, 468 | "license": "MIT", 469 | "engines": { 470 | "node": ">=8" 471 | } 472 | }, 473 | "node_modules/@isaacs/cliui/node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { 474 | "version": "8.0.0", 475 | "dev": true, 476 | "license": "MIT" 477 | }, 478 | "node_modules/@isaacs/cliui/node_modules/wrap-ansi-cjs/node_modules/string-width": { 479 | "version": "4.2.3", 480 | "dev": true, 481 | "license": "MIT", 482 | "dependencies": { 483 | "emoji-regex": "^8.0.0", 484 | "is-fullwidth-code-point": "^3.0.0", 485 | "strip-ansi": "^6.0.1" 486 | }, 487 | "engines": { 488 | "node": ">=8" 489 | } 490 | }, 491 | "node_modules/@isaacs/cliui/node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { 492 | "version": "6.0.1", 493 | "dev": true, 494 | "license": "MIT", 495 | "dependencies": { 496 | "ansi-regex": "^5.0.1" 497 | }, 498 | "engines": { 499 | "node": ">=8" 500 | } 501 | }, 502 | "node_modules/@istanbuljs/load-nyc-config": { 503 | "version": "1.1.0", 504 | "dev": true, 505 | "license": "ISC", 506 | "dependencies": { 507 | "camelcase": "^5.3.1", 508 | "find-up": "^4.1.0", 509 | "get-package-type": "^0.1.0", 510 | "js-yaml": "^3.13.1", 511 | "resolve-from": "^5.0.0" 512 | }, 513 | "engines": { 514 | "node": ">=8" 515 | } 516 | }, 517 | "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { 518 | "version": "1.0.10", 519 | "dev": true, 520 | "license": "MIT", 521 | "dependencies": { 522 | "sprintf-js": "~1.0.2" 523 | } 524 | }, 525 | "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { 526 | "version": "5.3.1", 527 | "dev": true, 528 | "license": "MIT", 529 | "engines": { 530 | "node": ">=6" 531 | } 532 | }, 533 | "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { 534 | "version": "4.1.0", 535 | "dev": true, 536 | "license": "MIT", 537 | "dependencies": { 538 | "locate-path": "^5.0.0", 539 | "path-exists": "^4.0.0" 540 | }, 541 | "engines": { 542 | "node": ">=8" 543 | } 544 | }, 545 | "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { 546 | "version": "3.14.1", 547 | "dev": true, 548 | "license": "MIT", 549 | "dependencies": { 550 | "argparse": "^1.0.7", 551 | "esprima": "^4.0.0" 552 | }, 553 | "bin": { 554 | "js-yaml": "bin/js-yaml.js" 555 | } 556 | }, 557 | "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { 558 | "version": "5.0.0", 559 | "dev": true, 560 | "license": "MIT", 561 | "dependencies": { 562 | "p-locate": "^4.1.0" 563 | }, 564 | "engines": { 565 | "node": ">=8" 566 | } 567 | }, 568 | "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { 569 | "version": "2.3.0", 570 | "dev": true, 571 | "license": "MIT", 572 | "dependencies": { 573 | "p-try": "^2.0.0" 574 | }, 575 | "engines": { 576 | "node": ">=6" 577 | }, 578 | "funding": { 579 | "url": "https://github.com/sponsors/sindresorhus" 580 | } 581 | }, 582 | "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { 583 | "version": "4.1.0", 584 | "dev": true, 585 | "license": "MIT", 586 | "dependencies": { 587 | "p-limit": "^2.2.0" 588 | }, 589 | "engines": { 590 | "node": ">=8" 591 | } 592 | }, 593 | "node_modules/@istanbuljs/schema": { 594 | "version": "0.1.3", 595 | "dev": true, 596 | "license": "MIT", 597 | "engines": { 598 | "node": ">=8" 599 | } 600 | }, 601 | "node_modules/@jridgewell/gen-mapping": { 602 | "version": "0.3.5", 603 | "dev": true, 604 | "license": "MIT", 605 | "dependencies": { 606 | "@jridgewell/set-array": "^1.2.1", 607 | "@jridgewell/sourcemap-codec": "^1.4.10", 608 | "@jridgewell/trace-mapping": "^0.3.24" 609 | }, 610 | "engines": { 611 | "node": ">=6.0.0" 612 | } 613 | }, 614 | "node_modules/@jridgewell/resolve-uri": { 615 | "version": "3.1.2", 616 | "dev": true, 617 | "license": "MIT", 618 | "engines": { 619 | "node": ">=6.0.0" 620 | } 621 | }, 622 | "node_modules/@jridgewell/set-array": { 623 | "version": "1.2.1", 624 | "dev": true, 625 | "license": "MIT", 626 | "engines": { 627 | "node": ">=6.0.0" 628 | } 629 | }, 630 | "node_modules/@jridgewell/sourcemap-codec": { 631 | "version": "1.5.0", 632 | "dev": true, 633 | "license": "MIT" 634 | }, 635 | "node_modules/@jridgewell/trace-mapping": { 636 | "version": "0.3.25", 637 | "dev": true, 638 | "license": "MIT", 639 | "dependencies": { 640 | "@jridgewell/resolve-uri": "^3.1.0", 641 | "@jridgewell/sourcemap-codec": "^1.4.14" 642 | } 643 | }, 644 | "node_modules/@mswjs/interceptors": { 645 | "version": "0.38.7", 646 | "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.38.7.tgz", 647 | "integrity": "sha512-Jkb27iSn7JPdkqlTqKfhncFfnEZsIJVYxsFbUSWEkxdIPdsyngrhoDBk0/BGD2FQcRH99vlRrkHpNTyKqI+0/w==", 648 | "dev": true, 649 | "dependencies": { 650 | "@open-draft/deferred-promise": "^2.2.0", 651 | "@open-draft/logger": "^0.3.0", 652 | "@open-draft/until": "^2.0.0", 653 | "is-node-process": "^1.2.0", 654 | "outvariant": "^1.4.3", 655 | "strict-event-emitter": "^0.5.1" 656 | }, 657 | "engines": { 658 | "node": ">=18" 659 | } 660 | }, 661 | "node_modules/@octokit/auth-token": { 662 | "version": "6.0.0", 663 | "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-6.0.0.tgz", 664 | "integrity": "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==", 665 | "engines": { 666 | "node": ">= 20" 667 | } 668 | }, 669 | "node_modules/@octokit/core": { 670 | "version": "7.0.2", 671 | "resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.2.tgz", 672 | "integrity": "sha512-ODsoD39Lq6vR6aBgvjTnA3nZGliknKboc9Gtxr7E4WDNqY24MxANKcuDQSF0jzapvGb3KWOEDrKfve4HoWGK+g==", 673 | "dependencies": { 674 | "@octokit/auth-token": "^6.0.0", 675 | "@octokit/graphql": "^9.0.1", 676 | "@octokit/request": "^10.0.2", 677 | "@octokit/request-error": "^7.0.0", 678 | "@octokit/types": "^14.0.0", 679 | "before-after-hook": "^4.0.0", 680 | "universal-user-agent": "^7.0.0" 681 | }, 682 | "engines": { 683 | "node": ">= 20" 684 | } 685 | }, 686 | "node_modules/@octokit/endpoint": { 687 | "version": "11.0.0", 688 | "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.0.tgz", 689 | "integrity": "sha512-hoYicJZaqISMAI3JfaDr1qMNi48OctWuOih1m80bkYow/ayPw6Jj52tqWJ6GEoFTk1gBqfanSoI1iY99Z5+ekQ==", 690 | "dependencies": { 691 | "@octokit/types": "^14.0.0", 692 | "universal-user-agent": "^7.0.2" 693 | }, 694 | "engines": { 695 | "node": ">= 20" 696 | } 697 | }, 698 | "node_modules/@octokit/graphql": { 699 | "version": "9.0.1", 700 | "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.1.tgz", 701 | "integrity": "sha512-j1nQNU1ZxNFx2ZtKmL4sMrs4egy5h65OMDmSbVyuCzjOcwsHq6EaYjOTGXPQxgfiN8dJ4CriYHk6zF050WEULg==", 702 | "dependencies": { 703 | "@octokit/request": "^10.0.2", 704 | "@octokit/types": "^14.0.0", 705 | "universal-user-agent": "^7.0.0" 706 | }, 707 | "engines": { 708 | "node": ">= 20" 709 | } 710 | }, 711 | "node_modules/@octokit/openapi-types": { 712 | "version": "25.1.0", 713 | "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.1.0.tgz", 714 | "integrity": "sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA==" 715 | }, 716 | "node_modules/@octokit/plugin-paginate-rest": { 717 | "version": "13.0.1", 718 | "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-13.0.1.tgz", 719 | "integrity": "sha512-m1KvHlueScy4mQJWvFDCxFBTIdXS0K1SgFGLmqHyX90mZdCIv6gWBbKRhatxRjhGlONuTK/hztYdaqrTXcFZdQ==", 720 | "dependencies": { 721 | "@octokit/types": "^14.1.0" 722 | }, 723 | "engines": { 724 | "node": ">= 20" 725 | }, 726 | "peerDependencies": { 727 | "@octokit/core": ">=6" 728 | } 729 | }, 730 | "node_modules/@octokit/plugin-request-log": { 731 | "version": "6.0.0", 732 | "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-6.0.0.tgz", 733 | "integrity": "sha512-UkOzeEN3W91/eBq9sPZNQ7sUBvYCqYbrrD8gTbBuGtHEuycE4/awMXcYvx6sVYo7LypPhmQwwpUe4Yyu4QZN5Q==", 734 | "engines": { 735 | "node": ">= 20" 736 | }, 737 | "peerDependencies": { 738 | "@octokit/core": ">=6" 739 | } 740 | }, 741 | "node_modules/@octokit/plugin-rest-endpoint-methods": { 742 | "version": "16.0.0", 743 | "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-16.0.0.tgz", 744 | "integrity": "sha512-kJVUQk6/dx/gRNLWUnAWKFs1kVPn5O5CYZyssyEoNYaFedqZxsfYs7DwI3d67hGz4qOwaJ1dpm07hOAD1BXx6g==", 745 | "dependencies": { 746 | "@octokit/types": "^14.1.0" 747 | }, 748 | "engines": { 749 | "node": ">= 20" 750 | }, 751 | "peerDependencies": { 752 | "@octokit/core": ">=6" 753 | } 754 | }, 755 | "node_modules/@octokit/request": { 756 | "version": "10.0.2", 757 | "resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.2.tgz", 758 | "integrity": "sha512-iYj4SJG/2bbhh+iIpFmG5u49DtJ4lipQ+aPakjL9OKpsGY93wM8w06gvFbEQxcMsZcCvk5th5KkIm2m8o14aWA==", 759 | "dependencies": { 760 | "@octokit/endpoint": "^11.0.0", 761 | "@octokit/request-error": "^7.0.0", 762 | "@octokit/types": "^14.0.0", 763 | "fast-content-type-parse": "^3.0.0", 764 | "universal-user-agent": "^7.0.2" 765 | }, 766 | "engines": { 767 | "node": ">= 20" 768 | } 769 | }, 770 | "node_modules/@octokit/request-error": { 771 | "version": "7.0.0", 772 | "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.0.0.tgz", 773 | "integrity": "sha512-KRA7VTGdVyJlh0cP5Tf94hTiYVVqmt2f3I6mnimmaVz4UG3gQV/k4mDJlJv3X67iX6rmN7gSHCF8ssqeMnmhZg==", 774 | "dependencies": { 775 | "@octokit/types": "^14.0.0" 776 | }, 777 | "engines": { 778 | "node": ">= 20" 779 | } 780 | }, 781 | "node_modules/@octokit/rest": { 782 | "version": "22.0.0", 783 | "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-22.0.0.tgz", 784 | "integrity": "sha512-z6tmTu9BTnw51jYGulxrlernpsQYXpui1RK21vmXn8yF5bp6iX16yfTtJYGK5Mh1qDkvDOmp2n8sRMcQmR8jiA==", 785 | "dependencies": { 786 | "@octokit/core": "^7.0.2", 787 | "@octokit/plugin-paginate-rest": "^13.0.1", 788 | "@octokit/plugin-request-log": "^6.0.0", 789 | "@octokit/plugin-rest-endpoint-methods": "^16.0.0" 790 | }, 791 | "engines": { 792 | "node": ">= 20" 793 | } 794 | }, 795 | "node_modules/@octokit/types": { 796 | "version": "14.1.0", 797 | "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.1.0.tgz", 798 | "integrity": "sha512-1y6DgTy8Jomcpu33N+p5w58l6xyt55Ar2I91RPiIA0xCJBXyUAhXCcmZaDWSANiha7R9a6qJJ2CRomGPZ6f46g==", 799 | "dependencies": { 800 | "@octokit/openapi-types": "^25.1.0" 801 | } 802 | }, 803 | "node_modules/@open-draft/deferred-promise": { 804 | "version": "2.2.0", 805 | "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", 806 | "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", 807 | "dev": true 808 | }, 809 | "node_modules/@open-draft/logger": { 810 | "version": "0.3.0", 811 | "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", 812 | "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", 813 | "dev": true, 814 | "dependencies": { 815 | "is-node-process": "^1.2.0", 816 | "outvariant": "^1.4.0" 817 | } 818 | }, 819 | "node_modules/@open-draft/until": { 820 | "version": "2.1.0", 821 | "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", 822 | "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", 823 | "dev": true 824 | }, 825 | "node_modules/@pkgjs/parseargs": { 826 | "version": "0.11.0", 827 | "dev": true, 828 | "license": "MIT", 829 | "optional": true, 830 | "engines": { 831 | "node": ">=14" 832 | } 833 | }, 834 | "node_modules/aggregate-error": { 835 | "version": "3.1.0", 836 | "dev": true, 837 | "license": "MIT", 838 | "dependencies": { 839 | "clean-stack": "^2.0.0", 840 | "indent-string": "^4.0.0" 841 | }, 842 | "engines": { 843 | "node": ">=8" 844 | } 845 | }, 846 | "node_modules/ansi-regex": { 847 | "version": "5.0.1", 848 | "dev": true, 849 | "license": "MIT", 850 | "engines": { 851 | "node": ">=8" 852 | } 853 | }, 854 | "node_modules/ansi-styles": { 855 | "version": "4.3.0", 856 | "dev": true, 857 | "license": "MIT", 858 | "dependencies": { 859 | "color-convert": "^2.0.1" 860 | }, 861 | "engines": { 862 | "node": ">=8" 863 | }, 864 | "funding": { 865 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 866 | } 867 | }, 868 | "node_modules/append-transform": { 869 | "version": "2.0.0", 870 | "dev": true, 871 | "license": "MIT", 872 | "dependencies": { 873 | "default-require-extensions": "^3.0.0" 874 | }, 875 | "engines": { 876 | "node": ">=8" 877 | } 878 | }, 879 | "node_modules/archy": { 880 | "version": "1.0.0", 881 | "dev": true, 882 | "license": "MIT" 883 | }, 884 | "node_modules/argparse": { 885 | "version": "2.0.1", 886 | "dev": true, 887 | "license": "Python-2.0" 888 | }, 889 | "node_modules/balanced-match": { 890 | "version": "1.0.2", 891 | "dev": true, 892 | "license": "MIT" 893 | }, 894 | "node_modules/before-after-hook": { 895 | "version": "4.0.0", 896 | "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-4.0.0.tgz", 897 | "integrity": "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==" 898 | }, 899 | "node_modules/brace-expansion": { 900 | "version": "1.1.11", 901 | "dev": true, 902 | "license": "MIT", 903 | "dependencies": { 904 | "balanced-match": "^1.0.0", 905 | "concat-map": "0.0.1" 906 | } 907 | }, 908 | "node_modules/browser-stdout": { 909 | "version": "1.3.1", 910 | "dev": true, 911 | "license": "ISC" 912 | }, 913 | "node_modules/browserslist": { 914 | "version": "4.23.3", 915 | "dev": true, 916 | "funding": [ 917 | { 918 | "type": "opencollective", 919 | "url": "https://opencollective.com/browserslist" 920 | }, 921 | { 922 | "type": "tidelift", 923 | "url": "https://tidelift.com/funding/github/npm/browserslist" 924 | }, 925 | { 926 | "type": "github", 927 | "url": "https://github.com/sponsors/ai" 928 | } 929 | ], 930 | "license": "MIT", 931 | "dependencies": { 932 | "caniuse-lite": "^1.0.30001646", 933 | "electron-to-chromium": "^1.5.4", 934 | "node-releases": "^2.0.18", 935 | "update-browserslist-db": "^1.1.0" 936 | }, 937 | "bin": { 938 | "browserslist": "cli.js" 939 | }, 940 | "engines": { 941 | "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 942 | } 943 | }, 944 | "node_modules/caching-transform": { 945 | "version": "4.0.0", 946 | "dev": true, 947 | "license": "MIT", 948 | "dependencies": { 949 | "hasha": "^5.0.0", 950 | "make-dir": "^3.0.0", 951 | "package-hash": "^4.0.0", 952 | "write-file-atomic": "^3.0.0" 953 | }, 954 | "engines": { 955 | "node": ">=8" 956 | } 957 | }, 958 | "node_modules/camelcase": { 959 | "version": "6.3.0", 960 | "dev": true, 961 | "license": "MIT", 962 | "engines": { 963 | "node": ">=10" 964 | }, 965 | "funding": { 966 | "url": "https://github.com/sponsors/sindresorhus" 967 | } 968 | }, 969 | "node_modules/caniuse-lite": { 970 | "version": "1.0.30001663", 971 | "dev": true, 972 | "funding": [ 973 | { 974 | "type": "opencollective", 975 | "url": "https://opencollective.com/browserslist" 976 | }, 977 | { 978 | "type": "tidelift", 979 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 980 | }, 981 | { 982 | "type": "github", 983 | "url": "https://github.com/sponsors/ai" 984 | } 985 | ], 986 | "license": "CC-BY-4.0" 987 | }, 988 | "node_modules/chalk": { 989 | "version": "4.1.2", 990 | "dev": true, 991 | "license": "MIT", 992 | "dependencies": { 993 | "ansi-styles": "^4.1.0", 994 | "supports-color": "^7.1.0" 995 | }, 996 | "engines": { 997 | "node": ">=10" 998 | }, 999 | "funding": { 1000 | "url": "https://github.com/chalk/chalk?sponsor=1" 1001 | } 1002 | }, 1003 | "node_modules/chalk/node_modules/supports-color": { 1004 | "version": "7.2.0", 1005 | "dev": true, 1006 | "license": "MIT", 1007 | "dependencies": { 1008 | "has-flag": "^4.0.0" 1009 | }, 1010 | "engines": { 1011 | "node": ">=8" 1012 | } 1013 | }, 1014 | "node_modules/chokidar": { 1015 | "version": "4.0.3", 1016 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", 1017 | "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", 1018 | "dev": true, 1019 | "dependencies": { 1020 | "readdirp": "^4.0.1" 1021 | }, 1022 | "engines": { 1023 | "node": ">= 14.16.0" 1024 | }, 1025 | "funding": { 1026 | "url": "https://paulmillr.com/funding/" 1027 | } 1028 | }, 1029 | "node_modules/clean-stack": { 1030 | "version": "2.2.0", 1031 | "dev": true, 1032 | "license": "MIT", 1033 | "engines": { 1034 | "node": ">=6" 1035 | } 1036 | }, 1037 | "node_modules/cliui": { 1038 | "version": "8.0.1", 1039 | "dev": true, 1040 | "license": "ISC", 1041 | "dependencies": { 1042 | "string-width": "^4.2.0", 1043 | "strip-ansi": "^6.0.1", 1044 | "wrap-ansi": "^7.0.0" 1045 | }, 1046 | "engines": { 1047 | "node": ">=12" 1048 | } 1049 | }, 1050 | "node_modules/cliui/node_modules/wrap-ansi": { 1051 | "version": "7.0.0", 1052 | "dev": true, 1053 | "license": "MIT", 1054 | "dependencies": { 1055 | "ansi-styles": "^4.0.0", 1056 | "string-width": "^4.1.0", 1057 | "strip-ansi": "^6.0.0" 1058 | }, 1059 | "engines": { 1060 | "node": ">=10" 1061 | }, 1062 | "funding": { 1063 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1064 | } 1065 | }, 1066 | "node_modules/color-convert": { 1067 | "version": "2.0.1", 1068 | "dev": true, 1069 | "license": "MIT", 1070 | "dependencies": { 1071 | "color-name": "~1.1.4" 1072 | }, 1073 | "engines": { 1074 | "node": ">=7.0.0" 1075 | } 1076 | }, 1077 | "node_modules/color-name": { 1078 | "version": "1.1.4", 1079 | "dev": true, 1080 | "license": "MIT" 1081 | }, 1082 | "node_modules/commondir": { 1083 | "version": "1.0.1", 1084 | "dev": true, 1085 | "license": "MIT" 1086 | }, 1087 | "node_modules/concat-map": { 1088 | "version": "0.0.1", 1089 | "dev": true, 1090 | "license": "MIT" 1091 | }, 1092 | "node_modules/convert-source-map": { 1093 | "version": "1.9.0", 1094 | "dev": true, 1095 | "license": "MIT" 1096 | }, 1097 | "node_modules/cross-spawn": { 1098 | "version": "7.0.3", 1099 | "dev": true, 1100 | "license": "MIT", 1101 | "dependencies": { 1102 | "path-key": "^3.1.0", 1103 | "shebang-command": "^2.0.0", 1104 | "which": "^2.0.1" 1105 | }, 1106 | "engines": { 1107 | "node": ">= 8" 1108 | } 1109 | }, 1110 | "node_modules/debug": { 1111 | "version": "4.3.4", 1112 | "dev": true, 1113 | "license": "MIT", 1114 | "dependencies": { 1115 | "ms": "2.1.2" 1116 | }, 1117 | "engines": { 1118 | "node": ">=6.0" 1119 | }, 1120 | "peerDependenciesMeta": { 1121 | "supports-color": { 1122 | "optional": true 1123 | } 1124 | } 1125 | }, 1126 | "node_modules/debug/node_modules/ms": { 1127 | "version": "2.1.2", 1128 | "dev": true, 1129 | "license": "MIT" 1130 | }, 1131 | "node_modules/decamelize": { 1132 | "version": "4.0.0", 1133 | "dev": true, 1134 | "license": "MIT", 1135 | "engines": { 1136 | "node": ">=10" 1137 | }, 1138 | "funding": { 1139 | "url": "https://github.com/sponsors/sindresorhus" 1140 | } 1141 | }, 1142 | "node_modules/default-require-extensions": { 1143 | "version": "3.0.1", 1144 | "dev": true, 1145 | "license": "MIT", 1146 | "dependencies": { 1147 | "strip-bom": "^4.0.0" 1148 | }, 1149 | "engines": { 1150 | "node": ">=8" 1151 | }, 1152 | "funding": { 1153 | "url": "https://github.com/sponsors/sindresorhus" 1154 | } 1155 | }, 1156 | "node_modules/dequal": { 1157 | "version": "2.0.2", 1158 | "dev": true, 1159 | "license": "MIT", 1160 | "engines": { 1161 | "node": ">=6" 1162 | } 1163 | }, 1164 | "node_modules/diff": { 1165 | "version": "5.0.0", 1166 | "dev": true, 1167 | "license": "BSD-3-Clause", 1168 | "engines": { 1169 | "node": ">=0.3.1" 1170 | } 1171 | }, 1172 | "node_modules/eastasianwidth": { 1173 | "version": "0.2.0", 1174 | "dev": true, 1175 | "license": "MIT" 1176 | }, 1177 | "node_modules/electron-to-chromium": { 1178 | "version": "1.5.27", 1179 | "dev": true, 1180 | "license": "ISC" 1181 | }, 1182 | "node_modules/emoji-regex": { 1183 | "version": "8.0.0", 1184 | "dev": true, 1185 | "license": "MIT" 1186 | }, 1187 | "node_modules/es6-error": { 1188 | "version": "4.1.1", 1189 | "dev": true, 1190 | "license": "MIT" 1191 | }, 1192 | "node_modules/escalade": { 1193 | "version": "3.1.2", 1194 | "dev": true, 1195 | "license": "MIT", 1196 | "engines": { 1197 | "node": ">=6" 1198 | } 1199 | }, 1200 | "node_modules/escape-string-regexp": { 1201 | "version": "4.0.0", 1202 | "dev": true, 1203 | "license": "MIT", 1204 | "engines": { 1205 | "node": ">=10" 1206 | }, 1207 | "funding": { 1208 | "url": "https://github.com/sponsors/sindresorhus" 1209 | } 1210 | }, 1211 | "node_modules/esprima": { 1212 | "version": "4.0.1", 1213 | "dev": true, 1214 | "license": "BSD-2-Clause", 1215 | "bin": { 1216 | "esparse": "bin/esparse.js", 1217 | "esvalidate": "bin/esvalidate.js" 1218 | }, 1219 | "engines": { 1220 | "node": ">=4" 1221 | } 1222 | }, 1223 | "node_modules/fast-content-type-parse": { 1224 | "version": "3.0.0", 1225 | "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-3.0.0.tgz", 1226 | "integrity": "sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==", 1227 | "funding": [ 1228 | { 1229 | "type": "github", 1230 | "url": "https://github.com/sponsors/fastify" 1231 | }, 1232 | { 1233 | "type": "opencollective", 1234 | "url": "https://opencollective.com/fastify" 1235 | } 1236 | ] 1237 | }, 1238 | "node_modules/find-cache-dir": { 1239 | "version": "3.3.2", 1240 | "dev": true, 1241 | "license": "MIT", 1242 | "dependencies": { 1243 | "commondir": "^1.0.1", 1244 | "make-dir": "^3.0.2", 1245 | "pkg-dir": "^4.1.0" 1246 | }, 1247 | "engines": { 1248 | "node": ">=8" 1249 | }, 1250 | "funding": { 1251 | "url": "https://github.com/avajs/find-cache-dir?sponsor=1" 1252 | } 1253 | }, 1254 | "node_modules/find-up": { 1255 | "version": "5.0.0", 1256 | "dev": true, 1257 | "license": "MIT", 1258 | "dependencies": { 1259 | "locate-path": "^6.0.0", 1260 | "path-exists": "^4.0.0" 1261 | }, 1262 | "engines": { 1263 | "node": ">=10" 1264 | }, 1265 | "funding": { 1266 | "url": "https://github.com/sponsors/sindresorhus" 1267 | } 1268 | }, 1269 | "node_modules/flat": { 1270 | "version": "5.0.2", 1271 | "dev": true, 1272 | "license": "BSD-3-Clause", 1273 | "bin": { 1274 | "flat": "cli.js" 1275 | } 1276 | }, 1277 | "node_modules/foreground-child": { 1278 | "version": "3.3.0", 1279 | "dev": true, 1280 | "license": "ISC", 1281 | "dependencies": { 1282 | "cross-spawn": "^7.0.0", 1283 | "signal-exit": "^4.0.1" 1284 | }, 1285 | "engines": { 1286 | "node": ">=14" 1287 | }, 1288 | "funding": { 1289 | "url": "https://github.com/sponsors/isaacs" 1290 | } 1291 | }, 1292 | "node_modules/foreground-child/node_modules/signal-exit": { 1293 | "version": "4.1.0", 1294 | "dev": true, 1295 | "license": "ISC", 1296 | "engines": { 1297 | "node": ">=14" 1298 | }, 1299 | "funding": { 1300 | "url": "https://github.com/sponsors/isaacs" 1301 | } 1302 | }, 1303 | "node_modules/fromentries": { 1304 | "version": "1.3.2", 1305 | "dev": true, 1306 | "funding": [ 1307 | { 1308 | "type": "github", 1309 | "url": "https://github.com/sponsors/feross" 1310 | }, 1311 | { 1312 | "type": "patreon", 1313 | "url": "https://www.patreon.com/feross" 1314 | }, 1315 | { 1316 | "type": "consulting", 1317 | "url": "https://feross.org/support" 1318 | } 1319 | ], 1320 | "license": "MIT" 1321 | }, 1322 | "node_modules/fs.realpath": { 1323 | "version": "1.0.0", 1324 | "dev": true, 1325 | "license": "ISC" 1326 | }, 1327 | "node_modules/gensync": { 1328 | "version": "1.0.0-beta.2", 1329 | "dev": true, 1330 | "license": "MIT", 1331 | "engines": { 1332 | "node": ">=6.9.0" 1333 | } 1334 | }, 1335 | "node_modules/get-caller-file": { 1336 | "version": "2.0.5", 1337 | "dev": true, 1338 | "license": "ISC", 1339 | "engines": { 1340 | "node": "6.* || 8.* || >= 10.*" 1341 | } 1342 | }, 1343 | "node_modules/get-package-type": { 1344 | "version": "0.1.0", 1345 | "dev": true, 1346 | "license": "MIT", 1347 | "engines": { 1348 | "node": ">=8.0.0" 1349 | } 1350 | }, 1351 | "node_modules/glob": { 1352 | "version": "7.2.3", 1353 | "dev": true, 1354 | "license": "ISC", 1355 | "dependencies": { 1356 | "fs.realpath": "^1.0.0", 1357 | "inflight": "^1.0.4", 1358 | "inherits": "2", 1359 | "minimatch": "^3.1.1", 1360 | "once": "^1.3.0", 1361 | "path-is-absolute": "^1.0.0" 1362 | }, 1363 | "engines": { 1364 | "node": "*" 1365 | }, 1366 | "funding": { 1367 | "url": "https://github.com/sponsors/isaacs" 1368 | } 1369 | }, 1370 | "node_modules/glob/node_modules/minimatch": { 1371 | "version": "3.1.2", 1372 | "dev": true, 1373 | "license": "ISC", 1374 | "dependencies": { 1375 | "brace-expansion": "^1.1.7" 1376 | }, 1377 | "engines": { 1378 | "node": "*" 1379 | } 1380 | }, 1381 | "node_modules/globals": { 1382 | "version": "11.12.0", 1383 | "dev": true, 1384 | "license": "MIT", 1385 | "engines": { 1386 | "node": ">=4" 1387 | } 1388 | }, 1389 | "node_modules/graceful-fs": { 1390 | "version": "4.2.11", 1391 | "dev": true, 1392 | "license": "ISC" 1393 | }, 1394 | "node_modules/has-flag": { 1395 | "version": "4.0.0", 1396 | "dev": true, 1397 | "license": "MIT", 1398 | "engines": { 1399 | "node": ">=8" 1400 | } 1401 | }, 1402 | "node_modules/hasha": { 1403 | "version": "5.2.2", 1404 | "dev": true, 1405 | "license": "MIT", 1406 | "dependencies": { 1407 | "is-stream": "^2.0.0", 1408 | "type-fest": "^0.8.0" 1409 | }, 1410 | "engines": { 1411 | "node": ">=8" 1412 | }, 1413 | "funding": { 1414 | "url": "https://github.com/sponsors/sindresorhus" 1415 | } 1416 | }, 1417 | "node_modules/he": { 1418 | "version": "1.2.0", 1419 | "dev": true, 1420 | "license": "MIT", 1421 | "bin": { 1422 | "he": "bin/he" 1423 | } 1424 | }, 1425 | "node_modules/html-escaper": { 1426 | "version": "2.0.2", 1427 | "dev": true, 1428 | "license": "MIT" 1429 | }, 1430 | "node_modules/imurmurhash": { 1431 | "version": "0.1.4", 1432 | "dev": true, 1433 | "license": "MIT", 1434 | "engines": { 1435 | "node": ">=0.8.19" 1436 | } 1437 | }, 1438 | "node_modules/indent-string": { 1439 | "version": "4.0.0", 1440 | "dev": true, 1441 | "license": "MIT", 1442 | "engines": { 1443 | "node": ">=8" 1444 | } 1445 | }, 1446 | "node_modules/inflight": { 1447 | "version": "1.0.6", 1448 | "dev": true, 1449 | "license": "ISC", 1450 | "dependencies": { 1451 | "once": "^1.3.0", 1452 | "wrappy": "1" 1453 | } 1454 | }, 1455 | "node_modules/inherits": { 1456 | "version": "2.0.4", 1457 | "dev": true, 1458 | "license": "ISC" 1459 | }, 1460 | "node_modules/is-fullwidth-code-point": { 1461 | "version": "3.0.0", 1462 | "dev": true, 1463 | "license": "MIT", 1464 | "engines": { 1465 | "node": ">=8" 1466 | } 1467 | }, 1468 | "node_modules/is-node-process": { 1469 | "version": "1.2.0", 1470 | "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", 1471 | "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", 1472 | "dev": true 1473 | }, 1474 | "node_modules/is-plain-obj": { 1475 | "version": "2.1.0", 1476 | "dev": true, 1477 | "license": "MIT", 1478 | "engines": { 1479 | "node": ">=8" 1480 | } 1481 | }, 1482 | "node_modules/is-stream": { 1483 | "version": "2.0.1", 1484 | "dev": true, 1485 | "license": "MIT", 1486 | "engines": { 1487 | "node": ">=8" 1488 | }, 1489 | "funding": { 1490 | "url": "https://github.com/sponsors/sindresorhus" 1491 | } 1492 | }, 1493 | "node_modules/is-typedarray": { 1494 | "version": "1.0.0", 1495 | "dev": true, 1496 | "license": "MIT" 1497 | }, 1498 | "node_modules/is-unicode-supported": { 1499 | "version": "0.1.0", 1500 | "dev": true, 1501 | "license": "MIT", 1502 | "engines": { 1503 | "node": ">=10" 1504 | }, 1505 | "funding": { 1506 | "url": "https://github.com/sponsors/sindresorhus" 1507 | } 1508 | }, 1509 | "node_modules/is-windows": { 1510 | "version": "1.0.2", 1511 | "dev": true, 1512 | "license": "MIT", 1513 | "engines": { 1514 | "node": ">=0.10.0" 1515 | } 1516 | }, 1517 | "node_modules/isexe": { 1518 | "version": "2.0.0", 1519 | "dev": true, 1520 | "license": "ISC" 1521 | }, 1522 | "node_modules/istanbul-lib-coverage": { 1523 | "version": "3.2.2", 1524 | "dev": true, 1525 | "license": "BSD-3-Clause", 1526 | "engines": { 1527 | "node": ">=8" 1528 | } 1529 | }, 1530 | "node_modules/istanbul-lib-hook": { 1531 | "version": "3.0.0", 1532 | "dev": true, 1533 | "license": "BSD-3-Clause", 1534 | "dependencies": { 1535 | "append-transform": "^2.0.0" 1536 | }, 1537 | "engines": { 1538 | "node": ">=8" 1539 | } 1540 | }, 1541 | "node_modules/istanbul-lib-instrument": { 1542 | "version": "6.0.3", 1543 | "dev": true, 1544 | "license": "BSD-3-Clause", 1545 | "dependencies": { 1546 | "@babel/core": "^7.23.9", 1547 | "@babel/parser": "^7.23.9", 1548 | "@istanbuljs/schema": "^0.1.3", 1549 | "istanbul-lib-coverage": "^3.2.0", 1550 | "semver": "^7.5.4" 1551 | }, 1552 | "engines": { 1553 | "node": ">=10" 1554 | } 1555 | }, 1556 | "node_modules/istanbul-lib-instrument/node_modules/semver": { 1557 | "version": "7.6.3", 1558 | "dev": true, 1559 | "license": "ISC", 1560 | "bin": { 1561 | "semver": "bin/semver.js" 1562 | }, 1563 | "engines": { 1564 | "node": ">=10" 1565 | } 1566 | }, 1567 | "node_modules/istanbul-lib-processinfo": { 1568 | "version": "2.0.3", 1569 | "dev": true, 1570 | "license": "ISC", 1571 | "dependencies": { 1572 | "archy": "^1.0.0", 1573 | "cross-spawn": "^7.0.3", 1574 | "istanbul-lib-coverage": "^3.2.0", 1575 | "p-map": "^3.0.0", 1576 | "rimraf": "^3.0.0", 1577 | "uuid": "^8.3.2" 1578 | }, 1579 | "engines": { 1580 | "node": ">=8" 1581 | } 1582 | }, 1583 | "node_modules/istanbul-lib-report": { 1584 | "version": "3.0.1", 1585 | "dev": true, 1586 | "license": "BSD-3-Clause", 1587 | "dependencies": { 1588 | "istanbul-lib-coverage": "^3.0.0", 1589 | "make-dir": "^4.0.0", 1590 | "supports-color": "^7.1.0" 1591 | }, 1592 | "engines": { 1593 | "node": ">=10" 1594 | } 1595 | }, 1596 | "node_modules/istanbul-lib-report/node_modules/make-dir": { 1597 | "version": "4.0.0", 1598 | "dev": true, 1599 | "license": "MIT", 1600 | "dependencies": { 1601 | "semver": "^7.5.3" 1602 | }, 1603 | "engines": { 1604 | "node": ">=10" 1605 | }, 1606 | "funding": { 1607 | "url": "https://github.com/sponsors/sindresorhus" 1608 | } 1609 | }, 1610 | "node_modules/istanbul-lib-report/node_modules/semver": { 1611 | "version": "7.6.3", 1612 | "dev": true, 1613 | "license": "ISC", 1614 | "bin": { 1615 | "semver": "bin/semver.js" 1616 | }, 1617 | "engines": { 1618 | "node": ">=10" 1619 | } 1620 | }, 1621 | "node_modules/istanbul-lib-report/node_modules/supports-color": { 1622 | "version": "7.2.0", 1623 | "dev": true, 1624 | "license": "MIT", 1625 | "dependencies": { 1626 | "has-flag": "^4.0.0" 1627 | }, 1628 | "engines": { 1629 | "node": ">=8" 1630 | } 1631 | }, 1632 | "node_modules/istanbul-lib-source-maps": { 1633 | "version": "4.0.1", 1634 | "dev": true, 1635 | "license": "BSD-3-Clause", 1636 | "dependencies": { 1637 | "debug": "^4.1.1", 1638 | "istanbul-lib-coverage": "^3.0.0", 1639 | "source-map": "^0.6.1" 1640 | }, 1641 | "engines": { 1642 | "node": ">=10" 1643 | } 1644 | }, 1645 | "node_modules/istanbul-reports": { 1646 | "version": "3.1.7", 1647 | "dev": true, 1648 | "license": "BSD-3-Clause", 1649 | "dependencies": { 1650 | "html-escaper": "^2.0.0", 1651 | "istanbul-lib-report": "^3.0.0" 1652 | }, 1653 | "engines": { 1654 | "node": ">=8" 1655 | } 1656 | }, 1657 | "node_modules/jackspeak": { 1658 | "version": "3.4.3", 1659 | "dev": true, 1660 | "license": "BlueOak-1.0.0", 1661 | "dependencies": { 1662 | "@isaacs/cliui": "^8.0.2" 1663 | }, 1664 | "funding": { 1665 | "url": "https://github.com/sponsors/isaacs" 1666 | }, 1667 | "optionalDependencies": { 1668 | "@pkgjs/parseargs": "^0.11.0" 1669 | } 1670 | }, 1671 | "node_modules/js-tokens": { 1672 | "version": "4.0.0", 1673 | "dev": true, 1674 | "license": "MIT" 1675 | }, 1676 | "node_modules/js-yaml": { 1677 | "version": "4.1.0", 1678 | "dev": true, 1679 | "license": "MIT", 1680 | "dependencies": { 1681 | "argparse": "^2.0.1" 1682 | }, 1683 | "bin": { 1684 | "js-yaml": "bin/js-yaml.js" 1685 | } 1686 | }, 1687 | "node_modules/jsesc": { 1688 | "version": "2.5.2", 1689 | "dev": true, 1690 | "license": "MIT", 1691 | "bin": { 1692 | "jsesc": "bin/jsesc" 1693 | }, 1694 | "engines": { 1695 | "node": ">=4" 1696 | } 1697 | }, 1698 | "node_modules/json-stringify-safe": { 1699 | "version": "5.0.1", 1700 | "dev": true, 1701 | "license": "ISC" 1702 | }, 1703 | "node_modules/json5": { 1704 | "version": "2.2.3", 1705 | "dev": true, 1706 | "license": "MIT", 1707 | "bin": { 1708 | "json5": "lib/cli.js" 1709 | }, 1710 | "engines": { 1711 | "node": ">=6" 1712 | } 1713 | }, 1714 | "node_modules/kleur": { 1715 | "version": "4.1.4", 1716 | "dev": true, 1717 | "license": "MIT", 1718 | "engines": { 1719 | "node": ">=6" 1720 | } 1721 | }, 1722 | "node_modules/locate-path": { 1723 | "version": "6.0.0", 1724 | "dev": true, 1725 | "license": "MIT", 1726 | "dependencies": { 1727 | "p-locate": "^5.0.0" 1728 | }, 1729 | "engines": { 1730 | "node": ">=10" 1731 | }, 1732 | "funding": { 1733 | "url": "https://github.com/sponsors/sindresorhus" 1734 | } 1735 | }, 1736 | "node_modules/lodash.flattendeep": { 1737 | "version": "4.4.0", 1738 | "dev": true, 1739 | "license": "MIT" 1740 | }, 1741 | "node_modules/log-symbols": { 1742 | "version": "4.1.0", 1743 | "dev": true, 1744 | "license": "MIT", 1745 | "dependencies": { 1746 | "chalk": "^4.1.0", 1747 | "is-unicode-supported": "^0.1.0" 1748 | }, 1749 | "engines": { 1750 | "node": ">=10" 1751 | }, 1752 | "funding": { 1753 | "url": "https://github.com/sponsors/sindresorhus" 1754 | } 1755 | }, 1756 | "node_modules/lru-cache": { 1757 | "version": "5.1.1", 1758 | "dev": true, 1759 | "license": "ISC", 1760 | "dependencies": { 1761 | "yallist": "^3.0.2" 1762 | } 1763 | }, 1764 | "node_modules/make-dir": { 1765 | "version": "3.1.0", 1766 | "dev": true, 1767 | "license": "MIT", 1768 | "dependencies": { 1769 | "semver": "^6.0.0" 1770 | }, 1771 | "engines": { 1772 | "node": ">=8" 1773 | }, 1774 | "funding": { 1775 | "url": "https://github.com/sponsors/sindresorhus" 1776 | } 1777 | }, 1778 | "node_modules/minimatch": { 1779 | "version": "9.0.5", 1780 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", 1781 | "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 1782 | "dev": true, 1783 | "dependencies": { 1784 | "brace-expansion": "^2.0.1" 1785 | }, 1786 | "engines": { 1787 | "node": ">=16 || 14 >=14.17" 1788 | }, 1789 | "funding": { 1790 | "url": "https://github.com/sponsors/isaacs" 1791 | } 1792 | }, 1793 | "node_modules/minimatch/node_modules/brace-expansion": { 1794 | "version": "2.0.1", 1795 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 1796 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 1797 | "dev": true, 1798 | "dependencies": { 1799 | "balanced-match": "^1.0.0" 1800 | } 1801 | }, 1802 | "node_modules/minipass": { 1803 | "version": "7.1.2", 1804 | "dev": true, 1805 | "license": "ISC", 1806 | "engines": { 1807 | "node": ">=16 || 14 >=14.17" 1808 | } 1809 | }, 1810 | "node_modules/mocha": { 1811 | "version": "11.6.0", 1812 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-11.6.0.tgz", 1813 | "integrity": "sha512-i0JVb+OUBqw63X/1pC3jCyJsqYisgxySBbsQa8TKvefpA1oEnw7JXxXnftfMHRsw7bEEVGRtVlHcDYXBa7FzVw==", 1814 | "dev": true, 1815 | "dependencies": { 1816 | "browser-stdout": "^1.3.1", 1817 | "chokidar": "^4.0.1", 1818 | "debug": "^4.3.5", 1819 | "diff": "^7.0.0", 1820 | "escape-string-regexp": "^4.0.0", 1821 | "find-up": "^5.0.0", 1822 | "glob": "^10.4.5", 1823 | "he": "^1.2.0", 1824 | "js-yaml": "^4.1.0", 1825 | "log-symbols": "^4.1.0", 1826 | "minimatch": "^9.0.5", 1827 | "ms": "^2.1.3", 1828 | "picocolors": "^1.1.1", 1829 | "serialize-javascript": "^6.0.2", 1830 | "strip-json-comments": "^3.1.1", 1831 | "supports-color": "^8.1.1", 1832 | "workerpool": "^9.2.0", 1833 | "yargs": "^17.7.2", 1834 | "yargs-parser": "^21.1.1", 1835 | "yargs-unparser": "^2.0.0" 1836 | }, 1837 | "bin": { 1838 | "_mocha": "bin/_mocha", 1839 | "mocha": "bin/mocha.js" 1840 | }, 1841 | "engines": { 1842 | "node": "^18.18.0 || ^20.9.0 || >=21.1.0" 1843 | } 1844 | }, 1845 | "node_modules/mocha/node_modules/debug": { 1846 | "version": "4.3.7", 1847 | "dev": true, 1848 | "license": "MIT", 1849 | "dependencies": { 1850 | "ms": "^2.1.3" 1851 | }, 1852 | "engines": { 1853 | "node": ">=6.0" 1854 | }, 1855 | "peerDependenciesMeta": { 1856 | "supports-color": { 1857 | "optional": true 1858 | } 1859 | } 1860 | }, 1861 | "node_modules/mocha/node_modules/diff": { 1862 | "version": "7.0.0", 1863 | "resolved": "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz", 1864 | "integrity": "sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==", 1865 | "dev": true, 1866 | "engines": { 1867 | "node": ">=0.3.1" 1868 | } 1869 | }, 1870 | "node_modules/mocha/node_modules/glob": { 1871 | "version": "10.4.5", 1872 | "dev": true, 1873 | "license": "ISC", 1874 | "dependencies": { 1875 | "foreground-child": "^3.1.0", 1876 | "jackspeak": "^3.1.2", 1877 | "minimatch": "^9.0.4", 1878 | "minipass": "^7.1.2", 1879 | "package-json-from-dist": "^1.0.0", 1880 | "path-scurry": "^1.11.1" 1881 | }, 1882 | "bin": { 1883 | "glob": "dist/esm/bin.mjs" 1884 | }, 1885 | "funding": { 1886 | "url": "https://github.com/sponsors/isaacs" 1887 | } 1888 | }, 1889 | "node_modules/mri": { 1890 | "version": "1.2.0", 1891 | "dev": true, 1892 | "license": "MIT", 1893 | "engines": { 1894 | "node": ">=4" 1895 | } 1896 | }, 1897 | "node_modules/ms": { 1898 | "version": "2.1.3", 1899 | "dev": true, 1900 | "license": "MIT" 1901 | }, 1902 | "node_modules/nock": { 1903 | "version": "14.0.5", 1904 | "resolved": "https://registry.npmjs.org/nock/-/nock-14.0.5.tgz", 1905 | "integrity": "sha512-R49fALR9caB6vxuSWUIaK2eBYeTloZQUFBZ4rHO+TbhMGQHtwnhdqKLYki+o+8qMgLvoBYWrp/2KzGPhxL4S6w==", 1906 | "dev": true, 1907 | "dependencies": { 1908 | "@mswjs/interceptors": "^0.38.7", 1909 | "json-stringify-safe": "^5.0.1", 1910 | "propagate": "^2.0.0" 1911 | }, 1912 | "engines": { 1913 | "node": ">=18.20.0 <20 || >=20.12.1" 1914 | } 1915 | }, 1916 | "node_modules/node-preload": { 1917 | "version": "0.2.1", 1918 | "dev": true, 1919 | "license": "MIT", 1920 | "dependencies": { 1921 | "process-on-spawn": "^1.0.0" 1922 | }, 1923 | "engines": { 1924 | "node": ">=8" 1925 | } 1926 | }, 1927 | "node_modules/node-releases": { 1928 | "version": "2.0.18", 1929 | "dev": true, 1930 | "license": "MIT" 1931 | }, 1932 | "node_modules/nyc": { 1933 | "version": "17.1.0", 1934 | "dev": true, 1935 | "license": "ISC", 1936 | "dependencies": { 1937 | "@istanbuljs/load-nyc-config": "^1.0.0", 1938 | "@istanbuljs/schema": "^0.1.2", 1939 | "caching-transform": "^4.0.0", 1940 | "convert-source-map": "^1.7.0", 1941 | "decamelize": "^1.2.0", 1942 | "find-cache-dir": "^3.2.0", 1943 | "find-up": "^4.1.0", 1944 | "foreground-child": "^3.3.0", 1945 | "get-package-type": "^0.1.0", 1946 | "glob": "^7.1.6", 1947 | "istanbul-lib-coverage": "^3.0.0", 1948 | "istanbul-lib-hook": "^3.0.0", 1949 | "istanbul-lib-instrument": "^6.0.2", 1950 | "istanbul-lib-processinfo": "^2.0.2", 1951 | "istanbul-lib-report": "^3.0.0", 1952 | "istanbul-lib-source-maps": "^4.0.0", 1953 | "istanbul-reports": "^3.0.2", 1954 | "make-dir": "^3.0.0", 1955 | "node-preload": "^0.2.1", 1956 | "p-map": "^3.0.0", 1957 | "process-on-spawn": "^1.0.0", 1958 | "resolve-from": "^5.0.0", 1959 | "rimraf": "^3.0.0", 1960 | "signal-exit": "^3.0.2", 1961 | "spawn-wrap": "^2.0.0", 1962 | "test-exclude": "^6.0.0", 1963 | "yargs": "^15.0.2" 1964 | }, 1965 | "bin": { 1966 | "nyc": "bin/nyc.js" 1967 | }, 1968 | "engines": { 1969 | "node": ">=18" 1970 | } 1971 | }, 1972 | "node_modules/nyc/node_modules/camelcase": { 1973 | "version": "5.3.1", 1974 | "dev": true, 1975 | "license": "MIT", 1976 | "engines": { 1977 | "node": ">=6" 1978 | } 1979 | }, 1980 | "node_modules/nyc/node_modules/cliui": { 1981 | "version": "6.0.0", 1982 | "dev": true, 1983 | "license": "ISC", 1984 | "dependencies": { 1985 | "string-width": "^4.2.0", 1986 | "strip-ansi": "^6.0.0", 1987 | "wrap-ansi": "^6.2.0" 1988 | } 1989 | }, 1990 | "node_modules/nyc/node_modules/decamelize": { 1991 | "version": "1.2.0", 1992 | "dev": true, 1993 | "license": "MIT", 1994 | "engines": { 1995 | "node": ">=0.10.0" 1996 | } 1997 | }, 1998 | "node_modules/nyc/node_modules/find-up": { 1999 | "version": "4.1.0", 2000 | "dev": true, 2001 | "license": "MIT", 2002 | "dependencies": { 2003 | "locate-path": "^5.0.0", 2004 | "path-exists": "^4.0.0" 2005 | }, 2006 | "engines": { 2007 | "node": ">=8" 2008 | } 2009 | }, 2010 | "node_modules/nyc/node_modules/locate-path": { 2011 | "version": "5.0.0", 2012 | "dev": true, 2013 | "license": "MIT", 2014 | "dependencies": { 2015 | "p-locate": "^4.1.0" 2016 | }, 2017 | "engines": { 2018 | "node": ">=8" 2019 | } 2020 | }, 2021 | "node_modules/nyc/node_modules/p-limit": { 2022 | "version": "2.3.0", 2023 | "dev": true, 2024 | "license": "MIT", 2025 | "dependencies": { 2026 | "p-try": "^2.0.0" 2027 | }, 2028 | "engines": { 2029 | "node": ">=6" 2030 | }, 2031 | "funding": { 2032 | "url": "https://github.com/sponsors/sindresorhus" 2033 | } 2034 | }, 2035 | "node_modules/nyc/node_modules/p-locate": { 2036 | "version": "4.1.0", 2037 | "dev": true, 2038 | "license": "MIT", 2039 | "dependencies": { 2040 | "p-limit": "^2.2.0" 2041 | }, 2042 | "engines": { 2043 | "node": ">=8" 2044 | } 2045 | }, 2046 | "node_modules/nyc/node_modules/wrap-ansi": { 2047 | "version": "6.2.0", 2048 | "dev": true, 2049 | "license": "MIT", 2050 | "dependencies": { 2051 | "ansi-styles": "^4.0.0", 2052 | "string-width": "^4.1.0", 2053 | "strip-ansi": "^6.0.0" 2054 | }, 2055 | "engines": { 2056 | "node": ">=8" 2057 | } 2058 | }, 2059 | "node_modules/nyc/node_modules/y18n": { 2060 | "version": "4.0.3", 2061 | "dev": true, 2062 | "license": "ISC" 2063 | }, 2064 | "node_modules/nyc/node_modules/yargs": { 2065 | "version": "15.4.1", 2066 | "dev": true, 2067 | "license": "MIT", 2068 | "dependencies": { 2069 | "cliui": "^6.0.0", 2070 | "decamelize": "^1.2.0", 2071 | "find-up": "^4.1.0", 2072 | "get-caller-file": "^2.0.1", 2073 | "require-directory": "^2.1.1", 2074 | "require-main-filename": "^2.0.0", 2075 | "set-blocking": "^2.0.0", 2076 | "string-width": "^4.2.0", 2077 | "which-module": "^2.0.0", 2078 | "y18n": "^4.0.0", 2079 | "yargs-parser": "^18.1.2" 2080 | }, 2081 | "engines": { 2082 | "node": ">=8" 2083 | } 2084 | }, 2085 | "node_modules/nyc/node_modules/yargs-parser": { 2086 | "version": "18.1.3", 2087 | "dev": true, 2088 | "license": "ISC", 2089 | "dependencies": { 2090 | "camelcase": "^5.0.0", 2091 | "decamelize": "^1.2.0" 2092 | }, 2093 | "engines": { 2094 | "node": ">=6" 2095 | } 2096 | }, 2097 | "node_modules/once": { 2098 | "version": "1.4.0", 2099 | "dev": true, 2100 | "license": "ISC", 2101 | "dependencies": { 2102 | "wrappy": "1" 2103 | } 2104 | }, 2105 | "node_modules/outvariant": { 2106 | "version": "1.4.3", 2107 | "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", 2108 | "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", 2109 | "dev": true 2110 | }, 2111 | "node_modules/p-limit": { 2112 | "version": "3.1.0", 2113 | "dev": true, 2114 | "license": "MIT", 2115 | "dependencies": { 2116 | "yocto-queue": "^0.1.0" 2117 | }, 2118 | "engines": { 2119 | "node": ">=10" 2120 | }, 2121 | "funding": { 2122 | "url": "https://github.com/sponsors/sindresorhus" 2123 | } 2124 | }, 2125 | "node_modules/p-locate": { 2126 | "version": "5.0.0", 2127 | "dev": true, 2128 | "license": "MIT", 2129 | "dependencies": { 2130 | "p-limit": "^3.0.2" 2131 | }, 2132 | "engines": { 2133 | "node": ">=10" 2134 | }, 2135 | "funding": { 2136 | "url": "https://github.com/sponsors/sindresorhus" 2137 | } 2138 | }, 2139 | "node_modules/p-map": { 2140 | "version": "3.0.0", 2141 | "dev": true, 2142 | "license": "MIT", 2143 | "dependencies": { 2144 | "aggregate-error": "^3.0.0" 2145 | }, 2146 | "engines": { 2147 | "node": ">=8" 2148 | } 2149 | }, 2150 | "node_modules/p-try": { 2151 | "version": "2.2.0", 2152 | "dev": true, 2153 | "license": "MIT", 2154 | "engines": { 2155 | "node": ">=6" 2156 | } 2157 | }, 2158 | "node_modules/package-hash": { 2159 | "version": "4.0.0", 2160 | "dev": true, 2161 | "license": "ISC", 2162 | "dependencies": { 2163 | "graceful-fs": "^4.1.15", 2164 | "hasha": "^5.0.0", 2165 | "lodash.flattendeep": "^4.4.0", 2166 | "release-zalgo": "^1.0.0" 2167 | }, 2168 | "engines": { 2169 | "node": ">=8" 2170 | } 2171 | }, 2172 | "node_modules/package-json-from-dist": { 2173 | "version": "1.0.1", 2174 | "dev": true, 2175 | "license": "BlueOak-1.0.0" 2176 | }, 2177 | "node_modules/path-exists": { 2178 | "version": "4.0.0", 2179 | "dev": true, 2180 | "license": "MIT", 2181 | "engines": { 2182 | "node": ">=8" 2183 | } 2184 | }, 2185 | "node_modules/path-is-absolute": { 2186 | "version": "1.0.1", 2187 | "dev": true, 2188 | "license": "MIT", 2189 | "engines": { 2190 | "node": ">=0.10.0" 2191 | } 2192 | }, 2193 | "node_modules/path-key": { 2194 | "version": "3.1.1", 2195 | "dev": true, 2196 | "license": "MIT", 2197 | "engines": { 2198 | "node": ">=8" 2199 | } 2200 | }, 2201 | "node_modules/path-scurry": { 2202 | "version": "1.11.1", 2203 | "dev": true, 2204 | "license": "BlueOak-1.0.0", 2205 | "dependencies": { 2206 | "lru-cache": "^10.2.0", 2207 | "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" 2208 | }, 2209 | "engines": { 2210 | "node": ">=16 || 14 >=14.18" 2211 | }, 2212 | "funding": { 2213 | "url": "https://github.com/sponsors/isaacs" 2214 | } 2215 | }, 2216 | "node_modules/path-scurry/node_modules/lru-cache": { 2217 | "version": "10.4.3", 2218 | "dev": true, 2219 | "license": "ISC" 2220 | }, 2221 | "node_modules/picocolors": { 2222 | "version": "1.1.1", 2223 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 2224 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 2225 | "dev": true 2226 | }, 2227 | "node_modules/pkg-dir": { 2228 | "version": "4.2.0", 2229 | "dev": true, 2230 | "license": "MIT", 2231 | "dependencies": { 2232 | "find-up": "^4.0.0" 2233 | }, 2234 | "engines": { 2235 | "node": ">=8" 2236 | } 2237 | }, 2238 | "node_modules/pkg-dir/node_modules/find-up": { 2239 | "version": "4.1.0", 2240 | "dev": true, 2241 | "license": "MIT", 2242 | "dependencies": { 2243 | "locate-path": "^5.0.0", 2244 | "path-exists": "^4.0.0" 2245 | }, 2246 | "engines": { 2247 | "node": ">=8" 2248 | } 2249 | }, 2250 | "node_modules/pkg-dir/node_modules/locate-path": { 2251 | "version": "5.0.0", 2252 | "dev": true, 2253 | "license": "MIT", 2254 | "dependencies": { 2255 | "p-locate": "^4.1.0" 2256 | }, 2257 | "engines": { 2258 | "node": ">=8" 2259 | } 2260 | }, 2261 | "node_modules/pkg-dir/node_modules/p-limit": { 2262 | "version": "2.3.0", 2263 | "dev": true, 2264 | "license": "MIT", 2265 | "dependencies": { 2266 | "p-try": "^2.0.0" 2267 | }, 2268 | "engines": { 2269 | "node": ">=6" 2270 | }, 2271 | "funding": { 2272 | "url": "https://github.com/sponsors/sindresorhus" 2273 | } 2274 | }, 2275 | "node_modules/pkg-dir/node_modules/p-locate": { 2276 | "version": "4.1.0", 2277 | "dev": true, 2278 | "license": "MIT", 2279 | "dependencies": { 2280 | "p-limit": "^2.2.0" 2281 | }, 2282 | "engines": { 2283 | "node": ">=8" 2284 | } 2285 | }, 2286 | "node_modules/process-on-spawn": { 2287 | "version": "1.0.0", 2288 | "dev": true, 2289 | "license": "MIT", 2290 | "dependencies": { 2291 | "fromentries": "^1.2.0" 2292 | }, 2293 | "engines": { 2294 | "node": ">=8" 2295 | } 2296 | }, 2297 | "node_modules/propagate": { 2298 | "version": "2.0.1", 2299 | "dev": true, 2300 | "license": "MIT", 2301 | "engines": { 2302 | "node": ">= 8" 2303 | } 2304 | }, 2305 | "node_modules/randombytes": { 2306 | "version": "2.1.0", 2307 | "dev": true, 2308 | "license": "MIT", 2309 | "dependencies": { 2310 | "safe-buffer": "^5.1.0" 2311 | } 2312 | }, 2313 | "node_modules/readdirp": { 2314 | "version": "4.1.2", 2315 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", 2316 | "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", 2317 | "dev": true, 2318 | "engines": { 2319 | "node": ">= 14.18.0" 2320 | }, 2321 | "funding": { 2322 | "type": "individual", 2323 | "url": "https://paulmillr.com/funding/" 2324 | } 2325 | }, 2326 | "node_modules/release-zalgo": { 2327 | "version": "1.0.0", 2328 | "dev": true, 2329 | "license": "ISC", 2330 | "dependencies": { 2331 | "es6-error": "^4.0.1" 2332 | }, 2333 | "engines": { 2334 | "node": ">=4" 2335 | } 2336 | }, 2337 | "node_modules/require-directory": { 2338 | "version": "2.1.1", 2339 | "dev": true, 2340 | "license": "MIT", 2341 | "engines": { 2342 | "node": ">=0.10.0" 2343 | } 2344 | }, 2345 | "node_modules/require-main-filename": { 2346 | "version": "2.0.0", 2347 | "dev": true, 2348 | "license": "ISC" 2349 | }, 2350 | "node_modules/resolve-from": { 2351 | "version": "5.0.0", 2352 | "dev": true, 2353 | "license": "MIT", 2354 | "engines": { 2355 | "node": ">=8" 2356 | } 2357 | }, 2358 | "node_modules/rimraf": { 2359 | "version": "3.0.2", 2360 | "dev": true, 2361 | "license": "ISC", 2362 | "dependencies": { 2363 | "glob": "^7.1.3" 2364 | }, 2365 | "bin": { 2366 | "rimraf": "bin.js" 2367 | }, 2368 | "funding": { 2369 | "url": "https://github.com/sponsors/isaacs" 2370 | } 2371 | }, 2372 | "node_modules/sade": { 2373 | "version": "1.8.1", 2374 | "dev": true, 2375 | "license": "MIT", 2376 | "dependencies": { 2377 | "mri": "^1.1.0" 2378 | }, 2379 | "engines": { 2380 | "node": ">=6" 2381 | } 2382 | }, 2383 | "node_modules/safe-buffer": { 2384 | "version": "5.2.1", 2385 | "dev": true, 2386 | "funding": [ 2387 | { 2388 | "type": "github", 2389 | "url": "https://github.com/sponsors/feross" 2390 | }, 2391 | { 2392 | "type": "patreon", 2393 | "url": "https://www.patreon.com/feross" 2394 | }, 2395 | { 2396 | "type": "consulting", 2397 | "url": "https://feross.org/support" 2398 | } 2399 | ], 2400 | "license": "MIT" 2401 | }, 2402 | "node_modules/semver": { 2403 | "version": "6.3.1", 2404 | "dev": true, 2405 | "license": "ISC", 2406 | "bin": { 2407 | "semver": "bin/semver.js" 2408 | } 2409 | }, 2410 | "node_modules/serialize-javascript": { 2411 | "version": "6.0.2", 2412 | "dev": true, 2413 | "license": "BSD-3-Clause", 2414 | "dependencies": { 2415 | "randombytes": "^2.1.0" 2416 | } 2417 | }, 2418 | "node_modules/set-blocking": { 2419 | "version": "2.0.0", 2420 | "dev": true, 2421 | "license": "ISC" 2422 | }, 2423 | "node_modules/shebang-command": { 2424 | "version": "2.0.0", 2425 | "dev": true, 2426 | "license": "MIT", 2427 | "dependencies": { 2428 | "shebang-regex": "^3.0.0" 2429 | }, 2430 | "engines": { 2431 | "node": ">=8" 2432 | } 2433 | }, 2434 | "node_modules/shebang-regex": { 2435 | "version": "3.0.0", 2436 | "dev": true, 2437 | "license": "MIT", 2438 | "engines": { 2439 | "node": ">=8" 2440 | } 2441 | }, 2442 | "node_modules/signal-exit": { 2443 | "version": "3.0.7", 2444 | "dev": true, 2445 | "license": "ISC" 2446 | }, 2447 | "node_modules/source-map": { 2448 | "version": "0.6.1", 2449 | "dev": true, 2450 | "license": "BSD-3-Clause", 2451 | "engines": { 2452 | "node": ">=0.10.0" 2453 | } 2454 | }, 2455 | "node_modules/spawn-wrap": { 2456 | "version": "2.0.0", 2457 | "dev": true, 2458 | "license": "ISC", 2459 | "dependencies": { 2460 | "foreground-child": "^2.0.0", 2461 | "is-windows": "^1.0.2", 2462 | "make-dir": "^3.0.0", 2463 | "rimraf": "^3.0.0", 2464 | "signal-exit": "^3.0.2", 2465 | "which": "^2.0.1" 2466 | }, 2467 | "engines": { 2468 | "node": ">=8" 2469 | } 2470 | }, 2471 | "node_modules/spawn-wrap/node_modules/foreground-child": { 2472 | "version": "2.0.0", 2473 | "dev": true, 2474 | "license": "ISC", 2475 | "dependencies": { 2476 | "cross-spawn": "^7.0.0", 2477 | "signal-exit": "^3.0.2" 2478 | }, 2479 | "engines": { 2480 | "node": ">=8.0.0" 2481 | } 2482 | }, 2483 | "node_modules/sprintf-js": { 2484 | "version": "1.0.3", 2485 | "dev": true, 2486 | "license": "BSD-3-Clause" 2487 | }, 2488 | "node_modules/strict-event-emitter": { 2489 | "version": "0.5.1", 2490 | "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", 2491 | "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", 2492 | "dev": true 2493 | }, 2494 | "node_modules/string-width": { 2495 | "version": "4.2.3", 2496 | "dev": true, 2497 | "license": "MIT", 2498 | "dependencies": { 2499 | "emoji-regex": "^8.0.0", 2500 | "is-fullwidth-code-point": "^3.0.0", 2501 | "strip-ansi": "^6.0.1" 2502 | }, 2503 | "engines": { 2504 | "node": ">=8" 2505 | } 2506 | }, 2507 | "node_modules/strip-ansi": { 2508 | "version": "6.0.1", 2509 | "dev": true, 2510 | "license": "MIT", 2511 | "dependencies": { 2512 | "ansi-regex": "^5.0.1" 2513 | }, 2514 | "engines": { 2515 | "node": ">=8" 2516 | } 2517 | }, 2518 | "node_modules/strip-bom": { 2519 | "version": "4.0.0", 2520 | "dev": true, 2521 | "license": "MIT", 2522 | "engines": { 2523 | "node": ">=8" 2524 | } 2525 | }, 2526 | "node_modules/strip-json-comments": { 2527 | "version": "3.1.1", 2528 | "dev": true, 2529 | "license": "MIT", 2530 | "engines": { 2531 | "node": ">=8" 2532 | }, 2533 | "funding": { 2534 | "url": "https://github.com/sponsors/sindresorhus" 2535 | } 2536 | }, 2537 | "node_modules/supports-color": { 2538 | "version": "8.1.1", 2539 | "dev": true, 2540 | "license": "MIT", 2541 | "dependencies": { 2542 | "has-flag": "^4.0.0" 2543 | }, 2544 | "engines": { 2545 | "node": ">=10" 2546 | }, 2547 | "funding": { 2548 | "url": "https://github.com/chalk/supports-color?sponsor=1" 2549 | } 2550 | }, 2551 | "node_modules/test-exclude": { 2552 | "version": "6.0.0", 2553 | "dev": true, 2554 | "license": "ISC", 2555 | "dependencies": { 2556 | "@istanbuljs/schema": "^0.1.2", 2557 | "glob": "^7.1.4", 2558 | "minimatch": "^3.0.4" 2559 | }, 2560 | "engines": { 2561 | "node": ">=8" 2562 | } 2563 | }, 2564 | "node_modules/test-exclude/node_modules/minimatch": { 2565 | "version": "3.1.2", 2566 | "dev": true, 2567 | "license": "ISC", 2568 | "dependencies": { 2569 | "brace-expansion": "^1.1.7" 2570 | }, 2571 | "engines": { 2572 | "node": "*" 2573 | } 2574 | }, 2575 | "node_modules/to-fast-properties": { 2576 | "version": "2.0.0", 2577 | "dev": true, 2578 | "license": "MIT", 2579 | "engines": { 2580 | "node": ">=4" 2581 | } 2582 | }, 2583 | "node_modules/type-fest": { 2584 | "version": "0.8.1", 2585 | "dev": true, 2586 | "license": "(MIT OR CC0-1.0)", 2587 | "engines": { 2588 | "node": ">=8" 2589 | } 2590 | }, 2591 | "node_modules/typedarray-to-buffer": { 2592 | "version": "3.1.5", 2593 | "dev": true, 2594 | "license": "MIT", 2595 | "dependencies": { 2596 | "is-typedarray": "^1.0.0" 2597 | } 2598 | }, 2599 | "node_modules/universal-user-agent": { 2600 | "version": "7.0.3", 2601 | "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz", 2602 | "integrity": "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==" 2603 | }, 2604 | "node_modules/update-browserslist-db": { 2605 | "version": "1.1.0", 2606 | "dev": true, 2607 | "funding": [ 2608 | { 2609 | "type": "opencollective", 2610 | "url": "https://opencollective.com/browserslist" 2611 | }, 2612 | { 2613 | "type": "tidelift", 2614 | "url": "https://tidelift.com/funding/github/npm/browserslist" 2615 | }, 2616 | { 2617 | "type": "github", 2618 | "url": "https://github.com/sponsors/ai" 2619 | } 2620 | ], 2621 | "license": "MIT", 2622 | "dependencies": { 2623 | "escalade": "^3.1.2", 2624 | "picocolors": "^1.0.1" 2625 | }, 2626 | "bin": { 2627 | "update-browserslist-db": "cli.js" 2628 | }, 2629 | "peerDependencies": { 2630 | "browserslist": ">= 4.21.0" 2631 | } 2632 | }, 2633 | "node_modules/uuid": { 2634 | "version": "8.3.2", 2635 | "dev": true, 2636 | "license": "MIT", 2637 | "bin": { 2638 | "uuid": "dist/bin/uuid" 2639 | } 2640 | }, 2641 | "node_modules/uvu": { 2642 | "version": "0.5.6", 2643 | "dev": true, 2644 | "license": "MIT", 2645 | "dependencies": { 2646 | "dequal": "^2.0.0", 2647 | "diff": "^5.0.0", 2648 | "kleur": "^4.0.3", 2649 | "sade": "^1.7.3" 2650 | }, 2651 | "bin": { 2652 | "uvu": "bin.js" 2653 | }, 2654 | "engines": { 2655 | "node": ">=8" 2656 | } 2657 | }, 2658 | "node_modules/which": { 2659 | "version": "2.0.2", 2660 | "dev": true, 2661 | "license": "ISC", 2662 | "dependencies": { 2663 | "isexe": "^2.0.0" 2664 | }, 2665 | "bin": { 2666 | "node-which": "bin/node-which" 2667 | }, 2668 | "engines": { 2669 | "node": ">= 8" 2670 | } 2671 | }, 2672 | "node_modules/which-module": { 2673 | "version": "2.0.1", 2674 | "dev": true, 2675 | "license": "ISC" 2676 | }, 2677 | "node_modules/workerpool": { 2678 | "version": "9.3.2", 2679 | "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-9.3.2.tgz", 2680 | "integrity": "sha512-Xz4Nm9c+LiBHhDR5bDLnNzmj6+5F+cyEAWPMkbs2awq/dYazR/efelZzUAjB/y3kNHL+uzkHvxVVpaOfGCPV7A==", 2681 | "dev": true 2682 | }, 2683 | "node_modules/wrap-ansi": { 2684 | "version": "8.1.0", 2685 | "dev": true, 2686 | "license": "MIT", 2687 | "dependencies": { 2688 | "ansi-styles": "^6.1.0", 2689 | "string-width": "^5.0.1", 2690 | "strip-ansi": "^7.0.1" 2691 | }, 2692 | "engines": { 2693 | "node": ">=12" 2694 | }, 2695 | "funding": { 2696 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 2697 | } 2698 | }, 2699 | "node_modules/wrap-ansi/node_modules/ansi-regex": { 2700 | "version": "6.1.0", 2701 | "dev": true, 2702 | "license": "MIT", 2703 | "engines": { 2704 | "node": ">=12" 2705 | }, 2706 | "funding": { 2707 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 2708 | } 2709 | }, 2710 | "node_modules/wrap-ansi/node_modules/ansi-styles": { 2711 | "version": "6.2.1", 2712 | "dev": true, 2713 | "license": "MIT", 2714 | "engines": { 2715 | "node": ">=12" 2716 | }, 2717 | "funding": { 2718 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 2719 | } 2720 | }, 2721 | "node_modules/wrap-ansi/node_modules/emoji-regex": { 2722 | "version": "9.2.2", 2723 | "dev": true, 2724 | "license": "MIT" 2725 | }, 2726 | "node_modules/wrap-ansi/node_modules/string-width": { 2727 | "version": "5.1.2", 2728 | "dev": true, 2729 | "license": "MIT", 2730 | "dependencies": { 2731 | "eastasianwidth": "^0.2.0", 2732 | "emoji-regex": "^9.2.2", 2733 | "strip-ansi": "^7.0.1" 2734 | }, 2735 | "engines": { 2736 | "node": ">=12" 2737 | }, 2738 | "funding": { 2739 | "url": "https://github.com/sponsors/sindresorhus" 2740 | } 2741 | }, 2742 | "node_modules/wrap-ansi/node_modules/strip-ansi": { 2743 | "version": "7.1.0", 2744 | "dev": true, 2745 | "license": "MIT", 2746 | "dependencies": { 2747 | "ansi-regex": "^6.0.1" 2748 | }, 2749 | "engines": { 2750 | "node": ">=12" 2751 | }, 2752 | "funding": { 2753 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 2754 | } 2755 | }, 2756 | "node_modules/wrappy": { 2757 | "version": "1.0.2", 2758 | "dev": true, 2759 | "license": "ISC" 2760 | }, 2761 | "node_modules/write-file-atomic": { 2762 | "version": "3.0.3", 2763 | "dev": true, 2764 | "license": "ISC", 2765 | "dependencies": { 2766 | "imurmurhash": "^0.1.4", 2767 | "is-typedarray": "^1.0.0", 2768 | "signal-exit": "^3.0.2", 2769 | "typedarray-to-buffer": "^3.1.5" 2770 | } 2771 | }, 2772 | "node_modules/y18n": { 2773 | "version": "5.0.8", 2774 | "dev": true, 2775 | "license": "ISC", 2776 | "engines": { 2777 | "node": ">=10" 2778 | } 2779 | }, 2780 | "node_modules/yallist": { 2781 | "version": "3.1.1", 2782 | "dev": true, 2783 | "license": "ISC" 2784 | }, 2785 | "node_modules/yargs": { 2786 | "version": "17.7.2", 2787 | "dev": true, 2788 | "license": "MIT", 2789 | "dependencies": { 2790 | "cliui": "^8.0.1", 2791 | "escalade": "^3.1.1", 2792 | "get-caller-file": "^2.0.5", 2793 | "require-directory": "^2.1.1", 2794 | "string-width": "^4.2.3", 2795 | "y18n": "^5.0.5", 2796 | "yargs-parser": "^21.1.1" 2797 | }, 2798 | "engines": { 2799 | "node": ">=12" 2800 | } 2801 | }, 2802 | "node_modules/yargs-parser": { 2803 | "version": "21.1.1", 2804 | "dev": true, 2805 | "license": "ISC", 2806 | "engines": { 2807 | "node": ">=12" 2808 | } 2809 | }, 2810 | "node_modules/yargs-unparser": { 2811 | "version": "2.0.0", 2812 | "dev": true, 2813 | "license": "MIT", 2814 | "dependencies": { 2815 | "camelcase": "^6.0.0", 2816 | "decamelize": "^4.0.0", 2817 | "flat": "^5.0.2", 2818 | "is-plain-obj": "^2.1.0" 2819 | }, 2820 | "engines": { 2821 | "node": ">=10" 2822 | } 2823 | }, 2824 | "node_modules/yocto-queue": { 2825 | "version": "0.1.0", 2826 | "dev": true, 2827 | "license": "MIT", 2828 | "engines": { 2829 | "node": ">=10" 2830 | }, 2831 | "funding": { 2832 | "url": "https://github.com/sponsors/sindresorhus" 2833 | } 2834 | } 2835 | } 2836 | } 2837 | -------------------------------------------------------------------------------- /.github/scripts/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "request-marketplace-action", 3 | "version": "1.0.0", 4 | "private": true, 5 | "description": "GitHub Actions workflow to request a marketplace action", 6 | "main": "initialize-request.js", 7 | "scripts": { 8 | "test": "nyc --all --reporter=lcov --reporter=cobertura --reporter=text --reporter=text-summary uvu" 9 | }, 10 | "dependencies": { 11 | "@octokit/rest": "^22.0.0" 12 | }, 13 | "repository": "robandpdx:request-marketplace-action", 14 | "keywords": [], 15 | "author": "Rob Anderson (https://github.com/robandpdx)", 16 | "license": "MIT", 17 | "devDependencies": { 18 | "mocha": "^11.6.0", 19 | "nock": "^14.0.5", 20 | "nyc": "^17.1.0", 21 | "uvu": "^0.5.6" 22 | }, 23 | "release": { 24 | "branches": [ 25 | "main" 26 | ] 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /.github/scripts/test.mjs: -------------------------------------------------------------------------------- 1 | import { test } from 'uvu'; 2 | import * as assert from 'uvu/assert'; 3 | import fs from 'fs'; 4 | 5 | const { default: initialize } = await import('./initialize-request.mjs'); 6 | const { default: complete } = await import('./approve-or-deny-request.mjs'); 7 | 8 | import nock from 'nock'; 9 | nock.disableNetConnect(); 10 | 11 | import { Octokit } from "@octokit/rest"; 12 | 13 | const github = new Octokit({ 14 | auth: "secret123", 15 | userAgent: 'myApp v1.2.3' 16 | }); 17 | 18 | const options = { 19 | token: "secret123", 20 | baseUrl: "https://github.robandpdx.demo-stack.com/api/v3", 21 | version: "v1.2.3", 22 | adminOpsOrg: "admin-ops", 23 | actionsApprovedOrg: "actions-approved", 24 | actionsApproverTeam: "actions-approvers", 25 | owner: "hashicorp-contrib", 26 | repo:"setup-packer" 27 | }; 28 | 29 | const meta34 = { 30 | installed_version: "3.4.0" 31 | } 32 | 33 | const meta35 = { 34 | installed_version: "3.5.0" 35 | } 36 | 37 | const context = { 38 | payload: { 39 | repository: { 40 | name: "request-marketplace-action", 41 | owner: { 42 | login: "admin-ops" 43 | } 44 | }, 45 | issue: { 46 | number: 12 47 | }, 48 | comment: { 49 | user: { 50 | login: "octocat" 51 | }, 52 | body: "approve" 53 | } 54 | } 55 | } 56 | 57 | const membershipResponse = JSON.parse(fs.readFileSync("./mocks/membership-response.json", "utf-8")); 58 | const issueCommentCreated = JSON.parse(fs.readFileSync("./mocks/issue-comment-created.json", "utf-8")); 59 | 60 | test.before.each(() => { 61 | membershipResponse.state = "active"; 62 | options.baseUrl = "https://github.robandpdx.demo-stack.com/api/v3"; 63 | }); 64 | test.after.each(() => { 65 | // nothing to do here 66 | }); 67 | 68 | // Fail the workflow because the repo already exists 69 | test("Fail the workflow because the repo already exists", async function () { 70 | let mock = nock("https://github.robandpdx.demo-stack.com/api/v3"); 71 | mock.get(`/repos/actions-approved/setup-packer_v1.2.3?owner=actions-approved&repo=setup-packer_v1.2.3`) 72 | .reply(201); 73 | 74 | try { 75 | await initialize(github, context, options); 76 | } catch (err) { 77 | assert.equal(err.message, "Repo actions-approved/setup-packer_v1.2.3 already exists"); 78 | } 79 | assert.equal(mock.pendingMocks(), []); 80 | }); 81 | 82 | // Create the repo because it doesn't exist 83 | test("Create the repo because it doesn't exist", async function () { 84 | let mock = nock("https://github.robandpdx.demo-stack.com/api/v3"); 85 | mock.get(`/repos/actions-approved/setup-packer_v1.2.3?owner=actions-approved&repo=setup-packer_v1.2.3`) 86 | .reply(404); 87 | 88 | mock.post(`/orgs/actions-approved/repos`, 89 | (requestBody) => { 90 | assert.equal(requestBody.name, "setup-packer_v1.2.3"); 91 | assert.equal(requestBody.org, "actions-approved"); 92 | assert.equal(requestBody.visibility, 'private'); 93 | assert.equal(requestBody.has_issues, true); 94 | assert.equal(requestBody.has_projects, false); 95 | assert.equal(requestBody.has_wiki, false); 96 | assert.equal(requestBody.description, "hashicorp-contrib/setup-packer@v1.2.3"); 97 | assert.equal(requestBody.homepage, "https://github.com/hashicorp-contrib/setup-packer"); 98 | return true; 99 | } 100 | ).reply(201); 101 | 102 | mock.put(`/repos/actions-approved/setup-packer_v1.2.3/actions/permissions`) 103 | .reply(204); 104 | 105 | await initialize(github, context, options); 106 | assert.equal(mock.pendingMocks(), []); 107 | }); 108 | 109 | // Change the repo visibility to internal on approval GHES 3.5 110 | test("Change the repo visibility to internal on approval GHES 3.5", async function () { 111 | let mock = nock("https://github.robandpdx.demo-stack.com/api/v3"); 112 | mock.get(`/meta`).reply(200, meta35); 113 | mock.get(`/orgs/admin-ops/teams/actions-approvers/memberships/octocat?org=admin-ops&team_slug=actions-approvers&username=octocat`) 114 | .reply(200, membershipResponse); 115 | mock.patch(`/repos/actions-approved/setup-packer_v1.2.3`, 116 | (requestBody) => { 117 | assert.equal(requestBody.owner, "actions-approved"); 118 | assert.equal(requestBody.repo, "setup-packer_v1.2.3"); 119 | assert.equal(requestBody.visibility, 'internal'); 120 | assert.equal(requestBody.archived, false); 121 | return true; 122 | }).reply(200); 123 | mock.patch(`/repos/admin-ops/request-marketplace-action/issues/12`, 124 | (requestBody) => { 125 | assert.equal(requestBody.owner, "admin-ops"); 126 | assert.equal(requestBody.repo, "request-marketplace-action"); 127 | assert.equal(requestBody.state, 'closed'); 128 | return true; 129 | }).reply(200); 130 | mock.put(`/repos/actions-approved/setup-packer_v1.2.3/actions/permissions/access`, 131 | (requestBody) => { 132 | assert.equal(requestBody.owner, "actions-approved"); 133 | assert.equal(requestBody.repo, "setup-packer_v1.2.3"); 134 | assert.equal(requestBody.access_level, 'enterprise'); 135 | return true; 136 | }).reply(200); 137 | 138 | await complete(github, context, options); 139 | assert.equal(mock.pendingMocks(), []); 140 | }); 141 | 142 | // Change the repo visibility to internal on approval GHEC 143 | test("Change the repo visibility to internal on approval GHEC", async function () { 144 | options.baseUrl = "https://api.github.com"; 145 | 146 | let mock = nock("https://api.github.com"); 147 | mock.get(`/orgs/admin-ops/teams/actions-approvers/memberships/octocat?org=admin-ops&team_slug=actions-approvers&username=octocat`) 148 | .reply(200, membershipResponse); 149 | mock.patch(`/repos/actions-approved/setup-packer_v1.2.3`, 150 | (requestBody) => { 151 | assert.equal(requestBody.owner, "actions-approved"); 152 | assert.equal(requestBody.repo, "setup-packer_v1.2.3"); 153 | assert.equal(requestBody.visibility, 'internal'); 154 | assert.equal(requestBody.archived, false); 155 | return true; 156 | }).reply(200); 157 | mock.patch(`/repos/admin-ops/request-marketplace-action/issues/12`, 158 | (requestBody) => { 159 | assert.equal(requestBody.owner, "admin-ops"); 160 | assert.equal(requestBody.repo, "request-marketplace-action"); 161 | assert.equal(requestBody.state, 'closed'); 162 | return true; 163 | }).reply(200); 164 | mock.put(`/repos/actions-approved/setup-packer_v1.2.3/actions/permissions/access`, 165 | (requestBody) => { 166 | assert.equal(requestBody.owner, "actions-approved"); 167 | assert.equal(requestBody.repo, "setup-packer_v1.2.3"); 168 | assert.equal(requestBody.access_level, 'enterprise'); 169 | return true; 170 | }).reply(200); 171 | 172 | await complete(github, context, options); 173 | assert.equal(mock.pendingMocks(), []); 174 | }); 175 | 176 | // Change the repo visibility to public on approval GHES 3.4 177 | test("Change the repo visibility to public on approval GHES 3.4", async function () { 178 | let mock = nock("https://github.robandpdx.demo-stack.com/api/v3"); 179 | mock.get(`/meta`).reply(200, meta34); 180 | mock.get(`/orgs/admin-ops/teams/actions-approvers/memberships/octocat?org=admin-ops&team_slug=actions-approvers&username=octocat`) 181 | .reply(200, membershipResponse); 182 | mock.patch(`/repos/actions-approved/setup-packer_v1.2.3`, 183 | (requestBody) => { 184 | assert.equal(requestBody.owner, "actions-approved"); 185 | assert.equal(requestBody.repo, "setup-packer_v1.2.3"); 186 | assert.equal(requestBody.visibility, 'public'); 187 | assert.equal(requestBody.archived, false); 188 | return true; 189 | }).reply(200); 190 | mock.patch(`/repos/admin-ops/request-marketplace-action/issues/12`, 191 | (requestBody) => { 192 | assert.equal(requestBody.owner, "admin-ops"); 193 | assert.equal(requestBody.repo, "request-marketplace-action"); 194 | assert.equal(requestBody.state, 'closed'); 195 | return true; 196 | }).reply(200); 197 | 198 | await complete(github, context, options); 199 | assert.equal(mock.pendingMocks(), []); 200 | }); 201 | 202 | // Change the repo visibility to internal on approval GHEC, uppercase comment 203 | test("Change the repo visibility to internal on approval GHEC, uppercase comment", async function () { 204 | context.payload.comment.body = "Approve"; 205 | options.baseUrl = "https://api.github.com"; 206 | 207 | let mock = nock("https://api.github.com"); 208 | mock.get(`/orgs/admin-ops/teams/actions-approvers/memberships/octocat?org=admin-ops&team_slug=actions-approvers&username=octocat`) 209 | .reply(200, membershipResponse); 210 | mock.patch(`/repos/actions-approved/setup-packer_v1.2.3`, 211 | (requestBody) => { 212 | assert.equal(requestBody.owner, "actions-approved"); 213 | assert.equal(requestBody.repo, "setup-packer_v1.2.3"); 214 | assert.equal(requestBody.visibility, 'internal'); 215 | assert.equal(requestBody.archived, false); 216 | return true; 217 | }).reply(200); 218 | mock.patch(`/repos/admin-ops/request-marketplace-action/issues/12`, 219 | (requestBody) => { 220 | assert.equal(requestBody.owner, "admin-ops"); 221 | assert.equal(requestBody.repo, "request-marketplace-action"); 222 | assert.equal(requestBody.state, 'closed'); 223 | return true; 224 | }).reply(200); 225 | mock.put(`/repos/actions-approved/setup-packer_v1.2.3/actions/permissions/access`, 226 | (requestBody) => { 227 | assert.equal(requestBody.owner, "actions-approved"); 228 | assert.equal(requestBody.repo, "setup-packer_v1.2.3"); 229 | assert.equal(requestBody.access_level, 'enterprise'); 230 | return true; 231 | }).reply(200); 232 | 233 | await complete(github, context, options); 234 | assert.equal(mock.pendingMocks(), []); 235 | }); 236 | 237 | // Change the repo to archived on denial 238 | test("Change the repo to archived on denial", async function () { 239 | context.payload.comment.body = "deny" 240 | let mock = nock("https://github.robandpdx.demo-stack.com/api/v3"); 241 | mock.get(`/orgs/admin-ops/teams/actions-approvers/memberships/octocat?org=admin-ops&team_slug=actions-approvers&username=octocat`) 242 | .reply(200, membershipResponse); 243 | mock.patch(`/repos/actions-approved/setup-packer_v1.2.3`, 244 | (requestBody) => { 245 | console.log(requestBody); 246 | assert.equal(requestBody.owner, "actions-approved"); 247 | assert.equal(requestBody.repo, "setup-packer_v1.2.3"); 248 | assert.equal(requestBody.visibility, 'private'); 249 | assert.equal(requestBody.archived, true); 250 | return true; 251 | }).reply(200); 252 | mock.patch(`/repos/admin-ops/request-marketplace-action/issues/12`, 253 | (requestBody) => { 254 | assert.equal(requestBody.owner, "admin-ops"); 255 | assert.equal(requestBody.repo, "request-marketplace-action"); 256 | assert.equal(requestBody.state, 'closed'); 257 | return true; 258 | }).reply(200); 259 | 260 | await complete(github, context, options); 261 | assert.equal(mock.pendingMocks(), []); 262 | }); 263 | 264 | // Change the repo to archived on denial, uppercase comment 265 | test("Change the repo to archived on denial, uppercase comment", async function () { 266 | context.payload.comment.body = "Deny" 267 | let mock = nock("https://github.robandpdx.demo-stack.com/api/v3"); 268 | mock.get(`/orgs/admin-ops/teams/actions-approvers/memberships/octocat?org=admin-ops&team_slug=actions-approvers&username=octocat`) 269 | .reply(200, membershipResponse); 270 | mock.patch(`/repos/actions-approved/setup-packer_v1.2.3`, 271 | (requestBody) => { 272 | console.log(requestBody); 273 | assert.equal(requestBody.owner, "actions-approved"); 274 | assert.equal(requestBody.repo, "setup-packer_v1.2.3"); 275 | assert.equal(requestBody.visibility, 'private'); 276 | assert.equal(requestBody.archived, true); 277 | return true; 278 | }).reply(200); 279 | mock.patch(`/repos/admin-ops/request-marketplace-action/issues/12`, 280 | (requestBody) => { 281 | assert.equal(requestBody.owner, "admin-ops"); 282 | assert.equal(requestBody.repo, "request-marketplace-action"); 283 | assert.equal(requestBody.state, 'closed'); 284 | return true; 285 | }).reply(200); 286 | 287 | await complete(github, context, options); 288 | assert.equal(mock.pendingMocks(), []); 289 | }); 290 | 291 | // Membership not active 404 292 | test("Membership not active 404", async function () { 293 | let mock = nock("https://github.robandpdx.demo-stack.com/api/v3"); 294 | mock.get(`/orgs/admin-ops/teams/actions-approvers/memberships/octocat?org=admin-ops&team_slug=actions-approvers&username=octocat`) 295 | .reply(404); 296 | 297 | try { 298 | await complete(github, context, options); 299 | } catch (err) { 300 | assert.equal(err.message, "Error checking membership"); 301 | } 302 | assert.equal(mock.pendingMocks(), []); 303 | }); 304 | 305 | // Membership not active 306 | test("Membership not active", async function () { 307 | membershipResponse.state = "inactive"; 308 | 309 | let mock = nock("https://github.robandpdx.demo-stack.com/api/v3"); 310 | mock.get(`/orgs/admin-ops/teams/actions-approvers/memberships/octocat?org=admin-ops&team_slug=actions-approvers&username=octocat`) 311 | .reply(200, membershipResponse); 312 | 313 | await complete(github, context, options); 314 | assert.equal(mock.pendingMocks(), []); 315 | }); 316 | 317 | test.run(); -------------------------------------------------------------------------------- /.github/workflows/approve-or-deny-request.yml: -------------------------------------------------------------------------------- 1 | name: Approve or Deny Marketplace Action Request 2 | 3 | on: 4 | issue_comment: 5 | types: [created] 6 | 7 | jobs: 8 | parse-issue: 9 | runs-on: self-hosted 10 | outputs: 11 | payload: ${{ steps.issue_body_parser_request.outputs.payload }} 12 | steps: 13 | - name: Get JSON Data out of Issue Request 14 | uses: peter-murray/issue-body-parser-action@v3 15 | id: issue_body_parser_request 16 | with: 17 | github_token: ${{ secrets.GITHUB_TOKEN }} 18 | issue_id: ${{ github.event.issue.number }} 19 | payload_marker: request 20 | fail_on_missing: false 21 | approve-or-deny-request: 22 | runs-on: self-hosted 23 | needs: parse-issue 24 | if: needs.parse-issue.outputs.payload != 'NOT_FOUND' 25 | steps: 26 | - name: Lookup the latest release of ${{ fromJson(needs.parse-issue.outputs.payload).owner }}/${{ fromJson(needs.parse-issue.outputs.payload).repo }} 27 | id: get_version 28 | env: 29 | OWNER: ${{ fromJson(needs.parse-issue.outputs.payload).owner }} 30 | REPO: ${{ fromJson(needs.parse-issue.outputs.payload).repo }} 31 | REQUEST_VERSION: ${{ fromJson(needs.parse-issue.outputs.payload).version }} 32 | run: | 33 | if [ $REQUEST_VERSION == 'latest' ]; then 34 | echo "Finding latest release of $OWNER/$REPO..." 35 | export VERSION=`curl https://api.github.com/repos/$OWNER/$REPO/releases/latest | jq -r .name` 36 | else 37 | export VERSION=$REQUEST_VERSION 38 | fi 39 | echo "VERSION: $VERSION" 40 | echo "version=$VERSION" >> $GITHUB_OUTPUT 41 | - name: Check out scripts 42 | uses: actions/checkout@v4 43 | - name: Setup Node 44 | uses: actions/setup-node@v4 45 | with: 46 | node-version: '20' 47 | check-latest: true 48 | - name: Install dependencies 49 | run: | 50 | cd .github/scripts 51 | npm install 52 | - name: Approve or deny request 53 | uses: actions/github-script@v7 54 | env: 55 | VERSION: ${{ steps.get_version.outputs.version }} 56 | REPO: ${{ fromJson(needs.parse-issue.outputs.payload).repo }} 57 | with: 58 | debug: true 59 | script: | 60 | const { default: complete } = await import('${{ github.workspace }}/.github/scripts/approve-or-deny-request.mjs'); 61 | const options = { 62 | token: '${{ secrets.TOKEN }}', 63 | adminOpsOrg: '${{ vars.ADMIN_OPS_ORG }}', 64 | actionsApprovedOrg: '${{ vars.ACTIONS_APPROVED_ORG }}', 65 | actionsApproverTeam: '${{ vars.ACTIONS_APPROVERS_TEAM }}', 66 | baseUrl: '${{ github.api_url }}', 67 | version: process.env.VERSION, 68 | repo: process.env.REPO 69 | }; 70 | await complete(github, context, options); 71 | -------------------------------------------------------------------------------- /.github/workflows/initialize-request.yml: -------------------------------------------------------------------------------- 1 | name: Initialize Marketplace Action Request 2 | 3 | on: 4 | issues: 5 | types: [opened] 6 | 7 | jobs: 8 | parse-issue: 9 | runs-on: self-hosted 10 | outputs: 11 | payload: ${{ steps.issue_body_parser_request.outputs.payload }} 12 | steps: 13 | - name: Get JSON Data out of Issue Request 14 | uses: peter-murray/issue-body-parser-action@v3 15 | id: issue_body_parser_request 16 | with: 17 | github_token: ${{ secrets.GITHUB_TOKEN }} 18 | issue_id: ${{ github.event.issue.number }} 19 | payload_marker: request 20 | fail_on_missing: false 21 | initialize-request: 22 | runs-on: self-hosted 23 | needs: parse-issue 24 | if: needs.parse-issue.outputs.payload != 'NOT_FOUND' 25 | steps: 26 | - name: Lookup the latest release of ${{ fromJson(needs.parse-issue.outputs.payload).owner }}/${{ fromJson(needs.parse-issue.outputs.payload).repo }} 27 | id: get_version 28 | env: 29 | OWNER: ${{ fromJson(needs.parse-issue.outputs.payload).owner }} 30 | REPO: ${{ fromJson(needs.parse-issue.outputs.payload).repo }} 31 | REQUEST_VERSION: ${{ fromJson(needs.parse-issue.outputs.payload).version }} 32 | run: | 33 | if [ $REQUEST_VERSION == 'latest' ]; then 34 | echo "Finding latest release of $OWNER/$REPO..." 35 | export VERSION=`curl https://api.github.com/repos/$OWNER/$REPO/releases/latest | jq -r .name` 36 | if [ "$VERSION" == "null" ]; then 37 | echo "No latest version found for $OWNER/$REPO" 38 | exit 1 39 | fi 40 | else 41 | export VERSION=$REQUEST_VERSION 42 | fi 43 | echo "VERSION: $VERSION" 44 | echo "version=$VERSION" >> $GITHUB_OUTPUT 45 | - name: Check out scripts 46 | uses: actions/checkout@v4 47 | - name: Setup Node 48 | uses: actions/setup-node@v4 49 | with: 50 | node-version: '20' 51 | check-latest: true 52 | - name: Install dependencies 53 | run: | 54 | cd .github/scripts 55 | npm install 56 | - name: Create the repo ${{ fromJson(needs.parse-issue.outputs.payload).repo }}_${{ steps.get_version.outputs.version }} on GitHub Enterprise Server 57 | uses: actions/github-script@v7 58 | env: 59 | VERSION: ${{ steps.get_version.outputs.version }} 60 | OWNER: ${{ fromJson(needs.parse-issue.outputs.payload).owner }} 61 | REPO: ${{ fromJson(needs.parse-issue.outputs.payload).repo }} 62 | with: 63 | debug: true 64 | script: | 65 | const { default: initialize } = await import('${{ github.workspace }}/.github/scripts/initialize-request.mjs'); 66 | const options = { 67 | token: '${{ secrets.TOKEN }}', 68 | actionsApprovedOrg: '${{ vars.ACTIONS_APPROVED_ORG }}', 69 | baseUrl: '${{ github.api_url }}', 70 | version: process.env.VERSION, 71 | owner: process.env.OWNER, 72 | repo: process.env.REPO 73 | }; 74 | await initialize(github, context, options); 75 | - name: Check out requested action repo ${{ fromJson(needs.parse-issue.outputs.payload).owner }}/${{ fromJson(needs.parse-issue.outputs.payload).repo }}_${{ steps.get_version.outputs.version }} 76 | env: 77 | OWNER: ${{ fromJson(needs.parse-issue.outputs.payload).owner }} 78 | REPO: ${{ fromJson(needs.parse-issue.outputs.payload).repo }} 79 | run: | 80 | git clone https://github.com/$OWNER/$REPO requested-action 81 | - name: Push requested action to private repo in $ACTIONS_APPROVED_ORG org on GitHub Enterprise Server 82 | env: 83 | REPO: ${{ fromJson(needs.parse-issue.outputs.payload).repo }} 84 | VERSION: ${{ steps.get_version.outputs.version }} 85 | run: | 86 | cd requested-action 87 | git config user.email '${{ secrets.GITHUB_EMAIL }}' 88 | git config user.name '${{ secrets.GITHUB_USERNAME }}' 89 | if git checkout main; then 90 | git branch -m main-old 91 | fi 92 | git checkout "$VERSION" 93 | git switch -c "$VERSION"-branch 94 | git branch -m main 95 | export GHHOST=${{ github.server_url }} 96 | git remote add origin2 https://${{ secrets.TOKEN }}@${GHHOST#https://}/${{ vars.ACTIONS_APPROVED_ORG }}/"$REPO"_"$VERSION".git 97 | git push -u origin2 main 98 | git push -u origin2 "$VERSION" 99 | -------------------------------------------------------------------------------- /.github/workflows/pr.yml: -------------------------------------------------------------------------------- 1 | name: Pull Request Tests 2 | 3 | on: 4 | pull_request: 5 | branches: [ '*' ] 6 | types: 7 | - opened 8 | - synchronize 9 | 10 | permissions: 11 | pull-requests: write 12 | 13 | jobs: 14 | run-tests: 15 | runs-on: ubuntu-latest 16 | env: 17 | working-directory: ./.github/scripts 18 | 19 | steps: 20 | - uses: actions/checkout@v4 21 | - uses: actions/setup-node@v4 22 | with: 23 | node-version: '20' 24 | check-latest: true 25 | cache: 'npm' 26 | cache-dependency-path: ${{ env.working-directory }}/package-lock.json 27 | - run: npm ci 28 | working-directory: ${{ env.working-directory }} 29 | - run: npm test 30 | working-directory: ${{ env.working-directory }} 31 | - uses: tintef/nyc-reporter-action@0.2.5 32 | with: 33 | GITHUB_TOKEN: ${{ github.token }} 34 | SKIP_COVERAGE_FOLDER: true 35 | WORKING_DIRECTORY: ${{ env.working-directory }} 36 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: Main Tests 2 | on: 3 | push: 4 | branches: 5 | - main 6 | jobs: 7 | test: 8 | runs-on: ubuntu-latest 9 | env: 10 | working-directory: ./.github/scripts 11 | steps: 12 | - uses: actions/checkout@v4 13 | - uses: actions/setup-node@v4 14 | with: 15 | node-version: 20 16 | cache: npm 17 | cache-dependency-path: ${{ env.working-directory }}/package-lock.json 18 | - run: npm ci 19 | working-directory: ${{ env.working-directory }} 20 | - run: npm test 21 | working-directory: ${{ env.working-directory }} 22 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # package directories 2 | node_modules 3 | .env 4 | coverage 5 | .nyc_output 6 | archives 7 | .DS_Store -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "type": "node", 9 | "request": "launch", 10 | "name": "NYC", 11 | "runtimeExecutable": "nyc", 12 | "runtimeArgs": [ 13 | "--reporter=lcov", 14 | "--reporter=cobertura", 15 | "--reporter=text-summary", 16 | "mocha", 17 | "--timeout", 18 | "999999", 19 | "--colors", 20 | "${workspaceFolder}/.github/scripts" 21 | ], 22 | "console": "integratedTerminal", 23 | "cwd": "${workspaceRoot}/.github/scripts", 24 | }, 25 | { 26 | "type": "node", 27 | "request": "launch", 28 | "name": "Mocha", 29 | "runtimeExecutable": "mocha", 30 | "console": "integratedTerminal", 31 | "cwd": "${workspaceRoot}/.github/scripts", 32 | } 33 | ] 34 | } -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, gender identity and expression, level of experience, 9 | nationality, personal appearance, race, religion, or sexual identity and 10 | orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | * Using welcoming and inclusive language 18 | * Being respectful of differing viewpoints and experiences 19 | * Gracefully accepting constructive criticism 20 | * Focusing on what is best for the community 21 | * Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | * The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | * Trolling, insulting/derogatory comments, and personal or political attacks 28 | * Public or private harassment 29 | * Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | * Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project team at opensource@github.com. All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 71 | available at [http://contributor-covenant.org/version/1/4][version] 72 | 73 | [homepage]: http://contributor-covenant.org 74 | [version]: http://contributor-covenant.org/version/1/4/ 75 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | ## Contributing 2 | 3 | [fork]: https://github.com/github/REPO/fork 4 | [pr]: https://github.com/github/REPO/compare 5 | [style]: https://github.com/styleguide/ruby 6 | [code-of-conduct]: CODE_OF_CONDUCT.md 7 | 8 | Hi there! We're thrilled that you'd like to contribute to this project. Your help is essential for keeping it great. 9 | 10 | Contributions to this project are [released](https://help.github.com/articles/github-terms-of-service/#6-contributions-under-repository-license) to the public under the [project's open source license](LICENSE.md). 11 | 12 | Please note that this project is released with a [Contributor Code of Conduct][code-of-conduct]. By participating in this project you agree to abide by its terms. 13 | 14 | ## Submitting a pull request 15 | 16 | 0. [Fork][fork] and clone the repository 17 | 0. Configure and install the dependencies: `script/bootstrap` 18 | 0. Make sure the tests pass on your machine: `rake` 19 | 0. Create a new branch: `git checkout -b my-branch-name` 20 | 0. Make your change, add tests, and make sure the tests still pass 21 | 0. Push to your fork and [submit a pull request][pr] 22 | 0. Pat your self on the back and wait for your pull request to be reviewed and merged. 23 | 24 | Here are a few things you can do that will increase the likelihood of your pull request being accepted: 25 | 26 | - Follow the [style guide][style]. 27 | - Write tests. 28 | - Keep your change as focused as possible. If there are multiple changes you would like to make that are not dependent upon each other, consider submitting them as separate pull requests. 29 | - Write a [good commit message](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html). 30 | 31 | ## Resources 32 | 33 | - [How to Contribute to Open Source](https://opensource.guide/how-to-contribute/) 34 | - [Using Pull Requests](https://help.github.com/articles/about-pull-requests/) 35 | - [GitHub Help](https://help.github.com) 36 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright GitHub 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 | 23 | TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT WILL 24 | GITHUB BE LIABLE TO CUSTOMER OR TO ANY THIRD PARTY FOR ANY INDIRECT, 25 | SPECIAL, INCIDENTAL, PUNITIVE, OR CONSEQUENTIAL DAMAGES (INCLUDING 26 | FOR LOSS OF PROFITS, REVENUE, OR DATA) OR FOR THE COST OF OBTAINING 27 | SUBSTITUTE PRODUCTS ARISING OUT OF OR IN CONNECTION WITH THIS AGREEMENT, 28 | HOWEVER CAUSED, WHETHER SUCH LIABILITY ARISES FROM ANY CLAIM BASED 29 | UPON CONTRACT, WARRANTY, TORT (INCLUDING NEGLIGENCE), STRICT LIABILITY 30 | OR OTHERWISE, AND WHETHER OR NOT GITHUB HAS BEEN ADVISED OF THE 31 | POSSIBILITY OF SUCH DAMAGES. 32 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # request-marketplace-action 2 | 3 | ## Background 4 | 5 | In [GitHub Enterprise Server](https://docs.github.com/en/enterprise-server) you can allow access to [marketplace actions](https://github.com/marketplace?type=actions) by configuring [GitHub Connect](https://docs.github.com/en/enterprise-server/admin/github-actions/managing-access-to-actions-from-githubcom/enabling-automatic-access-to-githubcom-actions-using-github-connect). However, controlling which actions can be used comes at a huge administrative cost, as you would need to configure each org to allow the actions you approve of. Sometimes org admins are not the appropriate people to decide what actions are allowed or not. You may want to control allowed action for the entire enterprise, which can be done through the Enterprise Settings>Policies>Actions. However, there is no API to automate updating this setting, and there is no way to stage actions and allow admins to evaluate them before approval for wider use within your enterprise. The same issue exists for managing access to marketplace actions in [GitHub Enterprise Cloud](https://github.com/enterprise). In these cases, you want to host the requested marketplace actions in an org within your enterprise as private repos, allowing admins to evaluate the actions prior to making them available within your enterprise. Upon approval, the visibility of the repo changes so that the action is available to users within your enterprise. 6 | 7 | This project provides two actions workflows to help manage the process of requesting marketplace actions and approving or denying such requests: Initialize Marketplace Action Request and Approve or Deny Marketplace Action Request 8 | 9 | ## Workflows 10 | 11 | **Initialize Marketplace Action Request** is triggered when a user opens an issue requesting a specific marketplace action. The marketplace actions is "staged" as a private repo in your org where you intend to host the approved actions. Within this private repo, admins can review the marketplace action code and determine if it is appropriate for use within your enterprise. Actions are disabled on the newly created repo to prevent possible privilege escalation through self-hosted runners. 12 | 13 | **Approve or Deny Marketplace Action Request** is triggered when a user comments on an issue. If the user commenting is a member of the approver's team, and the comment includes the word "approve", then the visibility of the repo created by the previous workflow is changed from "private" to "internal" (GHEC EMU and GHES >= 3.5, for GHES < 3.5 repos become "public" on approval) and the issue is closed. If the user commenting is a member of the approvers team, and the comment includes the word "deny", then the repo create by the previous workflow is put in "archive" mode and remains "private". 14 | 15 | ## Requesting a marketplace action 16 | 17 | To request a marketplace action, open an issue in this repo. Include in your issue, the following markdown... 18 | 19 | ``` 20 | ```json request 21 | { 22 | "owner": "hashicorp-contrib", 23 | "repo": "setup-packer", 24 | "version": "latest" 25 | } 26 | ``` 27 | ``` 28 | The example above refers to the repo `https://github.com/hashicorp-contrib/setup-packer`. The value of the `version` field needs to either match exactly a release in the repo, or be `latest`. The value of `latest` will cause the workflow to find the latest release available currently. 29 | See [examples.md](examples.md) for more examples. 30 | 31 | ## Prerequisites 32 | 33 | 1. [GitHub Enterprise Server v3.x](https://docs.github.com/en/enterprise-server@3.5/get-started/onboarding/getting-started-with-github-enterprise-server) or [GitHub Enterprise Managed Users (EMU) Account on GitHub.com](https://docs.github.com/en/enterprise-cloud@latest/admin/identity-and-access-management/using-enterprise-managed-users-for-iam/about-enterprise-managed-users). 34 | 1. You must have [enabled GitHub Actions for GitHub Enterprise Server](https://docs.github.com/en/enterprise-server@3.4/admin/github-actions/enabling-github-actions-for-github-enterprise-server). 35 | 1. You have an org created where you intend to host your approved actions. Let's call it `actions-approved` for now. 36 | 1. You have an org created where you intend to host the repos that will run these workflow. Let's call it `admin-ops` for now. 37 | 1. You have a team created within the `admin-ops` org. Members of this team will be able to approve or deny requests for marketplace actions. Let's call it `actions-approvers` for now. 38 | 1. You need runners available to the repo or org where you intend to run these workflows. Currently, the workflows are configured to use `self-hosted` runners. 39 | 40 | ## Setup 41 | 42 | 1. Configure this repo with an actions secret named `TOKEN` with the value of a PAT that has `admin:org`, `repo`, and `workflow` scope on your GHEC server. 43 | 1. Configure this repo with the following actions repository variables, and note their values below so they are known to all who use this repo. 44 | `ADMIN_OPS_ORG`: admin-ops 45 | `ACTIONS_APPROVED_ORG`: actions-approved 46 | `ACTIONS_APPROVERS_TEAM`: actions-approvers 47 | 1. Configure the Enterprise Actions Policies to allow select actions. Allow specified actions as follows: 48 | - peter-murray/issue-body-parser-action@v1 (required by these workflows) 49 | 50 | ## Installing these workflows into another repo 51 | 52 | You may already have requests for marketplace actions occurring in another repo, and want to simply use these workflows in that repo. 53 | 1. Make sure the [prerequisutes](#prerequisites) above are met. 54 | 1. Follow the [setup](#setup) instructions above on the repo you intent to use. 55 | 1. Move the contents of this repo's .github directory into the .github directory of the repo you intend to use. Be careful not to clobber any existing files in the .github repo! 56 | 57 | ## Troubleshooting 58 | 59 | When specifying the details of the actions repo you are requesting, if the release name and the tag name of the release in that repo do not match, you will need to use the tag name for the version. When specifying the version as `latest` the assumption is that the release name and the tag name of the release match. If this is not the case, you will need to specify the tag name as the vesion rather than using `latest`. 60 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | Thanks for helping make GitHub safe for everyone. 2 | 3 | ## Security 4 | 5 | GitHub takes the security of our software products and services seriously, including all of the open source code repositories managed through our GitHub organizations, such as [GitHub](https://github.com/GitHub). 6 | 7 | Even though [open source repositories are outside of the scope of our bug bounty program](https://bounty.github.com/index.html#scope) and therefore not eligible for bounty rewards, we will ensure that your finding gets passed along to the appropriate maintainers for remediation. 8 | 9 | ## Reporting Security Issues 10 | 11 | If you believe you have found a security vulnerability in any GitHub-owned repository, please report it to us through coordinated disclosure. 12 | 13 | **Please do not report security vulnerabilities through public GitHub issues, discussions, or pull requests.** 14 | 15 | Instead, please send an email to opensource-security[@]github.com. 16 | 17 | Please include as much of the information listed below as you can to help us better understand and resolve the issue: 18 | 19 | * The type of issue (e.g., buffer overflow, SQL injection, or cross-site scripting) 20 | * Full paths of source file(s) related to the manifestation of the issue 21 | * The location of the affected source code (tag/branch/commit or direct URL) 22 | * Any special configuration required to reproduce the issue 23 | * Step-by-step instructions to reproduce the issue 24 | * Proof-of-concept or exploit code (if possible) 25 | * Impact of the issue, including how an attacker might exploit the issue 26 | 27 | This information will help us triage your report more quickly. 28 | 29 | ## Policy 30 | 31 | See [GitHub's Safe Harbor Policy](https://docs.github.com/en/github/site-policy/github-bug-bounty-program-legal-safe-harbor#1-safe-harbor-terms) 32 | -------------------------------------------------------------------------------- /examples.md: -------------------------------------------------------------------------------- 1 | # Example issue bodies 2 | 3 | ``` 4 | ```json request 5 | { 6 | "owner": "hashicorp-contrib", 7 | "repo": "setup-packer", 8 | "version": "latest" 9 | } 10 | ``` 11 | ``` 12 | 13 | ``` 14 | ```json request 15 | { 16 | "owner": "hashicorp", 17 | "repo": "setup-terraform", 18 | "version": "latest" 19 | } 20 | ``` 21 | ``` 22 | 23 | ``` 24 | ```json request 25 | { 26 | "owner": "aws-actions", 27 | "repo": "configure-aws-credentials", 28 | "version": "latest" 29 | } 30 | ``` 31 | ``` -------------------------------------------------------------------------------- /ownership.yaml: -------------------------------------------------------------------------------- 1 | version: 1 2 | ownership: 3 | - name: request-marketplace-action 4 | description: actions workflows to help manage the process of requesting marketplace actions and approving or denying such requests 5 | kind: code 6 | maintainer: robandpdx 7 | team: github/ps-amer 8 | team_slack: services-delivery 9 | exec_sponsor: scotcar 10 | repo: https://github.com/github/request-marketplace-action 11 | sev1: 12 | issue: https://github.com/github/request-marketplace-action/issues 13 | tta: '1 business day' 14 | sev2: 15 | issue: https://github.com/github/request-marketplace-action/issues 16 | tta: '5 business days' 17 | sev3: 18 | issue: https://github.com/github/request-marketplace-action/issues 19 | slack: services-delivery 20 | tta: '7 business days' 21 | qos: experimental 22 | tier: 3 23 | --------------------------------------------------------------------------------