├── package.json ├── composer.json ├── src ├── paths.js ├── reviewers.js ├── request-review.js ├── reporter.js ├── team-members.js ├── main.js └── requirement.js ├── action.yml ├── SECURITY.md ├── CHANGELOG.md ├── README.md ├── LICENSE.txt └── dist ├── sourcemap-register.js └── licenses.txt /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "description": "Check that a Pull Request has reviews from required teams.", 4 | "license": "GPL-2.0-or-later", 5 | "author": "Automattic", 6 | "main": "index.js", 7 | "scripts": { 8 | "build": "ncc build src/main.js -o dist --source-map --license licenses.txt", 9 | "test": "jest --config=tests/jest.config.js --verbose", 10 | "test-coverage": "pnpm run test --coverage" 11 | }, 12 | "dependencies": { 13 | "@actions/core": "1.11.1", 14 | "@actions/github": "6.0.1", 15 | "error": "10.4.0", 16 | "js-yaml": "4.1.1", 17 | "picomatch": "4.0.2" 18 | }, 19 | "devDependencies": { 20 | "@vercel/ncc": "0.36.1", 21 | "jest": "30.2.0" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "automattic/action-required-review", 3 | "description": "GitHub Action to check that a Pull Request has reviews from required teams.", 4 | "type": "project", 5 | "license": "GPL-2.0-or-later", 6 | "require": {}, 7 | "require-dev": { 8 | "automattic/jetpack-changelogger": "^6.0.12" 9 | }, 10 | "scripts": { 11 | "build-development": [ 12 | "pnpm run build" 13 | ], 14 | "test-coverage": "pnpm run test-coverage", 15 | "test-js": "pnpm run test" 16 | }, 17 | "extra": { 18 | "autotagger": { 19 | "major": true 20 | }, 21 | "autorelease": true, 22 | "mirror-repo": "Automattic/action-required-review", 23 | "changelogger": { 24 | "link-template": "https://github.com/Automattic/action-required-review/compare/v${old}...v${new}" 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/paths.js: -------------------------------------------------------------------------------- 1 | const core = require( '@actions/core' ); 2 | const github = require( '@actions/github' ); 3 | const { WError } = require( 'error' ); 4 | 5 | /** 6 | * Fetch the paths in the current PR. 7 | * 8 | * @return {string[]} Paths. 9 | */ 10 | async function fetchPaths() { 11 | const octokit = github.getOctokit( core.getInput( 'token', { required: true } ) ); 12 | const owner = github.context.payload.repository.owner.login; 13 | const repo = github.context.payload.repository.name; 14 | const pr = github.context.payload.pull_request.number; 15 | 16 | const paths = {}; 17 | try { 18 | for await ( const res of octokit.paginate.iterator( octokit.rest.pulls.listFiles, { 19 | owner: owner, 20 | repo: repo, 21 | pull_number: pr, 22 | per_page: 100, 23 | } ) ) { 24 | res.data.forEach( file => { 25 | paths[ file.filename ] = true; 26 | if ( file.previous_filename ) { 27 | paths[ file.previous_filename ] = true; 28 | } 29 | } ); 30 | } 31 | } catch ( error ) { 32 | throw new WError( 33 | `Failed to query ${ owner }/${ repo } PR #${ pr } files from GitHub`, 34 | error, 35 | {} 36 | ); 37 | } 38 | 39 | return Object.keys( paths ).sort(); 40 | } 41 | 42 | module.exports = fetchPaths; 43 | -------------------------------------------------------------------------------- /src/reviewers.js: -------------------------------------------------------------------------------- 1 | const core = require( '@actions/core' ); 2 | const github = require( '@actions/github' ); 3 | const { WError } = require( 'error' ); 4 | 5 | /** 6 | * Fetch the reviewers approving the current PR. 7 | * 8 | * @return {string[]} Reviewers. 9 | */ 10 | async function fetchReviewers() { 11 | const octokit = github.getOctokit( core.getInput( 'token', { required: true } ) ); 12 | const owner = github.context.payload.repository.owner.login; 13 | const repo = github.context.payload.repository.name; 14 | const pr = github.context.payload.pull_request.number; 15 | 16 | const reviewers = new Set(); 17 | try { 18 | for await ( const res of octokit.paginate.iterator( octokit.rest.pulls.listReviews, { 19 | owner: owner, 20 | repo: repo, 21 | pull_number: pr, 22 | per_page: 100, 23 | } ) ) { 24 | res.data.forEach( review => { 25 | // GitHub may return more than one review per user, but only counts the last non-comment one for each. 26 | // "APPROVED" allows merging, while "CHANGES_REQUESTED" and "DISMISSED" do not. 27 | if ( review.state === 'APPROVED' ) { 28 | reviewers.add( review.user.login ); 29 | } else if ( review.state !== 'COMMENTED' ) { 30 | reviewers.delete( review.user.login ); 31 | } 32 | } ); 33 | } 34 | } catch ( error ) { 35 | throw new WError( 36 | `Failed to query ${ owner }/${ repo } PR #${ pr } reviewers from GitHub`, 37 | error, 38 | {} 39 | ); 40 | } 41 | 42 | return [ ...reviewers ].sort(); 43 | } 44 | 45 | module.exports = fetchReviewers; 46 | -------------------------------------------------------------------------------- /src/request-review.js: -------------------------------------------------------------------------------- 1 | const core = require( '@actions/core' ); 2 | const github = require( '@actions/github' ); 3 | 4 | /** 5 | * Request review from the given team 6 | * 7 | * @param {string[]} teams - GitHub team slug, or @ followed by a GitHub user name. 8 | */ 9 | async function requestReviewer( teams ) { 10 | const octokit = github.getOctokit( core.getInput( 'token', { required: true } ) ); 11 | const owner = github.context.payload.repository.owner.login; 12 | const repo = github.context.payload.repository.name; 13 | const pr = github.context.payload.pull_request.number; 14 | const author = `@${ github.context.payload.pull_request.user.login }`; 15 | if ( teams.includes( author ) ) { 16 | core.info( `Skipping review for author ${ author }` ); 17 | teams = teams.filter( team => team !== author ); 18 | } 19 | 20 | const userReviews = []; 21 | const teamReviews = []; 22 | 23 | for ( const t of teams ) { 24 | if ( t.startsWith( '@' ) && t.endsWith( '[bot]' ) ) { 25 | core.info( `Skipping ${ t }, appears to be a bot` ); 26 | } else if ( t.startsWith( '@' ) ) { 27 | userReviews.push( t.slice( 1 ) ); 28 | } else { 29 | teamReviews.push( t ); 30 | } 31 | } 32 | 33 | try { 34 | await octokit.rest.pulls.requestReviewers( { 35 | owner: owner, 36 | repo: repo, 37 | pull_number: pr, 38 | reviewers: userReviews, 39 | team_reviewers: teamReviews, 40 | } ); 41 | core.info( `Requested review(s) from ${ teams }` ); 42 | } catch ( err ) { 43 | throw new Error( `Unable to request review.\n Error: ${ err }` ); 44 | } 45 | } 46 | 47 | module.exports = requestReviewer; 48 | -------------------------------------------------------------------------------- /action.yml: -------------------------------------------------------------------------------- 1 | name: Required Review 2 | description: Check that a Pull Request has reviews from required teams. 3 | branding: 4 | icon: 'user-check' 5 | color: 'green' 6 | inputs: 7 | requirements: 8 | description: > 9 | Requirements, as a string containing YAML. 10 | Either this or `requirements-file` is required. 11 | required: false 12 | requirements-file: 13 | description: > 14 | Requirements file. 15 | Either this or `requirements` is required. 16 | required: false 17 | status: 18 | description: Status context for the status check. 19 | required: false 20 | default: Required review 21 | fail: 22 | description: Fail the status check if a review is required. 23 | required: false 24 | type: boolean 25 | default: false 26 | request-reviews: 27 | description: > 28 | Automatically request reviews from teams or users needed to fulfill a requirement. 29 | required: false 30 | type: boolean 31 | default: false 32 | token: 33 | description: > 34 | GitHub Access Token. The user associated with this token will show up 35 | as the "creator" of the status check, and must have access to read 36 | pull request data, create status checks (`repo:status`), and to read 37 | your organization's teams (`read:org`). 38 | required: true 39 | outputs: 40 | requirements-satisfied: 41 | description: 'True if the review requirements are satisfied, false otherwise' 42 | teams-needed-for-review: 43 | description: 'JSON-stringified array of team names that are needed to review the PR.' 44 | runs: 45 | using: node24 46 | main: dist/index.js 47 | -------------------------------------------------------------------------------- /src/reporter.js: -------------------------------------------------------------------------------- 1 | const core = require( '@actions/core' ); 2 | const github = require( '@actions/github' ); 3 | const { WError } = require( 'error' ); 4 | 5 | const STATE_ERROR = 'error'; 6 | const STATE_FAILURE = 'failure'; 7 | const STATE_PENDING = 'pending'; 8 | const STATE_SUCCESS = 'success'; 9 | 10 | /** 11 | * Report a status check to GitHub. 12 | * 13 | * @param {string} state - One of the `STATE_*` constants. 14 | * @param {string} description - Description for the status. 15 | */ 16 | async function status( state, description ) { 17 | const octokit = github.getOctokit( core.getInput( 'token', { required: true } ) ); 18 | const owner = github.context.payload.repository.owner.login; 19 | const repo = github.context.payload.repository.name; 20 | const req = { 21 | owner: owner, 22 | repo: repo, 23 | sha: github.context.payload.pull_request.head.sha, 24 | state: state, 25 | target_url: `${ github.context.serverUrl }/${ owner }/${ repo }/actions/runs/${ github.context.runId }`, 26 | description: description, 27 | context: core.getInput( 'status', { required: true } ), 28 | }; 29 | 30 | if ( process.env.CI ) { 31 | await octokit.rest.repos.createCommitStatus( req ); 32 | } else { 33 | // eslint-disable-next-line no-console 34 | console.dir( req ); 35 | } 36 | } 37 | 38 | /** 39 | * Error class for friendly GitHub Action error reporting. 40 | * 41 | * Use it like 42 | * ``` 43 | * throw ReportError.create( 'Status description', originalError ); 44 | * ``` 45 | */ 46 | class ReportError extends WError {} 47 | 48 | module.exports = { 49 | STATE_ERROR: STATE_ERROR, 50 | STATE_FAILURE: STATE_FAILURE, 51 | STATE_PENDING: STATE_PENDING, 52 | STATE_SUCCESS: STATE_SUCCESS, 53 | status: status, 54 | ReportError: ReportError, 55 | }; 56 | module.exports.default = module.exports; 57 | -------------------------------------------------------------------------------- /src/team-members.js: -------------------------------------------------------------------------------- 1 | const core = require( '@actions/core' ); 2 | const github = require( '@actions/github' ); 3 | const { WError } = require( 'error' ); 4 | 5 | const cache = {}; 6 | 7 | /** 8 | * Fetch the members of a team for the purpose of verifying a review Requirement. 9 | * Special case: Names prefixed with @ are considered to be a one-member team with the named GitHub user. 10 | * 11 | * @param {string} team - GitHub team slug, or @ followed by a GitHub user name. 12 | * @return {string[]} Team members. 13 | */ 14 | async function fetchTeamMembers( team ) { 15 | if ( cache[ team ] ) { 16 | return cache[ team ]; 17 | } 18 | 19 | const octokit = github.getOctokit( core.getInput( 'token', { required: true } ) ); 20 | const org = github.context.payload.repository.owner.login; 21 | 22 | let members = []; 23 | if ( team.startsWith( '@' ) ) { 24 | // Handle @singleuser virtual teams. Fetch the correct username case from GitHub 25 | // to avoid having to worry about edge cases and Unicode versions and such. 26 | try { 27 | const res = await octokit.rest.users.getByUsername( { username: team.slice( 1 ) } ); 28 | members.push( res.data.login ); 29 | } catch ( error ) { 30 | throw new WError( 31 | // prettier-ignore 32 | `Failed to query user ${ team } from GitHub: ${ error.response?.data?.message || error.message }`, 33 | error, 34 | {} 35 | ); 36 | } 37 | } else { 38 | try { 39 | for await ( const res of octokit.paginate.iterator( octokit.rest.teams.listMembersInOrg, { 40 | org: org, 41 | team_slug: team, 42 | per_page: 100, 43 | } ) ) { 44 | members = members.concat( res.data.map( v => v.login ) ); 45 | } 46 | } catch ( error ) { 47 | throw new WError( 48 | // prettier-ignore 49 | `Failed to query ${ org } team ${ team } from GitHub: ${ error.response?.data?.message || error.message }`, 50 | error, 51 | {} 52 | ); 53 | } 54 | } 55 | 56 | cache[ team ] = members; 57 | return members; 58 | } 59 | 60 | module.exports = fetchTeamMembers; 61 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | Full details of the Automattic Security Policy can be found on [automattic.com](https://automattic.com/security/). 4 | 5 | ## Supported Versions 6 | 7 | Generally, only the latest version of Jetpack and its associated plugins have continued support. If a critical vulnerability is found in the current version of a plugin, we may opt to backport any patches to previous versions. 8 | 9 | ## Reporting a Vulnerability 10 | 11 | Our HackerOne program covers the below plugin software, as well as a variety of related projects and infrastructure: 12 | 13 | * [Jetpack](https://jetpack.com/) 14 | * Jetpack Backup 15 | * Jetpack Boost 16 | * Jetpack CRM 17 | * Jetpack Protect 18 | * Jetpack Search 19 | * Jetpack Social 20 | * Jetpack VideoPress 21 | 22 | **For responsible disclosure of security issues and to be eligible for our bug bounty program, please submit your report via the [HackerOne](https://hackerone.com/automattic) portal.** 23 | 24 | Our most critical targets are: 25 | 26 | * Jetpack and the Jetpack composer packages (all within this repo) 27 | * Jetpack.com -- the primary marketing site. 28 | * cloud.jetpack.com -- a management site. 29 | * wordpress.com -- the shared management site for both Jetpack and WordPress.com sites. 30 | 31 | For more targets, see the `In Scope` section on [HackerOne](https://hackerone.com/automattic). 32 | 33 | _Please note that the **WordPress software is a separate entity** from Automattic. Please report vulnerabilities for WordPress through [the WordPress Foundation's HackerOne page](https://hackerone.com/wordpress)._ 34 | 35 | ## Guidelines 36 | 37 | We're committed to working with security researchers to resolve the vulnerabilities they discover. You can help us by following these guidelines: 38 | 39 | * Follow [HackerOne's disclosure guidelines](https://www.hackerone.com/disclosure-guidelines). 40 | * Pen-testing Production: 41 | * Please **setup a local environment** instead whenever possible. Most of our code is open source (see above). 42 | * If that's not possible, **limit any data access/modification** to the bare minimum necessary to reproduce a PoC. 43 | * **_Don't_ automate form submissions!** That's very annoying for us, because it adds extra work for the volunteers who manage those systems, and reduces the signal/noise ratio in our communication channels. 44 | * To be eligible for a bounty, all of these guidelines must be followed. 45 | * Be Patient - Give us a reasonable time to correct the issue before you disclose the vulnerability. 46 | 47 | We also expect you to comply with all applicable laws. You're responsible to pay any taxes associated with your bounties. 48 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | const fs = require( 'fs' ); 2 | const core = require( '@actions/core' ); 3 | const yaml = require( 'js-yaml' ); 4 | const reporter = require( './reporter.js' ); 5 | const requestReview = require( './request-review.js' ); 6 | const Requirement = require( './requirement.js' ); 7 | 8 | /** 9 | * Load the requirements yaml file. 10 | * 11 | * @return {Requirement[]} Requirements. 12 | */ 13 | async function getRequirements() { 14 | let requirementsString = core.getInput( 'requirements' ); 15 | 16 | if ( ! requirementsString ) { 17 | const filename = core.getInput( 'requirements-file' ); 18 | if ( ! filename ) { 19 | throw new reporter.ReportError( 20 | 'Requirements are not found', 21 | new Error( 'Either `requirements` or `requirements-file` input is required' ), 22 | {} 23 | ); 24 | } 25 | 26 | try { 27 | requirementsString = fs.readFileSync( filename, 'utf8' ); 28 | } catch ( error ) { 29 | throw new reporter.ReportError( 30 | `Requirements file ${ filename } could not be read`, 31 | error, 32 | {} 33 | ); 34 | } 35 | } else if ( core.getInput( 'requirements-file' ) ) { 36 | core.warning( 'Ignoring input `requirements-file` because `requirements` was given' ); 37 | } 38 | 39 | try { 40 | const requirements = yaml.load( requirementsString, { 41 | onWarning: w => core.warning( `Yaml: ${ w.message }` ), 42 | } ); 43 | if ( ! Array.isArray( requirements ) ) { 44 | throw new Error( 'Requirements file does not contain an array' ); 45 | } 46 | 47 | return requirements.map( ( r, i ) => new Requirement( { name: `#${ i }`, ...r } ) ); 48 | } catch ( error ) { 49 | error[ Symbol.toStringTag ] = 'Error'; // Work around weird check in WError. 50 | throw new reporter.ReportError( 'Requirements are not valid', error, {} ); 51 | } 52 | } 53 | 54 | /** 55 | * Action entry point. 56 | */ 57 | async function main() { 58 | try { 59 | const requirements = await getRequirements(); 60 | core.startGroup( `Loaded ${ requirements.length } review requirement(s)` ); 61 | 62 | const reviewers = await require( './reviewers.js' )(); 63 | core.startGroup( `Found ${ reviewers.length } reviewer(s)` ); 64 | reviewers.forEach( r => core.info( r ) ); 65 | core.endGroup(); 66 | 67 | let paths = await require( './paths.js' )(); 68 | core.startGroup( `PR affects ${ paths.length } file(s)` ); 69 | paths.forEach( p => core.info( p ) ); 70 | core.endGroup(); 71 | 72 | let matchedPaths = []; 73 | const teamsNeededForReview = new Set(); 74 | for ( let i = 0; i < requirements.length; i++ ) { 75 | const r = requirements[ i ]; 76 | core.startGroup( `Checking requirement "${ r.name }"...` ); 77 | let applies; 78 | ( { applies, matchedPaths, paths } = r.appliesToPaths( paths, matchedPaths ) ); 79 | if ( ! applies ) { 80 | core.endGroup(); 81 | core.info( `Requirement "${ r.name }" does not apply to any files in this PR.` ); 82 | } else { 83 | const neededForRequirement = await r.needsReviewsFrom( reviewers ); 84 | core.endGroup(); 85 | if ( neededForRequirement.length === 0 ) { 86 | core.info( `Requirement "${ r.name }" is satisfied by the existing reviews.` ); 87 | } else { 88 | core.error( `Requirement "${ r.name }" is not satisfied by the existing reviews.` ); 89 | neededForRequirement.forEach( teamsNeededForReview.add, teamsNeededForReview ); 90 | } 91 | } 92 | } 93 | if ( teamsNeededForReview.size === 0 ) { 94 | await reporter.status( reporter.STATE_SUCCESS, 'All required reviews have been provided!' ); 95 | } else { 96 | await reporter.status( 97 | core.getBooleanInput( 'fail' ) ? reporter.STATE_FAILURE : reporter.STATE_PENDING, 98 | reviewers.length ? 'Awaiting more reviews...' : 'Awaiting reviews...' 99 | ); 100 | if ( core.getBooleanInput( 'request-reviews' ) ) { 101 | await requestReview( [ ...teamsNeededForReview ] ); 102 | } 103 | } 104 | core.setOutput( 'requirements-satisfied', teamsNeededForReview.size === 0 ); 105 | core.setOutput( 'teams-needed-for-review', [ ...teamsNeededForReview ] ); 106 | } catch ( error ) { 107 | let err, state, description; 108 | if ( error instanceof reporter.ReportError ) { 109 | err = error.cause(); 110 | state = reporter.STATE_FAILURE; 111 | description = error.message; 112 | } else { 113 | err = error; 114 | state = reporter.STATE_ERROR; 115 | description = 'Action encountered an error'; 116 | } 117 | core.setFailed( err.message ); 118 | core.info( err.stack ); 119 | if ( core.getInput( 'token' ) && core.getInput( 'status' ) ) { 120 | await reporter.status( state, description ); 121 | } 122 | core.setOutput( 'requirements-satisfied', false ); 123 | core.setOutput( 'teams-needed-for-review', [] ); 124 | } 125 | } 126 | 127 | main(); 128 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. 4 | 5 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) 6 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). 7 | 8 | ## [5.0.0-alpha] - unreleased 9 | 10 | This is an alpha version! The changes listed here are not final. 11 | 12 | ### Added 13 | - Action output: display the teams required for review in the action output. 14 | 15 | ### Changed 16 | - Update package dependencies. 17 | - Use the node24 runner instead of the deprecated node20 runner. 18 | 19 | ## [4.1.2] - 2025-09-08 20 | ### Changed 21 | - Update package dependencies. [#44217] 22 | 23 | ## [4.1.1] - 2025-07-04 24 | ### Changed 25 | - Update package dependencies. [#43407] 26 | 27 | ## [4.1.0] - 2025-04-02 28 | ### Added 29 | - Add `is-author-or-reviewer` condition. [#41966] 30 | 31 | ### Changed 32 | - Update package dependencies. [#41852] 33 | 34 | ### Fixed 35 | - Fix check for empty team lists. [#41966] 36 | 37 | ## [4.0.2] - 2025-01-09 38 | ### Changed 39 | - Update docs with permissions for GitHub Apps and fine-grained access tokens. [#40633] 40 | - Updated package dependencies. [#40806] 41 | 42 | ### Fixed 43 | - Avoid trying to request reviews from bot accounts. [#39895] 44 | 45 | ## [4.0.1] - 2024-08-29 46 | ### Changed 47 | - Updated package dependencies. [#36757] 48 | 49 | ### Fixed 50 | - Don't request review from the PR author. [#37653] 51 | 52 | ## [4.0.0] - 2024-02-07 53 | ### Added 54 | - Added support for GitHub Enterprise by replacing github.com with a dynamic variable [#32974] 55 | 56 | ### Changed 57 | - Updated package dependencies. [#33650] 58 | - Use the node20 runner instead of the deprecated node16 runner. [#35262] 59 | 60 | ## [3.1.0] - 2023-07-06 61 | ### Added 62 | - Added `consume` option for requirements. [#29317] 63 | - Option to request review if requirement is not satisfied. [#30653] 64 | 65 | ### Changed 66 | - Updated package dependencies. [#29855] 67 | 68 | ### Fixed 69 | - Don't fail on case mismatch for `@singleuser` pseudo-teams. [#29322] 70 | 71 | ## [3.0.2] - 2023-02-07 72 | ### Changed 73 | - Minor internal updates. 74 | 75 | ## [3.0.1] - 2022-10-28 76 | ### Added 77 | - Add optional input which fails review required status checks instead of leaving them pending. [#25091] 78 | - Tooling: enable automatic GitHub releases when a new version of the action is tagged, so the new version can be made available in the GitHub Actions marketplace. [#25935] 79 | 80 | ### Changed 81 | - Updated package dependencies. 82 | 83 | ### Fixed 84 | - Ignore reviews with state "COMMENTED" when determining whether a reviewer has approved or not [#26249] 85 | 86 | ## [3.0.0] - 2022-07-06 87 | ### Changed 88 | - Reorder JS imports for `import/order` eslint rule. [#24601] 89 | - The `token` parameter was effectively required, as the default `GITHUB_TOKEN` lacks the ability to read team membership. The parameter is now explicitly required. [#23995] 90 | - Updated package dependencies. [#24045, #24573] 91 | - Use the node16 runner instead of the deprecated node12 runner. [#23389] 92 | 93 | ### Fixed 94 | - Fix handling of re-reviews, only look at the latest review per user. [#24000] 95 | 96 | ## [2.2.2] - 2022-02-09 97 | ### Changed 98 | - Core: update description and metadata before to publish to marketplace. 99 | - General: update required node version to v16.13.2 100 | 101 | ## [2.2.1] - 2021-11-02 102 | ### Changed 103 | - Allow Node ^14.17.6 to be used in this project. This shouldn't change the behavior of the code itself. 104 | - Updated package dependencies. 105 | - Use Node 16.7.0 in tooling. This shouldn't change the behavior of the code itself. 106 | 107 | ## [2.2.0] - 2021-08-20 108 | ### Fixed 109 | - A negated pattern (other than the first) now removes previously-matched paths, rather than unexpectedly adding _all_ the paths that don't match the pattern. 110 | 111 | ## [2.1.0] - 2021-08-12 112 | ### Added 113 | - Added autotagger action to simplify releases 114 | - Added support for naming individual users as required reviewers 115 | - Created a changelog from the git history with help from [auto-changelog](https://www.npmjs.com/package/auto-changelog). 116 | 117 | ### Changed 118 | - Updated package dependencies 119 | - Updated `@actions/github` with attendent code adjustments. 120 | - Update node version requirement to 14.16.1 121 | 122 | ## [2.0.0] - 2021-02-03 123 | 124 | - Rewrite required-review action to add path-based requirements 125 | 126 | ## 1.0.0 - 2020-04-17 127 | 128 | - Initial release 129 | 130 | [5.0.0-alpha]: https://github.com/Automattic/action-required-review/compare/v4.1.2...v5.0.0-alpha 131 | [4.1.2]: https://github.com/Automattic/action-required-review/compare/v4.1.1...v4.1.2 132 | [4.1.1]: https://github.com/Automattic/action-required-review/compare/v4.1.0...v4.1.1 133 | [4.1.0]: https://github.com/Automattic/action-required-review/compare/v4.0.2...v4.1.0 134 | [4.0.2]: https://github.com/Automattic/action-required-review/compare/v4.0.1...v4.0.2 135 | [4.0.1]: https://github.com/Automattic/action-required-review/compare/v4.0.0...v4.0.1 136 | [4.0.0]: https://github.com/Automattic/action-required-review/compare/v3.1.0...v4.0.0 137 | [3.1.0]: https://github.com/Automattic/action-required-review/compare/v3.0.2...v3.1.0 138 | [3.0.2]: https://github.com/Automattic/action-required-review/compare/v3.0.1...v3.0.2 139 | [3.0.1]: https://github.com/Automattic/action-required-review/compare/v3.0.0...v3.0.1 140 | [3.0.0]: https://github.com/Automattic/action-required-review/compare/v2.2.2...v3.0.0 141 | [2.2.2]: https://github.com/Automattic/action-required-review/compare/v2.2.1...v2.2.2 142 | [2.2.1]: https://github.com/Automattic/action-required-review/compare/v2.2.0...v2.2.1 143 | [2.2.0]: https://github.com/Automattic/action-required-review/compare/v2.1.0...v2.2.0 144 | [2.1.0]: https://github.com/Automattic/action-required-review/compare/v2.0.0...v2.1.0 145 | [2.0.0]: https://github.com/Automattic/action-required-review/compare/v1...v2.0.0 146 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # GitHub Required Review Check 2 | 3 | This [Github Action](https://github.com/features/actions) will check that required reviewers have 4 | accepted the PR, setting a status check accordingly. 5 | 6 | ## Example 7 | 8 | ```yaml 9 | name: Required review check 10 | on: 11 | pull_request_review: 12 | pull_request: 13 | types: [ opened, reopened, synchronize ] 14 | 15 | jobs: 16 | check: 17 | name: Checking required reviews 18 | runs-on: ubuntu-latest 19 | 20 | # GitHub should provide a "pull_request_review_target", but they don't and 21 | # the action will fail if run on a forked PR. 22 | if: github.event.pull_request.head.repo.full_name == github.event.pull_request.base.repo.full_name 23 | 24 | steps: 25 | - uses: Automattic/action-required-review@v3 26 | with: 27 | token: ${{ secrets.REQUIRED_REVIEWS_TOKEN }} 28 | requirements: | 29 | - paths: unmatched 30 | teams: 31 | - maintenance 32 | ``` 33 | 34 | ## Usage 35 | 36 | This action is intended to be triggered by the `pull_request_review` event. 37 | 38 | ```yaml 39 | - uses: Automattic/action-required-review 40 | with: 41 | # Specify the requirements as a YAML string. See below for the format of this string. 42 | # The easiest way to generate this is probably to write your YAML, then put the `|` 43 | # after the key to make it a string. 44 | requirements: | 45 | - name: Docs 46 | paths: 47 | - 'docs/' 48 | teams: 49 | - documentation 50 | 51 | - name: Everything else 52 | paths: unmatched 53 | teams: 54 | - maintenance 55 | 56 | # Specify the path to the requirements file. See below for the format of 57 | # this file. 58 | requirements-file: .github/required-review.yaml 59 | 60 | # Specify the "context" for the status to set. This is what shows up in the 61 | # PR's checks list. 62 | status: Required review 63 | 64 | # By default, 'review required' statuses will be set to pending. Set 65 | # this to instead fail the status checks instead of leaving them pending. 66 | fail: true 67 | 68 | # By default required reviewers are not requested. Set this to true to 69 | # request reviews. 70 | request-reviews: true 71 | 72 | # GitHub Access Token. The user associated with this token will show up 73 | # as the "creator" of the status check, and must have the permissions 74 | # documented below. 75 | token: ${{ secrets.SOME_TOKEN }} 76 | ``` 77 | 78 | ### Permissions required 79 | 80 | This action needs access to read pull request data, request reviewers, create status checks, and to read your organization's teams. 81 | 82 | For OAuth apps and classic access tokens, that's `repo:status` and `read:org`. 83 | 84 | For GitHub Apps and fine-grained access tokens, that's read and write for repository "Commit statuses" (`statuses`) and "Pull requests" (`pull-requests`), and read-only for organization "Members". 85 | 86 | ### Outputs 87 | 88 | Ths action produces the following outputs: 89 | 90 | * `requirements-satisfied` is a boolean that is `true` if all requirements are satisfied, `false` otherwise. 91 | * `teams-needed-for-review` is a JSON-stringified array of team names that are needed to review the PR. 92 | 93 | These outputs can be used in subsequent steps in the workflow. Below is an example of commenting on the PR with the teams that are needed to review the PR. 94 | 95 | ```yaml 96 | name: Required review check 97 | on: 98 | pull_request_review: 99 | pull_request: 100 | types: [ opened, reopened, synchronize ] 101 | 102 | jobs: 103 | check: 104 | name: Checking required reviews 105 | runs-on: ubuntu-latest 106 | 107 | # GitHub should provide a "pull_request_review_target", but they don't and 108 | # the action will fail if run on a forked PR. 109 | if: github.event.pull_request.head.repo.full_name == github.event.pull_request.base.repo.full_name 110 | 111 | steps: 112 | - uses: Automattic/action-required-review@v3 113 | id: review-check 114 | with: 115 | token: ${{ secrets.REQUIRED_REVIEWS_TOKEN }} 116 | requirements: | 117 | - paths: unmatched 118 | teams: 119 | - maintenance 120 | 121 | - name: Comment on the PR 122 | if: ${{ review-check.outputs.requirements-satisfied == 'false' }} 123 | run: | 124 | teams_needed_for_review=$(echo "$TEAMS_NEEDED_FOR_REVIEW" | jq -r '. | join(", ")') 125 | gh pr comment ${{ github.event.pull_request.number }} -b "The following teams are needed to review the PR: $teams_needed_for_review" 126 | env: 127 | TEAMS_NEEDED_FOR_REVIEW: ${{ review-check.outputs.teams-needed-for-review }} 128 | ``` 129 | 130 | ## Requirements Format 131 | 132 | The requirements consist of an array of requirement objects. A requirement object has the following keys: 133 | 134 | * `name` is an optional informative name for the requirement. 135 | * `paths` is an array of path patterns, or the string "unmatched". If an array, the reviewers 136 | specified will be checked if any path in the array matches any path in the PR. If the string 137 | "unmatched", the reviewers are checked if any file in the PR has not been matched yet. 138 | * `consume` is a boolean, defaulting to false. If set, any paths that match this rule will be ignored 139 | for all following rules. 140 | 141 | This is intended for things like lockfiles or changelogs that you might want to allow everyone 142 | to edit in any package in a monorepo, to avoid having to manually exclude these files in every 143 | requirement for each different team owning some package. 144 | * `teams` is an array of strings that are GitHub team slugs in the organization or repository. A 145 | review is required from a member of any of these teams. 146 | 147 | Instead of a string, a single-keyed object may be specified. The key is `all-of`, `any-of`, or `is-author-or-reviewer`, and the value is an array as for `teams`. 148 | When the key is `all-of`, a review is required from every team (but if a person is a member of multiple teams, they can satisfy multiple requirements). 149 | When it's `any-of`, one review from any team is needed. 150 | When it's `is-author-or-reviewer`, it works like `any-of` but the author of the PR is considered to have self-reviewed. 151 | 152 | Additionally, you can specify a single user by prefixing their username with `@`. For example, 153 | `@example` will be treated as a virtual team with one member; `example`. 154 | 155 | Paths are matched using the [picomatch](https://www.npmjs.com/package/picomatch#globbing-features) library. 156 | 157 | Every requirement object that applies must have appropriate reviews, it's not "first match". Thus, 158 | using the example below, a PR touching file at docs/foo.css would need reviews satisfying both 159 | the "Docs" and "Front end" review requirements. If you wanted to avoid that, you might add 160 | `!**.css` to the first's paths or `!docs/**` to the second's. 161 | 162 | ### Example 163 | 164 | ```yaml 165 | # Documentation must be reviewed by the documentation team. 166 | - name: Docs 167 | paths: 168 | - 'docs/**' 169 | teams: 170 | - documentation 171 | 172 | # Everyone can update lockfiles, even if later rules might otherwise match. 173 | - name: Lockfiles 174 | paths: 175 | - 'packages/*/composer.lock' 176 | - '**.css' 177 | consume: true 178 | teams: 179 | - everyone 180 | 181 | # The "Some package" team must approve anything in `packages/some-package/`. 182 | # Except for changes to `packages/some-package/composer.lock`, because the previous requirement consumed that path. 183 | - name: Some package 184 | paths: 185 | - 'packages/some-package/**' 186 | teams: 187 | - some-package-team 188 | 189 | # Any CSS and React .jsx files must be reviewed by a front-end developer AND by a designer, 190 | # OR by a member of the maintenance team. 191 | - name: Front end 192 | paths: 193 | - '**.jsx' 194 | - '**.css' 195 | teams: 196 | - all-of: 197 | - front-end 198 | - design 199 | - maintenance 200 | 201 | # All other files must be reviewed by the maintenance team. 202 | - name: Misc 203 | paths: unmatched 204 | teams: 205 | - maintenance 206 | ``` 207 | -------------------------------------------------------------------------------- /src/requirement.js: -------------------------------------------------------------------------------- 1 | const assert = require( 'assert' ); 2 | const core = require( '@actions/core' ); 3 | const github = require( '@actions/github' ); 4 | const { SError } = require( 'error' ); 5 | const picomatch = require( 'picomatch' ); 6 | const fetchTeamMembers = require( './team-members.js' ); 7 | 8 | class RequirementError extends SError {} 9 | 10 | /** 11 | * Prints a result set, then returns it. 12 | * 13 | * @param {string} label - Label for the set. 14 | * @param {string[]} teamReviewers - Team members that have reviewed the file. If an empty array, will print `` instead. 15 | * @param {string[]} neededTeams - Teams that have no reviews from it's members. 16 | * @return {{teamReviewers, neededTeams}} `{teamReviewers, neededTeams}`. 17 | */ 18 | function printSet( label, teamReviewers, neededTeams ) { 19 | core.info( label + ' ' + ( teamReviewers.length ? teamReviewers.join( ', ' ) : '' ) ); 20 | return { teamReviewers, neededTeams }; 21 | } 22 | 23 | /** 24 | * Build a reviewer team membership filter. 25 | * 26 | * @param {object} config - Requirements configuration object being processed. 27 | * @param {Array|string|object} teamConfig - Team name, or single-key object with a list of teams/objects, or array of such. 28 | * @param {string} indent - String for indentation. 29 | * @return {Function} Function to filter an array of reviewers by membership in the team(s). 30 | */ 31 | function buildReviewerFilter( config, teamConfig, indent ) { 32 | if ( typeof teamConfig === 'string' ) { 33 | const team = teamConfig; 34 | return async function ( reviewers ) { 35 | const members = await fetchTeamMembers( team ); 36 | const teamReviewers = reviewers.filter( reviewer => members.includes( reviewer ) ); 37 | const neededTeams = teamReviewers.length ? [] : [ team ]; 38 | return printSet( `${ indent }Members of ${ team }:`, teamReviewers, neededTeams ); 39 | }; 40 | } 41 | 42 | let keys; 43 | try { 44 | keys = Object.keys( teamConfig ); 45 | assert( keys.length === 1 ); 46 | } catch { 47 | throw new RequirementError( 'Expected a team name or a single-keyed object.', { 48 | config: config, 49 | value: teamConfig, 50 | } ); 51 | } 52 | 53 | const op = keys[ 0 ]; 54 | let arg = teamConfig[ op ]; 55 | 56 | // Shared validation. 57 | switch ( op ) { 58 | case 'any-of': 59 | case 'all-of': 60 | case 'is-author-or-reviewer': 61 | // These ops require an array of teams/objects. 62 | if ( ! Array.isArray( arg ) ) { 63 | throw new RequirementError( `Expected an array of teams, got ${ typeof arg }`, { 64 | config: config, 65 | value: arg, 66 | } ); 67 | } 68 | if ( arg.length === 0 ) { 69 | throw new RequirementError( 'Expected a non-empty array of teams', { 70 | config: config, 71 | value: teamConfig, 72 | } ); 73 | } 74 | arg = arg.map( t => buildReviewerFilter( config, t, `${ indent } ` ) ); 75 | break; 76 | } 77 | 78 | // Process operations. 79 | if ( op === 'any-of' ) { 80 | return async function ( reviewers ) { 81 | core.info( `${ indent }Union of these:` ); 82 | const reviewersAny = await Promise.all( arg.map( f => f( reviewers, `${ indent } ` ) ) ); 83 | const requirementsMet = []; 84 | const neededTeams = []; 85 | for ( const requirementResult of reviewersAny ) { 86 | if ( requirementResult.teamReviewers.length !== 0 ) { 87 | requirementsMet.push( requirementResult.teamReviewers ); 88 | } 89 | if ( requirementResult.neededTeams.length !== 0 ) { 90 | neededTeams.push( requirementResult.neededTeams ); 91 | } 92 | } 93 | if ( requirementsMet.length > 0 ) { 94 | // If there are requirements met, zero out the needed teams 95 | neededTeams.length = 0; 96 | } 97 | return printSet( 98 | `${ indent }=>`, 99 | [ ...new Set( requirementsMet.flat( 1 ) ) ], 100 | [ ...new Set( neededTeams.flat( 1 ) ) ] 101 | ); 102 | }; 103 | } 104 | 105 | if ( op === 'all-of' ) { 106 | return async function ( reviewers ) { 107 | core.info( `${ indent }Union of these, if none are empty:` ); 108 | const reviewersAll = await Promise.all( arg.map( f => f( reviewers, `${ indent } ` ) ) ); 109 | const requirementsMet = []; 110 | const neededTeams = []; 111 | for ( const requirementResult of reviewersAll ) { 112 | if ( requirementResult.teamReviewers.length !== 0 ) { 113 | requirementsMet.push( requirementResult.teamReviewers ); 114 | } 115 | if ( requirementResult.neededTeams.length !== 0 ) { 116 | neededTeams.push( requirementResult.neededTeams ); 117 | } 118 | } 119 | if ( neededTeams.length !== 0 ) { 120 | // If there are needed teams, zero out requirements met 121 | return printSet( `${ indent }=>`, [], [ ...new Set( neededTeams.flat( 1 ) ) ] ); 122 | } 123 | return printSet( `${ indent }=>`, [ ...new Set( requirementsMet.flat( 1 ) ) ], [] ); 124 | }; 125 | } 126 | 127 | if ( op === 'is-author-or-reviewer' ) { 128 | return async function ( reviewers ) { 129 | core.info( `${ indent }Author or reviewers are union of these:` ); 130 | const authorOrReviewers = [ ...reviewers, github.context.payload.pull_request.user.login ]; 131 | const reviewersAny = await Promise.all( 132 | arg.map( f => f( authorOrReviewers, `${ indent } ` ) ) 133 | ); 134 | const requirementsMet = []; 135 | const neededTeams = []; 136 | for ( const requirementResult of reviewersAny ) { 137 | if ( requirementResult.teamReviewers.length !== 0 ) { 138 | requirementsMet.push( requirementResult.teamReviewers ); 139 | } 140 | if ( requirementResult.neededTeams.length !== 0 ) { 141 | neededTeams.push( requirementResult.neededTeams ); 142 | } 143 | } 144 | if ( requirementsMet.length > 0 ) { 145 | // If there are requirements met, zero out the needed teams 146 | neededTeams.length = 0; 147 | } 148 | return printSet( 149 | `${ indent }=>`, 150 | [ ...new Set( requirementsMet.flat( 1 ) ) ], 151 | [ ...new Set( neededTeams.flat( 1 ) ) ] 152 | ); 153 | }; 154 | } 155 | 156 | throw new RequirementError( `Unrecognized operation "${ op }"`, { 157 | config: config, 158 | value: teamConfig, 159 | } ); 160 | } 161 | 162 | /** 163 | * Class representing an individual requirement. 164 | */ 165 | class Requirement { 166 | /** 167 | * Constructor. 168 | * 169 | * @param {object} config - Object config 170 | * @param {string[]|string} config.paths - Paths this requirement applies to. Either an array of picomatch globs, or the string "unmatched". 171 | * @param {Array} config.teams - Team reviews requirements. 172 | * @param {boolean} config.consume - Whether matched paths should be ignored by later rules. 173 | */ 174 | constructor( config ) { 175 | this.name = config.name || 'Unnamed requirement'; 176 | 177 | if ( config.paths === 'unmatched' ) { 178 | this.pathsFilter = null; 179 | } else if ( 180 | Array.isArray( config.paths ) && 181 | config.paths.length > 0 && 182 | config.paths.every( v => typeof v === 'string' ) 183 | ) { 184 | // picomatch doesn't combine multiple negated patterns in a way that makes sense here: `!a` and `!b` will pass both `a` and `b` 185 | // because `a` matches `!b` and `b` matches `!a`. So instead we have to handle the negation ourself: test the (non-negated) patterns in order, 186 | // with the last match winning. If none match, the opposite of the first pattern's negation is what we need. 187 | const filters = config.paths.map( path => { 188 | if ( path.startsWith( '!' ) ) { 189 | return { 190 | negated: true, 191 | filter: picomatch( path.substring( 1 ), { dot: true, nonegate: true } ), 192 | }; 193 | } 194 | return { 195 | negated: false, 196 | filter: picomatch( path, { dot: true } ), 197 | }; 198 | } ); 199 | const first = filters.shift(); 200 | this.pathsFilter = v => { 201 | let ret = first.filter( v ) ? ! first.negated : first.negated; 202 | for ( const filter of filters ) { 203 | if ( filter.filter( v ) ) { 204 | ret = ! filter.negated; 205 | } 206 | } 207 | return ret; 208 | }; 209 | } else { 210 | throw new RequirementError( 211 | 'Paths must be a non-empty array of strings, or the string "unmatched".', 212 | { 213 | config: config, 214 | } 215 | ); 216 | } 217 | 218 | this.reviewerFilter = buildReviewerFilter( config, { 'any-of': config.teams }, ' ' ); 219 | this.consume = !! config.consume; 220 | } 221 | 222 | // eslint-disable-next-line jsdoc/require-returns, jsdoc/require-returns-check -- Doesn't support documentation of object structure. 223 | /** 224 | * Test whether this requirement applies to the passed paths. 225 | * 226 | * @param {string[]} paths - Paths to test against. 227 | * @param {string[]} matchedPaths - Paths that have already been matched. 228 | * @return {object} _ Results object. 229 | * @return {boolean} _.applies Whether the requirement applies. 230 | * @return {string[]} _.matchedPaths New value for `matchedPaths`. 231 | * @return {string[]} _.paths New value for `paths`. 232 | */ 233 | appliesToPaths( paths, matchedPaths ) { 234 | let matches; 235 | if ( this.pathsFilter ) { 236 | matches = paths.filter( p => this.pathsFilter( p ) ); 237 | } else { 238 | matches = paths.filter( p => ! matchedPaths.includes( p ) ); 239 | if ( matches.length === 0 ) { 240 | core.info( "Matches files that haven't been matched yet, but all files have." ); 241 | } 242 | } 243 | 244 | const ret = { 245 | applies: matches.length !== 0, 246 | matchedPaths, 247 | paths, 248 | }; 249 | 250 | if ( ret.applies ) { 251 | core.info( 'Matches the following files:' ); 252 | matches.forEach( m => core.info( ` - ${ m }` ) ); 253 | ret.matchedPaths = [ ...new Set( [ ...matchedPaths, ...matches ] ) ].sort(); 254 | 255 | if ( this.consume ) { 256 | core.info( 'Consuming matched files!' ); 257 | ret.paths = ret.paths.filter( p => ! matches.includes( p ) ); 258 | } 259 | } 260 | 261 | return ret; 262 | } 263 | 264 | /** 265 | * Test whether this requirement is satisfied. 266 | * 267 | * @param {string[]} reviewers - Reviewers to test against. 268 | * @return {string[]} Array of teams from which review is still needed. 269 | */ 270 | async needsReviewsFrom( reviewers ) { 271 | core.info( 'Checking reviewers...' ); 272 | const checkNeededTeams = await this.reviewerFilter( reviewers ); 273 | return checkNeededTeams.neededTeams; 274 | } 275 | } 276 | 277 | module.exports = Requirement; 278 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | This program is free software; you can redistribute it and/or modify 2 | it under the terms of the GNU General Public License as published by 3 | the Free Software Foundation; either version 2 of the License, or 4 | (at your option) any later version. 5 | 6 | This program is distributed in the hope that it will be useful, 7 | but WITHOUT ANY WARRANTY; without even the implied warranty of 8 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 9 | GNU General Public License for more details. 10 | 11 | You should have received a copy of the GNU General Public License 12 | along with this program; if not, see . 13 | 14 | 15 | =================================== 16 | 17 | 18 | GNU GENERAL PUBLIC LICENSE 19 | Version 2, June 1991 20 | 21 | Copyright (C) 1989, 1991 Free Software Foundation, Inc., 22 | 23 | Everyone is permitted to copy and distribute verbatim copies 24 | of this license document, but changing it is not allowed. 25 | 26 | Preamble 27 | 28 | The licenses for most software are designed to take away your 29 | freedom to share and change it. By contrast, the GNU General Public 30 | License is intended to guarantee your freedom to share and change free 31 | software--to make sure the software is free for all its users. This 32 | General Public License applies to most of the Free Software 33 | Foundation's software and to any other program whose authors commit to 34 | using it. (Some other Free Software Foundation software is covered by 35 | the GNU Lesser General Public License instead.) You can apply it to 36 | your programs, too. 37 | 38 | When we speak of free software, we are referring to freedom, not 39 | price. Our General Public Licenses are designed to make sure that you 40 | have the freedom to distribute copies of free software (and charge for 41 | this service if you wish), that you receive source code or can get it 42 | if you want it, that you can change the software or use pieces of it 43 | in new free programs; and that you know you can do these things. 44 | 45 | To protect your rights, we need to make restrictions that forbid 46 | anyone to deny you these rights or to ask you to surrender the rights. 47 | These restrictions translate to certain responsibilities for you if you 48 | distribute copies of the software, or if you modify it. 49 | 50 | For example, if you distribute copies of such a program, whether 51 | gratis or for a fee, you must give the recipients all the rights that 52 | you have. You must make sure that they, too, receive or can get the 53 | source code. And you must show them these terms so they know their 54 | rights. 55 | 56 | We protect your rights with two steps: (1) copyright the software, and 57 | (2) offer you this license which gives you legal permission to copy, 58 | distribute and/or modify the software. 59 | 60 | Also, for each author's protection and ours, we want to make certain 61 | that everyone understands that there is no warranty for this free 62 | software. If the software is modified by someone else and passed on, we 63 | want its recipients to know that what they have is not the original, so 64 | that any problems introduced by others will not reflect on the original 65 | authors' reputations. 66 | 67 | Finally, any free program is threatened constantly by software 68 | patents. We wish to avoid the danger that redistributors of a free 69 | program will individually obtain patent licenses, in effect making the 70 | program proprietary. To prevent this, we have made it clear that any 71 | patent must be licensed for everyone's free use or not licensed at all. 72 | 73 | The precise terms and conditions for copying, distribution and 74 | modification follow. 75 | 76 | GNU GENERAL PUBLIC LICENSE 77 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 78 | 79 | 0. This License applies to any program or other work which contains 80 | a notice placed by the copyright holder saying it may be distributed 81 | under the terms of this General Public License. The "Program", below, 82 | refers to any such program or work, and a "work based on the Program" 83 | means either the Program or any derivative work under copyright law: 84 | that is to say, a work containing the Program or a portion of it, 85 | either verbatim or with modifications and/or translated into another 86 | language. (Hereinafter, translation is included without limitation in 87 | the term "modification".) Each licensee is addressed as "you". 88 | 89 | Activities other than copying, distribution and modification are not 90 | covered by this License; they are outside its scope. The act of 91 | running the Program is not restricted, and the output from the Program 92 | is covered only if its contents constitute a work based on the 93 | Program (independent of having been made by running the Program). 94 | Whether that is true depends on what the Program does. 95 | 96 | 1. You may copy and distribute verbatim copies of the Program's 97 | source code as you receive it, in any medium, provided that you 98 | conspicuously and appropriately publish on each copy an appropriate 99 | copyright notice and disclaimer of warranty; keep intact all the 100 | notices that refer to this License and to the absence of any warranty; 101 | and give any other recipients of the Program a copy of this License 102 | along with the Program. 103 | 104 | You may charge a fee for the physical act of transferring a copy, and 105 | you may at your option offer warranty protection in exchange for a fee. 106 | 107 | 2. You may modify your copy or copies of the Program or any portion 108 | of it, thus forming a work based on the Program, and copy and 109 | distribute such modifications or work under the terms of Section 1 110 | above, provided that you also meet all of these conditions: 111 | 112 | a) You must cause the modified files to carry prominent notices 113 | stating that you changed the files and the date of any change. 114 | 115 | b) You must cause any work that you distribute or publish, that in 116 | whole or in part contains or is derived from the Program or any 117 | part thereof, to be licensed as a whole at no charge to all third 118 | parties under the terms of this License. 119 | 120 | c) If the modified program normally reads commands interactively 121 | when run, you must cause it, when started running for such 122 | interactive use in the most ordinary way, to print or display an 123 | announcement including an appropriate copyright notice and a 124 | notice that there is no warranty (or else, saying that you provide 125 | a warranty) and that users may redistribute the program under 126 | these conditions, and telling the user how to view a copy of this 127 | License. (Exception: if the Program itself is interactive but 128 | does not normally print such an announcement, your work based on 129 | the Program is not required to print an announcement.) 130 | 131 | These requirements apply to the modified work as a whole. If 132 | identifiable sections of that work are not derived from the Program, 133 | and can be reasonably considered independent and separate works in 134 | themselves, then this License, and its terms, do not apply to those 135 | sections when you distribute them as separate works. But when you 136 | distribute the same sections as part of a whole which is a work based 137 | on the Program, the distribution of the whole must be on the terms of 138 | this License, whose permissions for other licensees extend to the 139 | entire whole, and thus to each and every part regardless of who wrote it. 140 | 141 | Thus, it is not the intent of this section to claim rights or contest 142 | your rights to work written entirely by you; rather, the intent is to 143 | exercise the right to control the distribution of derivative or 144 | collective works based on the Program. 145 | 146 | In addition, mere aggregation of another work not based on the Program 147 | with the Program (or with a work based on the Program) on a volume of 148 | a storage or distribution medium does not bring the other work under 149 | the scope of this License. 150 | 151 | 3. You may copy and distribute the Program (or a work based on it, 152 | under Section 2) in object code or executable form under the terms of 153 | Sections 1 and 2 above provided that you also do one of the following: 154 | 155 | a) Accompany it with the complete corresponding machine-readable 156 | source code, which must be distributed under the terms of Sections 157 | 1 and 2 above on a medium customarily used for software interchange; or, 158 | 159 | b) Accompany it with a written offer, valid for at least three 160 | years, to give any third party, for a charge no more than your 161 | cost of physically performing source distribution, a complete 162 | machine-readable copy of the corresponding source code, to be 163 | distributed under the terms of Sections 1 and 2 above on a medium 164 | customarily used for software interchange; or, 165 | 166 | c) Accompany it with the information you received as to the offer 167 | to distribute corresponding source code. (This alternative is 168 | allowed only for noncommercial distribution and only if you 169 | received the program in object code or executable form with such 170 | an offer, in accord with Subsection b above.) 171 | 172 | The source code for a work means the preferred form of the work for 173 | making modifications to it. For an executable work, complete source 174 | code means all the source code for all modules it contains, plus any 175 | associated interface definition files, plus the scripts used to 176 | control compilation and installation of the executable. However, as a 177 | special exception, the source code distributed need not include 178 | anything that is normally distributed (in either source or binary 179 | form) with the major components (compiler, kernel, and so on) of the 180 | operating system on which the executable runs, unless that component 181 | itself accompanies the executable. 182 | 183 | If distribution of executable or object code is made by offering 184 | access to copy from a designated place, then offering equivalent 185 | access to copy the source code from the same place counts as 186 | distribution of the source code, even though third parties are not 187 | compelled to copy the source along with the object code. 188 | 189 | 4. You may not copy, modify, sublicense, or distribute the Program 190 | except as expressly provided under this License. Any attempt 191 | otherwise to copy, modify, sublicense or distribute the Program is 192 | void, and will automatically terminate your rights under this License. 193 | However, parties who have received copies, or rights, from you under 194 | this License will not have their licenses terminated so long as such 195 | parties remain in full compliance. 196 | 197 | 5. You are not required to accept this License, since you have not 198 | signed it. However, nothing else grants you permission to modify or 199 | distribute the Program or its derivative works. These actions are 200 | prohibited by law if you do not accept this License. Therefore, by 201 | modifying or distributing the Program (or any work based on the 202 | Program), you indicate your acceptance of this License to do so, and 203 | all its terms and conditions for copying, distributing or modifying 204 | the Program or works based on it. 205 | 206 | 6. Each time you redistribute the Program (or any work based on the 207 | Program), the recipient automatically receives a license from the 208 | original licensor to copy, distribute or modify the Program subject to 209 | these terms and conditions. You may not impose any further 210 | restrictions on the recipients' exercise of the rights granted herein. 211 | You are not responsible for enforcing compliance by third parties to 212 | this License. 213 | 214 | 7. If, as a consequence of a court judgment or allegation of patent 215 | infringement or for any other reason (not limited to patent issues), 216 | conditions are imposed on you (whether by court order, agreement or 217 | otherwise) that contradict the conditions of this License, they do not 218 | excuse you from the conditions of this License. If you cannot 219 | distribute so as to satisfy simultaneously your obligations under this 220 | License and any other pertinent obligations, then as a consequence you 221 | may not distribute the Program at all. For example, if a patent 222 | license would not permit royalty-free redistribution of the Program by 223 | all those who receive copies directly or indirectly through you, then 224 | the only way you could satisfy both it and this License would be to 225 | refrain entirely from distribution of the Program. 226 | 227 | If any portion of this section is held invalid or unenforceable under 228 | any particular circumstance, the balance of the section is intended to 229 | apply and the section as a whole is intended to apply in other 230 | circumstances. 231 | 232 | It is not the purpose of this section to induce you to infringe any 233 | patents or other property right claims or to contest validity of any 234 | such claims; this section has the sole purpose of protecting the 235 | integrity of the free software distribution system, which is 236 | implemented by public license practices. Many people have made 237 | generous contributions to the wide range of software distributed 238 | through that system in reliance on consistent application of that 239 | system; it is up to the author/donor to decide if he or she is willing 240 | to distribute software through any other system and a licensee cannot 241 | impose that choice. 242 | 243 | This section is intended to make thoroughly clear what is believed to 244 | be a consequence of the rest of this License. 245 | 246 | 8. If the distribution and/or use of the Program is restricted in 247 | certain countries either by patents or by copyrighted interfaces, the 248 | original copyright holder who places the Program under this License 249 | may add an explicit geographical distribution limitation excluding 250 | those countries, so that distribution is permitted only in or among 251 | countries not thus excluded. In such case, this License incorporates 252 | the limitation as if written in the body of this License. 253 | 254 | 9. The Free Software Foundation may publish revised and/or new versions 255 | of the General Public License from time to time. Such new versions will 256 | be similar in spirit to the present version, but may differ in detail to 257 | address new problems or concerns. 258 | 259 | Each version is given a distinguishing version number. If the Program 260 | specifies a version number of this License which applies to it and "any 261 | later version", you have the option of following the terms and conditions 262 | either of that version or of any later version published by the Free 263 | Software Foundation. If the Program does not specify a version number of 264 | this License, you may choose any version ever published by the Free Software 265 | Foundation. 266 | 267 | 10. If you wish to incorporate parts of the Program into other free 268 | programs whose distribution conditions are different, write to the author 269 | to ask for permission. For software which is copyrighted by the Free 270 | Software Foundation, write to the Free Software Foundation; we sometimes 271 | make exceptions for this. Our decision will be guided by the two goals 272 | of preserving the free status of all derivatives of our free software and 273 | of promoting the sharing and reuse of software generally. 274 | 275 | NO WARRANTY 276 | 277 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 278 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN 279 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 280 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 281 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 282 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS 283 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE 284 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, 285 | REPAIR OR CORRECTION. 286 | 287 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 288 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR 289 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 290 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING 291 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED 292 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY 293 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER 294 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 295 | POSSIBILITY OF SUCH DAMAGES. 296 | 297 | END OF TERMS AND CONDITIONS 298 | 299 | How to Apply These Terms to Your New Programs 300 | 301 | If you develop a new program, and you want it to be of the greatest 302 | possible use to the public, the best way to achieve this is to make it 303 | free software which everyone can redistribute and change under these terms. 304 | 305 | To do so, attach the following notices to the program. It is safest 306 | to attach them to the start of each source file to most effectively 307 | convey the exclusion of warranty; and each file should have at least 308 | the "copyright" line and a pointer to where the full notice is found. 309 | 310 | 311 | Copyright (C) 312 | 313 | This program is free software; you can redistribute it and/or modify 314 | it under the terms of the GNU General Public License as published by 315 | the Free Software Foundation; either version 2 of the License, or 316 | (at your option) any later version. 317 | 318 | This program is distributed in the hope that it will be useful, 319 | but WITHOUT ANY WARRANTY; without even the implied warranty of 320 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 321 | GNU General Public License for more details. 322 | 323 | You should have received a copy of the GNU General Public License along 324 | with this program; if not, see . 325 | 326 | Also add information on how to contact you by electronic and paper mail. 327 | 328 | If the program is interactive, make it output a short notice like this 329 | when it starts in an interactive mode: 330 | 331 | Gnomovision version 69, Copyright (C) year name of author 332 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 333 | This is free software, and you are welcome to redistribute it 334 | under certain conditions; type `show c' for details. 335 | 336 | The hypothetical commands `show w' and `show c' should show the appropriate 337 | parts of the General Public License. Of course, the commands you use may 338 | be called something other than `show w' and `show c'; they could even be 339 | mouse-clicks or menu items--whatever suits your program. 340 | 341 | You should also get your employer (if you work as a programmer) or your 342 | school, if any, to sign a "copyright disclaimer" for the program, if 343 | necessary. Here is a sample; alter the names: 344 | 345 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program 346 | `Gnomovision' (which makes passes at compilers) written by James Hacker. 347 | 348 | , 1 April 1989 349 | Moe Ghoul, President of Vice 350 | 351 | This General Public License does not permit incorporating your program into 352 | proprietary programs. If your program is a subroutine library, you may 353 | consider it more useful to permit linking proprietary applications with the 354 | library. If this is what you want to do, use the GNU Lesser General 355 | Public License instead of this License. 356 | -------------------------------------------------------------------------------- /dist/sourcemap-register.js: -------------------------------------------------------------------------------- 1 | (()=>{var e={650:e=>{var r=Object.prototype.toString;var n=typeof Buffer.alloc==="function"&&typeof Buffer.allocUnsafe==="function"&&typeof Buffer.from==="function";function isArrayBuffer(e){return r.call(e).slice(8,-1)==="ArrayBuffer"}function fromArrayBuffer(e,r,t){r>>>=0;var o=e.byteLength-r;if(o<0){throw new RangeError("'offset' is out of bounds")}if(t===undefined){t=o}else{t>>>=0;if(t>o){throw new RangeError("'length' is out of bounds")}}return n?Buffer.from(e.slice(r,r+t)):new Buffer(new Uint8Array(e.slice(r,r+t)))}function fromString(e,r){if(typeof r!=="string"||r===""){r="utf8"}if(!Buffer.isEncoding(r)){throw new TypeError('"encoding" must be a valid string encoding')}return n?Buffer.from(e,r):new Buffer(e,r)}function bufferFrom(e,r,t){if(typeof e==="number"){throw new TypeError('"value" argument must not be a number')}if(isArrayBuffer(e)){return fromArrayBuffer(e,r,t)}if(typeof e==="string"){return fromString(e,r)}return n?Buffer.from(e):new Buffer(e)}e.exports=bufferFrom},274:(e,r,n)=>{var t=n(339);var o=Object.prototype.hasOwnProperty;var i=typeof Map!=="undefined";function ArraySet(){this._array=[];this._set=i?new Map:Object.create(null)}ArraySet.fromArray=function ArraySet_fromArray(e,r){var n=new ArraySet;for(var t=0,o=e.length;t=0){return r}}else{var n=t.toSetString(e);if(o.call(this._set,n)){return this._set[n]}}throw new Error('"'+e+'" is not in the set.')};ArraySet.prototype.at=function ArraySet_at(e){if(e>=0&&e{var t=n(190);var o=5;var i=1<>1;return r?-n:n}r.encode=function base64VLQ_encode(e){var r="";var n;var i=toVLQSigned(e);do{n=i&a;i>>>=o;if(i>0){n|=u}r+=t.encode(n)}while(i>0);return r};r.decode=function base64VLQ_decode(e,r,n){var i=e.length;var s=0;var l=0;var c,p;do{if(r>=i){throw new Error("Expected more digits in base 64 VLQ value.")}p=t.decode(e.charCodeAt(r++));if(p===-1){throw new Error("Invalid base64 digit: "+e.charAt(r-1))}c=!!(p&u);p&=a;s=s+(p<{var n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split("");r.encode=function(e){if(0<=e&&e{r.GREATEST_LOWER_BOUND=1;r.LEAST_UPPER_BOUND=2;function recursiveSearch(e,n,t,o,i,a){var u=Math.floor((n-e)/2)+e;var s=i(t,o[u],true);if(s===0){return u}else if(s>0){if(n-u>1){return recursiveSearch(u,n,t,o,i,a)}if(a==r.LEAST_UPPER_BOUND){return n1){return recursiveSearch(e,u,t,o,i,a)}if(a==r.LEAST_UPPER_BOUND){return u}else{return e<0?-1:e}}}r.search=function search(e,n,t,o){if(n.length===0){return-1}var i=recursiveSearch(-1,n.length,e,n,t,o||r.GREATEST_LOWER_BOUND);if(i<0){return-1}while(i-1>=0){if(t(n[i],n[i-1],true)!==0){break}--i}return i}},680:(e,r,n)=>{var t=n(339);function generatedPositionAfter(e,r){var n=e.generatedLine;var o=r.generatedLine;var i=e.generatedColumn;var a=r.generatedColumn;return o>n||o==n&&a>=i||t.compareByGeneratedPositionsInflated(e,r)<=0}function MappingList(){this._array=[];this._sorted=true;this._last={generatedLine:-1,generatedColumn:0}}MappingList.prototype.unsortedForEach=function MappingList_forEach(e,r){this._array.forEach(e,r)};MappingList.prototype.add=function MappingList_add(e){if(generatedPositionAfter(this._last,e)){this._last=e;this._array.push(e)}else{this._sorted=false;this._array.push(e)}};MappingList.prototype.toArray=function MappingList_toArray(){if(!this._sorted){this._array.sort(t.compareByGeneratedPositionsInflated);this._sorted=true}return this._array};r.H=MappingList},758:(e,r)=>{function swap(e,r,n){var t=e[r];e[r]=e[n];e[n]=t}function randomIntInRange(e,r){return Math.round(e+Math.random()*(r-e))}function doQuickSort(e,r,n,t){if(n{var t;var o=n(339);var i=n(345);var a=n(274).I;var u=n(449);var s=n(758).U;function SourceMapConsumer(e,r){var n=e;if(typeof e==="string"){n=o.parseSourceMapInput(e)}return n.sections!=null?new IndexedSourceMapConsumer(n,r):new BasicSourceMapConsumer(n,r)}SourceMapConsumer.fromSourceMap=function(e,r){return BasicSourceMapConsumer.fromSourceMap(e,r)};SourceMapConsumer.prototype._version=3;SourceMapConsumer.prototype.__generatedMappings=null;Object.defineProperty(SourceMapConsumer.prototype,"_generatedMappings",{configurable:true,enumerable:true,get:function(){if(!this.__generatedMappings){this._parseMappings(this._mappings,this.sourceRoot)}return this.__generatedMappings}});SourceMapConsumer.prototype.__originalMappings=null;Object.defineProperty(SourceMapConsumer.prototype,"_originalMappings",{configurable:true,enumerable:true,get:function(){if(!this.__originalMappings){this._parseMappings(this._mappings,this.sourceRoot)}return this.__originalMappings}});SourceMapConsumer.prototype._charIsMappingSeparator=function SourceMapConsumer_charIsMappingSeparator(e,r){var n=e.charAt(r);return n===";"||n===","};SourceMapConsumer.prototype._parseMappings=function SourceMapConsumer_parseMappings(e,r){throw new Error("Subclasses must implement _parseMappings")};SourceMapConsumer.GENERATED_ORDER=1;SourceMapConsumer.ORIGINAL_ORDER=2;SourceMapConsumer.GREATEST_LOWER_BOUND=1;SourceMapConsumer.LEAST_UPPER_BOUND=2;SourceMapConsumer.prototype.eachMapping=function SourceMapConsumer_eachMapping(e,r,n){var t=r||null;var i=n||SourceMapConsumer.GENERATED_ORDER;var a;switch(i){case SourceMapConsumer.GENERATED_ORDER:a=this._generatedMappings;break;case SourceMapConsumer.ORIGINAL_ORDER:a=this._originalMappings;break;default:throw new Error("Unknown order of iteration.")}var u=this.sourceRoot;a.map((function(e){var r=e.source===null?null:this._sources.at(e.source);r=o.computeSourceURL(u,r,this._sourceMapURL);return{source:r,generatedLine:e.generatedLine,generatedColumn:e.generatedColumn,originalLine:e.originalLine,originalColumn:e.originalColumn,name:e.name===null?null:this._names.at(e.name)}}),this).forEach(e,t)};SourceMapConsumer.prototype.allGeneratedPositionsFor=function SourceMapConsumer_allGeneratedPositionsFor(e){var r=o.getArg(e,"line");var n={source:o.getArg(e,"source"),originalLine:r,originalColumn:o.getArg(e,"column",0)};n.source=this._findSourceIndex(n.source);if(n.source<0){return[]}var t=[];var a=this._findMapping(n,this._originalMappings,"originalLine","originalColumn",o.compareByOriginalPositions,i.LEAST_UPPER_BOUND);if(a>=0){var u=this._originalMappings[a];if(e.column===undefined){var s=u.originalLine;while(u&&u.originalLine===s){t.push({line:o.getArg(u,"generatedLine",null),column:o.getArg(u,"generatedColumn",null),lastColumn:o.getArg(u,"lastGeneratedColumn",null)});u=this._originalMappings[++a]}}else{var l=u.originalColumn;while(u&&u.originalLine===r&&u.originalColumn==l){t.push({line:o.getArg(u,"generatedLine",null),column:o.getArg(u,"generatedColumn",null),lastColumn:o.getArg(u,"lastGeneratedColumn",null)});u=this._originalMappings[++a]}}}return t};r.SourceMapConsumer=SourceMapConsumer;function BasicSourceMapConsumer(e,r){var n=e;if(typeof e==="string"){n=o.parseSourceMapInput(e)}var t=o.getArg(n,"version");var i=o.getArg(n,"sources");var u=o.getArg(n,"names",[]);var s=o.getArg(n,"sourceRoot",null);var l=o.getArg(n,"sourcesContent",null);var c=o.getArg(n,"mappings");var p=o.getArg(n,"file",null);if(t!=this._version){throw new Error("Unsupported version: "+t)}if(s){s=o.normalize(s)}i=i.map(String).map(o.normalize).map((function(e){return s&&o.isAbsolute(s)&&o.isAbsolute(e)?o.relative(s,e):e}));this._names=a.fromArray(u.map(String),true);this._sources=a.fromArray(i,true);this._absoluteSources=this._sources.toArray().map((function(e){return o.computeSourceURL(s,e,r)}));this.sourceRoot=s;this.sourcesContent=l;this._mappings=c;this._sourceMapURL=r;this.file=p}BasicSourceMapConsumer.prototype=Object.create(SourceMapConsumer.prototype);BasicSourceMapConsumer.prototype.consumer=SourceMapConsumer;BasicSourceMapConsumer.prototype._findSourceIndex=function(e){var r=e;if(this.sourceRoot!=null){r=o.relative(this.sourceRoot,r)}if(this._sources.has(r)){return this._sources.indexOf(r)}var n;for(n=0;n1){v.source=l+_[1];l+=_[1];v.originalLine=i+_[2];i=v.originalLine;v.originalLine+=1;v.originalColumn=a+_[3];a=v.originalColumn;if(_.length>4){v.name=c+_[4];c+=_[4]}}m.push(v);if(typeof v.originalLine==="number"){d.push(v)}}}s(m,o.compareByGeneratedPositionsDeflated);this.__generatedMappings=m;s(d,o.compareByOriginalPositions);this.__originalMappings=d};BasicSourceMapConsumer.prototype._findMapping=function SourceMapConsumer_findMapping(e,r,n,t,o,a){if(e[n]<=0){throw new TypeError("Line must be greater than or equal to 1, got "+e[n])}if(e[t]<0){throw new TypeError("Column must be greater than or equal to 0, got "+e[t])}return i.search(e,r,o,a)};BasicSourceMapConsumer.prototype.computeColumnSpans=function SourceMapConsumer_computeColumnSpans(){for(var e=0;e=0){var t=this._generatedMappings[n];if(t.generatedLine===r.generatedLine){var i=o.getArg(t,"source",null);if(i!==null){i=this._sources.at(i);i=o.computeSourceURL(this.sourceRoot,i,this._sourceMapURL)}var a=o.getArg(t,"name",null);if(a!==null){a=this._names.at(a)}return{source:i,line:o.getArg(t,"originalLine",null),column:o.getArg(t,"originalColumn",null),name:a}}}return{source:null,line:null,column:null,name:null}};BasicSourceMapConsumer.prototype.hasContentsOfAllSources=function BasicSourceMapConsumer_hasContentsOfAllSources(){if(!this.sourcesContent){return false}return this.sourcesContent.length>=this._sources.size()&&!this.sourcesContent.some((function(e){return e==null}))};BasicSourceMapConsumer.prototype.sourceContentFor=function SourceMapConsumer_sourceContentFor(e,r){if(!this.sourcesContent){return null}var n=this._findSourceIndex(e);if(n>=0){return this.sourcesContent[n]}var t=e;if(this.sourceRoot!=null){t=o.relative(this.sourceRoot,t)}var i;if(this.sourceRoot!=null&&(i=o.urlParse(this.sourceRoot))){var a=t.replace(/^file:\/\//,"");if(i.scheme=="file"&&this._sources.has(a)){return this.sourcesContent[this._sources.indexOf(a)]}if((!i.path||i.path=="/")&&this._sources.has("/"+t)){return this.sourcesContent[this._sources.indexOf("/"+t)]}}if(r){return null}else{throw new Error('"'+t+'" is not in the SourceMap.')}};BasicSourceMapConsumer.prototype.generatedPositionFor=function SourceMapConsumer_generatedPositionFor(e){var r=o.getArg(e,"source");r=this._findSourceIndex(r);if(r<0){return{line:null,column:null,lastColumn:null}}var n={source:r,originalLine:o.getArg(e,"line"),originalColumn:o.getArg(e,"column")};var t=this._findMapping(n,this._originalMappings,"originalLine","originalColumn",o.compareByOriginalPositions,o.getArg(e,"bias",SourceMapConsumer.GREATEST_LOWER_BOUND));if(t>=0){var i=this._originalMappings[t];if(i.source===n.source){return{line:o.getArg(i,"generatedLine",null),column:o.getArg(i,"generatedColumn",null),lastColumn:o.getArg(i,"lastGeneratedColumn",null)}}}return{line:null,column:null,lastColumn:null}};t=BasicSourceMapConsumer;function IndexedSourceMapConsumer(e,r){var n=e;if(typeof e==="string"){n=o.parseSourceMapInput(e)}var t=o.getArg(n,"version");var i=o.getArg(n,"sections");if(t!=this._version){throw new Error("Unsupported version: "+t)}this._sources=new a;this._names=new a;var u={line:-1,column:0};this._sections=i.map((function(e){if(e.url){throw new Error("Support for url field in sections not implemented.")}var n=o.getArg(e,"offset");var t=o.getArg(n,"line");var i=o.getArg(n,"column");if(t{var t=n(449);var o=n(339);var i=n(274).I;var a=n(680).H;function SourceMapGenerator(e){if(!e){e={}}this._file=o.getArg(e,"file",null);this._sourceRoot=o.getArg(e,"sourceRoot",null);this._skipValidation=o.getArg(e,"skipValidation",false);this._sources=new i;this._names=new i;this._mappings=new a;this._sourcesContents=null}SourceMapGenerator.prototype._version=3;SourceMapGenerator.fromSourceMap=function SourceMapGenerator_fromSourceMap(e){var r=e.sourceRoot;var n=new SourceMapGenerator({file:e.file,sourceRoot:r});e.eachMapping((function(e){var t={generated:{line:e.generatedLine,column:e.generatedColumn}};if(e.source!=null){t.source=e.source;if(r!=null){t.source=o.relative(r,t.source)}t.original={line:e.originalLine,column:e.originalColumn};if(e.name!=null){t.name=e.name}}n.addMapping(t)}));e.sources.forEach((function(t){var i=t;if(r!==null){i=o.relative(r,t)}if(!n._sources.has(i)){n._sources.add(i)}var a=e.sourceContentFor(t);if(a!=null){n.setSourceContent(t,a)}}));return n};SourceMapGenerator.prototype.addMapping=function SourceMapGenerator_addMapping(e){var r=o.getArg(e,"generated");var n=o.getArg(e,"original",null);var t=o.getArg(e,"source",null);var i=o.getArg(e,"name",null);if(!this._skipValidation){this._validateMapping(r,n,t,i)}if(t!=null){t=String(t);if(!this._sources.has(t)){this._sources.add(t)}}if(i!=null){i=String(i);if(!this._names.has(i)){this._names.add(i)}}this._mappings.add({generatedLine:r.line,generatedColumn:r.column,originalLine:n!=null&&n.line,originalColumn:n!=null&&n.column,source:t,name:i})};SourceMapGenerator.prototype.setSourceContent=function SourceMapGenerator_setSourceContent(e,r){var n=e;if(this._sourceRoot!=null){n=o.relative(this._sourceRoot,n)}if(r!=null){if(!this._sourcesContents){this._sourcesContents=Object.create(null)}this._sourcesContents[o.toSetString(n)]=r}else if(this._sourcesContents){delete this._sourcesContents[o.toSetString(n)];if(Object.keys(this._sourcesContents).length===0){this._sourcesContents=null}}};SourceMapGenerator.prototype.applySourceMap=function SourceMapGenerator_applySourceMap(e,r,n){var t=r;if(r==null){if(e.file==null){throw new Error("SourceMapGenerator.prototype.applySourceMap requires either an explicit source file, "+'or the source map\'s "file" property. Both were omitted.')}t=e.file}var a=this._sourceRoot;if(a!=null){t=o.relative(a,t)}var u=new i;var s=new i;this._mappings.unsortedForEach((function(r){if(r.source===t&&r.originalLine!=null){var i=e.originalPositionFor({line:r.originalLine,column:r.originalColumn});if(i.source!=null){r.source=i.source;if(n!=null){r.source=o.join(n,r.source)}if(a!=null){r.source=o.relative(a,r.source)}r.originalLine=i.line;r.originalColumn=i.column;if(i.name!=null){r.name=i.name}}}var l=r.source;if(l!=null&&!u.has(l)){u.add(l)}var c=r.name;if(c!=null&&!s.has(c)){s.add(c)}}),this);this._sources=u;this._names=s;e.sources.forEach((function(r){var t=e.sourceContentFor(r);if(t!=null){if(n!=null){r=o.join(n,r)}if(a!=null){r=o.relative(a,r)}this.setSourceContent(r,t)}}),this)};SourceMapGenerator.prototype._validateMapping=function SourceMapGenerator_validateMapping(e,r,n,t){if(r&&typeof r.line!=="number"&&typeof r.column!=="number"){throw new Error("original.line and original.column are not numbers -- you probably meant to omit "+"the original mapping entirely and only map the generated position. If so, pass "+"null for the original mapping instead of an object with empty or null values.")}if(e&&"line"in e&&"column"in e&&e.line>0&&e.column>=0&&!r&&!n&&!t){return}else if(e&&"line"in e&&"column"in e&&r&&"line"in r&&"column"in r&&e.line>0&&e.column>=0&&r.line>0&&r.column>=0&&n){return}else{throw new Error("Invalid mapping: "+JSON.stringify({generated:e,source:n,original:r,name:t}))}};SourceMapGenerator.prototype._serializeMappings=function SourceMapGenerator_serializeMappings(){var e=0;var r=1;var n=0;var i=0;var a=0;var u=0;var s="";var l;var c;var p;var f;var g=this._mappings.toArray();for(var h=0,d=g.length;h0){if(!o.compareByGeneratedPositionsInflated(c,g[h-1])){continue}l+=","}}l+=t.encode(c.generatedColumn-e);e=c.generatedColumn;if(c.source!=null){f=this._sources.indexOf(c.source);l+=t.encode(f-u);u=f;l+=t.encode(c.originalLine-1-i);i=c.originalLine-1;l+=t.encode(c.originalColumn-n);n=c.originalColumn;if(c.name!=null){p=this._names.indexOf(c.name);l+=t.encode(p-a);a=p}}s+=l}return s};SourceMapGenerator.prototype._generateSourcesContent=function SourceMapGenerator_generateSourcesContent(e,r){return e.map((function(e){if(!this._sourcesContents){return null}if(r!=null){e=o.relative(r,e)}var n=o.toSetString(e);return Object.prototype.hasOwnProperty.call(this._sourcesContents,n)?this._sourcesContents[n]:null}),this)};SourceMapGenerator.prototype.toJSON=function SourceMapGenerator_toJSON(){var e={version:this._version,sources:this._sources.toArray(),names:this._names.toArray(),mappings:this._serializeMappings()};if(this._file!=null){e.file=this._file}if(this._sourceRoot!=null){e.sourceRoot=this._sourceRoot}if(this._sourcesContents){e.sourcesContent=this._generateSourcesContent(e.sources,e.sourceRoot)}return e};SourceMapGenerator.prototype.toString=function SourceMapGenerator_toString(){return JSON.stringify(this.toJSON())};r.h=SourceMapGenerator},351:(e,r,n)=>{var t;var o=n(591).h;var i=n(339);var a=/(\r?\n)/;var u=10;var s="$$$isSourceNode$$$";function SourceNode(e,r,n,t,o){this.children=[];this.sourceContents={};this.line=e==null?null:e;this.column=r==null?null:r;this.source=n==null?null:n;this.name=o==null?null:o;this[s]=true;if(t!=null)this.add(t)}SourceNode.fromStringWithSourceMap=function SourceNode_fromStringWithSourceMap(e,r,n){var t=new SourceNode;var o=e.split(a);var u=0;var shiftNextLine=function(){var e=getNextLine();var r=getNextLine()||"";return e+r;function getNextLine(){return u=0;r--){this.prepend(e[r])}}else if(e[s]||typeof e==="string"){this.children.unshift(e)}else{throw new TypeError("Expected a SourceNode, string, or an array of SourceNodes and strings. Got "+e)}return this};SourceNode.prototype.walk=function SourceNode_walk(e){var r;for(var n=0,t=this.children.length;n0){r=[];for(n=0;n{function getArg(e,r,n){if(r in e){return e[r]}else if(arguments.length===3){return n}else{throw new Error('"'+r+'" is a required argument.')}}r.getArg=getArg;var n=/^(?:([\w+\-.]+):)?\/\/(?:(\w+:\w+)@)?([\w.-]*)(?::(\d+))?(.*)$/;var t=/^data:.+\,.+$/;function urlParse(e){var r=e.match(n);if(!r){return null}return{scheme:r[1],auth:r[2],host:r[3],port:r[4],path:r[5]}}r.urlParse=urlParse;function urlGenerate(e){var r="";if(e.scheme){r+=e.scheme+":"}r+="//";if(e.auth){r+=e.auth+"@"}if(e.host){r+=e.host}if(e.port){r+=":"+e.port}if(e.path){r+=e.path}return r}r.urlGenerate=urlGenerate;function normalize(e){var n=e;var t=urlParse(e);if(t){if(!t.path){return e}n=t.path}var o=r.isAbsolute(n);var i=n.split(/\/+/);for(var a,u=0,s=i.length-1;s>=0;s--){a=i[s];if(a==="."){i.splice(s,1)}else if(a===".."){u++}else if(u>0){if(a===""){i.splice(s+1,u);u=0}else{i.splice(s,2);u--}}}n=i.join("/");if(n===""){n=o?"/":"."}if(t){t.path=n;return urlGenerate(t)}return n}r.normalize=normalize;function join(e,r){if(e===""){e="."}if(r===""){r="."}var n=urlParse(r);var o=urlParse(e);if(o){e=o.path||"/"}if(n&&!n.scheme){if(o){n.scheme=o.scheme}return urlGenerate(n)}if(n||r.match(t)){return r}if(o&&!o.host&&!o.path){o.host=r;return urlGenerate(o)}var i=r.charAt(0)==="/"?r:normalize(e.replace(/\/+$/,"")+"/"+r);if(o){o.path=i;return urlGenerate(o)}return i}r.join=join;r.isAbsolute=function(e){return e.charAt(0)==="/"||n.test(e)};function relative(e,r){if(e===""){e="."}e=e.replace(/\/$/,"");var n=0;while(r.indexOf(e+"/")!==0){var t=e.lastIndexOf("/");if(t<0){return r}e=e.slice(0,t);if(e.match(/^([^\/]+:\/)?\/*$/)){return r}++n}return Array(n+1).join("../")+r.substr(e.length+1)}r.relative=relative;var o=function(){var e=Object.create(null);return!("__proto__"in e)}();function identity(e){return e}function toSetString(e){if(isProtoString(e)){return"$"+e}return e}r.toSetString=o?identity:toSetString;function fromSetString(e){if(isProtoString(e)){return e.slice(1)}return e}r.fromSetString=o?identity:fromSetString;function isProtoString(e){if(!e){return false}var r=e.length;if(r<9){return false}if(e.charCodeAt(r-1)!==95||e.charCodeAt(r-2)!==95||e.charCodeAt(r-3)!==111||e.charCodeAt(r-4)!==116||e.charCodeAt(r-5)!==111||e.charCodeAt(r-6)!==114||e.charCodeAt(r-7)!==112||e.charCodeAt(r-8)!==95||e.charCodeAt(r-9)!==95){return false}for(var n=r-10;n>=0;n--){if(e.charCodeAt(n)!==36){return false}}return true}function compareByOriginalPositions(e,r,n){var t=strcmp(e.source,r.source);if(t!==0){return t}t=e.originalLine-r.originalLine;if(t!==0){return t}t=e.originalColumn-r.originalColumn;if(t!==0||n){return t}t=e.generatedColumn-r.generatedColumn;if(t!==0){return t}t=e.generatedLine-r.generatedLine;if(t!==0){return t}return strcmp(e.name,r.name)}r.compareByOriginalPositions=compareByOriginalPositions;function compareByGeneratedPositionsDeflated(e,r,n){var t=e.generatedLine-r.generatedLine;if(t!==0){return t}t=e.generatedColumn-r.generatedColumn;if(t!==0||n){return t}t=strcmp(e.source,r.source);if(t!==0){return t}t=e.originalLine-r.originalLine;if(t!==0){return t}t=e.originalColumn-r.originalColumn;if(t!==0){return t}return strcmp(e.name,r.name)}r.compareByGeneratedPositionsDeflated=compareByGeneratedPositionsDeflated;function strcmp(e,r){if(e===r){return 0}if(e===null){return 1}if(r===null){return-1}if(e>r){return 1}return-1}function compareByGeneratedPositionsInflated(e,r){var n=e.generatedLine-r.generatedLine;if(n!==0){return n}n=e.generatedColumn-r.generatedColumn;if(n!==0){return n}n=strcmp(e.source,r.source);if(n!==0){return n}n=e.originalLine-r.originalLine;if(n!==0){return n}n=e.originalColumn-r.originalColumn;if(n!==0){return n}return strcmp(e.name,r.name)}r.compareByGeneratedPositionsInflated=compareByGeneratedPositionsInflated;function parseSourceMapInput(e){return JSON.parse(e.replace(/^\)]}'[^\n]*\n/,""))}r.parseSourceMapInput=parseSourceMapInput;function computeSourceURL(e,r,n){r=r||"";if(e){if(e[e.length-1]!=="/"&&r[0]!=="/"){e+="/"}r=e+r}if(n){var t=urlParse(n);if(!t){throw new Error("sourceMapURL could not be parsed")}if(t.path){var o=t.path.lastIndexOf("/");if(o>=0){t.path=t.path.substring(0,o+1)}}r=join(urlGenerate(t),r)}return normalize(r)}r.computeSourceURL=computeSourceURL},997:(e,r,n)=>{n(591).h;r.SourceMapConsumer=n(952).SourceMapConsumer;n(351)},284:(e,r,n)=>{e=n.nmd(e);var t=n(997).SourceMapConsumer;var o=n(17);var i;try{i=n(147);if(!i.existsSync||!i.readFileSync){i=null}}catch(e){}var a=n(650);function dynamicRequire(e,r){return e.require(r)}var u=false;var s=false;var l=false;var c="auto";var p={};var f={};var g=/^data:application\/json[^,]+base64,/;var h=[];var d=[];function isInBrowser(){if(c==="browser")return true;if(c==="node")return false;return typeof window!=="undefined"&&typeof XMLHttpRequest==="function"&&!(window.require&&window.module&&window.process&&window.process.type==="renderer")}function hasGlobalProcessEventEmitter(){return typeof process==="object"&&process!==null&&typeof process.on==="function"}function globalProcessVersion(){if(typeof process==="object"&&process!==null){return process.version}else{return""}}function globalProcessStderr(){if(typeof process==="object"&&process!==null){return process.stderr}}function globalProcessExit(e){if(typeof process==="object"&&process!==null&&typeof process.exit==="function"){return process.exit(e)}}function handlerExec(e){return function(r){for(var n=0;n"}var n=this.getLineNumber();if(n!=null){r+=":"+n;var t=this.getColumnNumber();if(t){r+=":"+t}}}var o="";var i=this.getFunctionName();var a=true;var u=this.isConstructor();var s=!(this.isToplevel()||u);if(s){var l=this.getTypeName();if(l==="[object Object]"){l="null"}var c=this.getMethodName();if(i){if(l&&i.indexOf(l)!=0){o+=l+"."}o+=i;if(c&&i.indexOf("."+c)!=i.length-c.length-1){o+=" [as "+c+"]"}}else{o+=l+"."+(c||"")}}else if(u){o+="new "+(i||"")}else if(i){o+=i}else{o+=r;a=false}if(a){o+=" ("+r+")"}return o}function cloneCallSite(e){var r={};Object.getOwnPropertyNames(Object.getPrototypeOf(e)).forEach((function(n){r[n]=/^(?:is|get)/.test(n)?function(){return e[n].call(e)}:e[n]}));r.toString=CallSiteToString;return r}function wrapCallSite(e,r){if(r===undefined){r={nextPosition:null,curPosition:null}}if(e.isNative()){r.curPosition=null;return e}var n=e.getFileName()||e.getScriptNameOrSourceURL();if(n){var t=e.getLineNumber();var o=e.getColumnNumber()-1;var i=/^v(10\.1[6-9]|10\.[2-9][0-9]|10\.[0-9]{3,}|1[2-9]\d*|[2-9]\d|\d{3,}|11\.11)/;var a=i.test(globalProcessVersion())?0:62;if(t===1&&o>a&&!isInBrowser()&&!e.isEval()){o-=a}var u=mapSourcePosition({source:n,line:t,column:o});r.curPosition=u;e=cloneCallSite(e);var s=e.getFunctionName;e.getFunctionName=function(){if(r.nextPosition==null){return s()}return r.nextPosition.name||s()};e.getFileName=function(){return u.source};e.getLineNumber=function(){return u.line};e.getColumnNumber=function(){return u.column+1};e.getScriptNameOrSourceURL=function(){return u.source};return e}var l=e.isEval()&&e.getEvalOrigin();if(l){l=mapEvalOrigin(l);e=cloneCallSite(e);e.getEvalOrigin=function(){return l};return e}return e}function prepareStackTrace(e,r){if(l){p={};f={}}var n=e.name||"Error";var t=e.message||"";var o=n+": "+t;var i={nextPosition:null,curPosition:null};var a=[];for(var u=r.length-1;u>=0;u--){a.push("\n at "+wrapCallSite(r[u],i));i.nextPosition=i.curPosition}i.curPosition=i.nextPosition=null;return o+a.reverse().join("")}function getErrorSource(e){var r=/\n at [^(]+ \((.*):(\d+):(\d+)\)/.exec(e.stack);if(r){var n=r[1];var t=+r[2];var o=+r[3];var a=p[n];if(!a&&i&&i.existsSync(n)){try{a=i.readFileSync(n,"utf8")}catch(e){a=""}}if(a){var u=a.split(/(?:\r\n|\r|\n)/)[t-1];if(u){return n+":"+t+"\n"+u+"\n"+new Array(o).join(" ")+"^"}}}return null}function printErrorAndExit(e){var r=getErrorSource(e);var n=globalProcessStderr();if(n&&n._handle&&n._handle.setBlocking){n._handle.setBlocking(true)}if(r){console.error();console.error(r)}console.error(e.stack);globalProcessExit(1)}function shimEmitUncaughtException(){var e=process.emit;process.emit=function(r){if(r==="uncaughtException"){var n=arguments[1]&&arguments[1].stack;var t=this.listeners(r).length>0;if(n&&!t){return printErrorAndExit(arguments[1])}}return e.apply(this,arguments)}}var S=h.slice(0);var _=d.slice(0);r.wrapCallSite=wrapCallSite;r.getErrorSource=getErrorSource;r.mapSourcePosition=mapSourcePosition;r.retrieveSourceMap=v;r.install=function(r){r=r||{};if(r.environment){c=r.environment;if(["node","browser","auto"].indexOf(c)===-1){throw new Error("environment "+c+" was unknown. Available options are {auto, browser, node}")}}if(r.retrieveFile){if(r.overrideRetrieveFile){h.length=0}h.unshift(r.retrieveFile)}if(r.retrieveSourceMap){if(r.overrideRetrieveSourceMap){d.length=0}d.unshift(r.retrieveSourceMap)}if(r.hookRequire&&!isInBrowser()){var n=dynamicRequire(e,"module");var t=n.prototype._compile;if(!t.__sourceMapSupport){n.prototype._compile=function(e,r){p[r]=e;f[r]=undefined;return t.call(this,e,r)};n.prototype._compile.__sourceMapSupport=true}}if(!l){l="emptyCacheBetweenOperations"in r?r.emptyCacheBetweenOperations:false}if(!u){u=true;Error.prepareStackTrace=prepareStackTrace}if(!s){var o="handleUncaughtExceptions"in r?r.handleUncaughtExceptions:true;try{var i=dynamicRequire(e,"worker_threads");if(i.isMainThread===false){o=false}}catch(e){}if(o&&hasGlobalProcessEventEmitter()){s=true;shimEmitUncaughtException()}}};r.resetRetrieveHandlers=function(){h.length=0;d.length=0;h=S.slice(0);d=_.slice(0);v=handlerExec(d);m=handlerExec(h)}},147:e=>{"use strict";e.exports=require("fs")},17:e=>{"use strict";e.exports=require("path")}};var r={};function __webpack_require__(n){var t=r[n];if(t!==undefined){return t.exports}var o=r[n]={id:n,loaded:false,exports:{}};var i=true;try{e[n](o,o.exports,__webpack_require__);i=false}finally{if(i)delete r[n]}o.loaded=true;return o.exports}(()=>{__webpack_require__.nmd=e=>{e.paths=[];if(!e.children)e.children=[];return e}})();if(typeof __webpack_require__!=="undefined")__webpack_require__.ab=__dirname+"/";var n={};(()=>{__webpack_require__(284).install()})();module.exports=n})(); -------------------------------------------------------------------------------- /dist/licenses.txt: -------------------------------------------------------------------------------- 1 | @actions/core 2 | MIT 3 | The MIT License (MIT) 4 | 5 | Copyright 2019 GitHub 6 | 7 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 8 | 9 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 10 | 11 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 12 | 13 | @actions/exec 14 | MIT 15 | The MIT License (MIT) 16 | 17 | Copyright 2019 GitHub 18 | 19 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 20 | 21 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 22 | 23 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24 | 25 | @actions/github 26 | MIT 27 | The MIT License (MIT) 28 | 29 | Copyright 2019 GitHub 30 | 31 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 32 | 33 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 34 | 35 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 36 | 37 | @actions/http-client 38 | MIT 39 | Actions Http Client for Node.js 40 | 41 | Copyright (c) GitHub, Inc. 42 | 43 | All rights reserved. 44 | 45 | MIT License 46 | 47 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and 48 | associated documentation files (the "Software"), to deal in the Software without restriction, 49 | including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, 50 | and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, 51 | subject to the following conditions: 52 | 53 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 54 | 55 | THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT 56 | LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN 57 | NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 58 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 59 | SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 60 | 61 | 62 | @actions/io 63 | MIT 64 | The MIT License (MIT) 65 | 66 | Copyright 2019 GitHub 67 | 68 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 69 | 70 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 71 | 72 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 73 | 74 | @automattic/Jetpack_Monorepo 75 | GPL-2.0-or-later 76 | This program is free software; you can redistribute it and/or modify 77 | it under the terms of the GNU General Public License as published by 78 | the Free Software Foundation; either version 2 of the License, or 79 | (at your option) any later version. 80 | 81 | This program is distributed in the hope that it will be useful, 82 | but WITHOUT ANY WARRANTY; without even the implied warranty of 83 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 84 | GNU General Public License for more details. 85 | 86 | You should have received a copy of the GNU General Public License 87 | along with this program; if not, see . 88 | 89 | 90 | =================================== 91 | 92 | 93 | GNU GENERAL PUBLIC LICENSE 94 | Version 2, June 1991 95 | 96 | Copyright (C) 1989, 1991 Free Software Foundation, Inc., 97 | 98 | Everyone is permitted to copy and distribute verbatim copies 99 | of this license document, but changing it is not allowed. 100 | 101 | Preamble 102 | 103 | The licenses for most software are designed to take away your 104 | freedom to share and change it. By contrast, the GNU General Public 105 | License is intended to guarantee your freedom to share and change free 106 | software--to make sure the software is free for all its users. This 107 | General Public License applies to most of the Free Software 108 | Foundation's software and to any other program whose authors commit to 109 | using it. (Some other Free Software Foundation software is covered by 110 | the GNU Lesser General Public License instead.) You can apply it to 111 | your programs, too. 112 | 113 | When we speak of free software, we are referring to freedom, not 114 | price. Our General Public Licenses are designed to make sure that you 115 | have the freedom to distribute copies of free software (and charge for 116 | this service if you wish), that you receive source code or can get it 117 | if you want it, that you can change the software or use pieces of it 118 | in new free programs; and that you know you can do these things. 119 | 120 | To protect your rights, we need to make restrictions that forbid 121 | anyone to deny you these rights or to ask you to surrender the rights. 122 | These restrictions translate to certain responsibilities for you if you 123 | distribute copies of the software, or if you modify it. 124 | 125 | For example, if you distribute copies of such a program, whether 126 | gratis or for a fee, you must give the recipients all the rights that 127 | you have. You must make sure that they, too, receive or can get the 128 | source code. And you must show them these terms so they know their 129 | rights. 130 | 131 | We protect your rights with two steps: (1) copyright the software, and 132 | (2) offer you this license which gives you legal permission to copy, 133 | distribute and/or modify the software. 134 | 135 | Also, for each author's protection and ours, we want to make certain 136 | that everyone understands that there is no warranty for this free 137 | software. If the software is modified by someone else and passed on, we 138 | want its recipients to know that what they have is not the original, so 139 | that any problems introduced by others will not reflect on the original 140 | authors' reputations. 141 | 142 | Finally, any free program is threatened constantly by software 143 | patents. We wish to avoid the danger that redistributors of a free 144 | program will individually obtain patent licenses, in effect making the 145 | program proprietary. To prevent this, we have made it clear that any 146 | patent must be licensed for everyone's free use or not licensed at all. 147 | 148 | The precise terms and conditions for copying, distribution and 149 | modification follow. 150 | 151 | GNU GENERAL PUBLIC LICENSE 152 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 153 | 154 | 0. This License applies to any program or other work which contains 155 | a notice placed by the copyright holder saying it may be distributed 156 | under the terms of this General Public License. The "Program", below, 157 | refers to any such program or work, and a "work based on the Program" 158 | means either the Program or any derivative work under copyright law: 159 | that is to say, a work containing the Program or a portion of it, 160 | either verbatim or with modifications and/or translated into another 161 | language. (Hereinafter, translation is included without limitation in 162 | the term "modification".) Each licensee is addressed as "you". 163 | 164 | Activities other than copying, distribution and modification are not 165 | covered by this License; they are outside its scope. The act of 166 | running the Program is not restricted, and the output from the Program 167 | is covered only if its contents constitute a work based on the 168 | Program (independent of having been made by running the Program). 169 | Whether that is true depends on what the Program does. 170 | 171 | 1. You may copy and distribute verbatim copies of the Program's 172 | source code as you receive it, in any medium, provided that you 173 | conspicuously and appropriately publish on each copy an appropriate 174 | copyright notice and disclaimer of warranty; keep intact all the 175 | notices that refer to this License and to the absence of any warranty; 176 | and give any other recipients of the Program a copy of this License 177 | along with the Program. 178 | 179 | You may charge a fee for the physical act of transferring a copy, and 180 | you may at your option offer warranty protection in exchange for a fee. 181 | 182 | 2. You may modify your copy or copies of the Program or any portion 183 | of it, thus forming a work based on the Program, and copy and 184 | distribute such modifications or work under the terms of Section 1 185 | above, provided that you also meet all of these conditions: 186 | 187 | a) You must cause the modified files to carry prominent notices 188 | stating that you changed the files and the date of any change. 189 | 190 | b) You must cause any work that you distribute or publish, that in 191 | whole or in part contains or is derived from the Program or any 192 | part thereof, to be licensed as a whole at no charge to all third 193 | parties under the terms of this License. 194 | 195 | c) If the modified program normally reads commands interactively 196 | when run, you must cause it, when started running for such 197 | interactive use in the most ordinary way, to print or display an 198 | announcement including an appropriate copyright notice and a 199 | notice that there is no warranty (or else, saying that you provide 200 | a warranty) and that users may redistribute the program under 201 | these conditions, and telling the user how to view a copy of this 202 | License. (Exception: if the Program itself is interactive but 203 | does not normally print such an announcement, your work based on 204 | the Program is not required to print an announcement.) 205 | 206 | These requirements apply to the modified work as a whole. If 207 | identifiable sections of that work are not derived from the Program, 208 | and can be reasonably considered independent and separate works in 209 | themselves, then this License, and its terms, do not apply to those 210 | sections when you distribute them as separate works. But when you 211 | distribute the same sections as part of a whole which is a work based 212 | on the Program, the distribution of the whole must be on the terms of 213 | this License, whose permissions for other licensees extend to the 214 | entire whole, and thus to each and every part regardless of who wrote it. 215 | 216 | Thus, it is not the intent of this section to claim rights or contest 217 | your rights to work written entirely by you; rather, the intent is to 218 | exercise the right to control the distribution of derivative or 219 | collective works based on the Program. 220 | 221 | In addition, mere aggregation of another work not based on the Program 222 | with the Program (or with a work based on the Program) on a volume of 223 | a storage or distribution medium does not bring the other work under 224 | the scope of this License. 225 | 226 | 3. You may copy and distribute the Program (or a work based on it, 227 | under Section 2) in object code or executable form under the terms of 228 | Sections 1 and 2 above provided that you also do one of the following: 229 | 230 | a) Accompany it with the complete corresponding machine-readable 231 | source code, which must be distributed under the terms of Sections 232 | 1 and 2 above on a medium customarily used for software interchange; or, 233 | 234 | b) Accompany it with a written offer, valid for at least three 235 | years, to give any third party, for a charge no more than your 236 | cost of physically performing source distribution, a complete 237 | machine-readable copy of the corresponding source code, to be 238 | distributed under the terms of Sections 1 and 2 above on a medium 239 | customarily used for software interchange; or, 240 | 241 | c) Accompany it with the information you received as to the offer 242 | to distribute corresponding source code. (This alternative is 243 | allowed only for noncommercial distribution and only if you 244 | received the program in object code or executable form with such 245 | an offer, in accord with Subsection b above.) 246 | 247 | The source code for a work means the preferred form of the work for 248 | making modifications to it. For an executable work, complete source 249 | code means all the source code for all modules it contains, plus any 250 | associated interface definition files, plus the scripts used to 251 | control compilation and installation of the executable. However, as a 252 | special exception, the source code distributed need not include 253 | anything that is normally distributed (in either source or binary 254 | form) with the major components (compiler, kernel, and so on) of the 255 | operating system on which the executable runs, unless that component 256 | itself accompanies the executable. 257 | 258 | If distribution of executable or object code is made by offering 259 | access to copy from a designated place, then offering equivalent 260 | access to copy the source code from the same place counts as 261 | distribution of the source code, even though third parties are not 262 | compelled to copy the source along with the object code. 263 | 264 | 4. You may not copy, modify, sublicense, or distribute the Program 265 | except as expressly provided under this License. Any attempt 266 | otherwise to copy, modify, sublicense or distribute the Program is 267 | void, and will automatically terminate your rights under this License. 268 | However, parties who have received copies, or rights, from you under 269 | this License will not have their licenses terminated so long as such 270 | parties remain in full compliance. 271 | 272 | 5. You are not required to accept this License, since you have not 273 | signed it. However, nothing else grants you permission to modify or 274 | distribute the Program or its derivative works. These actions are 275 | prohibited by law if you do not accept this License. Therefore, by 276 | modifying or distributing the Program (or any work based on the 277 | Program), you indicate your acceptance of this License to do so, and 278 | all its terms and conditions for copying, distributing or modifying 279 | the Program or works based on it. 280 | 281 | 6. Each time you redistribute the Program (or any work based on the 282 | Program), the recipient automatically receives a license from the 283 | original licensor to copy, distribute or modify the Program subject to 284 | these terms and conditions. You may not impose any further 285 | restrictions on the recipients' exercise of the rights granted herein. 286 | You are not responsible for enforcing compliance by third parties to 287 | this License. 288 | 289 | 7. If, as a consequence of a court judgment or allegation of patent 290 | infringement or for any other reason (not limited to patent issues), 291 | conditions are imposed on you (whether by court order, agreement or 292 | otherwise) that contradict the conditions of this License, they do not 293 | excuse you from the conditions of this License. If you cannot 294 | distribute so as to satisfy simultaneously your obligations under this 295 | License and any other pertinent obligations, then as a consequence you 296 | may not distribute the Program at all. For example, if a patent 297 | license would not permit royalty-free redistribution of the Program by 298 | all those who receive copies directly or indirectly through you, then 299 | the only way you could satisfy both it and this License would be to 300 | refrain entirely from distribution of the Program. 301 | 302 | If any portion of this section is held invalid or unenforceable under 303 | any particular circumstance, the balance of the section is intended to 304 | apply and the section as a whole is intended to apply in other 305 | circumstances. 306 | 307 | It is not the purpose of this section to induce you to infringe any 308 | patents or other property right claims or to contest validity of any 309 | such claims; this section has the sole purpose of protecting the 310 | integrity of the free software distribution system, which is 311 | implemented by public license practices. Many people have made 312 | generous contributions to the wide range of software distributed 313 | through that system in reliance on consistent application of that 314 | system; it is up to the author/donor to decide if he or she is willing 315 | to distribute software through any other system and a licensee cannot 316 | impose that choice. 317 | 318 | This section is intended to make thoroughly clear what is believed to 319 | be a consequence of the rest of this License. 320 | 321 | 8. If the distribution and/or use of the Program is restricted in 322 | certain countries either by patents or by copyrighted interfaces, the 323 | original copyright holder who places the Program under this License 324 | may add an explicit geographical distribution limitation excluding 325 | those countries, so that distribution is permitted only in or among 326 | countries not thus excluded. In such case, this License incorporates 327 | the limitation as if written in the body of this License. 328 | 329 | 9. The Free Software Foundation may publish revised and/or new versions 330 | of the General Public License from time to time. Such new versions will 331 | be similar in spirit to the present version, but may differ in detail to 332 | address new problems or concerns. 333 | 334 | Each version is given a distinguishing version number. If the Program 335 | specifies a version number of this License which applies to it and "any 336 | later version", you have the option of following the terms and conditions 337 | either of that version or of any later version published by the Free 338 | Software Foundation. If the Program does not specify a version number of 339 | this License, you may choose any version ever published by the Free Software 340 | Foundation. 341 | 342 | 10. If you wish to incorporate parts of the Program into other free 343 | programs whose distribution conditions are different, write to the author 344 | to ask for permission. For software which is copyrighted by the Free 345 | Software Foundation, write to the Free Software Foundation; we sometimes 346 | make exceptions for this. Our decision will be guided by the two goals 347 | of preserving the free status of all derivatives of our free software and 348 | of promoting the sharing and reuse of software generally. 349 | 350 | NO WARRANTY 351 | 352 | 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY 353 | FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN 354 | OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES 355 | PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 356 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 357 | MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS 358 | TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE 359 | PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, 360 | REPAIR OR CORRECTION. 361 | 362 | 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 363 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR 364 | REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, 365 | INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING 366 | OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED 367 | TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY 368 | YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER 369 | PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE 370 | POSSIBILITY OF SUCH DAMAGES. 371 | 372 | END OF TERMS AND CONDITIONS 373 | 374 | How to Apply These Terms to Your New Programs 375 | 376 | If you develop a new program, and you want it to be of the greatest 377 | possible use to the public, the best way to achieve this is to make it 378 | free software which everyone can redistribute and change under these terms. 379 | 380 | To do so, attach the following notices to the program. It is safest 381 | to attach them to the start of each source file to most effectively 382 | convey the exclusion of warranty; and each file should have at least 383 | the "copyright" line and a pointer to where the full notice is found. 384 | 385 | 386 | Copyright (C) 387 | 388 | This program is free software; you can redistribute it and/or modify 389 | it under the terms of the GNU General Public License as published by 390 | the Free Software Foundation; either version 2 of the License, or 391 | (at your option) any later version. 392 | 393 | This program is distributed in the hope that it will be useful, 394 | but WITHOUT ANY WARRANTY; without even the implied warranty of 395 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 396 | GNU General Public License for more details. 397 | 398 | You should have received a copy of the GNU General Public License along 399 | with this program; if not, see . 400 | 401 | Also add information on how to contact you by electronic and paper mail. 402 | 403 | If the program is interactive, make it output a short notice like this 404 | when it starts in an interactive mode: 405 | 406 | Gnomovision version 69, Copyright (C) year name of author 407 | Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 408 | This is free software, and you are welcome to redistribute it 409 | under certain conditions; type `show c' for details. 410 | 411 | The hypothetical commands `show w' and `show c' should show the appropriate 412 | parts of the General Public License. Of course, the commands you use may 413 | be called something other than `show w' and `show c'; they could even be 414 | mouse-clicks or menu items--whatever suits your program. 415 | 416 | You should also get your employer (if you work as a programmer) or your 417 | school, if any, to sign a "copyright disclaimer" for the program, if 418 | necessary. Here is a sample; alter the names: 419 | 420 | Yoyodyne, Inc., hereby disclaims all copyright interest in the program 421 | `Gnomovision' (which makes passes at compilers) written by James Hacker. 422 | 423 | , 1 April 1989 424 | Moe Ghoul, President of Vice 425 | 426 | This General Public License does not permit incorporating your program into 427 | proprietary programs. If your program is a subroutine library, you may 428 | consider it more useful to permit linking proprietary applications with the 429 | library. If this is what you want to do, use the GNU Lesser General 430 | Public License instead of this License. 431 | 432 | 433 | @fastify/busboy 434 | MIT 435 | Copyright Brian White. All rights reserved. 436 | 437 | Permission is hereby granted, free of charge, to any person obtaining a copy 438 | of this software and associated documentation files (the "Software"), to 439 | deal in the Software without restriction, including without limitation the 440 | rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 441 | sell copies of the Software, and to permit persons to whom the Software is 442 | furnished to do so, subject to the following conditions: 443 | 444 | The above copyright notice and this permission notice shall be included in 445 | all copies or substantial portions of the Software. 446 | 447 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 448 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 449 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 450 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 451 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 452 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 453 | IN THE SOFTWARE. 454 | 455 | @octokit/auth-token 456 | MIT 457 | The MIT License 458 | 459 | Copyright (c) 2019 Octokit contributors 460 | 461 | Permission is hereby granted, free of charge, to any person obtaining a copy 462 | of this software and associated documentation files (the "Software"), to deal 463 | in the Software without restriction, including without limitation the rights 464 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 465 | copies of the Software, and to permit persons to whom the Software is 466 | furnished to do so, subject to the following conditions: 467 | 468 | The above copyright notice and this permission notice shall be included in 469 | all copies or substantial portions of the Software. 470 | 471 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 472 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 473 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 474 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 475 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 476 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 477 | THE SOFTWARE. 478 | 479 | 480 | @octokit/core 481 | MIT 482 | The MIT License 483 | 484 | Copyright (c) 2019 Octokit contributors 485 | 486 | Permission is hereby granted, free of charge, to any person obtaining a copy 487 | of this software and associated documentation files (the "Software"), to deal 488 | in the Software without restriction, including without limitation the rights 489 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 490 | copies of the Software, and to permit persons to whom the Software is 491 | furnished to do so, subject to the following conditions: 492 | 493 | The above copyright notice and this permission notice shall be included in 494 | all copies or substantial portions of the Software. 495 | 496 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 497 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 498 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 499 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 500 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 501 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 502 | THE SOFTWARE. 503 | 504 | 505 | @octokit/endpoint 506 | MIT 507 | The MIT License 508 | 509 | Copyright (c) 2018 Octokit contributors 510 | 511 | Permission is hereby granted, free of charge, to any person obtaining a copy 512 | of this software and associated documentation files (the "Software"), to deal 513 | in the Software without restriction, including without limitation the rights 514 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 515 | copies of the Software, and to permit persons to whom the Software is 516 | furnished to do so, subject to the following conditions: 517 | 518 | The above copyright notice and this permission notice shall be included in 519 | all copies or substantial portions of the Software. 520 | 521 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 522 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 523 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 524 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 525 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 526 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 527 | THE SOFTWARE. 528 | 529 | 530 | @octokit/graphql 531 | MIT 532 | The MIT License 533 | 534 | Copyright (c) 2018 Octokit contributors 535 | 536 | Permission is hereby granted, free of charge, to any person obtaining a copy 537 | of this software and associated documentation files (the "Software"), to deal 538 | in the Software without restriction, including without limitation the rights 539 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 540 | copies of the Software, and to permit persons to whom the Software is 541 | furnished to do so, subject to the following conditions: 542 | 543 | The above copyright notice and this permission notice shall be included in 544 | all copies or substantial portions of the Software. 545 | 546 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 547 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 548 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 549 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 550 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 551 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 552 | THE SOFTWARE. 553 | 554 | 555 | @octokit/plugin-paginate-rest 556 | MIT 557 | MIT License Copyright (c) 2019 Octokit contributors 558 | 559 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 560 | 561 | The above copyright notice and this permission notice (including the next paragraph) shall be included in all copies or substantial portions of the Software. 562 | 563 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 564 | 565 | 566 | @octokit/plugin-rest-endpoint-methods 567 | MIT 568 | MIT License Copyright (c) 2019 Octokit contributors 569 | 570 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 571 | 572 | The above copyright notice and this permission notice (including the next paragraph) shall be included in all copies or substantial portions of the Software. 573 | 574 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 575 | 576 | 577 | @octokit/request 578 | MIT 579 | The MIT License 580 | 581 | Copyright (c) 2018 Octokit contributors 582 | 583 | Permission is hereby granted, free of charge, to any person obtaining a copy 584 | of this software and associated documentation files (the "Software"), to deal 585 | in the Software without restriction, including without limitation the rights 586 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 587 | copies of the Software, and to permit persons to whom the Software is 588 | furnished to do so, subject to the following conditions: 589 | 590 | The above copyright notice and this permission notice shall be included in 591 | all copies or substantial portions of the Software. 592 | 593 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 594 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 595 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 596 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 597 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 598 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 599 | THE SOFTWARE. 600 | 601 | 602 | @octokit/request-error 603 | MIT 604 | The MIT License 605 | 606 | Copyright (c) 2019 Octokit contributors 607 | 608 | Permission is hereby granted, free of charge, to any person obtaining a copy 609 | of this software and associated documentation files (the "Software"), to deal 610 | in the Software without restriction, including without limitation the rights 611 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 612 | copies of the Software, and to permit persons to whom the Software is 613 | furnished to do so, subject to the following conditions: 614 | 615 | The above copyright notice and this permission notice shall be included in 616 | all copies or substantial portions of the Software. 617 | 618 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 619 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 620 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 621 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 622 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 623 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 624 | THE SOFTWARE. 625 | 626 | 627 | before-after-hook 628 | Apache-2.0 629 | Apache License 630 | Version 2.0, January 2004 631 | http://www.apache.org/licenses/ 632 | 633 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 634 | 635 | 1. Definitions. 636 | 637 | "License" shall mean the terms and conditions for use, reproduction, 638 | and distribution as defined by Sections 1 through 9 of this document. 639 | 640 | "Licensor" shall mean the copyright owner or entity authorized by 641 | the copyright owner that is granting the License. 642 | 643 | "Legal Entity" shall mean the union of the acting entity and all 644 | other entities that control, are controlled by, or are under common 645 | control with that entity. For the purposes of this definition, 646 | "control" means (i) the power, direct or indirect, to cause the 647 | direction or management of such entity, whether by contract or 648 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 649 | outstanding shares, or (iii) beneficial ownership of such entity. 650 | 651 | "You" (or "Your") shall mean an individual or Legal Entity 652 | exercising permissions granted by this License. 653 | 654 | "Source" form shall mean the preferred form for making modifications, 655 | including but not limited to software source code, documentation 656 | source, and configuration files. 657 | 658 | "Object" form shall mean any form resulting from mechanical 659 | transformation or translation of a Source form, including but 660 | not limited to compiled object code, generated documentation, 661 | and conversions to other media types. 662 | 663 | "Work" shall mean the work of authorship, whether in Source or 664 | Object form, made available under the License, as indicated by a 665 | copyright notice that is included in or attached to the work 666 | (an example is provided in the Appendix below). 667 | 668 | "Derivative Works" shall mean any work, whether in Source or Object 669 | form, that is based on (or derived from) the Work and for which the 670 | editorial revisions, annotations, elaborations, or other modifications 671 | represent, as a whole, an original work of authorship. For the purposes 672 | of this License, Derivative Works shall not include works that remain 673 | separable from, or merely link (or bind by name) to the interfaces of, 674 | the Work and Derivative Works thereof. 675 | 676 | "Contribution" shall mean any work of authorship, including 677 | the original version of the Work and any modifications or additions 678 | to that Work or Derivative Works thereof, that is intentionally 679 | submitted to Licensor for inclusion in the Work by the copyright owner 680 | or by an individual or Legal Entity authorized to submit on behalf of 681 | the copyright owner. For the purposes of this definition, "submitted" 682 | means any form of electronic, verbal, or written communication sent 683 | to the Licensor or its representatives, including but not limited to 684 | communication on electronic mailing lists, source code control systems, 685 | and issue tracking systems that are managed by, or on behalf of, the 686 | Licensor for the purpose of discussing and improving the Work, but 687 | excluding communication that is conspicuously marked or otherwise 688 | designated in writing by the copyright owner as "Not a Contribution." 689 | 690 | "Contributor" shall mean Licensor and any individual or Legal Entity 691 | on behalf of whom a Contribution has been received by Licensor and 692 | subsequently incorporated within the Work. 693 | 694 | 2. Grant of Copyright License. Subject to the terms and conditions of 695 | this License, each Contributor hereby grants to You a perpetual, 696 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 697 | copyright license to reproduce, prepare Derivative Works of, 698 | publicly display, publicly perform, sublicense, and distribute the 699 | Work and such Derivative Works in Source or Object form. 700 | 701 | 3. Grant of Patent License. Subject to the terms and conditions of 702 | this License, each Contributor hereby grants to You a perpetual, 703 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 704 | (except as stated in this section) patent license to make, have made, 705 | use, offer to sell, sell, import, and otherwise transfer the Work, 706 | where such license applies only to those patent claims licensable 707 | by such Contributor that are necessarily infringed by their 708 | Contribution(s) alone or by combination of their Contribution(s) 709 | with the Work to which such Contribution(s) was submitted. If You 710 | institute patent litigation against any entity (including a 711 | cross-claim or counterclaim in a lawsuit) alleging that the Work 712 | or a Contribution incorporated within the Work constitutes direct 713 | or contributory patent infringement, then any patent licenses 714 | granted to You under this License for that Work shall terminate 715 | as of the date such litigation is filed. 716 | 717 | 4. Redistribution. You may reproduce and distribute copies of the 718 | Work or Derivative Works thereof in any medium, with or without 719 | modifications, and in Source or Object form, provided that You 720 | meet the following conditions: 721 | 722 | (a) You must give any other recipients of the Work or 723 | Derivative Works a copy of this License; and 724 | 725 | (b) You must cause any modified files to carry prominent notices 726 | stating that You changed the files; and 727 | 728 | (c) You must retain, in the Source form of any Derivative Works 729 | that You distribute, all copyright, patent, trademark, and 730 | attribution notices from the Source form of the Work, 731 | excluding those notices that do not pertain to any part of 732 | the Derivative Works; and 733 | 734 | (d) If the Work includes a "NOTICE" text file as part of its 735 | distribution, then any Derivative Works that You distribute must 736 | include a readable copy of the attribution notices contained 737 | within such NOTICE file, excluding those notices that do not 738 | pertain to any part of the Derivative Works, in at least one 739 | of the following places: within a NOTICE text file distributed 740 | as part of the Derivative Works; within the Source form or 741 | documentation, if provided along with the Derivative Works; or, 742 | within a display generated by the Derivative Works, if and 743 | wherever such third-party notices normally appear. The contents 744 | of the NOTICE file are for informational purposes only and 745 | do not modify the License. You may add Your own attribution 746 | notices within Derivative Works that You distribute, alongside 747 | or as an addendum to the NOTICE text from the Work, provided 748 | that such additional attribution notices cannot be construed 749 | as modifying the License. 750 | 751 | You may add Your own copyright statement to Your modifications and 752 | may provide additional or different license terms and conditions 753 | for use, reproduction, or distribution of Your modifications, or 754 | for any such Derivative Works as a whole, provided Your use, 755 | reproduction, and distribution of the Work otherwise complies with 756 | the conditions stated in this License. 757 | 758 | 5. Submission of Contributions. Unless You explicitly state otherwise, 759 | any Contribution intentionally submitted for inclusion in the Work 760 | by You to the Licensor shall be under the terms and conditions of 761 | this License, without any additional terms or conditions. 762 | Notwithstanding the above, nothing herein shall supersede or modify 763 | the terms of any separate license agreement you may have executed 764 | with Licensor regarding such Contributions. 765 | 766 | 6. Trademarks. This License does not grant permission to use the trade 767 | names, trademarks, service marks, or product names of the Licensor, 768 | except as required for reasonable and customary use in describing the 769 | origin of the Work and reproducing the content of the NOTICE file. 770 | 771 | 7. Disclaimer of Warranty. Unless required by applicable law or 772 | agreed to in writing, Licensor provides the Work (and each 773 | Contributor provides its Contributions) on an "AS IS" BASIS, 774 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 775 | implied, including, without limitation, any warranties or conditions 776 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 777 | PARTICULAR PURPOSE. You are solely responsible for determining the 778 | appropriateness of using or redistributing the Work and assume any 779 | risks associated with Your exercise of permissions under this License. 780 | 781 | 8. Limitation of Liability. In no event and under no legal theory, 782 | whether in tort (including negligence), contract, or otherwise, 783 | unless required by applicable law (such as deliberate and grossly 784 | negligent acts) or agreed to in writing, shall any Contributor be 785 | liable to You for damages, including any direct, indirect, special, 786 | incidental, or consequential damages of any character arising as a 787 | result of this License or out of the use or inability to use the 788 | Work (including but not limited to damages for loss of goodwill, 789 | work stoppage, computer failure or malfunction, or any and all 790 | other commercial damages or losses), even if such Contributor 791 | has been advised of the possibility of such damages. 792 | 793 | 9. Accepting Warranty or Additional Liability. While redistributing 794 | the Work or Derivative Works thereof, You may choose to offer, 795 | and charge a fee for, acceptance of support, warranty, indemnity, 796 | or other liability obligations and/or rights consistent with this 797 | License. However, in accepting such obligations, You may act only 798 | on Your own behalf and on Your sole responsibility, not on behalf 799 | of any other Contributor, and only if You agree to indemnify, 800 | defend, and hold each Contributor harmless for any liability 801 | incurred by, or claims asserted against, such Contributor by reason 802 | of your accepting any such warranty or additional liability. 803 | 804 | END OF TERMS AND CONDITIONS 805 | 806 | APPENDIX: How to apply the Apache License to your work. 807 | 808 | To apply the Apache License to your work, attach the following 809 | boilerplate notice, with the fields enclosed by brackets "{}" 810 | replaced with your own identifying information. (Don't include 811 | the brackets!) The text should be enclosed in the appropriate 812 | comment syntax for the file format. We also recommend that a 813 | file or class name and description of purpose be included on the 814 | same "printed page" as the copyright notice for easier 815 | identification within third-party archives. 816 | 817 | Copyright 2018 Gregor Martynus and other contributors. 818 | 819 | Licensed under the Apache License, Version 2.0 (the "License"); 820 | you may not use this file except in compliance with the License. 821 | You may obtain a copy of the License at 822 | 823 | http://www.apache.org/licenses/LICENSE-2.0 824 | 825 | Unless required by applicable law or agreed to in writing, software 826 | distributed under the License is distributed on an "AS IS" BASIS, 827 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 828 | See the License for the specific language governing permissions and 829 | limitations under the License. 830 | 831 | 832 | deprecation 833 | ISC 834 | The ISC License 835 | 836 | Copyright (c) Gregor Martynus and contributors 837 | 838 | Permission to use, copy, modify, and/or distribute this software for any 839 | purpose with or without fee is hereby granted, provided that the above 840 | copyright notice and this permission notice appear in all copies. 841 | 842 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 843 | WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 844 | MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 845 | ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 846 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 847 | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR 848 | IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 849 | 850 | 851 | error 852 | MIT 853 | 854 | js-yaml 855 | MIT 856 | (The MIT License) 857 | 858 | Copyright (C) 2011-2015 by Vitaly Puzrin 859 | 860 | Permission is hereby granted, free of charge, to any person obtaining a copy 861 | of this software and associated documentation files (the "Software"), to deal 862 | in the Software without restriction, including without limitation the rights 863 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 864 | copies of the Software, and to permit persons to whom the Software is 865 | furnished to do so, subject to the following conditions: 866 | 867 | The above copyright notice and this permission notice shall be included in 868 | all copies or substantial portions of the Software. 869 | 870 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 871 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 872 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 873 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 874 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 875 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 876 | THE SOFTWARE. 877 | 878 | 879 | once 880 | ISC 881 | The ISC License 882 | 883 | Copyright (c) Isaac Z. Schlueter and Contributors 884 | 885 | Permission to use, copy, modify, and/or distribute this software for any 886 | purpose with or without fee is hereby granted, provided that the above 887 | copyright notice and this permission notice appear in all copies. 888 | 889 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 890 | WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 891 | MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 892 | ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 893 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 894 | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR 895 | IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 896 | 897 | 898 | picomatch 899 | MIT 900 | The MIT License (MIT) 901 | 902 | Copyright (c) 2017-present, Jon Schlinkert. 903 | 904 | Permission is hereby granted, free of charge, to any person obtaining a copy 905 | of this software and associated documentation files (the "Software"), to deal 906 | in the Software without restriction, including without limitation the rights 907 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 908 | copies of the Software, and to permit persons to whom the Software is 909 | furnished to do so, subject to the following conditions: 910 | 911 | The above copyright notice and this permission notice shall be included in 912 | all copies or substantial portions of the Software. 913 | 914 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 915 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 916 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 917 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 918 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 919 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 920 | THE SOFTWARE. 921 | 922 | 923 | tunnel 924 | MIT 925 | The MIT License (MIT) 926 | 927 | Copyright (c) 2012 Koichi Kobayashi 928 | 929 | Permission is hereby granted, free of charge, to any person obtaining a copy 930 | of this software and associated documentation files (the "Software"), to deal 931 | in the Software without restriction, including without limitation the rights 932 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 933 | copies of the Software, and to permit persons to whom the Software is 934 | furnished to do so, subject to the following conditions: 935 | 936 | The above copyright notice and this permission notice shall be included in 937 | all copies or substantial portions of the Software. 938 | 939 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 940 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 941 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 942 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 943 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 944 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 945 | THE SOFTWARE. 946 | 947 | 948 | undici 949 | MIT 950 | MIT License 951 | 952 | Copyright (c) Matteo Collina and Undici contributors 953 | 954 | Permission is hereby granted, free of charge, to any person obtaining a copy 955 | of this software and associated documentation files (the "Software"), to deal 956 | in the Software without restriction, including without limitation the rights 957 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 958 | copies of the Software, and to permit persons to whom the Software is 959 | furnished to do so, subject to the following conditions: 960 | 961 | The above copyright notice and this permission notice shall be included in all 962 | copies or substantial portions of the Software. 963 | 964 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 965 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 966 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 967 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 968 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 969 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 970 | SOFTWARE. 971 | 972 | 973 | universal-user-agent 974 | ISC 975 | # [ISC License](https://spdx.org/licenses/ISC) 976 | 977 | Copyright (c) 2018, Gregor Martynus (https://github.com/gr2m) 978 | 979 | Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. 980 | 981 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 982 | 983 | 984 | wrappy 985 | ISC 986 | The ISC License 987 | 988 | Copyright (c) Isaac Z. Schlueter and Contributors 989 | 990 | Permission to use, copy, modify, and/or distribute this software for any 991 | purpose with or without fee is hereby granted, provided that the above 992 | copyright notice and this permission notice appear in all copies. 993 | 994 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 995 | WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 996 | MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 997 | ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 998 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 999 | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR 1000 | IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 1001 | --------------------------------------------------------------------------------