├── tests ├── data │ └── foo │ │ └── bar.txt └── app │ ├── go.mod │ └── main.go ├── .github ├── CODEOWNERS ├── FUNDING.yml ├── ghaction-virustotal-files.png ├── virustotal-github-actions.png ├── ghaction-virustotal-release-body.png ├── ISSUE_TEMPLATE │ ├── config.yml │ ├── feature.yml │ └── bug.yml ├── dependabot.yml ├── workflows │ ├── labels.yml │ ├── test.yml │ ├── validate.yml │ └── ci.yml ├── labels.yml ├── SUPPORT.md └── CONTRIBUTING.md ├── .eslintignore ├── .prettierignore ├── .gitattributes ├── .dockerignore ├── .prettierrc.json ├── .yarnrc.yml ├── codecov.yml ├── .editorconfig ├── jest.config.ts ├── tsconfig.json ├── .eslintrc.json ├── .gitignore ├── __tests__ ├── fixtures │ ├── repo.env │ └── repo.json ├── context.test.ts ├── virustotal.test.ts └── github.test.ts ├── LICENSE ├── action.yml ├── docker-bake.hcl ├── package.json ├── src ├── context.ts ├── virustotal.ts ├── github.ts └── main.ts ├── dev.Dockerfile ├── README.md └── dist ├── sourcemap-register.js └── licenses.txt /tests/data/foo/bar.txt: -------------------------------------------------------------------------------- 1 | scan me -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @crazy-max 2 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | /dist/** 2 | /coverage/** 3 | /node_modules/** 4 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | github: crazy-max 2 | custom: https://www.paypal.me/crazyws 3 | -------------------------------------------------------------------------------- /tests/app/go.mod: -------------------------------------------------------------------------------- 1 | module github.com/crazy-max/ghaction-virustotal/test/app 2 | 3 | go 1.20 4 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | # Dependency directories 2 | node_modules/ 3 | jspm_packages/ 4 | 5 | # yarn v2 6 | .yarn/ 7 | -------------------------------------------------------------------------------- /tests/app/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import "fmt" 4 | 5 | func main() { 6 | fmt.Println("hello world") 7 | } 8 | -------------------------------------------------------------------------------- /.github/ghaction-virustotal-files.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazy-max/ghaction-virustotal/HEAD/.github/ghaction-virustotal-files.png -------------------------------------------------------------------------------- /.github/virustotal-github-actions.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazy-max/ghaction-virustotal/HEAD/.github/virustotal-github-actions.png -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | /.yarn/releases/** binary 2 | /.yarn/plugins/** binary 3 | /dist/** linguist-generated=true 4 | /lib/** linguist-generated=true 5 | -------------------------------------------------------------------------------- /.github/ghaction-virustotal-release-body.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/crazy-max/ghaction-virustotal/HEAD/.github/ghaction-virustotal-release-body.png -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | /coverage 2 | 3 | # Dependency directories 4 | node_modules/ 5 | jspm_packages/ 6 | 7 | # yarn v2 8 | .yarn/cache 9 | .yarn/unplugged 10 | .yarn/build-state.yml 11 | .yarn/install-state.gz 12 | .pnp.* 13 | -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 240, 3 | "tabWidth": 2, 4 | "useTabs": false, 5 | "semi": true, 6 | "singleQuote": true, 7 | "trailingComma": "none", 8 | "bracketSpacing": false, 9 | "arrowParens": "avoid", 10 | "parser": "typescript" 11 | } 12 | -------------------------------------------------------------------------------- /.yarnrc.yml: -------------------------------------------------------------------------------- 1 | logFilters: 2 | - code: YN0013 3 | level: discard 4 | - code: YN0019 5 | level: discard 6 | - code: YN0076 7 | level: discard 8 | 9 | nodeLinker: node-modules 10 | 11 | plugins: 12 | - path: .yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs 13 | spec: "@yarnpkg/plugin-interactive-tools" 14 | -------------------------------------------------------------------------------- /codecov.yml: -------------------------------------------------------------------------------- 1 | comment: false 2 | 3 | coverage: 4 | status: 5 | project: # settings affecting project coverage 6 | default: 7 | target: auto # auto % coverage target 8 | threshold: 5% # allow for 5% reduction of coverage without failing 9 | patch: off 10 | 11 | github_checks: 12 | annotations: false 13 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # This file is for unifying the coding style for different editors and IDEs. 2 | # More information at http://editorconfig.org 3 | 4 | root = true 5 | 6 | [*] 7 | indent_style = space 8 | indent_size = 2 9 | end_of_line = lf 10 | charset = utf-8 11 | trim_trailing_whitespace = true 12 | insert_final_newline = true 13 | 14 | [*.md] 15 | trim_trailing_whitespace = false 16 | -------------------------------------------------------------------------------- /jest.config.ts: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | clearMocks: true, 3 | testEnvironment: 'node', 4 | moduleFileExtensions: ['js', 'ts'], 5 | setupFiles: ['dotenv/config'], 6 | testMatch: ['**/*.test.ts'], 7 | transform: { 8 | '^.+\\.ts$': 'ts-jest' 9 | }, 10 | collectCoverageFrom: ['src/**/{!(main.ts),}.ts'], 11 | coveragePathIgnorePatterns: ['dist/', 'node_modules/', '__tests__/'], 12 | verbose: true 13 | }; 14 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | # https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/configuring-issue-templates-for-your-repository#configuring-the-template-chooser 2 | blank_issues_enabled: true 3 | contact_links: 4 | - name: Questions and Discussions 5 | url: https://github.com/crazy-max/ghaction-virustotal/discussions/new 6 | about: Use Github Discussions to ask questions and/or open discussion topics. 7 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "esModuleInterop": true, 4 | "target": "es6", 5 | "module": "commonjs", 6 | "newLine": "lf", 7 | "outDir": "./lib", 8 | "rootDir": "./src", 9 | "forceConsistentCasingInFileNames": true, 10 | "noImplicitAny": false, 11 | "resolveJsonModule": true, 12 | "useUnknownInCatchVariables": false, 13 | }, 14 | "exclude": [ 15 | "node_modules", 16 | "**/*.test.ts", 17 | "jest.config.ts" 18 | ] 19 | } 20 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "github-actions" 4 | directory: "/" 5 | schedule: 6 | interval: "daily" 7 | labels: 8 | - "kind/dependencies" 9 | - "bot" 10 | - package-ecosystem: "npm" 11 | directory: "/" 12 | schedule: 13 | interval: "daily" 14 | versioning-strategy: "increase" 15 | allow: 16 | - dependency-type: "production" 17 | labels: 18 | - "kind/dependencies" 19 | - "bot" 20 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature.yml: -------------------------------------------------------------------------------- 1 | # https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/syntax-for-githubs-form-schema 2 | name: Feature request 3 | description: Missing functionality? Come tell us about it! 4 | labels: 5 | - kind/enhancement 6 | - status/triage 7 | 8 | body: 9 | - type: textarea 10 | id: description 11 | attributes: 12 | label: Description 13 | description: What is the feature you want to see? 14 | validations: 15 | required: true 16 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "node": true, 4 | "es6": true, 5 | "jest": true 6 | }, 7 | "extends": [ 8 | "eslint:recommended", 9 | "plugin:@typescript-eslint/eslint-recommended", 10 | "plugin:@typescript-eslint/recommended", 11 | "plugin:jest/recommended", 12 | "plugin:prettier/recommended" 13 | ], 14 | "parser": "@typescript-eslint/parser", 15 | "parserOptions": { 16 | "ecmaVersion": "latest", 17 | "sourceType": "module" 18 | }, 19 | "plugins": [ 20 | "@typescript-eslint", 21 | "jest", 22 | "prettier" 23 | ] 24 | } 25 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # https://raw.githubusercontent.com/github/gitignore/main/Node.gitignore 2 | 3 | # Logs 4 | logs 5 | *.log 6 | npm-debug.log* 7 | yarn-debug.log* 8 | yarn-error.log* 9 | lerna-debug.log* 10 | .pnpm-debug.log* 11 | 12 | # Diagnostic reports (https://nodejs.org/api/report.html) 13 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 14 | 15 | # Runtime data 16 | pids 17 | *.pid 18 | *.seed 19 | *.pid.lock 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | *.lcov 24 | 25 | # Dependency directories 26 | node_modules/ 27 | jspm_packages/ 28 | 29 | # TypeScript cache 30 | *.tsbuildinfo 31 | 32 | # Optional npm cache directory 33 | .npm 34 | 35 | # Optional eslint cache 36 | .eslintcache 37 | 38 | # Yarn Integrity file 39 | .yarn-integrity 40 | 41 | # dotenv environment variable files 42 | .env 43 | .env.development.local 44 | .env.test.local 45 | .env.production.local 46 | .env.local 47 | 48 | # yarn v2 49 | .yarn/cache 50 | .yarn/unplugged 51 | .yarn/build-state.yml 52 | .yarn/install-state.gz 53 | .pnp.* 54 | -------------------------------------------------------------------------------- /.github/workflows/labels.yml: -------------------------------------------------------------------------------- 1 | name: labels 2 | 3 | concurrency: 4 | group: ${{ github.workflow }}-${{ github.ref }} 5 | cancel-in-progress: true 6 | 7 | # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#permissions 8 | permissions: 9 | contents: read 10 | 11 | on: 12 | push: 13 | branches: 14 | - 'master' 15 | paths: 16 | - '.github/labels.yml' 17 | - '.github/workflows/labels.yml' 18 | pull_request: 19 | paths: 20 | - '.github/labels.yml' 21 | - '.github/workflows/labels.yml' 22 | 23 | jobs: 24 | labeler: 25 | runs-on: ubuntu-latest 26 | permissions: 27 | # same as global permissions 28 | contents: read 29 | # required to update labels 30 | issues: write 31 | steps: 32 | - 33 | name: Checkout 34 | uses: actions/checkout@v4 35 | - 36 | name: Run Labeler 37 | uses: crazy-max/ghaction-github-labeler@v5 38 | with: 39 | dry-run: ${{ github.event_name == 'pull_request' }} 40 | -------------------------------------------------------------------------------- /__tests__/fixtures/repo.env: -------------------------------------------------------------------------------- 1 | GITHUB_ACTION=crazy-maxghaction-dump-context 2 | GITHUB_ACTIONS=true 3 | GITHUB_ACTION_PATH=/home/runner/work/_actions/crazy-max/ghaction-dump-context/v1 4 | GITHUB_ACTION_REF= 5 | GITHUB_ACTION_REPOSITORY= 6 | GITHUB_ACTOR=crazy-max 7 | GITHUB_API_URL=https://api.github.com 8 | GITHUB_BASE_REF= 9 | GITHUB_ENV=/home/runner/work/_temp/_runner_file_commands/set_env_a9bb29d9-c530-4234-a6bc-c19f2e166b64 10 | GITHUB_EVENT_NAME=push 11 | GITHUB_EVENT_PATH=./__tests__/fixtures/repo.json 12 | GITHUB_GRAPHQL_URL=https://api.github.com/graphql 13 | GITHUB_HEAD_REF= 14 | GITHUB_JOB=dump 15 | GITHUB_PATH=/home/runner/work/_temp/_runner_file_commands/add_path_a9bb29d9-c530-4234-a6bc-c19f2e166b64 16 | GITHUB_REF=refs/heads/master 17 | GITHUB_REPOSITORY=portapps/brave-portable 18 | GITHUB_REPOSITORY_OWNER=portapps 19 | GITHUB_RETENTION_DAYS=90 20 | GITHUB_RUN_ID=911271838 21 | GITHUB_RUN_NUMBER=1 22 | GITHUB_SERVER_URL=https://github.com 23 | GITHUB_SHA=411b28b73d17742f4afd55a46ef2c7483a760e5f 24 | GITHUB_WORKFLOW=dump 25 | GITHUB_WORKSPACE=/home/runner/work/brave-portable/brave-portable 26 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: test 2 | 3 | concurrency: 4 | group: ${{ github.workflow }}-${{ github.ref }} 5 | cancel-in-progress: true 6 | 7 | # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#permissions 8 | permissions: 9 | contents: read 10 | 11 | on: 12 | push: 13 | branches: 14 | - 'master' 15 | - 'releases/v*' 16 | pull_request: 17 | 18 | jobs: 19 | test: 20 | runs-on: ubuntu-latest 21 | steps: 22 | - 23 | name: Checkout 24 | uses: actions/checkout@v4 25 | - 26 | name: Test 27 | uses: docker/bake-action@v6 28 | with: 29 | source: . 30 | targets: test 31 | env: 32 | VT_API_KEY: ${{ secrets.VT_API_KEY }} 33 | VT_MONITOR_API_KEY: ${{ secrets.VT_MONITOR_API_KEY}} 34 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 35 | - 36 | name: Upload coverage 37 | uses: codecov/codecov-action@v5 38 | with: 39 | files: ./coverage/clover.xml 40 | token: ${{ secrets.CODECOV_TOKEN }} 41 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020-2025 CrazyMax 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.github/workflows/validate.yml: -------------------------------------------------------------------------------- 1 | name: validate 2 | 3 | concurrency: 4 | group: ${{ github.workflow }}-${{ github.ref }} 5 | cancel-in-progress: true 6 | 7 | # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#permissions 8 | permissions: 9 | contents: read 10 | 11 | on: 12 | push: 13 | branches: 14 | - 'master' 15 | - 'releases/v*' 16 | pull_request: 17 | 18 | jobs: 19 | prepare: 20 | runs-on: ubuntu-latest 21 | outputs: 22 | targets: ${{ steps.generate.outputs.targets }} 23 | steps: 24 | - 25 | name: Checkout 26 | uses: actions/checkout@v4 27 | - 28 | name: List targets 29 | id: generate 30 | uses: docker/bake-action/subaction/list-targets@v6 31 | with: 32 | target: validate 33 | 34 | validate: 35 | runs-on: ubuntu-latest 36 | needs: 37 | - prepare 38 | strategy: 39 | fail-fast: false 40 | matrix: 41 | target: ${{ fromJson(needs.prepare.outputs.targets) }} 42 | steps: 43 | - 44 | name: Validate 45 | uses: docker/bake-action@v6 46 | with: 47 | targets: ${{ matrix.target }} 48 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: ci 2 | 3 | concurrency: 4 | group: ${{ github.workflow }}-${{ github.ref }} 5 | cancel-in-progress: true 6 | 7 | # https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#permissions 8 | permissions: 9 | contents: read 10 | 11 | on: 12 | schedule: 13 | - cron: '0 10 * * *' 14 | push: 15 | branches: 16 | - 'master' 17 | - 'releases/v*' 18 | tags: 19 | - 'v*' 20 | 21 | jobs: 22 | ci: 23 | runs-on: ubuntu-latest 24 | steps: 25 | - 26 | name: Checkout 27 | uses: actions/checkout@v4 28 | - 29 | name: Set up Go 30 | uses: actions/setup-go@v5 31 | - 32 | name: Build Windows executables 33 | run: | 34 | go mod download 35 | GOOS=windows GOARCH=386 go build -o ./ghaction-virustotal-win32.exe -ldflags "-s -w" 36 | GOOS=windows GOARCH=amd64 go build -o ./ghaction-virustotal-win64.exe -ldflags "-s -w" 37 | working-directory: ./tests/app/ 38 | - 39 | name: VirusTotal scan 40 | id: vt 41 | uses: ./ 42 | with: 43 | vt_api_key: ${{ secrets.VT_API_KEY }} 44 | files: | 45 | ./tests/app/*.exe 46 | -------------------------------------------------------------------------------- /.github/labels.yml: -------------------------------------------------------------------------------- 1 | ## more info https://github.com/crazy-max/ghaction-github-labeler 2 | - 3 | name: "bot" 4 | color: "69cde9" 5 | description: "" 6 | - 7 | name: "good first issue" 8 | color: "7057ff" 9 | description: "" 10 | - 11 | name: "help wanted" 12 | color: "4caf50" 13 | description: "" 14 | - 15 | name: "area/ci" 16 | color: "ed9ca9" 17 | description: "" 18 | - 19 | name: "kind/bug" 20 | color: "b60205" 21 | description: "" 22 | - 23 | name: "kind/dependencies" 24 | color: "0366d6" 25 | description: "" 26 | - 27 | name: "kind/docs" 28 | color: "c5def5" 29 | description: "" 30 | - 31 | name: "kind/duplicate" 32 | color: "cccccc" 33 | description: "" 34 | - 35 | name: "kind/enhancement" 36 | color: "0054ca" 37 | description: "" 38 | - 39 | name: "kind/invalid" 40 | color: "e6e6e6" 41 | description: "" 42 | - 43 | name: "kind/upstream" 44 | color: "fbca04" 45 | description: "" 46 | - 47 | name: "kind/wontfix" 48 | color: "ffffff" 49 | description: "" 50 | - 51 | name: "status/automerge" 52 | color: "8f4fbc" 53 | description: "" 54 | - 55 | name: "status/needs-investigation" 56 | color: "e6625b" 57 | description: "" 58 | - 59 | name: "status/needs-more-info" 60 | color: "795548" 61 | description: "" 62 | - 63 | name: "status/stale" 64 | color: "237da0" 65 | description: "" 66 | - 67 | name: "status/triage" 68 | color: "dde4b7" 69 | description: "" 70 | -------------------------------------------------------------------------------- /action.yml: -------------------------------------------------------------------------------- 1 | # https://help.github.com/en/articles/metadata-syntax-for-github-actions 2 | name: 'VirusTotal GitHub Action' 3 | description: "GitHub Action to upload and scan files with VirusTotal" 4 | author: 'crazy-max' 5 | branding: 6 | color: 'red' 7 | icon: 'activity' 8 | 9 | inputs: 10 | vt_api_key: 11 | description: 'The GitHub token used to create an authenticated client for GitHub API' 12 | required: true 13 | files: 14 | description: 'Newline-delimited list of path globs for asset files to upload for analysis' 15 | required: true 16 | vt_monitor: 17 | description: 'If enabled, files will be uploaded to VirusTotal Monitor endpoint' 18 | default: 'false' 19 | required: false 20 | monitor_path: 21 | description: 'A path relative to current monitor user root folder to upload files' 22 | default: '/' 23 | required: false 24 | update_release_body: 25 | description: 'If enabled, analysis link(s) will be appended to the release body' 26 | default: 'false' 27 | required: true 28 | github_token: 29 | description: 'The GitHub token used to create an authenticated client for GitHub API' 30 | default: ${{ github.token }} 31 | required: false 32 | request_rate: 33 | description: 'API request-rate in requests/minute' 34 | default: '0' 35 | required: true 36 | 37 | outputs: 38 | analysis: 39 | description: 'Analysis results formatted as asset=analysisURL (comma separated)' 40 | 41 | runs: 42 | using: 'node20' 43 | main: 'dist/index.js' 44 | -------------------------------------------------------------------------------- /.github/SUPPORT.md: -------------------------------------------------------------------------------- 1 | # Support [![](https://isitmaintained.com/badge/resolution/crazy-max/ghaction-virustotal.svg)](https://isitmaintained.com/project/crazy-max/ghaction-virustotal) 2 | 3 | ## Reporting an issue 4 | 5 | Please do a search in [open issues](https://github.com/crazy-max/ghaction-virustotal/issues?utf8=%E2%9C%93&q=) to see if the issue or feature request has already been filed. 6 | 7 | If you find your issue already exists, make relevant comments and add your [reaction](https://github.com/blog/2119-add-reactions-to-pull-requests-issues-and-comments). Use a reaction in place of a "+1" comment. 8 | 9 | :+1: - upvote 10 | 11 | :-1: - downvote 12 | 13 | If you cannot find an existing issue that describes your bug or feature, submit an issue using the guidelines below. 14 | 15 | ## Writing good bug reports and feature requests 16 | 17 | File a single issue per problem and feature request. 18 | 19 | * Do not enumerate multiple bugs or feature requests in the same issue. 20 | * Do not add your issue as a comment to an existing issue unless it's for the identical input. Many issues look similar, but have different causes. 21 | 22 | The more information you can provide, the more likely someone will be successful reproducing the issue and finding a fix. 23 | 24 | You are now ready to [create a new issue](https://github.com/crazy-max/ghaction-virustotal/issues/new/choose)! 25 | 26 | ## Closure policy 27 | 28 | * Issues that don't have the information requested above (when applicable) will be closed immediately and the poster directed to the support guidelines. 29 | * Issues that go a week without a response from original poster are subject to closure at my discretion. 30 | -------------------------------------------------------------------------------- /__tests__/context.test.ts: -------------------------------------------------------------------------------- 1 | import {describe, expect, it} from '@jest/globals'; 2 | import * as context from '../src/context'; 3 | 4 | describe('getInputList', () => { 5 | it('handles single line correctly', async () => { 6 | await setInput('foo', 'bar'); 7 | const res = await context.getInputList('foo'); 8 | expect(res).toEqual(['bar']); 9 | }); 10 | 11 | it('handles multiple lines correctly', async () => { 12 | setInput('foo', 'bar\nbaz'); 13 | const res = await context.getInputList('foo'); 14 | expect(res).toEqual(['bar', 'baz']); 15 | }); 16 | 17 | it('handles comma correctly', async () => { 18 | setInput('foo', 'bar,baz'); 19 | const res = await context.getInputList('foo'); 20 | expect(res).toEqual(['bar', 'baz']); 21 | }); 22 | 23 | it('handles different new lines correctly', async () => { 24 | setInput('foo', 'bar\r\nbaz'); 25 | const res = await context.getInputList('foo'); 26 | expect(res).toEqual(['bar', 'baz']); 27 | }); 28 | 29 | it('handles different new lines and comma correctly', async () => { 30 | setInput('foo', 'bar\r\nbaz,bat'); 31 | const res = await context.getInputList('foo'); 32 | expect(res).toEqual(['bar', 'baz', 'bat']); 33 | }); 34 | }); 35 | 36 | describe('resolvePaths', () => { 37 | it('resolves files given a set of paths', async () => { 38 | expect(context.resolvePaths(['tests/data/**/*'])).toEqual(['tests/data/foo/bar.txt']); 39 | }); 40 | }); 41 | 42 | // See: https://github.com/actions/toolkit/blob/master/packages/core/src/core.ts#L67 43 | function getInputName(name: string): string { 44 | return `INPUT_${name.replace(/ /g, '_').toUpperCase()}`; 45 | } 46 | 47 | function setInput(name: string, value: string): void { 48 | process.env[getInputName(name)] = value; 49 | } 50 | -------------------------------------------------------------------------------- /docker-bake.hcl: -------------------------------------------------------------------------------- 1 | target "_common" { 2 | args = { 3 | BUILDKIT_CONTEXT_KEEP_GIT_DIR = 1 4 | } 5 | } 6 | 7 | group "default" { 8 | targets = ["build"] 9 | } 10 | 11 | group "pre-checkin" { 12 | targets = ["vendor", "format", "build"] 13 | } 14 | 15 | group "validate" { 16 | targets = ["lint", "build-validate", "vendor-validate"] 17 | } 18 | 19 | target "build" { 20 | dockerfile = "dev.Dockerfile" 21 | target = "build-update" 22 | output = ["."] 23 | } 24 | 25 | target "build-validate" { 26 | inherits = ["_common"] 27 | dockerfile = "dev.Dockerfile" 28 | target = "build-validate" 29 | output = ["type=cacheonly"] 30 | } 31 | 32 | target "format" { 33 | dockerfile = "dev.Dockerfile" 34 | target = "format-update" 35 | output = ["."] 36 | } 37 | 38 | target "lint" { 39 | dockerfile = "dev.Dockerfile" 40 | target = "lint" 41 | output = ["type=cacheonly"] 42 | } 43 | 44 | target "vendor" { 45 | dockerfile = "dev.Dockerfile" 46 | target = "vendor-update" 47 | output = ["."] 48 | } 49 | 50 | target "vendor-validate" { 51 | inherits = ["_common"] 52 | dockerfile = "dev.Dockerfile" 53 | target = "vendor-validate" 54 | output = ["type=cacheonly"] 55 | } 56 | 57 | variable "GITHUB_REPOSITORY" { 58 | default = "crazy-max/ghaction-virustotal" 59 | } 60 | 61 | target "test" { 62 | dockerfile = "dev.Dockerfile" 63 | args = { 64 | GITHUB_REPOSITORY = GITHUB_REPOSITORY 65 | } 66 | target = "test-coverage" 67 | output = ["./coverage"] 68 | secret = [ 69 | "id=GITHUB_TOKEN,env=GITHUB_TOKEN", 70 | "id=VT_API_KEY,env=VT_API_KEY", 71 | "id=VT_MONITOR_API_KEY,env=VT_MONITOR_API_KEY" 72 | ] 73 | } 74 | 75 | target "test-local" { 76 | inherits = ["test"] 77 | secret = [ 78 | "id=GITHUB_TOKEN,src=.dev/.ghtoken", 79 | "id=VT_API_KEY,src=.dev/.vtapikey", 80 | "id=VT_MONITOR_API_KEY,src=.dev/.vtmonitorapikey" 81 | ] 82 | } 83 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "virustotal-github-action", 3 | "description": "GitHub Action to upload and scan files with VirusTotal", 4 | "main": "src/main.ts", 5 | "scripts": { 6 | "build": "ncc build src/main.ts --source-map --minify --license licenses.txt", 7 | "lint": "yarn run prettier && yarn run eslint", 8 | "format": "yarn run prettier:fix && yarn run eslint:fix", 9 | "eslint": "eslint --max-warnings=0 .", 10 | "eslint:fix": "eslint --fix .", 11 | "prettier": "prettier --check \"./**/*.ts\"", 12 | "prettier:fix": "prettier --write \"./**/*.ts\"", 13 | "test": "jest", 14 | "all": "yarn run build && yarn run format && yarn test" 15 | }, 16 | "repository": { 17 | "type": "git", 18 | "url": "git+https://github.com/crazy-max/ghaction-virustotal.git" 19 | }, 20 | "keywords": [ 21 | "actions", 22 | "virustotal", 23 | "analysis", 24 | "malware", 25 | "security" 26 | ], 27 | "author": "CrazyMax", 28 | "license": "MIT", 29 | "packageManager": "yarn@3.6.3", 30 | "dependencies": { 31 | "@actions/core": "^1.11.1", 32 | "@actions/github": "^6.0.0", 33 | "@octokit/core": "^5.2.1", 34 | "@octokit/plugin-retry": "^6.0.1", 35 | "axios": "^1.8.4", 36 | "form-data": "^4.0.2", 37 | "limiter": "^2.1.0", 38 | "mime": "^3.0.0" 39 | }, 40 | "devDependencies": { 41 | "@types/form-data": "^2.5.0", 42 | "@types/mime": "^3.0.1", 43 | "@types/node": "^20.6.0", 44 | "@typescript-eslint/eslint-plugin": "^6.6.0", 45 | "@typescript-eslint/parser": "^6.6.0", 46 | "@vercel/ncc": "^0.38.0", 47 | "dotenv": "^16.3.1", 48 | "eslint": "^8.49.0", 49 | "eslint-config-prettier": "^9.0.0", 50 | "eslint-plugin-jest": "^27.2.3", 51 | "eslint-plugin-prettier": "^5.0.0", 52 | "jest": "^29.6.4", 53 | "prettier": "^3.0.3", 54 | "ts-jest": "^29.1.1", 55 | "ts-node": "^10.9.1", 56 | "typescript": "^5.2.2" 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /__tests__/virustotal.test.ts: -------------------------------------------------------------------------------- 1 | import {describe, expect, it} from '@jest/globals'; 2 | import {mimeOrDefault, asset, VirusTotal} from '../src/virustotal'; 3 | 4 | describe('virustotal', () => { 5 | describe('mimeOrDefault', () => { 6 | it('returns a specific mime for common path', async () => { 7 | expect(mimeOrDefault('foo.tar.gz')).toEqual('application/gzip'); 8 | }); 9 | it('returns default mime for uncommon path', async () => { 10 | expect(mimeOrDefault('foo.uncommon')).toEqual('application/octet-stream'); 11 | }); 12 | }); 13 | 14 | it('derives asset info from a path', async () => { 15 | const {name, mime, size, file} = asset('tests/data/foo/bar.txt'); 16 | expect(name).toEqual('bar.txt'); 17 | expect(mime).toEqual('text/plain'); 18 | expect(size).toEqual(7); 19 | expect(file.toString()).toEqual('scan me'); 20 | }); 21 | 22 | (process.env.VT_API_KEY ? it : it.skip)( 23 | 'uploads asset on VirusTotal', 24 | async () => { 25 | const vt: VirusTotal = new VirusTotal(process.env.VT_API_KEY); 26 | await vt.files('tests/data/foo/bar.txt').then(upload => { 27 | // eslint-disable-next-line jest/no-standalone-expect 28 | expect(upload.id).not.toBeUndefined(); 29 | // eslint-disable-next-line jest/no-standalone-expect 30 | expect(upload.url).not.toBeUndefined(); 31 | }); 32 | }, 33 | 30000 34 | ); 35 | 36 | (process.env.VT_MONITOR_API_KEY ? it : it.skip)( 37 | 'uploads asset on VirusTotal Monitor', 38 | async () => { 39 | const vt: VirusTotal = new VirusTotal(process.env.VT_MONITOR_API_KEY); 40 | await vt.monitorItems('tests/data/foo/bar.txt', '/test').then(upload => { 41 | // eslint-disable-next-line jest/no-standalone-expect 42 | expect(upload.id).not.toBeUndefined(); 43 | // eslint-disable-next-line jest/no-standalone-expect 44 | expect(upload.url).not.toBeUndefined(); 45 | }); 46 | }, 47 | 30000 48 | ); 49 | }); 50 | -------------------------------------------------------------------------------- /src/context.ts: -------------------------------------------------------------------------------- 1 | import * as glob from 'glob'; 2 | import * as fs from 'fs'; 3 | import * as path from 'path'; 4 | import * as os from 'os'; 5 | import * as core from '@actions/core'; 6 | 7 | let _tmpDir: string; 8 | 9 | export interface Inputs { 10 | vtApiKey: string; 11 | files: string[]; 12 | vtMonitor: boolean; 13 | monitorPath: string; 14 | updateReleaseBody: boolean; 15 | githubToken: string; 16 | requestRate: number; 17 | } 18 | 19 | export function tmpDir(): string { 20 | if (!_tmpDir) { 21 | _tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'ghaction-virustotal-')).split(path.sep).join(path.posix.sep); 22 | } 23 | return _tmpDir; 24 | } 25 | 26 | export async function getInputs(): Promise { 27 | return { 28 | vtApiKey: core.getInput('vt_api_key'), 29 | files: await getInputList('files'), 30 | vtMonitor: core.getBooleanInput('vt_monitor'), 31 | monitorPath: core.getInput('monitor_path') || '/', 32 | updateReleaseBody: core.getBooleanInput('update_release_body'), 33 | githubToken: core.getInput('github_token'), 34 | requestRate: parseInt(core.getInput('request_rate') || '0') 35 | }; 36 | } 37 | 38 | export async function getInputList(name: string): Promise { 39 | const items = core.getInput(name); 40 | if (items == '') { 41 | return []; 42 | } 43 | return items.split(/\r?\n/).reduce( 44 | (acc, line) => 45 | acc 46 | .concat(line.split(',')) 47 | .filter(pat => pat) 48 | .map(pat => pat.trim()), 49 | [] 50 | ); 51 | } 52 | 53 | export const asyncForEach = async (array, callback) => { 54 | for (let index = 0; index < array.length; index++) { 55 | await callback(array[index], index, array); 56 | } 57 | }; 58 | 59 | export const resolvePaths = (patterns: string[]): string[] => { 60 | return patterns.reduce((acc: string[], pattern: string): string[] => { 61 | return acc.concat(glob.sync(pattern).filter(path => fs.lstatSync(path).isFile())); 62 | }, []); 63 | }; 64 | -------------------------------------------------------------------------------- /.github/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | ## Contributing 2 | 3 | Hi there! We're thrilled that you'd like to contribute to this project. Your help is essential for keeping it great. 4 | 5 | Contributions to this project are [released](https://docs.github.com/en/github/site-policy/github-terms-of-service#6-contributions-under-repository-license) 6 | to the public under the [project's open source license](LICENSE). 7 | 8 | ## Submitting a pull request 9 | 10 | 1. [Fork](https://github.com/crazy-max/ghaction-virustotal/fork) and clone the repository 11 | 2. Configure and install the dependencies: `yarn install` 12 | 3. Create a new branch: `git checkout -b my-branch-name` 13 | 4. Make your changes 14 | 5. Make sure the tests pass: `docker buildx bake test` 15 | 6. Format code and build javascript artifacts: `docker buildx bake pre-checkin` 16 | 7. Validate all code has correctly formatted and built: `docker buildx bake validate` 17 | 8. Push to your fork and [submit a pull request](https://github.com/crazy-max/ghaction-virustotal/compare) 18 | 9. Pat your self on the back and wait for your pull request to be reviewed and merged. 19 | 20 | Here are a few things you can do that will increase the likelihood of your pull request being accepted: 21 | 22 | - Write tests. 23 | - Make sure the `README.md` and any other relevant **documentation are kept up-to-date**. 24 | - We try to follow [SemVer v2.0.0](https://semver.org/). Randomly breaking public APIs is not an option. 25 | - Keep your change as focused as possible. If there are multiple changes you would like to make that are not dependent upon each other, consider submitting them as **separate pull requests**. 26 | - Write a [good commit message](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html). 27 | 28 | ## Resources 29 | 30 | - [How to Contribute to Open Source](https://opensource.guide/how-to-contribute/) 31 | - [Using Pull Requests](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-requests) 32 | - [GitHub Help](https://docs.github.com/en) 33 | -------------------------------------------------------------------------------- /__tests__/github.test.ts: -------------------------------------------------------------------------------- 1 | import {beforeEach, describe, expect, it, jest} from '@jest/globals'; 2 | import * as fs from 'fs'; 3 | import * as path from 'path'; 4 | import * as dotenv from 'dotenv'; 5 | import * as context from '../src/context'; 6 | import * as github from '../src/github'; 7 | import {Octokit} from '../src/github'; 8 | import {asset} from '../src/virustotal'; 9 | import {Context} from '@actions/github/lib/context'; 10 | 11 | let octokit: Octokit; 12 | 13 | jest.spyOn(context, 'tmpDir').mockImplementation((): string => { 14 | const tmpDir = path.join('/tmp/.ghaction-virustotal-jest').split(path.sep).join(path.posix.sep); 15 | if (!fs.existsSync(tmpDir)) { 16 | fs.mkdirSync(tmpDir, {recursive: true}); 17 | } 18 | return tmpDir; 19 | }); 20 | 21 | jest.spyOn(github, 'context').mockImplementation((): Context => { 22 | return new Context(); 23 | }); 24 | 25 | beforeEach(() => { 26 | Object.keys(process.env).forEach(function (key) { 27 | if (key !== 'GITHUB_TOKEN' && key.startsWith('GITHUB_')) { 28 | delete process.env[key]; 29 | } 30 | }); 31 | const repoEnv = dotenv.parse(fs.readFileSync(path.join(__dirname, 'fixtures', 'repo.env'))); 32 | for (const k in repoEnv) { 33 | process.env[k] = repoEnv[k]; 34 | } 35 | octokit = github.getOctokit(process.env.GITHUB_TOKEN || '', { 36 | log: console 37 | }); 38 | }); 39 | 40 | describe('github', () => { 41 | let release: github.Release; 42 | let assets: Array; 43 | 44 | it('returns a GitHub release', async () => { 45 | release = await github.getRelease(octokit, '1.20.110-71'); 46 | expect(release).not.toBeUndefined(); 47 | expect(release.id).toEqual(38769571); 48 | }); 49 | 50 | it('returns a GitHub release assets list', async () => { 51 | if (!release) { 52 | release = await github.getRelease(octokit, '1.20.110-71'); 53 | } 54 | 55 | assets = await github.getReleaseAssets(octokit, release, ['brave-portable-(win32|win64).exe']); 56 | expect(release).not.toBeUndefined(); 57 | expect(assets.length).toEqual(2); 58 | expect(assets[0].name).toEqual('brave-portable-win32.exe'); 59 | expect(assets[1].name).toEqual('brave-portable-win64.exe'); 60 | }); 61 | 62 | it('download a GitHub release asset', async () => { 63 | if (!release) { 64 | release = await github.getRelease(octokit, '1.20.110-71'); 65 | } 66 | if (!assets) { 67 | assets = await github.getReleaseAssets(octokit, release, ['brave-portable-(win32|win64).exe']); 68 | } 69 | 70 | const releaseAsset = await github.downloadReleaseAsset(octokit, assets[0], path.join(context.tmpDir(), assets[0].name)); 71 | // eslint-disable-next-line @typescript-eslint/no-unused-vars 72 | const {name, size, mime, file} = asset(releaseAsset); 73 | expect(size).toEqual(4391936); 74 | expect(mime).toEqual('application/octet-stream'); 75 | }); 76 | }); 77 | -------------------------------------------------------------------------------- /dev.Dockerfile: -------------------------------------------------------------------------------- 1 | # syntax=docker/dockerfile:1 2 | 3 | ARG NODE_VERSION=20 4 | 5 | FROM node:${NODE_VERSION}-alpine AS base 6 | RUN apk add --no-cache cpio findutils git 7 | WORKDIR /src 8 | RUN --mount=type=bind,target=.,rw \ 9 | --mount=type=cache,target=/src/.yarn/cache <&2 'ERROR: Vendor result differs. Please vendor your package with "docker buildx bake vendor-update"' 31 | git status --porcelain -- yarn.lock 32 | exit 1 33 | fi 34 | EOT 35 | 36 | FROM deps AS build 37 | RUN --mount=type=bind,target=.,rw \ 38 | --mount=type=cache,target=/src/.yarn/cache \ 39 | --mount=type=cache,target=/src/node_modules \ 40 | yarn run build && mkdir /out && cp -Rf dist /out/ 41 | 42 | FROM scratch AS build-update 43 | COPY --from=build /out / 44 | 45 | FROM build AS build-validate 46 | RUN --mount=type=bind,target=.,rw <&2 'ERROR: Build result differs. Please build first with "docker buildx bake build"' 52 | git status --porcelain -- dist 53 | exit 1 54 | fi 55 | EOT 56 | 57 | FROM deps AS format 58 | RUN --mount=type=bind,target=.,rw \ 59 | --mount=type=cache,target=/src/.yarn/cache \ 60 | --mount=type=cache,target=/src/node_modules \ 61 | yarn run format \ 62 | && mkdir /out && find . -name '*.ts' -not -path './node_modules/*' -not -path './.yarn/*' | cpio -pdm /out 63 | 64 | FROM scratch AS format-update 65 | COPY --from=format /out / 66 | 67 | FROM deps AS lint 68 | RUN --mount=type=bind,target=.,rw \ 69 | --mount=type=cache,target=/src/.yarn/cache \ 70 | --mount=type=cache,target=/src/node_modules \ 71 | yarn run lint 72 | 73 | FROM deps AS test 74 | ENV RUNNER_TEMP=/tmp/github_runner 75 | ENV RUNNER_TOOL_CACHE=/tmp/github_tool_cache 76 | ARG GITHUB_REPOSITORY 77 | RUN --mount=type=bind,target=.,rw \ 78 | --mount=type=cache,target=/src/.yarn/cache \ 79 | --mount=type=cache,target=/src/node_modules \ 80 | --mount=type=secret,id=GITHUB_TOKEN \ 81 | --mount=type=secret,id=VT_API_KEY \ 82 | --mount=type=secret,id=VT_MONITOR_API_KEY \ 83 | GITHUB_TOKEN=$(cat /run/secrets/GITHUB_TOKEN) \ 84 | VT_API_KEY=$(cat /run/secrets/VT_API_KEY) \ 85 | VT_MONITOR_API_KEY=$(cat /run/secrets/VT_MONITOR_API_KEY) \ 86 | yarn run test --coverage --coverageDirectory=/tmp/coverage 87 | 88 | FROM scratch AS test-coverage 89 | COPY --from=test /tmp/coverage / 90 | -------------------------------------------------------------------------------- /src/virustotal.ts: -------------------------------------------------------------------------------- 1 | import {lstatSync, readFileSync} from 'fs'; 2 | import {getType} from 'mime'; 3 | import {basename, posix} from 'path'; 4 | import axios, {AxiosInstance} from 'axios'; 5 | import FormData from 'form-data'; 6 | import * as core from '@actions/core'; 7 | 8 | interface UploadData { 9 | id: string; 10 | type: string; 11 | url: string; 12 | } 13 | 14 | export interface Asset { 15 | name: string; 16 | mime: string; 17 | size: number; 18 | file: Buffer; 19 | } 20 | 21 | export class VirusTotal { 22 | private instance: AxiosInstance; 23 | 24 | constructor(apiKey: string | undefined) { 25 | this.instance = axios.create({ 26 | baseURL: 'https://www.virustotal.com/api/v3', 27 | headers: { 28 | 'x-apikey': apiKey ?? '' 29 | }, 30 | maxContentLength: Infinity, 31 | maxBodyLength: Infinity 32 | }); 33 | } 34 | 35 | public async files(filename: string): Promise { 36 | const {name, mime, size, file} = asset(filename); 37 | const fd = new FormData(); 38 | fd.append('file', file, { 39 | filename: name, 40 | contentType: mime, 41 | knownLength: size 42 | }); 43 | 44 | return this.instance 45 | .post( 46 | size < 32 * 1024 * 1024 47 | ? '/files' 48 | : await this.instance.get('/files/upload_url').then(res => { 49 | return res.data.data; 50 | }), 51 | fd.getBuffer(), 52 | { 53 | headers: fd.getHeaders() 54 | } 55 | ) 56 | .then(upload => { 57 | const data = upload.data.data as UploadData; 58 | data.url = `https://www.virustotal.com/gui/file-analysis/${data.id}/detection`; 59 | return data; 60 | }) 61 | .catch(error => { 62 | throw new Error(`Cannot send ${name} to VirusTotal: ${error}`); 63 | }); 64 | } 65 | 66 | public async monitorItems(filename: string, path?: string): Promise { 67 | const {name, mime, size, file} = asset(filename); 68 | const fd = new FormData(); 69 | fd.append('file', file, { 70 | filename: name, 71 | contentType: mime, 72 | knownLength: size 73 | }); 74 | 75 | const itemPath: string = posix.join(path ? path : '/', name); 76 | core.debug(`monitorItems path: ${itemPath}`); 77 | fd.append('path', itemPath); 78 | 79 | try { 80 | const upload = await this.instance.post('/monitor/items', fd.getBuffer(), { 81 | headers: fd.getHeaders() 82 | }); 83 | const data = upload.data.data as UploadData; 84 | data.url = `https://www.virustotal.com/monitor/analyses/item:${data.id}`; 85 | return data; 86 | } catch (error) { 87 | throw new Error(`Cannot send ${name} to VirusTotal Monitor at ${itemPath}: ${error}`); 88 | } 89 | } 90 | } 91 | 92 | export const asset = (path: string): Asset => { 93 | return { 94 | name: basename(path), 95 | mime: mimeOrDefault(path), 96 | size: lstatSync(path).size, 97 | file: readFileSync(path) 98 | }; 99 | }; 100 | 101 | export const mimeOrDefault = (path: string): string => { 102 | return getType(path) || 'application/octet-stream'; 103 | }; 104 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug.yml: -------------------------------------------------------------------------------- 1 | # https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/syntax-for-githubs-form-schema 2 | name: Bug Report 3 | description: Report a bug 4 | labels: 5 | - kind/bug 6 | - status/triage 7 | 8 | body: 9 | - type: checkboxes 10 | attributes: 11 | label: Support guidelines 12 | description: Please read the support guidelines before proceeding. 13 | options: 14 | - label: I've read the [support guidelines](https://github.com/crazy-max/ghaction-virustotal/blob/master/.github/SUPPORT.md) 15 | required: true 16 | 17 | - type: checkboxes 18 | attributes: 19 | label: I've found a bug and checked that ... 20 | description: | 21 | Make sure that your request fulfills all of the following requirements. If one requirement cannot be satisfied, explain in detail why. 22 | options: 23 | - label: ... the documentation does not mention anything about my problem 24 | - label: ... there are no open or closed issues that are related to my problem 25 | 26 | - type: textarea 27 | attributes: 28 | label: Description 29 | description: | 30 | Please provide a brief description of the bug in 1-2 sentences. 31 | validations: 32 | required: true 33 | 34 | - type: textarea 35 | attributes: 36 | label: Expected behaviour 37 | description: | 38 | Please describe precisely what you'd expect to happen. 39 | validations: 40 | required: true 41 | 42 | - type: textarea 43 | attributes: 44 | label: Actual behaviour 45 | description: | 46 | Please describe precisely what is actually happening. 47 | validations: 48 | required: true 49 | 50 | - type: textarea 51 | attributes: 52 | label: Steps to reproduce 53 | description: | 54 | Please describe the steps to reproduce the bug. 55 | placeholder: | 56 | 1. ... 57 | 2. ... 58 | 3. ... 59 | validations: 60 | required: true 61 | 62 | - type: input 63 | attributes: 64 | label: Repository URL 65 | description: > 66 | Enter the URL of the repository where you are experiencing the 67 | issue. If your repository is private, provide a link to a minimal 68 | repository that reproduces the issue. 69 | validations: 70 | required: true 71 | 72 | - type: input 73 | attributes: 74 | label: Workflow run URL 75 | description: > 76 | Enter the URL of the GitHub Action workflow run that fails (e.g. 77 | `https://github.com///actions/runs/`) 78 | 79 | - type: textarea 80 | attributes: 81 | label: YAML workflow 82 | description: | 83 | Provide the YAML of the workflow that's causing the issue. 84 | Make sure to remove any sensitive information. 85 | render: yaml 86 | validations: 87 | required: true 88 | 89 | - type: textarea 90 | attributes: 91 | label: Workflow logs 92 | description: > 93 | [Attach](https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/attaching-files) 94 | the [log file of your workflow run](https://docs.github.com/en/actions/managing-workflow-runs/using-workflow-run-logs#downloading-logs) 95 | and make sure to remove any sensitive information. 96 | 97 | - type: textarea 98 | attributes: 99 | label: Additional info 100 | description: | 101 | Please provide any additional information that seem useful. 102 | -------------------------------------------------------------------------------- /src/github.ts: -------------------------------------------------------------------------------- 1 | import * as fs from 'fs'; 2 | import * as github from '@actions/github'; 3 | import {Context} from '@actions/github/lib/context'; 4 | import {OctokitOptions} from '@octokit/core/dist-types/types'; 5 | import {retry as retryPlugin} from '@octokit/plugin-retry'; 6 | 7 | export interface Release { 8 | id: number; 9 | upload_url: string; 10 | html_url: string; 11 | tag_name: string; 12 | name: string; 13 | body: string; 14 | target_commitish: string; 15 | draft: boolean; 16 | prerelease: boolean; 17 | } 18 | 19 | export interface ReleaseAsset { 20 | id: number; 21 | name: string; 22 | size: number; 23 | } 24 | 25 | export type Octokit = ReturnType; 26 | 27 | export function context(): Context { 28 | return github.context; 29 | } 30 | 31 | export function getOctokit(token: string, options?: OctokitOptions): Octokit { 32 | return github.getOctokit(token, options, retryPlugin); 33 | } 34 | 35 | export const getRelease = async (octokit: Octokit, tag: string): Promise => { 36 | return ( 37 | await octokit.rest.repos 38 | .getReleaseByTag({ 39 | ...github.context.repo, 40 | tag 41 | }) 42 | .catch(error => { 43 | throw new Error(`Cannot get release ${tag}: ${error}`); 44 | }) 45 | ).data as Release; 46 | }; 47 | 48 | export const getReleaseAssets = async (octokit: Octokit, release: Release, patterns: Array): Promise> => { 49 | return ( 50 | await octokit 51 | .paginate(octokit.rest.repos.listReleaseAssets, { 52 | ...github.context.repo, 53 | release_id: release.id 54 | }) 55 | .catch(error => { 56 | throw new Error(`Cannot list assets for release ${release.tag_name}: ${error}`); 57 | }) 58 | ).filter(function (asset) { 59 | return patterns.some(function (pattern) { 60 | return asset.name.match(pattern); 61 | }); 62 | }); 63 | }; 64 | 65 | export const downloadReleaseAsset = async (octokit: Octokit, asset: ReleaseAsset, downloadPath: string, retrycb?: (msg: string) => void): Promise => { 66 | const retries = 10; 67 | const assetPath = await octokit.rest.repos 68 | .getReleaseAsset({ 69 | ...github.context.repo, 70 | asset_id: asset.id, 71 | headers: { 72 | accept: 'application/octet-stream' 73 | }, 74 | request: { 75 | retries: retries, 76 | retryAfter: 2 77 | } 78 | }) 79 | .then(downloadAsset => { 80 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 81 | fs.writeFileSync(downloadPath, Buffer.from(downloadAsset.data as any), 'binary'); 82 | return downloadPath; 83 | }) 84 | .catch(err => { 85 | if (retrycb && err.request.request && err.request.request.retryCount) { 86 | retrycb(`Download request failed: ${err}. Retrying (${err.request.request.retryCount}/${retries})...`); 87 | if (err.request.request.retryCount >= retries) { 88 | throw new Error(`Cannot download release asset ${asset.name} (${asset.id}): ${err}`); 89 | } 90 | } 91 | if (!err.request.request || err.request.request.retryCount >= retries) { 92 | throw new Error(`Cannot download release asset ${asset.name} (${asset.id}): ${err}`); 93 | } 94 | }); 95 | if (!assetPath) { 96 | throw new Error(`Cannot download release asset ${asset.name} (${asset.id})`); 97 | } 98 | return assetPath; 99 | }; 100 | 101 | export const updateReleaseBody = async (octokit: Octokit, release: Release): Promise => { 102 | return ( 103 | await octokit.rest.repos 104 | .updateRelease({ 105 | ...github.context.repo, 106 | release_id: release.id, 107 | body: release.body 108 | }) 109 | .catch(error => { 110 | throw new Error(`Cannot update release body: ${error}`); 111 | }) 112 | ).data as Release; 113 | }; 114 | -------------------------------------------------------------------------------- /src/main.ts: -------------------------------------------------------------------------------- 1 | import * as path from 'path'; 2 | import * as core from '@actions/core'; 3 | import {RateLimiter} from 'limiter'; 4 | import * as context from './context'; 5 | import * as github from './github'; 6 | import {Octokit} from './github'; 7 | import {VirusTotal} from './virustotal'; 8 | 9 | let octokit: Octokit; 10 | let inputs: context.Inputs; 11 | const outputAnalysis: string[] = []; 12 | 13 | async function run() { 14 | try { 15 | inputs = await context.getInputs(); 16 | if (inputs.files.length == 0) { 17 | core.setFailed(`You must enter at least one path glob in the input 'files'`); 18 | return; 19 | } 20 | 21 | octokit = github.getOctokit(inputs.githubToken); 22 | 23 | const limiter = inputs.requestRate > 0 ? new RateLimiter({tokensPerInterval: inputs.requestRate, interval: 'minute'}) : undefined; 24 | const vt = new VirusTotal(inputs.vtApiKey); 25 | if (github.context().eventName == 'release') { 26 | await runForReleaseEvent(vt, limiter); 27 | } else { 28 | await runForLocalFiles(vt, limiter); 29 | } 30 | 31 | await core.group(`Setting output analysis`, async () => { 32 | core.setOutput('analysis', outputAnalysis.join(',')); 33 | core.info(`analysis=${outputAnalysis.join(',')}`); 34 | }); 35 | } catch (error) { 36 | core.setFailed(error.message); 37 | } 38 | } 39 | 40 | async function runForLocalFiles(vt: VirusTotal, limiter: RateLimiter | undefined) { 41 | const files: string[] = context.resolvePaths(inputs.files); 42 | if (files.length == 0) { 43 | core.warning(`No files were found. Please check the 'files' input.`); 44 | return; 45 | } 46 | 47 | await core.group(`${files.length} file(s) will be sent to VirusTotal for analysis`, async () => { 48 | await context.asyncForEach(files, async filepath => { 49 | if (limiter !== undefined) { 50 | const remainingRequests = await limiter.removeTokens(1); 51 | core.debug(`limiter: remaining requests: ${remainingRequests}`); 52 | } 53 | if (inputs.vtMonitor) { 54 | await vt.monitorItems(filepath, inputs.monitorPath).then(upload => { 55 | outputAnalysis.push(`${filepath}=${upload.url}`); 56 | core.info(`${filepath} successfully uploaded to monitor. Check detection analysis at ${upload.url}`); 57 | }); 58 | } else { 59 | await vt.files(filepath).then(upload => { 60 | outputAnalysis.push(`${filepath}=${upload.url}`); 61 | core.info(`${filepath} successfully uploaded. Check detection analysis at ${upload.url}`); 62 | }); 63 | } 64 | }); 65 | }); 66 | } 67 | 68 | async function runForReleaseEvent(vt: VirusTotal, limiter: RateLimiter | undefined) { 69 | core.info(`Release event detected for ${github.context().ref} in this workflow. Preparing to scan assets...`); 70 | 71 | const release = await github.getRelease(octokit, github.context().ref.replace('refs/tags/', '')); 72 | 73 | const assets = await github.getReleaseAssets(octokit, release, inputs.files); 74 | if (assets.length == 0) { 75 | core.warning(`No assets were found for ${release.tag_name} release tag. Please check the 'files' input.`); 76 | return; 77 | } 78 | 79 | if (assets.length <= 5) { 80 | release.body = release.body.concat(`\n\n🛡 [VirusTotal GitHub Action](https://github.com/crazy-max/ghaction-virustotal) analysis:`); 81 | } else { 82 | release.body = release.body.concat(`\n\n
\n 🛡 VirusTotal analysis\n`); 83 | } 84 | 85 | core.info(`${assets.length} asset(s) will be sent to VirusTotal for analysis.`); 86 | await core.group(`${assets.length} asset(s) will be sent to VirusTotal for analysis.`, async () => { 87 | const dlretrycb = (msg: string): void => { 88 | core.debug(msg); 89 | }; 90 | await context.asyncForEach(assets, async asset => { 91 | core.info(`Downloading release asset ${asset.name}...`); 92 | if (limiter !== undefined) { 93 | const remainingRequests = await limiter.removeTokens(1); 94 | core.debug(`Limiter: remaining requests: ${remainingRequests}`); 95 | } 96 | if (inputs.vtMonitor) { 97 | await vt.monitorItems(await github.downloadReleaseAsset(octokit, asset, path.join(context.tmpDir(), asset.name), dlretrycb), inputs.monitorPath).then(upload => { 98 | outputAnalysis.push(`${asset.name}=${upload.url}`); 99 | core.info(`${asset.name} successfully uploaded. Check detection analysis at ${upload.url}`); 100 | release.body = release.body.concat(`\n * [\`${asset.name}\`](${upload.url})`); 101 | }); 102 | } else { 103 | await vt.files(await github.downloadReleaseAsset(octokit, asset, path.join(context.tmpDir(), asset.name), dlretrycb)).then(upload => { 104 | outputAnalysis.push(`${asset.name}=${upload.url}`); 105 | core.info(`${asset.name} successfully uploaded. Check detection analysis at ${upload.url}`); 106 | release.body = release.body.concat(`\n * [\`${asset.name}\`](${upload.url})`); 107 | }); 108 | } 109 | }); 110 | }); 111 | if (assets.length > 5) { 112 | release.body = release.body.concat(`\nThese scans were produced by the [VirusTotal GitHub Action](https://github.com/crazy-max/ghaction-virustotal)
\n`); 113 | } 114 | 115 | if (/true/i.test(core.getInput('update_release_body'))) { 116 | core.debug(`Appending analysis link(s) to release body`); 117 | await github.updateReleaseBody(octokit, release); 118 | } 119 | } 120 | 121 | run(); 122 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 |

4 | GitHub release 5 | GitHub marketplace 6 | CI workflow 7 | Test workflow 8 | Codecov 9 |
Become a sponsor 10 | Donate Paypal 11 |

12 | 13 | ## About 14 | 15 | GitHub Action to upload and scan files with [VirusTotal](https://www.virustotal.com). 16 | 17 | ___ 18 | 19 | * [Usage](#usage) 20 | * [Scan local files](#scan-local-files) 21 | * [Scan assets of a published release](#scan-assets-of-a-published-release) 22 | * [Scan through VirusTotal Monitor](#scan-through-virustotal-monitor) 23 | * [Customizing](#customizing) 24 | * [inputs](#inputs) 25 | * [outputs](#outputs) 26 | * [Contributing](#contributing) 27 | * [License](#license) 28 | 29 | ## Usage 30 | 31 | ### Scan local files 32 | 33 | This action can be used to scan local files with VirusTotal: 34 | 35 | ![VirusTotal GitHub Action](.github/ghaction-virustotal-files.png) 36 | 37 | ```yaml 38 | name: build 39 | 40 | permissions: 41 | contents: read 42 | 43 | on: 44 | push: 45 | 46 | jobs: 47 | build: 48 | runs-on: ubuntu-latest 49 | steps: 50 | - 51 | name: Checkout 52 | uses: actions/checkout@v4 53 | - 54 | name: Set up Go 55 | uses: actions/setup-go@v5 56 | - 57 | name: Build 58 | run: | 59 | GOOS=windows GOARCH=386 go build -o ./ghaction-virustotal-win32.exe -v -ldflags "-s -w" 60 | GOOS=windows GOARCH=amd64 go build -o ./ghaction-virustotal-win64.exe -v -ldflags "-s -w" 61 | - 62 | name: VirusTotal Scan 63 | uses: crazy-max/ghaction-virustotal@v4 64 | with: 65 | vt_api_key: ${{ secrets.VT_API_KEY }} 66 | files: | 67 | ./ghaction-virustotal-win32.exe 68 | ./ghaction-virustotal-win64.exe 69 | ``` 70 | 71 | ### Scan assets of a published release 72 | 73 | You can also use this action to scan assets of a published release on GitHub 74 | when a [release event](https://help.github.com/en/actions/reference/events-that-trigger-workflows#release-event-release) 75 | is triggered: 76 | 77 | ```yaml 78 | name: released 79 | 80 | permissions: 81 | contents: read 82 | 83 | on: 84 | release: 85 | types: 86 | - published 87 | 88 | jobs: 89 | virustotal: 90 | runs-on: ubuntu-latest 91 | steps: 92 | - 93 | name: VirusTotal Scan 94 | uses: crazy-max/ghaction-virustotal@v4 95 | with: 96 | vt_api_key: ${{ secrets.VT_API_KEY }} 97 | files: | 98 | .exe$ 99 | ``` 100 | 101 | If you set `update_release_body: true` input, analysis link(s) will be appended 102 | to the release body: 103 | 104 | ```yaml 105 | name: released 106 | 107 | permissions: 108 | contents: read 109 | 110 | on: 111 | release: 112 | types: 113 | - published 114 | 115 | jobs: 116 | virustotal: 117 | runs-on: ubuntu-latest 118 | permissions: 119 | # required to write GitHub Release body 120 | contents: write 121 | steps: 122 | - 123 | name: VirusTotal Scan 124 | uses: crazy-max/ghaction-virustotal@v4 125 | with: 126 | vt_api_key: ${{ secrets.VT_API_KEY }} 127 | update_release_body: true 128 | files: | 129 | .exe$ 130 | ``` 131 | 132 | And will look like this: 133 | 134 | ![VirusTotal GitHub Action update release body](.github/ghaction-virustotal-release-body.png) 135 | 136 | ### Scan through VirusTotal Monitor 137 | 138 | To scan your assets through VirusTotal Monitor you can use the following 139 | workflow: 140 | 141 | ```yaml 142 | name: build 143 | 144 | permissions: 145 | contents: read 146 | 147 | on: 148 | push: 149 | 150 | jobs: 151 | build: 152 | runs-on: ubuntu-latest 153 | steps: 154 | - 155 | name: Checkout 156 | uses: actions/checkout@v4 157 | - 158 | name: Set up Go 159 | uses: actions/setup-go@v5 160 | - 161 | name: Build 162 | run: | 163 | GOOS=windows GOARCH=386 go build -o ./ghaction-virustotal-win32.exe -v -ldflags "-s -w" 164 | GOOS=windows GOARCH=amd64 go build -o ./ghaction-virustotal-win64.exe -v -ldflags "-s -w" 165 | - 166 | name: VirusTotal Monitor Scan 167 | uses: crazy-max/ghaction-virustotal@v4 168 | with: 169 | vt_api_key: ${{ secrets.VT_API_KEY }} 170 | vt_monitor: true 171 | monitor_path: /ghaction-virustotal 172 | files: | 173 | ./ghaction-virustotal-*.exe 174 | ``` 175 | 176 | ## Customizing 177 | 178 | ### inputs 179 | 180 | Following inputs can be used as `step.with` keys 181 | 182 | | Name | Type | Default | Description | 183 | |----------------------------|--------|---------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 184 | | `vt_api_key` | String | | [VirusTotal API key](https://developers.virustotal.com/v3.0/reference#authentication) to upload assets (**required**) | 185 | | `files` | String | | Newline-delimited list of path globs/patterns for asset files to upload for analysis (**required**) | 186 | | `vt_monitor` | Bool | `false` | If enabled, files will be uploaded to [VirusTotal Monitor](https://developers.virustotal.com/v3.0/reference#monitor) endpoint | 187 | | `monitor_path`**¹** | String | `/` | A path relative to current monitor user root folder to upload files | 188 | | `update_release_body`**²** | Bool | `false` | If enabled, analysis link(s) will be appended to the release body | 189 | | `github_token`**³** | String | | [GitHub Token](https://help.github.com/en/actions/configuring-and-managing-workflows/authenticating-with-the-github_token) used to create an authenticated client for GitHub API as provided by `secrets` | 190 | | `request_rate` | Number | `0` | API request-rate in requests/minute. Set to `4` or lower when using the standard free public API. `0` to disable rate-limit. | 191 | 192 | > [!NOTE] 193 | > * **¹** Only available if `vt_monitor` is enabled. 194 | > * **²** Only available if [release event is triggered](#scan-assets-of-a-published-release) in your workflow. 195 | > * **³** Required if [release event is triggered](#scan-assets-of-a-published-release) in your workflow. 196 | 197 | ### outputs 198 | 199 | The following outputs are available 200 | 201 | | Name | Type | Description | 202 | |---------------|---------|----------------------------------------------------------------------------| 203 | | `analysis` | String | Analysis results formatted as `=` (comma separated) | 204 | 205 | ## Contributing 206 | 207 | Want to contribute? Awesome! The most basic way to show your support is to star 208 | the project, or to raise issues. You can also support this project by [**becoming a sponsor on GitHub**](https://github.com/sponsors/crazy-max) 209 | or by making a [PayPal donation](https://www.paypal.me/crazyws) to ensure this 210 | journey continues indefinitely! 211 | 212 | Thanks again for your support, it is much appreciated! :pray: 213 | 214 | ## License 215 | 216 | MIT. See `LICENSE` for more details. 217 | -------------------------------------------------------------------------------- /__tests__/fixtures/repo.json: -------------------------------------------------------------------------------- 1 | { 2 | "after": "411b28b73d17742f4afd55a46ef2c7483a760e5f", 3 | "base_ref": null, 4 | "before": "8c7ad624f3de94e75410d30add4544a401e2d32a", 5 | "commits": [ 6 | { 7 | "author": { 8 | "email": "crazy-max@users.noreply.github.com", 9 | "name": "CrazyMax", 10 | "username": "crazy-max" 11 | }, 12 | "committer": { 13 | "email": "crazy-max@users.noreply.github.com", 14 | "name": "CrazyMax", 15 | "username": "crazy-max" 16 | }, 17 | "distinct": true, 18 | "id": "411b28b73d17742f4afd55a46ef2c7483a760e5f", 19 | "message": "Dump context", 20 | "timestamp": "2021-06-06T10:29:21+02:00", 21 | "tree_id": "67fc290b8438de3c56fad0ec5abd0ba9fb2be878", 22 | "url": "https://github.com/portapps/brave-portable/commit/411b28b73d17742f4afd55a46ef2c7483a760e5f" 23 | } 24 | ], 25 | "compare": "https://github.com/portapps/brave-portable/compare/8c7ad624f3de...411b28b73d17", 26 | "created": false, 27 | "deleted": false, 28 | "forced": false, 29 | "head_commit": { 30 | "author": { 31 | "email": "crazy-max@users.noreply.github.com", 32 | "name": "CrazyMax", 33 | "username": "crazy-max" 34 | }, 35 | "committer": { 36 | "email": "crazy-max@users.noreply.github.com", 37 | "name": "CrazyMax", 38 | "username": "crazy-max" 39 | }, 40 | "distinct": true, 41 | "id": "411b28b73d17742f4afd55a46ef2c7483a760e5f", 42 | "message": "Dump context", 43 | "timestamp": "2021-06-06T10:29:21+02:00", 44 | "tree_id": "67fc290b8438de3c56fad0ec5abd0ba9fb2be878", 45 | "url": "https://github.com/portapps/brave-portable/commit/411b28b73d17742f4afd55a46ef2c7483a760e5f" 46 | }, 47 | "organization": { 48 | "avatar_url": "https://avatars.githubusercontent.com/u/33734063?v=4", 49 | "description": "Collection of portable apps for Windows", 50 | "events_url": "https://api.github.com/orgs/portapps/events", 51 | "hooks_url": "https://api.github.com/orgs/portapps/hooks", 52 | "id": 33734063, 53 | "issues_url": "https://api.github.com/orgs/portapps/issues", 54 | "login": "portapps", 55 | "members_url": "https://api.github.com/orgs/portapps/members{/member}", 56 | "node_id": "MDEyOk9yZ2FuaXphdGlvbjMzNzM0MDYz", 57 | "public_members_url": "https://api.github.com/orgs/portapps/public_members{/member}", 58 | "repos_url": "https://api.github.com/orgs/portapps/repos", 59 | "url": "https://api.github.com/orgs/portapps" 60 | }, 61 | "pusher": { 62 | "email": "1951866+crazy-max@users.noreply.github.com", 63 | "name": "crazy-max" 64 | }, 65 | "ref": "refs/heads/master", 66 | "repository": { 67 | "archive_url": "https://api.github.com/repos/portapps/brave-portable/{archive_format}{/ref}", 68 | "archived": false, 69 | "assignees_url": "https://api.github.com/repos/portapps/brave-portable/assignees{/user}", 70 | "blobs_url": "https://api.github.com/repos/portapps/brave-portable/git/blobs{/sha}", 71 | "branches_url": "https://api.github.com/repos/portapps/brave-portable/branches{/branch}", 72 | "clone_url": "https://github.com/portapps/brave-portable.git", 73 | "collaborators_url": "https://api.github.com/repos/portapps/brave-portable/collaborators{/collaborator}", 74 | "comments_url": "https://api.github.com/repos/portapps/brave-portable/comments{/number}", 75 | "commits_url": "https://api.github.com/repos/portapps/brave-portable/commits{/sha}", 76 | "compare_url": "https://api.github.com/repos/portapps/brave-portable/compare/{base}...{head}", 77 | "contents_url": "https://api.github.com/repos/portapps/brave-portable/contents/{+path}", 78 | "contributors_url": "https://api.github.com/repos/portapps/brave-portable/contributors", 79 | "created_at": 1493828252, 80 | "default_branch": "master", 81 | "deployments_url": "https://api.github.com/repos/portapps/brave-portable/deployments", 82 | "description": "🚀 Brave web browser portable for Windows", 83 | "disabled": false, 84 | "downloads_url": "https://api.github.com/repos/portapps/brave-portable/downloads", 85 | "events_url": "https://api.github.com/repos/portapps/brave-portable/events", 86 | "fork": false, 87 | "forks": 14, 88 | "forks_count": 14, 89 | "forks_url": "https://api.github.com/repos/portapps/brave-portable/forks", 90 | "full_name": "portapps/brave-portable", 91 | "git_commits_url": "https://api.github.com/repos/portapps/brave-portable/git/commits{/sha}", 92 | "git_refs_url": "https://api.github.com/repos/portapps/brave-portable/git/refs{/sha}", 93 | "git_tags_url": "https://api.github.com/repos/portapps/brave-portable/git/tags{/sha}", 94 | "git_url": "git://github.com/portapps/brave-portable.git", 95 | "has_downloads": true, 96 | "has_issues": true, 97 | "has_pages": false, 98 | "has_projects": false, 99 | "has_wiki": false, 100 | "homepage": "https://portapps.io/app/brave-portable/", 101 | "hooks_url": "https://api.github.com/repos/portapps/brave-portable/hooks", 102 | "html_url": "https://github.com/portapps/brave-portable", 103 | "id": 90169309, 104 | "issue_comment_url": "https://api.github.com/repos/portapps/brave-portable/issues/comments{/number}", 105 | "issue_events_url": "https://api.github.com/repos/portapps/brave-portable/issues/events{/number}", 106 | "issues_url": "https://api.github.com/repos/portapps/brave-portable/issues{/number}", 107 | "keys_url": "https://api.github.com/repos/portapps/brave-portable/keys{/key_id}", 108 | "labels_url": "https://api.github.com/repos/portapps/brave-portable/labels{/name}", 109 | "language": "Go", 110 | "languages_url": "https://api.github.com/repos/portapps/brave-portable/languages", 111 | "license": { 112 | "key": "mit", 113 | "name": "MIT License", 114 | "node_id": "MDc6TGljZW5zZTEz", 115 | "spdx_id": "MIT", 116 | "url": "https://api.github.com/licenses/mit" 117 | }, 118 | "master_branch": "master", 119 | "merges_url": "https://api.github.com/repos/portapps/brave-portable/merges", 120 | "milestones_url": "https://api.github.com/repos/portapps/brave-portable/milestones{/number}", 121 | "mirror_url": null, 122 | "name": "brave-portable", 123 | "node_id": "MDEwOlJlcG9zaXRvcnk5MDE2OTMwOQ==", 124 | "notifications_url": "https://api.github.com/repos/portapps/brave-portable/notifications{?since,all,participating}", 125 | "open_issues": 5, 126 | "open_issues_count": 5, 127 | "organization": "portapps", 128 | "owner": { 129 | "avatar_url": "https://avatars.githubusercontent.com/u/33734063?v=4", 130 | "email": "contact@portapps.io", 131 | "events_url": "https://api.github.com/users/portapps/events{/privacy}", 132 | "followers_url": "https://api.github.com/users/portapps/followers", 133 | "following_url": "https://api.github.com/users/portapps/following{/other_user}", 134 | "gists_url": "https://api.github.com/users/portapps/gists{/gist_id}", 135 | "gravatar_id": "", 136 | "html_url": "https://github.com/portapps", 137 | "id": 33734063, 138 | "login": "portapps", 139 | "name": "portapps", 140 | "node_id": "MDEyOk9yZ2FuaXphdGlvbjMzNzM0MDYz", 141 | "organizations_url": "https://api.github.com/users/portapps/orgs", 142 | "received_events_url": "https://api.github.com/users/portapps/received_events", 143 | "repos_url": "https://api.github.com/users/portapps/repos", 144 | "site_admin": false, 145 | "starred_url": "https://api.github.com/users/portapps/starred{/owner}{/repo}", 146 | "subscriptions_url": "https://api.github.com/users/portapps/subscriptions", 147 | "type": "Organization", 148 | "url": "https://api.github.com/users/portapps" 149 | }, 150 | "private": false, 151 | "pulls_url": "https://api.github.com/repos/portapps/brave-portable/pulls{/number}", 152 | "pushed_at": 1622968164, 153 | "releases_url": "https://api.github.com/repos/portapps/brave-portable/releases{/id}", 154 | "size": 617, 155 | "ssh_url": "git@github.com:portapps/brave-portable.git", 156 | "stargazers": 143, 157 | "stargazers_count": 143, 158 | "stargazers_url": "https://api.github.com/repos/portapps/brave-portable/stargazers", 159 | "statuses_url": "https://api.github.com/repos/portapps/brave-portable/statuses/{sha}", 160 | "subscribers_url": "https://api.github.com/repos/portapps/brave-portable/subscribers", 161 | "subscription_url": "https://api.github.com/repos/portapps/brave-portable/subscription", 162 | "svn_url": "https://github.com/portapps/brave-portable", 163 | "tags_url": "https://api.github.com/repos/portapps/brave-portable/tags", 164 | "teams_url": "https://api.github.com/repos/portapps/brave-portable/teams", 165 | "trees_url": "https://api.github.com/repos/portapps/brave-portable/git/trees{/sha}", 166 | "updated_at": "2021-06-03T19:30:35Z", 167 | "url": "https://github.com/portapps/brave-portable", 168 | "watchers": 143, 169 | "watchers_count": 143 170 | }, 171 | "sender": { 172 | "avatar_url": "https://avatars.githubusercontent.com/u/1951866?v=4", 173 | "events_url": "https://api.github.com/users/crazy-max/events{/privacy}", 174 | "followers_url": "https://api.github.com/users/crazy-max/followers", 175 | "following_url": "https://api.github.com/users/crazy-max/following{/other_user}", 176 | "gists_url": "https://api.github.com/users/crazy-max/gists{/gist_id}", 177 | "gravatar_id": "", 178 | "html_url": "https://github.com/crazy-max", 179 | "id": 1951866, 180 | "login": "crazy-max", 181 | "node_id": "MDQ6VXNlcjE5NTE4NjY=", 182 | "organizations_url": "https://api.github.com/users/crazy-max/orgs", 183 | "received_events_url": "https://api.github.com/users/crazy-max/received_events", 184 | "repos_url": "https://api.github.com/users/crazy-max/repos", 185 | "site_admin": false, 186 | "starred_url": "https://api.github.com/users/crazy-max/starred{/owner}{/repo}", 187 | "subscriptions_url": "https://api.github.com/users/crazy-max/subscriptions", 188 | "type": "User", 189 | "url": "https://api.github.com/users/crazy-max" 190 | } 191 | } 192 | -------------------------------------------------------------------------------- /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 | @fastify/busboy 75 | MIT 76 | Copyright Brian White. All rights reserved. 77 | 78 | Permission is hereby granted, free of charge, to any person obtaining a copy 79 | of this software and associated documentation files (the "Software"), to 80 | deal in the Software without restriction, including without limitation the 81 | rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 82 | sell copies of the Software, and to permit persons to whom the Software is 83 | furnished to do so, subject to the following conditions: 84 | 85 | The above copyright notice and this permission notice shall be included in 86 | all copies or substantial portions of the Software. 87 | 88 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 89 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 90 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 91 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 92 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 93 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 94 | IN THE SOFTWARE. 95 | 96 | @octokit/auth-token 97 | MIT 98 | The MIT License 99 | 100 | Copyright (c) 2019 Octokit contributors 101 | 102 | Permission is hereby granted, free of charge, to any person obtaining a copy 103 | of this software and associated documentation files (the "Software"), to deal 104 | in the Software without restriction, including without limitation the rights 105 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 106 | copies of the Software, and to permit persons to whom the Software is 107 | furnished to do so, subject to the following conditions: 108 | 109 | The above copyright notice and this permission notice shall be included in 110 | all copies or substantial portions of the Software. 111 | 112 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 113 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 114 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 115 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 116 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 117 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 118 | THE SOFTWARE. 119 | 120 | 121 | @octokit/core 122 | MIT 123 | The MIT License 124 | 125 | Copyright (c) 2019 Octokit contributors 126 | 127 | Permission is hereby granted, free of charge, to any person obtaining a copy 128 | of this software and associated documentation files (the "Software"), to deal 129 | in the Software without restriction, including without limitation the rights 130 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 131 | copies of the Software, and to permit persons to whom the Software is 132 | furnished to do so, subject to the following conditions: 133 | 134 | The above copyright notice and this permission notice shall be included in 135 | all copies or substantial portions of the Software. 136 | 137 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 138 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 139 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 140 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 141 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 142 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 143 | THE SOFTWARE. 144 | 145 | 146 | @octokit/endpoint 147 | MIT 148 | The MIT License 149 | 150 | Copyright (c) 2018 Octokit contributors 151 | 152 | Permission is hereby granted, free of charge, to any person obtaining a copy 153 | of this software and associated documentation files (the "Software"), to deal 154 | in the Software without restriction, including without limitation the rights 155 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 156 | copies of the Software, and to permit persons to whom the Software is 157 | furnished to do so, subject to the following conditions: 158 | 159 | The above copyright notice and this permission notice shall be included in 160 | all copies or substantial portions of the Software. 161 | 162 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 163 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 164 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 165 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 166 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 167 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 168 | THE SOFTWARE. 169 | 170 | 171 | @octokit/graphql 172 | MIT 173 | The MIT License 174 | 175 | Copyright (c) 2018 Octokit contributors 176 | 177 | Permission is hereby granted, free of charge, to any person obtaining a copy 178 | of this software and associated documentation files (the "Software"), to deal 179 | in the Software without restriction, including without limitation the rights 180 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 181 | copies of the Software, and to permit persons to whom the Software is 182 | furnished to do so, subject to the following conditions: 183 | 184 | The above copyright notice and this permission notice shall be included in 185 | all copies or substantial portions of the Software. 186 | 187 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 188 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 189 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 190 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 191 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 192 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 193 | THE SOFTWARE. 194 | 195 | 196 | @octokit/plugin-paginate-rest 197 | MIT 198 | MIT License Copyright (c) 2019 Octokit contributors 199 | 200 | 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: 201 | 202 | The above copyright notice and this permission notice (including the next paragraph) shall be included in all copies or substantial portions of the Software. 203 | 204 | 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. 205 | 206 | 207 | @octokit/plugin-rest-endpoint-methods 208 | MIT 209 | MIT License Copyright (c) 2019 Octokit contributors 210 | 211 | 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: 212 | 213 | The above copyright notice and this permission notice (including the next paragraph) shall be included in all copies or substantial portions of the Software. 214 | 215 | 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. 216 | 217 | 218 | @octokit/plugin-retry 219 | MIT 220 | MIT License 221 | 222 | Copyright (c) 2018 Octokit contributors 223 | 224 | Permission is hereby granted, free of charge, to any person obtaining a copy 225 | of this software and associated documentation files (the "Software"), to deal 226 | in the Software without restriction, including without limitation the rights 227 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 228 | copies of the Software, and to permit persons to whom the Software is 229 | furnished to do so, subject to the following conditions: 230 | 231 | The above copyright notice and this permission notice shall be included in all 232 | copies or substantial portions of the Software. 233 | 234 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 235 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 236 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 237 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 238 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 239 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 240 | SOFTWARE. 241 | 242 | 243 | @octokit/request 244 | MIT 245 | The MIT License 246 | 247 | Copyright (c) 2018 Octokit contributors 248 | 249 | Permission is hereby granted, free of charge, to any person obtaining a copy 250 | of this software and associated documentation files (the "Software"), to deal 251 | in the Software without restriction, including without limitation the rights 252 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 253 | copies of the Software, and to permit persons to whom the Software is 254 | furnished to do so, subject to the following conditions: 255 | 256 | The above copyright notice and this permission notice shall be included in 257 | all copies or substantial portions of the Software. 258 | 259 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 260 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 261 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 262 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 263 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 264 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 265 | THE SOFTWARE. 266 | 267 | 268 | @octokit/request-error 269 | MIT 270 | The MIT License 271 | 272 | Copyright (c) 2019 Octokit contributors 273 | 274 | Permission is hereby granted, free of charge, to any person obtaining a copy 275 | of this software and associated documentation files (the "Software"), to deal 276 | in the Software without restriction, including without limitation the rights 277 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 278 | copies of the Software, and to permit persons to whom the Software is 279 | furnished to do so, subject to the following conditions: 280 | 281 | The above copyright notice and this permission notice shall be included in 282 | all copies or substantial portions of the Software. 283 | 284 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 285 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 286 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 287 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 288 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 289 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 290 | THE SOFTWARE. 291 | 292 | 293 | asynckit 294 | MIT 295 | The MIT License (MIT) 296 | 297 | Copyright (c) 2016 Alex Indigo 298 | 299 | Permission is hereby granted, free of charge, to any person obtaining a copy 300 | of this software and associated documentation files (the "Software"), to deal 301 | in the Software without restriction, including without limitation the rights 302 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 303 | copies of the Software, and to permit persons to whom the Software is 304 | furnished to do so, subject to the following conditions: 305 | 306 | The above copyright notice and this permission notice shall be included in all 307 | copies or substantial portions of the Software. 308 | 309 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 310 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 311 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 312 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 313 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 314 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 315 | SOFTWARE. 316 | 317 | 318 | axios 319 | MIT 320 | # Copyright (c) 2014-present Matt Zabriskie & Collaborators 321 | 322 | 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: 323 | 324 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 325 | 326 | 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. 327 | 328 | 329 | balanced-match 330 | MIT 331 | (MIT) 332 | 333 | Copyright (c) 2013 Julian Gruber <julian@juliangruber.com> 334 | 335 | Permission is hereby granted, free of charge, to any person obtaining a copy of 336 | this software and associated documentation files (the "Software"), to deal in 337 | the Software without restriction, including without limitation the rights to 338 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 339 | of the Software, and to permit persons to whom the Software is furnished to do 340 | so, subject to the following conditions: 341 | 342 | The above copyright notice and this permission notice shall be included in all 343 | copies or substantial portions of the Software. 344 | 345 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 346 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 347 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 348 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 349 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 350 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 351 | SOFTWARE. 352 | 353 | 354 | before-after-hook 355 | Apache-2.0 356 | Apache License 357 | Version 2.0, January 2004 358 | http://www.apache.org/licenses/ 359 | 360 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 361 | 362 | 1. Definitions. 363 | 364 | "License" shall mean the terms and conditions for use, reproduction, 365 | and distribution as defined by Sections 1 through 9 of this document. 366 | 367 | "Licensor" shall mean the copyright owner or entity authorized by 368 | the copyright owner that is granting the License. 369 | 370 | "Legal Entity" shall mean the union of the acting entity and all 371 | other entities that control, are controlled by, or are under common 372 | control with that entity. For the purposes of this definition, 373 | "control" means (i) the power, direct or indirect, to cause the 374 | direction or management of such entity, whether by contract or 375 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 376 | outstanding shares, or (iii) beneficial ownership of such entity. 377 | 378 | "You" (or "Your") shall mean an individual or Legal Entity 379 | exercising permissions granted by this License. 380 | 381 | "Source" form shall mean the preferred form for making modifications, 382 | including but not limited to software source code, documentation 383 | source, and configuration files. 384 | 385 | "Object" form shall mean any form resulting from mechanical 386 | transformation or translation of a Source form, including but 387 | not limited to compiled object code, generated documentation, 388 | and conversions to other media types. 389 | 390 | "Work" shall mean the work of authorship, whether in Source or 391 | Object form, made available under the License, as indicated by a 392 | copyright notice that is included in or attached to the work 393 | (an example is provided in the Appendix below). 394 | 395 | "Derivative Works" shall mean any work, whether in Source or Object 396 | form, that is based on (or derived from) the Work and for which the 397 | editorial revisions, annotations, elaborations, or other modifications 398 | represent, as a whole, an original work of authorship. For the purposes 399 | of this License, Derivative Works shall not include works that remain 400 | separable from, or merely link (or bind by name) to the interfaces of, 401 | the Work and Derivative Works thereof. 402 | 403 | "Contribution" shall mean any work of authorship, including 404 | the original version of the Work and any modifications or additions 405 | to that Work or Derivative Works thereof, that is intentionally 406 | submitted to Licensor for inclusion in the Work by the copyright owner 407 | or by an individual or Legal Entity authorized to submit on behalf of 408 | the copyright owner. For the purposes of this definition, "submitted" 409 | means any form of electronic, verbal, or written communication sent 410 | to the Licensor or its representatives, including but not limited to 411 | communication on electronic mailing lists, source code control systems, 412 | and issue tracking systems that are managed by, or on behalf of, the 413 | Licensor for the purpose of discussing and improving the Work, but 414 | excluding communication that is conspicuously marked or otherwise 415 | designated in writing by the copyright owner as "Not a Contribution." 416 | 417 | "Contributor" shall mean Licensor and any individual or Legal Entity 418 | on behalf of whom a Contribution has been received by Licensor and 419 | subsequently incorporated within the Work. 420 | 421 | 2. Grant of Copyright License. Subject to the terms and conditions of 422 | this License, each Contributor hereby grants to You a perpetual, 423 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 424 | copyright license to reproduce, prepare Derivative Works of, 425 | publicly display, publicly perform, sublicense, and distribute the 426 | Work and such Derivative Works in Source or Object form. 427 | 428 | 3. Grant of Patent License. Subject to the terms and conditions of 429 | this License, each Contributor hereby grants to You a perpetual, 430 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 431 | (except as stated in this section) patent license to make, have made, 432 | use, offer to sell, sell, import, and otherwise transfer the Work, 433 | where such license applies only to those patent claims licensable 434 | by such Contributor that are necessarily infringed by their 435 | Contribution(s) alone or by combination of their Contribution(s) 436 | with the Work to which such Contribution(s) was submitted. If You 437 | institute patent litigation against any entity (including a 438 | cross-claim or counterclaim in a lawsuit) alleging that the Work 439 | or a Contribution incorporated within the Work constitutes direct 440 | or contributory patent infringement, then any patent licenses 441 | granted to You under this License for that Work shall terminate 442 | as of the date such litigation is filed. 443 | 444 | 4. Redistribution. You may reproduce and distribute copies of the 445 | Work or Derivative Works thereof in any medium, with or without 446 | modifications, and in Source or Object form, provided that You 447 | meet the following conditions: 448 | 449 | (a) You must give any other recipients of the Work or 450 | Derivative Works a copy of this License; and 451 | 452 | (b) You must cause any modified files to carry prominent notices 453 | stating that You changed the files; and 454 | 455 | (c) You must retain, in the Source form of any Derivative Works 456 | that You distribute, all copyright, patent, trademark, and 457 | attribution notices from the Source form of the Work, 458 | excluding those notices that do not pertain to any part of 459 | the Derivative Works; and 460 | 461 | (d) If the Work includes a "NOTICE" text file as part of its 462 | distribution, then any Derivative Works that You distribute must 463 | include a readable copy of the attribution notices contained 464 | within such NOTICE file, excluding those notices that do not 465 | pertain to any part of the Derivative Works, in at least one 466 | of the following places: within a NOTICE text file distributed 467 | as part of the Derivative Works; within the Source form or 468 | documentation, if provided along with the Derivative Works; or, 469 | within a display generated by the Derivative Works, if and 470 | wherever such third-party notices normally appear. The contents 471 | of the NOTICE file are for informational purposes only and 472 | do not modify the License. You may add Your own attribution 473 | notices within Derivative Works that You distribute, alongside 474 | or as an addendum to the NOTICE text from the Work, provided 475 | that such additional attribution notices cannot be construed 476 | as modifying the License. 477 | 478 | You may add Your own copyright statement to Your modifications and 479 | may provide additional or different license terms and conditions 480 | for use, reproduction, or distribution of Your modifications, or 481 | for any such Derivative Works as a whole, provided Your use, 482 | reproduction, and distribution of the Work otherwise complies with 483 | the conditions stated in this License. 484 | 485 | 5. Submission of Contributions. Unless You explicitly state otherwise, 486 | any Contribution intentionally submitted for inclusion in the Work 487 | by You to the Licensor shall be under the terms and conditions of 488 | this License, without any additional terms or conditions. 489 | Notwithstanding the above, nothing herein shall supersede or modify 490 | the terms of any separate license agreement you may have executed 491 | with Licensor regarding such Contributions. 492 | 493 | 6. Trademarks. This License does not grant permission to use the trade 494 | names, trademarks, service marks, or product names of the Licensor, 495 | except as required for reasonable and customary use in describing the 496 | origin of the Work and reproducing the content of the NOTICE file. 497 | 498 | 7. Disclaimer of Warranty. Unless required by applicable law or 499 | agreed to in writing, Licensor provides the Work (and each 500 | Contributor provides its Contributions) on an "AS IS" BASIS, 501 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 502 | implied, including, without limitation, any warranties or conditions 503 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 504 | PARTICULAR PURPOSE. You are solely responsible for determining the 505 | appropriateness of using or redistributing the Work and assume any 506 | risks associated with Your exercise of permissions under this License. 507 | 508 | 8. Limitation of Liability. In no event and under no legal theory, 509 | whether in tort (including negligence), contract, or otherwise, 510 | unless required by applicable law (such as deliberate and grossly 511 | negligent acts) or agreed to in writing, shall any Contributor be 512 | liable to You for damages, including any direct, indirect, special, 513 | incidental, or consequential damages of any character arising as a 514 | result of this License or out of the use or inability to use the 515 | Work (including but not limited to damages for loss of goodwill, 516 | work stoppage, computer failure or malfunction, or any and all 517 | other commercial damages or losses), even if such Contributor 518 | has been advised of the possibility of such damages. 519 | 520 | 9. Accepting Warranty or Additional Liability. While redistributing 521 | the Work or Derivative Works thereof, You may choose to offer, 522 | and charge a fee for, acceptance of support, warranty, indemnity, 523 | or other liability obligations and/or rights consistent with this 524 | License. However, in accepting such obligations, You may act only 525 | on Your own behalf and on Your sole responsibility, not on behalf 526 | of any other Contributor, and only if You agree to indemnify, 527 | defend, and hold each Contributor harmless for any liability 528 | incurred by, or claims asserted against, such Contributor by reason 529 | of your accepting any such warranty or additional liability. 530 | 531 | END OF TERMS AND CONDITIONS 532 | 533 | APPENDIX: How to apply the Apache License to your work. 534 | 535 | To apply the Apache License to your work, attach the following 536 | boilerplate notice, with the fields enclosed by brackets "{}" 537 | replaced with your own identifying information. (Don't include 538 | the brackets!) The text should be enclosed in the appropriate 539 | comment syntax for the file format. We also recommend that a 540 | file or class name and description of purpose be included on the 541 | same "printed page" as the copyright notice for easier 542 | identification within third-party archives. 543 | 544 | Copyright 2018 Gregor Martynus and other contributors. 545 | 546 | Licensed under the Apache License, Version 2.0 (the "License"); 547 | you may not use this file except in compliance with the License. 548 | You may obtain a copy of the License at 549 | 550 | http://www.apache.org/licenses/LICENSE-2.0 551 | 552 | Unless required by applicable law or agreed to in writing, software 553 | distributed under the License is distributed on an "AS IS" BASIS, 554 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 555 | See the License for the specific language governing permissions and 556 | limitations under the License. 557 | 558 | 559 | bottleneck 560 | MIT 561 | The MIT License (MIT) 562 | 563 | Copyright (c) 2014 Simon Grondin 564 | 565 | Permission is hereby granted, free of charge, to any person obtaining a copy of 566 | this software and associated documentation files (the "Software"), to deal in 567 | the Software without restriction, including without limitation the rights to 568 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 569 | the Software, and to permit persons to whom the Software is furnished to do so, 570 | subject to the following conditions: 571 | 572 | The above copyright notice and this permission notice shall be included in all 573 | copies or substantial portions of the Software. 574 | 575 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 576 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 577 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 578 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 579 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 580 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 581 | 582 | 583 | brace-expansion 584 | MIT 585 | MIT License 586 | 587 | Copyright (c) 2013 Julian Gruber 588 | 589 | Permission is hereby granted, free of charge, to any person obtaining a copy 590 | of this software and associated documentation files (the "Software"), to deal 591 | in the Software without restriction, including without limitation the rights 592 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 593 | copies of the Software, and to permit persons to whom the Software is 594 | furnished to do so, subject to the following conditions: 595 | 596 | The above copyright notice and this permission notice shall be included in all 597 | copies or substantial portions of the Software. 598 | 599 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 600 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 601 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 602 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 603 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 604 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 605 | SOFTWARE. 606 | 607 | 608 | call-bind-apply-helpers 609 | MIT 610 | MIT License 611 | 612 | Copyright (c) 2024 Jordan Harband 613 | 614 | Permission is hereby granted, free of charge, to any person obtaining a copy 615 | of this software and associated documentation files (the "Software"), to deal 616 | in the Software without restriction, including without limitation the rights 617 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 618 | copies of the Software, and to permit persons to whom the Software is 619 | furnished to do so, subject to the following conditions: 620 | 621 | The above copyright notice and this permission notice shall be included in all 622 | copies or substantial portions of the Software. 623 | 624 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 625 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 626 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 627 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 628 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 629 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 630 | SOFTWARE. 631 | 632 | 633 | combined-stream 634 | MIT 635 | Copyright (c) 2011 Debuggable Limited 636 | 637 | Permission is hereby granted, free of charge, to any person obtaining a copy 638 | of this software and associated documentation files (the "Software"), to deal 639 | in the Software without restriction, including without limitation the rights 640 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 641 | copies of the Software, and to permit persons to whom the Software is 642 | furnished to do so, subject to the following conditions: 643 | 644 | The above copyright notice and this permission notice shall be included in 645 | all copies or substantial portions of the Software. 646 | 647 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 648 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 649 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 650 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 651 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 652 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 653 | THE SOFTWARE. 654 | 655 | 656 | concat-map 657 | MIT 658 | This software is released under the MIT license: 659 | 660 | Permission is hereby granted, free of charge, to any person obtaining a copy of 661 | this software and associated documentation files (the "Software"), to deal in 662 | the Software without restriction, including without limitation the rights to 663 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 664 | the Software, and to permit persons to whom the Software is furnished to do so, 665 | subject to the following conditions: 666 | 667 | The above copyright notice and this permission notice shall be included in all 668 | copies or substantial portions of the Software. 669 | 670 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 671 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 672 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 673 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 674 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 675 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 676 | 677 | 678 | debug 679 | MIT 680 | (The MIT License) 681 | 682 | Copyright (c) 2014-2017 TJ Holowaychuk 683 | Copyright (c) 2018-2021 Josh Junon 684 | 685 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software 686 | and associated documentation files (the 'Software'), to deal in the Software without restriction, 687 | including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, 688 | and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, 689 | subject to the following conditions: 690 | 691 | The above copyright notice and this permission notice shall be included in all copies or substantial 692 | portions of the Software. 693 | 694 | THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT 695 | LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 696 | IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 697 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 698 | SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 699 | 700 | 701 | 702 | delayed-stream 703 | MIT 704 | Copyright (c) 2011 Debuggable Limited 705 | 706 | Permission is hereby granted, free of charge, to any person obtaining a copy 707 | of this software and associated documentation files (the "Software"), to deal 708 | in the Software without restriction, including without limitation the rights 709 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 710 | copies of the Software, and to permit persons to whom the Software is 711 | furnished to do so, subject to the following conditions: 712 | 713 | The above copyright notice and this permission notice shall be included in 714 | all copies or substantial portions of the Software. 715 | 716 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 717 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 718 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 719 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 720 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 721 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 722 | THE SOFTWARE. 723 | 724 | 725 | deprecation 726 | ISC 727 | The ISC License 728 | 729 | Copyright (c) Gregor Martynus and contributors 730 | 731 | Permission to use, copy, modify, and/or distribute this software for any 732 | purpose with or without fee is hereby granted, provided that the above 733 | copyright notice and this permission notice appear in all copies. 734 | 735 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 736 | WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 737 | MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 738 | ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 739 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 740 | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR 741 | IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 742 | 743 | 744 | dunder-proto 745 | MIT 746 | MIT License 747 | 748 | Copyright (c) 2024 ECMAScript Shims 749 | 750 | Permission is hereby granted, free of charge, to any person obtaining a copy 751 | of this software and associated documentation files (the "Software"), to deal 752 | in the Software without restriction, including without limitation the rights 753 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 754 | copies of the Software, and to permit persons to whom the Software is 755 | furnished to do so, subject to the following conditions: 756 | 757 | The above copyright notice and this permission notice shall be included in all 758 | copies or substantial portions of the Software. 759 | 760 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 761 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 762 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 763 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 764 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 765 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 766 | SOFTWARE. 767 | 768 | 769 | es-define-property 770 | MIT 771 | MIT License 772 | 773 | Copyright (c) 2024 Jordan Harband 774 | 775 | Permission is hereby granted, free of charge, to any person obtaining a copy 776 | of this software and associated documentation files (the "Software"), to deal 777 | in the Software without restriction, including without limitation the rights 778 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 779 | copies of the Software, and to permit persons to whom the Software is 780 | furnished to do so, subject to the following conditions: 781 | 782 | The above copyright notice and this permission notice shall be included in all 783 | copies or substantial portions of the Software. 784 | 785 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 786 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 787 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 788 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 789 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 790 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 791 | SOFTWARE. 792 | 793 | 794 | es-errors 795 | MIT 796 | MIT License 797 | 798 | Copyright (c) 2024 Jordan Harband 799 | 800 | Permission is hereby granted, free of charge, to any person obtaining a copy 801 | of this software and associated documentation files (the "Software"), to deal 802 | in the Software without restriction, including without limitation the rights 803 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 804 | copies of the Software, and to permit persons to whom the Software is 805 | furnished to do so, subject to the following conditions: 806 | 807 | The above copyright notice and this permission notice shall be included in all 808 | copies or substantial portions of the Software. 809 | 810 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 811 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 812 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 813 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 814 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 815 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 816 | SOFTWARE. 817 | 818 | 819 | es-object-atoms 820 | MIT 821 | MIT License 822 | 823 | Copyright (c) 2024 Jordan Harband 824 | 825 | Permission is hereby granted, free of charge, to any person obtaining a copy 826 | of this software and associated documentation files (the "Software"), to deal 827 | in the Software without restriction, including without limitation the rights 828 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 829 | copies of the Software, and to permit persons to whom the Software is 830 | furnished to do so, subject to the following conditions: 831 | 832 | The above copyright notice and this permission notice shall be included in all 833 | copies or substantial portions of the Software. 834 | 835 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 836 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 837 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 838 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 839 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 840 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 841 | SOFTWARE. 842 | 843 | 844 | es-set-tostringtag 845 | MIT 846 | MIT License 847 | 848 | Copyright (c) 2022 ECMAScript Shims 849 | 850 | Permission is hereby granted, free of charge, to any person obtaining a copy 851 | of this software and associated documentation files (the "Software"), to deal 852 | in the Software without restriction, including without limitation the rights 853 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 854 | copies of the Software, and to permit persons to whom the Software is 855 | furnished to do so, subject to the following conditions: 856 | 857 | The above copyright notice and this permission notice shall be included in all 858 | copies or substantial portions of the Software. 859 | 860 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 861 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 862 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 863 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 864 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 865 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 866 | SOFTWARE. 867 | 868 | 869 | follow-redirects 870 | MIT 871 | Copyright 2014–present Olivier Lalonde , James Talmage , Ruben Verborgh 872 | 873 | Permission is hereby granted, free of charge, to any person obtaining a copy of 874 | this software and associated documentation files (the "Software"), to deal in 875 | the Software without restriction, including without limitation the rights to 876 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 877 | of the Software, and to permit persons to whom the Software is furnished to do 878 | so, subject to the following conditions: 879 | 880 | The above copyright notice and this permission notice shall be included in all 881 | copies or substantial portions of the Software. 882 | 883 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 884 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 885 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 886 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 887 | WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR 888 | IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 889 | 890 | 891 | form-data 892 | MIT 893 | Copyright (c) 2012 Felix Geisendörfer (felix@debuggable.com) and contributors 894 | 895 | Permission is hereby granted, free of charge, to any person obtaining a copy 896 | of this software and associated documentation files (the "Software"), to deal 897 | in the Software without restriction, including without limitation the rights 898 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 899 | copies of the Software, and to permit persons to whom the Software is 900 | furnished to do so, subject to the following conditions: 901 | 902 | The above copyright notice and this permission notice shall be included in 903 | all copies or substantial portions of the Software. 904 | 905 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 906 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 907 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 908 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 909 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 910 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 911 | THE SOFTWARE. 912 | 913 | 914 | fs.realpath 915 | ISC 916 | The ISC License 917 | 918 | Copyright (c) Isaac Z. Schlueter and Contributors 919 | 920 | Permission to use, copy, modify, and/or distribute this software for any 921 | purpose with or without fee is hereby granted, provided that the above 922 | copyright notice and this permission notice appear in all copies. 923 | 924 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 925 | WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 926 | MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 927 | ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 928 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 929 | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR 930 | IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 931 | 932 | ---- 933 | 934 | This library bundles a version of the `fs.realpath` and `fs.realpathSync` 935 | methods from Node.js v0.10 under the terms of the Node.js MIT license. 936 | 937 | Node's license follows, also included at the header of `old.js` which contains 938 | the licensed code: 939 | 940 | Copyright Joyent, Inc. and other Node contributors. 941 | 942 | Permission is hereby granted, free of charge, to any person obtaining a 943 | copy of this software and associated documentation files (the "Software"), 944 | to deal in the Software without restriction, including without limitation 945 | the rights to use, copy, modify, merge, publish, distribute, sublicense, 946 | and/or sell copies of the Software, and to permit persons to whom the 947 | Software is furnished to do so, subject to the following conditions: 948 | 949 | The above copyright notice and this permission notice shall be included in 950 | all copies or substantial portions of the Software. 951 | 952 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 953 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 954 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 955 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 956 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 957 | FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 958 | DEALINGS IN THE SOFTWARE. 959 | 960 | 961 | function-bind 962 | MIT 963 | Copyright (c) 2013 Raynos. 964 | 965 | Permission is hereby granted, free of charge, to any person obtaining a copy 966 | of this software and associated documentation files (the "Software"), to deal 967 | in the Software without restriction, including without limitation the rights 968 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 969 | copies of the Software, and to permit persons to whom the Software is 970 | furnished to do so, subject to the following conditions: 971 | 972 | The above copyright notice and this permission notice shall be included in 973 | all copies or substantial portions of the Software. 974 | 975 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 976 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 977 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 978 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 979 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 980 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 981 | THE SOFTWARE. 982 | 983 | 984 | 985 | get-intrinsic 986 | MIT 987 | MIT License 988 | 989 | Copyright (c) 2020 Jordan Harband 990 | 991 | Permission is hereby granted, free of charge, to any person obtaining a copy 992 | of this software and associated documentation files (the "Software"), to deal 993 | in the Software without restriction, including without limitation the rights 994 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 995 | copies of the Software, and to permit persons to whom the Software is 996 | furnished to do so, subject to the following conditions: 997 | 998 | The above copyright notice and this permission notice shall be included in all 999 | copies or substantial portions of the Software. 1000 | 1001 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1002 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1003 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 1004 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 1005 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 1006 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 1007 | SOFTWARE. 1008 | 1009 | 1010 | get-proto 1011 | MIT 1012 | MIT License 1013 | 1014 | Copyright (c) 2025 Jordan Harband 1015 | 1016 | Permission is hereby granted, free of charge, to any person obtaining a copy 1017 | of this software and associated documentation files (the "Software"), to deal 1018 | in the Software without restriction, including without limitation the rights 1019 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 1020 | copies of the Software, and to permit persons to whom the Software is 1021 | furnished to do so, subject to the following conditions: 1022 | 1023 | The above copyright notice and this permission notice shall be included in all 1024 | copies or substantial portions of the Software. 1025 | 1026 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1027 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1028 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 1029 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 1030 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 1031 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 1032 | SOFTWARE. 1033 | 1034 | 1035 | glob 1036 | ISC 1037 | The ISC License 1038 | 1039 | Copyright (c) Isaac Z. Schlueter and Contributors 1040 | 1041 | Permission to use, copy, modify, and/or distribute this software for any 1042 | purpose with or without fee is hereby granted, provided that the above 1043 | copyright notice and this permission notice appear in all copies. 1044 | 1045 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 1046 | WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 1047 | MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 1048 | ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 1049 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 1050 | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR 1051 | IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 1052 | 1053 | ## Glob Logo 1054 | 1055 | Glob's logo created by Tanya Brassie , licensed 1056 | under a Creative Commons Attribution-ShareAlike 4.0 International License 1057 | https://creativecommons.org/licenses/by-sa/4.0/ 1058 | 1059 | 1060 | gopd 1061 | MIT 1062 | MIT License 1063 | 1064 | Copyright (c) 2022 Jordan Harband 1065 | 1066 | Permission is hereby granted, free of charge, to any person obtaining a copy 1067 | of this software and associated documentation files (the "Software"), to deal 1068 | in the Software without restriction, including without limitation the rights 1069 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 1070 | copies of the Software, and to permit persons to whom the Software is 1071 | furnished to do so, subject to the following conditions: 1072 | 1073 | The above copyright notice and this permission notice shall be included in all 1074 | copies or substantial portions of the Software. 1075 | 1076 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1077 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1078 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 1079 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 1080 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 1081 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 1082 | SOFTWARE. 1083 | 1084 | 1085 | has-flag 1086 | MIT 1087 | MIT License 1088 | 1089 | Copyright (c) Sindre Sorhus (sindresorhus.com) 1090 | 1091 | 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: 1092 | 1093 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 1094 | 1095 | 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. 1096 | 1097 | 1098 | has-symbols 1099 | MIT 1100 | MIT License 1101 | 1102 | Copyright (c) 2016 Jordan Harband 1103 | 1104 | Permission is hereby granted, free of charge, to any person obtaining a copy 1105 | of this software and associated documentation files (the "Software"), to deal 1106 | in the Software without restriction, including without limitation the rights 1107 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 1108 | copies of the Software, and to permit persons to whom the Software is 1109 | furnished to do so, subject to the following conditions: 1110 | 1111 | The above copyright notice and this permission notice shall be included in all 1112 | copies or substantial portions of the Software. 1113 | 1114 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1115 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1116 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 1117 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 1118 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 1119 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 1120 | SOFTWARE. 1121 | 1122 | 1123 | has-tostringtag 1124 | MIT 1125 | MIT License 1126 | 1127 | Copyright (c) 2021 Inspect JS 1128 | 1129 | Permission is hereby granted, free of charge, to any person obtaining a copy 1130 | of this software and associated documentation files (the "Software"), to deal 1131 | in the Software without restriction, including without limitation the rights 1132 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 1133 | copies of the Software, and to permit persons to whom the Software is 1134 | furnished to do so, subject to the following conditions: 1135 | 1136 | The above copyright notice and this permission notice shall be included in all 1137 | copies or substantial portions of the Software. 1138 | 1139 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1140 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1141 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 1142 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 1143 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 1144 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 1145 | SOFTWARE. 1146 | 1147 | 1148 | hasown 1149 | MIT 1150 | MIT License 1151 | 1152 | Copyright (c) Jordan Harband and contributors 1153 | 1154 | Permission is hereby granted, free of charge, to any person obtaining a copy 1155 | of this software and associated documentation files (the "Software"), to deal 1156 | in the Software without restriction, including without limitation the rights 1157 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 1158 | copies of the Software, and to permit persons to whom the Software is 1159 | furnished to do so, subject to the following conditions: 1160 | 1161 | The above copyright notice and this permission notice shall be included in all 1162 | copies or substantial portions of the Software. 1163 | 1164 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1165 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1166 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 1167 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 1168 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 1169 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 1170 | SOFTWARE. 1171 | 1172 | 1173 | inflight 1174 | ISC 1175 | The ISC License 1176 | 1177 | Copyright (c) Isaac Z. Schlueter 1178 | 1179 | Permission to use, copy, modify, and/or distribute this software for any 1180 | purpose with or without fee is hereby granted, provided that the above 1181 | copyright notice and this permission notice appear in all copies. 1182 | 1183 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 1184 | WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 1185 | MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 1186 | ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 1187 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 1188 | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR 1189 | IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 1190 | 1191 | 1192 | inherits 1193 | ISC 1194 | The ISC License 1195 | 1196 | Copyright (c) Isaac Z. Schlueter 1197 | 1198 | Permission to use, copy, modify, and/or distribute this software for any 1199 | purpose with or without fee is hereby granted, provided that the above 1200 | copyright notice and this permission notice appear in all copies. 1201 | 1202 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH 1203 | REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND 1204 | FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 1205 | INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 1206 | LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 1207 | OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 1208 | PERFORMANCE OF THIS SOFTWARE. 1209 | 1210 | 1211 | 1212 | just-performance 1213 | MIT 1214 | MIT License 1215 | 1216 | Copyright (c) 2021 John Hurliman 1217 | 1218 | Permission is hereby granted, free of charge, to any person obtaining a copy 1219 | of this software and associated documentation files (the "Software"), to deal 1220 | in the Software without restriction, including without limitation the rights 1221 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 1222 | copies of the Software, and to permit persons to whom the Software is 1223 | furnished to do so, subject to the following conditions: 1224 | 1225 | The above copyright notice and this permission notice shall be included in all 1226 | copies or substantial portions of the Software. 1227 | 1228 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1229 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1230 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 1231 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 1232 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 1233 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 1234 | SOFTWARE. 1235 | 1236 | 1237 | limiter 1238 | MIT 1239 | Copyright (C) 2011-2021 by John Hurliman 1240 | 1241 | Permission is hereby granted, free of charge, to any person obtaining a copy 1242 | of this software and associated documentation files (the "Software"), to deal 1243 | in the Software without restriction, including without limitation the rights 1244 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 1245 | copies of the Software, and to permit persons to whom the Software is 1246 | furnished to do so, subject to the following conditions: 1247 | 1248 | The above copyright notice and this permission notice shall be included in 1249 | all copies or substantial portions of the Software. 1250 | 1251 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1252 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1253 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 1254 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 1255 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 1256 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 1257 | THE SOFTWARE. 1258 | 1259 | 1260 | math-intrinsics 1261 | MIT 1262 | MIT License 1263 | 1264 | Copyright (c) 2024 ECMAScript Shims 1265 | 1266 | Permission is hereby granted, free of charge, to any person obtaining a copy 1267 | of this software and associated documentation files (the "Software"), to deal 1268 | in the Software without restriction, including without limitation the rights 1269 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 1270 | copies of the Software, and to permit persons to whom the Software is 1271 | furnished to do so, subject to the following conditions: 1272 | 1273 | The above copyright notice and this permission notice shall be included in all 1274 | copies or substantial portions of the Software. 1275 | 1276 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1277 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1278 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 1279 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 1280 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 1281 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 1282 | SOFTWARE. 1283 | 1284 | 1285 | mime 1286 | MIT 1287 | The MIT License (MIT) 1288 | 1289 | Copyright (c) 2010 Benjamin Thomas, Robert Kieffer 1290 | 1291 | Permission is hereby granted, free of charge, to any person obtaining a copy 1292 | of this software and associated documentation files (the "Software"), to deal 1293 | in the Software without restriction, including without limitation the rights 1294 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 1295 | copies of the Software, and to permit persons to whom the Software is 1296 | furnished to do so, subject to the following conditions: 1297 | 1298 | The above copyright notice and this permission notice shall be included in 1299 | all copies or substantial portions of the Software. 1300 | 1301 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1302 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1303 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 1304 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 1305 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 1306 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 1307 | THE SOFTWARE. 1308 | 1309 | 1310 | mime-db 1311 | MIT 1312 | 1313 | The MIT License (MIT) 1314 | 1315 | Copyright (c) 2014 Jonathan Ong me@jongleberry.com 1316 | 1317 | Permission is hereby granted, free of charge, to any person obtaining a copy 1318 | of this software and associated documentation files (the "Software"), to deal 1319 | in the Software without restriction, including without limitation the rights 1320 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 1321 | copies of the Software, and to permit persons to whom the Software is 1322 | furnished to do so, subject to the following conditions: 1323 | 1324 | The above copyright notice and this permission notice shall be included in 1325 | all copies or substantial portions of the Software. 1326 | 1327 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1328 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1329 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 1330 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 1331 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 1332 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 1333 | THE SOFTWARE. 1334 | 1335 | 1336 | mime-types 1337 | MIT 1338 | (The MIT License) 1339 | 1340 | Copyright (c) 2014 Jonathan Ong 1341 | Copyright (c) 2015 Douglas Christopher Wilson 1342 | 1343 | Permission is hereby granted, free of charge, to any person obtaining 1344 | a copy of this software and associated documentation files (the 1345 | 'Software'), to deal in the Software without restriction, including 1346 | without limitation the rights to use, copy, modify, merge, publish, 1347 | distribute, sublicense, and/or sell copies of the Software, and to 1348 | permit persons to whom the Software is furnished to do so, subject to 1349 | the following conditions: 1350 | 1351 | The above copyright notice and this permission notice shall be 1352 | included in all copies or substantial portions of the Software. 1353 | 1354 | THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, 1355 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 1356 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 1357 | IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY 1358 | CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 1359 | TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 1360 | SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 1361 | 1362 | 1363 | minimatch 1364 | ISC 1365 | The ISC License 1366 | 1367 | Copyright (c) Isaac Z. Schlueter and Contributors 1368 | 1369 | Permission to use, copy, modify, and/or distribute this software for any 1370 | purpose with or without fee is hereby granted, provided that the above 1371 | copyright notice and this permission notice appear in all copies. 1372 | 1373 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 1374 | WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 1375 | MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 1376 | ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 1377 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 1378 | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR 1379 | IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 1380 | 1381 | 1382 | ms 1383 | MIT 1384 | The MIT License (MIT) 1385 | 1386 | Copyright (c) 2016 Zeit, Inc. 1387 | 1388 | Permission is hereby granted, free of charge, to any person obtaining a copy 1389 | of this software and associated documentation files (the "Software"), to deal 1390 | in the Software without restriction, including without limitation the rights 1391 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 1392 | copies of the Software, and to permit persons to whom the Software is 1393 | furnished to do so, subject to the following conditions: 1394 | 1395 | The above copyright notice and this permission notice shall be included in all 1396 | copies or substantial portions of the Software. 1397 | 1398 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1399 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1400 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 1401 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 1402 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 1403 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 1404 | SOFTWARE. 1405 | 1406 | 1407 | once 1408 | ISC 1409 | The ISC License 1410 | 1411 | Copyright (c) Isaac Z. Schlueter and Contributors 1412 | 1413 | Permission to use, copy, modify, and/or distribute this software for any 1414 | purpose with or without fee is hereby granted, provided that the above 1415 | copyright notice and this permission notice appear in all copies. 1416 | 1417 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 1418 | WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 1419 | MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 1420 | ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 1421 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 1422 | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR 1423 | IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 1424 | 1425 | 1426 | path-is-absolute 1427 | MIT 1428 | The MIT License (MIT) 1429 | 1430 | Copyright (c) Sindre Sorhus (sindresorhus.com) 1431 | 1432 | Permission is hereby granted, free of charge, to any person obtaining a copy 1433 | of this software and associated documentation files (the "Software"), to deal 1434 | in the Software without restriction, including without limitation the rights 1435 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 1436 | copies of the Software, and to permit persons to whom the Software is 1437 | furnished to do so, subject to the following conditions: 1438 | 1439 | The above copyright notice and this permission notice shall be included in 1440 | all copies or substantial portions of the Software. 1441 | 1442 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1443 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1444 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 1445 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 1446 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 1447 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 1448 | THE SOFTWARE. 1449 | 1450 | 1451 | proxy-from-env 1452 | MIT 1453 | The MIT License 1454 | 1455 | Copyright (C) 2016-2018 Rob Wu 1456 | 1457 | Permission is hereby granted, free of charge, to any person obtaining a copy of 1458 | this software and associated documentation files (the "Software"), to deal in 1459 | the Software without restriction, including without limitation the rights to 1460 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 1461 | of the Software, and to permit persons to whom the Software is furnished to do 1462 | so, subject to the following conditions: 1463 | 1464 | The above copyright notice and this permission notice shall be included in all 1465 | copies or substantial portions of the Software. 1466 | 1467 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1468 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 1469 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 1470 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 1471 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 1472 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 1473 | 1474 | 1475 | supports-color 1476 | MIT 1477 | MIT License 1478 | 1479 | Copyright (c) Sindre Sorhus (sindresorhus.com) 1480 | 1481 | 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: 1482 | 1483 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 1484 | 1485 | 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. 1486 | 1487 | 1488 | tunnel 1489 | MIT 1490 | The MIT License (MIT) 1491 | 1492 | Copyright (c) 2012 Koichi Kobayashi 1493 | 1494 | Permission is hereby granted, free of charge, to any person obtaining a copy 1495 | of this software and associated documentation files (the "Software"), to deal 1496 | in the Software without restriction, including without limitation the rights 1497 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 1498 | copies of the Software, and to permit persons to whom the Software is 1499 | furnished to do so, subject to the following conditions: 1500 | 1501 | The above copyright notice and this permission notice shall be included in 1502 | all copies or substantial portions of the Software. 1503 | 1504 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1505 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1506 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 1507 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 1508 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 1509 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 1510 | THE SOFTWARE. 1511 | 1512 | 1513 | undici 1514 | MIT 1515 | MIT License 1516 | 1517 | Copyright (c) Matteo Collina and Undici contributors 1518 | 1519 | Permission is hereby granted, free of charge, to any person obtaining a copy 1520 | of this software and associated documentation files (the "Software"), to deal 1521 | in the Software without restriction, including without limitation the rights 1522 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 1523 | copies of the Software, and to permit persons to whom the Software is 1524 | furnished to do so, subject to the following conditions: 1525 | 1526 | The above copyright notice and this permission notice shall be included in all 1527 | copies or substantial portions of the Software. 1528 | 1529 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1530 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1531 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 1532 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 1533 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 1534 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 1535 | SOFTWARE. 1536 | 1537 | 1538 | universal-user-agent 1539 | ISC 1540 | # [ISC License](https://spdx.org/licenses/ISC) 1541 | 1542 | Copyright (c) 2018, Gregor Martynus (https://github.com/gr2m) 1543 | 1544 | 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. 1545 | 1546 | 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. 1547 | 1548 | 1549 | wrappy 1550 | ISC 1551 | The ISC License 1552 | 1553 | Copyright (c) Isaac Z. Schlueter and Contributors 1554 | 1555 | Permission to use, copy, modify, and/or distribute this software for any 1556 | purpose with or without fee is hereby granted, provided that the above 1557 | copyright notice and this permission notice appear in all copies. 1558 | 1559 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 1560 | WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 1561 | MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 1562 | ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 1563 | WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 1564 | ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR 1565 | IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 1566 | --------------------------------------------------------------------------------