From 63ce0da08bd312bdabfb9aa270212502b48eca69 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 31 Mar 2021 14:13:50 +0000 Subject: [PATCH 01/46] Bump y18n from 4.0.0 to 4.0.1 Bumps [y18n](https://github.com/yargs/y18n) from 4.0.0 to 4.0.1. - [Release notes](https://github.com/yargs/y18n/releases) - [Changelog](https://github.com/yargs/y18n/blob/master/CHANGELOG.md) - [Commits](https://github.com/yargs/y18n/commits) Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 88521ea..cf38f77 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3556,9 +3556,9 @@ xml-name-validator@^3.0.0: integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== y18n@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + version "4.0.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" + integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== yallist@^4.0.0: version "4.0.0" From 42bdc19fa6f86d81bd388b0aef41ea987190b4c3 Mon Sep 17 00:00:00 2001 From: m-vdb Date: Fri, 16 Apr 2021 16:14:48 +0200 Subject: [PATCH 02/46] fix version matching in tests --- __tests__/trivy.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/__tests__/trivy.test.ts b/__tests__/trivy.test.ts index 4fa60c9..77416ff 100644 --- a/__tests__/trivy.test.ts +++ b/__tests__/trivy.test.ts @@ -36,7 +36,7 @@ describe('getDownloadUrl', () => { const os = 'Linux'; const result = await downloader['getDownloadUrl'](version, os); expect(result).toMatch( - /releases\/download\/v[0-9]\.[0-9]\.[0-9]\/trivy_[0-9]\.[0-9]\.[0-9]_Linux-64bit\.tar\.gz$/ + /releases\/download\/v[0-9]+\.[0-9]+\.[0-9]+\/trivy_[0-9]+\.[0-9]+\.[0-9]+_Linux-64bit\.tar\.gz$/ ); }); From 33e69986545936db223d5288849bc76202671709 Mon Sep 17 00:00:00 2001 From: m-vdb Date: Fri, 16 Apr 2021 16:22:24 +0200 Subject: [PATCH 03/46] issue body should contain image name --- __tests__/trivy.test.ts | 7 +++++-- src/index.ts | 2 +- src/trivy.ts | 5 +++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/__tests__/trivy.test.ts b/__tests__/trivy.test.ts index 77416ff..56af097 100644 --- a/__tests__/trivy.test.ts +++ b/__tests__/trivy.test.ts @@ -198,6 +198,8 @@ describe('Trivy scan', () => { }); describe('Parse', () => { + const image: string = 'alpine:3.10'; + test('the result without vulnerabilities', () => { const vulnerabilities: Vulnerability[] = [ { @@ -205,7 +207,7 @@ describe('Parse', () => { Vulnerabilities: null, }, ]; - const result = trivy.parse(vulnerabilities); + const result = trivy.parse(image, vulnerabilities); expect(result).toBe(''); }); @@ -248,10 +250,11 @@ describe('Parse', () => { ], }, ]; - const result = trivy.parse(vulnerabilities); + const result = trivy.parse(image, vulnerabilities); expect(result).toMatch( /\|Title\|Severity\|CVE\|Package Name\|Installed Version\|Fixed Version\|References\|/ ); + expect(result).toContain(image); }); }); diff --git a/src/index.ts b/src/index.ts index c8cfcd4..ad46d9a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -47,7 +47,7 @@ async function run() { return; } - const issueContent: string = trivy.parse(result as Vulnerability[]); + const issueContent: string = trivy.parse(image, result as Vulnerability[]); if (issueContent === '') { core.info( diff --git a/src/trivy.ts b/src/trivy.ts index 61fee50..4514c62 100644 --- a/src/trivy.ts +++ b/src/trivy.ts @@ -164,7 +164,7 @@ export class Trivy { `); } - public parse(vulnerabilities: Vulnerability[]): string { + public parse(image: string, vulnerabilities: Vulnerability[]): string { let issueContent: string = ''; for (const vuln of vulnerabilities) { @@ -191,7 +191,8 @@ export class Trivy { } issueContent += `${vulnTable}\n\n`; } - return issueContent; + + return issueContent ? `_(image scanned: \`${image}\`)_\n\n${issueContent}` : issueContent; } private validateOption(option: TrivyOption): void { From d9d33fbbe2e46f3f8164c8a00c40b5bd224be624 Mon Sep 17 00:00:00 2001 From: m-vdb Date: Fri, 16 Apr 2021 16:22:52 +0200 Subject: [PATCH 04/46] bump build --- dist/index.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/dist/index.js b/dist/index.js index bb16b23..d56c8d6 100644 --- a/dist/index.js +++ b/dist/index.js @@ -6572,7 +6572,7 @@ function run() { ${result}`); return; } - const issueContent = trivy.parse(result); + const issueContent = trivy.parse(image, result); if (issueContent === '') { core.info('Vulnerabilities were not found.\nYour maintenance looks good 👍'); return; @@ -13337,7 +13337,7 @@ class Trivy { error: ${result.error} `); } - parse(vulnerabilities) { + parse(image, vulnerabilities) { let issueContent = ''; for (const vuln of vulnerabilities) { if (vuln.Vulnerabilities === null) @@ -13361,7 +13361,7 @@ class Trivy { } issueContent += `${vulnTable}\n\n`; } - return issueContent; + return issueContent ? `_(image scanned: \`${image}\`)_\n\n${issueContent}` : issueContent; } validateOption(option) { this.validateSeverity(option.severity.split(',')); From f7b734dd47626ef162dce432f4cad5bca9b68e1e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 May 2021 03:29:53 +0000 Subject: [PATCH 05/46] Bump lodash from 4.17.19 to 4.17.21 Bumps [lodash](https://github.com/lodash/lodash) from 4.17.19 to 4.17.21. - [Release notes](https://github.com/lodash/lodash/releases) - [Commits](https://github.com/lodash/lodash/compare/4.17.19...4.17.21) Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 88521ea..cecbd5b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2307,9 +2307,9 @@ lodash.uniq@^4.5.0: integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= lodash@^4.17.13, lodash@^4.17.15: - version "4.17.19" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.19.tgz#e48ddedbe30b3321783c5b4301fbd353bc1e4a4b" - integrity sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ== + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== loose-envify@^1.0.0: version "1.4.0" From 83a14e2c08e7c9e2c1e4aa494db30a056e7670cc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 11 May 2021 12:32:00 +0000 Subject: [PATCH 06/46] Bump hosted-git-info from 2.8.5 to 2.8.9 Bumps [hosted-git-info](https://github.com/npm/hosted-git-info) from 2.8.5 to 2.8.9. - [Release notes](https://github.com/npm/hosted-git-info/releases) - [Changelog](https://github.com/npm/hosted-git-info/blob/v2.8.9/CHANGELOG.md) - [Commits](https://github.com/npm/hosted-git-info/compare/v2.8.5...v2.8.9) Signed-off-by: dependabot[bot] --- yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/yarn.lock b/yarn.lock index 88521ea..cf819c4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1464,9 +1464,9 @@ has@^1.0.3: function-bind "^1.1.1" hosted-git-info@^2.1.4: - version "2.8.5" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.5.tgz#759cfcf2c4d156ade59b0b2dfabddc42a6b9c70c" - integrity sha512-kssjab8CvdXfcXMXVcvsXum4Hwdq9XGtRD3TteMEvEbq0LXyiNQr6AprqKqfeaDXze7SxWvRxdpwE6ku7ikLkg== + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== html-encoding-sniffer@^1.0.2: version "1.0.2" From 2092e59d7b5c769c9b176945e1eb2e071f60a319 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Jun 2021 12:42:51 +0000 Subject: [PATCH 07/46] Bump axios from 0.19.2 to 0.21.1 Bumps [axios](https://github.com/axios/axios) from 0.19.2 to 0.21.1. - [Release notes](https://github.com/axios/axios/releases) - [Changelog](https://github.com/axios/axios/blob/v0.21.1/CHANGELOG.md) - [Commits](https://github.com/axios/axios/compare/v0.19.2...v0.21.1) Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 27 +++++++++------------------ 2 files changed, 10 insertions(+), 19 deletions(-) diff --git a/package.json b/package.json index b173b26..495bc43 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "@actions/github": "^1.1.0", "@types/node-fetch": "^2.5.3", "@types/tar": "^4.0.3", - "axios": "^0.19.0", + "axios": "^0.21.1", "node-fetch": "^2.6.1", "tar": "^5.0.5" }, diff --git a/yarn.lock b/yarn.lock index 69f234d..dd96a91 100644 --- a/yarn.lock +++ b/yarn.lock @@ -655,12 +655,12 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== -axios@^0.19.0: - version "0.19.2" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.2.tgz#3ea36c5d8818d0d5f8a8a97a6d36b86cdc00cb27" - integrity sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA== +axios@^0.21.1: + version "0.21.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" + integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== dependencies: - follow-redirects "1.5.10" + follow-redirects "^1.10.0" babel-jest@^24.9.0: version "24.9.0" @@ -975,13 +975,6 @@ data-urls@^1.0.0: whatwg-mimetype "^2.2.0" whatwg-url "^7.0.0" -debug@=3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== - dependencies: - ms "2.0.0" - debug@^2.2.0, debug@^2.3.3: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -1288,12 +1281,10 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" -follow-redirects@1.5.10: - version "1.5.10" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" - integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== - dependencies: - debug "=3.1.0" +follow-redirects@^1.10.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.1.tgz#d9114ded0a1cfdd334e164e6662ad02bfd91ff43" + integrity sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg== for-in@^1.0.2: version "1.0.2" From 9ca5ec41f451d957c6de24f2c5f2f916a10c8fc8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 3 Jun 2021 12:42:51 +0000 Subject: [PATCH 08/46] Bump @actions/core from 1.2.2 to 1.2.6 Bumps [@actions/core](https://github.com/actions/toolkit/tree/HEAD/packages/core) from 1.2.2 to 1.2.6. - [Release notes](https://github.com/actions/toolkit/releases) - [Changelog](https://github.com/actions/toolkit/blob/main/packages/core/RELEASES.md) - [Commits](https://github.com/actions/toolkit/commits/HEAD/packages/core) Signed-off-by: dependabot[bot] --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index b173b26..1c4ee1a 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "author": "homoluctus", "license": "MIT", "dependencies": { - "@actions/core": "^1.0.0", + "@actions/core": "^1.2.6", "@actions/github": "^1.1.0", "@types/node-fetch": "^2.5.3", "@types/tar": "^4.0.3", diff --git a/yarn.lock b/yarn.lock index 69f234d..0875445 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@actions/core@^1.0.0": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@actions/core/-/core-1.2.2.tgz#3c4848d50378f9e3bcb67bcf97813382ec7369ee" - integrity sha512-IbCx7oefq+Gi6FWbSs2Fnw8VkEI6Y4gvjrYprY3RV//ksq/KPMlClOerJ4jRosyal6zkUIc8R9fS/cpRMlGClg== +"@actions/core@^1.2.6": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@actions/core/-/core-1.2.6.tgz#a78d49f41a4def18e88ce47c2cac615d5694bf09" + integrity sha512-ZQYitnqiyBc3D+k7LsgSBmMDVkOVidaagDG7j3fOym77jNunWRuYx7VSHa9GNfFZh+zh61xsCjRj4JxMZlDqTA== "@actions/github@^1.1.0": version "1.1.0" From 56174159e300805e725ea6078f3ddfb203a1a7b4 Mon Sep 17 00:00:00 2001 From: homoluctus Date: Thu, 3 Jun 2021 22:05:32 +0900 Subject: [PATCH 09/46] ci: Organiza GitHub Actions workflows - Delete release workflow not to maintenance action/create-release --- .github/workflows/integration-test.yml | 59 ++++++++++ .github/workflows/release.yml | 36 ------- .github/workflows/test.yml | 102 ------------------ .../workflows/{unittest.yml => unit-test.yml} | 11 +- README.md | 4 +- 5 files changed, 66 insertions(+), 146 deletions(-) create mode 100644 .github/workflows/integration-test.yml delete mode 100644 .github/workflows/release.yml delete mode 100644 .github/workflows/test.yml rename .github/workflows/{unittest.yml => unit-test.yml} (67%) diff --git a/.github/workflows/integration-test.yml b/.github/workflows/integration-test.yml new file mode 100644 index 0000000..643d24b --- /dev/null +++ b/.github/workflows/integration-test.yml @@ -0,0 +1,59 @@ +name: Integration Test + +on: + pull_request: + paths: + - 'src/**' + - tsconfig.json + - package.json + - yarn.lock + +env: + IMAGE_NAME: alpine:3.10.3 + +jobs: + test1: + name: Test parameters + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: Pull docker image + run: docker pull ${{ env.IMAGE_NAME }} + + - uses: ./ + with: + token: ${{ secrets.GITHUB_TOKEN }} + image: ${{ env.IMAGE_NAME }} + issue_label: trivy,vulnerability,test + issue_title: Security Alert Test + issue_assignee: homoluctus + + test2: + name: Getting image name from enviroment variable + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: Pull docker image + run: docker pull ${{ env.IMAGE_NAME }} + + - uses: ./ + with: + token: ${{ secrets.GITHUB_TOKEN }} + issue_label: trivy,vulnerability,test + issue_title: Security Alert Test + issue_assignee: homoluctus + + test3: + name: Not create issue + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: Pull docker image + run: docker pull ${{ env.IMAGE_NAME }} + + - uses: ./ + with: + issue: 'false' diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index fd36d48..0000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,36 +0,0 @@ -name: Release New Version - -on: - push: - tags: - - 'v*' - -jobs: - release: - name: Pre Release - runs-on: ubuntu-18.04 - steps: - - uses: actions/checkout@v1 - - - uses: actions/setup-node@v1 - with: - node-version: '12.x' - - - name: Create Pre Release - uses: actions/create-release@v1.0.0 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - tag_name: ${{ github.ref }} - release_name: ${{ github.ref }} - draft: 'false' - prerelease: 'true' - - - name: Slack Notification - uses: homoluctus/slatify@master - if: always() - with: - type: ${{ job.status }} - job_name: ':rocket: *Publish new release ${{ github.ref }}*' - channel: '#develop' - url: ${{ secrets.SLACK_WEBHOOK }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml deleted file mode 100644 index f1898f6..0000000 --- a/.github/workflows/test.yml +++ /dev/null @@ -1,102 +0,0 @@ -name: Test my typescript action - -on: - pull_request: - paths: - - 'src/**' - - 'dist/**' - - tsconfig.json - - package.json - - yarn.lock - -env: - IMAGE_NAME: alpine:3.10.1 - -jobs: - test1: - name: Test for with parameter - runs-on: ubuntu-18.04 - steps: - - uses: actions/checkout@v1 - - - name: Install dependencies - run: yarn install - - - name: Build - run: yarn run build - - - name: Pull docker image - run: docker pull alpine:3.10.3 - - - uses: ./ - with: - token: ${{ secrets.GITHUB_TOKEN }} - image: alpine:3.10.1 - issue_label: trivy,vulnerability,test - issue_title: Security Alert Test - issue_assignee: homoluctus - - - uses: homoluctus/slatify@v1.9.0 - if: always() - with: - type: ${{ job.status }} - job_name: ':ts: *test gitrivy (test1)*' - channel: '#develop' - url: ${{ secrets.SLACK_WEBHOOK }} - - test2: - name: Test for getting image name from enviroment variable - runs-on: ubuntu-18.04 - steps: - - uses: actions/checkout@v1 - - - name: Install dependencies - run: yarn install - - - name: Build - run: yarn run build - - - name: Pull docker image - run: docker pull alpine:3.10.3 - - - uses: ./ - with: - token: ${{ secrets.GITHUB_TOKEN }} - issue_label: trivy,vulnerability,test - issue_title: Security Alert Test - issue_assignee: homoluctus - - - uses: homoluctus/slatify@v1.9.0 - if: always() - with: - type: ${{ job.status }} - job_name: ':ts: *test gitrivy (test2)*' - channel: '#develop' - url: ${{ secrets.SLACK_WEBHOOK }} - - test3: - name: Test not to create issue - runs-on: ubuntu-18.04 - steps: - - uses: actions/checkout@v1 - - - name: Install dependencies - run: yarn install - - - name: Build - run: yarn run build - - - name: Pull docker image - run: docker pull alpine:3.10.3 - - - uses: ./ - with: - issue: 'false' - - - uses: homoluctus/slatify@v1.9.0 - if: always() - with: - type: ${{ job.status }} - job_name: ':ts: *test gitrivy (test3)*' - channel: '#develop' - url: ${{ secrets.SLACK_WEBHOOK }} diff --git a/.github/workflows/unittest.yml b/.github/workflows/unit-test.yml similarity index 67% rename from .github/workflows/unittest.yml rename to .github/workflows/unit-test.yml index cca886a..cda1a73 100644 --- a/.github/workflows/unittest.yml +++ b/.github/workflows/unit-test.yml @@ -4,19 +4,18 @@ on: pull_request: paths: - 'src/**' - - 'dist/**' - tsconfig.json - package.json - yarn.lock jobs: - jest: - name: Test with jest - runs-on: ubuntu-18.04 + test: + name: Unit Test + runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 - - uses: actions/setup-node@v1 + - uses: actions/setup-node@v2 with: node-version: '12.x' diff --git a/README.md b/README.md index e082ff0..a4085d8 100644 --- a/README.md +++ b/README.md @@ -47,12 +47,12 @@ on: jobs: scan: name: Daily Vulnerability Scan - runs-on: ubuntu-18.04 + runs-on: ubuntu-latest steps: - name: Pull docker image run: docker pull sample - - uses: homoluctus/gitrivy@v1.0.0 + - uses: lazy-actions/gitrivy@master with: token: ${{ secrets.GITHUB_TOKEN }} image: sample From f9e7bed619c5c4ee20d9a877be70a0ec2831bce0 Mon Sep 17 00:00:00 2001 From: homoluctus Date: Thu, 3 Jun 2021 22:06:41 +0900 Subject: [PATCH 10/46] ci: Add auto build workflow --- .github/workflows/build.yaml | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 .github/workflows/build.yaml diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml new file mode 100644 index 0000000..5902e3b --- /dev/null +++ b/.github/workflows/build.yaml @@ -0,0 +1,36 @@ +name: Build + +on: + push: + branches: + - master + paths: + - "**.ts" + - "package.json" + - "yarn.lock" + - "tsconfig.json" + +jobs: + build: + name: Transpile Typescript + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - uses: actions/setup-node@v2 + with: + node-version: '14' + + - name: Setup workspace + run: yarn install --frozen-lockfile + + - name: Transpile + run: yarn run build + + - name: Push changes + run: | + git config user.name "${GITHUB_ACTOR}" + git config user.email "${GITHUB_ACTOR}@users.noreply.github.com" + git add . + git commit -m "build: Transpile" || echo "No changes to commit" + git push origin HEAD \ No newline at end of file From 3278c296f9303f6be78801b67a9f5a3ad9a19313 Mon Sep 17 00:00:00 2001 From: homoluctus Date: Thu, 3 Jun 2021 22:09:22 +0900 Subject: [PATCH 11/46] ci: Call integration test after Build workflow completed --- .github/workflows/integration-test.yml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/.github/workflows/integration-test.yml b/.github/workflows/integration-test.yml index 643d24b..00f116c 100644 --- a/.github/workflows/integration-test.yml +++ b/.github/workflows/integration-test.yml @@ -1,12 +1,10 @@ name: Integration Test on: - pull_request: - paths: - - 'src/**' - - tsconfig.json - - package.json - - yarn.lock + workflow_run: + workflows: ["Build"] + types: + - completed env: IMAGE_NAME: alpine:3.10.3 From 84a54d9971e553e715e321198b781b137cdfcc5b Mon Sep 17 00:00:00 2001 From: homoluctus Date: Thu, 3 Jun 2021 22:20:03 +0900 Subject: [PATCH 12/46] chore(readme): Change gitrivy branch name in example --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a4085d8..be6af07 100644 --- a/README.md +++ b/README.md @@ -52,7 +52,7 @@ jobs: - name: Pull docker image run: docker pull sample - - uses: lazy-actions/gitrivy@master + - uses: lazy-actions/gitrivy@main with: token: ${{ secrets.GITHUB_TOKEN }} image: sample From 85fdf6dc43974264aa3a229e552a5d9995d3e6ee Mon Sep 17 00:00:00 2001 From: homoluctus Date: Thu, 3 Jun 2021 22:31:43 +0900 Subject: [PATCH 13/46] ci: Add a workflow to tweet new version --- .github/workflows/tweet-action/template.ejs | 4 ++++ .github/workflows/twitter.yaml | 26 +++++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 .github/workflows/tweet-action/template.ejs create mode 100644 .github/workflows/twitter.yaml diff --git a/.github/workflows/tweet-action/template.ejs b/.github/workflows/tweet-action/template.ejs new file mode 100644 index 0000000..f14ee3f --- /dev/null +++ b/.github/workflows/tweet-action/template.ejs @@ -0,0 +1,4 @@ +Release lazy-actions/gitrivy version <%- version %> 🎉🎉🎉 +<%- url %> + +#GitHub #GitHubActions #Trivy \ No newline at end of file diff --git a/.github/workflows/twitter.yaml b/.github/workflows/twitter.yaml new file mode 100644 index 0000000..85abfd3 --- /dev/null +++ b/.github/workflows/twitter.yaml @@ -0,0 +1,26 @@ +name: Twitter + +on: + release: + types: + - "published" + +jobs: + tweet: + name: Tweet New Version + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - uses: lazy-actions/tweet-action@main + with: + data: | + { + "version": "${{ github.event.release.tag_name }}", + "url": "${{ github.event.release.html_url }}" + } + template_filename: .github/workflows/tweet-action/template.ejs + oauth_consumer_key: ${{ secrets.TWITTER_CONSUMER_KEY }} + oauth_consumer_secret: ${{ secrets.TWITTER_CONSUMER_SECRET }} + oauth_token: ${{ secrets.TWITTER_TOKEN }} + oauth_token_secret: ${{ secrets.TWITTER_TOKEN_SECRET }} From 08dfb6d34a1b4f40541920a6301b1b884b1f845a Mon Sep 17 00:00:00 2001 From: homoluctus Date: Thu, 3 Jun 2021 22:37:48 +0900 Subject: [PATCH 14/46] chore: Move image to assets dir --- assets/img/issue.png | Bin 0 -> 65875 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/img/issue.png diff --git a/assets/img/issue.png b/assets/img/issue.png new file mode 100644 index 0000000000000000000000000000000000000000..12b6438628c08f03d4a464fbd9c80e3e1d96c615 GIT binary patch literal 65875 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

p)83ZvOWP!yx`?gVJf228Y*g#>t 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 Date: Thu, 3 Jun 2021 22:38:03 +0900 Subject: [PATCH 15/46] chore(readme): Add badges --- README.md | 9 ++++++--- issue.png | Bin 65875 -> 0 bytes 2 files changed, 6 insertions(+), 3 deletions(-) delete mode 100644 issue.png diff --git a/README.md b/README.md index be6af07..949e031 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,15 @@ -# Gitrivy +# Gitrivy (GitHub Issue + Trivy Action) +![GitHub Workflow Status](https://img.shields.io/github/workflow/status/lazy-actions/gitrivy/Build) +![GitHub Workflow Status](https://img.shields.io/github/workflow/status/lazy-actions/gitrivy/Integration%20Test?label=Integration%20Test) +![GitHub Workflow Status](https://img.shields.io/github/workflow/status/lazy-actions/gitrivy/Unit%20Test?label=Unit%20Test) ![GitHub release (latest by date)](https://img.shields.io/github/v/release/homoluctus/gitrivy?color=brightgreen&include_prereleases) -![GitHub](https://img.shields.io/github/license/homoluctus/gitrivy?color=brightgreen) +![LICENSE](https://img.shields.io/github/license/homoluctus/gitrivy?color=brightgreen) This is a GitHub Actions to scan vulnerability using [Trivy](https://github.com/aquasecurity/trivy).
If vulnerabilities are found by Trivy, it creates the following GitHub Issue. -![image](https://github.com/homoluctus/gitrivy/blob/master/issue.png) +![image](./assets/img/issue.png) ## Usage diff --git a/issue.png b/issue.png deleted file mode 100644 index 12b6438628c08f03d4a464fbd9c80e3e1d96c615..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65875 zcmdSB1zTK8(=JR1AwVEF!QI`0OMu`u4DRmk?(XjHZi71n_W%KcySqDlll|`J+54RL z{DE(-Uf1;WTHU?6y1Kf$>aGa|$cQ4qVZ%W{Kp=>VeFs87yibFGcqb174K7iMv|k1P z5H%GN0*DI<5d!S2jZ7^JAs{GY^>uVm#Azvqbai!fhQ?{A;Ov}%At4b!9q+O3al*0g zKEjEdq!bN}bxfr7_XA5iW9e<$x$z zc=NyaAY)3D!ezM*yK%vZKnEqk!{;ytm%Mts$4!dR!-c7>fP;qq#19Q!)C5zztqu?0 zmWGAtvP#s)s^+6LWvs)2s}iG<0OJg?#h$dus!sxw?#})G{Zakf8-FkhV~sg8<8#OB z+uPa6+uNJwKzBDh>s2>9#4}J=D!d&X6--$rLlto&X=w;*a2^KYU9c$x6gc+|d|`tx z@Fc_qL3{*%qkymPIgtOk`#vq_{eSZBV7S=$*Bex+xnXC&r>BP1l`u`@8@0)7|yyE^z6FR_V(gAEr0gR`?U zy)z5FwVg2o6DKDp10yp7Gcz6d2|9aMD+gT{IxBmU|7qku?R+=1*S9mZaWJ*EBK*^? zuAa4{11~Z0pN{_f`JeYRbTR#>CoB8EhXo!W!=F10O!SNl|7{ywmFG_>7r@lT&_d
WtAOBNQ+ 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

p)83ZvOWP!yx`?gVJf228Y*g#>t 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 Date: Thu, 3 Jun 2021 22:39:55 +0900 Subject: [PATCH 16/46] chore(deps): Update dependencies --- package.json | 5 +- yarn.lock | 1120 ++++++++++++++++++++++++++++++-------------------- 2 files changed, 672 insertions(+), 453 deletions(-) diff --git a/package.json b/package.json index baee8e0..1d84e69 100644 --- a/package.json +++ b/package.json @@ -24,15 +24,14 @@ "dependencies": { "@actions/core": "^1.2.6", "@actions/github": "^1.1.0", - "@types/node-fetch": "^2.5.3", - "@types/tar": "^4.0.3", - "axios": "^0.21.1", "node-fetch": "^2.6.1", "tar": "^5.0.5" }, "devDependencies": { "@types/jest": "^24.0.13", "@types/node": "^12.0.4", + "@types/node-fetch": "^2.5.10", + "@types/tar": "^4.0.4", "@zeit/ncc": "^0.20.5", "jest": "^24.8.0", "jest-circus": "^24.7.1", diff --git a/yarn.lock b/yarn.lock index cd22e92..7bc9624 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3,9 +3,9 @@ "@actions/core@^1.2.6": - version "1.2.6" - resolved "https://registry.yarnpkg.com/@actions/core/-/core-1.2.6.tgz#a78d49f41a4def18e88ce47c2cac615d5694bf09" - integrity sha512-ZQYitnqiyBc3D+k7LsgSBmMDVkOVidaagDG7j3fOym77jNunWRuYx7VSHa9GNfFZh+zh61xsCjRj4JxMZlDqTA== + version "1.3.0" + resolved "https://registry.yarnpkg.com/@actions/core/-/core-1.3.0.tgz#f5e4b24c889e7f2e58b466cc8c7481292284eba0" + integrity sha512-xxtX0Cwdhb8LcgatfJkokqT8KzPvcIbwL9xpLU09nOwBzaStbfm0dNncsP0M4us+EpoPdWy7vbzU5vSOH7K6pg== "@actions/github@^1.1.0": version "1.1.0" @@ -15,94 +15,170 @@ "@octokit/graphql" "^2.0.1" "@octokit/rest" "^16.15.0" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.8.3.tgz#33e25903d7481181534e12ec0a25f16b6fcf419e" - integrity sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658" + integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g== dependencies: - "@babel/highlight" "^7.8.3" + "@babel/highlight" "^7.12.13" + +"@babel/compat-data@^7.14.4": + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.14.4.tgz#45720fe0cecf3fd42019e1d12cc3d27fadc98d58" + integrity sha512-i2wXrWQNkH6JplJQGn3Rd2I4Pij8GdHkXwHMxm+zV5YG/Jci+bCNrWZEWC4o+umiDkRrRs4dVzH3X4GP7vyjQQ== "@babel/core@^7.1.0": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.8.4.tgz#d496799e5c12195b3602d0fddd77294e3e38e80e" - integrity sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.8.4" - "@babel/helpers" "^7.8.4" - "@babel/parser" "^7.8.4" - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.8.4" - "@babel/types" "^7.8.3" + version "7.14.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.3.tgz#5395e30405f0776067fbd9cf0884f15bfb770a38" + integrity sha512-jB5AmTKOCSJIZ72sd78ECEhuPiDMKlQdDI/4QRI6lzYATx5SSogS1oQA2AoPecRCknm30gHi2l+QVvNUu3wZAg== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/generator" "^7.14.3" + "@babel/helper-compilation-targets" "^7.13.16" + "@babel/helper-module-transforms" "^7.14.2" + "@babel/helpers" "^7.14.0" + "@babel/parser" "^7.14.3" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.14.2" + "@babel/types" "^7.14.2" convert-source-map "^1.7.0" debug "^4.1.0" - gensync "^1.0.0-beta.1" - json5 "^2.1.0" - lodash "^4.17.13" - resolve "^1.3.2" - semver "^5.4.1" + gensync "^1.0.0-beta.2" + json5 "^2.1.2" + semver "^6.3.0" source-map "^0.5.0" -"@babel/generator@^7.4.0", "@babel/generator@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.8.4.tgz#35bbc74486956fe4251829f9f6c48330e8d0985e" - integrity sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA== +"@babel/generator@^7.14.2", "@babel/generator@^7.14.3", "@babel/generator@^7.4.0": + version "7.14.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.14.3.tgz#0c2652d91f7bddab7cccc6ba8157e4f40dcedb91" + integrity sha512-bn0S6flG/j0xtQdz3hsjJ624h3W0r3llttBMfyHX3YrZ/KtLYr15bjA0FXkgW7FpvrDuTuElXeVjiKlYRpnOFA== dependencies: - "@babel/types" "^7.8.3" + "@babel/types" "^7.14.2" jsesc "^2.5.1" - lodash "^4.17.13" source-map "^0.5.0" -"@babel/helper-function-name@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz#eeeb665a01b1f11068e9fb86ad56a1cb1a824cca" - integrity sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA== +"@babel/helper-compilation-targets@^7.13.16": + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.14.4.tgz#33ebd0ffc34248051ee2089350a929ab02f2a516" + integrity sha512-JgdzOYZ/qGaKTVkn5qEDV/SXAh8KcyUVkCoSWGN8T3bwrgd6m+/dJa2kVGi6RJYJgEYPBdZ84BZp9dUjNWkBaA== dependencies: - "@babel/helper-get-function-arity" "^7.8.3" - "@babel/template" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/compat-data" "^7.14.4" + "@babel/helper-validator-option" "^7.12.17" + browserslist "^4.16.6" + semver "^6.3.0" -"@babel/helper-get-function-arity@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz#b894b947bd004381ce63ea1db9f08547e920abd5" - integrity sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA== +"@babel/helper-function-name@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.14.2.tgz#397688b590760b6ef7725b5f0860c82427ebaac2" + integrity sha512-NYZlkZRydxw+YT56IlhIcS8PAhb+FEUiOzuhFTfqDyPmzAhRge6ua0dQYT/Uh0t/EDHq05/i+e5M2d4XvjgarQ== dependencies: - "@babel/types" "^7.8.3" + "@babel/helper-get-function-arity" "^7.12.13" + "@babel/template" "^7.12.13" + "@babel/types" "^7.14.2" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.8.0": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz#9ea293be19babc0f52ff8ca88b34c3611b208670" - integrity sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ== +"@babel/helper-get-function-arity@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583" + integrity sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg== + dependencies: + "@babel/types" "^7.12.13" -"@babel/helper-split-export-declaration@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz#31a9f30070f91368a7182cf05f831781065fc7a9" - integrity sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA== +"@babel/helper-member-expression-to-functions@^7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz#dfe368f26d426a07299d8d6513821768216e6d72" + integrity sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw== dependencies: - "@babel/types" "^7.8.3" + "@babel/types" "^7.13.12" -"@babel/helpers@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.8.4.tgz#754eb3ee727c165e0a240d6c207de7c455f36f73" - integrity sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w== +"@babel/helper-module-imports@^7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz#c6a369a6f3621cb25da014078684da9196b61977" + integrity sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA== dependencies: - "@babel/template" "^7.8.3" - "@babel/traverse" "^7.8.4" - "@babel/types" "^7.8.3" + "@babel/types" "^7.13.12" -"@babel/highlight@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.8.3.tgz#28f173d04223eaaa59bc1d439a3836e6d1265797" - integrity sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg== +"@babel/helper-module-transforms@^7.14.2": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.14.2.tgz#ac1cc30ee47b945e3e0c4db12fa0c5389509dfe5" + integrity sha512-OznJUda/soKXv0XhpvzGWDnml4Qnwp16GN+D/kZIdLsWoHj05kyu8Rm5kXmMef+rVJZ0+4pSGLkeixdqNUATDA== + dependencies: + "@babel/helper-module-imports" "^7.13.12" + "@babel/helper-replace-supers" "^7.13.12" + "@babel/helper-simple-access" "^7.13.12" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/helper-validator-identifier" "^7.14.0" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.14.2" + "@babel/types" "^7.14.2" + +"@babel/helper-optimise-call-expression@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea" + integrity sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA== dependencies: + "@babel/types" "^7.12.13" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.8.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz#806526ce125aed03373bc416a828321e3a6a33af" + integrity sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ== + +"@babel/helper-replace-supers@^7.13.12": + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.14.4.tgz#b2ab16875deecfff3ddfcd539bc315f72998d836" + integrity sha512-zZ7uHCWlxfEAAOVDYQpEf/uyi1dmeC7fX4nCf2iz9drnCwi1zvwXL3HwWWNXUQEJ1k23yVn3VbddiI9iJEXaTQ== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.13.12" + "@babel/helper-optimise-call-expression" "^7.12.13" + "@babel/traverse" "^7.14.2" + "@babel/types" "^7.14.4" + +"@babel/helper-simple-access@^7.13.12": + version "7.13.12" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz#dd6c538afb61819d205a012c31792a39c7a5eaf6" + integrity sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA== + dependencies: + "@babel/types" "^7.13.12" + +"@babel/helper-split-export-declaration@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05" + integrity sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg== + dependencies: + "@babel/types" "^7.12.13" + +"@babel/helper-validator-identifier@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz#d26cad8a47c65286b15df1547319a5d0bcf27288" + integrity sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A== + +"@babel/helper-validator-option@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831" + integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw== + +"@babel/helpers@^7.14.0": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.14.0.tgz#ea9b6be9478a13d6f961dbb5f36bf75e2f3b8f62" + integrity sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg== + dependencies: + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.14.0" + "@babel/types" "^7.14.0" + +"@babel/highlight@^7.12.13": + version "7.14.0" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.14.0.tgz#3197e375711ef6bf834e67d0daec88e4f46113cf" + integrity sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg== + dependencies: + "@babel/helper-validator-identifier" "^7.14.0" chalk "^2.0.0" - esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.8.3", "@babel/parser@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.8.4.tgz#d1dbe64691d60358a974295fa53da074dd2ce8e8" - integrity sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw== +"@babel/parser@^7.1.0", "@babel/parser@^7.12.13", "@babel/parser@^7.14.2", "@babel/parser@^7.14.3", "@babel/parser@^7.4.3": + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.14.4.tgz#a5c560d6db6cd8e6ed342368dea8039232cbab18" + integrity sha512-ArliyUsWDUqEGfWcmzpGUzNfLxTdTp6WU4IuP6QFSp9gGfWS6boxFCkJSJ/L4+RG8z/FnIU3WxCk6hPL9SSWeA== "@babel/plugin-syntax-object-rest-spread@^7.0.0": version "7.8.3" @@ -111,37 +187,35 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/template@^7.4.0", "@babel/template@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.8.3.tgz#e02ad04fe262a657809327f578056ca15fd4d1b8" - integrity sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/parser" "^7.8.3" - "@babel/types" "^7.8.3" - -"@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.8.4": - version "7.8.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.8.4.tgz#f0845822365f9d5b0e312ed3959d3f827f869e3c" - integrity sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg== - dependencies: - "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.8.4" - "@babel/helper-function-name" "^7.8.3" - "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/parser" "^7.8.4" - "@babel/types" "^7.8.3" +"@babel/template@^7.12.13", "@babel/template@^7.4.0": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327" + integrity sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/parser" "^7.12.13" + "@babel/types" "^7.12.13" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.14.0", "@babel/traverse@^7.14.2", "@babel/traverse@^7.4.3": + version "7.14.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.14.2.tgz#9201a8d912723a831c2679c7ebbf2fe1416d765b" + integrity sha512-TsdRgvBFHMyHOOzcP9S6QU0QQtjxlRpEYOy3mcCO5RgmC305ki42aSAmfZEMSSYBla2oZ9BMqYlncBaKmD/7iA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/generator" "^7.14.2" + "@babel/helper-function-name" "^7.14.2" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/parser" "^7.14.2" + "@babel/types" "^7.14.2" debug "^4.1.0" globals "^11.1.0" - lodash "^4.17.13" -"@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.8.3.tgz#5a383dffa5416db1b73dedffd311ffd0788fb31c" - integrity sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg== +"@babel/types@^7.0.0", "@babel/types@^7.12.13", "@babel/types@^7.13.12", "@babel/types@^7.14.0", "@babel/types@^7.14.2", "@babel/types@^7.14.4", "@babel/types@^7.3.0", "@babel/types@^7.4.0": + version "7.14.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.4.tgz#bfd6980108168593b38b3eb48a24aa026b919bc0" + integrity sha512-lCj4aIs0xUefJFQnwwQv2Bxg7Omd6bgquZ6LGC+gGMh6/s5qDVfjuCMlDmYQ15SLsWHd9n+X3E75lKIhl5Lkiw== dependencies: - esutils "^2.0.2" - lodash "^4.17.13" + "@babel/helper-validator-identifier" "^7.14.0" to-fast-properties "^2.0.0" "@cnakazawa/watch@^1.0.3": @@ -301,20 +375,20 @@ "@types/yargs" "^13.0.0" "@octokit/auth-token@^2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.4.0.tgz#b64178975218b99e4dfe948253f0673cbbb59d9f" - integrity sha512-eoOVMjILna7FVQf96iWc3+ZtE/ZT6y8ob8ZzcqKY1ibSQCnu4O/B7pJvzMx5cyZ/RjAff6DAdEb0O0Cjcxidkg== + version "2.4.5" + resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.4.5.tgz#568ccfb8cb46f36441fac094ce34f7a875b197f3" + integrity sha512-BpGYsPgJt05M7/L/5FoE1PiAbdxXFZkX/3kDYcsvd1v6UhlnE5e96dTDr0ezX/EFwciQxf3cNV0loipsURU+WA== dependencies: - "@octokit/types" "^2.0.0" + "@octokit/types" "^6.0.3" -"@octokit/endpoint@^5.5.0": - version "5.5.2" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-5.5.2.tgz#ed19d01fe85ac58bc2b774661658f9e5429b8164" - integrity sha512-ICDcRA0C2vtTZZGud1nXRrBLXZqFayodXAKZfo3dkdcLNqcHsgaz3YSTupbURusYeucSVRjjG+RTcQhx6HPPcg== +"@octokit/endpoint@^6.0.1": + version "6.0.11" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-6.0.11.tgz#082adc2aebca6dcefa1fb383f5efb3ed081949d1" + integrity sha512-fUIPpx+pZyoLW4GCs3yMnlj2LfoXTWDUVPTC4V3MUEKZm48W+XYpeWSZCv+vYF1ZABUm2CqnDVf1sFtIYrj7KQ== dependencies: - "@octokit/types" "^2.0.0" - is-plain-object "^3.0.0" - universal-user-agent "^4.0.0" + "@octokit/types" "^6.0.3" + is-plain-object "^5.0.0" + universal-user-agent "^6.0.0" "@octokit/graphql@^2.0.1": version "2.1.3" @@ -324,6 +398,11 @@ "@octokit/request" "^5.0.0" universal-user-agent "^2.0.3" +"@octokit/openapi-types@^7.2.3": + version "7.2.3" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-7.2.3.tgz#a7105796db9b85d25d3feba9a1785a124c7803e4" + integrity sha512-V1ycxkR19jqbIl3evf2RQiMRBvTNRi+Iy9h20G5OP5dPfEF6GJ1DPlUeiZRxo2HJxRr+UA4i0H1nn4btBDPFrw== + "@octokit/plugin-paginate-rest@^1.1.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-1.1.2.tgz#004170acf8c2be535aba26727867d692f7b488fc" @@ -332,9 +411,9 @@ "@octokit/types" "^2.0.1" "@octokit/plugin-request-log@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.0.tgz#eef87a431300f6148c39a7f75f8cfeb218b2547e" - integrity sha512-ywoxP68aOT3zHCLgWZgwUJatiENeHE7xJzYjfz8WI0goynp96wETBF+d95b8g/uL4QmS6owPVlaxiz3wyMAzcw== + version "1.0.3" + resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.3.tgz#70a62be213e1edc04bb8897ee48c311482f9700d" + integrity sha512-4RFU4li238jMJAzLgAwkBAw+4Loile5haQMQr+uhFq27BmyJXcXSKvoQKqh0agsZEiUlW6iSv3FAgvmGkur7OQ== "@octokit/plugin-rest-endpoint-methods@2.4.0": version "2.4.0" @@ -344,7 +423,7 @@ "@octokit/types" "^2.0.1" deprecation "^2.3.1" -"@octokit/request-error@^1.0.1", "@octokit/request-error@^1.0.2": +"@octokit/request-error@^1.0.2": version "1.2.1" resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-1.2.1.tgz#ede0714c773f32347576c25649dc013ae6b31801" integrity sha512-+6yDyk1EES6WK+l3viRDElw96MvwfJxCt45GvmjDUKWjYIb3PJZQkq3i46TwGwoPD4h8NmTrENmtyA1FwbmhRA== @@ -353,24 +432,31 @@ deprecation "^2.0.0" once "^1.4.0" -"@octokit/request@^5.0.0", "@octokit/request@^5.2.0": - version "5.3.1" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.3.1.tgz#3a1ace45e6f88b1be4749c5da963b3a3b4a2f120" - integrity sha512-5/X0AL1ZgoU32fAepTfEoggFinO3rxsMLtzhlUX+RctLrusn/CApJuGFCd0v7GMFhF+8UiCsTTfsu7Fh1HnEJg== +"@octokit/request-error@^2.0.0": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-2.0.5.tgz#72cc91edc870281ad583a42619256b380c600143" + integrity sha512-T/2wcCFyM7SkXzNoyVNWjyVlUwBvW3igM3Btr/eKYiPmucXTtkxt2RBsf6gn3LTzaLSLTQtNmvg+dGsOxQrjZg== dependencies: - "@octokit/endpoint" "^5.5.0" - "@octokit/request-error" "^1.0.1" - "@octokit/types" "^2.0.0" + "@octokit/types" "^6.0.3" deprecation "^2.0.0" - is-plain-object "^3.0.0" - node-fetch "^2.3.0" once "^1.4.0" - universal-user-agent "^4.0.0" + +"@octokit/request@^5.0.0", "@octokit/request@^5.2.0": + version "5.4.15" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.4.15.tgz#829da413dc7dd3aa5e2cdbb1c7d0ebe1f146a128" + integrity sha512-6UnZfZzLwNhdLRreOtTkT9n57ZwulCve8q3IT/Z477vThu6snfdkBuhxnChpOKNGxcQ71ow561Qoa6uqLdPtag== + dependencies: + "@octokit/endpoint" "^6.0.1" + "@octokit/request-error" "^2.0.0" + "@octokit/types" "^6.7.1" + is-plain-object "^5.0.0" + node-fetch "^2.6.1" + universal-user-agent "^6.0.0" "@octokit/rest@^16.15.0": - version "16.43.1" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-16.43.1.tgz#3b11e7d1b1ac2bbeeb23b08a17df0b20947eda6b" - integrity sha512-gfFKwRT/wFxq5qlNjnW2dh+qh74XgTQ2B179UX5K1HYCluioWj8Ndbgqw2PVqa1NnVJkGHp2ovMpVn/DImlmkw== + version "16.43.2" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-16.43.2.tgz#c53426f1e1d1044dee967023e3279c50993dd91b" + integrity sha512-ngDBevLbBTFfrHZeiS7SAMAZ6ssuVmXuya+F/7RaVvlysgGa1JKJkKWY+jV6TCJYcW0OALfJ7nTIGXcBXzycfQ== dependencies: "@octokit/auth-token" "^2.4.0" "@octokit/plugin-paginate-rest" "^1.1.1" @@ -390,16 +476,23 @@ universal-user-agent "^4.0.0" "@octokit/types@^2.0.0", "@octokit/types@^2.0.1": - version "2.1.1" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-2.1.1.tgz#77e80d1b663c5f1f829e5377b728fa3c4fe5a97d" - integrity sha512-89LOYH+d/vsbDX785NOfLxTW88GjNd0lWRz1DVPVsZgg9Yett5O+3MOvwo7iHgvUwbFz0mf/yPIjBkUbs4kxoQ== + version "2.16.2" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-2.16.2.tgz#4c5f8da3c6fecf3da1811aef678fda03edac35d2" + integrity sha512-O75k56TYvJ8WpAakWwYRN8Bgu60KrmX0z1KqFp1kNiFNkgW+JW+9EBKZ+S33PU6SLvbihqd+3drvPxKK68Ee8Q== dependencies: "@types/node" ">= 8" +"@octokit/types@^6.0.3", "@octokit/types@^6.7.1": + version "6.16.2" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.16.2.tgz#62242e0565a3eb99ca2fd376283fe78b4ea057b4" + integrity sha512-wWPSynU4oLy3i4KGyk+J1BLwRKyoeW2TwRHgwbDz17WtVFzSK2GOErGliruIx8c+MaYtHSYTx36DSmLNoNbtgA== + dependencies: + "@octokit/openapi-types" "^7.2.3" + "@types/babel__core@^7.1.0": - version "7.1.4" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.4.tgz#5c5569cc40e5f2737dfc00692f5444e871e4a234" - integrity sha512-c/5MuRz5HM4aizqL5ViYfW4iEnmfPcfbH4Xa6GgLT21dMc1NGeNnuS6egHheOmP+kCJ9CAzC4pv4SDCWTnRkbg== + version "7.1.14" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.14.tgz#faaeefc4185ec71c389f4501ee5ec84b170cc402" + integrity sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" @@ -408,31 +501,31 @@ "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.6.1" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.1.tgz#4901767b397e8711aeb99df8d396d7ba7b7f0e04" - integrity sha512-bBKm+2VPJcMRVwNhxKu8W+5/zT7pwNEqeokFOmbvVSqGzFneNxYcEBro9Ac7/N9tlsaPYnZLK8J1LWKkMsLAew== + version "7.6.2" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.2.tgz#f3d71178e187858f7c45e30380f8f1b7415a12d8" + integrity sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": - version "7.0.2" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.0.2.tgz#4ff63d6b52eddac1de7b975a5223ed32ecea9307" - integrity sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg== + version "7.4.0" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.0.tgz#0c888dd70b3ee9eebb6e4f200e809da0076262be" + integrity sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.0.8" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.8.tgz#479a4ee3e291a403a1096106013ec22cf9b64012" - integrity sha512-yGeB2dHEdvxjP0y4UbRtQaSkXJ9649fYCmIdRoul5kfAoGCwxuCbMhag0k3RPfnuh9kPGm8x89btcfDEXdVWGw== + version "7.11.1" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.11.1.tgz#654f6c4f67568e24c23b367e947098c6206fa639" + integrity sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw== dependencies: "@babel/types" "^7.3.0" "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" - integrity sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg== + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762" + integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw== "@types/istanbul-lib-report@*": version "3.0.0" @@ -442,9 +535,9 @@ "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz#7a8cbf6a406f36c8add871625b278eaf0b0d255a" - integrity sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA== + version "1.1.2" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz#e875cc689e47bce549ec81f3df5e6f6f11cfaeb2" + integrity sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-lib-report" "*" @@ -463,45 +556,46 @@ dependencies: "@types/node" "*" -"@types/node-fetch@^2.5.3": - version "2.5.4" - resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.4.tgz#5245b6d8841fc3a6208b82291119bc11c4e0ce44" - integrity sha512-Oz6id++2qAOFuOlE1j0ouk1dzl3mmI1+qINPNBhi9nt/gVOz0G+13Ao6qjhdF0Ys+eOkhu6JnFmt38bR3H0POQ== +"@types/node-fetch@^2.5.10": + version "2.5.10" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.5.10.tgz#9b4d4a0425562f9fcea70b12cb3fcdd946ca8132" + integrity sha512-IpkX0AasN44hgEad0gEF/V6EgR5n69VEqPEgnmoM8GsIGro3PowbWs4tR6IhxUTyPLpOn+fiGG6nrQhcmoCuIQ== dependencies: "@types/node" "*" + form-data "^3.0.0" "@types/node@*", "@types/node@>= 8": - version "13.7.1" - resolved "https://registry.yarnpkg.com/@types/node/-/node-13.7.1.tgz#238eb34a66431b71d2aaddeaa7db166f25971a0d" - integrity sha512-Zq8gcQGmn4txQEJeiXo/KiLpon8TzAl0kmKH4zdWctPj05nWwp1ClMdAVEloqrQKfaC48PNLdgN/aVaLqUrluA== + version "15.9.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-15.9.0.tgz#0b7f6c33ca5618fe329a9d832b478b4964d325a8" + integrity sha512-AR1Vq1Ei1GaA5FjKL5PBqblTZsL5M+monvGSZwe6sSIdGiuu7Xr/pNwWJY+0ZQuN8AapD/XMB5IzBAyYRFbocA== "@types/node@^12.0.4": - version "12.12.27" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.27.tgz#d7506f73160ad30fcebbcf5b8b7d2d976e649e42" - integrity sha512-odQFl/+B9idbdS0e8IxDl2ia/LP8KZLXhV3BUeI98TrZp0uoIzQPhGd+5EtzHmT0SMOIaPd7jfz6pOHLWTtl7A== + version "12.20.14" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.14.tgz#9caf7eea0df08b406829889cc015256a6d81ab10" + integrity sha512-iFJOS5Q470FF+r4Ol2pSley7/wCNVqf+jgjhtxLLaJcDs+To2iCxlXIkJXrGLD9w9G/oJ9ibySu7z92DCwr7Pg== "@types/stack-utils@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw== -"@types/tar@^4.0.3": - version "4.0.3" - resolved "https://registry.yarnpkg.com/@types/tar/-/tar-4.0.3.tgz#e2cce0b8ff4f285293243f5971bd7199176ac489" - integrity sha512-Z7AVMMlkI8NTWF0qGhC4QIX0zkV/+y0J8x7b/RsHrN0310+YNjoJd8UrApCiGBCWtKjxS9QhNqLi2UJNToh5hA== +"@types/tar@^4.0.4": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@types/tar/-/tar-4.0.4.tgz#d680de60855e7778a51c672b755869a3b8d2889f" + integrity sha512-0Xv+xcmkTsOZdIF4yCnd7RkOOyfyqPaqJ7RZFKnwdxfDbkN3eAAE9sHl8zJFqBz4VhxolW9EErbjR1oyH7jK2A== dependencies: "@types/minipass" "*" "@types/node" "*" "@types/yargs-parser@*": - version "15.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d" - integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw== + version "20.2.0" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.0.tgz#dd3e6699ba3237f0348cd085e4698780204842f9" + integrity sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA== "@types/yargs@^13.0.0": - version "13.0.8" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.8.tgz#a38c22def2f1c2068f8971acb3ea734eb3c64a99" - integrity sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA== + version "13.0.11" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.11.tgz#def2f0c93e4bdf2c61d7e34899b17e34be28d3b1" + integrity sha512-NRqD6T4gktUrDi1o1wLH3EKC1o2caCr7/wR87ODcbVITQF106OM3sFN92ysZ++wqelOd1CTzatnOBRDYYG6wGQ== dependencies: "@types/yargs-parser" "*" @@ -511,9 +605,9 @@ integrity sha512-XU6uzwvv95DqxciQx+aOLhbyBx/13ky+RK1y88Age9Du3BlA4mMPCy13BGjayOrrumOzlq1XV3SD/BWiZENXlw== abab@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.3.tgz#623e2075e02eb2d3f2475e49f99c91846467907a" - integrity sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg== + version "2.0.5" + resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" + integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q== acorn-globals@^4.1.0: version "4.3.4" @@ -534,14 +628,14 @@ acorn@^5.5.3: integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== acorn@^6.0.1: - version "6.4.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.0.tgz#b659d2ffbafa24baf5db1cdbb2c94a983ecd2784" - integrity sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw== + version "6.4.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" + integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== -ajv@^6.5.5: - version "6.11.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.11.0.tgz#c3607cbc8ae392d8a5a536f25b21f8e5f3f87fe9" - integrity sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA== +ajv@^6.12.3: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" @@ -651,16 +745,9 @@ aws-sign2@~0.7.0: integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= aws4@^1.8.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" - integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== - -axios@^0.21.1: - version "0.21.1" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.1.tgz#22563481962f4d6bde9a76d516ef0e5d3c09b2b8" - integrity sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA== - dependencies: - follow-redirects "^1.10.0" + version "1.11.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" + integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA== babel-jest@^24.9.0: version "24.9.0" @@ -701,9 +788,9 @@ babel-preset-jest@^24.9.0: babel-plugin-jest-hoist "^24.9.0" balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base@^0.11.1: version "0.11.2" @@ -726,9 +813,9 @@ bcrypt-pbkdf@^1.0.0: tweetnacl "^0.14.3" before-after-hook@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.1.0.tgz#b6c03487f44e24200dd30ca5e6a1979c5d2fb635" - integrity sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A== + version "2.2.1" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.1.tgz#73540563558687586b52ed217dad6a802ab1549c" + integrity sha512-/6FKxSTWoJdbsLDF8tdIjaRiFXiE6UHsEHE3OPI/cwPURCVi1ukP0gmLn7XWEiFk5TcwQjjY5PWsU+j+tgXgmw== bindings@^1.5.0: version "1.5.0" @@ -761,10 +848,10 @@ braces@^2.3.1: split-string "^3.0.2" to-regex "^3.0.1" -browser-process-hrtime@^0.1.2: - version "0.1.3" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz#616f00faef1df7ec1b5bf9cfe2bdc3170f26c7b4" - integrity sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw== +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== browser-resolve@^1.11.3: version "1.11.3" @@ -773,6 +860,17 @@ browser-resolve@^1.11.3: dependencies: resolve "1.1.7" +browserslist@^4.16.6: + version "4.16.6" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.6.tgz#d7901277a5a88e554ed305b183ec9b0c08f66fa2" + integrity sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ== + dependencies: + caniuse-lite "^1.0.30001219" + colorette "^1.2.2" + electron-to-chromium "^1.3.723" + escalade "^3.1.1" + node-releases "^1.1.71" + bs-logger@0.x: version "0.2.6" resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" @@ -812,6 +910,14 @@ cache-base@^1.0.1: union-value "^1.0.0" unset-value "^1.0.0" +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -827,6 +933,11 @@ camelcase@^5.0.0, camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== +caniuse-lite@^1.0.30001219: + version "1.0.30001233" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001233.tgz#b7cb4a377a4b12ed240d2fa5c792951a06e5f2c4" + integrity sha512-BmkbxLfStqiPA7IEzQpIk0UFZFf3A4E6fzjPJ6OR+bFC2L8ES9J8zGA/asoi47p8XDVkev+WJo2I2Nc8c/34Yg== + capture-exit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" @@ -902,7 +1013,12 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= -combined-stream@^1.0.6, combined-stream@~1.0.6: +colorette@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" + integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== + +combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== @@ -983,11 +1099,11 @@ debug@^2.2.0, debug@^2.3.3: ms "2.0.0" debug@^4.1.0, debug@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" - integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + version "4.3.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" + integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== dependencies: - ms "^2.1.1" + ms "2.1.2" decamelize@^1.2.0: version "1.2.0" @@ -1004,7 +1120,7 @@ deep-is@~0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= -define-properties@^1.1.2, define-properties@^1.1.3: +define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== @@ -1068,6 +1184,11 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" +electron-to-chromium@^1.3.723: + version "1.3.745" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.745.tgz#b54c2baa0e01658288d6835d9f19727fd480de63" + integrity sha512-ZZCx4CS3kYT3BREYiIXocDqlNPT56KfdTS1Ogo4yvxRriBqiEXCDTLIQZT/zNVtby91xTWMMxW2NBiXh8bpLHw== + emoji-regex@^7.0.1: version "7.0.3" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" @@ -1087,22 +1208,27 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.17.0-next.1, es-abstract@^1.17.2: - version "1.17.4" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.4.tgz#e3aedf19706b20e7c2594c35fc0d57605a79e184" - integrity sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ== +es-abstract@^1.18.0-next.2: + version "1.18.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.3.tgz#25c4c3380a27aa203c44b2b685bba94da31b63e0" + integrity sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw== dependencies: + call-bind "^1.0.2" es-to-primitive "^1.2.1" function-bind "^1.1.1" + get-intrinsic "^1.1.1" has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.1.5" - is-regex "^1.0.5" - object-inspect "^1.7.0" + has-symbols "^1.0.2" + is-callable "^1.2.3" + is-negative-zero "^2.0.1" + is-regex "^1.1.3" + is-string "^1.0.6" + object-inspect "^1.10.3" object-keys "^1.1.1" - object.assign "^4.1.0" - string.prototype.trimleft "^2.1.1" - string.prototype.trimright "^2.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.1" es-to-primitive@^1.2.1: version "1.2.1" @@ -1113,15 +1239,25 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + escodegen@^1.9.1: - version "1.14.1" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.1.tgz#ba01d0c8278b5e95a9a45350142026659027a457" - integrity sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ== + version "1.14.3" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" + integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== dependencies: esprima "^4.0.1" estraverse "^4.2.0" @@ -1146,9 +1282,9 @@ esutils@^2.0.2: integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== exec-sh@^0.3.2: - version "0.3.4" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.4.tgz#3a018ceb526cc6f6df2bb504b2bfe8e3a4934ec5" - integrity sha512-sEFIkc61v75sWeOe72qyrqg2Qg0OuLESziUDk/O/z2qgS15y2gWVFrI6f2Qn/qw/0/NCfCEsmNA4zOjkwEZT1A== + version "0.3.6" + resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.6.tgz#ff264f9e325519a60cb5e273692943483cca63bc" + integrity sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w== execa@^1.0.0: version "1.0.0" @@ -1238,9 +1374,9 @@ extsprintf@^1.2.0: integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= fast-deep-equal@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz#545145077c501491e33b15ec408c294376e94ae4" - integrity sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA== + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-json-stable-stringify@2.x, fast-json-stable-stringify@^2.0.0: version "2.1.0" @@ -1281,10 +1417,12 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" -follow-redirects@^1.10.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.1.tgz#d9114ded0a1cfdd334e164e6662ad02bfd91ff43" - integrity sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg== +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" for-in@^1.0.2: version "1.0.2" @@ -1296,6 +1434,15 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= +form-data@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" + integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" @@ -1325,9 +1472,9 @@ fs.realpath@^1.0.0: integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= fsevents@^1.2.7: - version "1.2.11" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.11.tgz#67bf57f4758f02ede88fb2a1712fef4d15358be3" - integrity sha512-+ux3lx6peh0BpvY0JebGyZoiR4D+oYzdPZMKJwkZ+sFkNJzpL7tXc/wehS49gUAxg3tmMHPHZkA8JU2rhhgDHw== + version "1.2.13" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== dependencies: bindings "^1.5.0" nan "^2.12.1" @@ -1337,16 +1484,25 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== -gensync@^1.0.0-beta.1: - version "1.0.0-beta.1" - resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" - integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== get-caller-file@^2.0.1: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + get-stream@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" @@ -1367,9 +1523,9 @@ getpass@^0.1.1: assert-plus "^1.0.0" glob@^7.1.1, glob@^7.1.2, glob@^7.1.3: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + version "7.1.7" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" + integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -1384,9 +1540,9 @@ globals@^11.1.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: - version "4.2.3" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" - integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== + version "4.2.6" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" + integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== growly@^1.3.0: version "1.3.0" @@ -1399,22 +1555,27 @@ har-schema@^2.0.0: integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= har-validator@~5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" - integrity sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g== + version "5.1.5" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w== dependencies: - ajv "^6.5.5" + ajv "^6.12.3" har-schema "^2.0.0" +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= -has-symbols@^1.0.0, has-symbols@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz#9f5214758a44196c406d9bd76cebf81ec2dd31e8" - integrity sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg== +has-symbols@^1.0.1, has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== has-value@^0.3.1: version "0.3.1" @@ -1467,9 +1628,9 @@ html-encoding-sniffer@^1.0.2: whatwg-encoding "^1.0.1" html-escaper@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.0.tgz#71e87f931de3fe09e56661ab9a29aadec707b491" - integrity sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig== + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== http-signature@~1.2.0: version "1.2.0" @@ -1539,15 +1700,27 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= +is-bigint@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.2.tgz#ffb381442503235ad245ea89e45b3dbff040ee5a" + integrity sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA== + +is-boolean-object@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.1.tgz#3c0878f035cb821228d350d2e1e36719716a3de8" + integrity sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng== + dependencies: + call-bind "^1.0.2" + is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-callable@^1.1.4, is-callable@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.5.tgz#f7e46b596890456db74e7f6e976cb3273d06faab" - integrity sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q== +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" + integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== is-ci@^2.0.0: version "2.0.0" @@ -1556,6 +1729,13 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" +is-core-module@^2.2.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1" + integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A== + dependencies: + has "^1.0.3" + is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" @@ -1571,9 +1751,9 @@ is-data-descriptor@^1.0.0: kind-of "^6.0.0" is-date-object@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" - integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.4.tgz#550cfcc03afada05eea3dd30981c7b09551f73e5" + integrity sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A== is-descriptor@^0.1.0: version "0.1.6" @@ -1615,6 +1795,16 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== +is-negative-zero@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== + +is-number-object@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.5.tgz#6edfaeed7950cff19afedce9fbfca9ee6dd289eb" + integrity sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw== + is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -1629,31 +1819,35 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-plain-object@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-3.0.0.tgz#47bfc5da1b5d50d64110806c199359482e75a928" - integrity sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg== - dependencies: - isobject "^4.0.0" +is-plain-object@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== -is-regex@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" - integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== +is-regex@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.3.tgz#d029f9aff6448b93ebbe3f33dac71511fdcbef9f" + integrity sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ== dependencies: - has "^1.0.3" + call-bind "^1.0.2" + has-symbols "^1.0.2" is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= -is-symbol@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" - integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== +is-string@^1.0.5, is-string@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.6.tgz#3fe5d5992fb0d93404f32584d4b0179a71b54a5f" + integrity sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w== + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== dependencies: - has-symbols "^1.0.1" + has-symbols "^1.0.2" is-typedarray@~1.0.0: version "1.0.0" @@ -1692,11 +1886,6 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= -isobject@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-4.0.0.tgz#3f1c9155e73b192022a80819bacd0343711697b0" - integrity sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA== - isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -1957,9 +2146,9 @@ jest-mock@^24.9.0: "@jest/types" "^24.9.0" jest-pnp-resolver@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz#ecdae604c077a7fbc70defb6d517c3c1c898923a" - integrity sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ== + version "1.2.2" + resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" + integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== jest-regex-util@^24.3.0, jest-regex-util@^24.9.0: version "24.9.0" @@ -2190,12 +2379,12 @@ json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= -json5@2.x, json5@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.1.tgz#81b6cb04e9ba496f1c7005d07b4368a2638f90b6" - integrity sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ== +json5@2.x, json5@^2.1.2: + version "2.2.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== dependencies: - minimist "^1.2.0" + minimist "^1.2.5" jsprim@^1.2.2: version "1.4.1" @@ -2297,7 +2486,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@^4.17.13, lodash@^4.17.15: +lodash@^4.17.19: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -2310,9 +2499,9 @@ loose-envify@^1.0.0: js-tokens "^3.0.0 || ^4.0.0" macos-release@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.3.0.tgz#eb1930b036c0800adebccd5f17bc4c12de8bb71f" - integrity sha512-OHhSbtcviqMPt7yfw5ef5aghS2jzFVKEFyCJndQt2YpSQ9qRVSEv2axSJI1paVThEu+FFGs584h/1YhxjVqajA== + version "2.4.1" + resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.4.1.tgz#64033d0ec6a5e6375155a74b1a1eba8e509820ac" + integrity sha512-H/QHeBIN1fIGJX517pvK8IEK53yQOW7YcEI55oYtgjDdoCQQz7eJS94qt5kNrscReEyuD/JcdFCm2XBEcGOITg== make-dir@^2.1.0: version "2.1.0" @@ -2323,9 +2512,9 @@ make-dir@^2.1.0: semver "^5.6.0" make-error@1.x: - version "1.3.5" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8" - integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g== + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== makeerror@1.0.x: version "1.0.11" @@ -2370,17 +2559,17 @@ micromatch@^3.1.10, micromatch@^3.1.4: snapdragon "^0.8.1" to-regex "^3.0.2" -mime-db@1.43.0: - version "1.43.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" - integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== +mime-db@1.48.0: + version "1.48.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.48.0.tgz#e35b31045dd7eada3aaad537ed88a33afbef2d1d" + integrity sha512-FM3QwxV+TnZYQ2aRqhlKBMHxk10lTbMt3bBkMAp54ddrNeVSfcQYOOKuGuy3Ddrm38I04If834fOUSq1yzslJQ== mime-types@^2.1.12, mime-types@~2.1.19: - version "2.1.26" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" - integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== + version "2.1.31" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.31.tgz#a00d76b74317c61f9c2db2218b8e9f8e9c5c9e6b" + integrity sha512-XGZnNzm3QvgKxa8dpzyhFTHmpP3l5YNusmne07VUOXxou9CqUqYa/HBy124RqtVh/O2pECas/MOcsDgpilPOPg== dependencies: - mime-db "1.43.0" + mime-db "1.48.0" minimatch@^3.0.4: version "3.0.4" @@ -2389,27 +2578,22 @@ minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= - -minimist@^1.1.1, minimist@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= +minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== minipass@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.1.tgz#7607ce778472a185ad6d89082aa2070f79cedcd5" - integrity sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w== + version "3.1.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" + integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== dependencies: yallist "^4.0.0" minizlib@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.0.tgz#fd52c645301ef09a63a2c209697c294c6ce02cf3" - integrity sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA== + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== dependencies: minipass "^3.0.0" yallist "^4.0.0" @@ -2423,26 +2607,26 @@ mixin-deep@^1.2.0: is-extendable "^1.0.1" mkdirp@0.x, mkdirp@^0.5.0, mkdirp@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + version "0.5.5" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== dependencies: - minimist "0.0.8" + minimist "^1.2.5" ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -ms@^2.1.1: +ms@2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== nan@^2.12.1: - version "2.14.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" - integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + version "2.14.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" + integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== nanomatch@^1.2.9: version "1.2.13" @@ -2471,7 +2655,7 @@ nice-try@^1.0.4: resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== -node-fetch@^2.3.0, node-fetch@^2.6.1: +node-fetch@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== @@ -2487,9 +2671,9 @@ node-modules-regexp@^1.0.0: integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= node-notifier@^5.4.2: - version "5.4.3" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.3.tgz#cb72daf94c93904098e28b9c590fd866e464bd50" - integrity sha512-M4UBGcs4jeOK9CjTsYwkvH6/MzuUmGCyTW+kCY7uO+1ZVr0+FHGdPdIf5CCLqAaxnRrWidyoQlNkMIIVwbKB8Q== + version "5.4.5" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.4.5.tgz#0cbc1a2b0f658493b4025775a13ad938e96091ef" + integrity sha512-tVbHs7DyTLtzOiN78izLA85zRqB9NvEXkAf014Vx3jtSvn/xBl6bR8ZYifj+dFcFrKI21huSQgJZ6ZtL3B4HfQ== dependencies: growly "^1.3.0" is-wsl "^1.1.0" @@ -2497,6 +2681,11 @@ node-notifier@^5.4.2: shellwords "^0.1.1" which "^1.3.0" +node-releases@^1.1.71: + version "1.1.72" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.72.tgz#14802ab6b1039a79a0c7d662b610a5bbd76eacbe" + integrity sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw== + normalize-package-data@^2.3.2: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" @@ -2540,12 +2729,12 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" - integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== +object-inspect@^1.10.3: + version "1.10.3" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.10.3.tgz#c2aa7d2d09f50c99375704f7a0adf24c5782d369" + integrity sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw== -object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: +object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== @@ -2557,23 +2746,24 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" - integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== +object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== dependencies: - define-properties "^1.1.2" - function-bind "^1.1.1" - has-symbols "^1.0.0" - object-keys "^1.0.11" + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" -object.getownpropertydescriptors@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649" - integrity sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg== +object.getownpropertydescriptors@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz#1bd63aeacf0d5d2d2f31b5e393b03a7c601a23f7" + integrity sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.17.0-next.1" + es-abstract "^1.18.0-next.2" object.pick@^1.3.0: version "1.3.0" @@ -2627,9 +2817,9 @@ p-finally@^1.0.0: integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= p-limit@^2.0.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.2.tgz#61279b67721f5287aa1c13a9a7fbbc48c9291b1e" - integrity sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ== + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== dependencies: p-try "^2.0.0" @@ -2684,9 +2874,9 @@ path-key@^2.0.0, path-key@^2.0.1: integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-type@^3.0.0: version "3.0.0" @@ -2755,17 +2945,17 @@ pretty-format@^24.9.0: react-is "^16.8.4" prompts@^2.0.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.3.1.tgz#b63a9ce2809f106fa9ae1277c275b167af46ea05" - integrity sha512-qIP2lQyCwYbdzcqHIUi2HAxiWixhoM9OdLCWf8txXsapC/X9YdsCoeyRIXE/GP+Q0J37Q7+XN/MFqbUa7IzXNA== + version "2.4.1" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.1.tgz#befd3b1195ba052f9fd2fde8a486c4e82ee77f61" + integrity sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ== dependencies: kleur "^3.0.3" - sisteransi "^1.0.4" + sisteransi "^1.0.5" psl@^1.1.28: - version "1.7.0" - resolved "https://registry.yarnpkg.com/psl/-/psl-1.7.0.tgz#f1c4c47a8ef97167dea5d6bbf4816d736e884a3c" - integrity sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ== + version "1.8.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ== pump@^3.0.0: version "3.0.0" @@ -2786,9 +2976,9 @@ qs@~6.5.2: integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== react-is@^16.8.4: - version "16.12.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c" - integrity sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q== + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== read-pkg-up@^4.0.0: version "4.0.0" @@ -2828,28 +3018,28 @@ remove-trailing-separator@^1.0.1: integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + version "1.1.4" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" + integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= -request-promise-core@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.3.tgz#e9a3c081b51380dfea677336061fea879a829ee9" - integrity sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ== +request-promise-core@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" + integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw== dependencies: - lodash "^4.17.15" + lodash "^4.17.19" request-promise-native@^1.0.5: - version "1.0.8" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz#a455b960b826e44e2bf8999af64dff2bfe58cb36" - integrity sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ== + version "1.0.9" + resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28" + integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g== dependencies: - request-promise-core "1.1.3" + request-promise-core "1.1.4" stealthy-require "^1.1.1" tough-cookie "^2.3.3" @@ -2911,11 +3101,12 @@ resolve@1.1.7: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@1.x, resolve@^1.10.0, resolve@^1.3.2: - version "1.15.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" - integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== +resolve@1.x, resolve@^1.10.0: + version "1.20.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== dependencies: + is-core-module "^2.2.0" path-parse "^1.0.6" ret@~0.1.10: @@ -2936,9 +3127,9 @@ rsvp@^4.8.4: integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== safe-buffer@^5.0.1, safe-buffer@^5.1.2: - version "5.2.0" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" - integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safe-buffer@~5.1.1: version "5.1.2" @@ -2977,12 +3168,12 @@ sax@^1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -"semver@2 || 3 || 4 || 5", semver@^5.4.1, semver@^5.5, semver@^5.5.0, semver@^5.6.0: +"semver@2 || 3 || 4 || 5", semver@^5.5, semver@^5.5.0, semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^6.0.0, semver@^6.2.0: +semver@^6.0.0, semver@^6.2.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== @@ -3020,14 +3211,14 @@ shellwords@^0.1.1: integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + version "3.0.3" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== -sisteransi@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.4.tgz#386713f1ef688c7c0304dc4c0632898941cad2e3" - integrity sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig== +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== slash@^2.0.0: version "2.0.0" @@ -3076,17 +3267,17 @@ source-map-resolve@^0.5.0: urix "^0.1.0" source-map-support@^0.5.6: - version "0.5.16" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" - integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" source-map-url@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= + version "0.4.1" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" + integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== source-map@^0.5.0, source-map@^0.5.6: version "0.5.7" @@ -3099,30 +3290,30 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== spdx-correct@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.0.tgz#fb83e504445268f154b074e218c87c003cd31df4" - integrity sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q== + version "3.1.1" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" - integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== spdx-expression-parse@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" - integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== dependencies: spdx-exceptions "^2.1.0" spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.5" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz#3694b5804567a458d3c8045842a6358632f62654" - integrity sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q== + version "3.0.9" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz#8a595135def9592bda69709474f1cbeea7c2467f" + integrity sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ== split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" @@ -3147,9 +3338,11 @@ sshpk@^1.7.0: tweetnacl "~0.14.0" stack-utils@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.2.tgz#33eba3897788558bebfc2db059dc158ec36cebb8" - integrity sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA== + version "1.0.5" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.5.tgz#a19b0b01947e0029c8e451d5d61a498f5bb1471b" + integrity sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ== + dependencies: + escape-string-regexp "^2.0.0" static-extend@^0.1.1: version "0.1.2" @@ -3181,21 +3374,21 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string.prototype.trimleft@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz#9bdb8ac6abd6d602b17a4ed321870d2f8dcefc74" - integrity sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag== +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - function-bind "^1.1.1" -string.prototype.trimright@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz#440314b15996c866ce8a0341894d45186200c5d9" - integrity sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g== +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== dependencies: + call-bind "^1.0.2" define-properties "^1.1.3" - function-bind "^1.1.1" strip-ansi@^4.0.0: version "4.0.0" @@ -3353,9 +3546,19 @@ type-check@~0.3.2: prelude-ls "~1.1.2" typescript@^3.5.1: - version "3.7.5" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.5.tgz#0692e21f65fd4108b9330238aac11dd2e177a1ae" - integrity sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw== + version "3.9.9" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.9.tgz#e69905c54bc0681d0518bd4d587cc6f2d0b1a674" + integrity sha512-kdMjTiekY+z/ubJCATUPlRDl39vXYiMV9iyeMuEuXZh2we6zz80uovNN2WlAxmmdE/Z/YQe+EbOEXB5RHEED3w== + +unbox-primitive@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" union-value@^1.0.0: version "1.0.1" @@ -3375,12 +3578,17 @@ universal-user-agent@^2.0.3: os-name "^3.0.0" universal-user-agent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-4.0.0.tgz#27da2ec87e32769619f68a14996465ea1cb9df16" - integrity sha512-eM8knLpev67iBDizr/YtqkJsF3GK8gzDc6st/WKzrTuPtcsOKW/0IdL4cnMBsU69pOx0otavLWBDGTwg+dB0aA== + version "4.0.1" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-4.0.1.tgz#fd8d6cb773a679a709e967ef8288a31fcc03e557" + integrity sha512-LnST3ebHwVL2aNe4mejI9IQh2HfZ1RLo8Io2HugSif8ekzD1TlWpHpColOB/eh8JHMLkGH3Akqf040I+4ylNxg== dependencies: os-name "^3.1.0" +universal-user-agent@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" + integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== + unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" @@ -3390,9 +3598,9 @@ unset-value@^1.0.0: isobject "^3.0.0" uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== dependencies: punycode "^2.1.0" @@ -3407,14 +3615,15 @@ use@^3.1.0: integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== util.promisify@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz#6baf7774b80eeb0f7520d8b81d07982a59abbaee" - integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== + version "1.1.1" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.1.1.tgz#77832f57ced2c9478174149cae9b96e9918cd54b" + integrity sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw== dependencies: + call-bind "^1.0.0" define-properties "^1.1.3" - es-abstract "^1.17.2" + for-each "^0.3.3" has-symbols "^1.0.1" - object.getownpropertydescriptors "^2.1.0" + object.getownpropertydescriptors "^2.1.1" uuid@^3.3.2: version "3.4.0" @@ -3439,11 +3648,11 @@ verror@1.10.0: extsprintf "^1.2.0" w3c-hr-time@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz#82ac2bff63d950ea9e3189a58a65625fedf19045" - integrity sha1-gqwr/2PZUOqeMYmlimViX+3xkEU= + version "1.0.2" + resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== dependencies: - browser-process-hrtime "^0.1.2" + browser-process-hrtime "^1.0.0" walker@^1.0.7, walker@~1.0.5: version "1.0.7" @@ -3487,6 +3696,17 @@ whatwg-url@^7.0.0: tr46 "^1.0.1" webidl-conversions "^4.0.2" +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" @@ -3500,9 +3720,9 @@ which@^1.2.9, which@^1.3.0: isexe "^2.0.0" windows-release@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-3.2.0.tgz#8122dad5afc303d833422380680a79cdfa91785f" - integrity sha512-QTlz2hKLrdqukrsapKsINzqMgOUpQW268eJ0OaOpJN32h272waxR9fkB9VoWRtK7uKHG5EHJcTXQBD8XZVJkFA== + version "3.3.3" + resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-3.3.3.tgz#1c10027c7225743eec6b89df160d64c2e0293999" + integrity sha512-OSOGH1QYiW5yVor9TtmXKQvt2vjQqbYS+DqmsZw+r7xDwLXEeT3JGW0ZppFmHx4diyXmxt238KFR3N9jzevBRg== dependencies: execa "^1.0.0" @@ -3547,9 +3767,9 @@ xml-name-validator@^3.0.0: integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== y18n@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" - integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== yallist@^4.0.0: version "4.0.0" @@ -3563,18 +3783,18 @@ yargs-parser@10.x: dependencies: camelcase "^4.1.0" -yargs-parser@^13.1.1: - version "13.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" - integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== +yargs-parser@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" + integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== dependencies: camelcase "^5.0.0" decamelize "^1.2.0" yargs@^13.3.0: - version "13.3.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.0.tgz#4c657a55e07e5f2cf947f8a366567c04a0dedc83" - integrity sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA== + version "13.3.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" + integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== dependencies: cliui "^5.0.0" find-up "^3.0.0" @@ -3585,4 +3805,4 @@ yargs@^13.3.0: string-width "^3.0.0" which-module "^2.0.0" y18n "^4.0.0" - yargs-parser "^13.1.1" + yargs-parser "^13.1.2" From aa7b49cf270a91ee1e0c9252f4036b5f65d6feab Mon Sep 17 00:00:00 2001 From: homoluctus Date: Thu, 3 Jun 2021 22:45:05 +0900 Subject: [PATCH 17/46] ci: Fix branch name in build workflow --- .github/workflows/build.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 5902e3b..7e3309e 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -3,7 +3,7 @@ name: Build on: push: branches: - - master + - main paths: - "**.ts" - "package.json" From 99e3e7b4f2493a5a6680338d51157115855512d0 Mon Sep 17 00:00:00 2001 From: homoluctus Date: Thu, 3 Jun 2021 23:22:54 +0900 Subject: [PATCH 18/46] ci: Use knqyf263/vuln-image includes vulnerabilities as test docker image --- .github/workflows/integration-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/integration-test.yml b/.github/workflows/integration-test.yml index 00f116c..9874717 100644 --- a/.github/workflows/integration-test.yml +++ b/.github/workflows/integration-test.yml @@ -7,7 +7,7 @@ on: - completed env: - IMAGE_NAME: alpine:3.10.3 + IMAGE_NAME: knqyf263/vuln-image jobs: test1: From 67aaf17011a06f3d84d91aaa07e2ffb2b580d8c1 Mon Sep 17 00:00:00 2001 From: homoluctus Date: Thu, 3 Jun 2021 23:33:17 +0900 Subject: [PATCH 19/46] chore(deps): Upgrade @actions/core and @actions/github --- package.json | 4 +- yarn.lock | 193 +++++++++++++++------------------------------------ 2 files changed, 59 insertions(+), 138 deletions(-) diff --git a/package.json b/package.json index 1d84e69..b53b0da 100644 --- a/package.json +++ b/package.json @@ -22,8 +22,8 @@ "author": "homoluctus", "license": "MIT", "dependencies": { - "@actions/core": "^1.2.6", - "@actions/github": "^1.1.0", + "@actions/core": "^1.2.7", + "@actions/github": "^4.0.0", "node-fetch": "^2.6.1", "tar": "^5.0.5" }, diff --git a/yarn.lock b/yarn.lock index 7bc9624..8730290 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,18 +2,27 @@ # yarn lockfile v1 -"@actions/core@^1.2.6": +"@actions/core@^1.2.7": version "1.3.0" resolved "https://registry.yarnpkg.com/@actions/core/-/core-1.3.0.tgz#f5e4b24c889e7f2e58b466cc8c7481292284eba0" integrity sha512-xxtX0Cwdhb8LcgatfJkokqT8KzPvcIbwL9xpLU09nOwBzaStbfm0dNncsP0M4us+EpoPdWy7vbzU5vSOH7K6pg== -"@actions/github@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@actions/github/-/github-1.1.0.tgz#06f34e6b0cf07eb2b3641de3e680dbfae6bcd400" - integrity sha512-cHf6PyoNMdei13jEdGPhKprIMFmjVVW/dnM5/9QmQDJ1ZTaGVyezUSCUIC/ySNLRvDUpeFwPYMdThSEJldSbUw== +"@actions/github@^4.0.0": + version "4.0.0" + resolved "https://registry.yarnpkg.com/@actions/github/-/github-4.0.0.tgz#d520483151a2bf5d2dc9cd0f20f9ac3a2e458816" + integrity sha512-Ej/Y2E+VV6sR9X7pWL5F3VgEWrABaT292DRqRU6R4hnQjPtC/zD3nagxVdXWiRQvYDh8kHXo7IDmG42eJ/dOMA== dependencies: - "@octokit/graphql" "^2.0.1" - "@octokit/rest" "^16.15.0" + "@actions/http-client" "^1.0.8" + "@octokit/core" "^3.0.0" + "@octokit/plugin-paginate-rest" "^2.2.3" + "@octokit/plugin-rest-endpoint-methods" "^4.0.0" + +"@actions/http-client@^1.0.8": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@actions/http-client/-/http-client-1.0.11.tgz#c58b12e9aa8b159ee39e7dd6cbd0e91d905633c0" + integrity sha512-VRYHGQV1rqnROJqdMvGUbY/Kn8vriQe/F9HR2AlYHzmKuM/p3kjNuXhmdBfcVgsvRWTz5C5XW5xvndZrVBuAYg== + dependencies: + tunnel "0.0.6" "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13": version "7.12.13" @@ -374,13 +383,26 @@ "@types/istanbul-reports" "^1.1.1" "@types/yargs" "^13.0.0" -"@octokit/auth-token@^2.4.0": +"@octokit/auth-token@^2.4.4": version "2.4.5" resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.4.5.tgz#568ccfb8cb46f36441fac094ce34f7a875b197f3" integrity sha512-BpGYsPgJt05M7/L/5FoE1PiAbdxXFZkX/3kDYcsvd1v6UhlnE5e96dTDr0ezX/EFwciQxf3cNV0loipsURU+WA== dependencies: "@octokit/types" "^6.0.3" +"@octokit/core@^3.0.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-3.4.0.tgz#b48aa27d755b339fe7550548b340dcc2b513b742" + integrity sha512-6/vlKPP8NF17cgYXqucdshWqmMZGXkuvtcrWCgU5NOI0Pl2GjlmZyWgBMrU8zJ3v2MJlM6++CiB45VKYmhiWWg== + dependencies: + "@octokit/auth-token" "^2.4.4" + "@octokit/graphql" "^4.5.8" + "@octokit/request" "^5.4.12" + "@octokit/request-error" "^2.0.5" + "@octokit/types" "^6.0.3" + before-after-hook "^2.2.0" + universal-user-agent "^6.0.0" + "@octokit/endpoint@^6.0.1": version "6.0.11" resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-6.0.11.tgz#082adc2aebca6dcefa1fb383f5efb3ed081949d1" @@ -390,49 +412,36 @@ is-plain-object "^5.0.0" universal-user-agent "^6.0.0" -"@octokit/graphql@^2.0.1": - version "2.1.3" - resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-2.1.3.tgz#60c058a0ed5fa242eca6f938908d95fd1a2f4b92" - integrity sha512-XoXJqL2ondwdnMIW3wtqJWEwcBfKk37jO/rYkoxNPEVeLBDGsGO1TCWggrAlq3keGt/O+C/7VepXnukUxwt5vA== +"@octokit/graphql@^4.5.8": + version "4.6.2" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-4.6.2.tgz#ec44abdfa87f2b9233282136ae33e4ba446a04e7" + integrity sha512-WmsIR1OzOr/3IqfG9JIczI8gMJUMzzyx5j0XXQ4YihHtKlQc+u35VpVoOXhlKAlaBntvry1WpAzPl/a+s3n89Q== dependencies: - "@octokit/request" "^5.0.0" - universal-user-agent "^2.0.3" + "@octokit/request" "^5.3.0" + "@octokit/types" "^6.0.3" + universal-user-agent "^6.0.0" "@octokit/openapi-types@^7.2.3": version "7.2.3" resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-7.2.3.tgz#a7105796db9b85d25d3feba9a1785a124c7803e4" integrity sha512-V1ycxkR19jqbIl3evf2RQiMRBvTNRi+Iy9h20G5OP5dPfEF6GJ1DPlUeiZRxo2HJxRr+UA4i0H1nn4btBDPFrw== -"@octokit/plugin-paginate-rest@^1.1.1": - version "1.1.2" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-1.1.2.tgz#004170acf8c2be535aba26727867d692f7b488fc" - integrity sha512-jbsSoi5Q1pj63sC16XIUboklNw+8tL9VOnJsWycWYR78TKss5PVpIPb1TUUcMQ+bBh7cY579cVAWmf5qG+dw+Q== +"@octokit/plugin-paginate-rest@^2.2.3": + version "2.13.3" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.13.3.tgz#f0f1792230805108762d87906fb02d573b9e070a" + integrity sha512-46lptzM9lTeSmIBt/sVP/FLSTPGx6DCzAdSX3PfeJ3mTf4h9sGC26WpaQzMEq/Z44cOcmx8VsOhO+uEgE3cjYg== dependencies: - "@octokit/types" "^2.0.1" + "@octokit/types" "^6.11.0" -"@octokit/plugin-request-log@^1.0.0": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.3.tgz#70a62be213e1edc04bb8897ee48c311482f9700d" - integrity sha512-4RFU4li238jMJAzLgAwkBAw+4Loile5haQMQr+uhFq27BmyJXcXSKvoQKqh0agsZEiUlW6iSv3FAgvmGkur7OQ== - -"@octokit/plugin-rest-endpoint-methods@2.4.0": - version "2.4.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-2.4.0.tgz#3288ecf5481f68c494dd0602fc15407a59faf61e" - integrity sha512-EZi/AWhtkdfAYi01obpX0DF7U6b1VRr30QNQ5xSFPITMdLSfhcBqjamE3F+sKcxPbD7eZuMHu3Qkk2V+JGxBDQ== +"@octokit/plugin-rest-endpoint-methods@^4.0.0": + version "4.15.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-4.15.1.tgz#91a064bee99d0ffcef74a04357e1cf15c27d1cd0" + integrity sha512-4gQg4ySoW7ktKB0Mf38fHzcSffVZd6mT5deJQtpqkuPuAqzlED5AJTeW8Uk7dPRn7KaOlWcXB0MedTFJU1j4qA== dependencies: - "@octokit/types" "^2.0.1" + "@octokit/types" "^6.13.0" deprecation "^2.3.1" -"@octokit/request-error@^1.0.2": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-1.2.1.tgz#ede0714c773f32347576c25649dc013ae6b31801" - integrity sha512-+6yDyk1EES6WK+l3viRDElw96MvwfJxCt45GvmjDUKWjYIb3PJZQkq3i46TwGwoPD4h8NmTrENmtyA1FwbmhRA== - dependencies: - "@octokit/types" "^2.0.0" - deprecation "^2.0.0" - once "^1.4.0" - -"@octokit/request-error@^2.0.0": +"@octokit/request-error@^2.0.0", "@octokit/request-error@^2.0.5": version "2.0.5" resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-2.0.5.tgz#72cc91edc870281ad583a42619256b380c600143" integrity sha512-T/2wcCFyM7SkXzNoyVNWjyVlUwBvW3igM3Btr/eKYiPmucXTtkxt2RBsf6gn3LTzaLSLTQtNmvg+dGsOxQrjZg== @@ -441,7 +450,7 @@ deprecation "^2.0.0" once "^1.4.0" -"@octokit/request@^5.0.0", "@octokit/request@^5.2.0": +"@octokit/request@^5.3.0", "@octokit/request@^5.4.12": version "5.4.15" resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.4.15.tgz#829da413dc7dd3aa5e2cdbb1c7d0ebe1f146a128" integrity sha512-6UnZfZzLwNhdLRreOtTkT9n57ZwulCve8q3IT/Z477vThu6snfdkBuhxnChpOKNGxcQ71ow561Qoa6uqLdPtag== @@ -453,36 +462,7 @@ node-fetch "^2.6.1" universal-user-agent "^6.0.0" -"@octokit/rest@^16.15.0": - version "16.43.2" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-16.43.2.tgz#c53426f1e1d1044dee967023e3279c50993dd91b" - integrity sha512-ngDBevLbBTFfrHZeiS7SAMAZ6ssuVmXuya+F/7RaVvlysgGa1JKJkKWY+jV6TCJYcW0OALfJ7nTIGXcBXzycfQ== - dependencies: - "@octokit/auth-token" "^2.4.0" - "@octokit/plugin-paginate-rest" "^1.1.1" - "@octokit/plugin-request-log" "^1.0.0" - "@octokit/plugin-rest-endpoint-methods" "2.4.0" - "@octokit/request" "^5.2.0" - "@octokit/request-error" "^1.0.2" - atob-lite "^2.0.0" - before-after-hook "^2.0.0" - btoa-lite "^1.0.0" - deprecation "^2.0.0" - lodash.get "^4.4.2" - lodash.set "^4.3.2" - lodash.uniq "^4.5.0" - octokit-pagination-methods "^1.1.0" - once "^1.4.0" - universal-user-agent "^4.0.0" - -"@octokit/types@^2.0.0", "@octokit/types@^2.0.1": - version "2.16.2" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-2.16.2.tgz#4c5f8da3c6fecf3da1811aef678fda03edac35d2" - integrity sha512-O75k56TYvJ8WpAakWwYRN8Bgu60KrmX0z1KqFp1kNiFNkgW+JW+9EBKZ+S33PU6SLvbihqd+3drvPxKK68Ee8Q== - dependencies: - "@types/node" ">= 8" - -"@octokit/types@^6.0.3", "@octokit/types@^6.7.1": +"@octokit/types@^6.0.3", "@octokit/types@^6.11.0", "@octokit/types@^6.13.0", "@octokit/types@^6.7.1": version "6.16.2" resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.16.2.tgz#62242e0565a3eb99ca2fd376283fe78b4ea057b4" integrity sha512-wWPSynU4oLy3i4KGyk+J1BLwRKyoeW2TwRHgwbDz17WtVFzSK2GOErGliruIx8c+MaYtHSYTx36DSmLNoNbtgA== @@ -564,7 +544,7 @@ "@types/node" "*" form-data "^3.0.0" -"@types/node@*", "@types/node@>= 8": +"@types/node@*": version "15.9.0" resolved "https://registry.yarnpkg.com/@types/node/-/node-15.9.0.tgz#0b7f6c33ca5618fe329a9d832b478b4964d325a8" integrity sha512-AR1Vq1Ei1GaA5FjKL5PBqblTZsL5M+monvGSZwe6sSIdGiuu7Xr/pNwWJY+0ZQuN8AapD/XMB5IzBAyYRFbocA== @@ -729,11 +709,6 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= -atob-lite@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/atob-lite/-/atob-lite-2.0.0.tgz#0fef5ad46f1bd7a8502c65727f0367d5ee43d696" - integrity sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY= - atob@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" @@ -812,7 +787,7 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" -before-after-hook@^2.0.0: +before-after-hook@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.1.tgz#73540563558687586b52ed217dad6a802ab1549c" integrity sha512-/6FKxSTWoJdbsLDF8tdIjaRiFXiE6UHsEHE3OPI/cwPURCVi1ukP0gmLn7XWEiFk5TcwQjjY5PWsU+j+tgXgmw== @@ -885,11 +860,6 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" -btoa-lite@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/btoa-lite/-/btoa-lite-1.0.0.tgz#337766da15801210fdd956c22e9c6891ab9d0337" - integrity sha1-M3dm2hWAEhD92VbCLpxokaudAzc= - buffer-from@1.x, buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" @@ -2461,31 +2431,16 @@ locate-path@^3.0.0: p-locate "^3.0.0" path-exists "^3.0.0" -lodash.get@^4.4.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= - lodash.memoize@4.x: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= -lodash.set@^4.3.2: - version "4.3.2" - resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" - integrity sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM= - lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg= -lodash.uniq@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" - integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= - lodash@^4.17.19: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" @@ -2498,11 +2453,6 @@ loose-envify@^1.0.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" -macos-release@^2.2.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.4.1.tgz#64033d0ec6a5e6375155a74b1a1eba8e509820ac" - integrity sha512-H/QHeBIN1fIGJX517pvK8IEK53yQOW7YcEI55oYtgjDdoCQQz7eJS94qt5kNrscReEyuD/JcdFCm2XBEcGOITg== - make-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" @@ -2772,11 +2722,6 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -octokit-pagination-methods@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/octokit-pagination-methods/-/octokit-pagination-methods-1.1.0.tgz#cf472edc9d551055f9ef73f6e42b4dbb4c80bea4" - integrity sha512-fZ4qZdQ2nxJvtcasX7Ghl+WlWS/d9IgnBIwFZXVNNZUmzpno91SX5bc5vuxiuKoCtK78XxGGNuSCrDC7xYB3OQ== - once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -2796,14 +2741,6 @@ optionator@^0.8.1: type-check "~0.3.2" word-wrap "~1.2.3" -os-name@^3.0.0, os-name@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/os-name/-/os-name-3.1.0.tgz#dec19d966296e1cd62d701a5a66ee1ddeae70801" - integrity sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg== - dependencies: - macos-release "^2.2.0" - windows-release "^3.1.0" - p-each-series@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-1.0.0.tgz#930f3d12dd1f50e7434457a22cd6f04ac6ad7f71" @@ -3533,6 +3470,11 @@ tunnel-agent@^0.6.0: dependencies: safe-buffer "^5.0.1" +tunnel@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c" + integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg== + tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" @@ -3570,20 +3512,6 @@ union-value@^1.0.0: is-extendable "^0.1.1" set-value "^2.0.1" -universal-user-agent@^2.0.3: - version "2.1.0" - resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-2.1.0.tgz#5abfbcc036a1ba490cb941f8fd68c46d3669e8e4" - integrity sha512-8itiX7G05Tu3mGDTdNY2fB4KJ8MgZLS54RdG6PkkfwMAavrXu1mV/lls/GABx9O3Rw4PnTtasxrvbMQoBYY92Q== - dependencies: - os-name "^3.0.0" - -universal-user-agent@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-4.0.1.tgz#fd8d6cb773a679a709e967ef8288a31fcc03e557" - integrity sha512-LnST3ebHwVL2aNe4mejI9IQh2HfZ1RLo8Io2HugSif8ekzD1TlWpHpColOB/eh8JHMLkGH3Akqf040I+4ylNxg== - dependencies: - os-name "^3.1.0" - universal-user-agent@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" @@ -3719,13 +3647,6 @@ which@^1.2.9, which@^1.3.0: dependencies: isexe "^2.0.0" -windows-release@^3.1.0: - version "3.3.3" - resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-3.3.3.tgz#1c10027c7225743eec6b89df160d64c2e0293999" - integrity sha512-OSOGH1QYiW5yVor9TtmXKQvt2vjQqbYS+DqmsZw+r7xDwLXEeT3JGW0ZppFmHx4diyXmxt238KFR3N9jzevBRg== - dependencies: - execa "^1.0.0" - word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" From cf18e5d6028a7a412d099be0150c1c2d59d76a48 Mon Sep 17 00:00:00 2001 From: homoluctus Date: Thu, 3 Jun 2021 23:37:53 +0900 Subject: [PATCH 20/46] chore(deps): Install @octokit/rest to request GitHub API --- package.json | 1 + yarn.lock | 29 ++++++++++++++++++++++++++--- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index b53b0da..1241fc8 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "dependencies": { "@actions/core": "^1.2.7", "@actions/github": "^4.0.0", + "@octokit/rest": "^18.5.6", "node-fetch": "^2.6.1", "tar": "^5.0.5" }, diff --git a/yarn.lock b/yarn.lock index 8730290..ba30f46 100644 --- a/yarn.lock +++ b/yarn.lock @@ -390,7 +390,7 @@ dependencies: "@octokit/types" "^6.0.3" -"@octokit/core@^3.0.0": +"@octokit/core@^3.0.0", "@octokit/core@^3.2.3": version "3.4.0" resolved "https://registry.yarnpkg.com/@octokit/core/-/core-3.4.0.tgz#b48aa27d755b339fe7550548b340dcc2b513b742" integrity sha512-6/vlKPP8NF17cgYXqucdshWqmMZGXkuvtcrWCgU5NOI0Pl2GjlmZyWgBMrU8zJ3v2MJlM6++CiB45VKYmhiWWg== @@ -426,13 +426,26 @@ resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-7.2.3.tgz#a7105796db9b85d25d3feba9a1785a124c7803e4" integrity sha512-V1ycxkR19jqbIl3evf2RQiMRBvTNRi+Iy9h20G5OP5dPfEF6GJ1DPlUeiZRxo2HJxRr+UA4i0H1nn4btBDPFrw== -"@octokit/plugin-paginate-rest@^2.2.3": +"@octokit/plugin-paginate-rest@^2.2.3", "@octokit/plugin-paginate-rest@^2.6.2": version "2.13.3" resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.13.3.tgz#f0f1792230805108762d87906fb02d573b9e070a" integrity sha512-46lptzM9lTeSmIBt/sVP/FLSTPGx6DCzAdSX3PfeJ3mTf4h9sGC26WpaQzMEq/Z44cOcmx8VsOhO+uEgE3cjYg== dependencies: "@octokit/types" "^6.11.0" +"@octokit/plugin-request-log@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.3.tgz#70a62be213e1edc04bb8897ee48c311482f9700d" + integrity sha512-4RFU4li238jMJAzLgAwkBAw+4Loile5haQMQr+uhFq27BmyJXcXSKvoQKqh0agsZEiUlW6iSv3FAgvmGkur7OQ== + +"@octokit/plugin-rest-endpoint-methods@5.3.1": + version "5.3.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.3.1.tgz#deddce769b4ec3179170709ab42e4e9e6195aaa9" + integrity sha512-3B2iguGmkh6bQQaVOtCsS0gixrz8Lg0v4JuXPqBcFqLKuJtxAUf3K88RxMEf/naDOI73spD+goJ/o7Ie7Cvdjg== + dependencies: + "@octokit/types" "^6.16.2" + deprecation "^2.3.1" + "@octokit/plugin-rest-endpoint-methods@^4.0.0": version "4.15.1" resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-4.15.1.tgz#91a064bee99d0ffcef74a04357e1cf15c27d1cd0" @@ -462,7 +475,17 @@ node-fetch "^2.6.1" universal-user-agent "^6.0.0" -"@octokit/types@^6.0.3", "@octokit/types@^6.11.0", "@octokit/types@^6.13.0", "@octokit/types@^6.7.1": +"@octokit/rest@^18.5.6": + version "18.5.6" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-18.5.6.tgz#8c9a7c9329c7bbf478af20df78ddeab0d21f6d89" + integrity sha512-8HdG6ZjQdZytU6tCt8BQ2XLC7EJ5m4RrbyU/EARSkAM1/HP3ceOzMG/9atEfe17EDMer3IVdHWLedz2wDi73YQ== + dependencies: + "@octokit/core" "^3.2.3" + "@octokit/plugin-paginate-rest" "^2.6.2" + "@octokit/plugin-request-log" "^1.0.2" + "@octokit/plugin-rest-endpoint-methods" "5.3.1" + +"@octokit/types@^6.0.3", "@octokit/types@^6.11.0", "@octokit/types@^6.13.0", "@octokit/types@^6.16.2", "@octokit/types@^6.7.1": version "6.16.2" resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.16.2.tgz#62242e0565a3eb99ca2fd376283fe78b4ea057b4" integrity sha512-wWPSynU4oLy3i4KGyk+J1BLwRKyoeW2TwRHgwbDz17WtVFzSK2GOErGliruIx8c+MaYtHSYTx36DSmLNoNbtgA== From dfdbd74b18d81caba2afacefd391ca9a89dcf857 Mon Sep 17 00:00:00 2001 From: homoluctus Date: Fri, 4 Jun 2021 00:52:59 +0900 Subject: [PATCH 21/46] refactor: Separate trivy and downloader --- __tests__/downloader.test.ts | 99 ++++++++++++++++++++++++++++ __tests__/helper.ts | 11 ++++ __tests__/trivy.test.ts | 99 +++------------------------- src/downloader.ts | 116 +++++++++++++++++++++++++++++++++ src/github.ts | 64 ++++++++++++++++++ src/index.ts | 122 +++++++++++++++-------------------- src/issue.ts | 76 ---------------------- src/trivy.ts | 121 ---------------------------------- 8 files changed, 350 insertions(+), 358 deletions(-) create mode 100644 __tests__/downloader.test.ts create mode 100644 __tests__/helper.ts create mode 100644 src/downloader.ts create mode 100644 src/github.ts delete mode 100644 src/issue.ts diff --git a/__tests__/downloader.test.ts b/__tests__/downloader.test.ts new file mode 100644 index 0000000..416b0bb --- /dev/null +++ b/__tests__/downloader.test.ts @@ -0,0 +1,99 @@ +import * as fs from 'fs'; +import { removeTrivyCmd } from './helper'; +import { Downloader } from '../src/downloader'; + +const downloader = new Downloader(); + +describe('Check Platform', () => { + test('is Liniux', () => { + const result = downloader.checkPlatform('linux'); + expect(result).toBe('Linux'); + }); + + test('is Darwin', () => { + const result = downloader.checkPlatform('darwin'); + expect(result).toBe('macOS'); + }); + + test('is not linux and darwin', () => { + expect(() => { + downloader.checkPlatform('other'); + }).toThrowError('Sorry, other is not supported.'); + }); +}); + +describe('getDownloadUrl', () => { + test('with latest version and linux', async () => { + const version = 'latest'; + const os = 'Linux'; + const result = await downloader.getDownloadUrl(version, os); + expect(result).toMatch( + /releases\/download\/v[0-9]+\.[0-9]+\.[0-9]+\/trivy_[0-9]+\.[0-9]+\.[0-9]+_Linux-64bit\.tar\.gz$/ + ); + }); + + test('with 0.18.3 and macOS', async () => { + const version = '0.18.3'; + const os = 'macOS'; + const result = await downloader.getDownloadUrl(version, os); + expect(result).toMatch( + /releases\/download\/v0\.2\.0\/trivy_0\.2\.0_macOS-64bit\.tar\.gz$/ + ); + }); + + test('with non-supported version', async () => { + const version = 'none'; + const os = 'Linux'; + await expect(downloader.getDownloadUrl(version, os)).rejects.toThrowError( + 'Could not find Trivy asset that you specified.' + ); + }); + + test('with non-supported os', async () => { + const version = 'latest'; + const os = 'none'; + await expect(downloader.getDownloadUrl(version, os)).rejects.toThrowError( + 'Could not find Trivy asset that you specified.' + ); + }); +}); + +describe('Download trivy command', () => { + afterAll(() => { + removeTrivyCmd('__tests__'); + }); + + test('with valid download URL and save in __tests__', async () => { + let downloadUrl = 'https://github.com/aquasecurity/trivy'; + downloadUrl += '/releases/download/v0.18.3/trivy_0.18.3_Linux-64bit.tar.gz'; + const savePath = './__tests__'; + await expect( + downloader.downloadTrivyCmd(downloadUrl, savePath) + ).resolves.toEqual(`${savePath}/trivy`); + }, 300000); + + test('with invalid download URL', async () => { + const downloadUrl = 'https://github.com/this_is_invalid'; + await expect(downloader.downloadTrivyCmd(downloadUrl)).rejects.toThrow(); + }); +}); + +describe('Trivy command', () => { + beforeAll(() => { + fs.writeFileSync('./trivy', ''); + }); + + afterAll(() => { + removeTrivyCmd('.'); + }); + + test('exists', () => { + const result = downloader.trivyExists('.'); + expect(result).toBeTruthy(); + }); + + test('does not exist', () => { + const result = downloader.trivyExists('src'); + expect(result).toBeFalsy(); + }); +}); diff --git a/__tests__/helper.ts b/__tests__/helper.ts new file mode 100644 index 0000000..89061f2 --- /dev/null +++ b/__tests__/helper.ts @@ -0,0 +1,11 @@ +import * as fs from 'fs'; +import { Downloader } from '../src/downloader'; + +const downloader = new Downloader(); + +export function removeTrivyCmd(path: string) { + path = path.replace(/\/trivy$/, ''); + if (downloader.trivyExists(path)) { + fs.unlinkSync(`${path}/trivy`); + } +} diff --git a/__tests__/trivy.test.ts b/__tests__/trivy.test.ts index 56af097..08a9476 100644 --- a/__tests__/trivy.test.ts +++ b/__tests__/trivy.test.ts @@ -1,98 +1,15 @@ -import { Downloader, Trivy } from '../src/trivy'; -import { unlinkSync, writeFileSync } from 'fs'; +import * as fs from 'fs'; +import { Downloader } from '../src/downloader'; +import { Trivy } from '../src/trivy'; import { Vulnerability, TrivyOption } from '../src/interface'; +import { removeTrivyCmd } from './helper'; const downloader = new Downloader(); const trivy = new Trivy(); -function removeTrivyCmd(path: string) { - path = path.replace(/\/trivy$/, ''); - if (downloader.trivyExists(path)) { - unlinkSync(`${path}/trivy`); - } -} - -describe('Platform', () => { - test('is Liniux', () => { - const result = downloader['checkPlatform']('linux'); - expect(result).toBe('Linux'); - }); - - test('is Darwin', () => { - const result = downloader['checkPlatform']('darwin'); - expect(result).toBe('macOS'); - }); - - test('is not linux and darwin', () => { - expect(() => { - downloader['checkPlatform']('other'); - }).toThrowError('Sorry, other is not supported.'); - }); -}); - -describe('getDownloadUrl', () => { - test('with latest version and linux', async () => { - const version = 'latest'; - const os = 'Linux'; - const result = await downloader['getDownloadUrl'](version, os); - expect(result).toMatch( - /releases\/download\/v[0-9]+\.[0-9]+\.[0-9]+\/trivy_[0-9]+\.[0-9]+\.[0-9]+_Linux-64bit\.tar\.gz$/ - ); - }); - - test('with 0.2.0 and macOS', async () => { - const version = '0.2.0'; - const os = 'macOS'; - const result = await downloader['getDownloadUrl'](version, os); - expect(result).toMatch( - /releases\/download\/v0\.2\.0\/trivy_0\.2\.0_macOS-64bit\.tar\.gz$/ - ); - }); - - test('with non-supported version', async () => { - const version = 'none'; - const os = 'Linux'; - await expect( - downloader['getDownloadUrl'](version, os) - ).rejects.toThrowError( - 'Cloud not be found a Trivy asset that you specified.' - ); - }); - - test('with non-supported os', async () => { - const version = 'latest'; - const os = 'none'; - await expect( - downloader['getDownloadUrl'](version, os) - ).rejects.toThrowError( - 'Cloud not be found a Trivy asset that you specified.' - ); - }); -}); - -describe('Download trivy command', () => { - afterAll(() => { - removeTrivyCmd('__tests__'); - }); - - test('with valid download URL and save in __tests__', async () => { - let downloadUrl = 'https://github.com/aquasecurity/trivy'; - downloadUrl += '/releases/download/v0.2.1/trivy_0.2.1_Linux-64bit.tar.gz'; - const savePath = './__tests__'; - await expect( - downloader['downloadTrivyCmd'](downloadUrl, savePath) - ).resolves.toEqual(`${savePath}/trivy`); - }, 300000); - - test('with invalid download URL', async () => { - const downloadUrl = 'https://github.com/this_is_invalid'; - await expect(downloader['downloadTrivyCmd'](downloadUrl)).rejects.toThrow(); - }); -}); - describe('Trivy command', () => { beforeAll(() => { - writeFileSync('./trivy', ''); + fs.writeFileSync('./trivy', ''); }); afterAll(() => { @@ -115,9 +32,9 @@ describe('Trivy scan', () => { const image: string = 'alpine:3.10'; beforeAll(async () => { - trivyPath = !downloader.trivyExists('./__tests__') - ? await downloader.download('latest', './__tests__') - : './__tests__/trivy'; + trivyPath = !downloader.trivyExists(__dirname) + ? await downloader.download('latest', __dirname) + : `${__dirname}/trivy`; }, 300000); afterAll(() => { diff --git a/src/downloader.ts b/src/downloader.ts new file mode 100644 index 0000000..3664bd6 --- /dev/null +++ b/src/downloader.ts @@ -0,0 +1,116 @@ +import fs from 'fs'; +import zlib from 'zlib'; +import tar from 'tar'; +import * as core from '@actions/core'; +import { Octokit } from '@octokit/rest'; +import fetch, { Response } from 'node-fetch'; + +export class Downloader { + readonly trivyRepo = { + owner: 'aquasecurity', + repo: 'trivy', + }; + + async download( + version: string, + trivyCmdDir: string = __dirname + ): Promise { + const os = this.checkPlatform(process.platform); + const downloadUrl = await this.getDownloadUrl(version, os); + console.debug(`Download URL: ${downloadUrl}`); + const trivyCmdBaseDir = process.env.GITHUB_WORKSPACE || trivyCmdDir; + const trivyCmdPath = await this.downloadTrivyCmd( + downloadUrl, + trivyCmdBaseDir + ); + console.debug(`Trivy Command Path: ${trivyCmdPath}`); + return trivyCmdPath; + } + + checkPlatform(platform: string): string { + switch (platform) { + case 'linux': + return 'Linux'; + case 'darwin': + return 'macOS'; + default: + const errorMsg = `Sorry, ${platform} is not supported. + Trivy support Linux, MacOS, FreeBSD and OpenBSD.`; + throw new Error(errorMsg); + } + } + + async getDownloadUrl(version: string, os: string): Promise { + try { + const response = await this.getAssets(version); + const filename = `trivy_${response.version}_${os}-64bit.tar.gz`; + for (const asset of response.assets) { + if (asset.name === filename) { + return asset.browser_download_url; + } + } + throw new Error(`${filename} does not include in GitHub releases`); + } catch (err) { + core.error(err.message); + + const errMsg = `Could not find Trivy asset that you specified. + Version: ${version} + OS: ${os} + `; + throw new Error(errMsg); + } + } + + async getAssets( + version: string + ): Promise<{ + assets: any; + version: string; + }> { + let response; + const client = new Octokit(); + + if (version === 'latest') { + response = await client.repos.getLatestRelease({ ...this.trivyRepo }); + version = response.data.tag_name.replace(/v/, ''); + } else { + response = await client.repos.getReleaseByTag({ + ...this.trivyRepo, + tag: `v${version}`, + }); + } + + return { assets: response.data.assets, version }; + } + + async downloadTrivyCmd( + downloadUrl: string, + savedPath: string = '.' + ): Promise { + const response: Response = await fetch(downloadUrl); + + return new Promise((resolve, reject) => { + const gunzip = zlib.createGunzip(); + const extract = tar.extract({ C: savedPath }, ['trivy']); + response.body + .on('error', reject) + .pipe(gunzip) + .on('error', reject) + .pipe(extract) + .on('error', reject) + .on('finish', () => { + if (!this.trivyExists(savedPath)) { + reject('Failed to extract Trivy command file.'); + } + resolve(`${savedPath}/trivy`); + }); + }); + } + + trivyExists(targetDir: string): boolean { + const trivyCmdPaths: string[] = fs + .readdirSync(targetDir) + .filter(f => f === 'trivy'); + return trivyCmdPaths.length === 1; + } +} diff --git a/src/github.ts b/src/github.ts new file mode 100644 index 0000000..e35a465 --- /dev/null +++ b/src/github.ts @@ -0,0 +1,64 @@ +import * as core from '@actions/core'; +import * as github from '@actions/github'; +import { Octokit } from '@octokit/rest'; +import { IssueOption, IssueResponse } from './interface'; + +export class GitHub { + client: Octokit; + + constructor(token: string) { + this.client = new Octokit({ auth: token }); + } + + async getTrivyIssues(image: string, labels: string[] | undefined) { + if (labels == null) { + return []; + } + + let { data: trivyIssues } = await this.client.issues.listForRepo({ + ...github.context.repo, + state: 'open', + labels: labels.join(','), + }); + + return trivyIssues.filter(issue => issue.body.includes(image)); + } + + async createIssue(options: IssueOption): Promise { + const { data: issue } = await this.client.issues.create({ + ...github.context.repo, + ...options, + }); + return { issueNumber: issue.number, htmlUrl: issue.html_url }; + } + + async updateIssue(issueNumber: number, options: IssueOption): Promise { + await this.client.issues.update({ + ...github.context.repo, + issue_number: issueNumber, + body: options.body, + }); + } + + async createOrUpdateIssue( + image: string, + options: IssueOption + ): Promise { + const trivyIssues = await this.getTrivyIssues(image, options.labels); + + if (trivyIssues.length > 0) { + core.info('Found existing issue. Updating existing issue.'); + + const existingIssue = trivyIssues[0]; + await this.updateIssue(existingIssue.number, options); + return { + issueNumber: existingIssue.number, + htmlUrl: existingIssue.html_url, + }; + } else { + core.info('Create new issue'); + + return await this.createIssue(options); + } + } +} diff --git a/src/index.ts b/src/index.ts index ad46d9a..41b9e43 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,85 +1,67 @@ import * as core from '@actions/core'; -import { Trivy, Downloader } from './trivy'; -import { createOrUpdateIssue } from './issue'; -import { - TrivyOption, - IssueOption, - IssueResponse, - Vulnerability, -} from './interface'; +import { Downloader } from './downloader'; +import { GitHub } from './github'; +import { Trivy } from './trivy'; +import { TrivyOption, IssueOption, Vulnerability } from './interface'; async function run() { - try { - const trivyVersion: string = core - .getInput('trivy_version') - .replace(/^v/, ''); - const image: string | undefined = - core.getInput('image') || process.env.IMAGE_NAME; - const issueFlag: boolean = core.getInput('issue').toLowerCase() == 'true'; + const trivyVersion = core.getInput('trivy_version').replace(/^v/, ''); + const image = core.getInput('image') || process.env.IMAGE_NAME; + const issueFlag = core.getInput('issue').toLowerCase() == 'true'; - if (image === undefined || image === '') { - throw new Error('Please specify scan target image name'); - } + if (!image) { + throw new Error('Please specify scan target image name'); + } - const trivyOption: TrivyOption = { - severity: core.getInput('severity').replace(/\s+/g, ''), - vulnType: core.getInput('vuln_type').replace(/\s+/g, ''), - ignoreUnfixed: core.getInput('ignore_unfixed').toLowerCase() === 'true', - format: issueFlag ? 'json' : 'table', - }; + const trivyOption: TrivyOption = { + severity: core.getInput('severity').replace(/\s+/g, ''), + vulnType: core.getInput('vuln_type').replace(/\s+/g, ''), + ignoreUnfixed: core.getInput('ignore_unfixed').toLowerCase() === 'true', + format: issueFlag ? 'json' : 'table', + }; - const downloader = new Downloader(); - const trivyCmdPath: string = await downloader.download(trivyVersion); + const downloader = new Downloader(); + const trivyCmdPath = await downloader.download(trivyVersion); - const trivy = new Trivy(); - const result: Vulnerability[] | string = trivy.scan( - trivyCmdPath, - image, - trivyOption - ); + const trivy = new Trivy(); + const result = trivy.scan(trivyCmdPath, image, trivyOption); - if (!issueFlag) { - core.info( - `Not create a issue because issue parameter is false. - Vulnerabilities: - ${result}` - ); - return; - } + if (!issueFlag) { + core.info(`Not create a issue because issue parameter is false. + Vulnerabilities: ${result}`); + return; + } - const issueContent: string = trivy.parse(image, result as Vulnerability[]); + const issueContent = trivy.parse(image, result as Vulnerability[]); + if (issueContent === '') { + core.info( + 'Vulnerabilities were not found.\nYour maintenance looks good 👍' + ); + return; + } - if (issueContent === '') { - core.info( - 'Vulnerabilities were not found.\nYour maintenance looks good 👍' - ); - return; - } + const issueOption = { + title: core.getInput('issue_title'), + body: issueContent, + labels: core + .getInput('issue_label') + .replace(/\s+/g, '') + .split(','), + assignees: core + .getInput('issue_assignee') + .replace(/\s+/g, '') + .split(','), + }; + const token = core.getInput('token', { required: true }); + const github = new GitHub(token); + const output = await github.createOrUpdateIssue(image, issueOption); - const issueOption: IssueOption = { - title: core.getInput('issue_title'), - body: issueContent, - labels: core - .getInput('issue_label') - .replace(/\s+/g, '') - .split(','), - assignees: core - .getInput('issue_assignee') - .replace(/\s+/g, '') - .split(','), - }; - const token: string = core.getInput('token', { required: true }); - const output: IssueResponse = await createOrUpdateIssue(token, image, issueOption); - core.setOutput('html_url', output.htmlUrl); - core.setOutput('issue_number', output.issueNumber.toString()); + core.setOutput('html_url', output.htmlUrl); + core.setOutput('issue_number', output.issueNumber.toString()); - if (core.getInput("fail_on_vulnerabilities") === 'true') { - core.setFailed(`Vulnerabilities found.\n${issueContent}`) - } - } catch (error) { - core.error(error.stack); - core.setFailed(error.message); + if (core.getInput('fail_on_vulnerabilities') === 'true') { + throw new Error(`Vulnerabilities found.\n${issueContent}`); } } -run(); +run().catch(err => core.setFailed(err.message)); diff --git a/src/issue.ts b/src/issue.ts deleted file mode 100644 index 641b8c6..0000000 --- a/src/issue.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { Octokit } from '@octokit/rest'; -import * as core from '@actions/core'; -import * as github from '@actions/github'; -import { IssueOption, IssueResponse } from './interface'; - -async function getTrivyIssues(client: Octokit, image: string, labels: string[] | undefined) { - if (labels == null) { - return [] - } - - let { - data: trivyIssues, - } = await client.issues.listForRepo( - { ...github.context.repo, state: "open", labels: labels.join(",") } - ); - - return trivyIssues.filter(issue => issue.body.includes(image)) -} - -async function createIssue( - client: Octokit, - options: IssueOption -): Promise { - const { - data: issue, - }: Octokit.Response = await client.issues.create( - { - ...github.context.repo, - ...options, - } - ); - return issue -} - -async function updateIssue( - issueNumber: number, - client: Octokit, - options: IssueOption -): Promise { - await client.issues.update( - { - ...github.context.repo, - issue_number: issueNumber, - body: options.body - } - ); -} - -export async function createOrUpdateIssue( - token: string, - image: string, - options: IssueOption -): Promise { - const client: Octokit = new Octokit({ auth: token }); - - const trivyIssues = await getTrivyIssues(client, image, options.labels) - - if (trivyIssues.length > 0) { - core.info("Found existing issue. Updating existing issue.") - - const existingIssue = trivyIssues[0] - await updateIssue(existingIssue.number, client, options) - return { - issueNumber: existingIssue.number, - htmlUrl: existingIssue.html_url, - } - } else { - core.info("Create new issue") - - const newIssue = await createIssue(client, options) - return { - issueNumber: newIssue.number, - htmlUrl: newIssue.html_url, - } - } -} diff --git a/src/trivy.ts b/src/trivy.ts index 4514c62..7eb6fa3 100644 --- a/src/trivy.ts +++ b/src/trivy.ts @@ -1,128 +1,7 @@ -import fs from 'fs'; -import zlib from 'zlib'; -import tar from 'tar'; -import { Octokit } from '@octokit/rest'; -import fetch, { Response } from 'node-fetch'; import { spawnSync, SpawnSyncReturns } from 'child_process'; - import { TrivyOption, Vulnerability } from './interface'; import { isIterable } from './utils'; -export class Downloader { - githubClient: Octokit; - - static readonly trivyRepository = { - owner: 'aquasecurity', - repo: 'trivy', - }; - - constructor() { - this.githubClient = new Octokit(); - } - - public async download( - version: string, - trivyCmdDir: string = __dirname - ): Promise { - const os: string = this.checkPlatform(process.platform); - const downloadUrl: string = await this.getDownloadUrl(version, os); - console.debug(`Download URL: ${downloadUrl}`); - const trivyCmdBaseDir: string = process.env.GITHUB_WORKSPACE || trivyCmdDir; - const trivyCmdPath: string = await this.downloadTrivyCmd( - downloadUrl, - trivyCmdBaseDir - ); - console.debug(`Trivy Command Path: ${trivyCmdPath}`); - return trivyCmdPath; - } - - private checkPlatform(platform: string): string { - switch (platform) { - case 'linux': - return 'Linux'; - case 'darwin': - return 'macOS'; - default: - const errorMsg: string = `Sorry, ${platform} is not supported. - Trivy support Linux, MacOS, FreeBSD and OpenBSD.`; - throw new Error(errorMsg); - } - } - - private async getDownloadUrl(version: string, os: string): Promise { - try { - const response = await this.getAssets(version); - const filename: string = `trivy_${response.version}_${os}-64bit.tar.gz`; - for (const asset of response.assets) { - if (asset.name === filename) { - return asset.browser_download_url; - } - } - throw new Error(); - } catch (error) { - const errorMsg: string = ` - Cloud not be found a Trivy asset that you specified. - Version: ${version} - OS: ${os} - `; - throw new Error(errorMsg); - } - } - - private async getAssets( - version: string - ): Promise<{ - assets: Octokit.ReposGetLatestReleaseResponseAssetsItem[]; - version: string; - }> { - let response: Octokit.Response; - - if (version === 'latest') { - response = await this.githubClient.repos.getLatestRelease({ - ...Downloader.trivyRepository, - }); - version = response.data.tag_name.replace(/v/, ''); - } else { - response = await this.githubClient.repos.getReleaseByTag({ - ...Downloader.trivyRepository, - tag: `v${version}`, - }); - } - return { assets: response.data.assets, version }; - } - - private async downloadTrivyCmd( - downloadUrl: string, - savedPath: string = '.' - ): Promise { - const response: Response = await fetch(downloadUrl); - - return new Promise((resolve, reject) => { - const gunzip = zlib.createGunzip(); - const extract = tar.extract({ C: savedPath }, ['trivy']); - response.body - .on('error', reject) - .pipe(gunzip) - .on('error', reject) - .pipe(extract) - .on('error', reject) - .on('finish', () => { - if (!this.trivyExists(savedPath)) { - reject('Failed to extract Trivy command file.'); - } - resolve(`${savedPath}/trivy`); - }); - }); - } - - public trivyExists(targetDir: string): boolean { - const trivyCmdPaths: string[] = fs - .readdirSync(targetDir) - .filter(f => f === 'trivy'); - return trivyCmdPaths.length === 1; - } -} - export class Trivy { public scan( trivyPath: string, From f73382eaf581643e2f1bcb1996bad19c05d8ec22 Mon Sep 17 00:00:00 2001 From: homoluctus Date: Fri, 4 Jun 2021 00:53:38 +0900 Subject: [PATCH 22/46] chore(tsconfig): Add __tests__/helper.ts --- tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tsconfig.json b/tsconfig.json index 960dc9f..e728077 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -59,5 +59,5 @@ // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ }, - "exclude": ["node_modules", "**/*.test.ts"] + "exclude": ["node_modules", "**/*.test.ts", "__tests__/helper.ts"] } From 3d8c771bed93f45643109289d1854f4769675b53 Mon Sep 17 00:00:00 2001 From: homoluctus Date: Fri, 4 Jun 2021 00:58:57 +0900 Subject: [PATCH 23/46] test: Fix expected value in release asset url --- __tests__/downloader.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/__tests__/downloader.test.ts b/__tests__/downloader.test.ts index 416b0bb..c7c8a8e 100644 --- a/__tests__/downloader.test.ts +++ b/__tests__/downloader.test.ts @@ -37,7 +37,7 @@ describe('getDownloadUrl', () => { const os = 'macOS'; const result = await downloader.getDownloadUrl(version, os); expect(result).toMatch( - /releases\/download\/v0\.2\.0\/trivy_0\.2\.0_macOS-64bit\.tar\.gz$/ + /releases\/download\/v0\.18\.3\/trivy_0\.18\.3_macOS-64bit\.tar\.gz$/ ); }); From f99f703abea204f8e572192dacb6164e6ca04e98 Mon Sep 17 00:00:00 2001 From: homoluctus Date: Fri, 4 Jun 2021 01:11:20 +0900 Subject: [PATCH 24/46] fix(github): Consider that GitHub Issue body is undefined --- src/github.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/github.ts b/src/github.ts index e35a465..c537f74 100644 --- a/src/github.ts +++ b/src/github.ts @@ -21,7 +21,9 @@ export class GitHub { labels: labels.join(','), }); - return trivyIssues.filter(issue => issue.body.includes(image)); + return trivyIssues.filter( + issue => issue.body && issue.body.includes(image) + ); } async createIssue(options: IssueOption): Promise { From d2beb368df9fd836abd047ca9d6df83a2ef7fff6 Mon Sep 17 00:00:00 2001 From: homoluctus Date: Fri, 4 Jun 2021 01:24:52 +0900 Subject: [PATCH 25/46] ci: Create pull request after transpile --- .github/workflows/build.yaml | 7 +++++-- .github/workflows/integration-test.yml | 7 +++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 7e3309e..976d986 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -27,10 +27,13 @@ jobs: - name: Transpile run: yarn run build - - name: Push changes + - name: Commit run: | git config user.name "${GITHUB_ACTOR}" git config user.email "${GITHUB_ACTOR}@users.noreply.github.com" git add . git commit -m "build: Transpile" || echo "No changes to commit" - git push origin HEAD \ No newline at end of file + + - uses: peter-evans/create-pull-request@v3 + with: + title: 'Transpile' diff --git a/.github/workflows/integration-test.yml b/.github/workflows/integration-test.yml index 9874717..f5674a4 100644 --- a/.github/workflows/integration-test.yml +++ b/.github/workflows/integration-test.yml @@ -1,10 +1,9 @@ name: Integration Test on: - workflow_run: - workflows: ["Build"] - types: - - completed + pull_request: + paths: + - "dist" env: IMAGE_NAME: knqyf263/vuln-image From 3beb88d503d33cba875f99daca0a853b2d4926a1 Mon Sep 17 00:00:00 2001 From: homoluctus Date: Fri, 4 Jun 2021 02:42:27 +0900 Subject: [PATCH 26/46] chore(prettier): trailingComma is none --- .prettierrc.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.prettierrc.yml b/.prettierrc.yml index cd617f9..785d76b 100644 --- a/.prettierrc.yml +++ b/.prettierrc.yml @@ -1,5 +1,5 @@ semi: true singleQuote: true -trailingComma: es5 +trailingComma: none parser": typescript bracketSpacing: true \ No newline at end of file From 5e2b7342e6b3ba6d8695cbaf697eedb164b8f86c Mon Sep 17 00:00:00 2001 From: homoluctus Date: Fri, 4 Jun 2021 02:43:47 +0900 Subject: [PATCH 27/46] chore: Add trivy template --- src/template/default.tpl | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/template/default.tpl diff --git a/src/template/default.tpl b/src/template/default.tpl new file mode 100644 index 0000000..38ac5c9 --- /dev/null +++ b/src/template/default.tpl @@ -0,0 +1,32 @@ +

{{- escapeXML ( index . 0 ).Target }} - Trivy Report - {{ getCurrentTime }}

+ +{{- range . }} + + {{- if (eq (len .Vulnerabilities) 0) }} + + {{- else }} + + + + + + + + + {{- range .Vulnerabilities }} + + + + + + + + + {{- end }} + {{- end }} +{{- end }} +
{{ escapeXML .Type }}
No Vulnerabilities found
PackageVulnerability IDSeverityInstalled VersionFixed VersionLinks
{{ escapeXML .PkgName }}{{ escapeXML .VulnerabilityID }}{{ escapeXML .Vulnerability.Severity }}{{ escapeXML .InstalledVersion }}{{ escapeXML .FixedVersion }}
\ No newline at end of file From 325d3db31cfe7b87cc51759978351822c97242b8 Mon Sep 17 00:00:00 2001 From: homoluctus Date: Fri, 4 Jun 2021 02:44:19 +0900 Subject: [PATCH 28/46] feat: Support trivy template option --- src/index.ts | 29 +++------ src/interface.ts | 18 +----- src/trivy.ts | 158 +++++++++++++++++++---------------------------- src/utils.ts | 3 - 4 files changed, 73 insertions(+), 135 deletions(-) delete mode 100644 src/utils.ts diff --git a/src/index.ts b/src/index.ts index 41b9e43..ad372a9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,13 +1,12 @@ import * as core from '@actions/core'; import { Downloader } from './downloader'; import { GitHub } from './github'; -import { Trivy } from './trivy'; -import { TrivyOption, IssueOption, Vulnerability } from './interface'; +import { scan } from './trivy'; +import { TrivyOption } from './interface'; -async function run() { +async function run(): Promise { const trivyVersion = core.getInput('trivy_version').replace(/^v/, ''); const image = core.getInput('image') || process.env.IMAGE_NAME; - const issueFlag = core.getInput('issue').toLowerCase() == 'true'; if (!image) { throw new Error('Please specify scan target image name'); @@ -17,32 +16,20 @@ async function run() { severity: core.getInput('severity').replace(/\s+/g, ''), vulnType: core.getInput('vuln_type').replace(/\s+/g, ''), ignoreUnfixed: core.getInput('ignore_unfixed').toLowerCase() === 'true', - format: issueFlag ? 'json' : 'table', + template: core.getInput('template') || `${__dirname}/template/default.tpl`, }; const downloader = new Downloader(); const trivyCmdPath = await downloader.download(trivyVersion); + const result = scan(trivyCmdPath, image, trivyOption); - const trivy = new Trivy(); - const result = trivy.scan(trivyCmdPath, image, trivyOption); - - if (!issueFlag) { - core.info(`Not create a issue because issue parameter is false. - Vulnerabilities: ${result}`); - return; - } - - const issueContent = trivy.parse(image, result as Vulnerability[]); - if (issueContent === '') { - core.info( - 'Vulnerabilities were not found.\nYour maintenance looks good 👍' - ); + if (!result) { return; } const issueOption = { title: core.getInput('issue_title'), - body: issueContent, + body: result, labels: core .getInput('issue_label') .replace(/\s+/g, '') @@ -60,7 +47,7 @@ async function run() { core.setOutput('issue_number', output.issueNumber.toString()); if (core.getInput('fail_on_vulnerabilities') === 'true') { - throw new Error(`Vulnerabilities found.\n${issueContent}`); + throw new Error('Abnormal termination because vulnerabilities found'); } } diff --git a/src/interface.ts b/src/interface.ts index 267bbf8..86c359b 100644 --- a/src/interface.ts +++ b/src/interface.ts @@ -14,21 +14,5 @@ export interface TrivyOption { severity: string; vulnType: string; ignoreUnfixed: boolean; - format: string; -} - -export interface Vulnerability { - Target: string; - Vulnerabilities: CVE[] | null; -} - -interface CVE { - VulnerabilityID: string; - PkgName: string; - InstalledVersion: string; - FixedVersion: string; - Title?: string; - Description: string; - Severity: string; - References: string[]; + template: string; } diff --git a/src/trivy.ts b/src/trivy.ts index 7eb6fa3..389b72e 100644 --- a/src/trivy.ts +++ b/src/trivy.ts @@ -1,105 +1,75 @@ -import { spawnSync, SpawnSyncReturns } from 'child_process'; -import { TrivyOption, Vulnerability } from './interface'; -import { isIterable } from './utils'; - -export class Trivy { - public scan( - trivyPath: string, - image: string, - option: TrivyOption - ): Vulnerability[] | string { - this.validateOption(option); - - const args: string[] = [ - '--severity', - option.severity, - '--vuln-type', - option.vulnType, - '--format', - option.format, - '--quiet', - '--no-progress', - ]; - - if (option.ignoreUnfixed) args.push('--ignore-unfixed'); - args.push(image); - - const result: SpawnSyncReturns = spawnSync(trivyPath, args, { - encoding: 'utf-8', - }); - - if (result.stdout && result.stdout.length > 0) { - const vulnerabilities: Vulnerability[] | string = - option.format === 'json' ? JSON.parse(result.stdout) : result.stdout; - if (vulnerabilities.length > 0) { - return vulnerabilities; +import { spawnSync } from 'child_process'; +import * as core from '@actions/core'; +import { TrivyOption } from './interface'; + +export function scan( + trivyPath: string, + image: string, + option: TrivyOption +): string | undefined { + validateOption(option); + + const args = [ + '--severity', + option.severity, + '--vuln-type', + option.vulnType, + '--format', + 'template', + '--template', + option.template, + '--quiet', + '--no-progress', + '--exit-code', + '255' + ]; + + if (option.ignoreUnfixed) args.push('--ignore-unfixed'); + args.push(image); + + const result = spawnSync(trivyPath, args, { encoding: 'utf-8' }); + switch (result.status) { + case 0: + core.info(`Vulnerabilities were not found. + Your maintenance looks good 👍`); + case 255: + if (result.stdout && result.stdout.length > 0) { + core.info('Vulnerabilities found !!!'); + return result.stdout; } - } - - throw new Error(`Failed vulnerability scan using Trivy. + default: + throw new Error(`Failed to execute Trivy command. + exit code: ${result.status} stdout: ${result.stdout} - stderr: ${result.stderr} - error: ${result.error} - `); - } - - public parse(image: string, vulnerabilities: Vulnerability[]): string { - let issueContent: string = ''; - - for (const vuln of vulnerabilities) { - if (vuln.Vulnerabilities === null) continue; - - issueContent += `## ${vuln.Target}\n`; - let vulnTable: string = '|Title|Severity|CVE|Package Name|'; - vulnTable += 'Installed Version|Fixed Version|References|\n'; - vulnTable += '|:--:|:--:|:--:|:--:|:--:|:--:|:--|\n'; - - for (const cve of vuln.Vulnerabilities) { - vulnTable += `|${cve.Title || 'N/A'}|${cve.Severity || 'N/A'}`; - vulnTable += `|${cve.VulnerabilityID || 'N/A'}|${cve.PkgName || 'N/A'}`; - vulnTable += `|${cve.InstalledVersion || 'N/A'}|${cve.FixedVersion || - 'N/A'}|`; - - const references = cve.References; - if (!isIterable(references)) continue; - for (const reference of references) { - vulnTable += `${reference || 'N/A'}
`; - } - - vulnTable.replace(/
$/, '|\n'); - } - issueContent += `${vulnTable}\n\n`; - } - - return issueContent ? `_(image scanned: \`${image}\`)_\n\n${issueContent}` : issueContent; + stderr: ${result.stderr}`); } +} - private validateOption(option: TrivyOption): void { - this.validateSeverity(option.severity.split(',')); - this.validateVulnType(option.vulnType.split(',')); - } +function validateOption(option: TrivyOption): void { + validateSeverity(option.severity.split(',')); + validateVulnType(option.vulnType.split(',')); +} - private validateSeverity(severities: string[]): boolean { - const allowedSeverities = /UNKNOWN|LOW|MEDIUM|HIGH|CRITICAL/; - if (!validateArrayOption(allowedSeverities, severities)) { - throw new Error( - `Trivy option error: ${severities.join(',')} is unknown severity. - Trivy supports UNKNOWN, LOW, MEDIUM, HIGH and CRITICAL.` - ); - } - return true; +function validateSeverity(severities: string[]): boolean { + const allowedSeverities = /UNKNOWN|LOW|MEDIUM|HIGH|CRITICAL/; + if (!validateArrayOption(allowedSeverities, severities)) { + throw new Error( + `Trivy option error: ${severities.join(',')} is unknown severity. + Trivy supports UNKNOWN, LOW, MEDIUM, HIGH and CRITICAL.` + ); } + return true; +} - private validateVulnType(vulnTypes: string[]): boolean { - const allowedVulnTypes = /os|library/; - if (!validateArrayOption(allowedVulnTypes, vulnTypes)) { - throw new Error( - `Trivy option error: ${vulnTypes.join(',')} is unknown vuln-type. - Trivy supports os and library.` - ); - } - return true; +function validateVulnType(vulnTypes: string[]): boolean { + const allowedVulnTypes = /os|library/; + if (!validateArrayOption(allowedVulnTypes, vulnTypes)) { + throw new Error( + `Trivy option error: ${vulnTypes.join(',')} is unknown vuln-type. + Trivy supports os and library.` + ); } + return true; } function validateArrayOption(allowedValue: RegExp, options: string[]): boolean { diff --git a/src/utils.ts b/src/utils.ts deleted file mode 100644 index 924c442..0000000 --- a/src/utils.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function isIterable(obj: Object): Boolean { - return obj != null && typeof obj[Symbol.iterator] === 'function'; -} From 0d9e3c8f037b5664124a540e42a6975b6c31deac Mon Sep 17 00:00:00 2001 From: homoluctus Date: Fri, 4 Jun 2021 02:44:44 +0900 Subject: [PATCH 29/46] test: Modify to support trivy template option --- __tests__/downloader.test.ts | 20 ++++ __tests__/trivy.test.ts | 201 +++-------------------------------- __tests__/utils.test.ts | 12 --- 3 files changed, 33 insertions(+), 200 deletions(-) delete mode 100644 __tests__/utils.test.ts diff --git a/__tests__/downloader.test.ts b/__tests__/downloader.test.ts index c7c8a8e..a55030e 100644 --- a/__tests__/downloader.test.ts +++ b/__tests__/downloader.test.ts @@ -97,3 +97,23 @@ describe('Trivy command', () => { expect(result).toBeFalsy(); }); }); + +describe('Exists trivy command', () => { + beforeAll(() => { + fs.writeFileSync('./trivy', ''); + }); + + afterAll(() => { + removeTrivyCmd('.'); + }); + + test('exists', () => { + const result = downloader.trivyExists('.'); + expect(result).toBeTruthy(); + }); + + test('does not exist', () => { + const result = downloader.trivyExists('src'); + expect(result).toBeFalsy(); + }); +}); diff --git a/__tests__/trivy.test.ts b/__tests__/trivy.test.ts index 08a9476..d482725 100644 --- a/__tests__/trivy.test.ts +++ b/__tests__/trivy.test.ts @@ -1,35 +1,15 @@ -import * as fs from 'fs'; +import * as path from 'path'; import { Downloader } from '../src/downloader'; -import { Trivy } from '../src/trivy'; -import { Vulnerability, TrivyOption } from '../src/interface'; +import { scan } from '../src/trivy'; +import { TrivyOption } from '../src/interface'; import { removeTrivyCmd } from './helper'; const downloader = new Downloader(); -const trivy = new Trivy(); - -describe('Trivy command', () => { - beforeAll(() => { - fs.writeFileSync('./trivy', ''); - }); - - afterAll(() => { - removeTrivyCmd('.'); - }); - - test('exists', () => { - const result = downloader.trivyExists('.'); - expect(result).toBeTruthy(); - }); - - test('does not exist', () => { - const result = downloader.trivyExists('src'); - expect(result).toBeFalsy(); - }); -}); +const template = path.join(__dirname, '../src/template/default.tpl'); describe('Trivy scan', () => { let trivyPath: string; - const image: string = 'alpine:3.10'; + const image = 'knqyf263/vuln-image'; beforeAll(async () => { trivyPath = !downloader.trivyExists(__dirname) @@ -46,15 +26,10 @@ describe('Trivy scan', () => { severity: 'HIGH,CRITICAL', vulnType: 'os,library', ignoreUnfixed: true, - format: 'json', + template }; - const result: Vulnerability[] | string = trivy.scan( - trivyPath, - image, - option - ); + const result = scan(trivyPath, image, option) as string; expect(result.length).toBeGreaterThanOrEqual(1); - expect(result).toBeInstanceOf(Object); }); test('without ignoreUnfixed', () => { @@ -62,31 +37,10 @@ describe('Trivy scan', () => { severity: 'HIGH,CRITICAL', vulnType: 'os,library', ignoreUnfixed: false, - format: 'json', + template }; - const result: Vulnerability[] | string = trivy.scan( - trivyPath, - image, - option - ); + const result: string = scan(trivyPath, image, option) as string; expect(result.length).toBeGreaterThanOrEqual(1); - expect(result).toBeInstanceOf(Object); - }); - - test('with table format', () => { - const option: TrivyOption = { - severity: 'HIGH,CRITICAL', - vulnType: 'os,library', - ignoreUnfixed: false, - format: 'table', - }; - const result: Vulnerability[] | string = trivy.scan( - trivyPath, - image, - option - ); - expect(result.length).toBeGreaterThanOrEqual(1); - expect(result).toMatch(/alpine:3\.10/); }); test('with invalid severity', () => { @@ -94,10 +48,10 @@ describe('Trivy scan', () => { severity: 'INVALID', vulnType: 'os,library', ignoreUnfixed: true, - format: 'json', + template }; expect(() => { - trivy.scan(trivyPath, image, invalidOption); + scan(trivyPath, image, invalidOption); }).toThrowError('Trivy option error: INVALID is unknown severity'); }); @@ -106,139 +60,10 @@ describe('Trivy scan', () => { severity: 'HIGH', vulnType: 'INVALID', ignoreUnfixed: true, - format: 'json', + template }; expect(() => { - trivy.scan(trivyPath, image, invalidOption); + scan(trivyPath, image, invalidOption); }).toThrowError('Trivy option error: INVALID is unknown vuln-type'); }); }); - -describe('Parse', () => { - const image: string = 'alpine:3.10'; - - test('the result without vulnerabilities', () => { - const vulnerabilities: Vulnerability[] = [ - { - Target: 'alpine:3.10 (alpine 3.10.3)', - Vulnerabilities: null, - }, - ]; - const result = trivy.parse(image, vulnerabilities); - expect(result).toBe(''); - }); - - test('the result including vulnerabilities', () => { - const vulnerabilities: Vulnerability[] = [ - { - Target: 'alpine:3.9 (alpine 3.9.4)', - Vulnerabilities: [ - { - VulnerabilityID: 'CVE-2019-14697', - PkgName: 'musl', - InstalledVersion: '1.1.20-r4', - FixedVersion: '1.1.20-r5', - Description: - "musl libc through 1.1.23 has an x87 floating-point stack adjustment imbalance, related to the math/i386/ directory. In some cases, use of this library could introduce out-of-bounds writes that are not present in an application's source code.", - Severity: 'HIGH', - References: [ - 'http://www.openwall.com/lists/oss-security/2019/08/06/4', - 'https://www.openwall.com/lists/musl/2019/08/06/1', - ], - }, - { - VulnerabilityID: 'CVE-2019-1549', - PkgName: 'openssl', - InstalledVersion: '1.1.1b-r1', - FixedVersion: '1.1.1d-r0', - Title: 'openssl: information disclosure in fork()', - Description: - 'OpenSSL 1.1.1 introduced a rewritten random number generator (RNG). This was intended to include protection in the event of a fork() system call in order to ensure that the parent and child processes did not share the same RNG state. However this protection was not being used in the default case. A partial mitigation for this issue is that the output from a high precision timer is mixed into the RNG state so the likelihood of a parent and child process sharing state is significantly reduced. If an application already calls OPENSSL_init_crypto() explicitly using OPENSSL_INIT_ATFORK then this problem does not occur at all. Fixed in OpenSSL 1.1.1d (Affected 1.1.1-1.1.1c).', - Severity: 'MEDIUM', - References: [ - 'https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-1549', - 'https://git.openssl.org/gitweb/?p=openssl.git;a=commitdiff;h=1b0fe00e2704b5e20334a16d3c9099d1ba2ef1be', - 'https://lists.fedoraproject.org/archives/list/package-announce@lists.fedoraproject.org/message/GY6SNRJP2S7Y42GIIDO3HXPNMDYN2U3A/', - 'https://security.netapp.com/advisory/ntap-20190919-0002/', - 'https://support.f5.com/csp/article/K44070243', - 'https://www.openssl.org/news/secadv/20190910.txt', - ], - }, - ], - }, - ]; - const result = trivy.parse(image, vulnerabilities); - expect(result).toMatch( - /\|Title\|Severity\|CVE\|Package Name\|Installed Version\|Fixed Version\|References\|/ - ); - expect(result).toContain(image); - }); -}); - -describe('Validate trivy option', () => { - test('with a valid severity', () => { - const options: string[] = ['HIGH']; - const result = trivy['validateSeverity'](options); - expect(result).toBeTruthy(); - }); - - test('with two valid severities', () => { - const options: string[] = ['HIGH', 'CRITICAL']; - const result = trivy['validateSeverity'](options); - expect(result).toBeTruthy(); - }); - - test('with an invalid severity', () => { - const options: string[] = ['INVALID']; - expect(() => { - trivy['validateSeverity'](options); - }).toThrowError('Trivy option error: INVALID is unknown severity'); - }); - - test('with two invalid severities', () => { - const options: string[] = ['INVALID', 'ERROR']; - expect(() => { - trivy['validateSeverity'](options); - }).toThrowError('Trivy option error: INVALID,ERROR is unknown severity'); - }); - - test('with an invalid and a valid severities', () => { - const options: string[] = ['INVALID', 'HIGH']; - expect(() => { - trivy['validateSeverity'](options); - }).toThrowError('Trivy option error: INVALID,HIGH is unknown severity'); - }); - - test('with a valid vuln-type', () => { - const options: string[] = ['os']; - const result = trivy['validateVulnType'](options); - expect(result).toBeTruthy(); - }); - - test('with two valid vuln-types', () => { - const options: string[] = ['os', 'library']; - const result = trivy['validateVulnType'](options); - expect(result).toBeTruthy(); - }); - - test('with an invalid vuln-type', () => { - const options: string[] = ['INVALID']; - expect(() => { - trivy['validateVulnType'](options); - }).toThrowError('Trivy option error: INVALID is unknown vuln-type'); - }); - - test('with two invalid vuln-types', () => { - const options: string[] = ['INVALID', 'ERROR']; - expect(() => { - trivy['validateVulnType'](options); - }).toThrowError('Trivy option error: INVALID,ERROR is unknown vuln-type'); - }); - - test('with a valid and an invalid vuln-types', () => { - const options: string[] = ['INVALID', 'os']; - expect(() => { - trivy['validateVulnType'](options); - }).toThrowError('Trivy option error: INVALID,os is unknown vuln-type'); - }); -}); diff --git a/__tests__/utils.test.ts b/__tests__/utils.test.ts deleted file mode 100644 index e74a0c0..0000000 --- a/__tests__/utils.test.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { isIterable } from '../src/utils'; - -describe('isIterable', () => { - test.each([ - ['test', true], - [[], true], - [['this', 'is', 'test'], true], - [{ id: 'test' }, false], - ])('input %s', (obj, expected) => { - expect(isIterable(obj)).toBe(expected); - }); -}); From 63e138ac2d55d550fd934c76843472d496f9300e Mon Sep 17 00:00:00 2001 From: homoluctus Date: Fri, 4 Jun 2021 02:45:24 +0900 Subject: [PATCH 30/46] chore: Modify action metadata to support template option --- README.md | 14 ++++++-------- action.yml | 9 ++++----- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 949e031..ffd3df1 100644 --- a/README.md +++ b/README.md @@ -11,9 +11,7 @@ If vulnerabilities are found by Trivy, it creates the following GitHub Issue. ![image](./assets/img/issue.png) -## Usage - -### Inputs +## Inputs |Parameter|Required|Default Value|Description| |:--:|:--:|:--:|:--| @@ -22,21 +20,21 @@ If vulnerabilities are found by Trivy, it creates the following GitHub Issue. |severity|False|HIGH,CRITICAL|Severities of vulnerabilities (separated by commma)| |vuln_type|False|os,library|Scan target are os and / or library (separated by commma)| |ignore_unfixed|False|false|Ignore unfixed vulnerabilities
Please specify `true` or `false`| -|issue|False|true|Decide whether creating issue when vulnerabilities are found by trivy.
Please specify `true` or `false`| -|token|True if issue parameter is true else False|N/A|GitHub Access Token.
${{ secrets.GITHUB_TOKEN }} is recommended.| +|template|False|N/A|Trivy --template option
By default, it uses src/template/default.tpl which is based on [contrib/html.tpl](https://github.com/aquasecurity/trivy/blob/main/contrib/html.tpl)
reference: [Report Formats - Trivy](https://aquasecurity.github.io/trivy/v0.18.3/examples/report/#template)| +|token|True|N/A|GitHub Access Token.
${{ secrets.GITHUB_TOKEN }} is recommended.| |issue_title|False|Security Alert|Issue title| |issue_label|False|trivy,vulnerability|Issue label (separated by commma)| |issue_assignee|False|N/A|Issue assignee (separated by commma)| |fail_on_vulnerabilities|False|false|Whether the action should fail if any vulnerabilities were found.| -### Outputs +## Outputs |Parameter|Description| |:--:|:--| |html_url|The URL to view the issue| |issue_number|The created issue number| -## Example Workflow +## Example Detect your docker image vulnerability everyday at 9:00 (UTC). @@ -55,7 +53,7 @@ jobs: - name: Pull docker image run: docker pull sample - - uses: lazy-actions/gitrivy@main + - uses: lazy-actions/gitrivy@v2 with: token: ${{ secrets.GITHUB_TOKEN }} image: sample diff --git a/action.yml b/action.yml index 50904bc..9aadc2f 100644 --- a/action.yml +++ b/action.yml @@ -21,13 +21,12 @@ inputs: description: 'Ignore unfixed vulnerabilities [true, false]' default: 'false' required: false - issue: - description: 'Decide whether to create a issue when vulnerabilities are found [true, false]' - default: 'true' - required: false + template: + description: 'Trivy --template option' + required: false token: description: 'GitHub access token used to create a issue' - required: false + required: true issue_title: description: 'Issue title' default: 'Security Alert' From e3231be7af7db8ec7564d4460fd428c2d1a0b90a Mon Sep 17 00:00:00 2001 From: homoluctus Date: Thu, 3 Jun 2021 17:54:46 +0000 Subject: [PATCH 31/46] build: Transpile --- dist/default.tpl | 32 + dist/index.js | 37285 +++++++++++++-------------------------------- 2 files changed, 10273 insertions(+), 27044 deletions(-) create mode 100644 dist/default.tpl diff --git a/dist/default.tpl b/dist/default.tpl new file mode 100644 index 0000000..38ac5c9 --- /dev/null +++ b/dist/default.tpl @@ -0,0 +1,32 @@ +

{{- escapeXML ( index . 0 ).Target }} - Trivy Report - {{ getCurrentTime }}

+ +{{- range . }} + + {{- if (eq (len .Vulnerabilities) 0) }} + + {{- else }} + + + + + + + + + {{- range .Vulnerabilities }} + + + + + + + + + {{- end }} + {{- end }} +{{- end }} +
{{ escapeXML .Type }}
No Vulnerabilities found
PackageVulnerability IDSeverityInstalled VersionFixed VersionLinks
{{ escapeXML .PkgName }}{{ escapeXML .VulnerabilityID }}{{ escapeXML .Vulnerability.Severity }}{{ escapeXML .InstalledVersion }}{{ escapeXML .FixedVersion }}
\ No newline at end of file diff --git a/dist/index.js b/dist/index.js index d56c8d6..dec3c7f 100644 --- a/dist/index.js +++ b/dist/index.js @@ -43,207 +43,48 @@ module.exports = /************************************************************************/ /******/ ({ -/***/ 0: -/***/ (function(module, __unusedexports, __webpack_require__) { - -const { requestLog } = __webpack_require__(916); -const { - restEndpointMethods -} = __webpack_require__(842); - -const Core = __webpack_require__(529); - -const CORE_PLUGINS = [ - __webpack_require__(190), - __webpack_require__(19), // deprecated: remove in v17 - requestLog, - __webpack_require__(148), - restEndpointMethods, - __webpack_require__(430), - - __webpack_require__(850) // deprecated: remove in v17 -]; - -const OctokitRest = Core.plugin(CORE_PLUGINS); - -function DeprecatedOctokit(options) { - const warn = - options && options.log && options.log.warn - ? options.log.warn - : console.warn; - warn( - '[@octokit/rest] `const Octokit = require("@octokit/rest")` is deprecated. Use `const { Octokit } = require("@octokit/rest")` instead' - ); - return new OctokitRest(options); -} - -const Octokit = Object.assign(DeprecatedOctokit, { - Octokit: OctokitRest -}); - -Object.keys(OctokitRest).forEach(key => { - /* istanbul ignore else */ - if (OctokitRest.hasOwnProperty(key)) { - Octokit[key] = OctokitRest[key]; - } -}); - -module.exports = Octokit; - - -/***/ }), - -/***/ 2: -/***/ (function(module, __unusedexports, __webpack_require__) { +/***/ 3: +/***/ (function(__unusedmodule, exports) { "use strict"; -const os = __webpack_require__(87); -const macosRelease = __webpack_require__(118); -const winRelease = __webpack_require__(49); - -const osName = (platform, release) => { - if (!platform && release) { - throw new Error('You can\'t specify a `release` without specifying `platform`'); - } - - platform = platform || os.platform(); - - let id; - - if (platform === 'darwin') { - if (!release && os.platform() === 'darwin') { - release = os.release(); - } - - const prefix = release ? (Number(release.split('.')[0]) > 15 ? 'macOS' : 'OS X') : 'macOS'; - id = release ? macosRelease(release).name : ''; - return prefix + (id ? ' ' + id : ''); - } - - if (platform === 'linux') { - if (!release && os.platform() === 'linux') { - release = os.release(); - } - - id = release ? release.replace(/^(\d+\.\d+).*/, '$1') : ''; - return 'Linux' + (id ? ' ' + id : ''); - } - - if (platform === 'win32') { - if (!release && os.platform() === 'win32') { - release = os.release(); - } - - id = release ? winRelease(release) : ''; - return 'Windows' + (id ? ' ' + id : ''); - } - - return platform; -}; - -module.exports = osName; - - -/***/ }), - -/***/ 9: -/***/ (function(module, __unusedexports, __webpack_require__) { - -var once = __webpack_require__(969); - -var noop = function() {}; - -var isRequest = function(stream) { - return stream.setHeader && typeof stream.abort === 'function'; -}; - -var isChildProcess = function(stream) { - return stream.stdio && Array.isArray(stream.stdio) && stream.stdio.length === 3 -}; - -var eos = function(stream, opts, callback) { - if (typeof opts === 'function') return eos(stream, null, opts); - if (!opts) opts = {}; - - callback = once(callback || noop); - - var ws = stream._writableState; - var rs = stream._readableState; - var readable = opts.readable || (opts.readable !== false && stream.readable); - var writable = opts.writable || (opts.writable !== false && stream.writable); - var cancelled = false; - - var onlegacyfinish = function() { - if (!stream.writable) onfinish(); - }; - var onfinish = function() { - writable = false; - if (!readable) callback.call(stream); - }; +Object.defineProperty(exports, '__esModule', { value: true }); - var onend = function() { - readable = false; - if (!writable) callback.call(stream); - }; +/*! + * is-plain-object + * + * Copyright (c) 2014-2017, Jon Schlinkert. + * Released under the MIT License. + */ - var onexit = function(exitCode) { - callback.call(stream, exitCode ? new Error('exited with error code: ' + exitCode) : null); - }; +function isObject(o) { + return Object.prototype.toString.call(o) === '[object Object]'; +} - var onerror = function(err) { - callback.call(stream, err); - }; +function isPlainObject(o) { + var ctor,prot; - var onclose = function() { - process.nextTick(onclosenexttick); - }; + if (isObject(o) === false) return false; - var onclosenexttick = function() { - if (cancelled) return; - if (readable && !(rs && (rs.ended && !rs.destroyed))) return callback.call(stream, new Error('premature close')); - if (writable && !(ws && (ws.ended && !ws.destroyed))) return callback.call(stream, new Error('premature close')); - }; + // If has modified constructor + ctor = o.constructor; + if (ctor === undefined) return true; - var onrequest = function() { - stream.req.on('finish', onfinish); - }; + // If has modified prototype + prot = ctor.prototype; + if (isObject(prot) === false) return false; - if (isRequest(stream)) { - stream.on('complete', onfinish); - stream.on('abort', onclose); - if (stream.req) onrequest(); - else stream.on('request', onrequest); - } else if (writable && !ws) { // legacy streams - stream.on('end', onlegacyfinish); - stream.on('close', onlegacyfinish); - } + // If constructor does not have an Object-specific method + if (prot.hasOwnProperty('isPrototypeOf') === false) { + return false; + } - if (isChildProcess(stream)) stream.on('exit', onexit); - - stream.on('end', onend); - stream.on('finish', onfinish); - if (opts.error !== false) stream.on('error', onerror); - stream.on('close', onclose); - - return function() { - cancelled = true; - stream.removeListener('complete', onfinish); - stream.removeListener('abort', onclose); - stream.removeListener('request', onrequest); - if (stream.req) stream.req.removeListener('finish', onfinish); - stream.removeListener('end', onlegacyfinish); - stream.removeListener('close', onlegacyfinish); - stream.removeListener('finish', onfinish); - stream.removeListener('exit', onexit); - stream.removeListener('end', onend); - stream.removeListener('error', onerror); - stream.removeListener('close', onclose); - }; -}; + // Most likely a plain Object + return true; +} -module.exports = eos; +exports.isPlainObject = isPlainObject; /***/ }), @@ -288,25 +129,10 @@ function wrappy (fn, cb) { /***/ }), -/***/ 13: +/***/ 16: /***/ (function(module) { -module.exports = getPageLinks - -function getPageLinks (link) { - link = link.link || link.headers.link || '' - - const links = {} - - // link format: - // '; rel="next", ; rel="last"' - link.replace(/<([^>]*)>;\s*rel="([\w]*)"/g, (m, uri, type) => { - links[type] = uri - }) - - return links -} - +module.exports = require("tls"); /***/ }), @@ -318,179 +144,53 @@ eval("require")("encoding"); /***/ }), -/***/ 19: +/***/ 49: /***/ (function(module, __unusedexports, __webpack_require__) { -module.exports = authenticationPlugin; - -const { Deprecation } = __webpack_require__(692); -const once = __webpack_require__(969); +var wrappy = __webpack_require__(11) +module.exports = wrappy(once) +module.exports.strict = wrappy(onceStrict) -const deprecateAuthenticate = once((log, deprecation) => log.warn(deprecation)); +once.proto = once(function () { + Object.defineProperty(Function.prototype, 'once', { + value: function () { + return once(this) + }, + configurable: true + }) -const authenticate = __webpack_require__(674); -const beforeRequest = __webpack_require__(471); -const requestError = __webpack_require__(349); + Object.defineProperty(Function.prototype, 'onceStrict', { + value: function () { + return onceStrict(this) + }, + configurable: true + }) +}) -function authenticationPlugin(octokit, options) { - if (options.auth) { - octokit.authenticate = () => { - deprecateAuthenticate( - octokit.log, - new Deprecation( - '[@octokit/rest] octokit.authenticate() is deprecated and has no effect when "auth" option is set on Octokit constructor' - ) - ); - }; - return; +function once (fn) { + var f = function () { + if (f.called) return f.value + f.called = true + return f.value = fn.apply(this, arguments) } - const state = { - octokit, - auth: false - }; - octokit.authenticate = authenticate.bind(null, state); - octokit.hook.before("request", beforeRequest.bind(null, state)); - octokit.hook.error("request", requestError.bind(null, state)); -} - - -/***/ }), - -/***/ 20: -/***/ (function(module, __unusedexports, __webpack_require__) { - -"use strict"; - - -const cp = __webpack_require__(129); -const parse = __webpack_require__(568); -const enoent = __webpack_require__(881); - -function spawn(command, args, options) { - // Parse the arguments - const parsed = parse(command, args, options); - - // Spawn the child process - const spawned = cp.spawn(parsed.command, parsed.args, parsed.options); - - // Hook into child process "exit" event to emit an error if the command - // does not exists, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16 - enoent.hookChildProcess(spawned, parsed); - - return spawned; -} - -function spawnSync(command, args, options) { - // Parse the arguments - const parsed = parse(command, args, options); - - // Spawn the child process - const result = cp.spawnSync(parsed.command, parsed.args, parsed.options); - - // Analyze if the command does not exist, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16 - result.error = result.error || enoent.verifyENOENTSync(result.status, parsed); - - return result; + f.called = false + return f } -module.exports = spawn; -module.exports.spawn = spawn; -module.exports.sync = spawnSync; - -module.exports._parse = parse; -module.exports._enoent = enoent; - - -/***/ }), - -/***/ 39: -/***/ (function(module) { - -"use strict"; - -module.exports = opts => { - opts = opts || {}; - - const env = opts.env || process.env; - const platform = opts.platform || process.platform; - - if (platform !== 'win32') { - return 'PATH'; - } - - return Object.keys(env).find(x => x.toUpperCase() === 'PATH') || 'Path'; -}; - - -/***/ }), - -/***/ 47: -/***/ (function(module, __unusedexports, __webpack_require__) { - -module.exports = factory; - -const Octokit = __webpack_require__(402); -const registerPlugin = __webpack_require__(855); - -function factory(plugins) { - const Api = Octokit.bind(null, plugins || []); - Api.plugin = registerPlugin.bind(null, plugins || []); - return Api; +function onceStrict (fn) { + var f = function () { + if (f.called) + throw new Error(f.onceError) + f.called = true + return f.value = fn.apply(this, arguments) + } + var name = fn.name || 'Function wrapped with `once`' + f.onceError = name + " shouldn't be called more than once" + f.called = false + return f } -/***/ }), - -/***/ 49: -/***/ (function(module, __unusedexports, __webpack_require__) { - -"use strict"; - -const os = __webpack_require__(87); -const execa = __webpack_require__(955); - -// Reference: https://www.gaijin.at/en/lstwinver.php -const names = new Map([ - ['10.0', '10'], - ['6.3', '8.1'], - ['6.2', '8'], - ['6.1', '7'], - ['6.0', 'Vista'], - ['5.2', 'Server 2003'], - ['5.1', 'XP'], - ['5.0', '2000'], - ['4.9', 'ME'], - ['4.1', '98'], - ['4.0', '95'] -]); - -const windowsRelease = release => { - const version = /\d+\.\d/.exec(release || os.release()); - - if (release && !version) { - throw new Error('`release` argument doesn\'t match `n.n`'); - } - - const ver = (version || [])[0]; - - // Server 2008, 2012 and 2016 versions are ambiguous with desktop versions and must be detected at runtime. - // If `release` is omitted or we're on a Windows system, and the version number is an ambiguous version - // then use `wmic` to get the OS caption: https://msdn.microsoft.com/en-us/library/aa394531(v=vs.85).aspx - // If the resulting caption contains the year 2008, 2012 or 2016, it is a server version, so return a server OS name. - if ((!release || release === os.release()) && ['6.1', '6.2', '6.3', '10.0'].includes(ver)) { - const stdout = execa.sync('wmic', ['os', 'get', 'Caption']).stdout || ''; - const year = (stdout.match(/2008|2012|2016/) || [])[0]; - if (year) { - return `Server ${year}`; - } - } - - return names.get(ver); -}; - -module.exports = windowsRelease; - - /***/ }), /***/ 60: @@ -1301,6 +1001,33 @@ Unpack.Sync = UnpackSync module.exports = Unpack +/***/ }), + +/***/ 82: +/***/ (function(__unusedmodule, exports) { + +"use strict"; + +// We use any as a valid input type +/* eslint-disable @typescript-eslint/no-explicit-any */ +Object.defineProperty(exports, "__esModule", { value: true }); +exports.toCommandValue = void 0; +/** + * Sanitizes an input into a string so it can be passed into issueCommand safely + * @param input input to sanitize into a string + */ +function toCommandValue(input) { + if (input === null || input === undefined) { + return ''; + } + else if (typeof input === 'string' || input instanceof String) { + return input; + } + return JSON.stringify(input); +} +exports.toCommandValue = toCommandValue; +//# sourceMappingURL=utils.js.map + /***/ }), /***/ 87: @@ -1310,1462 +1037,825 @@ module.exports = require("os"); /***/ }), -/***/ 118: -/***/ (function(module, __unusedexports, __webpack_require__) { +/***/ 102: +/***/ (function(__unusedmodule, exports, __webpack_require__) { "use strict"; -const os = __webpack_require__(87); - -const nameMap = new Map([ - [19, 'Catalina'], - [18, 'Mojave'], - [17, 'High Sierra'], - [16, 'Sierra'], - [15, 'El Capitan'], - [14, 'Yosemite'], - [13, 'Mavericks'], - [12, 'Mountain Lion'], - [11, 'Lion'], - [10, 'Snow Leopard'], - [9, 'Leopard'], - [8, 'Tiger'], - [7, 'Panther'], - [6, 'Jaguar'], - [5, 'Puma'] -]); - -const macosRelease = release => { - release = Number((release || os.release()).split('.')[0]); - return { - name: nameMap.get(release), - version: '10.' + (release - 4) - }; +// For internal use, subject to change. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; }; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.issueCommand = void 0; +// We use any as a valid input type +/* eslint-disable @typescript-eslint/no-explicit-any */ +const fs = __importStar(__webpack_require__(747)); +const os = __importStar(__webpack_require__(87)); +const utils_1 = __webpack_require__(82); +function issueCommand(command, message) { + const filePath = process.env[`GITHUB_${command}`]; + if (!filePath) { + throw new Error(`Unable to find environment variable for file command ${command}`); + } + if (!fs.existsSync(filePath)) { + throw new Error(`Missing file at path: ${filePath}`); + } + fs.appendFileSync(filePath, `${utils_1.toCommandValue(message)}${os.EOL}`, { + encoding: 'utf8' + }); +} +exports.issueCommand = issueCommand; +//# sourceMappingURL=file-command.js.map -module.exports = macosRelease; -// TODO: remove this in the next major version -module.exports.default = macosRelease; +/***/ }), +/***/ 127: +/***/ (function(__unusedmodule, exports, __webpack_require__) { -/***/ }), +"use strict"; -/***/ 126: -/***/ (function(module) { +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getApiBaseUrl = exports.getProxyAgent = exports.getAuthString = void 0; +const httpClient = __importStar(__webpack_require__(539)); +function getAuthString(token, options) { + if (!token && !options.auth) { + throw new Error('Parameter token or opts.auth is required'); + } + else if (token && options.auth) { + throw new Error('Parameters token and opts.auth may not both be specified'); + } + return typeof options.auth === 'string' ? options.auth : `token ${token}`; +} +exports.getAuthString = getAuthString; +function getProxyAgent(destinationUrl) { + const hc = new httpClient.HttpClient(); + return hc.getAgent(destinationUrl); +} +exports.getProxyAgent = getProxyAgent; +function getApiBaseUrl() { + return process.env['GITHUB_API_URL'] || 'https://api.github.com'; +} +exports.getApiBaseUrl = getApiBaseUrl; +//# sourceMappingURL=utils.js.map -/** - * lodash (Custom Build) - * Build: `lodash modularize exports="npm" -o ./` - * Copyright jQuery Foundation and other contributors - * Released under MIT license - * Based on Underscore.js 1.8.3 - * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors - */ +/***/ }), -/** Used as the size to enable large array optimizations. */ -var LARGE_ARRAY_SIZE = 200; +/***/ 129: +/***/ (function(module) { -/** Used to stand-in for `undefined` hash values. */ -var HASH_UNDEFINED = '__lodash_hash_undefined__'; +module.exports = require("child_process"); -/** Used as references for various `Number` constants. */ -var INFINITY = 1 / 0; +/***/ }), -/** `Object#toString` result references. */ -var funcTag = '[object Function]', - genTag = '[object GeneratorFunction]'; +/***/ 133: +/***/ (function(__unusedmodule, exports, __webpack_require__) { -/** - * Used to match `RegExp` - * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). - */ -var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; +"use strict"; -/** Used to detect host constructors (Safari). */ -var reIsHostCtor = /^\[object .+?Constructor\]$/; -/** Detect free variable `global` from Node.js. */ -var freeGlobal = typeof global == 'object' && global && global.Object === Object && global; +const assert = __webpack_require__(357) +const Buffer = __webpack_require__(293).Buffer +const realZlib = __webpack_require__(761) -/** Detect free variable `self`. */ -var freeSelf = typeof self == 'object' && self && self.Object === Object && self; +const constants = exports.constants = __webpack_require__(60) +const Minipass = __webpack_require__(720) -/** Used as a reference to the global object. */ -var root = freeGlobal || freeSelf || Function('return this')(); +const OriginalBufferConcat = Buffer.concat -/** - * A specialized version of `_.includes` for arrays without support for - * specifying an index to search from. - * - * @private - * @param {Array} [array] The array to inspect. - * @param {*} target The value to search for. - * @returns {boolean} Returns `true` if `target` is found, else `false`. - */ -function arrayIncludes(array, value) { - var length = array ? array.length : 0; - return !!length && baseIndexOf(array, value, 0) > -1; -} +const _superWrite = Symbol('_superWrite') +class ZlibError extends Error { + constructor (err) { + super('zlib: ' + err.message) + this.code = err.code + this.errno = err.errno + /* istanbul ignore if */ + if (!this.code) + this.code = 'ZLIB_ERROR' -/** - * This function is like `arrayIncludes` except that it accepts a comparator. - * - * @private - * @param {Array} [array] The array to inspect. - * @param {*} target The value to search for. - * @param {Function} comparator The comparator invoked per element. - * @returns {boolean} Returns `true` if `target` is found, else `false`. - */ -function arrayIncludesWith(array, value, comparator) { - var index = -1, - length = array ? array.length : 0; + this.message = 'zlib: ' + err.message + Error.captureStackTrace(this, this.constructor) + } - while (++index < length) { - if (comparator(value, array[index])) { - return true; - } + get name () { + return 'ZlibError' } - return false; } -/** - * The base implementation of `_.findIndex` and `_.findLastIndex` without - * support for iteratee shorthands. - * - * @private - * @param {Array} array The array to inspect. - * @param {Function} predicate The function invoked per iteration. - * @param {number} fromIndex The index to search from. - * @param {boolean} [fromRight] Specify iterating from right to left. - * @returns {number} Returns the index of the matched value, else `-1`. - */ -function baseFindIndex(array, predicate, fromIndex, fromRight) { - var length = array.length, - index = fromIndex + (fromRight ? 1 : -1); +// the Zlib class they all inherit from +// This thing manages the queue of requests, and returns +// true or false if there is anything in the queue when +// you call the .write() method. +const _opts = Symbol('opts') +const _flushFlag = Symbol('flushFlag') +const _finishFlushFlag = Symbol('finishFlushFlag') +const _fullFlushFlag = Symbol('fullFlushFlag') +const _handle = Symbol('handle') +const _onError = Symbol('onError') +const _sawError = Symbol('sawError') +const _level = Symbol('level') +const _strategy = Symbol('strategy') +const _ended = Symbol('ended') +const _defaultFullFlush = Symbol('_defaultFullFlush') - while ((fromRight ? index-- : ++index < length)) { - if (predicate(array[index], index, array)) { - return index; - } - } - return -1; -} +class ZlibBase extends Minipass { + constructor (opts, mode) { + if (!opts || typeof opts !== 'object') + throw new TypeError('invalid options for ZlibBase constructor') -/** - * The base implementation of `_.indexOf` without `fromIndex` bounds checks. - * - * @private - * @param {Array} array The array to inspect. - * @param {*} value The value to search for. - * @param {number} fromIndex The index to search from. - * @returns {number} Returns the index of the matched value, else `-1`. - */ -function baseIndexOf(array, value, fromIndex) { - if (value !== value) { - return baseFindIndex(array, baseIsNaN, fromIndex); - } - var index = fromIndex - 1, - length = array.length; + super(opts) + this[_sawError] = false + this[_ended] = false + this[_opts] = opts - while (++index < length) { - if (array[index] === value) { - return index; + this[_flushFlag] = opts.flush + this[_finishFlushFlag] = opts.finishFlush + // this will throw if any options are invalid for the class selected + try { + this[_handle] = new realZlib[mode](opts) + } catch (er) { + // make sure that all errors get decorated properly + throw new ZlibError(er) } - } - return -1; -} -/** - * The base implementation of `_.isNaN` without support for number objects. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`. - */ -function baseIsNaN(value) { - return value !== value; -} + this[_onError] = (err) => { + // no sense raising multiple errors, since we abort on the first one. + if (this[_sawError]) + return -/** - * Checks if a cache value for `key` exists. - * - * @private - * @param {Object} cache The cache to query. - * @param {string} key The key of the entry to check. - * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. - */ -function cacheHas(cache, key) { - return cache.has(key); -} + this[_sawError] = true -/** - * Gets the value at `key` of `object`. - * - * @private - * @param {Object} [object] The object to query. - * @param {string} key The key of the property to get. - * @returns {*} Returns the property value. - */ -function getValue(object, key) { - return object == null ? undefined : object[key]; -} + // there is no way to cleanly recover. + // continuing only obscures problems. + this.close() + this.emit('error', err) + } -/** - * Checks if `value` is a host object in IE < 9. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a host object, else `false`. - */ -function isHostObject(value) { - // Many host objects are `Object` objects that can coerce to strings - // despite having improperly defined `toString` methods. - var result = false; - if (value != null && typeof value.toString != 'function') { - try { - result = !!(value + ''); - } catch (e) {} + this[_handle].on('error', er => this[_onError](new ZlibError(er))) + this.once('end', () => this.close) } - return result; -} -/** - * Converts `set` to an array of its values. - * - * @private - * @param {Object} set The set to convert. - * @returns {Array} Returns the values. - */ -function setToArray(set) { - var index = -1, - result = Array(set.size); + close () { + if (this[_handle]) { + this[_handle].close() + this[_handle] = null + this.emit('close') + } + } - set.forEach(function(value) { - result[++index] = value; - }); - return result; -} + reset () { + if (!this[_sawError]) { + assert(this[_handle], 'zlib binding closed') + return this[_handle].reset() + } + } -/** Used for built-in method references. */ -var arrayProto = Array.prototype, - funcProto = Function.prototype, - objectProto = Object.prototype; + flush (flushFlag) { + if (this.ended) + return -/** Used to detect overreaching core-js shims. */ -var coreJsData = root['__core-js_shared__']; + if (typeof flushFlag !== 'number') + flushFlag = this[_fullFlushFlag] + this.write(Object.assign(Buffer.alloc(0), { [_flushFlag]: flushFlag })) + } -/** Used to detect methods masquerading as native. */ -var maskSrcKey = (function() { - var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ''); - return uid ? ('Symbol(src)_1.' + uid) : ''; -}()); + end (chunk, encoding, cb) { + if (chunk) + this.write(chunk, encoding) + this.flush(this[_finishFlushFlag]) + this[_ended] = true + return super.end(null, null, cb) + } -/** Used to resolve the decompiled source of functions. */ -var funcToString = funcProto.toString; + get ended () { + return this[_ended] + } -/** Used to check objects for own properties. */ -var hasOwnProperty = objectProto.hasOwnProperty; + write (chunk, encoding, cb) { + // process the chunk using the sync process + // then super.write() all the outputted chunks + if (typeof encoding === 'function') + cb = encoding, encoding = 'utf8' -/** - * Used to resolve the - * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) - * of values. - */ -var objectToString = objectProto.toString; + if (typeof chunk === 'string') + chunk = Buffer.from(chunk, encoding) -/** Used to detect if a method is native. */ -var reIsNative = RegExp('^' + - funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&') - .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' -); + if (this[_sawError]) + return + assert(this[_handle], 'zlib binding closed') -/** Built-in value references. */ -var splice = arrayProto.splice; + // _processChunk tries to .close() the native handle after it's done, so we + // intercept that by temporarily making it a no-op. + const nativeHandle = this[_handle]._handle + const originalNativeClose = nativeHandle.close + nativeHandle.close = () => {} + const originalClose = this[_handle].close + this[_handle].close = () => {} + // It also calls `Buffer.concat()` at the end, which may be convenient + // for some, but which we are not interested in as it slows us down. + Buffer.concat = (args) => args + let result + try { + const flushFlag = typeof chunk[_flushFlag] === 'number' + ? chunk[_flushFlag] : this[_flushFlag] + result = this[_handle]._processChunk(chunk, flushFlag) + // if we don't throw, reset it back how it was + Buffer.concat = OriginalBufferConcat + } catch (err) { + // or if we do, put Buffer.concat() back before we emit error + // Error events call into user code, which may call Buffer.concat() + Buffer.concat = OriginalBufferConcat + this[_onError](new ZlibError(err)) + } finally { + if (this[_handle]) { + // Core zlib resets `_handle` to null after attempting to close the + // native handle. Our no-op handler prevented actual closure, but we + // need to restore the `._handle` property. + this[_handle]._handle = nativeHandle + nativeHandle.close = originalNativeClose + this[_handle].close = originalClose + // `_processChunk()` adds an 'error' listener. If we don't remove it + // after each call, these handlers start piling up. + this[_handle].removeAllListeners('error') + // make sure OUR error listener is still attached tho + } + } -/* Built-in method references that are verified to be native. */ -var Map = getNative(root, 'Map'), - Set = getNative(root, 'Set'), - nativeCreate = getNative(Object, 'create'); + if (this[_handle]) + this[_handle].on('error', er => this[_onError](new ZlibError(er))) -/** - * Creates a hash object. - * - * @private - * @constructor - * @param {Array} [entries] The key-value pairs to cache. - */ -function Hash(entries) { - var index = -1, - length = entries ? entries.length : 0; + let writeReturn + if (result) { + if (Array.isArray(result) && result.length > 0) { + // The first buffer is always `handle._outBuffer`, which would be + // re-used for later invocations; so, we always have to copy that one. + writeReturn = this[_superWrite](Buffer.from(result[0])) + for (let i = 1; i < result.length; i++) { + writeReturn = this[_superWrite](result[i]) + } + } else { + writeReturn = this[_superWrite](Buffer.from(result)) + } + } - this.clear(); - while (++index < length) { - var entry = entries[index]; - this.set(entry[0], entry[1]); + if (cb) + cb() + return writeReturn } -} - -/** - * Removes all key-value entries from the hash. - * - * @private - * @name clear - * @memberOf Hash - */ -function hashClear() { - this.__data__ = nativeCreate ? nativeCreate(null) : {}; -} -/** - * Removes `key` and its value from the hash. - * - * @private - * @name delete - * @memberOf Hash - * @param {Object} hash The hash to modify. - * @param {string} key The key of the value to remove. - * @returns {boolean} Returns `true` if the entry was removed, else `false`. - */ -function hashDelete(key) { - return this.has(key) && delete this.__data__[key]; -} - -/** - * Gets the hash value for `key`. - * - * @private - * @name get - * @memberOf Hash - * @param {string} key The key of the value to get. - * @returns {*} Returns the entry value. - */ -function hashGet(key) { - var data = this.__data__; - if (nativeCreate) { - var result = data[key]; - return result === HASH_UNDEFINED ? undefined : result; + [_superWrite] (data) { + return super.write(data) } - return hasOwnProperty.call(data, key) ? data[key] : undefined; -} - -/** - * Checks if a hash value for `key` exists. - * - * @private - * @name has - * @memberOf Hash - * @param {string} key The key of the entry to check. - * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. - */ -function hashHas(key) { - var data = this.__data__; - return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key); -} - -/** - * Sets the hash `key` to `value`. - * - * @private - * @name set - * @memberOf Hash - * @param {string} key The key of the value to set. - * @param {*} value The value to set. - * @returns {Object} Returns the hash instance. - */ -function hashSet(key, value) { - var data = this.__data__; - data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value; - return this; } -// Add methods to `Hash`. -Hash.prototype.clear = hashClear; -Hash.prototype['delete'] = hashDelete; -Hash.prototype.get = hashGet; -Hash.prototype.has = hashHas; -Hash.prototype.set = hashSet; +class Zlib extends ZlibBase { + constructor (opts, mode) { + opts = opts || {} -/** - * Creates an list cache object. - * - * @private - * @constructor - * @param {Array} [entries] The key-value pairs to cache. - */ -function ListCache(entries) { - var index = -1, - length = entries ? entries.length : 0; + opts.flush = opts.flush || constants.Z_NO_FLUSH + opts.finishFlush = opts.finishFlush || constants.Z_FINISH + super(opts, mode) - this.clear(); - while (++index < length) { - var entry = entries[index]; - this.set(entry[0], entry[1]); + this[_fullFlushFlag] = constants.Z_FULL_FLUSH + this[_level] = opts.level + this[_strategy] = opts.strategy } -} -/** - * Removes all key-value entries from the list cache. - * - * @private - * @name clear - * @memberOf ListCache - */ -function listCacheClear() { - this.__data__ = []; -} + params (level, strategy) { + if (this[_sawError]) + return -/** - * Removes `key` and its value from the list cache. - * - * @private - * @name delete - * @memberOf ListCache - * @param {string} key The key of the value to remove. - * @returns {boolean} Returns `true` if the entry was removed, else `false`. - */ -function listCacheDelete(key) { - var data = this.__data__, - index = assocIndexOf(data, key); + if (!this[_handle]) + throw new Error('cannot switch params when binding is closed') - if (index < 0) { - return false; - } - var lastIndex = data.length - 1; - if (index == lastIndex) { - data.pop(); - } else { - splice.call(data, index, 1); - } - return true; -} + // no way to test this without also not supporting params at all + /* istanbul ignore if */ + if (!this[_handle].params) + throw new Error('not supported in this implementation') -/** - * Gets the list cache value for `key`. - * - * @private - * @name get - * @memberOf ListCache - * @param {string} key The key of the value to get. - * @returns {*} Returns the entry value. - */ -function listCacheGet(key) { - var data = this.__data__, - index = assocIndexOf(data, key); - - return index < 0 ? undefined : data[index][1]; + if (this[_level] !== level || this[_strategy] !== strategy) { + this.flush(constants.Z_SYNC_FLUSH) + assert(this[_handle], 'zlib binding closed') + // .params() calls .flush(), but the latter is always async in the + // core zlib. We override .flush() temporarily to intercept that and + // flush synchronously. + const origFlush = this[_handle].flush + this[_handle].flush = (flushFlag, cb) => { + this.flush(flushFlag) + cb() + } + try { + this[_handle].params(level, strategy) + } finally { + this[_handle].flush = origFlush + } + /* istanbul ignore else */ + if (this[_handle]) { + this[_level] = level + this[_strategy] = strategy + } + } + } } -/** - * Checks if a list cache value for `key` exists. - * - * @private - * @name has - * @memberOf ListCache - * @param {string} key The key of the entry to check. - * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. - */ -function listCacheHas(key) { - return assocIndexOf(this.__data__, key) > -1; +// minimal 2-byte header +class Deflate extends Zlib { + constructor (opts) { + super(opts, 'Deflate') + } } -/** - * Sets the list cache `key` to `value`. - * - * @private - * @name set - * @memberOf ListCache - * @param {string} key The key of the value to set. - * @param {*} value The value to set. - * @returns {Object} Returns the list cache instance. - */ -function listCacheSet(key, value) { - var data = this.__data__, - index = assocIndexOf(data, key); - - if (index < 0) { - data.push([key, value]); - } else { - data[index][1] = value; +class Inflate extends Zlib { + constructor (opts) { + super(opts, 'Inflate') } - return this; } -// Add methods to `ListCache`. -ListCache.prototype.clear = listCacheClear; -ListCache.prototype['delete'] = listCacheDelete; -ListCache.prototype.get = listCacheGet; -ListCache.prototype.has = listCacheHas; -ListCache.prototype.set = listCacheSet; +// gzip - bigger header, same deflate compression +const _portable = Symbol('_portable') +class Gzip extends Zlib { + constructor (opts) { + super(opts, 'Gzip') + this[_portable] = opts && !!opts.portable + } -/** - * Creates a map cache object to store key-value pairs. - * - * @private - * @constructor - * @param {Array} [entries] The key-value pairs to cache. - */ -function MapCache(entries) { - var index = -1, - length = entries ? entries.length : 0; + [_superWrite] (data) { + if (!this[_portable]) + return super[_superWrite](data) - this.clear(); - while (++index < length) { - var entry = entries[index]; - this.set(entry[0], entry[1]); + // we'll always get the header emitted in one first chunk + // overwrite the OS indicator byte with 0xFF + this[_portable] = false + data[9] = 255 + return super[_superWrite](data) } } -/** - * Removes all key-value entries from the map. - * - * @private - * @name clear - * @memberOf MapCache - */ -function mapCacheClear() { - this.__data__ = { - 'hash': new Hash, - 'map': new (Map || ListCache), - 'string': new Hash - }; +class Gunzip extends Zlib { + constructor (opts) { + super(opts, 'Gunzip') + } } -/** - * Removes `key` and its value from the map. - * - * @private - * @name delete - * @memberOf MapCache - * @param {string} key The key of the value to remove. - * @returns {boolean} Returns `true` if the entry was removed, else `false`. - */ -function mapCacheDelete(key) { - return getMapData(this, key)['delete'](key); +// raw - no header +class DeflateRaw extends Zlib { + constructor (opts) { + super(opts, 'DeflateRaw') + } } -/** - * Gets the map value for `key`. - * - * @private - * @name get - * @memberOf MapCache - * @param {string} key The key of the value to get. - * @returns {*} Returns the entry value. - */ -function mapCacheGet(key) { - return getMapData(this, key).get(key); +class InflateRaw extends Zlib { + constructor (opts) { + super(opts, 'InflateRaw') + } } -/** - * Checks if a map value for `key` exists. - * - * @private - * @name has - * @memberOf MapCache - * @param {string} key The key of the entry to check. - * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. - */ -function mapCacheHas(key) { - return getMapData(this, key).has(key); +// auto-detect header. +class Unzip extends Zlib { + constructor (opts) { + super(opts, 'Unzip') + } } -/** - * Sets the map `key` to `value`. - * - * @private - * @name set - * @memberOf MapCache - * @param {string} key The key of the value to set. - * @param {*} value The value to set. - * @returns {Object} Returns the map cache instance. - */ -function mapCacheSet(key, value) { - getMapData(this, key).set(key, value); - return this; -} +class Brotli extends ZlibBase { + constructor (opts, mode) { + opts = opts || {} -// Add methods to `MapCache`. -MapCache.prototype.clear = mapCacheClear; -MapCache.prototype['delete'] = mapCacheDelete; -MapCache.prototype.get = mapCacheGet; -MapCache.prototype.has = mapCacheHas; -MapCache.prototype.set = mapCacheSet; + opts.flush = opts.flush || constants.BROTLI_OPERATION_PROCESS + opts.finishFlush = opts.finishFlush || constants.BROTLI_OPERATION_FINISH -/** - * - * Creates an array cache object to store unique values. - * - * @private - * @constructor - * @param {Array} [values] The values to cache. - */ -function SetCache(values) { - var index = -1, - length = values ? values.length : 0; + super(opts, mode) - this.__data__ = new MapCache; - while (++index < length) { - this.add(values[index]); + this[_fullFlushFlag] = constants.BROTLI_OPERATION_FLUSH } } -/** - * Adds `value` to the array cache. - * - * @private - * @name add - * @memberOf SetCache - * @alias push - * @param {*} value The value to cache. - * @returns {Object} Returns the cache instance. - */ -function setCacheAdd(value) { - this.__data__.set(value, HASH_UNDEFINED); - return this; -} - -/** - * Checks if `value` is in the array cache. - * - * @private - * @name has - * @memberOf SetCache - * @param {*} value The value to search for. - * @returns {number} Returns `true` if `value` is found, else `false`. - */ -function setCacheHas(value) { - return this.__data__.has(value); -} - -// Add methods to `SetCache`. -SetCache.prototype.add = SetCache.prototype.push = setCacheAdd; -SetCache.prototype.has = setCacheHas; - -/** - * Gets the index at which the `key` is found in `array` of key-value pairs. - * - * @private - * @param {Array} array The array to inspect. - * @param {*} key The key to search for. - * @returns {number} Returns the index of the matched value, else `-1`. - */ -function assocIndexOf(array, key) { - var length = array.length; - while (length--) { - if (eq(array[length][0], key)) { - return length; - } +class BrotliCompress extends Brotli { + constructor (opts) { + super(opts, 'BrotliCompress') } - return -1; } -/** - * The base implementation of `_.isNative` without bad shim checks. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a native function, - * else `false`. - */ -function baseIsNative(value) { - if (!isObject(value) || isMasked(value)) { - return false; +class BrotliDecompress extends Brotli { + constructor (opts) { + super(opts, 'BrotliDecompress') } - var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor; - return pattern.test(toSource(value)); } -/** - * The base implementation of `_.uniqBy` without support for iteratee shorthands. - * - * @private - * @param {Array} array The array to inspect. - * @param {Function} [iteratee] The iteratee invoked per element. - * @param {Function} [comparator] The comparator invoked per element. - * @returns {Array} Returns the new duplicate free array. - */ -function baseUniq(array, iteratee, comparator) { - var index = -1, - includes = arrayIncludes, - length = array.length, - isCommon = true, - result = [], - seen = result; - - if (comparator) { - isCommon = false; - includes = arrayIncludesWith; - } - else if (length >= LARGE_ARRAY_SIZE) { - var set = iteratee ? null : createSet(array); - if (set) { - return setToArray(set); - } - isCommon = false; - includes = cacheHas; - seen = new SetCache; - } - else { - seen = iteratee ? [] : result; - } - outer: - while (++index < length) { - var value = array[index], - computed = iteratee ? iteratee(value) : value; - - value = (comparator || value !== 0) ? value : 0; - if (isCommon && computed === computed) { - var seenIndex = seen.length; - while (seenIndex--) { - if (seen[seenIndex] === computed) { - continue outer; - } - } - if (iteratee) { - seen.push(computed); - } - result.push(value); - } - else if (!includes(seen, computed, comparator)) { - if (seen !== result) { - seen.push(computed); - } - result.push(value); +exports.Deflate = Deflate +exports.Inflate = Inflate +exports.Gzip = Gzip +exports.Gunzip = Gunzip +exports.DeflateRaw = DeflateRaw +exports.InflateRaw = InflateRaw +exports.Unzip = Unzip +/* istanbul ignore else */ +if (typeof realZlib.BrotliCompress === 'function') { + exports.BrotliCompress = BrotliCompress + exports.BrotliDecompress = BrotliDecompress +} else { + exports.BrotliCompress = exports.BrotliDecompress = class { + constructor () { + throw new Error('Brotli is not supported in this version of Node.js') } } - return result; } -/** - * Creates a set object of `values`. - * - * @private - * @param {Array} values The values to add to the set. - * @returns {Object} Returns the new set. - */ -var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) { - return new Set(values); -}; -/** - * Gets the data for `map`. - * - * @private - * @param {Object} map The map to query. - * @param {string} key The reference key. - * @returns {*} Returns the map data. - */ -function getMapData(map, key) { - var data = map.__data__; - return isKeyable(key) - ? data[typeof key == 'string' ? 'string' : 'hash'] - : data.map; -} +/***/ }), -/** - * Gets the native function at `key` of `object`. - * - * @private - * @param {Object} object The object to query. - * @param {string} key The key of the method to get. - * @returns {*} Returns the function if it's native, else `undefined`. - */ -function getNative(object, key) { - var value = getValue(object, key); - return baseIsNative(value) ? value : undefined; -} +/***/ 141: +/***/ (function(__unusedmodule, exports, __webpack_require__) { -/** - * Checks if `value` is suitable for use as unique object key. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is suitable, else `false`. - */ -function isKeyable(value) { - var type = typeof value; - return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') - ? (value !== '__proto__') - : (value === null); -} +"use strict"; -/** - * Checks if `func` has its source masked. - * - * @private - * @param {Function} func The function to check. - * @returns {boolean} Returns `true` if `func` is masked, else `false`. - */ -function isMasked(func) { - return !!maskSrcKey && (maskSrcKey in func); -} -/** - * Converts `func` to its source code. - * - * @private - * @param {Function} func The function to process. - * @returns {string} Returns the source code. - */ -function toSource(func) { - if (func != null) { - try { - return funcToString.call(func); - } catch (e) {} - try { - return (func + ''); - } catch (e) {} - } - return ''; -} +var net = __webpack_require__(631); +var tls = __webpack_require__(16); +var http = __webpack_require__(605); +var https = __webpack_require__(211); +var events = __webpack_require__(614); +var assert = __webpack_require__(357); +var util = __webpack_require__(669); -/** - * Creates a duplicate-free version of an array, using - * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) - * for equality comparisons, in which only the first occurrence of each - * element is kept. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Array - * @param {Array} array The array to inspect. - * @returns {Array} Returns the new duplicate free array. - * @example - * - * _.uniq([2, 1, 2]); - * // => [2, 1] - */ -function uniq(array) { - return (array && array.length) - ? baseUniq(array) - : []; -} -/** - * Performs a - * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) - * comparison between two values to determine if they are equivalent. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to compare. - * @param {*} other The other value to compare. - * @returns {boolean} Returns `true` if the values are equivalent, else `false`. - * @example - * - * var object = { 'a': 1 }; - * var other = { 'a': 1 }; - * - * _.eq(object, object); - * // => true - * - * _.eq(object, other); - * // => false - * - * _.eq('a', 'a'); - * // => true - * - * _.eq('a', Object('a')); - * // => false - * - * _.eq(NaN, NaN); - * // => true - */ -function eq(value, other) { - return value === other || (value !== value && other !== other); +exports.httpOverHttp = httpOverHttp; +exports.httpsOverHttp = httpsOverHttp; +exports.httpOverHttps = httpOverHttps; +exports.httpsOverHttps = httpsOverHttps; + + +function httpOverHttp(options) { + var agent = new TunnelingAgent(options); + agent.request = http.request; + return agent; } -/** - * Checks if `value` is classified as a `Function` object. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a function, else `false`. - * @example - * - * _.isFunction(_); - * // => true - * - * _.isFunction(/abc/); - * // => false - */ -function isFunction(value) { - // The use of `Object#toString` avoids issues with the `typeof` operator - // in Safari 8-9 which returns 'object' for typed array and other constructors. - var tag = isObject(value) ? objectToString.call(value) : ''; - return tag == funcTag || tag == genTag; +function httpsOverHttp(options) { + var agent = new TunnelingAgent(options); + agent.request = http.request; + agent.createSocket = createSecureSocket; + agent.defaultPort = 443; + return agent; } -/** - * Checks if `value` is the - * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) - * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an object, else `false`. - * @example - * - * _.isObject({}); - * // => true - * - * _.isObject([1, 2, 3]); - * // => true - * - * _.isObject(_.noop); - * // => true - * - * _.isObject(null); - * // => false - */ -function isObject(value) { - var type = typeof value; - return !!value && (type == 'object' || type == 'function'); +function httpOverHttps(options) { + var agent = new TunnelingAgent(options); + agent.request = https.request; + return agent; } -/** - * This method returns `undefined`. - * - * @static - * @memberOf _ - * @since 2.3.0 - * @category Util - * @example - * - * _.times(2, _.noop); - * // => [undefined, undefined] - */ -function noop() { - // No operation performed. +function httpsOverHttps(options) { + var agent = new TunnelingAgent(options); + agent.request = https.request; + agent.createSocket = createSecureSocket; + agent.defaultPort = 443; + return agent; } -module.exports = uniq; +function TunnelingAgent(options) { + var self = this; + self.options = options || {}; + self.proxyOptions = self.options.proxy || {}; + self.maxSockets = self.options.maxSockets || http.Agent.defaultMaxSockets; + self.requests = []; + self.sockets = []; -/***/ }), + self.on('free', function onFree(socket, host, port, localAddress) { + var options = toOptions(host, port, localAddress); + for (var i = 0, len = self.requests.length; i < len; ++i) { + var pending = self.requests[i]; + if (pending.host === options.host && pending.port === options.port) { + // Detect the request to connect same origin server, + // reuse the connection. + self.requests.splice(i, 1); + pending.request.onSocket(socket); + return; + } + } + socket.destroy(); + self.removeSocket(socket); + }); +} +util.inherits(TunnelingAgent, events.EventEmitter); -/***/ 129: -/***/ (function(module) { +TunnelingAgent.prototype.addRequest = function addRequest(req, host, port, localAddress) { + var self = this; + var options = mergeOptions({request: req}, self.options, toOptions(host, port, localAddress)); -module.exports = require("child_process"); + if (self.sockets.length >= this.maxSockets) { + // We are over limit so we'll add it to the queue. + self.requests.push(options); + return; + } -/***/ }), + // If we are under maxSockets create a new one. + self.createSocket(options, function(socket) { + socket.on('free', onFree); + socket.on('close', onCloseOrRemove); + socket.on('agentRemove', onCloseOrRemove); + req.onSocket(socket); -/***/ 133: -/***/ (function(__unusedmodule, exports, __webpack_require__) { + function onFree() { + self.emit('free', socket, options); + } -"use strict"; + function onCloseOrRemove(err) { + self.removeSocket(socket); + socket.removeListener('free', onFree); + socket.removeListener('close', onCloseOrRemove); + socket.removeListener('agentRemove', onCloseOrRemove); + } + }); +}; +TunnelingAgent.prototype.createSocket = function createSocket(options, cb) { + var self = this; + var placeholder = {}; + self.sockets.push(placeholder); -const assert = __webpack_require__(357) -const Buffer = __webpack_require__(293).Buffer -const realZlib = __webpack_require__(761) + var connectOptions = mergeOptions({}, self.proxyOptions, { + method: 'CONNECT', + path: options.host + ':' + options.port, + agent: false, + headers: { + host: options.host + ':' + options.port + } + }); + if (options.localAddress) { + connectOptions.localAddress = options.localAddress; + } + if (connectOptions.proxyAuth) { + connectOptions.headers = connectOptions.headers || {}; + connectOptions.headers['Proxy-Authorization'] = 'Basic ' + + new Buffer(connectOptions.proxyAuth).toString('base64'); + } -const constants = exports.constants = __webpack_require__(60) -const Minipass = __webpack_require__(720) + debug('making CONNECT request'); + var connectReq = self.request(connectOptions); + connectReq.useChunkedEncodingByDefault = false; // for v0.6 + connectReq.once('response', onResponse); // for v0.6 + connectReq.once('upgrade', onUpgrade); // for v0.6 + connectReq.once('connect', onConnect); // for v0.7 or later + connectReq.once('error', onError); + connectReq.end(); -const OriginalBufferConcat = Buffer.concat + function onResponse(res) { + // Very hacky. This is necessary to avoid http-parser leaks. + res.upgrade = true; + } -const _superWrite = Symbol('_superWrite') -class ZlibError extends Error { - constructor (err) { - super('zlib: ' + err.message) - this.code = err.code - this.errno = err.errno - /* istanbul ignore if */ - if (!this.code) - this.code = 'ZLIB_ERROR' - - this.message = 'zlib: ' + err.message - Error.captureStackTrace(this, this.constructor) - } - - get name () { - return 'ZlibError' + function onUpgrade(res, socket, head) { + // Hacky. + process.nextTick(function() { + onConnect(res, socket, head); + }); } -} - -// the Zlib class they all inherit from -// This thing manages the queue of requests, and returns -// true or false if there is anything in the queue when -// you call the .write() method. -const _opts = Symbol('opts') -const _flushFlag = Symbol('flushFlag') -const _finishFlushFlag = Symbol('finishFlushFlag') -const _fullFlushFlag = Symbol('fullFlushFlag') -const _handle = Symbol('handle') -const _onError = Symbol('onError') -const _sawError = Symbol('sawError') -const _level = Symbol('level') -const _strategy = Symbol('strategy') -const _ended = Symbol('ended') -const _defaultFullFlush = Symbol('_defaultFullFlush') - -class ZlibBase extends Minipass { - constructor (opts, mode) { - if (!opts || typeof opts !== 'object') - throw new TypeError('invalid options for ZlibBase constructor') - super(opts) - this[_ended] = false - this[_opts] = opts - - this[_flushFlag] = opts.flush - this[_finishFlushFlag] = opts.finishFlush - // this will throw if any options are invalid for the class selected - try { - this[_handle] = new realZlib[mode](opts) - } catch (er) { - // make sure that all errors get decorated properly - throw new ZlibError(er) - } - - this[_onError] = (err) => { - this[_sawError] = true - // there is no way to cleanly recover. - // continuing only obscures problems. - this.close() - this.emit('error', err) - } - - this[_handle].on('error', er => this[_onError](new ZlibError(er))) - this.once('end', () => this.close) - } + function onConnect(res, socket, head) { + connectReq.removeAllListeners(); + socket.removeAllListeners(); - close () { - if (this[_handle]) { - this[_handle].close() - this[_handle] = null - this.emit('close') + if (res.statusCode !== 200) { + debug('tunneling socket could not be established, statusCode=%d', + res.statusCode); + socket.destroy(); + var error = new Error('tunneling socket could not be established, ' + + 'statusCode=' + res.statusCode); + error.code = 'ECONNRESET'; + options.request.emit('error', error); + self.removeSocket(placeholder); + return; } - } - - reset () { - if (!this[_sawError]) { - assert(this[_handle], 'zlib binding closed') - return this[_handle].reset() + if (head.length > 0) { + debug('got illegal response body from proxy'); + socket.destroy(); + var error = new Error('got illegal response body from proxy'); + error.code = 'ECONNRESET'; + options.request.emit('error', error); + self.removeSocket(placeholder); + return; } + debug('tunneling connection has established'); + self.sockets[self.sockets.indexOf(placeholder)] = socket; + return cb(socket); } - flush (flushFlag) { - if (this.ended) - return + function onError(cause) { + connectReq.removeAllListeners(); - if (typeof flushFlag !== 'number') - flushFlag = this[_fullFlushFlag] - this.write(Object.assign(Buffer.alloc(0), { [_flushFlag]: flushFlag })) + debug('tunneling socket could not be established, cause=%s\n', + cause.message, cause.stack); + var error = new Error('tunneling socket could not be established, ' + + 'cause=' + cause.message); + error.code = 'ECONNRESET'; + options.request.emit('error', error); + self.removeSocket(placeholder); } +}; - end (chunk, encoding, cb) { - if (chunk) - this.write(chunk, encoding) - this.flush(this[_finishFlushFlag]) - this[_ended] = true - return super.end(null, null, cb) +TunnelingAgent.prototype.removeSocket = function removeSocket(socket) { + var pos = this.sockets.indexOf(socket) + if (pos === -1) { + return; } + this.sockets.splice(pos, 1); - get ended () { - return this[_ended] + var pending = this.requests.shift(); + if (pending) { + // If we have pending requests and a socket gets closed a new one + // needs to be created to take over in the pool for the one that closed. + this.createSocket(pending, function(socket) { + pending.request.onSocket(socket); + }); } +}; - write (chunk, encoding, cb) { - // process the chunk using the sync process - // then super.write() all the outputted chunks - if (typeof encoding === 'function') - cb = encoding, encoding = 'utf8' +function createSecureSocket(options, cb) { + var self = this; + TunnelingAgent.prototype.createSocket.call(self, options, function(socket) { + var hostHeader = options.request.getHeader('host'); + var tlsOptions = mergeOptions({}, self.options, { + socket: socket, + servername: hostHeader ? hostHeader.replace(/:.*$/, '') : options.host + }); - if (typeof chunk === 'string') - chunk = Buffer.from(chunk, encoding) + // 0 is dummy port for v0.6 + var secureSocket = tls.connect(0, tlsOptions); + self.sockets[self.sockets.indexOf(socket)] = secureSocket; + cb(secureSocket); + }); +} - if (this[_sawError]) - return - assert(this[_handle], 'zlib binding closed') - // _processChunk tries to .close() the native handle after it's done, so we - // intercept that by temporarily making it a no-op. - const nativeHandle = this[_handle]._handle - const originalNativeClose = nativeHandle.close - nativeHandle.close = () => {} - const originalClose = this[_handle].close - this[_handle].close = () => {} - // It also calls `Buffer.concat()` at the end, which may be convenient - // for some, but which we are not interested in as it slows us down. - Buffer.concat = (args) => args - let result - try { - const flushFlag = typeof chunk[_flushFlag] === 'number' - ? chunk[_flushFlag] : this[_flushFlag] - result = this[_handle]._processChunk(chunk, flushFlag) - // if we don't throw, reset it back how it was - Buffer.concat = OriginalBufferConcat - } catch (err) { - // or if we do, put Buffer.concat() back before we emit error - // Error events call into user code, which may call Buffer.concat() - Buffer.concat = OriginalBufferConcat - this[_onError](new ZlibError(err)) - } finally { - if (this[_handle]) { - // Core zlib resets `_handle` to null after attempting to close the - // native handle. Our no-op handler prevented actual closure, but we - // need to restore the `._handle` property. - this[_handle]._handle = nativeHandle - nativeHandle.close = originalNativeClose - this[_handle].close = originalClose - // `_processChunk()` adds an 'error' listener. If we don't remove it - // after each call, these handlers start piling up. - this[_handle].removeAllListeners('error') - } - } +function toOptions(host, port, localAddress) { + if (typeof host === 'string') { // since v0.10 + return { + host: host, + port: port, + localAddress: localAddress + }; + } + return host; // for v0.11 or later +} - let writeReturn - if (result) { - if (Array.isArray(result) && result.length > 0) { - // The first buffer is always `handle._outBuffer`, which would be - // re-used for later invocations; so, we always have to copy that one. - writeReturn = this[_superWrite](Buffer.from(result[0])) - for (let i = 1; i < result.length; i++) { - writeReturn = this[_superWrite](result[i]) +function mergeOptions(target) { + for (var i = 1, len = arguments.length; i < len; ++i) { + var overrides = arguments[i]; + if (typeof overrides === 'object') { + var keys = Object.keys(overrides); + for (var j = 0, keyLen = keys.length; j < keyLen; ++j) { + var k = keys[j]; + if (overrides[k] !== undefined) { + target[k] = overrides[k]; } - } else { - writeReturn = this[_superWrite](Buffer.from(result)) } } - - if (cb) - cb() - return writeReturn - } - - [_superWrite] (data) { - return super.write(data) } + return target; } -class Zlib extends ZlibBase { - constructor (opts, mode) { - opts = opts || {} - - opts.flush = opts.flush || constants.Z_NO_FLUSH - opts.finishFlush = opts.finishFlush || constants.Z_FINISH - super(opts, mode) - this[_fullFlushFlag] = constants.Z_FULL_FLUSH - this[_level] = opts.level - this[_strategy] = opts.strategy +var debug; +if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) { + debug = function() { + var args = Array.prototype.slice.call(arguments); + if (typeof args[0] === 'string') { + args[0] = 'TUNNEL: ' + args[0]; + } else { + args.unshift('TUNNEL:'); + } + console.error.apply(console, args); } +} else { + debug = function() {}; +} +exports.debug = debug; // for test - params (level, strategy) { - if (this[_sawError]) - return - if (!this[_handle]) - throw new Error('cannot switch params when binding is closed') +/***/ }), - // no way to test this without also not supporting params at all - /* istanbul ignore if */ - if (!this[_handle].params) - throw new Error('not supported in this implementation') +/***/ 146: +/***/ (function(__unusedmodule, exports, __webpack_require__) { - if (this[_level] !== level || this[_strategy] !== strategy) { - this.flush(constants.Z_SYNC_FLUSH) - assert(this[_handle], 'zlib binding closed') - // .params() calls .flush(), but the latter is always async in the - // core zlib. We override .flush() temporarily to intercept that and - // flush synchronously. - const origFlush = this[_handle].flush - this[_handle].flush = (flushFlag, cb) => { - this.flush(flushFlag) - cb() - } - try { - this[_handle].params(level, strategy) - } finally { - this[_handle].flush = origFlush - } - /* istanbul ignore else */ - if (this[_handle]) { - this[_level] = level - this[_strategy] = strategy - } +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.GitHub = void 0; +const core = __importStar(__webpack_require__(470)); +const github = __importStar(__webpack_require__(469)); +const rest_1 = __webpack_require__(889); +class GitHub { + constructor(token) { + this.client = new rest_1.Octokit({ auth: token }); + } + getTrivyIssues(image, labels) { + return __awaiter(this, void 0, void 0, function* () { + if (labels == null) { + return []; + } + let { data: trivyIssues } = yield this.client.issues.listForRepo(Object.assign(Object.assign({}, github.context.repo), { state: 'open', labels: labels.join(',') })); + return trivyIssues.filter(issue => issue.body && issue.body.includes(image)); + }); + } + createIssue(options) { + return __awaiter(this, void 0, void 0, function* () { + const { data: issue } = yield this.client.issues.create(Object.assign(Object.assign({}, github.context.repo), options)); + return { issueNumber: issue.number, htmlUrl: issue.html_url }; + }); + } + updateIssue(issueNumber, options) { + return __awaiter(this, void 0, void 0, function* () { + yield this.client.issues.update(Object.assign(Object.assign({}, github.context.repo), { issue_number: issueNumber, body: options.body })); + }); + } + createOrUpdateIssue(image, options) { + return __awaiter(this, void 0, void 0, function* () { + const trivyIssues = yield this.getTrivyIssues(image, options.labels); + if (trivyIssues.length > 0) { + core.info('Found existing issue. Updating existing issue.'); + const existingIssue = trivyIssues[0]; + yield this.updateIssue(existingIssue.number, options); + return { + issueNumber: existingIssue.number, + htmlUrl: existingIssue.html_url, + }; + } + else { + core.info('Create new issue'); + return yield this.createIssue(options); + } + }); } - } } +exports.GitHub = GitHub; -// minimal 2-byte header -class Deflate extends Zlib { - constructor (opts) { - super(opts, 'Deflate') - } -} -class Inflate extends Zlib { - constructor (opts) { - super(opts, 'Inflate') - } -} - -// gzip - bigger header, same deflate compression -const _portable = Symbol('_portable') -class Gzip extends Zlib { - constructor (opts) { - super(opts, 'Gzip') - this[_portable] = opts && !!opts.portable - } - - [_superWrite] (data) { - if (!this[_portable]) - return super[_superWrite](data) - - // we'll always get the header emitted in one first chunk - // overwrite the OS indicator byte with 0xFF - this[_portable] = false - data[9] = 255 - return super[_superWrite](data) - } -} - -class Gunzip extends Zlib { - constructor (opts) { - super(opts, 'Gunzip') - } -} - -// raw - no header -class DeflateRaw extends Zlib { - constructor (opts) { - super(opts, 'DeflateRaw') - } -} - -class InflateRaw extends Zlib { - constructor (opts) { - super(opts, 'InflateRaw') - } -} - -// auto-detect header. -class Unzip extends Zlib { - constructor (opts) { - super(opts, 'Unzip') - } -} - -class Brotli extends ZlibBase { - constructor (opts, mode) { - opts = opts || {} - - opts.flush = opts.flush || constants.BROTLI_OPERATION_PROCESS - opts.finishFlush = opts.finishFlush || constants.BROTLI_OPERATION_FINISH - - super(opts, mode) - - this[_fullFlushFlag] = constants.BROTLI_OPERATION_FLUSH - } -} - -class BrotliCompress extends Brotli { - constructor (opts) { - super(opts, 'BrotliCompress') - } -} - -class BrotliDecompress extends Brotli { - constructor (opts) { - super(opts, 'BrotliDecompress') - } -} - -exports.Deflate = Deflate -exports.Inflate = Inflate -exports.Gzip = Gzip -exports.Gunzip = Gunzip -exports.DeflateRaw = DeflateRaw -exports.InflateRaw = InflateRaw -exports.Unzip = Unzip -/* istanbul ignore else */ -if (typeof realZlib.BrotliCompress === 'function') { - exports.BrotliCompress = BrotliCompress - exports.BrotliDecompress = BrotliDecompress -} else { - exports.BrotliCompress = exports.BrotliDecompress = class { - constructor () { - throw new Error('Brotli is not supported in this version of Node.js') - } - } -} - - -/***/ }), - -/***/ 143: -/***/ (function(module, __unusedexports, __webpack_require__) { - -module.exports = withAuthorizationPrefix; - -const atob = __webpack_require__(368); - -const REGEX_IS_BASIC_AUTH = /^[\w-]+:/; - -function withAuthorizationPrefix(authorization) { - if (/^(basic|bearer|token) /i.test(authorization)) { - return authorization; - } - - try { - if (REGEX_IS_BASIC_AUTH.test(atob(authorization))) { - return `basic ${authorization}`; - } - } catch (error) {} - - if (authorization.split(/\./).length === 3) { - return `bearer ${authorization}`; - } - - return `token ${authorization}`; -} - - -/***/ }), - -/***/ 145: -/***/ (function(module, __unusedexports, __webpack_require__) { - -"use strict"; - -const pump = __webpack_require__(453); -const bufferStream = __webpack_require__(158); - -class MaxBufferError extends Error { - constructor() { - super('maxBuffer exceeded'); - this.name = 'MaxBufferError'; - } -} - -function getStream(inputStream, options) { - if (!inputStream) { - return Promise.reject(new Error('Expected a stream')); - } - - options = Object.assign({maxBuffer: Infinity}, options); - - const {maxBuffer} = options; - - let stream; - return new Promise((resolve, reject) => { - const rejectPromise = error => { - if (error) { // A null check - error.bufferedData = stream.getBufferedValue(); - } - reject(error); - }; - - stream = pump(inputStream, bufferStream(options), error => { - if (error) { - rejectPromise(error); - return; - } - - resolve(); - }); - - stream.on('data', () => { - if (stream.getBufferedLength() > maxBuffer) { - rejectPromise(new MaxBufferError()); - } - }); - }).then(() => stream.getBufferedValue()); -} - -module.exports = getStream; -module.exports.buffer = (stream, options) => getStream(stream, Object.assign({}, options, {encoding: 'buffer'})); -module.exports.array = (stream, options) => getStream(stream, Object.assign({}, options, {array: true})); -module.exports.MaxBufferError = MaxBufferError; - - -/***/ }), - -/***/ 148: -/***/ (function(module, __unusedexports, __webpack_require__) { - -module.exports = paginatePlugin; - -const { paginateRest } = __webpack_require__(299); - -function paginatePlugin(octokit) { - Object.assign(octokit, paginateRest(octokit)); -} - - -/***/ }), - -/***/ 158: -/***/ (function(module, __unusedexports, __webpack_require__) { - -"use strict"; - -const {PassThrough} = __webpack_require__(413); - -module.exports = options => { - options = Object.assign({}, options); - - const {array} = options; - let {encoding} = options; - const buffer = encoding === 'buffer'; - let objectMode = false; - - if (array) { - objectMode = !(encoding || buffer); - } else { - encoding = encoding || 'utf8'; - } - - if (buffer) { - encoding = null; - } - - let len = 0; - const ret = []; - const stream = new PassThrough({objectMode}); - - if (encoding) { - stream.setEncoding(encoding); - } - - stream.on('data', chunk => { - ret.push(chunk); - - if (objectMode) { - len = ret.length; - } else { - len += chunk.length; - } - }); - - stream.getBufferedValue = () => { - if (array) { - return ret; - } - - return buffer ? Buffer.concat(ret, len) : ret.join(''); - }; - - stream.getBufferedLength = () => len; - - return stream; -}; - - -/***/ }), +/***/ }), /***/ 159: /***/ (function(module, __unusedexports, __webpack_require__) { @@ -2878,69 +1968,6 @@ const create = (opt, files) => { } -/***/ }), - -/***/ 163: -/***/ (function(__unusedmodule, exports) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -function isIterable(obj) { - return obj != null && typeof obj[Symbol.iterator] === 'function'; -} -exports.isIterable = isIterable; - - -/***/ }), - -/***/ 168: -/***/ (function(module) { - -"use strict"; - -const alias = ['stdin', 'stdout', 'stderr']; - -const hasAlias = opts => alias.some(x => Boolean(opts[x])); - -module.exports = opts => { - if (!opts) { - return null; - } - - if (opts.stdio && hasAlias(opts)) { - throw new Error(`It's not possible to provide \`stdio\` in combination with one of ${alias.map(x => `\`${x}\``).join(', ')}`); - } - - if (typeof opts.stdio === 'string') { - return opts.stdio; - } - - const stdio = opts.stdio || []; - - if (!Array.isArray(stdio)) { - throw new TypeError(`Expected \`stdio\` to be of type \`string\` or \`Array\`, got \`${typeof stdio}\``); - } - - const result = []; - const len = Math.max(stdio.length, alias.length); - - for (let i = 0; i < len; i++) { - let value = null; - - if (stdio[i] !== undefined) { - value = stdio[i]; - } else if (opts[alias[i]] !== undefined) { - value = opts[alias[i]]; - } - - result[i] = value; - } - - return result; -}; - - /***/ }), /***/ 182: @@ -3075,172 +2102,41 @@ module.exports = () => { /***/ }), -/***/ 190: +/***/ 203: /***/ (function(module, __unusedexports, __webpack_require__) { -module.exports = authenticationPlugin; - -const { createTokenAuth } = __webpack_require__(813); -const { Deprecation } = __webpack_require__(692); -const once = __webpack_require__(969); - -const beforeRequest = __webpack_require__(863); -const requestError = __webpack_require__(991); -const validate = __webpack_require__(954); -const withAuthorizationPrefix = __webpack_require__(143); - -const deprecateAuthBasic = once((log, deprecation) => log.warn(deprecation)); -const deprecateAuthObject = once((log, deprecation) => log.warn(deprecation)); - -function authenticationPlugin(octokit, options) { - // If `options.authStrategy` is set then use it and pass in `options.auth` - if (options.authStrategy) { - const auth = options.authStrategy(options.auth); - octokit.hook.wrap("request", auth.hook); - octokit.auth = auth; - return; - } +"use strict"; - // If neither `options.authStrategy` nor `options.auth` are set, the `octokit` instance - // is unauthenticated. The `octokit.auth()` method is a no-op and no request hook is registred. - if (!options.auth) { - octokit.auth = () => - Promise.resolve({ - type: "unauthenticated" - }); - return; - } - const isBasicAuthString = - typeof options.auth === "string" && - /^basic/.test(withAuthorizationPrefix(options.auth)); +// this[BUFFER] is the remainder of a chunk if we're waiting for +// the full 512 bytes of a header to come in. We will Buffer.concat() +// it to the next write(), which is a mem copy, but a small one. +// +// this[QUEUE] is a Yallist of entries that haven't been emitted +// yet this can only get filled up if the user keeps write()ing after +// a write() returns false, or does a write() with more than one entry +// +// We don't buffer chunks, we always parse them and either create an +// entry, or push it into the active entry. The ReadEntry class knows +// to throw data away if .ignore=true +// +// Shift entry off the buffer when it emits 'end', and emit 'entry' for +// the next one in the list. +// +// At any time, we're pushing body chunks into the entry at WRITEENTRY, +// and waiting for 'end' on the entry at READENTRY +// +// ignored entries get .resume() called on them straight away - // If only `options.auth` is set to a string, use the default token authentication strategy. - if (typeof options.auth === "string" && !isBasicAuthString) { - const auth = createTokenAuth(options.auth); - octokit.hook.wrap("request", auth.hook); - octokit.auth = auth; - return; - } - - // Otherwise log a deprecation message - const [deprecationMethod, deprecationMessapge] = isBasicAuthString - ? [ - deprecateAuthBasic, - 'Setting the "new Octokit({ auth })" option to a Basic Auth string is deprecated. Use https://github.com/octokit/auth-basic.js instead. See (https://octokit.github.io/rest.js/#authentication)' - ] - : [ - deprecateAuthObject, - 'Setting the "new Octokit({ auth })" option to an object without also setting the "authStrategy" option is deprecated and will be removed in v17. See (https://octokit.github.io/rest.js/#authentication)' - ]; - deprecationMethod( - octokit.log, - new Deprecation("[@octokit/rest] " + deprecationMessapge) - ); - - octokit.auth = () => - Promise.resolve({ - type: "deprecated", - message: deprecationMessapge - }); - - validate(options.auth); - - const state = { - octokit, - auth: options.auth - }; - - octokit.hook.before("request", beforeRequest.bind(null, state)); - octokit.hook.error("request", requestError.bind(null, state)); -} - - -/***/ }), - -/***/ 197: -/***/ (function(module, __unusedexports, __webpack_require__) { - -module.exports = isexe -isexe.sync = sync - -var fs = __webpack_require__(747) - -function isexe (path, options, cb) { - fs.stat(path, function (er, stat) { - cb(er, er ? false : checkStat(stat, options)) - }) -} - -function sync (path, options) { - return checkStat(fs.statSync(path), options) -} - -function checkStat (stat, options) { - return stat.isFile() && checkMode(stat, options) -} - -function checkMode (stat, options) { - var mod = stat.mode - var uid = stat.uid - var gid = stat.gid - - var myUid = options.uid !== undefined ? - options.uid : process.getuid && process.getuid() - var myGid = options.gid !== undefined ? - options.gid : process.getgid && process.getgid() - - var u = parseInt('100', 8) - var g = parseInt('010', 8) - var o = parseInt('001', 8) - var ug = u | g - - var ret = (mod & o) || - (mod & g) && gid === myGid || - (mod & u) && uid === myUid || - (mod & ug) && myUid === 0 - - return ret -} - - -/***/ }), - -/***/ 203: -/***/ (function(module, __unusedexports, __webpack_require__) { - -"use strict"; - - -// this[BUFFER] is the remainder of a chunk if we're waiting for -// the full 512 bytes of a header to come in. We will Buffer.concat() -// it to the next write(), which is a mem copy, but a small one. -// -// this[QUEUE] is a Yallist of entries that haven't been emitted -// yet this can only get filled up if the user keeps write()ing after -// a write() returns false, or does a write() with more than one entry -// -// We don't buffer chunks, we always parse them and either create an -// entry, or push it into the active entry. The ReadEntry class knows -// to throw data away if .ignore=true -// -// Shift entry off the buffer when it emits 'end', and emit 'entry' for -// the next one in the list. -// -// At any time, we're pushing body chunks into the entry at WRITEENTRY, -// and waiting for 'end' on the entry at READENTRY -// -// ignored entries get .resume() called on them straight away - -const warner = __webpack_require__(796) -const path = __webpack_require__(622) -const Header = __webpack_require__(232) -const EE = __webpack_require__(614) -const Yallist = __webpack_require__(612) -const maxMetaEntrySize = 1024 * 1024 -const Entry = __webpack_require__(662) -const Pax = __webpack_require__(582) -const zlib = __webpack_require__(133) +const warner = __webpack_require__(796) +const path = __webpack_require__(622) +const Header = __webpack_require__(232) +const EE = __webpack_require__(614) +const Yallist = __webpack_require__(612) +const maxMetaEntrySize = 1024 * 1024 +const Entry = __webpack_require__(662) +const Pax = __webpack_require__(582) +const zlib = __webpack_require__(133) const gzipHeader = Buffer.from([0x1f, 0x8b]) const STATE = Symbol('state') @@ -3704,13 +2600,6 @@ module.exports = require("https"); /***/ }), -/***/ 215: -/***/ (function(module) { - -module.exports = {"name":"@octokit/rest","version":"16.43.1","publishConfig":{"access":"public"},"description":"GitHub REST API client for Node.js","keywords":["octokit","github","rest","api-client"],"author":"Gregor Martynus (https://github.com/gr2m)","contributors":[{"name":"Mike de Boer","email":"info@mikedeboer.nl"},{"name":"Fabian Jakobs","email":"fabian@c9.io"},{"name":"Joe Gallo","email":"joe@brassafrax.com"},{"name":"Gregor Martynus","url":"https://github.com/gr2m"}],"repository":"https://github.com/octokit/rest.js","dependencies":{"@octokit/auth-token":"^2.4.0","@octokit/plugin-paginate-rest":"^1.1.1","@octokit/plugin-request-log":"^1.0.0","@octokit/plugin-rest-endpoint-methods":"2.4.0","@octokit/request":"^5.2.0","@octokit/request-error":"^1.0.2","atob-lite":"^2.0.0","before-after-hook":"^2.0.0","btoa-lite":"^1.0.0","deprecation":"^2.0.0","lodash.get":"^4.4.2","lodash.set":"^4.3.2","lodash.uniq":"^4.5.0","octokit-pagination-methods":"^1.1.0","once":"^1.4.0","universal-user-agent":"^4.0.0"},"devDependencies":{"@gimenete/type-writer":"^0.1.3","@octokit/auth":"^1.1.1","@octokit/fixtures-server":"^5.0.6","@octokit/graphql":"^4.2.0","@types/node":"^13.1.0","bundlesize":"^0.18.0","chai":"^4.1.2","compression-webpack-plugin":"^3.1.0","cypress":"^3.0.0","glob":"^7.1.2","http-proxy-agent":"^4.0.0","lodash.camelcase":"^4.3.0","lodash.merge":"^4.6.1","lodash.upperfirst":"^4.3.1","lolex":"^5.1.2","mkdirp":"^1.0.0","mocha":"^7.0.1","mustache":"^4.0.0","nock":"^11.3.3","npm-run-all":"^4.1.2","nyc":"^15.0.0","prettier":"^1.14.2","proxy":"^1.0.0","semantic-release":"^17.0.0","sinon":"^8.0.0","sinon-chai":"^3.0.0","sort-keys":"^4.0.0","string-to-arraybuffer":"^1.0.0","string-to-jsdoc-comment":"^1.0.0","typescript":"^3.3.1","webpack":"^4.0.0","webpack-bundle-analyzer":"^3.0.0","webpack-cli":"^3.0.0"},"types":"index.d.ts","scripts":{"coverage":"nyc report --reporter=html && open coverage/index.html","lint":"prettier --check '{lib,plugins,scripts,test}/**/*.{js,json,ts}' 'docs/*.{js,json}' 'docs/src/**/*' index.js README.md package.json","lint:fix":"prettier --write '{lib,plugins,scripts,test}/**/*.{js,json,ts}' 'docs/*.{js,json}' 'docs/src/**/*' index.js README.md package.json","pretest":"npm run -s lint","test":"nyc mocha test/mocha-node-setup.js \"test/*/**/*-test.js\"","test:browser":"cypress run --browser chrome","build":"npm-run-all build:*","build:ts":"npm run -s update-endpoints:typescript","prebuild:browser":"mkdirp dist/","build:browser":"npm-run-all build:browser:*","build:browser:development":"webpack --mode development --entry . --output-library=Octokit --output=./dist/octokit-rest.js --profile --json > dist/bundle-stats.json","build:browser:production":"webpack --mode production --entry . --plugin=compression-webpack-plugin --output-library=Octokit --output-path=./dist --output-filename=octokit-rest.min.js --devtool source-map","generate-bundle-report":"webpack-bundle-analyzer dist/bundle-stats.json --mode=static --no-open --report dist/bundle-report.html","update-endpoints":"npm-run-all update-endpoints:*","update-endpoints:fetch-json":"node scripts/update-endpoints/fetch-json","update-endpoints:typescript":"node scripts/update-endpoints/typescript","prevalidate:ts":"npm run -s build:ts","validate:ts":"tsc --target es6 --noImplicitAny index.d.ts","postvalidate:ts":"tsc --noEmit --target es6 test/typescript-validate.ts","start-fixtures-server":"octokit-fixtures-server"},"license":"MIT","files":["index.js","index.d.ts","lib","plugins"],"nyc":{"ignore":["test"]},"release":{"publish":["@semantic-release/npm",{"path":"@semantic-release/github","assets":["dist/*","!dist/*.map.gz"]}]},"bundlesize":[{"path":"./dist/octokit-rest.min.js.gz","maxSize":"33 kB"}]}; - -/***/ }), - /***/ 232: /***/ (function(module, __unusedexports, __webpack_require__) { @@ -4005,170 +2894,6 @@ const encString = (buf, off, size, string) => module.exports = Header -/***/ }), - -/***/ 260: -/***/ (function(module, __unusedexports, __webpack_require__) { - -// Note: since nyc uses this module to output coverage, any lines -// that are in the direct sync flow of nyc's outputCoverage are -// ignored, since we can never get coverage for them. -var assert = __webpack_require__(357) -var signals = __webpack_require__(654) - -var EE = __webpack_require__(614) -/* istanbul ignore if */ -if (typeof EE !== 'function') { - EE = EE.EventEmitter -} - -var emitter -if (process.__signal_exit_emitter__) { - emitter = process.__signal_exit_emitter__ -} else { - emitter = process.__signal_exit_emitter__ = new EE() - emitter.count = 0 - emitter.emitted = {} -} - -// Because this emitter is a global, we have to check to see if a -// previous version of this library failed to enable infinite listeners. -// I know what you're about to say. But literally everything about -// signal-exit is a compromise with evil. Get used to it. -if (!emitter.infinite) { - emitter.setMaxListeners(Infinity) - emitter.infinite = true -} - -module.exports = function (cb, opts) { - assert.equal(typeof cb, 'function', 'a callback must be provided for exit handler') - - if (loaded === false) { - load() - } - - var ev = 'exit' - if (opts && opts.alwaysLast) { - ev = 'afterexit' - } - - var remove = function () { - emitter.removeListener(ev, cb) - if (emitter.listeners('exit').length === 0 && - emitter.listeners('afterexit').length === 0) { - unload() - } - } - emitter.on(ev, cb) - - return remove -} - -module.exports.unload = unload -function unload () { - if (!loaded) { - return - } - loaded = false - - signals.forEach(function (sig) { - try { - process.removeListener(sig, sigListeners[sig]) - } catch (er) {} - }) - process.emit = originalProcessEmit - process.reallyExit = originalProcessReallyExit - emitter.count -= 1 -} - -function emit (event, code, signal) { - if (emitter.emitted[event]) { - return - } - emitter.emitted[event] = true - emitter.emit(event, code, signal) -} - -// { : , ... } -var sigListeners = {} -signals.forEach(function (sig) { - sigListeners[sig] = function listener () { - // If there are no other listeners, an exit is coming! - // Simplest way: remove us and then re-send the signal. - // We know that this will kill the process, so we can - // safely emit now. - var listeners = process.listeners(sig) - if (listeners.length === emitter.count) { - unload() - emit('exit', null, sig) - /* istanbul ignore next */ - emit('afterexit', null, sig) - /* istanbul ignore next */ - process.kill(process.pid, sig) - } - } -}) - -module.exports.signals = function () { - return signals -} - -module.exports.load = load - -var loaded = false - -function load () { - if (loaded) { - return - } - loaded = true - - // This is the number of onSignalExit's that are in play. - // It's important so that we can count the correct number of - // listeners on signals, and don't wait for the other one to - // handle it instead of us. - emitter.count += 1 - - signals = signals.filter(function (sig) { - try { - process.on(sig, sigListeners[sig]) - return true - } catch (er) { - return false - } - }) - - process.emit = processEmit - process.reallyExit = processReallyExit -} - -var originalProcessReallyExit = process.reallyExit -function processReallyExit (code) { - process.exitCode = code || 0 - emit('exit', process.exitCode, null) - /* istanbul ignore next */ - emit('afterexit', process.exitCode, null) - /* istanbul ignore next */ - originalProcessReallyExit.call(process, process.exitCode) -} - -var originalProcessEmit = process.emit -function processEmit (ev, arg) { - if (ev === 'exit') { - if (arg !== undefined) { - process.exitCode = arg - } - var ret = originalProcessEmit.apply(this, arguments) - emit('exit', process.exitCode, null) - /* istanbul ignore next */ - emit('afterexit', process.exitCode, null) - return ret - } else { - return originalProcessEmit.apply(this, arguments) - } -} - - /***/ }), /***/ 262: @@ -4177,6 +2902,7 @@ function processEmit (ev, arg) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); +exports.Context = void 0; const fs_1 = __webpack_require__(747); const os_1 = __webpack_require__(87); class Context { @@ -4190,7 +2916,8 @@ class Context { this.payload = JSON.parse(fs_1.readFileSync(process.env.GITHUB_EVENT_PATH, { encoding: 'utf8' })); } else { - process.stdout.write(`GITHUB_EVENT_PATH ${process.env.GITHUB_EVENT_PATH} does not exist${os_1.EOL}`); + const path = process.env.GITHUB_EVENT_PATH; + process.stdout.write(`GITHUB_EVENT_PATH ${path} does not exist${os_1.EOL}`); } } this.eventName = process.env.GITHUB_EVENT_NAME; @@ -4199,10 +2926,13 @@ class Context { this.workflow = process.env.GITHUB_WORKFLOW; this.action = process.env.GITHUB_ACTION; this.actor = process.env.GITHUB_ACTOR; + this.job = process.env.GITHUB_JOB; + this.runNumber = parseInt(process.env.GITHUB_RUN_NUMBER, 10); + this.runId = parseInt(process.env.GITHUB_RUN_ID, 10); } get issue() { const payload = this.payload; - return Object.assign(Object.assign({}, this.repo), { number: (payload.issue || payload.pullRequest || payload).number }); + return Object.assign(Object.assign({}, this.repo), { number: (payload.issue || payload.pull_request || payload).number }); } get repo() { if (process.env.GITHUB_REPOSITORY) { @@ -4223,26438 +2953,11022 @@ exports.Context = Context; /***/ }), -/***/ 265: -/***/ (function(module, __unusedexports, __webpack_require__) { - -module.exports = getPage - -const deprecate = __webpack_require__(370) -const getPageLinks = __webpack_require__(13) -const HttpError = __webpack_require__(297) +/***/ 280: +/***/ (function(module) { -function getPage (octokit, link, which, headers) { - deprecate(`octokit.get${which.charAt(0).toUpperCase() + which.slice(1)}Page() – You can use octokit.paginate or async iterators instead: https://github.com/octokit/rest.js#pagination.`) - const url = getPageLinks(link)[which] +module.exports = register; - if (!url) { - const urlError = new HttpError(`No ${which} page found`, 404) - return Promise.reject(urlError) +function register(state, name, method, options) { + if (typeof method !== "function") { + throw new Error("method for before hook must be a function"); } - const requestOptions = { - url, - headers: applyAcceptHeader(link, headers) + if (!options) { + options = {}; } - const promise = octokit.request(requestOptions) - - return promise -} - -function applyAcceptHeader (res, headers) { - const previous = res.headers && res.headers['x-github-media-type'] - - if (!previous || (headers && headers.accept)) { - return headers + if (Array.isArray(name)) { + return name.reverse().reduce(function (callback, name) { + return register.bind(null, state, name, callback, options); + }, method)(); } - headers = headers || {} - headers.accept = 'application/vnd.' + previous - .replace('; param=', '.') - .replace('; format=', '+') - return headers + return Promise.resolve().then(function () { + if (!state.registry[name]) { + return method(options); + } + + return state.registry[name].reduce(function (method, registered) { + return registered.hook.bind(null, method, options); + }, method)(); + }); } /***/ }), -/***/ 280: -/***/ (function(module, exports) { - -exports = module.exports = SemVer - -var debug -/* istanbul ignore next */ -if (typeof process === 'object' && - process.env && - process.env.NODE_DEBUG && - /\bsemver\b/i.test(process.env.NODE_DEBUG)) { - debug = function () { - var args = Array.prototype.slice.call(arguments, 0) - args.unshift('SEMVER') - console.log.apply(console, args) - } -} else { - debug = function () {} -} - -// Note: this is the semver.org version of the spec that it implements -// Not necessarily the package version of this code. -exports.SEMVER_SPEC_VERSION = '2.0.0' - -var MAX_LENGTH = 256 -var MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER || - /* istanbul ignore next */ 9007199254740991 +/***/ 293: +/***/ (function(module) { -// Max safe segment length for coercion. -var MAX_SAFE_COMPONENT_LENGTH = 16 +module.exports = require("buffer"); -// The actual regexps go on exports.re -var re = exports.re = [] -var src = exports.src = [] -var R = 0 +/***/ }), -// The following Regular Expressions can be used for tokenizing, -// validating, and parsing SemVer version strings. +/***/ 299: +/***/ (function(__unusedmodule, exports) { -// ## Numeric Identifier -// A single `0`, or a non-zero digit followed by zero or more digits. +"use strict"; -var NUMERICIDENTIFIER = R++ -src[NUMERICIDENTIFIER] = '0|[1-9]\\d*' -var NUMERICIDENTIFIERLOOSE = R++ -src[NUMERICIDENTIFIERLOOSE] = '[0-9]+' -// ## Non-numeric Identifier -// Zero or more digits, followed by a letter or hyphen, and then zero or -// more letters, digits, or hyphens. +Object.defineProperty(exports, '__esModule', { value: true }); -var NONNUMERICIDENTIFIER = R++ -src[NONNUMERICIDENTIFIER] = '\\d*[a-zA-Z-][a-zA-Z0-9-]*' - -// ## Main Version -// Three dot-separated numeric identifiers. - -var MAINVERSION = R++ -src[MAINVERSION] = '(' + src[NUMERICIDENTIFIER] + ')\\.' + - '(' + src[NUMERICIDENTIFIER] + ')\\.' + - '(' + src[NUMERICIDENTIFIER] + ')' - -var MAINVERSIONLOOSE = R++ -src[MAINVERSIONLOOSE] = '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + - '(' + src[NUMERICIDENTIFIERLOOSE] + ')\\.' + - '(' + src[NUMERICIDENTIFIERLOOSE] + ')' - -// ## Pre-release Version Identifier -// A numeric identifier, or a non-numeric identifier. - -var PRERELEASEIDENTIFIER = R++ -src[PRERELEASEIDENTIFIER] = '(?:' + src[NUMERICIDENTIFIER] + - '|' + src[NONNUMERICIDENTIFIER] + ')' - -var PRERELEASEIDENTIFIERLOOSE = R++ -src[PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[NUMERICIDENTIFIERLOOSE] + - '|' + src[NONNUMERICIDENTIFIER] + ')' - -// ## Pre-release Version -// Hyphen, followed by one or more dot-separated pre-release version -// identifiers. - -var PRERELEASE = R++ -src[PRERELEASE] = '(?:-(' + src[PRERELEASEIDENTIFIER] + - '(?:\\.' + src[PRERELEASEIDENTIFIER] + ')*))' - -var PRERELEASELOOSE = R++ -src[PRERELEASELOOSE] = '(?:-?(' + src[PRERELEASEIDENTIFIERLOOSE] + - '(?:\\.' + src[PRERELEASEIDENTIFIERLOOSE] + ')*))' - -// ## Build Metadata Identifier -// Any combination of digits, letters, or hyphens. - -var BUILDIDENTIFIER = R++ -src[BUILDIDENTIFIER] = '[0-9A-Za-z-]+' - -// ## Build Metadata -// Plus sign, followed by one or more period-separated build metadata -// identifiers. - -var BUILD = R++ -src[BUILD] = '(?:\\+(' + src[BUILDIDENTIFIER] + - '(?:\\.' + src[BUILDIDENTIFIER] + ')*))' - -// ## Full Version String -// A main version, followed optionally by a pre-release version and -// build metadata. - -// Note that the only major, minor, patch, and pre-release sections of -// the version string are capturing groups. The build metadata is not a -// capturing group, because it should not ever be used in version -// comparison. - -var FULL = R++ -var FULLPLAIN = 'v?' + src[MAINVERSION] + - src[PRERELEASE] + '?' + - src[BUILD] + '?' - -src[FULL] = '^' + FULLPLAIN + '$' - -// like full, but allows v1.2.3 and =1.2.3, which people do sometimes. -// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty -// common in the npm registry. -var LOOSEPLAIN = '[v=\\s]*' + src[MAINVERSIONLOOSE] + - src[PRERELEASELOOSE] + '?' + - src[BUILD] + '?' - -var LOOSE = R++ -src[LOOSE] = '^' + LOOSEPLAIN + '$' - -var GTLT = R++ -src[GTLT] = '((?:<|>)?=?)' - -// Something like "2.*" or "1.2.x". -// Note that "x.x" is a valid xRange identifer, meaning "any version" -// Only the first item is strictly required. -var XRANGEIDENTIFIERLOOSE = R++ -src[XRANGEIDENTIFIERLOOSE] = src[NUMERICIDENTIFIERLOOSE] + '|x|X|\\*' -var XRANGEIDENTIFIER = R++ -src[XRANGEIDENTIFIER] = src[NUMERICIDENTIFIER] + '|x|X|\\*' - -var XRANGEPLAIN = R++ -src[XRANGEPLAIN] = '[v=\\s]*(' + src[XRANGEIDENTIFIER] + ')' + - '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + - '(?:\\.(' + src[XRANGEIDENTIFIER] + ')' + - '(?:' + src[PRERELEASE] + ')?' + - src[BUILD] + '?' + - ')?)?' - -var XRANGEPLAINLOOSE = R++ -src[XRANGEPLAINLOOSE] = '[v=\\s]*(' + src[XRANGEIDENTIFIERLOOSE] + ')' + - '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + - '(?:\\.(' + src[XRANGEIDENTIFIERLOOSE] + ')' + - '(?:' + src[PRERELEASELOOSE] + ')?' + - src[BUILD] + '?' + - ')?)?' - -var XRANGE = R++ -src[XRANGE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAIN] + '$' -var XRANGELOOSE = R++ -src[XRANGELOOSE] = '^' + src[GTLT] + '\\s*' + src[XRANGEPLAINLOOSE] + '$' - -// Coercion. -// Extract anything that could conceivably be a part of a valid semver -var COERCE = R++ -src[COERCE] = '(?:^|[^\\d])' + - '(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' + - '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + - '(?:\\.(\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' + - '(?:$|[^\\d])' - -// Tilde ranges. -// Meaning is "reasonably at or greater than" -var LONETILDE = R++ -src[LONETILDE] = '(?:~>?)' - -var TILDETRIM = R++ -src[TILDETRIM] = '(\\s*)' + src[LONETILDE] + '\\s+' -re[TILDETRIM] = new RegExp(src[TILDETRIM], 'g') -var tildeTrimReplace = '$1~' - -var TILDE = R++ -src[TILDE] = '^' + src[LONETILDE] + src[XRANGEPLAIN] + '$' -var TILDELOOSE = R++ -src[TILDELOOSE] = '^' + src[LONETILDE] + src[XRANGEPLAINLOOSE] + '$' - -// Caret ranges. -// Meaning is "at least and backwards compatible with" -var LONECARET = R++ -src[LONECARET] = '(?:\\^)' - -var CARETTRIM = R++ -src[CARETTRIM] = '(\\s*)' + src[LONECARET] + '\\s+' -re[CARETTRIM] = new RegExp(src[CARETTRIM], 'g') -var caretTrimReplace = '$1^' - -var CARET = R++ -src[CARET] = '^' + src[LONECARET] + src[XRANGEPLAIN] + '$' -var CARETLOOSE = R++ -src[CARETLOOSE] = '^' + src[LONECARET] + src[XRANGEPLAINLOOSE] + '$' - -// A simple gt/lt/eq thing, or just "" to indicate "any version" -var COMPARATORLOOSE = R++ -src[COMPARATORLOOSE] = '^' + src[GTLT] + '\\s*(' + LOOSEPLAIN + ')$|^$' -var COMPARATOR = R++ -src[COMPARATOR] = '^' + src[GTLT] + '\\s*(' + FULLPLAIN + ')$|^$' - -// An expression to strip any whitespace between the gtlt and the thing -// it modifies, so that `> 1.2.3` ==> `>1.2.3` -var COMPARATORTRIM = R++ -src[COMPARATORTRIM] = '(\\s*)' + src[GTLT] + - '\\s*(' + LOOSEPLAIN + '|' + src[XRANGEPLAIN] + ')' - -// this one has to use the /g flag -re[COMPARATORTRIM] = new RegExp(src[COMPARATORTRIM], 'g') -var comparatorTrimReplace = '$1$2$3' - -// Something like `1.2.3 - 1.2.4` -// Note that these all use the loose form, because they'll be -// checked against either the strict or loose comparator form -// later. -var HYPHENRANGE = R++ -src[HYPHENRANGE] = '^\\s*(' + src[XRANGEPLAIN] + ')' + - '\\s+-\\s+' + - '(' + src[XRANGEPLAIN] + ')' + - '\\s*$' - -var HYPHENRANGELOOSE = R++ -src[HYPHENRANGELOOSE] = '^\\s*(' + src[XRANGEPLAINLOOSE] + ')' + - '\\s+-\\s+' + - '(' + src[XRANGEPLAINLOOSE] + ')' + - '\\s*$' - -// Star ranges basically just allow anything at all. -var STAR = R++ -src[STAR] = '(<|>)?=?\\s*\\*' - -// Compile to actual regexp objects. -// All are flag-free, unless they were created above with a flag. -for (var i = 0; i < R; i++) { - debug(i, src[i]) - if (!re[i]) { - re[i] = new RegExp(src[i]) - } -} - -exports.parse = parse -function parse (version, options) { - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } - } +const VERSION = "2.13.3"; - if (version instanceof SemVer) { - return version - } +/** + * Some “list” response that can be paginated have a different response structure + * + * They have a `total_count` key in the response (search also has `incomplete_results`, + * /installation/repositories also has `repository_selection`), as well as a key with + * the list of the items which name varies from endpoint to endpoint. + * + * Octokit normalizes these responses so that paginated results are always returned following + * the same structure. One challenge is that if the list response has only one page, no Link + * header is provided, so this header alone is not sufficient to check wether a response is + * paginated or not. + * + * We check if a "total_count" key is present in the response data, but also make sure that + * a "url" property is not, as the "Get the combined status for a specific ref" endpoint would + * otherwise match: https://developer.github.com/v3/repos/statuses/#get-the-combined-status-for-a-specific-ref + */ +function normalizePaginatedListResponse(response) { + const responseNeedsNormalization = "total_count" in response.data && !("url" in response.data); + if (!responseNeedsNormalization) return response; // keep the additional properties intact as there is currently no other way + // to retrieve the same information. - if (typeof version !== 'string') { - return null - } + const incompleteResults = response.data.incomplete_results; + const repositorySelection = response.data.repository_selection; + const totalCount = response.data.total_count; + delete response.data.incomplete_results; + delete response.data.repository_selection; + delete response.data.total_count; + const namespaceKey = Object.keys(response.data)[0]; + const data = response.data[namespaceKey]; + response.data = data; - if (version.length > MAX_LENGTH) { - return null + if (typeof incompleteResults !== "undefined") { + response.data.incomplete_results = incompleteResults; } - var r = options.loose ? re[LOOSE] : re[FULL] - if (!r.test(version)) { - return null + if (typeof repositorySelection !== "undefined") { + response.data.repository_selection = repositorySelection; } - try { - return new SemVer(version, options) - } catch (er) { - return null - } + response.data.total_count = totalCount; + return response; } -exports.valid = valid -function valid (version, options) { - var v = parse(version, options) - return v ? v.version : null -} +function iterator(octokit, route, parameters) { + const options = typeof route === "function" ? route.endpoint(parameters) : octokit.request.endpoint(route, parameters); + const requestMethod = typeof route === "function" ? route : octokit.request; + const method = options.method; + const headers = options.headers; + let url = options.url; + return { + [Symbol.asyncIterator]: () => ({ + async next() { + if (!url) return { + done: true + }; + const response = await requestMethod({ + method, + url, + headers + }); + const normalizedResponse = normalizePaginatedListResponse(response); // `response.headers.link` format: + // '; rel="next", ; rel="last"' + // sets `url` to undefined if "next" URL is not present or `link` header is not set + + url = ((normalizedResponse.headers.link || "").match(/<([^>]+)>;\s*rel="next"/) || [])[1]; + return { + value: normalizedResponse + }; + } -exports.clean = clean -function clean (version, options) { - var s = parse(version.trim().replace(/^[=v]+/, ''), options) - return s ? s.version : null + }) + }; } -exports.SemVer = SemVer - -function SemVer (version, options) { - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } - } - if (version instanceof SemVer) { - if (version.loose === options.loose) { - return version - } else { - version = version.version - } - } else if (typeof version !== 'string') { - throw new TypeError('Invalid Version: ' + version) - } - - if (version.length > MAX_LENGTH) { - throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters') +function paginate(octokit, route, parameters, mapFn) { + if (typeof parameters === "function") { + mapFn = parameters; + parameters = undefined; } - if (!(this instanceof SemVer)) { - return new SemVer(version, options) - } + return gather(octokit, [], iterator(octokit, route, parameters)[Symbol.asyncIterator](), mapFn); +} - debug('SemVer', version, options) - this.options = options - this.loose = !!options.loose +function gather(octokit, results, iterator, mapFn) { + return iterator.next().then(result => { + if (result.done) { + return results; + } - var m = version.trim().match(options.loose ? re[LOOSE] : re[FULL]) + let earlyExit = false; - if (!m) { - throw new TypeError('Invalid Version: ' + version) - } + function done() { + earlyExit = true; + } - this.raw = version + results = results.concat(mapFn ? mapFn(result.value, done) : result.value.data); - // these are actually numbers - this.major = +m[1] - this.minor = +m[2] - this.patch = +m[3] + if (earlyExit) { + return results; + } - if (this.major > MAX_SAFE_INTEGER || this.major < 0) { - throw new TypeError('Invalid major version') - } + return gather(octokit, results, iterator, mapFn); + }); +} - if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) { - throw new TypeError('Invalid minor version') - } +const composePaginateRest = Object.assign(paginate, { + iterator +}); - if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) { - throw new TypeError('Invalid patch version') - } +const paginatingEndpoints = ["GET /app/installations", "GET /applications/grants", "GET /authorizations", "GET /enterprises/{enterprise}/actions/permissions/organizations", "GET /enterprises/{enterprise}/actions/runner-groups", "GET /enterprises/{enterprise}/actions/runner-groups/{runner_group_id}/organizations", "GET /enterprises/{enterprise}/actions/runner-groups/{runner_group_id}/runners", "GET /enterprises/{enterprise}/actions/runners", "GET /enterprises/{enterprise}/actions/runners/downloads", "GET /events", "GET /gists", "GET /gists/public", "GET /gists/starred", "GET /gists/{gist_id}/comments", "GET /gists/{gist_id}/commits", "GET /gists/{gist_id}/forks", "GET /installation/repositories", "GET /issues", "GET /marketplace_listing/plans", "GET /marketplace_listing/plans/{plan_id}/accounts", "GET /marketplace_listing/stubbed/plans", "GET /marketplace_listing/stubbed/plans/{plan_id}/accounts", "GET /networks/{owner}/{repo}/events", "GET /notifications", "GET /organizations", "GET /orgs/{org}/actions/permissions/repositories", "GET /orgs/{org}/actions/runner-groups", "GET /orgs/{org}/actions/runner-groups/{runner_group_id}/repositories", "GET /orgs/{org}/actions/runner-groups/{runner_group_id}/runners", "GET /orgs/{org}/actions/runners", "GET /orgs/{org}/actions/runners/downloads", "GET /orgs/{org}/actions/secrets", "GET /orgs/{org}/actions/secrets/{secret_name}/repositories", "GET /orgs/{org}/blocks", "GET /orgs/{org}/credential-authorizations", "GET /orgs/{org}/events", "GET /orgs/{org}/failed_invitations", "GET /orgs/{org}/hooks", "GET /orgs/{org}/installations", "GET /orgs/{org}/invitations", "GET /orgs/{org}/invitations/{invitation_id}/teams", "GET /orgs/{org}/issues", "GET /orgs/{org}/members", "GET /orgs/{org}/migrations", "GET /orgs/{org}/migrations/{migration_id}/repositories", "GET /orgs/{org}/outside_collaborators", "GET /orgs/{org}/projects", "GET /orgs/{org}/public_members", "GET /orgs/{org}/repos", "GET /orgs/{org}/team-sync/groups", "GET /orgs/{org}/teams", "GET /orgs/{org}/teams/{team_slug}/discussions", "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments", "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions", "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions", "GET /orgs/{org}/teams/{team_slug}/invitations", "GET /orgs/{org}/teams/{team_slug}/members", "GET /orgs/{org}/teams/{team_slug}/projects", "GET /orgs/{org}/teams/{team_slug}/repos", "GET /orgs/{org}/teams/{team_slug}/team-sync/group-mappings", "GET /orgs/{org}/teams/{team_slug}/teams", "GET /projects/columns/{column_id}/cards", "GET /projects/{project_id}/collaborators", "GET /projects/{project_id}/columns", "GET /repos/{owner}/{repo}/actions/artifacts", "GET /repos/{owner}/{repo}/actions/runners", "GET /repos/{owner}/{repo}/actions/runners/downloads", "GET /repos/{owner}/{repo}/actions/runs", "GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts", "GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs", "GET /repos/{owner}/{repo}/actions/secrets", "GET /repos/{owner}/{repo}/actions/workflows", "GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs", "GET /repos/{owner}/{repo}/assignees", "GET /repos/{owner}/{repo}/branches", "GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations", "GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs", "GET /repos/{owner}/{repo}/code-scanning/alerts", "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances", "GET /repos/{owner}/{repo}/code-scanning/analyses", "GET /repos/{owner}/{repo}/collaborators", "GET /repos/{owner}/{repo}/comments", "GET /repos/{owner}/{repo}/comments/{comment_id}/reactions", "GET /repos/{owner}/{repo}/commits", "GET /repos/{owner}/{repo}/commits/{commit_sha}/branches-where-head", "GET /repos/{owner}/{repo}/commits/{commit_sha}/comments", "GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls", "GET /repos/{owner}/{repo}/commits/{ref}/check-runs", "GET /repos/{owner}/{repo}/commits/{ref}/check-suites", "GET /repos/{owner}/{repo}/commits/{ref}/statuses", "GET /repos/{owner}/{repo}/contributors", "GET /repos/{owner}/{repo}/deployments", "GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses", "GET /repos/{owner}/{repo}/events", "GET /repos/{owner}/{repo}/forks", "GET /repos/{owner}/{repo}/git/matching-refs/{ref}", "GET /repos/{owner}/{repo}/hooks", "GET /repos/{owner}/{repo}/invitations", "GET /repos/{owner}/{repo}/issues", "GET /repos/{owner}/{repo}/issues/comments", "GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions", "GET /repos/{owner}/{repo}/issues/events", "GET /repos/{owner}/{repo}/issues/{issue_number}/comments", "GET /repos/{owner}/{repo}/issues/{issue_number}/events", "GET /repos/{owner}/{repo}/issues/{issue_number}/labels", "GET /repos/{owner}/{repo}/issues/{issue_number}/reactions", "GET /repos/{owner}/{repo}/issues/{issue_number}/timeline", "GET /repos/{owner}/{repo}/keys", "GET /repos/{owner}/{repo}/labels", "GET /repos/{owner}/{repo}/milestones", "GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels", "GET /repos/{owner}/{repo}/notifications", "GET /repos/{owner}/{repo}/pages/builds", "GET /repos/{owner}/{repo}/projects", "GET /repos/{owner}/{repo}/pulls", "GET /repos/{owner}/{repo}/pulls/comments", "GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions", "GET /repos/{owner}/{repo}/pulls/{pull_number}/comments", "GET /repos/{owner}/{repo}/pulls/{pull_number}/commits", "GET /repos/{owner}/{repo}/pulls/{pull_number}/files", "GET /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers", "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews", "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments", "GET /repos/{owner}/{repo}/releases", "GET /repos/{owner}/{repo}/releases/{release_id}/assets", "GET /repos/{owner}/{repo}/secret-scanning/alerts", "GET /repos/{owner}/{repo}/stargazers", "GET /repos/{owner}/{repo}/subscribers", "GET /repos/{owner}/{repo}/tags", "GET /repos/{owner}/{repo}/teams", "GET /repositories", "GET /repositories/{repository_id}/environments/{environment_name}/secrets", "GET /scim/v2/enterprises/{enterprise}/Groups", "GET /scim/v2/enterprises/{enterprise}/Users", "GET /scim/v2/organizations/{org}/Users", "GET /search/code", "GET /search/commits", "GET /search/issues", "GET /search/labels", "GET /search/repositories", "GET /search/topics", "GET /search/users", "GET /teams/{team_id}/discussions", "GET /teams/{team_id}/discussions/{discussion_number}/comments", "GET /teams/{team_id}/discussions/{discussion_number}/comments/{comment_number}/reactions", "GET /teams/{team_id}/discussions/{discussion_number}/reactions", "GET /teams/{team_id}/invitations", "GET /teams/{team_id}/members", "GET /teams/{team_id}/projects", "GET /teams/{team_id}/repos", "GET /teams/{team_id}/team-sync/group-mappings", "GET /teams/{team_id}/teams", "GET /user/blocks", "GET /user/emails", "GET /user/followers", "GET /user/following", "GET /user/gpg_keys", "GET /user/installations", "GET /user/installations/{installation_id}/repositories", "GET /user/issues", "GET /user/keys", "GET /user/marketplace_purchases", "GET /user/marketplace_purchases/stubbed", "GET /user/memberships/orgs", "GET /user/migrations", "GET /user/migrations/{migration_id}/repositories", "GET /user/orgs", "GET /user/public_emails", "GET /user/repos", "GET /user/repository_invitations", "GET /user/starred", "GET /user/subscriptions", "GET /user/teams", "GET /users", "GET /users/{username}/events", "GET /users/{username}/events/orgs/{org}", "GET /users/{username}/events/public", "GET /users/{username}/followers", "GET /users/{username}/following", "GET /users/{username}/gists", "GET /users/{username}/gpg_keys", "GET /users/{username}/keys", "GET /users/{username}/orgs", "GET /users/{username}/projects", "GET /users/{username}/received_events", "GET /users/{username}/received_events/public", "GET /users/{username}/repos", "GET /users/{username}/starred", "GET /users/{username}/subscriptions"]; - // numberify any prerelease numeric ids - if (!m[4]) { - this.prerelease = [] +function isPaginatingEndpoint(arg) { + if (typeof arg === "string") { + return paginatingEndpoints.includes(arg); } else { - this.prerelease = m[4].split('.').map(function (id) { - if (/^[0-9]+$/.test(id)) { - var num = +id - if (num >= 0 && num < MAX_SAFE_INTEGER) { - return num - } - } - return id - }) + return false; } - - this.build = m[5] ? m[5].split('.') : [] - this.format() } -SemVer.prototype.format = function () { - this.version = this.major + '.' + this.minor + '.' + this.patch - if (this.prerelease.length) { - this.version += '-' + this.prerelease.join('.') - } - return this.version -} +/** + * @param octokit Octokit instance + * @param options Options passed to Octokit constructor + */ -SemVer.prototype.toString = function () { - return this.version +function paginateRest(octokit) { + return { + paginate: Object.assign(paginate.bind(null, octokit), { + iterator: iterator.bind(null, octokit) + }) + }; } +paginateRest.VERSION = VERSION; -SemVer.prototype.compare = function (other) { - debug('SemVer.compare', this.version, this.options, other) - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } +exports.composePaginateRest = composePaginateRest; +exports.isPaginatingEndpoint = isPaginatingEndpoint; +exports.paginateRest = paginateRest; +exports.paginatingEndpoints = paginatingEndpoints; +//# sourceMappingURL=index.js.map - return this.compareMain(other) || this.comparePre(other) -} -SemVer.prototype.compareMain = function (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } +/***/ }), - return compareIdentifiers(this.major, other.major) || - compareIdentifiers(this.minor, other.minor) || - compareIdentifiers(this.patch, other.patch) -} +/***/ 303: +/***/ (function(module, __unusedexports, __webpack_require__) { -SemVer.prototype.comparePre = function (other) { - if (!(other instanceof SemVer)) { - other = new SemVer(other, this.options) - } +"use strict"; - // NOT having a prerelease is > having one - if (this.prerelease.length && !other.prerelease.length) { - return -1 - } else if (!this.prerelease.length && other.prerelease.length) { - return 1 - } else if (!this.prerelease.length && !other.prerelease.length) { - return 0 - } +const MiniPass = __webpack_require__(720) +const Pax = __webpack_require__(582) +const Header = __webpack_require__(232) +const ReadEntry = __webpack_require__(662) +const fs = __webpack_require__(747) +const path = __webpack_require__(622) - var i = 0 - do { - var a = this.prerelease[i] - var b = other.prerelease[i] - debug('prerelease compare', i, a, b) - if (a === undefined && b === undefined) { - return 0 - } else if (b === undefined) { - return 1 - } else if (a === undefined) { - return -1 - } else if (a === b) { - continue - } else { - return compareIdentifiers(a, b) - } - } while (++i) -} - -// preminor will bump the version up to the next minor release, and immediately -// down to pre-release. premajor and prepatch work the same way. -SemVer.prototype.inc = function (release, identifier) { - switch (release) { - case 'premajor': - this.prerelease.length = 0 - this.patch = 0 - this.minor = 0 - this.major++ - this.inc('pre', identifier) - break - case 'preminor': - this.prerelease.length = 0 - this.patch = 0 - this.minor++ - this.inc('pre', identifier) - break - case 'prepatch': - // If this is already a prerelease, it will bump to the next version - // drop any prereleases that might already exist, since they are not - // relevant at this point. - this.prerelease.length = 0 - this.inc('patch', identifier) - this.inc('pre', identifier) - break - // If the input is a non-prerelease version, this acts the same as - // prepatch. - case 'prerelease': - if (this.prerelease.length === 0) { - this.inc('patch', identifier) - } - this.inc('pre', identifier) - break - - case 'major': - // If this is a pre-major version, bump up to the same major version. - // Otherwise increment major. - // 1.0.0-5 bumps to 1.0.0 - // 1.1.0 bumps to 2.0.0 - if (this.minor !== 0 || - this.patch !== 0 || - this.prerelease.length === 0) { - this.major++ - } - this.minor = 0 - this.patch = 0 - this.prerelease = [] - break - case 'minor': - // If this is a pre-minor version, bump up to the same minor version. - // Otherwise increment minor. - // 1.2.0-5 bumps to 1.2.0 - // 1.2.1 bumps to 1.3.0 - if (this.patch !== 0 || this.prerelease.length === 0) { - this.minor++ - } - this.patch = 0 - this.prerelease = [] - break - case 'patch': - // If this is not a pre-release version, it will increment the patch. - // If it is a pre-release it will bump up to the same patch version. - // 1.2.0-5 patches to 1.2.0 - // 1.2.0 patches to 1.2.1 - if (this.prerelease.length === 0) { - this.patch++ - } - this.prerelease = [] - break - // This probably shouldn't be used publicly. - // 1.0.0 "pre" would become 1.0.0-0 which is the wrong direction. - case 'pre': - if (this.prerelease.length === 0) { - this.prerelease = [0] - } else { - var i = this.prerelease.length - while (--i >= 0) { - if (typeof this.prerelease[i] === 'number') { - this.prerelease[i]++ - i = -2 - } - } - if (i === -1) { - // didn't increment anything - this.prerelease.push(0) - } - } - if (identifier) { - // 1.2.0-beta.1 bumps to 1.2.0-beta.2, - // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0 - if (this.prerelease[0] === identifier) { - if (isNaN(this.prerelease[1])) { - this.prerelease = [identifier, 0] - } - } else { - this.prerelease = [identifier, 0] - } - } - break +const types = __webpack_require__(554) +const maxReadSize = 16 * 1024 * 1024 +const PROCESS = Symbol('process') +const FILE = Symbol('file') +const DIRECTORY = Symbol('directory') +const SYMLINK = Symbol('symlink') +const HARDLINK = Symbol('hardlink') +const HEADER = Symbol('header') +const READ = Symbol('read') +const LSTAT = Symbol('lstat') +const ONLSTAT = Symbol('onlstat') +const ONREAD = Symbol('onread') +const ONREADLINK = Symbol('onreadlink') +const OPENFILE = Symbol('openfile') +const ONOPENFILE = Symbol('onopenfile') +const CLOSE = Symbol('close') +const MODE = Symbol('mode') +const warner = __webpack_require__(796) +const winchars = __webpack_require__(478) - default: - throw new Error('invalid increment argument: ' + release) - } - this.format() - this.raw = this.version - return this -} +const modeFix = __webpack_require__(904) -exports.inc = inc -function inc (version, release, loose, identifier) { - if (typeof (loose) === 'string') { - identifier = loose - loose = undefined - } +const WriteEntry = warner(class WriteEntry extends MiniPass { + constructor (p, opt) { + opt = opt || {} + super(opt) + if (typeof p !== 'string') + throw new TypeError('path is required') + this.path = p + // suppress atime, ctime, uid, gid, uname, gname + this.portable = !!opt.portable + // until node has builtin pwnam functions, this'll have to do + this.myuid = process.getuid && process.getuid() + this.myuser = process.env.USER || '' + this.maxReadSize = opt.maxReadSize || maxReadSize + this.linkCache = opt.linkCache || new Map() + this.statCache = opt.statCache || new Map() + this.preservePaths = !!opt.preservePaths + this.cwd = opt.cwd || process.cwd() + this.strict = !!opt.strict + this.noPax = !!opt.noPax + this.noMtime = !!opt.noMtime + this.mtime = opt.mtime || null - try { - return new SemVer(version, loose).inc(release, identifier).version - } catch (er) { - return null - } -} + if (typeof opt.onwarn === 'function') + this.on('warn', opt.onwarn) -exports.diff = diff -function diff (version1, version2) { - if (eq(version1, version2)) { - return null - } else { - var v1 = parse(version1) - var v2 = parse(version2) - var prefix = '' - if (v1.prerelease.length || v2.prerelease.length) { - prefix = 'pre' - var defaultResult = 'prerelease' - } - for (var key in v1) { - if (key === 'major' || key === 'minor' || key === 'patch') { - if (v1[key] !== v2[key]) { - return prefix + key - } - } + let pathWarn = false + if (!this.preservePaths && path.win32.isAbsolute(p)) { + // absolutes on posix are also absolutes on win32 + // so we only need to test this one to get both + const parsed = path.win32.parse(p) + this.path = p.substr(parsed.root.length) + pathWarn = parsed.root } - return defaultResult // may be undefined - } -} - -exports.compareIdentifiers = compareIdentifiers - -var numeric = /^[0-9]+$/ -function compareIdentifiers (a, b) { - var anum = numeric.test(a) - var bnum = numeric.test(b) - - if (anum && bnum) { - a = +a - b = +b - } - - return a === b ? 0 - : (anum && !bnum) ? -1 - : (bnum && !anum) ? 1 - : a < b ? -1 - : 1 -} - -exports.rcompareIdentifiers = rcompareIdentifiers -function rcompareIdentifiers (a, b) { - return compareIdentifiers(b, a) -} - -exports.major = major -function major (a, loose) { - return new SemVer(a, loose).major -} - -exports.minor = minor -function minor (a, loose) { - return new SemVer(a, loose).minor -} - -exports.patch = patch -function patch (a, loose) { - return new SemVer(a, loose).patch -} - -exports.compare = compare -function compare (a, b, loose) { - return new SemVer(a, loose).compare(new SemVer(b, loose)) -} - -exports.compareLoose = compareLoose -function compareLoose (a, b) { - return compare(a, b, true) -} - -exports.rcompare = rcompare -function rcompare (a, b, loose) { - return compare(b, a, loose) -} - -exports.sort = sort -function sort (list, loose) { - return list.sort(function (a, b) { - return exports.compare(a, b, loose) - }) -} - -exports.rsort = rsort -function rsort (list, loose) { - return list.sort(function (a, b) { - return exports.rcompare(a, b, loose) - }) -} - -exports.gt = gt -function gt (a, b, loose) { - return compare(a, b, loose) > 0 -} - -exports.lt = lt -function lt (a, b, loose) { - return compare(a, b, loose) < 0 -} - -exports.eq = eq -function eq (a, b, loose) { - return compare(a, b, loose) === 0 -} - -exports.neq = neq -function neq (a, b, loose) { - return compare(a, b, loose) !== 0 -} - -exports.gte = gte -function gte (a, b, loose) { - return compare(a, b, loose) >= 0 -} - -exports.lte = lte -function lte (a, b, loose) { - return compare(a, b, loose) <= 0 -} - -exports.cmp = cmp -function cmp (a, op, b, loose) { - switch (op) { - case '===': - if (typeof a === 'object') - a = a.version - if (typeof b === 'object') - b = b.version - return a === b - case '!==': - if (typeof a === 'object') - a = a.version - if (typeof b === 'object') - b = b.version - return a !== b - - case '': - case '=': - case '==': - return eq(a, b, loose) - - case '!=': - return neq(a, b, loose) - - case '>': - return gt(a, b, loose) + this.win32 = !!opt.win32 || process.platform === 'win32' + if (this.win32) { + this.path = winchars.decode(this.path.replace(/\\/g, '/')) + p = p.replace(/\\/g, '/') + } - case '>=': - return gte(a, b, loose) + this.absolute = opt.absolute || path.resolve(this.cwd, p) - case '<': - return lt(a, b, loose) + if (this.path === '') + this.path = './' - case '<=': - return lte(a, b, loose) + if (pathWarn) { + this.warn('TAR_ENTRY_INFO', `stripping ${pathWarn} from absolute path`, { + entry: this, + path: pathWarn + this.path, + }) + } - default: - throw new TypeError('Invalid operator: ' + op) + if (this.statCache.has(this.absolute)) + this[ONLSTAT](this.statCache.get(this.absolute)) + else + this[LSTAT]() } -} -exports.Comparator = Comparator -function Comparator (comp, options) { - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } + [LSTAT] () { + fs.lstat(this.absolute, (er, stat) => { + if (er) + return this.emit('error', er) + this[ONLSTAT](stat) + }) } - if (comp instanceof Comparator) { - if (comp.loose === !!options.loose) { - return comp - } else { - comp = comp.value - } + [ONLSTAT] (stat) { + this.statCache.set(this.absolute, stat) + this.stat = stat + if (!stat.isFile()) + stat.size = 0 + this.type = getType(stat) + this.emit('stat', stat) + this[PROCESS]() } - if (!(this instanceof Comparator)) { - return new Comparator(comp, options) + [PROCESS] () { + switch (this.type) { + case 'File': return this[FILE]() + case 'Directory': return this[DIRECTORY]() + case 'SymbolicLink': return this[SYMLINK]() + // unsupported types are ignored. + default: return this.end() + } } - debug('comparator', comp, options) - this.options = options - this.loose = !!options.loose - this.parse(comp) - - if (this.semver === ANY) { - this.value = '' - } else { - this.value = this.operator + this.semver.version + [MODE] (mode) { + return modeFix(mode, this.type === 'Directory', this.portable) } - debug('comp', this) -} + [HEADER] () { + if (this.type === 'Directory' && this.portable) + this.noMtime = true -var ANY = {} -Comparator.prototype.parse = function (comp) { - var r = this.options.loose ? re[COMPARATORLOOSE] : re[COMPARATOR] - var m = comp.match(r) + this.header = new Header({ + path: this.path, + linkpath: this.linkpath, + // only the permissions and setuid/setgid/sticky bitflags + // not the higher-order bits that specify file type + mode: this[MODE](this.stat.mode), + uid: this.portable ? null : this.stat.uid, + gid: this.portable ? null : this.stat.gid, + size: this.stat.size, + mtime: this.noMtime ? null : this.mtime || this.stat.mtime, + type: this.type, + uname: this.portable ? null : + this.stat.uid === this.myuid ? this.myuser : '', + atime: this.portable ? null : this.stat.atime, + ctime: this.portable ? null : this.stat.ctime + }) - if (!m) { - throw new TypeError('Invalid comparator: ' + comp) + if (this.header.encode() && !this.noPax) + this.write(new Pax({ + atime: this.portable ? null : this.header.atime, + ctime: this.portable ? null : this.header.ctime, + gid: this.portable ? null : this.header.gid, + mtime: this.noMtime ? null : this.mtime || this.header.mtime, + path: this.path, + linkpath: this.linkpath, + size: this.header.size, + uid: this.portable ? null : this.header.uid, + uname: this.portable ? null : this.header.uname, + dev: this.portable ? null : this.stat.dev, + ino: this.portable ? null : this.stat.ino, + nlink: this.portable ? null : this.stat.nlink + }).encode()) + this.write(this.header.block) } - this.operator = m[1] - if (this.operator === '=') { - this.operator = '' + [DIRECTORY] () { + if (this.path.substr(-1) !== '/') + this.path += '/' + this.stat.size = 0 + this[HEADER]() + this.end() } - // if it literally is just '>' or '' then allow anything. - if (!m[2]) { - this.semver = ANY - } else { - this.semver = new SemVer(m[2], this.options.loose) + [SYMLINK] () { + fs.readlink(this.absolute, (er, linkpath) => { + if (er) + return this.emit('error', er) + this[ONREADLINK](linkpath) + }) } -} - -Comparator.prototype.toString = function () { - return this.value -} -Comparator.prototype.test = function (version) { - debug('Comparator.test', version, this.options.loose) + [ONREADLINK] (linkpath) { + this.linkpath = linkpath + this[HEADER]() + this.end() + } - if (this.semver === ANY) { - return true - } - - if (typeof version === 'string') { - version = new SemVer(version, this.options) - } - - return cmp(version, this.operator, this.semver, this.options) -} - -Comparator.prototype.intersects = function (comp, options) { - if (!(comp instanceof Comparator)) { - throw new TypeError('a Comparator is required') - } - - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false - } - } - - var rangeTmp - - if (this.operator === '') { - rangeTmp = new Range(comp.value, options) - return satisfies(this.value, rangeTmp, options) - } else if (comp.operator === '') { - rangeTmp = new Range(this.value, options) - return satisfies(comp.semver, rangeTmp, options) + [HARDLINK] (linkpath) { + this.type = 'Link' + this.linkpath = path.relative(this.cwd, linkpath) + this.stat.size = 0 + this[HEADER]() + this.end() } - var sameDirectionIncreasing = - (this.operator === '>=' || this.operator === '>') && - (comp.operator === '>=' || comp.operator === '>') - var sameDirectionDecreasing = - (this.operator === '<=' || this.operator === '<') && - (comp.operator === '<=' || comp.operator === '<') - var sameSemVer = this.semver.version === comp.semver.version - var differentDirectionsInclusive = - (this.operator === '>=' || this.operator === '<=') && - (comp.operator === '>=' || comp.operator === '<=') - var oppositeDirectionsLessThan = - cmp(this.semver, '<', comp.semver, options) && - ((this.operator === '>=' || this.operator === '>') && - (comp.operator === '<=' || comp.operator === '<')) - var oppositeDirectionsGreaterThan = - cmp(this.semver, '>', comp.semver, options) && - ((this.operator === '<=' || this.operator === '<') && - (comp.operator === '>=' || comp.operator === '>')) - - return sameDirectionIncreasing || sameDirectionDecreasing || - (sameSemVer && differentDirectionsInclusive) || - oppositeDirectionsLessThan || oppositeDirectionsGreaterThan -} - -exports.Range = Range -function Range (range, options) { - if (!options || typeof options !== 'object') { - options = { - loose: !!options, - includePrerelease: false + [FILE] () { + if (this.stat.nlink > 1) { + const linkKey = this.stat.dev + ':' + this.stat.ino + if (this.linkCache.has(linkKey)) { + const linkpath = this.linkCache.get(linkKey) + if (linkpath.indexOf(this.cwd) === 0) + return this[HARDLINK](linkpath) + } + this.linkCache.set(linkKey, this.absolute) } - } - if (range instanceof Range) { - if (range.loose === !!options.loose && - range.includePrerelease === !!options.includePrerelease) { - return range - } else { - return new Range(range.raw, options) - } - } + this[HEADER]() + if (this.stat.size === 0) + return this.end() - if (range instanceof Comparator) { - return new Range(range.value, options) + this[OPENFILE]() } - if (!(this instanceof Range)) { - return new Range(range, options) + [OPENFILE] () { + fs.open(this.absolute, 'r', (er, fd) => { + if (er) + return this.emit('error', er) + this[ONOPENFILE](fd) + }) } - this.options = options - this.loose = !!options.loose - this.includePrerelease = !!options.includePrerelease - - // First, split based on boolean or || - this.raw = range - this.set = range.split(/\s*\|\|\s*/).map(function (range) { - return this.parseRange(range.trim()) - }, this).filter(function (c) { - // throw out any that are not relevant for whatever reason - return c.length - }) - - if (!this.set.length) { - throw new TypeError('Invalid SemVer Range: ' + range) + [ONOPENFILE] (fd) { + const blockLen = 512 * Math.ceil(this.stat.size / 512) + const bufLen = Math.min(blockLen, this.maxReadSize) + const buf = Buffer.allocUnsafe(bufLen) + this[READ](fd, buf, 0, buf.length, 0, this.stat.size, blockLen) } - this.format() -} - -Range.prototype.format = function () { - this.range = this.set.map(function (comps) { - return comps.join(' ').trim() - }).join('||').trim() - return this.range -} - -Range.prototype.toString = function () { - return this.range -} - -Range.prototype.parseRange = function (range) { - var loose = this.options.loose - range = range.trim() - // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4` - var hr = loose ? re[HYPHENRANGELOOSE] : re[HYPHENRANGE] - range = range.replace(hr, hyphenReplace) - debug('hyphen replace', range) - // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5` - range = range.replace(re[COMPARATORTRIM], comparatorTrimReplace) - debug('comparator trim', range, re[COMPARATORTRIM]) - - // `~ 1.2.3` => `~1.2.3` - range = range.replace(re[TILDETRIM], tildeTrimReplace) - - // `^ 1.2.3` => `^1.2.3` - range = range.replace(re[CARETTRIM], caretTrimReplace) - - // normalize spaces - range = range.split(/\s+/).join(' ') - - // At this point, the range is completely trimmed and - // ready to be split into comparators. - - var compRe = loose ? re[COMPARATORLOOSE] : re[COMPARATOR] - var set = range.split(' ').map(function (comp) { - return parseComparator(comp, this.options) - }, this).join(' ').split(/\s+/) - if (this.options.loose) { - // in loose mode, throw out any that are not valid comparators - set = set.filter(function (comp) { - return !!comp.match(compRe) + [READ] (fd, buf, offset, length, pos, remain, blockRemain) { + fs.read(fd, buf, offset, length, pos, (er, bytesRead) => { + if (er) { + // ignoring the error from close(2) is a bad practice, but at + // this point we already have an error, don't need another one + return this[CLOSE](fd, () => this.emit('error', er)) + } + this[ONREAD](fd, buf, offset, length, pos, remain, blockRemain, bytesRead) }) } - set = set.map(function (comp) { - return new Comparator(comp, this.options) - }, this) - - return set -} -Range.prototype.intersects = function (range, options) { - if (!(range instanceof Range)) { - throw new TypeError('a Range is required') + [CLOSE] (fd, cb) { + fs.close(fd, cb) } - return this.set.some(function (thisComparators) { - return thisComparators.every(function (thisComparator) { - return range.set.some(function (rangeComparators) { - return rangeComparators.every(function (rangeComparator) { - return thisComparator.intersects(rangeComparator, options) - }) - }) - }) - }) -} - -// Mostly just for testing and legacy API reasons -exports.toComparators = toComparators -function toComparators (range, options) { - return new Range(range, options).set.map(function (comp) { - return comp.map(function (c) { - return c.value - }).join(' ').trim().split(' ') - }) -} - -// comprised of xranges, tildes, stars, and gtlt's at this point. -// already replaced the hyphen ranges -// turn into a set of JUST comparators. -function parseComparator (comp, options) { - debug('comp', comp, options) - comp = replaceCarets(comp, options) - debug('caret', comp) - comp = replaceTildes(comp, options) - debug('tildes', comp) - comp = replaceXRanges(comp, options) - debug('xrange', comp) - comp = replaceStars(comp, options) - debug('stars', comp) - return comp -} - -function isX (id) { - return !id || id.toLowerCase() === 'x' || id === '*' -} - -// ~, ~> --> * (any, kinda silly) -// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0 -// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0 -// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0 -// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0 -// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0 -function replaceTildes (comp, options) { - return comp.trim().split(/\s+/).map(function (comp) { - return replaceTilde(comp, options) - }).join(' ') -} - -function replaceTilde (comp, options) { - var r = options.loose ? re[TILDELOOSE] : re[TILDE] - return comp.replace(r, function (_, M, m, p, pr) { - debug('tilde', comp, _, M, m, p, pr) - var ret - - if (isX(M)) { - ret = '' - } else if (isX(m)) { - ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0' - } else if (isX(p)) { - // ~1.2 == >=1.2.0 <1.3.0 - ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0' - } else if (pr) { - debug('replaceTilde pr', pr) - ret = '>=' + M + '.' + m + '.' + p + '-' + pr + - ' <' + M + '.' + (+m + 1) + '.0' - } else { - // ~1.2.3 == >=1.2.3 <1.3.0 - ret = '>=' + M + '.' + m + '.' + p + - ' <' + M + '.' + (+m + 1) + '.0' + [ONREAD] (fd, buf, offset, length, pos, remain, blockRemain, bytesRead) { + if (bytesRead <= 0 && remain > 0) { + const er = new Error('encountered unexpected EOF') + er.path = this.absolute + er.syscall = 'read' + er.code = 'EOF' + return this[CLOSE](fd, () => this.emit('error', er)) } - debug('tilde return', ret) - return ret - }) -} + if (bytesRead > remain) { + const er = new Error('did not encounter expected EOF') + er.path = this.absolute + er.syscall = 'read' + er.code = 'EOF' + return this[CLOSE](fd, () => this.emit('error', er)) + } -// ^ --> * (any, kinda silly) -// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0 -// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0 -// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0 -// ^1.2.3 --> >=1.2.3 <2.0.0 -// ^1.2.0 --> >=1.2.0 <2.0.0 -function replaceCarets (comp, options) { - return comp.trim().split(/\s+/).map(function (comp) { - return replaceCaret(comp, options) - }).join(' ') -} - -function replaceCaret (comp, options) { - debug('caret', comp, options) - var r = options.loose ? re[CARETLOOSE] : re[CARET] - return comp.replace(r, function (_, M, m, p, pr) { - debug('caret', comp, _, M, m, p, pr) - var ret - - if (isX(M)) { - ret = '' - } else if (isX(m)) { - ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0' - } else if (isX(p)) { - if (M === '0') { - ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0' - } else { - ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0' - } - } else if (pr) { - debug('replaceCaret pr', pr) - if (M === '0') { - if (m === '0') { - ret = '>=' + M + '.' + m + '.' + p + '-' + pr + - ' <' + M + '.' + m + '.' + (+p + 1) - } else { - ret = '>=' + M + '.' + m + '.' + p + '-' + pr + - ' <' + M + '.' + (+m + 1) + '.0' - } - } else { - ret = '>=' + M + '.' + m + '.' + p + '-' + pr + - ' <' + (+M + 1) + '.0.0' - } - } else { - debug('no pr') - if (M === '0') { - if (m === '0') { - ret = '>=' + M + '.' + m + '.' + p + - ' <' + M + '.' + m + '.' + (+p + 1) - } else { - ret = '>=' + M + '.' + m + '.' + p + - ' <' + M + '.' + (+m + 1) + '.0' - } - } else { - ret = '>=' + M + '.' + m + '.' + p + - ' <' + (+M + 1) + '.0.0' + // null out the rest of the buffer, if we could fit the block padding + if (bytesRead === remain) { + for (let i = bytesRead; i < length && bytesRead < blockRemain; i++) { + buf[i + offset] = 0 + bytesRead ++ + remain ++ } } - debug('caret return', ret) - return ret - }) -} - -function replaceXRanges (comp, options) { - debug('replaceXRanges', comp, options) - return comp.split(/\s+/).map(function (comp) { - return replaceXRange(comp, options) - }).join(' ') -} + const writeBuf = offset === 0 && bytesRead === buf.length ? + buf : buf.slice(offset, offset + bytesRead) + remain -= bytesRead + blockRemain -= bytesRead + pos += bytesRead + offset += bytesRead -function replaceXRange (comp, options) { - comp = comp.trim() - var r = options.loose ? re[XRANGELOOSE] : re[XRANGE] - return comp.replace(r, function (ret, gtlt, M, m, p, pr) { - debug('xRange', comp, ret, gtlt, M, m, p, pr) - var xM = isX(M) - var xm = xM || isX(m) - var xp = xm || isX(p) - var anyX = xp + this.write(writeBuf) - if (gtlt === '=' && anyX) { - gtlt = '' + if (!remain) { + if (blockRemain) + this.write(Buffer.alloc(blockRemain)) + return this[CLOSE](fd, er => er ? this.emit('error', er) : this.end()) } - if (xM) { - if (gtlt === '>' || gtlt === '<') { - // nothing is allowed - ret = '<0.0.0' - } else { - // nothing is forbidden - ret = '*' - } - } else if (gtlt && anyX) { - // we know patch is an x, because we have any x at all. - // replace X with 0 - if (xm) { - m = 0 - } - p = 0 - - if (gtlt === '>') { - // >1 => >=2.0.0 - // >1.2 => >=1.3.0 - // >1.2.3 => >= 1.2.4 - gtlt = '>=' - if (xm) { - M = +M + 1 - m = 0 - p = 0 - } else { - m = +m + 1 - p = 0 - } - } else if (gtlt === '<=') { - // <=0.7.x is actually <0.8.0, since any 0.7.x should - // pass. Similarly, <=7.x is actually <8.0.0, etc. - gtlt = '<' - if (xm) { - M = +M + 1 - } else { - m = +m + 1 - } - } - - ret = gtlt + M + '.' + m + '.' + p - } else if (xm) { - ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0' - } else if (xp) { - ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0' + if (offset >= length) { + buf = Buffer.allocUnsafe(length) + offset = 0 } - - debug('xRange return', ret) - - return ret - }) -} - -// Because * is AND-ed with everything else in the comparator, -// and '' means "any version", just remove the *s entirely. -function replaceStars (comp, options) { - debug('replaceStars', comp, options) - // Looseness is ignored here. star is always as loose as it gets! - return comp.trim().replace(re[STAR], '') -} - -// This function is passed to string.replace(re[HYPHENRANGE]) -// M, m, patch, prerelease, build -// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5 -// 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do -// 1.2 - 3.4 => >=1.2.0 <3.5.0 -function hyphenReplace ($0, - from, fM, fm, fp, fpr, fb, - to, tM, tm, tp, tpr, tb) { - if (isX(fM)) { - from = '' - } else if (isX(fm)) { - from = '>=' + fM + '.0.0' - } else if (isX(fp)) { - from = '>=' + fM + '.' + fm + '.0' - } else { - from = '>=' + from - } - - if (isX(tM)) { - to = '' - } else if (isX(tm)) { - to = '<' + (+tM + 1) + '.0.0' - } else if (isX(tp)) { - to = '<' + tM + '.' + (+tm + 1) + '.0' - } else if (tpr) { - to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr - } else { - to = '<=' + to + length = buf.length - offset + this[READ](fd, buf, offset, length, pos, remain, blockRemain) } +}) - return (from + ' ' + to).trim() -} - -// if ANY of the sets match ALL of its comparators, then pass -Range.prototype.test = function (version) { - if (!version) { - return false +class WriteEntrySync extends WriteEntry { + constructor (path, opt) { + super(path, opt) } - if (typeof version === 'string') { - version = new SemVer(version, this.options) + [LSTAT] () { + this[ONLSTAT](fs.lstatSync(this.absolute)) } - for (var i = 0; i < this.set.length; i++) { - if (testSet(this.set[i], version, this.options)) { - return true - } + [SYMLINK] () { + this[ONREADLINK](fs.readlinkSync(this.absolute)) } - return false -} -function testSet (set, version, options) { - for (var i = 0; i < set.length; i++) { - if (!set[i].test(version)) { - return false - } + [OPENFILE] () { + this[ONOPENFILE](fs.openSync(this.absolute, 'r')) } - if (version.prerelease.length && !options.includePrerelease) { - // Find the set of versions that are allowed to have prereleases - // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0 - // That should allow `1.2.3-pr.2` to pass. - // However, `1.2.4-alpha.notready` should NOT be allowed, - // even though it's within the range set by the comparators. - for (i = 0; i < set.length; i++) { - debug(set[i].semver) - if (set[i].semver === ANY) { - continue - } - - if (set[i].semver.prerelease.length > 0) { - var allowed = set[i].semver - if (allowed.major === version.major && - allowed.minor === version.minor && - allowed.patch === version.patch) { - return true - } - } + [READ] (fd, buf, offset, length, pos, remain, blockRemain) { + let threw = true + try { + const bytesRead = fs.readSync(fd, buf, offset, length, pos) + this[ONREAD](fd, buf, offset, length, pos, remain, blockRemain, bytesRead) + threw = false + } finally { + // ignoring the error from close(2) is a bad practice, but at + // this point we already have an error, don't need another one + if (threw) + try { this[CLOSE](fd, () => {}) } catch (er) {} } - - // Version has a -pre, but it's not one of the ones we like. - return false } - return true -} - -exports.satisfies = satisfies -function satisfies (version, range, options) { - try { - range = new Range(range, options) - } catch (er) { - return false + [CLOSE] (fd, cb) { + fs.closeSync(fd) + cb() } - return range.test(version) } -exports.maxSatisfying = maxSatisfying -function maxSatisfying (versions, range, options) { - var max = null - var maxSV = null - try { - var rangeObj = new Range(range, options) - } catch (er) { - return null - } - versions.forEach(function (v) { - if (rangeObj.test(v)) { - // satisfies(v, range, options) - if (!max || maxSV.compare(v) === -1) { - // compare(max, v, true) - max = v - maxSV = new SemVer(max, options) - } - } - }) - return max -} +const WriteEntryTar = warner(class WriteEntryTar extends MiniPass { + constructor (readEntry, opt) { + opt = opt || {} + super(opt) + this.preservePaths = !!opt.preservePaths + this.portable = !!opt.portable + this.strict = !!opt.strict + this.noPax = !!opt.noPax + this.noMtime = !!opt.noMtime -exports.minSatisfying = minSatisfying -function minSatisfying (versions, range, options) { - var min = null - var minSV = null - try { - var rangeObj = new Range(range, options) - } catch (er) { - return null - } - versions.forEach(function (v) { - if (rangeObj.test(v)) { - // satisfies(v, range, options) - if (!min || minSV.compare(v) === 1) { - // compare(min, v, true) - min = v - minSV = new SemVer(min, options) - } - } - }) - return min -} + this.readEntry = readEntry + this.type = readEntry.type + if (this.type === 'Directory' && this.portable) + this.noMtime = true -exports.minVersion = minVersion -function minVersion (range, loose) { - range = new Range(range, loose) + this.path = readEntry.path + this.mode = this[MODE](readEntry.mode) + this.uid = this.portable ? null : readEntry.uid + this.gid = this.portable ? null : readEntry.gid + this.uname = this.portable ? null : readEntry.uname + this.gname = this.portable ? null : readEntry.gname + this.size = readEntry.size + this.mtime = this.noMtime ? null : opt.mtime || readEntry.mtime + this.atime = this.portable ? null : readEntry.atime + this.ctime = this.portable ? null : readEntry.ctime + this.linkpath = readEntry.linkpath - var minver = new SemVer('0.0.0') - if (range.test(minver)) { - return minver - } + if (typeof opt.onwarn === 'function') + this.on('warn', opt.onwarn) - minver = new SemVer('0.0.0-0') - if (range.test(minver)) { - return minver - } + let pathWarn = false + if (path.isAbsolute(this.path) && !this.preservePaths) { + const parsed = path.parse(this.path) + pathWarn = parsed.root + this.path = this.path.substr(parsed.root.length) + } - minver = null - for (var i = 0; i < range.set.length; ++i) { - var comparators = range.set[i] + this.remain = readEntry.size + this.blockRemain = readEntry.startBlockSize - comparators.forEach(function (comparator) { - // Clone to avoid manipulating the comparator's semver object. - var compver = new SemVer(comparator.semver.version) - switch (comparator.operator) { - case '>': - if (compver.prerelease.length === 0) { - compver.patch++ - } else { - compver.prerelease.push(0) - } - compver.raw = compver.format() - /* fallthrough */ - case '': - case '>=': - if (!minver || gt(minver, compver)) { - minver = compver - } - break - case '<': - case '<=': - /* Ignore maximum versions */ - break - /* istanbul ignore next */ - default: - throw new Error('Unexpected operation: ' + comparator.operator) - } + this.header = new Header({ + path: this.path, + linkpath: this.linkpath, + // only the permissions and setuid/setgid/sticky bitflags + // not the higher-order bits that specify file type + mode: this.mode, + uid: this.portable ? null : this.uid, + gid: this.portable ? null : this.gid, + size: this.size, + mtime: this.noMtime ? null : this.mtime, + type: this.type, + uname: this.portable ? null : this.uname, + atime: this.portable ? null : this.atime, + ctime: this.portable ? null : this.ctime }) - } - if (minver && range.test(minver)) { - return minver - } + if (pathWarn) { + this.warn('TAR_ENTRY_INFO', `stripping ${pathWarn} from absolute path`, { + entry: this, + path: pathWarn + this.path, + }) + } - return null -} + if (this.header.encode() && !this.noPax) + super.write(new Pax({ + atime: this.portable ? null : this.atime, + ctime: this.portable ? null : this.ctime, + gid: this.portable ? null : this.gid, + mtime: this.noMtime ? null : this.mtime, + path: this.path, + linkpath: this.linkpath, + size: this.size, + uid: this.portable ? null : this.uid, + uname: this.portable ? null : this.uname, + dev: this.portable ? null : this.readEntry.dev, + ino: this.portable ? null : this.readEntry.ino, + nlink: this.portable ? null : this.readEntry.nlink + }).encode()) -exports.validRange = validRange -function validRange (range, options) { - try { - // Return '*' instead of '' so that truthiness works. - // This will throw if it's invalid anyway - return new Range(range, options).range || '*' - } catch (er) { - return null + super.write(this.header.block) + readEntry.pipe(this) } -} - -// Determine if version is less than all the versions possible in the range -exports.ltr = ltr -function ltr (version, range, options) { - return outside(version, range, '<', options) -} - -// Determine if version is greater than all the versions possible in the range. -exports.gtr = gtr -function gtr (version, range, options) { - return outside(version, range, '>', options) -} - -exports.outside = outside -function outside (version, range, hilo, options) { - version = new SemVer(version, options) - range = new Range(range, options) - var gtfn, ltefn, ltfn, comp, ecomp - switch (hilo) { - case '>': - gtfn = gt - ltefn = lte - ltfn = lt - comp = '>' - ecomp = '>=' - break - case '<': - gtfn = lt - ltefn = gte - ltfn = gt - comp = '<' - ecomp = '<=' - break - default: - throw new TypeError('Must provide a hilo val of "<" or ">"') + [MODE] (mode) { + return modeFix(mode, this.type === 'Directory', this.portable) } - // If it satisifes the range it is not outside - if (satisfies(version, range, options)) { - return false + write (data) { + const writeLen = data.length + if (writeLen > this.blockRemain) + throw new Error('writing more to entry than is appropriate') + this.blockRemain -= writeLen + return super.write(data) } - // From now on, variable terms are as if we're in "gtr" mode. - // but note that everything is flipped for the "ltr" function. - - for (var i = 0; i < range.set.length; ++i) { - var comparators = range.set[i] + end () { + if (this.blockRemain) + this.write(Buffer.alloc(this.blockRemain)) + return super.end() + } +}) - var high = null - var low = null +WriteEntry.Sync = WriteEntrySync +WriteEntry.Tar = WriteEntryTar - comparators.forEach(function (comparator) { - if (comparator.semver === ANY) { - comparator = new Comparator('>=0.0.0') - } - high = high || comparator - low = low || comparator - if (gtfn(comparator.semver, high.semver, options)) { - high = comparator - } else if (ltfn(comparator.semver, low.semver, options)) { - low = comparator - } - }) +const getType = stat => + stat.isFile() ? 'File' + : stat.isDirectory() ? 'Directory' + : stat.isSymbolicLink() ? 'SymbolicLink' + : 'Unsupported' - // If the edge version comparator has a operator then our version - // isn't outside it - if (high.operator === comp || high.operator === ecomp) { - return false - } +module.exports = WriteEntry - // If the lowest version comparator has an operator and our version - // is less than it then it isn't higher than the range - if ((!low.operator || low.operator === comp) && - ltefn(version, low.semver)) { - return false - } else if (low.operator === ecomp && ltfn(version, low.semver)) { - return false - } - } - return true -} -exports.prerelease = prerelease -function prerelease (version, options) { - var parsed = parse(version, options) - return (parsed && parsed.prerelease.length) ? parsed.prerelease : null -} +/***/ }), -exports.intersects = intersects -function intersects (r1, r2, options) { - r1 = new Range(r1, options) - r2 = new Range(r2, options) - return r1.intersects(r2) -} +/***/ 304: +/***/ (function(module) { -exports.coerce = coerce -function coerce (version) { - if (version instanceof SemVer) { - return version - } +module.exports = require("string_decoder"); - if (typeof version !== 'string') { - return null - } +/***/ }), - var match = version.match(re[COERCE]) +/***/ 325: +/***/ (function(__unusedmodule, exports, __webpack_require__) { - if (match == null) { - return null - } +"use strict"; - return parse(match[1] + - '.' + (match[2] || '0') + - '.' + (match[3] || '0')) +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const core = __importStar(__webpack_require__(470)); +const downloader_1 = __webpack_require__(379); +const github_1 = __webpack_require__(146); +const trivy_1 = __webpack_require__(737); +function run() { + return __awaiter(this, void 0, void 0, function* () { + const trivyVersion = core.getInput('trivy_version').replace(/^v/, ''); + const image = core.getInput('image') || process.env.IMAGE_NAME; + if (!image) { + throw new Error('Please specify scan target image name'); + } + const trivyOption = { + severity: core.getInput('severity').replace(/\s+/g, ''), + vulnType: core.getInput('vuln_type').replace(/\s+/g, ''), + ignoreUnfixed: core.getInput('ignore_unfixed').toLowerCase() === 'true', + template: core.getInput('template') || __webpack_require__.ab + "default.tpl", + }; + const downloader = new downloader_1.Downloader(); + const trivyCmdPath = yield downloader.download(trivyVersion); + const result = trivy_1.scan(trivyCmdPath, image, trivyOption); + if (!result) { + return; + } + const issueOption = { + title: core.getInput('issue_title'), + body: result, + labels: core + .getInput('issue_label') + .replace(/\s+/g, '') + .split(','), + assignees: core + .getInput('issue_assignee') + .replace(/\s+/g, '') + .split(','), + }; + const token = core.getInput('token', { required: true }); + const github = new github_1.GitHub(token); + const output = yield github.createOrUpdateIssue(image, issueOption); + core.setOutput('html_url', output.htmlUrl); + core.setOutput('issue_number', output.issueNumber.toString()); + if (core.getInput('fail_on_vulnerabilities') === 'true') { + throw new Error('Abnormal termination because vulnerabilities found'); + } + }); } +run().catch(err => core.setFailed(err.message)); /***/ }), -/***/ 293: +/***/ 357: /***/ (function(module) { -module.exports = require("buffer"); +module.exports = require("assert"); /***/ }), -/***/ 294: -/***/ (function(module, __unusedexports, __webpack_require__) { - -module.exports = parseOptions; - -const { Deprecation } = __webpack_require__(692); -const { getUserAgent } = __webpack_require__(526); -const once = __webpack_require__(969); - -const pkg = __webpack_require__(215); - -const deprecateOptionsTimeout = once((log, deprecation) => - log.warn(deprecation) -); -const deprecateOptionsAgent = once((log, deprecation) => log.warn(deprecation)); -const deprecateOptionsHeaders = once((log, deprecation) => - log.warn(deprecation) -); +/***/ 379: +/***/ (function(__unusedmodule, exports, __webpack_require__) { -function parseOptions(options, log, hook) { - if (options.headers) { - options.headers = Object.keys(options.headers).reduce((newObj, key) => { - newObj[key.toLowerCase()] = options.headers[key]; - return newObj; - }, {}); - } +"use strict"; - const clientDefaults = { - headers: options.headers || {}, - request: options.request || {}, - mediaType: { - previews: [], - format: "" +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Downloader = void 0; +const fs_1 = __importDefault(__webpack_require__(747)); +const zlib_1 = __importDefault(__webpack_require__(761)); +const tar_1 = __importDefault(__webpack_require__(885)); +const core = __importStar(__webpack_require__(470)); +const rest_1 = __webpack_require__(889); +const node_fetch_1 = __importDefault(__webpack_require__(454)); +class Downloader { + constructor() { + this.trivyRepo = { + owner: 'aquasecurity', + repo: 'trivy', + }; } - }; + download(version, trivyCmdDir = __dirname) { + return __awaiter(this, void 0, void 0, function* () { + const os = this.checkPlatform(process.platform); + const downloadUrl = yield this.getDownloadUrl(version, os); + console.debug(`Download URL: ${downloadUrl}`); + const trivyCmdBaseDir = process.env.GITHUB_WORKSPACE || trivyCmdDir; + const trivyCmdPath = yield this.downloadTrivyCmd(downloadUrl, trivyCmdBaseDir); + console.debug(`Trivy Command Path: ${trivyCmdPath}`); + return trivyCmdPath; + }); + } + checkPlatform(platform) { + switch (platform) { + case 'linux': + return 'Linux'; + case 'darwin': + return 'macOS'; + default: + const errorMsg = `Sorry, ${platform} is not supported. + Trivy support Linux, MacOS, FreeBSD and OpenBSD.`; + throw new Error(errorMsg); + } + } + getDownloadUrl(version, os) { + return __awaiter(this, void 0, void 0, function* () { + try { + const response = yield this.getAssets(version); + const filename = `trivy_${response.version}_${os}-64bit.tar.gz`; + for (const asset of response.assets) { + if (asset.name === filename) { + return asset.browser_download_url; + } + } + throw new Error(`${filename} does not include in GitHub releases`); + } + catch (err) { + core.error(err.message); + const errMsg = `Could not find Trivy asset that you specified. + Version: ${version} + OS: ${os} + `; + throw new Error(errMsg); + } + }); + } + getAssets(version) { + return __awaiter(this, void 0, void 0, function* () { + let response; + const client = new rest_1.Octokit(); + if (version === 'latest') { + response = yield client.repos.getLatestRelease(Object.assign({}, this.trivyRepo)); + version = response.data.tag_name.replace(/v/, ''); + } + else { + response = yield client.repos.getReleaseByTag(Object.assign(Object.assign({}, this.trivyRepo), { tag: `v${version}` })); + } + return { assets: response.data.assets, version }; + }); + } + downloadTrivyCmd(downloadUrl, savedPath = '.') { + return __awaiter(this, void 0, void 0, function* () { + const response = yield node_fetch_1.default(downloadUrl); + return new Promise((resolve, reject) => { + const gunzip = zlib_1.default.createGunzip(); + const extract = tar_1.default.extract({ C: savedPath }, ['trivy']); + response.body + .on('error', reject) + .pipe(gunzip) + .on('error', reject) + .pipe(extract) + .on('error', reject) + .on('finish', () => { + if (!this.trivyExists(savedPath)) { + reject('Failed to extract Trivy command file.'); + } + resolve(`${savedPath}/trivy`); + }); + }); + }); + } + trivyExists(targetDir) { + const trivyCmdPaths = fs_1.default + .readdirSync(targetDir) + .filter(f => f === 'trivy'); + return trivyCmdPaths.length === 1; + } +} +exports.Downloader = Downloader; - if (options.baseUrl) { - clientDefaults.baseUrl = options.baseUrl; - } - if (options.userAgent) { - clientDefaults.headers["user-agent"] = options.userAgent; - } +/***/ }), - if (options.previews) { - clientDefaults.mediaType.previews = options.previews; - } +/***/ 381: +/***/ (function(module, __unusedexports, __webpack_require__) { - if (options.timeZone) { - clientDefaults.headers["time-zone"] = options.timeZone; - } +"use strict"; - if (options.timeout) { - deprecateOptionsTimeout( - log, - new Deprecation( - "[@octokit/rest] new Octokit({timeout}) is deprecated. Use {request: {timeout}} instead. See https://github.com/octokit/request.js#request" - ) - ); - clientDefaults.request.timeout = options.timeout; - } - if (options.agent) { - deprecateOptionsAgent( - log, - new Deprecation( - "[@octokit/rest] new Octokit({agent}) is deprecated. Use {request: {agent}} instead. See https://github.com/octokit/request.js#request" - ) - ); - clientDefaults.request.agent = options.agent; - } +// XXX: This shares a lot in common with extract.js +// maybe some DRY opportunity here? - if (options.headers) { - deprecateOptionsHeaders( - log, - new Deprecation( - "[@octokit/rest] new Octokit({headers}) is deprecated. Use {userAgent, previews} instead. See https://github.com/octokit/request.js#request" - ) - ); - } +// tar -t +const hlo = __webpack_require__(891) +const Parser = __webpack_require__(203) +const fs = __webpack_require__(747) +const fsm = __webpack_require__(827) +const path = __webpack_require__(622) - const userAgentOption = clientDefaults.headers["user-agent"]; - const defaultUserAgent = `octokit.js/${pkg.version} ${getUserAgent()}`; +const t = module.exports = (opt_, files, cb) => { + if (typeof opt_ === 'function') + cb = opt_, files = null, opt_ = {} + else if (Array.isArray(opt_)) + files = opt_, opt_ = {} + + if (typeof files === 'function') + cb = files, files = null + + if (!files) + files = [] + else + files = Array.from(files) + + const opt = hlo(opt_) + + if (opt.sync && typeof cb === 'function') + throw new TypeError('callback not supported for sync tar functions') + + if (!opt.file && typeof cb === 'function') + throw new TypeError('callback only supported with file option') - clientDefaults.headers["user-agent"] = [userAgentOption, defaultUserAgent] - .filter(Boolean) - .join(" "); + if (files.length) + filesFilter(opt, files) - clientDefaults.request.hook = hook.bind(null, "request"); + if (!opt.noResume) + onentryFunction(opt) - return clientDefaults; + return opt.file && opt.sync ? listFileSync(opt) + : opt.file ? listFile(opt, cb) + : list(opt) } +const onentryFunction = opt => { + const onentry = opt.onentry + opt.onentry = onentry ? e => { + onentry(e) + e.resume() + } : e => e.resume() +} -/***/ }), +// construct a filter that limits the file entries listed +// include child entries if a dir is included +const filesFilter = (opt, files) => { + const map = new Map(files.map(f => [f.replace(/\/+$/, ''), true])) + const filter = opt.filter -/***/ 297: -/***/ (function(module) { + const mapHas = (file, r) => { + const root = r || path.parse(file).root || '.' + const ret = file === root ? false + : map.has(file) ? map.get(file) + : mapHas(path.dirname(file), root) -module.exports = class HttpError extends Error { - constructor (message, code, headers) { - super(message) + map.set(file, ret) + return ret + } - // Maintains proper stack trace (only available on V8) - /* istanbul ignore next */ - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor) - } + opt.filter = filter + ? (file, entry) => filter(file, entry) && mapHas(file.replace(/\/+$/, '')) + : file => mapHas(file.replace(/\/+$/, '')) +} - this.name = 'HttpError' - this.code = code - this.headers = headers +const listFileSync = opt => { + const p = list(opt) + const file = opt.file + let threw = true + let fd + try { + const stat = fs.statSync(file) + const readSize = opt.maxReadSize || 16*1024*1024 + if (stat.size < readSize) { + p.end(fs.readFileSync(file)) + } else { + let pos = 0 + const buf = Buffer.allocUnsafe(readSize) + fd = fs.openSync(file, 'r') + while (pos < stat.size) { + let bytesRead = fs.readSync(fd, buf, 0, readSize, pos) + pos += bytesRead + p.write(buf.slice(0, bytesRead)) + } + p.end() + } + threw = false + } finally { + if (threw && fd) + try { fs.closeSync(fd) } catch (er) {} } } +const listFile = (opt, cb) => { + const parse = new Parser(opt) + const readSize = opt.maxReadSize || 16*1024*1024 + + const file = opt.file + const p = new Promise((resolve, reject) => { + parse.on('error', reject) + parse.on('end', resolve) + + fs.stat(file, (er, stat) => { + if (er) + reject(er) + else { + const stream = new fsm.ReadStream(file, { + readSize: readSize, + size: stat.size + }) + stream.on('error', reject) + stream.pipe(parse) + } + }) + }) + return cb ? p.then(cb, cb) : p +} + +const list = opt => new Parser(opt) + /***/ }), -/***/ 299: -/***/ (function(__unusedmodule, exports) { +/***/ 385: +/***/ (function(__unusedmodule, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, '__esModule', { value: true }); -const VERSION = "1.1.2"; - -/** - * Some “list” response that can be paginated have a different response structure - * - * They have a `total_count` key in the response (search also has `incomplete_results`, - * /installation/repositories also has `repository_selection`), as well as a key with - * the list of the items which name varies from endpoint to endpoint: - * - * - https://developer.github.com/v3/search/#example (key `items`) - * - https://developer.github.com/v3/checks/runs/#response-3 (key: `check_runs`) - * - https://developer.github.com/v3/checks/suites/#response-1 (key: `check_suites`) - * - https://developer.github.com/v3/apps/installations/#list-repositories (key: `repositories`) - * - https://developer.github.com/v3/apps/installations/#list-installations-for-a-user (key `installations`) - * - * Octokit normalizes these responses so that paginated results are always returned following - * the same structure. One challenge is that if the list response has only one page, no Link - * header is provided, so this header alone is not sufficient to check wether a response is - * paginated or not. For the exceptions with the namespace, a fallback check for the route - * paths has to be added in order to normalize the response. We cannot check for the total_count - * property because it also exists in the response of Get the combined status for a specific ref. - */ -const REGEX = [/^\/search\//, /^\/repos\/[^/]+\/[^/]+\/commits\/[^/]+\/(check-runs|check-suites)([^/]|$)/, /^\/installation\/repositories([^/]|$)/, /^\/user\/installations([^/]|$)/, /^\/repos\/[^/]+\/[^/]+\/actions\/secrets([^/]|$)/, /^\/repos\/[^/]+\/[^/]+\/actions\/workflows(\/[^/]+\/runs)?([^/]|$)/, /^\/repos\/[^/]+\/[^/]+\/actions\/runs(\/[^/]+\/(artifacts|jobs))?([^/]|$)/]; -function normalizePaginatedListResponse(octokit, url, response) { - const path = url.replace(octokit.request.endpoint.DEFAULTS.baseUrl, ""); - const responseNeedsNormalization = REGEX.find(regex => regex.test(path)); - if (!responseNeedsNormalization) return; // keep the additional properties intact as there is currently no other way - // to retrieve the same information. - - const incompleteResults = response.data.incomplete_results; - const repositorySelection = response.data.repository_selection; - const totalCount = response.data.total_count; - delete response.data.incomplete_results; - delete response.data.repository_selection; - delete response.data.total_count; - const namespaceKey = Object.keys(response.data)[0]; - const data = response.data[namespaceKey]; - response.data = data; +var isPlainObject = __webpack_require__(3); +var universalUserAgent = __webpack_require__(526); - if (typeof incompleteResults !== "undefined") { - response.data.incomplete_results = incompleteResults; +function lowercaseKeys(object) { + if (!object) { + return {}; } - if (typeof repositorySelection !== "undefined") { - response.data.repository_selection = repositorySelection; - } + return Object.keys(object).reduce((newObj, key) => { + newObj[key.toLowerCase()] = object[key]; + return newObj; + }, {}); +} - response.data.total_count = totalCount; - Object.defineProperty(response.data, namespaceKey, { - get() { - octokit.log.warn(`[@octokit/paginate-rest] "response.data.${namespaceKey}" is deprecated for "GET ${path}". Get the results directly from "response.data"`); - return Array.from(data); +function mergeDeep(defaults, options) { + const result = Object.assign({}, defaults); + Object.keys(options).forEach(key => { + if (isPlainObject.isPlainObject(options[key])) { + if (!(key in defaults)) Object.assign(result, { + [key]: options[key] + });else result[key] = mergeDeep(defaults[key], options[key]); + } else { + Object.assign(result, { + [key]: options[key] + }); } - }); + return result; } -function iterator(octokit, route, parameters) { - const options = octokit.request.endpoint(route, parameters); - const method = options.method; - const headers = options.headers; - let url = options.url; - return { - [Symbol.asyncIterator]: () => ({ - next() { - if (!url) { - return Promise.resolve({ - done: true - }); - } - - return octokit.request({ - method, - url, - headers - }).then(response => { - normalizePaginatedListResponse(octokit, url, response); // `response.headers.link` format: - // '; rel="next", ; rel="last"' - // sets `url` to undefined if "next" URL is not present or `link` header is not set - - url = ((response.headers.link || "").match(/<([^>]+)>;\s*rel="next"/) || [])[1]; - return { - value: response - }; - }); - } +function removeUndefinedProperties(obj) { + for (const key in obj) { + if (obj[key] === undefined) { + delete obj[key]; + } + } - }) - }; + return obj; } -function paginate(octokit, route, parameters, mapFn) { - if (typeof parameters === "function") { - mapFn = parameters; - parameters = undefined; - } +function merge(defaults, route, options) { + if (typeof route === "string") { + let [method, url] = route.split(" "); + options = Object.assign(url ? { + method, + url + } : { + url: method + }, options); + } else { + options = Object.assign({}, route); + } // lowercase header names before merging with defaults to avoid duplicates - return gather(octokit, [], iterator(octokit, route, parameters)[Symbol.asyncIterator](), mapFn); -} -function gather(octokit, results, iterator, mapFn) { - return iterator.next().then(result => { - if (result.done) { - return results; - } + options.headers = lowercaseKeys(options.headers); // remove properties with undefined values before merging - let earlyExit = false; + removeUndefinedProperties(options); + removeUndefinedProperties(options.headers); + const mergedOptions = mergeDeep(defaults || {}, options); // mediaType.previews arrays are merged, instead of overwritten - function done() { - earlyExit = true; - } + if (defaults && defaults.mediaType.previews.length) { + mergedOptions.mediaType.previews = defaults.mediaType.previews.filter(preview => !mergedOptions.mediaType.previews.includes(preview)).concat(mergedOptions.mediaType.previews); + } - results = results.concat(mapFn ? mapFn(result.value, done) : result.value.data); + mergedOptions.mediaType.previews = mergedOptions.mediaType.previews.map(preview => preview.replace(/-preview/, "")); + return mergedOptions; +} - if (earlyExit) { - return results; +function addQueryParameters(url, parameters) { + const separator = /\?/.test(url) ? "&" : "?"; + const names = Object.keys(parameters); + + if (names.length === 0) { + return url; + } + + return url + separator + names.map(name => { + if (name === "q") { + return "q=" + parameters.q.split("+").map(encodeURIComponent).join("+"); } - return gather(octokit, results, iterator, mapFn); - }); + return `${name}=${encodeURIComponent(parameters[name])}`; + }).join("&"); } -/** - * @param octokit Octokit instance - * @param options Options passed to Octokit constructor - */ +const urlVariableRegex = /\{[^}]+\}/g; -function paginateRest(octokit) { - return { - paginate: Object.assign(paginate.bind(null, octokit), { - iterator: iterator.bind(null, octokit) - }) - }; +function removeNonChars(variableName) { + return variableName.replace(/^\W+|\W+$/g, "").split(/,/); } -paginateRest.VERSION = VERSION; -exports.paginateRest = paginateRest; -//# sourceMappingURL=index.js.map +function extractUrlVariableNames(url) { + const matches = url.match(urlVariableRegex); + if (!matches) { + return []; + } -/***/ }), - -/***/ 303: -/***/ (function(module, __unusedexports, __webpack_require__) { + return matches.map(removeNonChars).reduce((a, b) => a.concat(b), []); +} -"use strict"; +function omit(object, keysToOmit) { + return Object.keys(object).filter(option => !keysToOmit.includes(option)).reduce((obj, key) => { + obj[key] = object[key]; + return obj; + }, {}); +} -const MiniPass = __webpack_require__(720) -const Pax = __webpack_require__(582) -const Header = __webpack_require__(232) -const ReadEntry = __webpack_require__(662) -const fs = __webpack_require__(747) -const path = __webpack_require__(622) +// Based on https://github.com/bramstein/url-template, licensed under BSD +// TODO: create separate package. +// +// Copyright (c) 2012-2014, Bram Stein +// All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// 3. The name of the author may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +// EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -const types = __webpack_require__(554) -const maxReadSize = 16 * 1024 * 1024 -const PROCESS = Symbol('process') -const FILE = Symbol('file') -const DIRECTORY = Symbol('directory') -const SYMLINK = Symbol('symlink') -const HARDLINK = Symbol('hardlink') -const HEADER = Symbol('header') -const READ = Symbol('read') -const LSTAT = Symbol('lstat') -const ONLSTAT = Symbol('onlstat') -const ONREAD = Symbol('onread') -const ONREADLINK = Symbol('onreadlink') -const OPENFILE = Symbol('openfile') -const ONOPENFILE = Symbol('onopenfile') -const CLOSE = Symbol('close') -const MODE = Symbol('mode') -const warner = __webpack_require__(796) -const winchars = __webpack_require__(478) +/* istanbul ignore file */ +function encodeReserved(str) { + return str.split(/(%[0-9A-Fa-f]{2})/g).map(function (part) { + if (!/%[0-9A-Fa-f]/.test(part)) { + part = encodeURI(part).replace(/%5B/g, "[").replace(/%5D/g, "]"); + } -const modeFix = __webpack_require__(904) + return part; + }).join(""); +} -const WriteEntry = warner(class WriteEntry extends MiniPass { - constructor (p, opt) { - opt = opt || {} - super(opt) - if (typeof p !== 'string') - throw new TypeError('path is required') - this.path = p - // suppress atime, ctime, uid, gid, uname, gname - this.portable = !!opt.portable - // until node has builtin pwnam functions, this'll have to do - this.myuid = process.getuid && process.getuid() - this.myuser = process.env.USER || '' - this.maxReadSize = opt.maxReadSize || maxReadSize - this.linkCache = opt.linkCache || new Map() - this.statCache = opt.statCache || new Map() - this.preservePaths = !!opt.preservePaths - this.cwd = opt.cwd || process.cwd() - this.strict = !!opt.strict - this.noPax = !!opt.noPax - this.noMtime = !!opt.noMtime - this.mtime = opt.mtime || null +function encodeUnreserved(str) { + return encodeURIComponent(str).replace(/[!'()*]/g, function (c) { + return "%" + c.charCodeAt(0).toString(16).toUpperCase(); + }); +} - if (typeof opt.onwarn === 'function') - this.on('warn', opt.onwarn) +function encodeValue(operator, value, key) { + value = operator === "+" || operator === "#" ? encodeReserved(value) : encodeUnreserved(value); - let pathWarn = false - if (!this.preservePaths && path.win32.isAbsolute(p)) { - // absolutes on posix are also absolutes on win32 - // so we only need to test this one to get both - const parsed = path.win32.parse(p) - this.path = p.substr(parsed.root.length) - pathWarn = parsed.root - } + if (key) { + return encodeUnreserved(key) + "=" + value; + } else { + return value; + } +} - this.win32 = !!opt.win32 || process.platform === 'win32' - if (this.win32) { - this.path = winchars.decode(this.path.replace(/\\/g, '/')) - p = p.replace(/\\/g, '/') - } +function isDefined(value) { + return value !== undefined && value !== null; +} - this.absolute = opt.absolute || path.resolve(this.cwd, p) +function isKeyOperator(operator) { + return operator === ";" || operator === "&" || operator === "?"; +} - if (this.path === '') - this.path = './' +function getValues(context, operator, key, modifier) { + var value = context[key], + result = []; - if (pathWarn) { - this.warn('TAR_ENTRY_INFO', `stripping ${pathWarn} from absolute path`, { - entry: this, - path: pathWarn + this.path, - }) - } + if (isDefined(value) && value !== "") { + if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") { + value = value.toString(); - if (this.statCache.has(this.absolute)) - this[ONLSTAT](this.statCache.get(this.absolute)) - else - this[LSTAT]() - } + if (modifier && modifier !== "*") { + value = value.substring(0, parseInt(modifier, 10)); + } - [LSTAT] () { - fs.lstat(this.absolute, (er, stat) => { - if (er) - return this.emit('error', er) - this[ONLSTAT](stat) - }) - } + result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : "")); + } else { + if (modifier === "*") { + if (Array.isArray(value)) { + value.filter(isDefined).forEach(function (value) { + result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : "")); + }); + } else { + Object.keys(value).forEach(function (k) { + if (isDefined(value[k])) { + result.push(encodeValue(operator, value[k], k)); + } + }); + } + } else { + const tmp = []; - [ONLSTAT] (stat) { - this.statCache.set(this.absolute, stat) - this.stat = stat - if (!stat.isFile()) - stat.size = 0 - this.type = getType(stat) - this.emit('stat', stat) - this[PROCESS]() - } + if (Array.isArray(value)) { + value.filter(isDefined).forEach(function (value) { + tmp.push(encodeValue(operator, value)); + }); + } else { + Object.keys(value).forEach(function (k) { + if (isDefined(value[k])) { + tmp.push(encodeUnreserved(k)); + tmp.push(encodeValue(operator, value[k].toString())); + } + }); + } - [PROCESS] () { - switch (this.type) { - case 'File': return this[FILE]() - case 'Directory': return this[DIRECTORY]() - case 'SymbolicLink': return this[SYMLINK]() - // unsupported types are ignored. - default: return this.end() + if (isKeyOperator(operator)) { + result.push(encodeUnreserved(key) + "=" + tmp.join(",")); + } else if (tmp.length !== 0) { + result.push(tmp.join(",")); + } + } + } + } else { + if (operator === ";") { + if (isDefined(value)) { + result.push(encodeUnreserved(key)); + } + } else if (value === "" && (operator === "&" || operator === "?")) { + result.push(encodeUnreserved(key) + "="); + } else if (value === "") { + result.push(""); } } - [MODE] (mode) { - return modeFix(mode, this.type === 'Directory', this.portable) - } + return result; +} - [HEADER] () { - if (this.type === 'Directory' && this.portable) - this.noMtime = true +function parseUrl(template) { + return { + expand: expand.bind(null, template) + }; +} - this.header = new Header({ - path: this.path, - linkpath: this.linkpath, - // only the permissions and setuid/setgid/sticky bitflags - // not the higher-order bits that specify file type - mode: this[MODE](this.stat.mode), - uid: this.portable ? null : this.stat.uid, - gid: this.portable ? null : this.stat.gid, - size: this.stat.size, - mtime: this.noMtime ? null : this.mtime || this.stat.mtime, - type: this.type, - uname: this.portable ? null : - this.stat.uid === this.myuid ? this.myuser : '', - atime: this.portable ? null : this.stat.atime, - ctime: this.portable ? null : this.stat.ctime - }) +function expand(template, context) { + var operators = ["+", "#", ".", "/", ";", "?", "&"]; + return template.replace(/\{([^\{\}]+)\}|([^\{\}]+)/g, function (_, expression, literal) { + if (expression) { + let operator = ""; + const values = []; - if (this.header.encode() && !this.noPax) - this.write(new Pax({ - atime: this.portable ? null : this.header.atime, - ctime: this.portable ? null : this.header.ctime, - gid: this.portable ? null : this.header.gid, - mtime: this.noMtime ? null : this.mtime || this.header.mtime, - path: this.path, - linkpath: this.linkpath, - size: this.header.size, - uid: this.portable ? null : this.header.uid, - uname: this.portable ? null : this.header.uname, - dev: this.portable ? null : this.stat.dev, - ino: this.portable ? null : this.stat.ino, - nlink: this.portable ? null : this.stat.nlink - }).encode()) - this.write(this.header.block) - } - - [DIRECTORY] () { - if (this.path.substr(-1) !== '/') - this.path += '/' - this.stat.size = 0 - this[HEADER]() - this.end() - } + if (operators.indexOf(expression.charAt(0)) !== -1) { + operator = expression.charAt(0); + expression = expression.substr(1); + } - [SYMLINK] () { - fs.readlink(this.absolute, (er, linkpath) => { - if (er) - return this.emit('error', er) - this[ONREADLINK](linkpath) - }) - } + expression.split(/,/g).forEach(function (variable) { + var tmp = /([^:\*]*)(?::(\d+)|(\*))?/.exec(variable); + values.push(getValues(context, operator, tmp[1], tmp[2] || tmp[3])); + }); - [ONREADLINK] (linkpath) { - this.linkpath = linkpath - this[HEADER]() - this.end() - } + if (operator && operator !== "+") { + var separator = ","; - [HARDLINK] (linkpath) { - this.type = 'Link' - this.linkpath = path.relative(this.cwd, linkpath) - this.stat.size = 0 - this[HEADER]() - this.end() - } + if (operator === "?") { + separator = "&"; + } else if (operator !== "#") { + separator = operator; + } - [FILE] () { - if (this.stat.nlink > 1) { - const linkKey = this.stat.dev + ':' + this.stat.ino - if (this.linkCache.has(linkKey)) { - const linkpath = this.linkCache.get(linkKey) - if (linkpath.indexOf(this.cwd) === 0) - return this[HARDLINK](linkpath) + return (values.length !== 0 ? operator : "") + values.join(separator); + } else { + return values.join(","); } - this.linkCache.set(linkKey, this.absolute) + } else { + return encodeReserved(literal); } + }); +} - this[HEADER]() - if (this.stat.size === 0) - return this.end() - - this[OPENFILE]() - } +function parse(options) { + // https://fetch.spec.whatwg.org/#methods + let method = options.method.toUpperCase(); // replace :varname with {varname} to make it RFC 6570 compatible - [OPENFILE] () { - fs.open(this.absolute, 'r', (er, fd) => { - if (er) - return this.emit('error', er) - this[ONOPENFILE](fd) - }) - } + let url = (options.url || "/").replace(/:([a-z]\w+)/g, "{$1}"); + let headers = Object.assign({}, options.headers); + let body; + let parameters = omit(options, ["method", "baseUrl", "url", "headers", "request", "mediaType"]); // extract variable names from URL to calculate remaining variables later - [ONOPENFILE] (fd) { - const blockLen = 512 * Math.ceil(this.stat.size / 512) - const bufLen = Math.min(blockLen, this.maxReadSize) - const buf = Buffer.allocUnsafe(bufLen) - this[READ](fd, buf, 0, buf.length, 0, this.stat.size, blockLen) - } + const urlVariableNames = extractUrlVariableNames(url); + url = parseUrl(url).expand(parameters); - [READ] (fd, buf, offset, length, pos, remain, blockRemain) { - fs.read(fd, buf, offset, length, pos, (er, bytesRead) => { - if (er) { - // ignoring the error from close(2) is a bad practice, but at - // this point we already have an error, don't need another one - return this[CLOSE](fd, () => this.emit('error', er)) - } - this[ONREAD](fd, buf, offset, length, pos, remain, blockRemain, bytesRead) - }) + if (!/^http/.test(url)) { + url = options.baseUrl + url; } - [CLOSE] (fd, cb) { - fs.close(fd, cb) - } + const omittedParameters = Object.keys(options).filter(option => urlVariableNames.includes(option)).concat("baseUrl"); + const remainingParameters = omit(parameters, omittedParameters); + const isBinaryRequest = /application\/octet-stream/i.test(headers.accept); - [ONREAD] (fd, buf, offset, length, pos, remain, blockRemain, bytesRead) { - if (bytesRead <= 0 && remain > 0) { - const er = new Error('encountered unexpected EOF') - er.path = this.absolute - er.syscall = 'read' - er.code = 'EOF' - return this[CLOSE](fd, () => this.emit('error', er)) + if (!isBinaryRequest) { + if (options.mediaType.format) { + // e.g. application/vnd.github.v3+json => application/vnd.github.v3.raw + headers.accept = headers.accept.split(/,/).map(preview => preview.replace(/application\/vnd(\.\w+)(\.v3)?(\.\w+)?(\+json)?$/, `application/vnd$1$2.${options.mediaType.format}`)).join(","); } - if (bytesRead > remain) { - const er = new Error('did not encounter expected EOF') - er.path = this.absolute - er.syscall = 'read' - er.code = 'EOF' - return this[CLOSE](fd, () => this.emit('error', er)) + if (options.mediaType.previews.length) { + const previewsFromAcceptHeader = headers.accept.match(/[\w-]+(?=-preview)/g) || []; + headers.accept = previewsFromAcceptHeader.concat(options.mediaType.previews).map(preview => { + const format = options.mediaType.format ? `.${options.mediaType.format}` : "+json"; + return `application/vnd.github.${preview}-preview${format}`; + }).join(","); } + } // for GET/HEAD requests, set URL query parameters from remaining parameters + // for PATCH/POST/PUT/DELETE requests, set request body from remaining parameters - // null out the rest of the buffer, if we could fit the block padding - if (bytesRead === remain) { - for (let i = bytesRead; i < length && bytesRead < blockRemain; i++) { - buf[i + offset] = 0 - bytesRead ++ - remain ++ + + if (["GET", "HEAD"].includes(method)) { + url = addQueryParameters(url, remainingParameters); + } else { + if ("data" in remainingParameters) { + body = remainingParameters.data; + } else { + if (Object.keys(remainingParameters).length) { + body = remainingParameters; + } else { + headers["content-length"] = 0; } } + } // default content-type for JSON if body is set - const writeBuf = offset === 0 && bytesRead === buf.length ? - buf : buf.slice(offset, offset + bytesRead) - remain -= bytesRead - blockRemain -= bytesRead - pos += bytesRead - offset += bytesRead - - this.write(writeBuf) - - if (!remain) { - if (blockRemain) - this.write(Buffer.alloc(blockRemain)) - return this[CLOSE](fd, er => er ? this.emit('error', er) : this.end()) - } - if (offset >= length) { - buf = Buffer.allocUnsafe(length) - offset = 0 - } - length = buf.length - offset - this[READ](fd, buf, offset, length, pos, remain, blockRemain) - } -}) + if (!headers["content-type"] && typeof body !== "undefined") { + headers["content-type"] = "application/json; charset=utf-8"; + } // GitHub expects 'content-length: 0' header for PUT/PATCH requests without body. + // fetch does not allow to set `content-length` header, but we can set body to an empty string -class WriteEntrySync extends WriteEntry { - constructor (path, opt) { - super(path, opt) - } - [LSTAT] () { - this[ONLSTAT](fs.lstatSync(this.absolute)) - } + if (["PATCH", "PUT"].includes(method) && typeof body === "undefined") { + body = ""; + } // Only return body/request keys if present - [SYMLINK] () { - this[ONREADLINK](fs.readlinkSync(this.absolute)) - } - [OPENFILE] () { - this[ONOPENFILE](fs.openSync(this.absolute, 'r')) - } + return Object.assign({ + method, + url, + headers + }, typeof body !== "undefined" ? { + body + } : null, options.request ? { + request: options.request + } : null); +} - [READ] (fd, buf, offset, length, pos, remain, blockRemain) { - let threw = true - try { - const bytesRead = fs.readSync(fd, buf, offset, length, pos) - this[ONREAD](fd, buf, offset, length, pos, remain, blockRemain, bytesRead) - threw = false - } finally { - // ignoring the error from close(2) is a bad practice, but at - // this point we already have an error, don't need another one - if (threw) - try { this[CLOSE](fd, () => {}) } catch (er) {} - } - } +function endpointWithDefaults(defaults, route, options) { + return parse(merge(defaults, route, options)); +} - [CLOSE] (fd, cb) { - fs.closeSync(fd) - cb() - } +function withDefaults(oldDefaults, newDefaults) { + const DEFAULTS = merge(oldDefaults, newDefaults); + const endpoint = endpointWithDefaults.bind(null, DEFAULTS); + return Object.assign(endpoint, { + DEFAULTS, + defaults: withDefaults.bind(null, DEFAULTS), + merge: merge.bind(null, DEFAULTS), + parse + }); } -const WriteEntryTar = warner(class WriteEntryTar extends MiniPass { - constructor (readEntry, opt) { - opt = opt || {} - super(opt) - this.preservePaths = !!opt.preservePaths - this.portable = !!opt.portable - this.strict = !!opt.strict - this.noPax = !!opt.noPax - this.noMtime = !!opt.noMtime +const VERSION = "6.0.11"; - this.readEntry = readEntry - this.type = readEntry.type - if (this.type === 'Directory' && this.portable) - this.noMtime = true +const userAgent = `octokit-endpoint.js/${VERSION} ${universalUserAgent.getUserAgent()}`; // DEFAULTS has all properties set that EndpointOptions has, except url. +// So we use RequestParameters and add method as additional required property. - this.path = readEntry.path - this.mode = this[MODE](readEntry.mode) - this.uid = this.portable ? null : readEntry.uid - this.gid = this.portable ? null : readEntry.gid - this.uname = this.portable ? null : readEntry.uname - this.gname = this.portable ? null : readEntry.gname - this.size = readEntry.size - this.mtime = this.noMtime ? null : opt.mtime || readEntry.mtime - this.atime = this.portable ? null : readEntry.atime - this.ctime = this.portable ? null : readEntry.ctime - this.linkpath = readEntry.linkpath - - if (typeof opt.onwarn === 'function') - this.on('warn', opt.onwarn) - - let pathWarn = false - if (path.isAbsolute(this.path) && !this.preservePaths) { - const parsed = path.parse(this.path) - pathWarn = parsed.root - this.path = this.path.substr(parsed.root.length) - } - - this.remain = readEntry.size - this.blockRemain = readEntry.startBlockSize - - this.header = new Header({ - path: this.path, - linkpath: this.linkpath, - // only the permissions and setuid/setgid/sticky bitflags - // not the higher-order bits that specify file type - mode: this.mode, - uid: this.portable ? null : this.uid, - gid: this.portable ? null : this.gid, - size: this.size, - mtime: this.noMtime ? null : this.mtime, - type: this.type, - uname: this.portable ? null : this.uname, - atime: this.portable ? null : this.atime, - ctime: this.portable ? null : this.ctime - }) - - if (pathWarn) { - this.warn('TAR_ENTRY_INFO', `stripping ${pathWarn} from absolute path`, { - entry: this, - path: pathWarn + this.path, - }) - } - - if (this.header.encode() && !this.noPax) - super.write(new Pax({ - atime: this.portable ? null : this.atime, - ctime: this.portable ? null : this.ctime, - gid: this.portable ? null : this.gid, - mtime: this.noMtime ? null : this.mtime, - path: this.path, - linkpath: this.linkpath, - size: this.size, - uid: this.portable ? null : this.uid, - uname: this.portable ? null : this.uname, - dev: this.portable ? null : this.readEntry.dev, - ino: this.portable ? null : this.readEntry.ino, - nlink: this.portable ? null : this.readEntry.nlink - }).encode()) - - super.write(this.header.block) - readEntry.pipe(this) - } - - [MODE] (mode) { - return modeFix(mode, this.type === 'Directory', this.portable) - } - - write (data) { - const writeLen = data.length - if (writeLen > this.blockRemain) - throw new Error('writing more to entry than is appropriate') - this.blockRemain -= writeLen - return super.write(data) - } - - end () { - if (this.blockRemain) - this.write(Buffer.alloc(this.blockRemain)) - return super.end() +const DEFAULTS = { + method: "GET", + baseUrl: "https://api.github.com", + headers: { + accept: "application/vnd.github.v3+json", + "user-agent": userAgent + }, + mediaType: { + format: "", + previews: [] } -}) - -WriteEntry.Sync = WriteEntrySync -WriteEntry.Tar = WriteEntryTar +}; -const getType = stat => - stat.isFile() ? 'File' - : stat.isDirectory() ? 'Directory' - : stat.isSymbolicLink() ? 'SymbolicLink' - : 'Unsupported' +const endpoint = withDefaults(null, DEFAULTS); -module.exports = WriteEntry +exports.endpoint = endpoint; +//# sourceMappingURL=index.js.map /***/ }), -/***/ 304: +/***/ 396: /***/ (function(module) { -module.exports = require("string_decoder"); - -/***/ }), +"use strict"; -/***/ 314: -/***/ (function(module) { +module.exports = function (Yallist) { + Yallist.prototype[Symbol.iterator] = function* () { + for (let walker = this.head; walker; walker = walker.next) { + yield walker.value + } + } +} -module.exports = {"name":"@octokit/graphql","version":"2.1.3","publishConfig":{"access":"public"},"description":"GitHub GraphQL API client for browsers and Node","main":"index.js","scripts":{"prebuild":"mkdirp dist/","build":"npm-run-all build:*","build:development":"webpack --mode development --entry . --output-library=octokitGraphql --output=./dist/octokit-graphql.js --profile --json > dist/bundle-stats.json","build:production":"webpack --mode production --entry . --plugin=compression-webpack-plugin --output-library=octokitGraphql --output-path=./dist --output-filename=octokit-graphql.min.js --devtool source-map","bundle-report":"webpack-bundle-analyzer dist/bundle-stats.json --mode=static --no-open --report dist/bundle-report.html","coverage":"nyc report --reporter=html && open coverage/index.html","coverage:upload":"nyc report --reporter=text-lcov | coveralls","pretest":"standard","test":"nyc mocha test/*-test.js","test:browser":"cypress run --browser chrome"},"repository":{"type":"git","url":"https://github.com/octokit/graphql.js.git"},"keywords":["octokit","github","api","graphql"],"author":"Gregor Martynus (https://github.com/gr2m)","license":"MIT","bugs":{"url":"https://github.com/octokit/graphql.js/issues"},"homepage":"https://github.com/octokit/graphql.js#readme","dependencies":{"@octokit/request":"^5.0.0","universal-user-agent":"^2.0.3"},"devDependencies":{"chai":"^4.2.0","compression-webpack-plugin":"^2.0.0","coveralls":"^3.0.3","cypress":"^3.1.5","fetch-mock":"^7.3.1","mkdirp":"^0.5.1","mocha":"^6.0.0","npm-run-all":"^4.1.3","nyc":"^14.0.0","semantic-release":"^15.13.3","simple-mock":"^0.8.0","standard":"^12.0.1","webpack":"^4.29.6","webpack-bundle-analyzer":"^3.1.0","webpack-cli":"^3.2.3"},"bundlesize":[{"path":"./dist/octokit-graphql.min.js.gz","maxSize":"5KB"}],"release":{"publish":["@semantic-release/npm",{"path":"@semantic-release/github","assets":["dist/*","!dist/*.map.gz"]}]},"standard":{"globals":["describe","before","beforeEach","afterEach","after","it","expect"]},"files":["lib"]}; /***/ }), -/***/ 323: +/***/ 413: /***/ (function(module) { -"use strict"; - - -var isStream = module.exports = function (stream) { - return stream !== null && typeof stream === 'object' && typeof stream.pipe === 'function'; -}; - -isStream.writable = function (stream) { - return isStream(stream) && stream.writable !== false && typeof stream._write === 'function' && typeof stream._writableState === 'object'; -}; - -isStream.readable = function (stream) { - return isStream(stream) && stream.readable !== false && typeof stream._read === 'function' && typeof stream._readableState === 'object'; -}; +module.exports = require("stream"); -isStream.duplex = function (stream) { - return isStream.writable(stream) && isStream.readable(stream); -}; +/***/ }), -isStream.transform = function (stream) { - return isStream.duplex(stream) && typeof stream._transform === 'function' && typeof stream._transformState === 'object'; -}; +/***/ 417: +/***/ (function(module) { +module.exports = require("crypto"); /***/ }), -/***/ 325: +/***/ 431: /***/ (function(__unusedmodule, exports, __webpack_require__) { "use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; - if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; - result["default"] = mod; + if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); return result; }; Object.defineProperty(exports, "__esModule", { value: true }); -const core = __importStar(__webpack_require__(470)); -const trivy_1 = __webpack_require__(737); -const issue_1 = __webpack_require__(486); -function run() { - return __awaiter(this, void 0, void 0, function* () { - try { - const trivyVersion = core - .getInput('trivy_version') - .replace(/^v/, ''); - const image = core.getInput('image') || process.env.IMAGE_NAME; - const issueFlag = core.getInput('issue').toLowerCase() == 'true'; - if (image === undefined || image === '') { - throw new Error('Please specify scan target image name'); - } - const trivyOption = { - severity: core.getInput('severity').replace(/\s+/g, ''), - vulnType: core.getInput('vuln_type').replace(/\s+/g, ''), - ignoreUnfixed: core.getInput('ignore_unfixed').toLowerCase() === 'true', - format: issueFlag ? 'json' : 'table', - }; - const downloader = new trivy_1.Downloader(); - const trivyCmdPath = yield downloader.download(trivyVersion); - const trivy = new trivy_1.Trivy(); - const result = trivy.scan(trivyCmdPath, image, trivyOption); - if (!issueFlag) { - core.info(`Not create a issue because issue parameter is false. - Vulnerabilities: - ${result}`); - return; - } - const issueContent = trivy.parse(image, result); - if (issueContent === '') { - core.info('Vulnerabilities were not found.\nYour maintenance looks good 👍'); - return; - } - const issueOption = { - title: core.getInput('issue_title'), - body: issueContent, - labels: core - .getInput('issue_label') - .replace(/\s+/g, '') - .split(','), - assignees: core - .getInput('issue_assignee') - .replace(/\s+/g, '') - .split(','), - }; - const token = core.getInput('token', { required: true }); - const output = yield issue_1.createOrUpdateIssue(token, image, issueOption); - core.setOutput('html_url', output.htmlUrl); - core.setOutput('issue_number', output.issueNumber.toString()); - if (core.getInput("fail_on_vulnerabilities") === 'true') { - core.setFailed(`Vulnerabilities found.\n${issueContent}`); - } +exports.issue = exports.issueCommand = void 0; +const os = __importStar(__webpack_require__(87)); +const utils_1 = __webpack_require__(82); +/** + * Commands + * + * Command Format: + * ::name key=value,key=value::message + * + * Examples: + * ::warning::This is the message + * ::set-env name=MY_VAR::some value + */ +function issueCommand(command, properties, message) { + const cmd = new Command(command, properties, message); + process.stdout.write(cmd.toString() + os.EOL); +} +exports.issueCommand = issueCommand; +function issue(name, message = '') { + issueCommand(name, {}, message); +} +exports.issue = issue; +const CMD_STRING = '::'; +class Command { + constructor(command, properties, message) { + if (!command) { + command = 'missing.command'; } - catch (error) { - core.error(error.stack); - core.setFailed(error.message); + this.command = command; + this.properties = properties; + this.message = message; + } + toString() { + let cmdStr = CMD_STRING + this.command; + if (this.properties && Object.keys(this.properties).length > 0) { + cmdStr += ' '; + let first = true; + for (const key in this.properties) { + if (this.properties.hasOwnProperty(key)) { + const val = this.properties[key]; + if (val) { + if (first) { + first = false; + } + else { + cmdStr += ','; + } + cmdStr += `${key}=${escapeProperty(val)}`; + } + } + } } - }); + cmdStr += `${CMD_STRING}${escapeData(this.message)}`; + return cmdStr; + } } -run(); - +function escapeData(s) { + return utils_1.toCommandValue(s) + .replace(/%/g, '%25') + .replace(/\r/g, '%0D') + .replace(/\n/g, '%0A'); +} +function escapeProperty(s) { + return utils_1.toCommandValue(s) + .replace(/%/g, '%25') + .replace(/\r/g, '%0D') + .replace(/\n/g, '%0A') + .replace(/:/g, '%3A') + .replace(/,/g, '%2C'); +} +//# sourceMappingURL=command.js.map /***/ }), -/***/ 336: -/***/ (function(module, __unusedexports, __webpack_require__) { +/***/ 448: +/***/ (function(__unusedmodule, exports, __webpack_require__) { -module.exports = hasLastPage +"use strict"; -const deprecate = __webpack_require__(370) -const getPageLinks = __webpack_require__(13) -function hasLastPage (link) { - deprecate(`octokit.hasLastPage() – You can use octokit.paginate or async iterators instead: https://github.com/octokit/rest.js#pagination.`) - return getPageLinks(link).last -} +Object.defineProperty(exports, '__esModule', { value: true }); +var universalUserAgent = __webpack_require__(526); +var beforeAfterHook = __webpack_require__(523); +var request = __webpack_require__(753); +var graphql = __webpack_require__(898); +var authToken = __webpack_require__(813); -/***/ }), +function _objectWithoutPropertiesLoose(source, excluded) { + if (source == null) return {}; + var target = {}; + var sourceKeys = Object.keys(source); + var key, i; -/***/ 348: -/***/ (function(module, __unusedexports, __webpack_require__) { + for (i = 0; i < sourceKeys.length; i++) { + key = sourceKeys[i]; + if (excluded.indexOf(key) >= 0) continue; + target[key] = source[key]; + } -"use strict"; + return target; +} +function _objectWithoutProperties(source, excluded) { + if (source == null) return {}; -module.exports = validate; + var target = _objectWithoutPropertiesLoose(source, excluded); -const { RequestError } = __webpack_require__(463); -const get = __webpack_require__(854); -const set = __webpack_require__(883); + var key, i; -function validate(octokit, options) { - if (!options.request.validate) { - return; + if (Object.getOwnPropertySymbols) { + var sourceSymbolKeys = Object.getOwnPropertySymbols(source); + + for (i = 0; i < sourceSymbolKeys.length; i++) { + key = sourceSymbolKeys[i]; + if (excluded.indexOf(key) >= 0) continue; + if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; + target[key] = source[key]; + } } - const { validate: params } = options.request; - Object.keys(params).forEach(parameterName => { - const parameter = get(params, parameterName); + return target; +} - const expectedType = parameter.type; - let parentParameterName; - let parentValue; - let parentParamIsPresent = true; - let parentParameterIsArray = false; +const VERSION = "3.4.0"; - if (/\./.test(parameterName)) { - parentParameterName = parameterName.replace(/\.[^.]+$/, ""); - parentParameterIsArray = parentParameterName.slice(-2) === "[]"; - if (parentParameterIsArray) { - parentParameterName = parentParameterName.slice(0, -2); +class Octokit { + constructor(options = {}) { + const hook = new beforeAfterHook.Collection(); + const requestDefaults = { + baseUrl: request.request.endpoint.DEFAULTS.baseUrl, + headers: {}, + request: Object.assign({}, options.request, { + // @ts-ignore internal usage only, no need to type + hook: hook.bind(null, "request") + }), + mediaType: { + previews: [], + format: "" } - parentValue = get(options, parentParameterName); - parentParamIsPresent = - parentParameterName === "headers" || - (typeof parentValue === "object" && parentValue !== null); + }; // prepend default user agent with `options.userAgent` if set + + requestDefaults.headers["user-agent"] = [options.userAgent, `octokit-core.js/${VERSION} ${universalUserAgent.getUserAgent()}`].filter(Boolean).join(" "); + + if (options.baseUrl) { + requestDefaults.baseUrl = options.baseUrl; } - const values = parentParameterIsArray - ? (get(options, parentParameterName) || []).map( - value => value[parameterName.split(/\./).pop()] - ) - : [get(options, parameterName)]; + if (options.previews) { + requestDefaults.mediaType.previews = options.previews; + } - values.forEach((value, i) => { - const valueIsPresent = typeof value !== "undefined"; - const valueIsNull = value === null; - const currentParameterName = parentParameterIsArray - ? parameterName.replace(/\[\]/, `[${i}]`) - : parameterName; + if (options.timeZone) { + requestDefaults.headers["time-zone"] = options.timeZone; + } - if (!parameter.required && !valueIsPresent) { - return; - } + this.request = request.request.defaults(requestDefaults); + this.graphql = graphql.withCustomRequest(this.request).defaults(requestDefaults); + this.log = Object.assign({ + debug: () => {}, + info: () => {}, + warn: console.warn.bind(console), + error: console.error.bind(console) + }, options.log); + this.hook = hook; // (1) If neither `options.authStrategy` nor `options.auth` are set, the `octokit` instance + // is unauthenticated. The `this.auth()` method is a no-op and no request hook is registered. + // (2) If only `options.auth` is set, use the default token authentication strategy. + // (3) If `options.authStrategy` is set then use it and pass in `options.auth`. Always pass own request as many strategies accept a custom request instance. + // TODO: type `options.auth` based on `options.authStrategy`. + + if (!options.authStrategy) { + if (!options.auth) { + // (1) + this.auth = async () => ({ + type: "unauthenticated" + }); + } else { + // (2) + const auth = authToken.createTokenAuth(options.auth); // @ts-ignore ¯\_(ツ)_/¯ - // if the parent parameter is of type object but allows null - // then the child parameters can be ignored - if (!parentParamIsPresent) { - return; + hook.wrap("request", auth.hook); + this.auth = auth; } + } else { + const { + authStrategy + } = options, + otherOptions = _objectWithoutProperties(options, ["authStrategy"]); + + const auth = authStrategy(Object.assign({ + request: this.request, + log: this.log, + // we pass the current octokit instance as well as its constructor options + // to allow for authentication strategies that return a new octokit instance + // that shares the same internal state as the current one. The original + // requirement for this was the "event-octokit" authentication strategy + // of https://github.com/probot/octokit-auth-probot. + octokit: this, + octokitOptions: otherOptions + }, options.auth)); // @ts-ignore ¯\_(ツ)_/¯ + + hook.wrap("request", auth.hook); + this.auth = auth; + } // apply plugins + // https://stackoverflow.com/a/16345172 + + + const classConstructor = this.constructor; + classConstructor.plugins.forEach(plugin => { + Object.assign(this, plugin(this, options)); + }); + } - if (parameter.allowNull && valueIsNull) { - return; - } + static defaults(defaults) { + const OctokitWithDefaults = class extends this { + constructor(...args) { + const options = args[0] || {}; - if (!parameter.allowNull && valueIsNull) { - throw new RequestError( - `'${currentParameterName}' cannot be null`, - 400, - { - request: options - } - ); - } - - if (parameter.required && !valueIsPresent) { - throw new RequestError( - `Empty value for parameter '${currentParameterName}': ${JSON.stringify( - value - )}`, - 400, - { - request: options - } - ); - } - - // parse to integer before checking for enum - // so that string "1" will match enum with number 1 - if (expectedType === "integer") { - const unparsedValue = value; - value = parseInt(value, 10); - if (isNaN(value)) { - throw new RequestError( - `Invalid value for parameter '${currentParameterName}': ${JSON.stringify( - unparsedValue - )} is NaN`, - 400, - { - request: options - } - ); - } - } - - if (parameter.enum && parameter.enum.indexOf(String(value)) === -1) { - throw new RequestError( - `Invalid value for parameter '${currentParameterName}': ${JSON.stringify( - value - )}`, - 400, - { - request: options - } - ); - } - - if (parameter.validation) { - const regex = new RegExp(parameter.validation); - if (!regex.test(value)) { - throw new RequestError( - `Invalid value for parameter '${currentParameterName}': ${JSON.stringify( - value - )}`, - 400, - { - request: options - } - ); + if (typeof defaults === "function") { + super(defaults(options)); + return; } - } - if (expectedType === "object" && typeof value === "string") { - try { - value = JSON.parse(value); - } catch (exception) { - throw new RequestError( - `JSON parse error of value for parameter '${currentParameterName}': ${JSON.stringify( - value - )}`, - 400, - { - request: options - } - ); - } + super(Object.assign({}, defaults, options, options.userAgent && defaults.userAgent ? { + userAgent: `${options.userAgent} ${defaults.userAgent}` + } : null)); } - set(options, parameter.mapTo || currentParameterName, value); - }); - }); - - return options; -} - - -/***/ }), - -/***/ 349: -/***/ (function(module, __unusedexports, __webpack_require__) { - -module.exports = authenticationRequestError; + }; + return OctokitWithDefaults; + } + /** + * Attach a plugin (or many) to your Octokit instance. + * + * @example + * const API = Octokit.plugin(plugin1, plugin2, plugin3, ...) + */ -const { RequestError } = __webpack_require__(463); -function authenticationRequestError(state, error, options) { - /* istanbul ignore next */ - if (!error.headers) throw error; - - const otpRequired = /required/.test(error.headers["x-github-otp"] || ""); - // handle "2FA required" error only - if (error.status !== 401 || !otpRequired) { - throw error; - } - - if ( - error.status === 401 && - otpRequired && - error.request && - error.request.headers["x-github-otp"] - ) { - throw new RequestError( - "Invalid one-time password for two-factor authentication", - 401, - { - headers: error.headers, - request: options - } - ); - } + static plugin(...newPlugins) { + var _a; - if (typeof state.auth.on2fa !== "function") { - throw new RequestError( - "2FA required, but options.on2fa is not a function. See https://github.com/octokit/rest.js#authentication", - 401, - { - headers: error.headers, - request: options - } - ); + const currentPlugins = this.plugins; + const NewOctokit = (_a = class extends this {}, _a.plugins = currentPlugins.concat(newPlugins.filter(plugin => !currentPlugins.includes(plugin))), _a); + return NewOctokit; } - return Promise.resolve() - .then(() => { - return state.auth.on2fa(); - }) - .then(oneTimePassword => { - const newOptions = Object.assign(options, { - headers: Object.assign( - { "x-github-otp": oneTimePassword }, - options.headers - ) - }); - return state.octokit.request(newOptions); - }); } +Octokit.VERSION = VERSION; +Octokit.plugins = []; +exports.Octokit = Octokit; +//# sourceMappingURL=index.js.map -/***/ }), - -/***/ 357: -/***/ (function(module) { - -module.exports = require("assert"); /***/ }), -/***/ 363: -/***/ (function(module) { - -module.exports = register +/***/ 454: +/***/ (function(module, exports, __webpack_require__) { -function register (state, name, method, options) { - if (typeof method !== 'function') { - throw new Error('method for before hook must be a function') - } +"use strict"; - if (!options) { - options = {} - } - if (Array.isArray(name)) { - return name.reverse().reduce(function (callback, name) { - return register.bind(null, state, name, callback, options) - }, method)() - } +Object.defineProperty(exports, '__esModule', { value: true }); - return Promise.resolve() - .then(function () { - if (!state.registry[name]) { - return method(options) - } +function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } - return (state.registry[name]).reduce(function (method, registered) { - return registered.hook.bind(null, method, options) - }, method)() - }) -} +var Stream = _interopDefault(__webpack_require__(413)); +var http = _interopDefault(__webpack_require__(605)); +var Url = _interopDefault(__webpack_require__(835)); +var https = _interopDefault(__webpack_require__(211)); +var zlib = _interopDefault(__webpack_require__(761)); +// Based on https://github.com/tmpvar/jsdom/blob/aa85b2abf07766ff7bf5c1f6daafb3726f2f2db5/lib/jsdom/living/blob.js -/***/ }), +// fix for "Readable" isn't a named export issue +const Readable = Stream.Readable; -/***/ 368: -/***/ (function(module) { +const BUFFER = Symbol('buffer'); +const TYPE = Symbol('type'); -module.exports = function atob(str) { - return Buffer.from(str, 'base64').toString('binary') -} +class Blob { + constructor() { + this[TYPE] = ''; + const blobParts = arguments[0]; + const options = arguments[1]; -/***/ }), + const buffers = []; + let size = 0; -/***/ 370: -/***/ (function(module) { + if (blobParts) { + const a = blobParts; + const length = Number(a.length); + for (let i = 0; i < length; i++) { + const element = a[i]; + let buffer; + if (element instanceof Buffer) { + buffer = element; + } else if (ArrayBuffer.isView(element)) { + buffer = Buffer.from(element.buffer, element.byteOffset, element.byteLength); + } else if (element instanceof ArrayBuffer) { + buffer = Buffer.from(element); + } else if (element instanceof Blob) { + buffer = element[BUFFER]; + } else { + buffer = Buffer.from(typeof element === 'string' ? element : String(element)); + } + size += buffer.length; + buffers.push(buffer); + } + } -module.exports = deprecate + this[BUFFER] = Buffer.concat(buffers); -const loggedMessages = {} + let type = options && options.type !== undefined && String(options.type).toLowerCase(); + if (type && !/[^\u0020-\u007E]/.test(type)) { + this[TYPE] = type; + } + } + get size() { + return this[BUFFER].length; + } + get type() { + return this[TYPE]; + } + text() { + return Promise.resolve(this[BUFFER].toString()); + } + arrayBuffer() { + const buf = this[BUFFER]; + const ab = buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength); + return Promise.resolve(ab); + } + stream() { + const readable = new Readable(); + readable._read = function () {}; + readable.push(this[BUFFER]); + readable.push(null); + return readable; + } + toString() { + return '[object Blob]'; + } + slice() { + const size = this.size; -function deprecate (message) { - if (loggedMessages[message]) { - return - } + const start = arguments[0]; + const end = arguments[1]; + let relativeStart, relativeEnd; + if (start === undefined) { + relativeStart = 0; + } else if (start < 0) { + relativeStart = Math.max(size + start, 0); + } else { + relativeStart = Math.min(start, size); + } + if (end === undefined) { + relativeEnd = size; + } else if (end < 0) { + relativeEnd = Math.max(size + end, 0); + } else { + relativeEnd = Math.min(end, size); + } + const span = Math.max(relativeEnd - relativeStart, 0); - console.warn(`DEPRECATED (@octokit/rest): ${message}`) - loggedMessages[message] = 1 + const buffer = this[BUFFER]; + const slicedBuffer = buffer.slice(relativeStart, relativeStart + span); + const blob = new Blob([], { type: arguments[2] }); + blob[BUFFER] = slicedBuffer; + return blob; + } } +Object.defineProperties(Blob.prototype, { + size: { enumerable: true }, + type: { enumerable: true }, + slice: { enumerable: true } +}); -/***/ }), - -/***/ 381: -/***/ (function(module, __unusedexports, __webpack_require__) { +Object.defineProperty(Blob.prototype, Symbol.toStringTag, { + value: 'Blob', + writable: false, + enumerable: false, + configurable: true +}); -"use strict"; +/** + * fetch-error.js + * + * FetchError interface for operational errors + */ +/** + * Create FetchError instance + * + * @param String message Error message for human + * @param String type Error type for machine + * @param String systemError For Node.js system error + * @return FetchError + */ +function FetchError(message, type, systemError) { + Error.call(this, message); -// XXX: This shares a lot in common with extract.js -// maybe some DRY opportunity here? + this.message = message; + this.type = type; -// tar -t -const hlo = __webpack_require__(891) -const Parser = __webpack_require__(203) -const fs = __webpack_require__(747) -const fsm = __webpack_require__(827) -const path = __webpack_require__(622) + // when err.type is `system`, err.code contains system error code + if (systemError) { + this.code = this.errno = systemError.code; + } -const t = module.exports = (opt_, files, cb) => { - if (typeof opt_ === 'function') - cb = opt_, files = null, opt_ = {} - else if (Array.isArray(opt_)) - files = opt_, opt_ = {} + // hide custom error implementation details from end-users + Error.captureStackTrace(this, this.constructor); +} - if (typeof files === 'function') - cb = files, files = null +FetchError.prototype = Object.create(Error.prototype); +FetchError.prototype.constructor = FetchError; +FetchError.prototype.name = 'FetchError'; - if (!files) - files = [] - else - files = Array.from(files) +let convert; +try { + convert = __webpack_require__(18).convert; +} catch (e) {} - const opt = hlo(opt_) +const INTERNALS = Symbol('Body internals'); - if (opt.sync && typeof cb === 'function') - throw new TypeError('callback not supported for sync tar functions') +// fix an issue where "PassThrough" isn't a named export for node <10 +const PassThrough = Stream.PassThrough; - if (!opt.file && typeof cb === 'function') - throw new TypeError('callback only supported with file option') +/** + * Body mixin + * + * Ref: https://fetch.spec.whatwg.org/#body + * + * @param Stream body Readable stream + * @param Object opts Response options + * @return Void + */ +function Body(body) { + var _this = this; - if (files.length) - filesFilter(opt, files) + var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, + _ref$size = _ref.size; - if (!opt.noResume) - onentryFunction(opt) + let size = _ref$size === undefined ? 0 : _ref$size; + var _ref$timeout = _ref.timeout; + let timeout = _ref$timeout === undefined ? 0 : _ref$timeout; - return opt.file && opt.sync ? listFileSync(opt) - : opt.file ? listFile(opt, cb) - : list(opt) -} + if (body == null) { + // body is undefined or null + body = null; + } else if (isURLSearchParams(body)) { + // body is a URLSearchParams + body = Buffer.from(body.toString()); + } else if (isBlob(body)) ; else if (Buffer.isBuffer(body)) ; else if (Object.prototype.toString.call(body) === '[object ArrayBuffer]') { + // body is ArrayBuffer + body = Buffer.from(body); + } else if (ArrayBuffer.isView(body)) { + // body is ArrayBufferView + body = Buffer.from(body.buffer, body.byteOffset, body.byteLength); + } else if (body instanceof Stream) ; else { + // none of the above + // coerce to string then buffer + body = Buffer.from(String(body)); + } + this[INTERNALS] = { + body, + disturbed: false, + error: null + }; + this.size = size; + this.timeout = timeout; -const onentryFunction = opt => { - const onentry = opt.onentry - opt.onentry = onentry ? e => { - onentry(e) - e.resume() - } : e => e.resume() + if (body instanceof Stream) { + body.on('error', function (err) { + const error = err.name === 'AbortError' ? err : new FetchError(`Invalid response body while trying to fetch ${_this.url}: ${err.message}`, 'system', err); + _this[INTERNALS].error = error; + }); + } } -// construct a filter that limits the file entries listed -// include child entries if a dir is included -const filesFilter = (opt, files) => { - const map = new Map(files.map(f => [f.replace(/\/+$/, ''), true])) - const filter = opt.filter +Body.prototype = { + get body() { + return this[INTERNALS].body; + }, - const mapHas = (file, r) => { - const root = r || path.parse(file).root || '.' - const ret = file === root ? false - : map.has(file) ? map.get(file) - : mapHas(path.dirname(file), root) + get bodyUsed() { + return this[INTERNALS].disturbed; + }, - map.set(file, ret) - return ret - } + /** + * Decode response as ArrayBuffer + * + * @return Promise + */ + arrayBuffer() { + return consumeBody.call(this).then(function (buf) { + return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength); + }); + }, - opt.filter = filter - ? (file, entry) => filter(file, entry) && mapHas(file.replace(/\/+$/, '')) - : file => mapHas(file.replace(/\/+$/, '')) -} + /** + * Return raw response as Blob + * + * @return Promise + */ + blob() { + let ct = this.headers && this.headers.get('content-type') || ''; + return consumeBody.call(this).then(function (buf) { + return Object.assign( + // Prevent copying + new Blob([], { + type: ct.toLowerCase() + }), { + [BUFFER]: buf + }); + }); + }, -const listFileSync = opt => { - const p = list(opt) - const file = opt.file - let threw = true - let fd - try { - const stat = fs.statSync(file) - const readSize = opt.maxReadSize || 16*1024*1024 - if (stat.size < readSize) { - p.end(fs.readFileSync(file)) - } else { - let pos = 0 - const buf = Buffer.allocUnsafe(readSize) - fd = fs.openSync(file, 'r') - while (pos < stat.size) { - let bytesRead = fs.readSync(fd, buf, 0, readSize, pos) - pos += bytesRead - p.write(buf.slice(0, bytesRead)) - } - p.end() - } - threw = false - } finally { - if (threw && fd) - try { fs.closeSync(fd) } catch (er) {} - } -} + /** + * Decode response as json + * + * @return Promise + */ + json() { + var _this2 = this; -const listFile = (opt, cb) => { - const parse = new Parser(opt) - const readSize = opt.maxReadSize || 16*1024*1024 + return consumeBody.call(this).then(function (buffer) { + try { + return JSON.parse(buffer.toString()); + } catch (err) { + return Body.Promise.reject(new FetchError(`invalid json response body at ${_this2.url} reason: ${err.message}`, 'invalid-json')); + } + }); + }, - const file = opt.file - const p = new Promise((resolve, reject) => { - parse.on('error', reject) - parse.on('end', resolve) + /** + * Decode response as text + * + * @return Promise + */ + text() { + return consumeBody.call(this).then(function (buffer) { + return buffer.toString(); + }); + }, - fs.stat(file, (er, stat) => { - if (er) - reject(er) - else { - const stream = new fsm.ReadStream(file, { - readSize: readSize, - size: stat.size - }) - stream.on('error', reject) - stream.pipe(parse) - } - }) - }) - return cb ? p.then(cb, cb) : p -} + /** + * Decode response as buffer (non-spec api) + * + * @return Promise + */ + buffer() { + return consumeBody.call(this); + }, -const list = opt => new Parser(opt) + /** + * Decode response as text, while automatically detecting the encoding and + * trying to decode to UTF-8 (non-spec api) + * + * @return Promise + */ + textConverted() { + var _this3 = this; + return consumeBody.call(this).then(function (buffer) { + return convertBody(buffer, _this3.headers); + }); + } +}; -/***/ }), +// In browsers, all properties are enumerable. +Object.defineProperties(Body.prototype, { + body: { enumerable: true }, + bodyUsed: { enumerable: true }, + arrayBuffer: { enumerable: true }, + blob: { enumerable: true }, + json: { enumerable: true }, + text: { enumerable: true } +}); -/***/ 385: -/***/ (function(__unusedmodule, exports, __webpack_require__) { +Body.mixIn = function (proto) { + for (const name of Object.getOwnPropertyNames(Body.prototype)) { + // istanbul ignore else: future proof + if (!(name in proto)) { + const desc = Object.getOwnPropertyDescriptor(Body.prototype, name); + Object.defineProperty(proto, name, desc); + } + } +}; -"use strict"; +/** + * Consume and convert an entire Body to a Buffer. + * + * Ref: https://fetch.spec.whatwg.org/#concept-body-consume-body + * + * @return Promise + */ +function consumeBody() { + var _this4 = this; + if (this[INTERNALS].disturbed) { + return Body.Promise.reject(new TypeError(`body used already for: ${this.url}`)); + } -Object.defineProperty(exports, '__esModule', { value: true }); + this[INTERNALS].disturbed = true; -function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } + if (this[INTERNALS].error) { + return Body.Promise.reject(this[INTERNALS].error); + } -var isPlainObject = _interopDefault(__webpack_require__(442)); -var universalUserAgent = __webpack_require__(526); + let body = this.body; -function lowercaseKeys(object) { - if (!object) { - return {}; - } + // body is null + if (body === null) { + return Body.Promise.resolve(Buffer.alloc(0)); + } - return Object.keys(object).reduce((newObj, key) => { - newObj[key.toLowerCase()] = object[key]; - return newObj; - }, {}); -} + // body is blob + if (isBlob(body)) { + body = body.stream(); + } -function mergeDeep(defaults, options) { - const result = Object.assign({}, defaults); - Object.keys(options).forEach(key => { - if (isPlainObject(options[key])) { - if (!(key in defaults)) Object.assign(result, { - [key]: options[key] - });else result[key] = mergeDeep(defaults[key], options[key]); - } else { - Object.assign(result, { - [key]: options[key] - }); - } - }); - return result; -} + // body is buffer + if (Buffer.isBuffer(body)) { + return Body.Promise.resolve(body); + } -function merge(defaults, route, options) { - if (typeof route === "string") { - let [method, url] = route.split(" "); - options = Object.assign(url ? { - method, - url - } : { - url: method - }, options); - } else { - options = Object.assign({}, route); - } // lowercase header names before merging with defaults to avoid duplicates + // istanbul ignore if: should never happen + if (!(body instanceof Stream)) { + return Body.Promise.resolve(Buffer.alloc(0)); + } + // body is stream + // get ready to actually consume the body + let accum = []; + let accumBytes = 0; + let abort = false; - options.headers = lowercaseKeys(options.headers); - const mergedOptions = mergeDeep(defaults || {}, options); // mediaType.previews arrays are merged, instead of overwritten + return new Body.Promise(function (resolve, reject) { + let resTimeout; - if (defaults && defaults.mediaType.previews.length) { - mergedOptions.mediaType.previews = defaults.mediaType.previews.filter(preview => !mergedOptions.mediaType.previews.includes(preview)).concat(mergedOptions.mediaType.previews); - } + // allow timeout on slow response body + if (_this4.timeout) { + resTimeout = setTimeout(function () { + abort = true; + reject(new FetchError(`Response timeout while trying to fetch ${_this4.url} (over ${_this4.timeout}ms)`, 'body-timeout')); + }, _this4.timeout); + } - mergedOptions.mediaType.previews = mergedOptions.mediaType.previews.map(preview => preview.replace(/-preview/, "")); - return mergedOptions; -} + // handle stream errors + body.on('error', function (err) { + if (err.name === 'AbortError') { + // if the request was aborted, reject with this Error + abort = true; + reject(err); + } else { + // other errors, such as incorrect content-encoding + reject(new FetchError(`Invalid response body while trying to fetch ${_this4.url}: ${err.message}`, 'system', err)); + } + }); -function addQueryParameters(url, parameters) { - const separator = /\?/.test(url) ? "&" : "?"; - const names = Object.keys(parameters); + body.on('data', function (chunk) { + if (abort || chunk === null) { + return; + } - if (names.length === 0) { - return url; - } + if (_this4.size && accumBytes + chunk.length > _this4.size) { + abort = true; + reject(new FetchError(`content size at ${_this4.url} over limit: ${_this4.size}`, 'max-size')); + return; + } - return url + separator + names.map(name => { - if (name === "q") { - return "q=" + parameters.q.split("+").map(encodeURIComponent).join("+"); - } + accumBytes += chunk.length; + accum.push(chunk); + }); - return `${name}=${encodeURIComponent(parameters[name])}`; - }).join("&"); -} + body.on('end', function () { + if (abort) { + return; + } -const urlVariableRegex = /\{[^}]+\}/g; + clearTimeout(resTimeout); -function removeNonChars(variableName) { - return variableName.replace(/^\W+|\W+$/g, "").split(/,/); + try { + resolve(Buffer.concat(accum, accumBytes)); + } catch (err) { + // handle streams that have accumulated too much data (issue #414) + reject(new FetchError(`Could not create Buffer from response body for ${_this4.url}: ${err.message}`, 'system', err)); + } + }); + }); } -function extractUrlVariableNames(url) { - const matches = url.match(urlVariableRegex); +/** + * Detect buffer encoding and convert to target encoding + * ref: http://www.w3.org/TR/2011/WD-html5-20110113/parsing.html#determining-the-character-encoding + * + * @param Buffer buffer Incoming buffer + * @param String encoding Target encoding + * @return String + */ +function convertBody(buffer, headers) { + if (typeof convert !== 'function') { + throw new Error('The package `encoding` must be installed to use the textConverted() function'); + } - if (!matches) { - return []; - } + const ct = headers.get('content-type'); + let charset = 'utf-8'; + let res, str; - return matches.map(removeNonChars).reduce((a, b) => a.concat(b), []); -} + // header + if (ct) { + res = /charset=([^;]*)/i.exec(ct); + } -function omit(object, keysToOmit) { - return Object.keys(object).filter(option => !keysToOmit.includes(option)).reduce((obj, key) => { - obj[key] = object[key]; - return obj; - }, {}); -} + // no charset in content type, peek at response body for at most 1024 bytes + str = buffer.slice(0, 1024).toString(); -// Based on https://github.com/bramstein/url-template, licensed under BSD -// TODO: create separate package. -// -// Copyright (c) 2012-2014, Bram Stein -// All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// 1. Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// 3. The name of the author may not be used to endorse or promote products -// derived from this software without specific prior written permission. -// THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -// EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, -// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + // html5 + if (!res && str) { + res = / urlVariableNames.includes(option)).concat("baseUrl"); - const remainingParameters = omit(parameters, omittedParameters); - const isBinaryRequset = /application\/octet-stream/i.test(headers.accept); +const invalidTokenRegex = /[^\^_`a-zA-Z\-0-9!#$%&'*+.|~]/; +const invalidHeaderCharRegex = /[^\t\x20-\x7e\x80-\xff]/; - if (!isBinaryRequset) { - if (options.mediaType.format) { - // e.g. application/vnd.github.v3+json => application/vnd.github.v3.raw - headers.accept = headers.accept.split(/,/).map(preview => preview.replace(/application\/vnd(\.\w+)(\.v3)?(\.\w+)?(\+json)?$/, `application/vnd$1$2.${options.mediaType.format}`)).join(","); - } +function validateName(name) { + name = `${name}`; + if (invalidTokenRegex.test(name) || name === '') { + throw new TypeError(`${name} is not a legal HTTP header name`); + } +} - if (options.mediaType.previews.length) { - const previewsFromAcceptHeader = headers.accept.match(/[\w-]+(?=-preview)/g) || []; - headers.accept = previewsFromAcceptHeader.concat(options.mediaType.previews).map(preview => { - const format = options.mediaType.format ? `.${options.mediaType.format}` : "+json"; - return `application/vnd.github.${preview}-preview${format}`; - }).join(","); - } - } // for GET/HEAD requests, set URL query parameters from remaining parameters - // for PATCH/POST/PUT/DELETE requests, set request body from remaining parameters +function validateValue(value) { + value = `${value}`; + if (invalidHeaderCharRegex.test(value)) { + throw new TypeError(`${value} is not a legal HTTP header value`); + } +} +/** + * Find the key in the map object given a header name. + * + * Returns undefined if not found. + * + * @param String name Header name + * @return String|Undefined + */ +function find(map, name) { + name = name.toLowerCase(); + for (const key in map) { + if (key.toLowerCase() === name) { + return key; + } + } + return undefined; +} - if (["GET", "HEAD"].includes(method)) { - url = addQueryParameters(url, remainingParameters); - } else { - if ("data" in remainingParameters) { - body = remainingParameters.data; - } else { - if (Object.keys(remainingParameters).length) { - body = remainingParameters; - } else { - headers["content-length"] = 0; - } - } - } // default content-type for JSON if body is set - - - if (!headers["content-type"] && typeof body !== "undefined") { - headers["content-type"] = "application/json; charset=utf-8"; - } // GitHub expects 'content-length: 0' header for PUT/PATCH requests without body. - // fetch does not allow to set `content-length` header, but we can set body to an empty string - - - if (["PATCH", "PUT"].includes(method) && typeof body === "undefined") { - body = ""; - } // Only return body/request keys if present +const MAP = Symbol('map'); +class Headers { + /** + * Headers class + * + * @param Object headers Response headers + * @return Void + */ + constructor() { + let init = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : undefined; + this[MAP] = Object.create(null); - return Object.assign({ - method, - url, - headers - }, typeof body !== "undefined" ? { - body - } : null, options.request ? { - request: options.request - } : null); -} + if (init instanceof Headers) { + const rawHeaders = init.raw(); + const headerNames = Object.keys(rawHeaders); -function endpointWithDefaults(defaults, route, options) { - return parse(merge(defaults, route, options)); -} + for (const headerName of headerNames) { + for (const value of rawHeaders[headerName]) { + this.append(headerName, value); + } + } -function withDefaults(oldDefaults, newDefaults) { - const DEFAULTS = merge(oldDefaults, newDefaults); - const endpoint = endpointWithDefaults.bind(null, DEFAULTS); - return Object.assign(endpoint, { - DEFAULTS, - defaults: withDefaults.bind(null, DEFAULTS), - merge: merge.bind(null, DEFAULTS), - parse - }); -} + return; + } -const VERSION = "5.5.2"; + // We don't worry about converting prop to ByteString here as append() + // will handle it. + if (init == null) ; else if (typeof init === 'object') { + const method = init[Symbol.iterator]; + if (method != null) { + if (typeof method !== 'function') { + throw new TypeError('Header pairs must be iterable'); + } -const userAgent = `octokit-endpoint.js/${VERSION} ${universalUserAgent.getUserAgent()}`; // DEFAULTS has all properties set that EndpointOptions has, except url. -// So we use RequestParameters and add method as additional required property. + // sequence> + // Note: per spec we have to first exhaust the lists then process them + const pairs = []; + for (const pair of init) { + if (typeof pair !== 'object' || typeof pair[Symbol.iterator] !== 'function') { + throw new TypeError('Each header pair must be iterable'); + } + pairs.push(Array.from(pair)); + } -const DEFAULTS = { - method: "GET", - baseUrl: "https://api.github.com", - headers: { - accept: "application/vnd.github.v3+json", - "user-agent": userAgent - }, - mediaType: { - format: "", - previews: [] - } -}; + for (const pair of pairs) { + if (pair.length !== 2) { + throw new TypeError('Each header pair must be a name/value tuple'); + } + this.append(pair[0], pair[1]); + } + } else { + // record + for (const key of Object.keys(init)) { + const value = init[key]; + this.append(key, value); + } + } + } else { + throw new TypeError('Provided initializer must be an object'); + } + } -const endpoint = withDefaults(null, DEFAULTS); + /** + * Return combined header value given name + * + * @param String name Header name + * @return Mixed + */ + get(name) { + name = `${name}`; + validateName(name); + const key = find(this[MAP], name); + if (key === undefined) { + return null; + } -exports.endpoint = endpoint; -//# sourceMappingURL=index.js.map + return this[MAP][key].join(', '); + } + /** + * Iterate over all headers + * + * @param Function callback Executed for each item with parameters (value, name, thisArg) + * @param Boolean thisArg `this` context for callback function + * @return Void + */ + forEach(callback) { + let thisArg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined; -/***/ }), + let pairs = getHeaders(this); + let i = 0; + while (i < pairs.length) { + var _pairs$i = pairs[i]; + const name = _pairs$i[0], + value = _pairs$i[1]; -/***/ 389: -/***/ (function(module, __unusedexports, __webpack_require__) { + callback.call(thisArg, value, name, this); + pairs = getHeaders(this); + i++; + } + } -"use strict"; + /** + * Overwrite header values given name + * + * @param String name Header name + * @param String value Header value + * @return Void + */ + set(name, value) { + name = `${name}`; + value = `${value}`; + validateName(name); + validateValue(value); + const key = find(this[MAP], name); + this[MAP][key !== undefined ? key : name] = [value]; + } + /** + * Append a value onto existing header + * + * @param String name Header name + * @param String value Header value + * @return Void + */ + append(name, value) { + name = `${name}`; + value = `${value}`; + validateName(name); + validateValue(value); + const key = find(this[MAP], name); + if (key !== undefined) { + this[MAP][key].push(value); + } else { + this[MAP][name] = [value]; + } + } -const fs = __webpack_require__(747); -const shebangCommand = __webpack_require__(866); + /** + * Check for header name existence + * + * @param String name Header name + * @return Boolean + */ + has(name) { + name = `${name}`; + validateName(name); + return find(this[MAP], name) !== undefined; + } -function readShebang(command) { - // Read the first 150 bytes from the file - const size = 150; - let buffer; + /** + * Delete all header values given name + * + * @param String name Header name + * @return Void + */ + delete(name) { + name = `${name}`; + validateName(name); + const key = find(this[MAP], name); + if (key !== undefined) { + delete this[MAP][key]; + } + } - if (Buffer.alloc) { - // Node.js v4.5+ / v5.10+ - buffer = Buffer.alloc(size); - } else { - // Old Node.js API - buffer = new Buffer(size); - buffer.fill(0); // zero-fill - } + /** + * Return raw headers (non-spec api) + * + * @return Object + */ + raw() { + return this[MAP]; + } - let fd; + /** + * Get an iterator on keys. + * + * @return Iterator + */ + keys() { + return createHeadersIterator(this, 'key'); + } - try { - fd = fs.openSync(command, 'r'); - fs.readSync(fd, buffer, 0, size, 0); - fs.closeSync(fd); - } catch (e) { /* Empty */ } + /** + * Get an iterator on values. + * + * @return Iterator + */ + values() { + return createHeadersIterator(this, 'value'); + } - // Attempt to extract shebang (null is returned if not a shebang) - return shebangCommand(buffer.toString()); + /** + * Get an iterator on entries. + * + * This is the default iterator of the Headers object. + * + * @return Iterator + */ + [Symbol.iterator]() { + return createHeadersIterator(this, 'key+value'); + } } +Headers.prototype.entries = Headers.prototype[Symbol.iterator]; -module.exports = readShebang; - - -/***/ }), - -/***/ 396: -/***/ (function(module) { - -"use strict"; +Object.defineProperty(Headers.prototype, Symbol.toStringTag, { + value: 'Headers', + writable: false, + enumerable: false, + configurable: true +}); -module.exports = function (Yallist) { - Yallist.prototype[Symbol.iterator] = function* () { - for (let walker = this.head; walker; walker = walker.next) { - yield walker.value - } - } -} +Object.defineProperties(Headers.prototype, { + get: { enumerable: true }, + forEach: { enumerable: true }, + set: { enumerable: true }, + append: { enumerable: true }, + has: { enumerable: true }, + delete: { enumerable: true }, + keys: { enumerable: true }, + values: { enumerable: true }, + entries: { enumerable: true } +}); +function getHeaders(headers) { + let kind = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'key+value'; -/***/ }), + const keys = Object.keys(headers[MAP]).sort(); + return keys.map(kind === 'key' ? function (k) { + return k.toLowerCase(); + } : kind === 'value' ? function (k) { + return headers[MAP][k].join(', '); + } : function (k) { + return [k.toLowerCase(), headers[MAP][k].join(', ')]; + }); +} -/***/ 402: -/***/ (function(module, __unusedexports, __webpack_require__) { +const INTERNAL = Symbol('internal'); -module.exports = Octokit; +function createHeadersIterator(target, kind) { + const iterator = Object.create(HeadersIteratorPrototype); + iterator[INTERNAL] = { + target, + kind, + index: 0 + }; + return iterator; +} -const { request } = __webpack_require__(753); -const Hook = __webpack_require__(523); +const HeadersIteratorPrototype = Object.setPrototypeOf({ + next() { + // istanbul ignore if + if (!this || Object.getPrototypeOf(this) !== HeadersIteratorPrototype) { + throw new TypeError('Value of `this` is not a HeadersIterator'); + } -const parseClientOptions = __webpack_require__(294); + var _INTERNAL = this[INTERNAL]; + const target = _INTERNAL.target, + kind = _INTERNAL.kind, + index = _INTERNAL.index; -function Octokit(plugins, options) { - options = options || {}; - const hook = new Hook.Collection(); - const log = Object.assign( - { - debug: () => {}, - info: () => {}, - warn: console.warn, - error: console.error - }, - options && options.log - ); - const api = { - hook, - log, - request: request.defaults(parseClientOptions(options, log, hook)) - }; + const values = getHeaders(target, kind); + const len = values.length; + if (index >= len) { + return { + value: undefined, + done: true + }; + } - plugins.forEach(pluginFunction => pluginFunction(api, options)); + this[INTERNAL].index = index + 1; - return api; -} + return { + value: values[index], + done: false + }; + } +}, Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()))); +Object.defineProperty(HeadersIteratorPrototype, Symbol.toStringTag, { + value: 'HeadersIterator', + writable: false, + enumerable: false, + configurable: true +}); -/***/ }), +/** + * Export the Headers object in a form that Node.js can consume. + * + * @param Headers headers + * @return Object + */ +function exportNodeCompatibleHeaders(headers) { + const obj = Object.assign({ __proto__: null }, headers[MAP]); -/***/ 413: -/***/ (function(module) { + // http.request() only supports string as Host header. This hack makes + // specifying custom Host header possible. + const hostHeaderKey = find(headers[MAP], 'Host'); + if (hostHeaderKey !== undefined) { + obj[hostHeaderKey] = obj[hostHeaderKey][0]; + } -module.exports = require("stream"); + return obj; +} -/***/ }), +/** + * Create a Headers object from an object of headers, ignoring those that do + * not conform to HTTP grammar productions. + * + * @param Object obj Object of headers + * @return Headers + */ +function createHeadersLenient(obj) { + const headers = new Headers(); + for (const name of Object.keys(obj)) { + if (invalidTokenRegex.test(name)) { + continue; + } + if (Array.isArray(obj[name])) { + for (const val of obj[name]) { + if (invalidHeaderCharRegex.test(val)) { + continue; + } + if (headers[MAP][name] === undefined) { + headers[MAP][name] = [val]; + } else { + headers[MAP][name].push(val); + } + } + } else if (!invalidHeaderCharRegex.test(obj[name])) { + headers[MAP][name] = [obj[name]]; + } + } + return headers; +} -/***/ 417: -/***/ (function(module) { +const INTERNALS$1 = Symbol('Response internals'); -module.exports = require("crypto"); +// fix an issue where "STATUS_CODES" aren't a named export for node <10 +const STATUS_CODES = http.STATUS_CODES; -/***/ }), +/** + * Response class + * + * @param Stream body Readable stream + * @param Object opts Response options + * @return Void + */ +class Response { + constructor() { + let body = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + let opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; -/***/ 427: -/***/ (function(module, __unusedexports, __webpack_require__) { + Body.call(this, body, opts); -"use strict"; + const status = opts.status || 200; + const headers = new Headers(opts.headers); -// Older verions of Node.js might not have `util.getSystemErrorName()`. -// In that case, fall back to a deprecated internal. -const util = __webpack_require__(669); + if (body != null && !headers.has('Content-Type')) { + const contentType = extractContentType(body); + if (contentType) { + headers.append('Content-Type', contentType); + } + } -let uv; + this[INTERNALS$1] = { + url: opts.url, + status, + statusText: opts.statusText || STATUS_CODES[status], + headers, + counter: opts.counter + }; + } -if (typeof util.getSystemErrorName === 'function') { - module.exports = util.getSystemErrorName; -} else { - try { - uv = process.binding('uv'); + get url() { + return this[INTERNALS$1].url || ''; + } - if (typeof uv.errname !== 'function') { - throw new TypeError('uv.errname is not a function'); - } - } catch (err) { - console.error('execa/lib/errname: unable to establish process.binding(\'uv\')', err); - uv = null; + get status() { + return this[INTERNALS$1].status; } - module.exports = code => errname(uv, code); -} + /** + * Convenience property representing if the request ended normally + */ + get ok() { + return this[INTERNALS$1].status >= 200 && this[INTERNALS$1].status < 300; + } -// Used for testing the fallback behavior -module.exports.__test__ = errname; + get redirected() { + return this[INTERNALS$1].counter > 0; + } -function errname(uv, code) { - if (uv) { - return uv.errname(code); + get statusText() { + return this[INTERNALS$1].statusText; } - if (!(code < 0)) { - throw new Error('err >= 0'); + get headers() { + return this[INTERNALS$1].headers; } - return `Unknown system error ${code}`; + /** + * Clone this response + * + * @return Response + */ + clone() { + return new Response(clone(this), { + url: this.url, + status: this.status, + statusText: this.statusText, + headers: this.headers, + ok: this.ok, + redirected: this.redirected + }); + } } +Body.mixIn(Response.prototype); +Object.defineProperties(Response.prototype, { + url: { enumerable: true }, + status: { enumerable: true }, + ok: { enumerable: true }, + redirected: { enumerable: true }, + statusText: { enumerable: true }, + headers: { enumerable: true }, + clone: { enumerable: true } +}); -/***/ }), +Object.defineProperty(Response.prototype, Symbol.toStringTag, { + value: 'Response', + writable: false, + enumerable: false, + configurable: true +}); -/***/ 430: -/***/ (function(module, __unusedexports, __webpack_require__) { +const INTERNALS$2 = Symbol('Request internals'); -module.exports = octokitValidate; +// fix an issue where "format", "parse" aren't a named export for node <10 +const parse_url = Url.parse; +const format_url = Url.format; -const validate = __webpack_require__(348); +const streamDestructionSupported = 'destroy' in Stream.Readable.prototype; -function octokitValidate(octokit) { - octokit.hook.before("request", validate.bind(null, octokit)); +/** + * Check if a value is an instance of Request. + * + * @param Mixed input + * @return Boolean + */ +function isRequest(input) { + return typeof input === 'object' && typeof input[INTERNALS$2] === 'object'; } +function isAbortSignal(signal) { + const proto = signal && typeof signal === 'object' && Object.getPrototypeOf(signal); + return !!(proto && proto.constructor.name === 'AbortSignal'); +} -/***/ }), - -/***/ 431: -/***/ (function(__unusedmodule, exports, __webpack_require__) { - -"use strict"; - -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; - result["default"] = mod; - return result; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const os = __importStar(__webpack_require__(87)); /** - * Commands - * - * Command Format: - * ::name key=value,key=value::message + * Request class * - * Examples: - * ::warning::This is the message - * ::set-env name=MY_VAR::some value + * @param Mixed input Url or Request instance + * @param Object init Custom options + * @return Void */ -function issueCommand(command, properties, message) { - const cmd = new Command(command, properties, message); - process.stdout.write(cmd.toString() + os.EOL); -} -exports.issueCommand = issueCommand; -function issue(name, message = '') { - issueCommand(name, {}, message); -} -exports.issue = issue; -const CMD_STRING = '::'; -class Command { - constructor(command, properties, message) { - if (!command) { - command = 'missing.command'; - } - this.command = command; - this.properties = properties; - this.message = message; - } - toString() { - let cmdStr = CMD_STRING + this.command; - if (this.properties && Object.keys(this.properties).length > 0) { - cmdStr += ' '; - let first = true; - for (const key in this.properties) { - if (this.properties.hasOwnProperty(key)) { - const val = this.properties[key]; - if (val) { - if (first) { - first = false; - } - else { - cmdStr += ','; - } - cmdStr += `${key}=${escapeProperty(val)}`; - } - } - } - } - cmdStr += `${CMD_STRING}${escapeData(this.message)}`; - return cmdStr; - } -} -function escapeData(s) { - return (s || '') - .replace(/%/g, '%25') - .replace(/\r/g, '%0D') - .replace(/\n/g, '%0A'); -} -function escapeProperty(s) { - return (s || '') - .replace(/%/g, '%25') - .replace(/\r/g, '%0D') - .replace(/\n/g, '%0A') - .replace(/:/g, '%3A') - .replace(/,/g, '%2C'); -} -//# sourceMappingURL=command.js.map - -/***/ }), - -/***/ 442: -/***/ (function(module) { - -"use strict"; - +class Request { + constructor(input) { + let init = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; -/*! - * isobject - * - * Copyright (c) 2014-2017, Jon Schlinkert. - * Released under the MIT License. - */ + let parsedURL; -function isObject(val) { - return val != null && typeof val === 'object' && Array.isArray(val) === false; -} + // normalize input + if (!isRequest(input)) { + if (input && input.href) { + // in order to support Node.js' Url objects; though WHATWG's URL objects + // will fall into this branch also (since their `toString()` will return + // `href` property anyway) + parsedURL = parse_url(input.href); + } else { + // coerce input to a string before attempting to parse + parsedURL = parse_url(`${input}`); + } + input = {}; + } else { + parsedURL = parse_url(input.url); + } -/*! - * is-plain-object - * - * Copyright (c) 2014-2017, Jon Schlinkert. - * Released under the MIT License. - */ + let method = init.method || input.method || 'GET'; + method = method.toUpperCase(); -function isObjectObject(o) { - return isObject(o) === true - && Object.prototype.toString.call(o) === '[object Object]'; -} + if ((init.body != null || isRequest(input) && input.body !== null) && (method === 'GET' || method === 'HEAD')) { + throw new TypeError('Request with GET/HEAD method cannot have body'); + } -function isPlainObject(o) { - var ctor,prot; + let inputBody = init.body != null ? init.body : isRequest(input) && input.body !== null ? clone(input) : null; - if (isObjectObject(o) === false) return false; + Body.call(this, inputBody, { + timeout: init.timeout || input.timeout || 0, + size: init.size || input.size || 0 + }); - // If has modified constructor - ctor = o.constructor; - if (typeof ctor !== 'function') return false; + const headers = new Headers(init.headers || input.headers || {}); - // If has modified prototype - prot = ctor.prototype; - if (isObjectObject(prot) === false) return false; + if (inputBody != null && !headers.has('Content-Type')) { + const contentType = extractContentType(inputBody); + if (contentType) { + headers.append('Content-Type', contentType); + } + } - // If constructor does not have an Object-specific method - if (prot.hasOwnProperty('isPrototypeOf') === false) { - return false; - } + let signal = isRequest(input) ? input.signal : null; + if ('signal' in init) signal = init.signal; - // Most likely a plain Object - return true; -} + if (signal != null && !isAbortSignal(signal)) { + throw new TypeError('Expected signal to be an instanceof AbortSignal'); + } -module.exports = isPlainObject; + this[INTERNALS$2] = { + method, + redirect: init.redirect || input.redirect || 'follow', + headers, + parsedURL, + signal + }; + // node-fetch-only options + this.follow = init.follow !== undefined ? init.follow : input.follow !== undefined ? input.follow : 20; + this.compress = init.compress !== undefined ? init.compress : input.compress !== undefined ? input.compress : true; + this.counter = init.counter || input.counter || 0; + this.agent = init.agent || input.agent; + } -/***/ }), + get method() { + return this[INTERNALS$2].method; + } -/***/ 453: -/***/ (function(module, __unusedexports, __webpack_require__) { + get url() { + return format_url(this[INTERNALS$2].parsedURL); + } -var once = __webpack_require__(969) -var eos = __webpack_require__(9) -var fs = __webpack_require__(747) // we only need fs to get the ReadStream and WriteStream prototypes + get headers() { + return this[INTERNALS$2].headers; + } -var noop = function () {} -var ancient = /^v?\.0/.test(process.version) + get redirect() { + return this[INTERNALS$2].redirect; + } -var isFn = function (fn) { - return typeof fn === 'function' -} + get signal() { + return this[INTERNALS$2].signal; + } -var isFS = function (stream) { - if (!ancient) return false // newer node version do not need to care about fs is a special way - if (!fs) return false // browser - return (stream instanceof (fs.ReadStream || noop) || stream instanceof (fs.WriteStream || noop)) && isFn(stream.close) + /** + * Clone this request + * + * @return Request + */ + clone() { + return new Request(this); + } } -var isRequest = function (stream) { - return stream.setHeader && isFn(stream.abort) -} +Body.mixIn(Request.prototype); -var destroyer = function (stream, reading, writing, callback) { - callback = once(callback) +Object.defineProperty(Request.prototype, Symbol.toStringTag, { + value: 'Request', + writable: false, + enumerable: false, + configurable: true +}); - var closed = false - stream.on('close', function () { - closed = true - }) +Object.defineProperties(Request.prototype, { + method: { enumerable: true }, + url: { enumerable: true }, + headers: { enumerable: true }, + redirect: { enumerable: true }, + clone: { enumerable: true }, + signal: { enumerable: true } +}); - eos(stream, {readable: reading, writable: writing}, function (err) { - if (err) return callback(err) - closed = true - callback() - }) +/** + * Convert a Request to Node.js http request options. + * + * @param Request A Request instance + * @return Object The options object to be passed to http.request + */ +function getNodeRequestOptions(request) { + const parsedURL = request[INTERNALS$2].parsedURL; + const headers = new Headers(request[INTERNALS$2].headers); - var destroyed = false - return function (err) { - if (closed) return - if (destroyed) return - destroyed = true + // fetch step 1.3 + if (!headers.has('Accept')) { + headers.set('Accept', '*/*'); + } - if (isFS(stream)) return stream.close(noop) // use close for fs streams to avoid fd leaks - if (isRequest(stream)) return stream.abort() // request.destroy just do .end - .abort is what we want + // Basic fetch + if (!parsedURL.protocol || !parsedURL.hostname) { + throw new TypeError('Only absolute URLs are supported'); + } - if (isFn(stream.destroy)) return stream.destroy() + if (!/^https?:$/.test(parsedURL.protocol)) { + throw new TypeError('Only HTTP(S) protocols are supported'); + } - callback(err || new Error('stream was destroyed')) - } -} + if (request.signal && request.body instanceof Stream.Readable && !streamDestructionSupported) { + throw new Error('Cancellation of streamed requests with AbortSignal is not supported in node < 8'); + } -var call = function (fn) { - fn() -} + // HTTP-network-or-cache fetch steps 2.4-2.7 + let contentLengthValue = null; + if (request.body == null && /^(POST|PUT)$/i.test(request.method)) { + contentLengthValue = '0'; + } + if (request.body != null) { + const totalBytes = getTotalBytes(request); + if (typeof totalBytes === 'number') { + contentLengthValue = String(totalBytes); + } + } + if (contentLengthValue) { + headers.set('Content-Length', contentLengthValue); + } -var pipe = function (from, to) { - return from.pipe(to) -} + // HTTP-network-or-cache fetch step 2.11 + if (!headers.has('User-Agent')) { + headers.set('User-Agent', 'node-fetch/1.0 (+https://github.com/bitinn/node-fetch)'); + } -var pump = function () { - var streams = Array.prototype.slice.call(arguments) - var callback = isFn(streams[streams.length - 1] || noop) && streams.pop() || noop + // HTTP-network-or-cache fetch step 2.15 + if (request.compress && !headers.has('Accept-Encoding')) { + headers.set('Accept-Encoding', 'gzip,deflate'); + } - if (Array.isArray(streams[0])) streams = streams[0] - if (streams.length < 2) throw new Error('pump requires two streams per minimum') + let agent = request.agent; + if (typeof agent === 'function') { + agent = agent(parsedURL); + } - var error - var destroys = streams.map(function (stream, i) { - var reading = i < streams.length - 1 - var writing = i > 0 - return destroyer(stream, reading, writing, function (err) { - if (!error) error = err - if (err) destroys.forEach(call) - if (reading) return - destroys.forEach(call) - callback(error) - }) - }) - - return streams.reduce(pipe) -} - -module.exports = pump - - -/***/ }), - -/***/ 454: -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, '__esModule', { value: true }); - -function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } - -var Stream = _interopDefault(__webpack_require__(413)); -var http = _interopDefault(__webpack_require__(605)); -var Url = _interopDefault(__webpack_require__(835)); -var https = _interopDefault(__webpack_require__(211)); -var zlib = _interopDefault(__webpack_require__(761)); - -// Based on https://github.com/tmpvar/jsdom/blob/aa85b2abf07766ff7bf5c1f6daafb3726f2f2db5/lib/jsdom/living/blob.js - -// fix for "Readable" isn't a named export issue -const Readable = Stream.Readable; - -const BUFFER = Symbol('buffer'); -const TYPE = Symbol('type'); - -class Blob { - constructor() { - this[TYPE] = ''; - - const blobParts = arguments[0]; - const options = arguments[1]; - - const buffers = []; - let size = 0; - - if (blobParts) { - const a = blobParts; - const length = Number(a.length); - for (let i = 0; i < length; i++) { - const element = a[i]; - let buffer; - if (element instanceof Buffer) { - buffer = element; - } else if (ArrayBuffer.isView(element)) { - buffer = Buffer.from(element.buffer, element.byteOffset, element.byteLength); - } else if (element instanceof ArrayBuffer) { - buffer = Buffer.from(element); - } else if (element instanceof Blob) { - buffer = element[BUFFER]; - } else { - buffer = Buffer.from(typeof element === 'string' ? element : String(element)); - } - size += buffer.length; - buffers.push(buffer); - } - } - - this[BUFFER] = Buffer.concat(buffers); - - let type = options && options.type !== undefined && String(options.type).toLowerCase(); - if (type && !/[^\u0020-\u007E]/.test(type)) { - this[TYPE] = type; - } - } - get size() { - return this[BUFFER].length; - } - get type() { - return this[TYPE]; - } - text() { - return Promise.resolve(this[BUFFER].toString()); - } - arrayBuffer() { - const buf = this[BUFFER]; - const ab = buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength); - return Promise.resolve(ab); - } - stream() { - const readable = new Readable(); - readable._read = function () {}; - readable.push(this[BUFFER]); - readable.push(null); - return readable; - } - toString() { - return '[object Blob]'; + if (!headers.has('Connection') && !agent) { + headers.set('Connection', 'close'); } - slice() { - const size = this.size; - const start = arguments[0]; - const end = arguments[1]; - let relativeStart, relativeEnd; - if (start === undefined) { - relativeStart = 0; - } else if (start < 0) { - relativeStart = Math.max(size + start, 0); - } else { - relativeStart = Math.min(start, size); - } - if (end === undefined) { - relativeEnd = size; - } else if (end < 0) { - relativeEnd = Math.max(size + end, 0); - } else { - relativeEnd = Math.min(end, size); - } - const span = Math.max(relativeEnd - relativeStart, 0); + // HTTP-network fetch step 4.2 + // chunked encoding is handled by Node.js - const buffer = this[BUFFER]; - const slicedBuffer = buffer.slice(relativeStart, relativeStart + span); - const blob = new Blob([], { type: arguments[2] }); - blob[BUFFER] = slicedBuffer; - return blob; - } + return Object.assign({}, parsedURL, { + method: request.method, + headers: exportNodeCompatibleHeaders(headers), + agent + }); } -Object.defineProperties(Blob.prototype, { - size: { enumerable: true }, - type: { enumerable: true }, - slice: { enumerable: true } -}); - -Object.defineProperty(Blob.prototype, Symbol.toStringTag, { - value: 'Blob', - writable: false, - enumerable: false, - configurable: true -}); - /** - * fetch-error.js + * abort-error.js * - * FetchError interface for operational errors + * AbortError interface for cancelled requests */ /** - * Create FetchError instance + * Create AbortError instance * * @param String message Error message for human - * @param String type Error type for machine - * @param String systemError For Node.js system error - * @return FetchError + * @return AbortError */ -function FetchError(message, type, systemError) { +function AbortError(message) { Error.call(this, message); + this.type = 'aborted'; this.message = message; - this.type = type; - - // when err.type is `system`, err.code contains system error code - if (systemError) { - this.code = this.errno = systemError.code; - } // hide custom error implementation details from end-users Error.captureStackTrace(this, this.constructor); } -FetchError.prototype = Object.create(Error.prototype); -FetchError.prototype.constructor = FetchError; -FetchError.prototype.name = 'FetchError'; - -let convert; -try { - convert = __webpack_require__(18).convert; -} catch (e) {} - -const INTERNALS = Symbol('Body internals'); +AbortError.prototype = Object.create(Error.prototype); +AbortError.prototype.constructor = AbortError; +AbortError.prototype.name = 'AbortError'; -// fix an issue where "PassThrough" isn't a named export for node <10 -const PassThrough = Stream.PassThrough; +// fix an issue where "PassThrough", "resolve" aren't a named export for node <10 +const PassThrough$1 = Stream.PassThrough; +const resolve_url = Url.resolve; /** - * Body mixin - * - * Ref: https://fetch.spec.whatwg.org/#body + * Fetch function * - * @param Stream body Readable stream - * @param Object opts Response options - * @return Void + * @param Mixed url Absolute url or Request instance + * @param Object opts Fetch options + * @return Promise */ -function Body(body) { - var _this = this; - - var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, - _ref$size = _ref.size; - - let size = _ref$size === undefined ? 0 : _ref$size; - var _ref$timeout = _ref.timeout; - let timeout = _ref$timeout === undefined ? 0 : _ref$timeout; +function fetch(url, opts) { - if (body == null) { - // body is undefined or null - body = null; - } else if (isURLSearchParams(body)) { - // body is a URLSearchParams - body = Buffer.from(body.toString()); - } else if (isBlob(body)) ; else if (Buffer.isBuffer(body)) ; else if (Object.prototype.toString.call(body) === '[object ArrayBuffer]') { - // body is ArrayBuffer - body = Buffer.from(body); - } else if (ArrayBuffer.isView(body)) { - // body is ArrayBufferView - body = Buffer.from(body.buffer, body.byteOffset, body.byteLength); - } else if (body instanceof Stream) ; else { - // none of the above - // coerce to string then buffer - body = Buffer.from(String(body)); + // allow custom promise + if (!fetch.Promise) { + throw new Error('native promise missing, set fetch.Promise to your favorite alternative'); } - this[INTERNALS] = { - body, - disturbed: false, - error: null - }; - this.size = size; - this.timeout = timeout; - if (body instanceof Stream) { - body.on('error', function (err) { - const error = err.name === 'AbortError' ? err : new FetchError(`Invalid response body while trying to fetch ${_this.url}: ${err.message}`, 'system', err); - _this[INTERNALS].error = error; - }); - } -} + Body.Promise = fetch.Promise; -Body.prototype = { - get body() { - return this[INTERNALS].body; - }, + // wrap http.request into fetch + return new fetch.Promise(function (resolve, reject) { + // build request object + const request = new Request(url, opts); + const options = getNodeRequestOptions(request); - get bodyUsed() { - return this[INTERNALS].disturbed; - }, + const send = (options.protocol === 'https:' ? https : http).request; + const signal = request.signal; - /** - * Decode response as ArrayBuffer - * - * @return Promise - */ - arrayBuffer() { - return consumeBody.call(this).then(function (buf) { - return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength); - }); - }, - - /** - * Return raw response as Blob - * - * @return Promise - */ - blob() { - let ct = this.headers && this.headers.get('content-type') || ''; - return consumeBody.call(this).then(function (buf) { - return Object.assign( - // Prevent copying - new Blob([], { - type: ct.toLowerCase() - }), { - [BUFFER]: buf - }); - }); - }, - - /** - * Decode response as json - * - * @return Promise - */ - json() { - var _this2 = this; + let response = null; - return consumeBody.call(this).then(function (buffer) { - try { - return JSON.parse(buffer.toString()); - } catch (err) { - return Body.Promise.reject(new FetchError(`invalid json response body at ${_this2.url} reason: ${err.message}`, 'invalid-json')); + const abort = function abort() { + let error = new AbortError('The user aborted a request.'); + reject(error); + if (request.body && request.body instanceof Stream.Readable) { + request.body.destroy(error); } - }); - }, - - /** - * Decode response as text - * - * @return Promise - */ - text() { - return consumeBody.call(this).then(function (buffer) { - return buffer.toString(); - }); - }, - - /** - * Decode response as buffer (non-spec api) - * - * @return Promise - */ - buffer() { - return consumeBody.call(this); - }, + if (!response || !response.body) return; + response.body.emit('error', error); + }; - /** - * Decode response as text, while automatically detecting the encoding and - * trying to decode to UTF-8 (non-spec api) - * - * @return Promise - */ - textConverted() { - var _this3 = this; + if (signal && signal.aborted) { + abort(); + return; + } - return consumeBody.call(this).then(function (buffer) { - return convertBody(buffer, _this3.headers); - }); - } -}; + const abortAndFinalize = function abortAndFinalize() { + abort(); + finalize(); + }; -// In browsers, all properties are enumerable. -Object.defineProperties(Body.prototype, { - body: { enumerable: true }, - bodyUsed: { enumerable: true }, - arrayBuffer: { enumerable: true }, - blob: { enumerable: true }, - json: { enumerable: true }, - text: { enumerable: true } -}); + // send request + const req = send(options); + let reqTimeout; -Body.mixIn = function (proto) { - for (const name of Object.getOwnPropertyNames(Body.prototype)) { - // istanbul ignore else: future proof - if (!(name in proto)) { - const desc = Object.getOwnPropertyDescriptor(Body.prototype, name); - Object.defineProperty(proto, name, desc); + if (signal) { + signal.addEventListener('abort', abortAndFinalize); } - } -}; -/** - * Consume and convert an entire Body to a Buffer. - * - * Ref: https://fetch.spec.whatwg.org/#concept-body-consume-body - * - * @return Promise - */ -function consumeBody() { - var _this4 = this; + function finalize() { + req.abort(); + if (signal) signal.removeEventListener('abort', abortAndFinalize); + clearTimeout(reqTimeout); + } - if (this[INTERNALS].disturbed) { - return Body.Promise.reject(new TypeError(`body used already for: ${this.url}`)); - } + if (request.timeout) { + req.once('socket', function (socket) { + reqTimeout = setTimeout(function () { + reject(new FetchError(`network timeout at: ${request.url}`, 'request-timeout')); + finalize(); + }, request.timeout); + }); + } - this[INTERNALS].disturbed = true; + req.on('error', function (err) { + reject(new FetchError(`request to ${request.url} failed, reason: ${err.message}`, 'system', err)); + finalize(); + }); - if (this[INTERNALS].error) { - return Body.Promise.reject(this[INTERNALS].error); - } + req.on('response', function (res) { + clearTimeout(reqTimeout); - let body = this.body; + const headers = createHeadersLenient(res.headers); - // body is null - if (body === null) { - return Body.Promise.resolve(Buffer.alloc(0)); - } + // HTTP fetch step 5 + if (fetch.isRedirect(res.statusCode)) { + // HTTP fetch step 5.2 + const location = headers.get('Location'); - // body is blob - if (isBlob(body)) { - body = body.stream(); - } + // HTTP fetch step 5.3 + const locationURL = location === null ? null : resolve_url(request.url, location); - // body is buffer - if (Buffer.isBuffer(body)) { - return Body.Promise.resolve(body); - } + // HTTP fetch step 5.5 + switch (request.redirect) { + case 'error': + reject(new FetchError(`uri requested responds with a redirect, redirect mode is set to error: ${request.url}`, 'no-redirect')); + finalize(); + return; + case 'manual': + // node-fetch-specific step: make manual redirect a bit easier to use by setting the Location header value to the resolved URL. + if (locationURL !== null) { + // handle corrupted header + try { + headers.set('Location', locationURL); + } catch (err) { + // istanbul ignore next: nodejs server prevent invalid response headers, we can't test this through normal request + reject(err); + } + } + break; + case 'follow': + // HTTP-redirect fetch step 2 + if (locationURL === null) { + break; + } - // istanbul ignore if: should never happen - if (!(body instanceof Stream)) { - return Body.Promise.resolve(Buffer.alloc(0)); - } + // HTTP-redirect fetch step 5 + if (request.counter >= request.follow) { + reject(new FetchError(`maximum redirect reached at: ${request.url}`, 'max-redirect')); + finalize(); + return; + } - // body is stream - // get ready to actually consume the body - let accum = []; - let accumBytes = 0; - let abort = false; + // HTTP-redirect fetch step 6 (counter increment) + // Create a new Request object. + const requestOpts = { + headers: new Headers(request.headers), + follow: request.follow, + counter: request.counter + 1, + agent: request.agent, + compress: request.compress, + method: request.method, + body: request.body, + signal: request.signal, + timeout: request.timeout, + size: request.size + }; - return new Body.Promise(function (resolve, reject) { - let resTimeout; + // HTTP-redirect fetch step 9 + if (res.statusCode !== 303 && request.body && getTotalBytes(request) === null) { + reject(new FetchError('Cannot follow redirect with body being a readable stream', 'unsupported-redirect')); + finalize(); + return; + } - // allow timeout on slow response body - if (_this4.timeout) { - resTimeout = setTimeout(function () { - abort = true; - reject(new FetchError(`Response timeout while trying to fetch ${_this4.url} (over ${_this4.timeout}ms)`, 'body-timeout')); - }, _this4.timeout); - } + // HTTP-redirect fetch step 11 + if (res.statusCode === 303 || (res.statusCode === 301 || res.statusCode === 302) && request.method === 'POST') { + requestOpts.method = 'GET'; + requestOpts.body = undefined; + requestOpts.headers.delete('content-length'); + } - // handle stream errors - body.on('error', function (err) { - if (err.name === 'AbortError') { - // if the request was aborted, reject with this Error - abort = true; - reject(err); - } else { - // other errors, such as incorrect content-encoding - reject(new FetchError(`Invalid response body while trying to fetch ${_this4.url}: ${err.message}`, 'system', err)); + // HTTP-redirect fetch step 15 + resolve(fetch(new Request(locationURL, requestOpts))); + finalize(); + return; + } } - }); - body.on('data', function (chunk) { - if (abort || chunk === null) { - return; - } + // prepare response + res.once('end', function () { + if (signal) signal.removeEventListener('abort', abortAndFinalize); + }); + let body = res.pipe(new PassThrough$1()); - if (_this4.size && accumBytes + chunk.length > _this4.size) { - abort = true; - reject(new FetchError(`content size at ${_this4.url} over limit: ${_this4.size}`, 'max-size')); + const response_options = { + url: request.url, + status: res.statusCode, + statusText: res.statusMessage, + headers: headers, + size: request.size, + timeout: request.timeout, + counter: request.counter + }; + + // HTTP-network fetch step 12.1.1.3 + const codings = headers.get('Content-Encoding'); + + // HTTP-network fetch step 12.1.1.4: handle content codings + + // in following scenarios we ignore compression support + // 1. compression support is disabled + // 2. HEAD request + // 3. no Content-Encoding header + // 4. no content response (204) + // 5. content not modified response (304) + if (!request.compress || request.method === 'HEAD' || codings === null || res.statusCode === 204 || res.statusCode === 304) { + response = new Response(body, response_options); + resolve(response); return; } - accumBytes += chunk.length; - accum.push(chunk); - }); + // For Node v6+ + // Be less strict when decoding compressed responses, since sometimes + // servers send slightly invalid responses that are still accepted + // by common browsers. + // Always using Z_SYNC_FLUSH is what cURL does. + const zlibOptions = { + flush: zlib.Z_SYNC_FLUSH, + finishFlush: zlib.Z_SYNC_FLUSH + }; - body.on('end', function () { - if (abort) { + // for gzip + if (codings == 'gzip' || codings == 'x-gzip') { + body = body.pipe(zlib.createGunzip(zlibOptions)); + response = new Response(body, response_options); + resolve(response); return; } - clearTimeout(resTimeout); + // for deflate + if (codings == 'deflate' || codings == 'x-deflate') { + // handle the infamous raw deflate response from old servers + // a hack for old IIS and Apache servers + const raw = res.pipe(new PassThrough$1()); + raw.once('data', function (chunk) { + // see http://stackoverflow.com/questions/37519828 + if ((chunk[0] & 0x0F) === 0x08) { + body = body.pipe(zlib.createInflate()); + } else { + body = body.pipe(zlib.createInflateRaw()); + } + response = new Response(body, response_options); + resolve(response); + }); + return; + } - try { - resolve(Buffer.concat(accum, accumBytes)); - } catch (err) { - // handle streams that have accumulated too much data (issue #414) - reject(new FetchError(`Could not create Buffer from response body for ${_this4.url}: ${err.message}`, 'system', err)); + // for br + if (codings == 'br' && typeof zlib.createBrotliDecompress === 'function') { + body = body.pipe(zlib.createBrotliDecompress()); + response = new Response(body, response_options); + resolve(response); + return; } + + // otherwise, use response as-is + response = new Response(body, response_options); + resolve(response); }); + + writeToStream(req, request); }); } - /** - * Detect buffer encoding and convert to target encoding - * ref: http://www.w3.org/TR/2011/WD-html5-20110113/parsing.html#determining-the-character-encoding + * Redirect code matching * - * @param Buffer buffer Incoming buffer - * @param String encoding Target encoding - * @return String + * @param Number code Status code + * @return Boolean */ -function convertBody(buffer, headers) { - if (typeof convert !== 'function') { - throw new Error('The package `encoding` must be installed to use the textConverted() function'); - } +fetch.isRedirect = function (code) { + return code === 301 || code === 302 || code === 303 || code === 307 || code === 308; +}; - const ct = headers.get('content-type'); - let charset = 'utf-8'; - let res, str; +// expose Promise +fetch.Promise = global.Promise; - // header - if (ct) { - res = /charset=([^;]*)/i.exec(ct); - } +module.exports = exports = fetch; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.default = exports; +exports.Headers = Headers; +exports.Request = Request; +exports.Response = Response; +exports.FetchError = FetchError; - // no charset in content type, peek at response body for at most 1024 bytes - str = buffer.slice(0, 1024).toString(); - // html5 - if (!res && str) { - res = / console.warn(deprecation)); /** - * Detect a URLSearchParams object - * ref: https://github.com/bitinn/node-fetch/issues/296#issuecomment-307598143 - * - * @param Object obj Object to detect by type or brand - * @return String + * Error with extra properties to help with debugging */ -function isURLSearchParams(obj) { - // Duck-typing as a necessary condition. - if (typeof obj !== 'object' || typeof obj.append !== 'function' || typeof obj.delete !== 'function' || typeof obj.get !== 'function' || typeof obj.getAll !== 'function' || typeof obj.has !== 'function' || typeof obj.set !== 'function') { - return false; - } - // Brand-checking and more duck-typing as optional condition. - return obj.constructor.name === 'URLSearchParams' || Object.prototype.toString.call(obj) === '[object URLSearchParams]' || typeof obj.sort === 'function'; -} +class RequestError extends Error { + constructor(message, statusCode, options) { + super(message); // Maintains proper stack trace (only available on V8) -/** - * Check if `obj` is a W3C `Blob` object (which `File` inherits from) - * @param {*} obj - * @return {boolean} - */ -function isBlob(obj) { - return typeof obj === 'object' && typeof obj.arrayBuffer === 'function' && typeof obj.type === 'string' && typeof obj.stream === 'function' && typeof obj.constructor === 'function' && typeof obj.constructor.name === 'string' && /^(Blob|File)$/.test(obj.constructor.name) && /^(Blob|File)$/.test(obj[Symbol.toStringTag]); -} + /* istanbul ignore next */ -/** - * Clone body given Res/Req instance - * - * @param Mixed instance Response or Request instance - * @return Mixed - */ -function clone(instance) { - let p1, p2; - let body = instance.body; + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } - // don't allow cloning a used body - if (instance.bodyUsed) { - throw new Error('cannot clone body after it is used'); - } + this.name = "HttpError"; + this.status = statusCode; + Object.defineProperty(this, "code", { + get() { + logOnce(new deprecation.Deprecation("[@octokit/request-error] `error.code` is deprecated, use `error.status`.")); + return statusCode; + } - // check that body is a stream and not form-data object - // note: we can't clone the form-data object without having it as a dependency - if (body instanceof Stream && typeof body.getBoundary !== 'function') { - // tee instance body - p1 = new PassThrough(); - p2 = new PassThrough(); - body.pipe(p1); - body.pipe(p2); - // set instance body to teed body and return the other teed body - instance[INTERNALS].body = p1; - body = p2; - } + }); + this.headers = options.headers || {}; // redact request credentials without mutating original request options + + const requestCopy = Object.assign({}, options.request); + + if (options.request.headers.authorization) { + requestCopy.headers = Object.assign({}, options.request.headers, { + authorization: options.request.headers.authorization.replace(/ .*$/, " [REDACTED]") + }); + } + + requestCopy.url = requestCopy.url // client_id & client_secret can be passed as URL query parameters to increase rate limit + // see https://developer.github.com/v3/#increasing-the-unauthenticated-rate-limit-for-oauth-applications + .replace(/\bclient_secret=\w+/g, "client_secret=[REDACTED]") // OAuth tokens can be passed as URL query parameters, although it is not recommended + // see https://developer.github.com/v3/#oauth2-token-sent-in-a-header + .replace(/\baccess_token=\w+/g, "access_token=[REDACTED]"); + this.request = requestCopy; + } - return body; } +exports.RequestError = RequestError; +//# sourceMappingURL=index.js.map + + +/***/ }), + +/***/ 469: +/***/ (function(__unusedmodule, exports, __webpack_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getOctokit = exports.context = void 0; +const Context = __importStar(__webpack_require__(262)); +const utils_1 = __webpack_require__(521); +exports.context = new Context.Context(); /** - * Performs the operation "extract a `Content-Type` value from |object|" as - * specified in the specification: - * https://fetch.spec.whatwg.org/#concept-bodyinit-extract + * Returns a hydrated octokit ready to use for GitHub Actions * - * This function assumes that instance.body is present. - * - * @param Mixed instance Any options.body input + * @param token the repo PAT or GITHUB_TOKEN + * @param options other options to set */ -function extractContentType(body) { - if (body === null) { - // body is null - return null; - } else if (typeof body === 'string') { - // body is string - return 'text/plain;charset=UTF-8'; - } else if (isURLSearchParams(body)) { - // body is a URLSearchParams - return 'application/x-www-form-urlencoded;charset=UTF-8'; - } else if (isBlob(body)) { - // body is blob - return body.type || null; - } else if (Buffer.isBuffer(body)) { - // body is buffer - return null; - } else if (Object.prototype.toString.call(body) === '[object ArrayBuffer]') { - // body is ArrayBuffer - return null; - } else if (ArrayBuffer.isView(body)) { - // body is ArrayBufferView - return null; - } else if (typeof body.getBoundary === 'function') { - // detect form data input from form-data module - return `multipart/form-data;boundary=${body.getBoundary()}`; - } else if (body instanceof Stream) { - // body is stream - // can't really do much about this - return null; - } else { - // Body constructor defaults other things to string - return 'text/plain;charset=UTF-8'; - } +function getOctokit(token, options) { + return new utils_1.GitHub(utils_1.getOctokitOptions(token, options)); } +exports.getOctokit = getOctokit; +//# sourceMappingURL=github.js.map + +/***/ }), + +/***/ 470: +/***/ (function(__unusedmodule, exports, __webpack_require__) { + +"use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getState = exports.saveState = exports.group = exports.endGroup = exports.startGroup = exports.info = exports.warning = exports.error = exports.debug = exports.isDebug = exports.setFailed = exports.setCommandEcho = exports.setOutput = exports.getBooleanInput = exports.getInput = exports.addPath = exports.setSecret = exports.exportVariable = exports.ExitCode = void 0; +const command_1 = __webpack_require__(431); +const file_command_1 = __webpack_require__(102); +const utils_1 = __webpack_require__(82); +const os = __importStar(__webpack_require__(87)); +const path = __importStar(__webpack_require__(622)); /** - * The Fetch Standard treats this as if "total bytes" is a property on the body. - * For us, we have to explicitly get it with a function. + * The code to exit an action + */ +var ExitCode; +(function (ExitCode) { + /** + * A code indicating that the action was successful + */ + ExitCode[ExitCode["Success"] = 0] = "Success"; + /** + * A code indicating that the action was a failure + */ + ExitCode[ExitCode["Failure"] = 1] = "Failure"; +})(ExitCode = exports.ExitCode || (exports.ExitCode = {})); +//----------------------------------------------------------------------- +// Variables +//----------------------------------------------------------------------- +/** + * Sets env variable for this action and future actions in the job + * @param name the name of the variable to set + * @param val the value of the variable. Non-string values will be converted to a string via JSON.stringify + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function exportVariable(name, val) { + const convertedVal = utils_1.toCommandValue(val); + process.env[name] = convertedVal; + const filePath = process.env['GITHUB_ENV'] || ''; + if (filePath) { + const delimiter = '_GitHubActionsFileCommandDelimeter_'; + const commandValue = `${name}<<${delimiter}${os.EOL}${convertedVal}${os.EOL}${delimiter}`; + file_command_1.issueCommand('ENV', commandValue); + } + else { + command_1.issueCommand('set-env', { name }, convertedVal); + } +} +exports.exportVariable = exportVariable; +/** + * Registers a secret which will get masked from logs + * @param secret value of the secret + */ +function setSecret(secret) { + command_1.issueCommand('add-mask', {}, secret); +} +exports.setSecret = setSecret; +/** + * Prepends inputPath to the PATH (for this action and future actions) + * @param inputPath + */ +function addPath(inputPath) { + const filePath = process.env['GITHUB_PATH'] || ''; + if (filePath) { + file_command_1.issueCommand('PATH', inputPath); + } + else { + command_1.issueCommand('add-path', {}, inputPath); + } + process.env['PATH'] = `${inputPath}${path.delimiter}${process.env['PATH']}`; +} +exports.addPath = addPath; +/** + * Gets the value of an input. + * Unless trimWhitespace is set to false in InputOptions, the value is also trimmed. + * Returns an empty string if the value is not defined. * - * ref: https://fetch.spec.whatwg.org/#concept-body-total-bytes + * @param name name of the input to get + * @param options optional. See InputOptions. + * @returns string + */ +function getInput(name, options) { + const val = process.env[`INPUT_${name.replace(/ /g, '_').toUpperCase()}`] || ''; + if (options && options.required && !val) { + throw new Error(`Input required and not supplied: ${name}`); + } + if (options && options.trimWhitespace === false) { + return val; + } + return val.trim(); +} +exports.getInput = getInput; +/** + * Gets the input value of the boolean type in the YAML 1.2 "core schema" specification. + * Support boolean input list: `true | True | TRUE | false | False | FALSE` . + * The return value is also in boolean type. + * ref: https://yaml.org/spec/1.2/spec.html#id2804923 * - * @param Body instance Instance of Body - * @return Number? Number of bytes, or null if not possible + * @param name name of the input to get + * @param options optional. See InputOptions. + * @returns boolean */ -function getTotalBytes(instance) { - const body = instance.body; - - - if (body === null) { - // body is null - return 0; - } else if (isBlob(body)) { - return body.size; - } else if (Buffer.isBuffer(body)) { - // body is buffer - return body.length; - } else if (body && typeof body.getLengthSync === 'function') { - // detect form data input from form-data module - if (body._lengthRetrievers && body._lengthRetrievers.length == 0 || // 1.x - body.hasKnownLength && body.hasKnownLength()) { - // 2.x - return body.getLengthSync(); - } - return null; - } else { - // body is stream - return null; - } +function getBooleanInput(name, options) { + const trueValue = ['true', 'True', 'TRUE']; + const falseValue = ['false', 'False', 'FALSE']; + const val = getInput(name, options); + if (trueValue.includes(val)) + return true; + if (falseValue.includes(val)) + return false; + throw new TypeError(`Input does not meet YAML 1.2 "Core Schema" specification: ${name}\n` + + `Support boolean input list: \`true | True | TRUE | false | False | FALSE\``); } - +exports.getBooleanInput = getBooleanInput; /** - * Write a Body to a Node.js WritableStream (e.g. http.Request) object. + * Sets the value of an output. * - * @param Body instance Instance of Body - * @return Void + * @param name name of the output to set + * @param value value to store. Non-string values will be converted to a string via JSON.stringify */ -function writeToStream(dest, instance) { - const body = instance.body; - - - if (body === null) { - // body is null - dest.end(); - } else if (isBlob(body)) { - body.stream().pipe(dest); - } else if (Buffer.isBuffer(body)) { - // body is buffer - dest.write(body); - dest.end(); - } else { - // body is stream - body.pipe(dest); - } +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function setOutput(name, value) { + process.stdout.write(os.EOL); + command_1.issueCommand('set-output', { name }, value); } - -// expose Promise -Body.Promise = global.Promise; - +exports.setOutput = setOutput; /** - * headers.js + * Enables or disables the echoing of commands into stdout for the rest of the step. + * Echoing is disabled by default if ACTIONS_STEP_DEBUG is not set. * - * Headers class offers convenient helpers */ - -const invalidTokenRegex = /[^\^_`a-zA-Z\-0-9!#$%&'*+.|~]/; -const invalidHeaderCharRegex = /[^\t\x20-\x7e\x80-\xff]/; - -function validateName(name) { - name = `${name}`; - if (invalidTokenRegex.test(name) || name === '') { - throw new TypeError(`${name} is not a legal HTTP header name`); - } +function setCommandEcho(enabled) { + command_1.issue('echo', enabled ? 'on' : 'off'); } - -function validateValue(value) { - value = `${value}`; - if (invalidHeaderCharRegex.test(value)) { - throw new TypeError(`${value} is not a legal HTTP header value`); - } +exports.setCommandEcho = setCommandEcho; +//----------------------------------------------------------------------- +// Results +//----------------------------------------------------------------------- +/** + * Sets the action status to failed. + * When the action exits it will be with an exit code of 1 + * @param message add error issue message + */ +function setFailed(message) { + process.exitCode = ExitCode.Failure; + error(message); } - +exports.setFailed = setFailed; +//----------------------------------------------------------------------- +// Logging Commands +//----------------------------------------------------------------------- /** - * Find the key in the map object given a header name. + * Gets whether Actions Step Debug is on or not + */ +function isDebug() { + return process.env['RUNNER_DEBUG'] === '1'; +} +exports.isDebug = isDebug; +/** + * Writes debug message to user log + * @param message debug message + */ +function debug(message) { + command_1.issueCommand('debug', {}, message); +} +exports.debug = debug; +/** + * Adds an error issue + * @param message error issue message. Errors will be converted to string via toString() + */ +function error(message) { + command_1.issue('error', message instanceof Error ? message.toString() : message); +} +exports.error = error; +/** + * Adds an warning issue + * @param message warning issue message. Errors will be converted to string via toString() + */ +function warning(message) { + command_1.issue('warning', message instanceof Error ? message.toString() : message); +} +exports.warning = warning; +/** + * Writes info to log with console.log. + * @param message info message + */ +function info(message) { + process.stdout.write(message + os.EOL); +} +exports.info = info; +/** + * Begin an output group. * - * Returns undefined if not found. + * Output until the next `groupEnd` will be foldable in this group * - * @param String name Header name - * @return String|Undefined + * @param name The name of the output group */ -function find(map, name) { - name = name.toLowerCase(); - for (const key in map) { - if (key.toLowerCase() === name) { - return key; - } - } - return undefined; +function startGroup(name) { + command_1.issue('group', name); +} +exports.startGroup = startGroup; +/** + * End an output group. + */ +function endGroup() { + command_1.issue('endgroup'); +} +exports.endGroup = endGroup; +/** + * Wrap an asynchronous function call in a group. + * + * Returns the same type as the function itself. + * + * @param name The name of the group + * @param fn The function to wrap in the group + */ +function group(name, fn) { + return __awaiter(this, void 0, void 0, function* () { + startGroup(name); + let result; + try { + result = yield fn(); + } + finally { + endGroup(); + } + return result; + }); +} +exports.group = group; +//----------------------------------------------------------------------- +// Wrapper action state +//----------------------------------------------------------------------- +/** + * Saves state for current action, the state can only be retrieved by this action's post job execution. + * + * @param name name of the state to store + * @param value value to store. Non-string values will be converted to a string via JSON.stringify + */ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function saveState(name, value) { + command_1.issueCommand('save-state', { name }, value); +} +exports.saveState = saveState; +/** + * Gets the value of an state set by this action's main execution. + * + * @param name name of the state to get + * @returns string + */ +function getState(name) { + return process.env[`STATE_${name}`] || ''; } +exports.getState = getState; +//# sourceMappingURL=core.js.map -const MAP = Symbol('map'); -class Headers { - /** - * Headers class - * - * @param Object headers Response headers - * @return Void - */ - constructor() { - let init = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : undefined; +/***/ }), - this[MAP] = Object.create(null); +/***/ 478: +/***/ (function(module) { - if (init instanceof Headers) { - const rawHeaders = init.raw(); - const headerNames = Object.keys(rawHeaders); +"use strict"; - for (const headerName of headerNames) { - for (const value of rawHeaders[headerName]) { - this.append(headerName, value); - } - } - return; - } +// When writing files on Windows, translate the characters to their +// 0xf000 higher-encoded versions. - // We don't worry about converting prop to ByteString here as append() - // will handle it. - if (init == null) ; else if (typeof init === 'object') { - const method = init[Symbol.iterator]; - if (method != null) { - if (typeof method !== 'function') { - throw new TypeError('Header pairs must be iterable'); - } +const raw = [ + '|', + '<', + '>', + '?', + ':' +] - // sequence> - // Note: per spec we have to first exhaust the lists then process them - const pairs = []; - for (const pair of init) { - if (typeof pair !== 'object' || typeof pair[Symbol.iterator] !== 'function') { - throw new TypeError('Each header pair must be iterable'); - } - pairs.push(Array.from(pair)); - } +const win = raw.map(char => + String.fromCharCode(0xf000 + char.charCodeAt(0))) - for (const pair of pairs) { - if (pair.length !== 2) { - throw new TypeError('Each header pair must be a name/value tuple'); - } - this.append(pair[0], pair[1]); - } - } else { - // record - for (const key of Object.keys(init)) { - const value = init[key]; - this.append(key, value); - } - } - } else { - throw new TypeError('Provided initializer must be an object'); - } - } +const toWin = new Map(raw.map((char, i) => [char, win[i]])) +const toRaw = new Map(win.map((char, i) => [char, raw[i]])) - /** - * Return combined header value given name - * - * @param String name Header name - * @return Mixed - */ - get(name) { - name = `${name}`; - validateName(name); - const key = find(this[MAP], name); - if (key === undefined) { - return null; - } +module.exports = { + encode: s => raw.reduce((s, c) => s.split(c).join(toWin.get(c)), s), + decode: s => win.reduce((s, c) => s.split(c).join(toRaw.get(c)), s) +} - return this[MAP][key].join(', '); - } - /** - * Iterate over all headers - * - * @param Function callback Executed for each item with parameters (value, name, thisArg) - * @param Boolean thisArg `this` context for callback function - * @return Void - */ - forEach(callback) { - let thisArg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined; +/***/ }), - let pairs = getHeaders(this); - let i = 0; - while (i < pairs.length) { - var _pairs$i = pairs[i]; - const name = _pairs$i[0], - value = _pairs$i[1]; +/***/ 510: +/***/ (function(module) { - callback.call(thisArg, value, name, this); - pairs = getHeaders(this); - i++; - } - } +module.exports = addHook; - /** - * Overwrite header values given name - * - * @param String name Header name - * @param String value Header value - * @return Void - */ - set(name, value) { - name = `${name}`; - value = `${value}`; - validateName(name); - validateValue(value); - const key = find(this[MAP], name); - this[MAP][key !== undefined ? key : name] = [value]; - } +function addHook(state, kind, name, hook) { + var orig = hook; + if (!state.registry[name]) { + state.registry[name] = []; + } - /** - * Append a value onto existing header - * - * @param String name Header name - * @param String value Header value - * @return Void - */ - append(name, value) { - name = `${name}`; - value = `${value}`; - validateName(name); - validateValue(value); - const key = find(this[MAP], name); - if (key !== undefined) { - this[MAP][key].push(value); - } else { - this[MAP][name] = [value]; - } - } + if (kind === "before") { + hook = function (method, options) { + return Promise.resolve() + .then(orig.bind(null, options)) + .then(method.bind(null, options)); + }; + } - /** - * Check for header name existence - * - * @param String name Header name - * @return Boolean - */ - has(name) { - name = `${name}`; - validateName(name); - return find(this[MAP], name) !== undefined; - } + if (kind === "after") { + hook = function (method, options) { + var result; + return Promise.resolve() + .then(method.bind(null, options)) + .then(function (result_) { + result = result_; + return orig(result, options); + }) + .then(function () { + return result; + }); + }; + } - /** - * Delete all header values given name - * - * @param String name Header name - * @return Void - */ - delete(name) { - name = `${name}`; - validateName(name); - const key = find(this[MAP], name); - if (key !== undefined) { - delete this[MAP][key]; - } - } + if (kind === "error") { + hook = function (method, options) { + return Promise.resolve() + .then(method.bind(null, options)) + .catch(function (error) { + return orig(error, options); + }); + }; + } - /** - * Return raw headers (non-spec api) - * - * @return Object - */ - raw() { - return this[MAP]; - } + state.registry[name].push({ + hook: hook, + orig: orig, + }); +} - /** - * Get an iterator on keys. - * - * @return Iterator - */ - keys() { - return createHeadersIterator(this, 'key'); - } - /** - * Get an iterator on values. - * - * @return Iterator - */ - values() { - return createHeadersIterator(this, 'value'); - } +/***/ }), - /** - * Get an iterator on entries. - * - * This is the default iterator of the Headers object. - * - * @return Iterator - */ - [Symbol.iterator]() { - return createHeadersIterator(this, 'key+value'); - } -} -Headers.prototype.entries = Headers.prototype[Symbol.iterator]; +/***/ 521: +/***/ (function(__unusedmodule, exports, __webpack_require__) { -Object.defineProperty(Headers.prototype, Symbol.toStringTag, { - value: 'Headers', - writable: false, - enumerable: false, - configurable: true -}); +"use strict"; -Object.defineProperties(Headers.prototype, { - get: { enumerable: true }, - forEach: { enumerable: true }, - set: { enumerable: true }, - append: { enumerable: true }, - has: { enumerable: true }, - delete: { enumerable: true }, - keys: { enumerable: true }, - values: { enumerable: true }, - entries: { enumerable: true } +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; }); - -function getHeaders(headers) { - let kind = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'key+value'; - - const keys = Object.keys(headers[MAP]).sort(); - return keys.map(kind === 'key' ? function (k) { - return k.toLowerCase(); - } : kind === 'value' ? function (k) { - return headers[MAP][k].join(', '); - } : function (k) { - return [k.toLowerCase(), headers[MAP][k].join(', ')]; - }); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.getOctokitOptions = exports.GitHub = exports.context = void 0; +const Context = __importStar(__webpack_require__(262)); +const Utils = __importStar(__webpack_require__(127)); +// octokit + plugins +const core_1 = __webpack_require__(448); +const plugin_rest_endpoint_methods_1 = __webpack_require__(559); +const plugin_paginate_rest_1 = __webpack_require__(299); +exports.context = new Context.Context(); +const baseUrl = Utils.getApiBaseUrl(); +const defaults = { + baseUrl, + request: { + agent: Utils.getProxyAgent(baseUrl) + } +}; +exports.GitHub = core_1.Octokit.plugin(plugin_rest_endpoint_methods_1.restEndpointMethods, plugin_paginate_rest_1.paginateRest).defaults(defaults); +/** + * Convience function to correctly format Octokit Options to pass into the constructor. + * + * @param token the repo PAT or GITHUB_TOKEN + * @param options other options to set + */ +function getOctokitOptions(token, options) { + const opts = Object.assign({}, options || {}); // Shallow clone - don't mutate the object provided by the caller + // Auth + const auth = Utils.getAuthString(token, opts); + if (auth) { + opts.auth = auth; + } + return opts; } +exports.getOctokitOptions = getOctokitOptions; +//# sourceMappingURL=utils.js.map -const INTERNAL = Symbol('internal'); - -function createHeadersIterator(target, kind) { - const iterator = Object.create(HeadersIteratorPrototype); - iterator[INTERNAL] = { - target, - kind, - index: 0 - }; - return iterator; -} +/***/ }), -const HeadersIteratorPrototype = Object.setPrototypeOf({ - next() { - // istanbul ignore if - if (!this || Object.getPrototypeOf(this) !== HeadersIteratorPrototype) { - throw new TypeError('Value of `this` is not a HeadersIterator'); - } +/***/ 523: +/***/ (function(module, __unusedexports, __webpack_require__) { - var _INTERNAL = this[INTERNAL]; - const target = _INTERNAL.target, - kind = _INTERNAL.kind, - index = _INTERNAL.index; +var register = __webpack_require__(280) +var addHook = __webpack_require__(510) +var removeHook = __webpack_require__(866) - const values = getHeaders(target, kind); - const len = values.length; - if (index >= len) { - return { - value: undefined, - done: true - }; - } +// bind with array of arguments: https://stackoverflow.com/a/21792913 +var bind = Function.bind +var bindable = bind.bind(bind) - this[INTERNAL].index = index + 1; +function bindApi (hook, state, name) { + var removeHookRef = bindable(removeHook, null).apply(null, name ? [state, name] : [state]) + hook.api = { remove: removeHookRef } + hook.remove = removeHookRef - return { - value: values[index], - done: false - }; - } -}, Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()))); + ;['before', 'error', 'after', 'wrap'].forEach(function (kind) { + var args = name ? [state, kind, name] : [state, kind] + hook[kind] = hook.api[kind] = bindable(addHook, null).apply(null, args) + }) +} -Object.defineProperty(HeadersIteratorPrototype, Symbol.toStringTag, { - value: 'HeadersIterator', - writable: false, - enumerable: false, - configurable: true -}); +function HookSingular () { + var singularHookName = 'h' + var singularHookState = { + registry: {} + } + var singularHook = register.bind(null, singularHookState, singularHookName) + bindApi(singularHook, singularHookState, singularHookName) + return singularHook +} -/** - * Export the Headers object in a form that Node.js can consume. - * - * @param Headers headers - * @return Object - */ -function exportNodeCompatibleHeaders(headers) { - const obj = Object.assign({ __proto__: null }, headers[MAP]); +function HookCollection () { + var state = { + registry: {} + } - // http.request() only supports string as Host header. This hack makes - // specifying custom Host header possible. - const hostHeaderKey = find(headers[MAP], 'Host'); - if (hostHeaderKey !== undefined) { - obj[hostHeaderKey] = obj[hostHeaderKey][0]; - } + var hook = register.bind(null, state) + bindApi(hook, state) - return obj; + return hook } -/** - * Create a Headers object from an object of headers, ignoring those that do - * not conform to HTTP grammar productions. - * - * @param Object obj Object of headers - * @return Headers - */ -function createHeadersLenient(obj) { - const headers = new Headers(); - for (const name of Object.keys(obj)) { - if (invalidTokenRegex.test(name)) { - continue; - } - if (Array.isArray(obj[name])) { - for (const val of obj[name]) { - if (invalidHeaderCharRegex.test(val)) { - continue; - } - if (headers[MAP][name] === undefined) { - headers[MAP][name] = [val]; - } else { - headers[MAP][name].push(val); - } - } - } else if (!invalidHeaderCharRegex.test(obj[name])) { - headers[MAP][name] = [obj[name]]; - } - } - return headers; +var collectionHookDeprecationMessageDisplayed = false +function Hook () { + if (!collectionHookDeprecationMessageDisplayed) { + console.warn('[before-after-hook]: "Hook()" repurposing warning, use "Hook.Collection()". Read more: https://git.io/upgrade-before-after-hook-to-1.4') + collectionHookDeprecationMessageDisplayed = true + } + return HookCollection() } -const INTERNALS$1 = Symbol('Response internals'); +Hook.Singular = HookSingular.bind() +Hook.Collection = HookCollection.bind() -// fix an issue where "STATUS_CODES" aren't a named export for node <10 -const STATUS_CODES = http.STATUS_CODES; +module.exports = Hook +// expose constructors as a named property for TypeScript +module.exports.Hook = Hook +module.exports.Singular = Hook.Singular +module.exports.Collection = Hook.Collection -/** - * Response class - * - * @param Stream body Readable stream - * @param Object opts Response options - * @return Void - */ -class Response { - constructor() { - let body = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; - let opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - Body.call(this, body, opts); +/***/ }), - const status = opts.status || 200; - const headers = new Headers(opts.headers); +/***/ 526: +/***/ (function(__unusedmodule, exports) { - if (body != null && !headers.has('Content-Type')) { - const contentType = extractContentType(body); - if (contentType) { - headers.append('Content-Type', contentType); - } - } +"use strict"; - this[INTERNALS$1] = { - url: opts.url, - status, - statusText: opts.statusText || STATUS_CODES[status], - headers, - counter: opts.counter - }; - } - get url() { - return this[INTERNALS$1].url || ''; - } +Object.defineProperty(exports, '__esModule', { value: true }); - get status() { - return this[INTERNALS$1].status; - } +function getUserAgent() { + if (typeof navigator === "object" && "userAgent" in navigator) { + return navigator.userAgent; + } - /** - * Convenience property representing if the request ended normally - */ - get ok() { - return this[INTERNALS$1].status >= 200 && this[INTERNALS$1].status < 300; - } + if (typeof process === "object" && "version" in process) { + return `Node.js/${process.version.substr(1)} (${process.platform}; ${process.arch})`; + } - get redirected() { - return this[INTERNALS$1].counter > 0; - } + return ""; +} - get statusText() { - return this[INTERNALS$1].statusText; - } +exports.getUserAgent = getUserAgent; +//# sourceMappingURL=index.js.map - get headers() { - return this[INTERNALS$1].headers; - } - /** - * Clone this response - * - * @return Response - */ - clone() { - return new Response(clone(this), { - url: this.url, - status: this.status, - statusText: this.statusText, - headers: this.headers, - ok: this.ok, - redirected: this.redirected - }); - } +/***/ }), + +/***/ 539: +/***/ (function(__unusedmodule, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const http = __webpack_require__(605); +const https = __webpack_require__(211); +const pm = __webpack_require__(950); +let tunnel; +var HttpCodes; +(function (HttpCodes) { + HttpCodes[HttpCodes["OK"] = 200] = "OK"; + HttpCodes[HttpCodes["MultipleChoices"] = 300] = "MultipleChoices"; + HttpCodes[HttpCodes["MovedPermanently"] = 301] = "MovedPermanently"; + HttpCodes[HttpCodes["ResourceMoved"] = 302] = "ResourceMoved"; + HttpCodes[HttpCodes["SeeOther"] = 303] = "SeeOther"; + HttpCodes[HttpCodes["NotModified"] = 304] = "NotModified"; + HttpCodes[HttpCodes["UseProxy"] = 305] = "UseProxy"; + HttpCodes[HttpCodes["SwitchProxy"] = 306] = "SwitchProxy"; + HttpCodes[HttpCodes["TemporaryRedirect"] = 307] = "TemporaryRedirect"; + HttpCodes[HttpCodes["PermanentRedirect"] = 308] = "PermanentRedirect"; + HttpCodes[HttpCodes["BadRequest"] = 400] = "BadRequest"; + HttpCodes[HttpCodes["Unauthorized"] = 401] = "Unauthorized"; + HttpCodes[HttpCodes["PaymentRequired"] = 402] = "PaymentRequired"; + HttpCodes[HttpCodes["Forbidden"] = 403] = "Forbidden"; + HttpCodes[HttpCodes["NotFound"] = 404] = "NotFound"; + HttpCodes[HttpCodes["MethodNotAllowed"] = 405] = "MethodNotAllowed"; + HttpCodes[HttpCodes["NotAcceptable"] = 406] = "NotAcceptable"; + HttpCodes[HttpCodes["ProxyAuthenticationRequired"] = 407] = "ProxyAuthenticationRequired"; + HttpCodes[HttpCodes["RequestTimeout"] = 408] = "RequestTimeout"; + HttpCodes[HttpCodes["Conflict"] = 409] = "Conflict"; + HttpCodes[HttpCodes["Gone"] = 410] = "Gone"; + HttpCodes[HttpCodes["TooManyRequests"] = 429] = "TooManyRequests"; + HttpCodes[HttpCodes["InternalServerError"] = 500] = "InternalServerError"; + HttpCodes[HttpCodes["NotImplemented"] = 501] = "NotImplemented"; + HttpCodes[HttpCodes["BadGateway"] = 502] = "BadGateway"; + HttpCodes[HttpCodes["ServiceUnavailable"] = 503] = "ServiceUnavailable"; + HttpCodes[HttpCodes["GatewayTimeout"] = 504] = "GatewayTimeout"; +})(HttpCodes = exports.HttpCodes || (exports.HttpCodes = {})); +var Headers; +(function (Headers) { + Headers["Accept"] = "accept"; + Headers["ContentType"] = "content-type"; +})(Headers = exports.Headers || (exports.Headers = {})); +var MediaTypes; +(function (MediaTypes) { + MediaTypes["ApplicationJson"] = "application/json"; +})(MediaTypes = exports.MediaTypes || (exports.MediaTypes = {})); +/** + * Returns the proxy URL, depending upon the supplied url and proxy environment variables. + * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com + */ +function getProxyUrl(serverUrl) { + let proxyUrl = pm.getProxyUrl(new URL(serverUrl)); + return proxyUrl ? proxyUrl.href : ''; +} +exports.getProxyUrl = getProxyUrl; +const HttpRedirectCodes = [ + HttpCodes.MovedPermanently, + HttpCodes.ResourceMoved, + HttpCodes.SeeOther, + HttpCodes.TemporaryRedirect, + HttpCodes.PermanentRedirect +]; +const HttpResponseRetryCodes = [ + HttpCodes.BadGateway, + HttpCodes.ServiceUnavailable, + HttpCodes.GatewayTimeout +]; +const RetryableHttpVerbs = ['OPTIONS', 'GET', 'DELETE', 'HEAD']; +const ExponentialBackoffCeiling = 10; +const ExponentialBackoffTimeSlice = 5; +class HttpClientError extends Error { + constructor(message, statusCode) { + super(message); + this.name = 'HttpClientError'; + this.statusCode = statusCode; + Object.setPrototypeOf(this, HttpClientError.prototype); + } +} +exports.HttpClientError = HttpClientError; +class HttpClientResponse { + constructor(message) { + this.message = message; + } + readBody() { + return new Promise(async (resolve, reject) => { + let output = Buffer.alloc(0); + this.message.on('data', (chunk) => { + output = Buffer.concat([output, chunk]); + }); + this.message.on('end', () => { + resolve(output.toString()); + }); + }); + } +} +exports.HttpClientResponse = HttpClientResponse; +function isHttps(requestUrl) { + let parsedUrl = new URL(requestUrl); + return parsedUrl.protocol === 'https:'; +} +exports.isHttps = isHttps; +class HttpClient { + constructor(userAgent, handlers, requestOptions) { + this._ignoreSslError = false; + this._allowRedirects = true; + this._allowRedirectDowngrade = false; + this._maxRedirects = 50; + this._allowRetries = false; + this._maxRetries = 1; + this._keepAlive = false; + this._disposed = false; + this.userAgent = userAgent; + this.handlers = handlers || []; + this.requestOptions = requestOptions; + if (requestOptions) { + if (requestOptions.ignoreSslError != null) { + this._ignoreSslError = requestOptions.ignoreSslError; + } + this._socketTimeout = requestOptions.socketTimeout; + if (requestOptions.allowRedirects != null) { + this._allowRedirects = requestOptions.allowRedirects; + } + if (requestOptions.allowRedirectDowngrade != null) { + this._allowRedirectDowngrade = requestOptions.allowRedirectDowngrade; + } + if (requestOptions.maxRedirects != null) { + this._maxRedirects = Math.max(requestOptions.maxRedirects, 0); + } + if (requestOptions.keepAlive != null) { + this._keepAlive = requestOptions.keepAlive; + } + if (requestOptions.allowRetries != null) { + this._allowRetries = requestOptions.allowRetries; + } + if (requestOptions.maxRetries != null) { + this._maxRetries = requestOptions.maxRetries; + } + } + } + options(requestUrl, additionalHeaders) { + return this.request('OPTIONS', requestUrl, null, additionalHeaders || {}); + } + get(requestUrl, additionalHeaders) { + return this.request('GET', requestUrl, null, additionalHeaders || {}); + } + del(requestUrl, additionalHeaders) { + return this.request('DELETE', requestUrl, null, additionalHeaders || {}); + } + post(requestUrl, data, additionalHeaders) { + return this.request('POST', requestUrl, data, additionalHeaders || {}); + } + patch(requestUrl, data, additionalHeaders) { + return this.request('PATCH', requestUrl, data, additionalHeaders || {}); + } + put(requestUrl, data, additionalHeaders) { + return this.request('PUT', requestUrl, data, additionalHeaders || {}); + } + head(requestUrl, additionalHeaders) { + return this.request('HEAD', requestUrl, null, additionalHeaders || {}); + } + sendStream(verb, requestUrl, stream, additionalHeaders) { + return this.request(verb, requestUrl, stream, additionalHeaders); + } + /** + * Gets a typed object from an endpoint + * Be aware that not found returns a null. Other errors (4xx, 5xx) reject the promise + */ + async getJson(requestUrl, additionalHeaders = {}) { + additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); + let res = await this.get(requestUrl, additionalHeaders); + return this._processResponse(res, this.requestOptions); + } + async postJson(requestUrl, obj, additionalHeaders = {}) { + let data = JSON.stringify(obj, null, 2); + additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); + additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); + let res = await this.post(requestUrl, data, additionalHeaders); + return this._processResponse(res, this.requestOptions); + } + async putJson(requestUrl, obj, additionalHeaders = {}) { + let data = JSON.stringify(obj, null, 2); + additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); + additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); + let res = await this.put(requestUrl, data, additionalHeaders); + return this._processResponse(res, this.requestOptions); + } + async patchJson(requestUrl, obj, additionalHeaders = {}) { + let data = JSON.stringify(obj, null, 2); + additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); + additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); + let res = await this.patch(requestUrl, data, additionalHeaders); + return this._processResponse(res, this.requestOptions); + } + /** + * Makes a raw http request. + * All other methods such as get, post, patch, and request ultimately call this. + * Prefer get, del, post and patch + */ + async request(verb, requestUrl, data, headers) { + if (this._disposed) { + throw new Error('Client has already been disposed.'); + } + let parsedUrl = new URL(requestUrl); + let info = this._prepareRequest(verb, parsedUrl, headers); + // Only perform retries on reads since writes may not be idempotent. + let maxTries = this._allowRetries && RetryableHttpVerbs.indexOf(verb) != -1 + ? this._maxRetries + 1 + : 1; + let numTries = 0; + let response; + while (numTries < maxTries) { + response = await this.requestRaw(info, data); + // Check if it's an authentication challenge + if (response && + response.message && + response.message.statusCode === HttpCodes.Unauthorized) { + let authenticationHandler; + for (let i = 0; i < this.handlers.length; i++) { + if (this.handlers[i].canHandleAuthentication(response)) { + authenticationHandler = this.handlers[i]; + break; + } + } + if (authenticationHandler) { + return authenticationHandler.handleAuthentication(this, info, data); + } + else { + // We have received an unauthorized response but have no handlers to handle it. + // Let the response return to the caller. + return response; + } + } + let redirectsRemaining = this._maxRedirects; + while (HttpRedirectCodes.indexOf(response.message.statusCode) != -1 && + this._allowRedirects && + redirectsRemaining > 0) { + const redirectUrl = response.message.headers['location']; + if (!redirectUrl) { + // if there's no location to redirect to, we won't + break; + } + let parsedRedirectUrl = new URL(redirectUrl); + if (parsedUrl.protocol == 'https:' && + parsedUrl.protocol != parsedRedirectUrl.protocol && + !this._allowRedirectDowngrade) { + throw new Error('Redirect from HTTPS to HTTP protocol. This downgrade is not allowed for security reasons. If you want to allow this behavior, set the allowRedirectDowngrade option to true.'); + } + // we need to finish reading the response before reassigning response + // which will leak the open socket. + await response.readBody(); + // strip authorization header if redirected to a different hostname + if (parsedRedirectUrl.hostname !== parsedUrl.hostname) { + for (let header in headers) { + // header names are case insensitive + if (header.toLowerCase() === 'authorization') { + delete headers[header]; + } + } + } + // let's make the request with the new redirectUrl + info = this._prepareRequest(verb, parsedRedirectUrl, headers); + response = await this.requestRaw(info, data); + redirectsRemaining--; + } + if (HttpResponseRetryCodes.indexOf(response.message.statusCode) == -1) { + // If not a retry code, return immediately instead of retrying + return response; + } + numTries += 1; + if (numTries < maxTries) { + await response.readBody(); + await this._performExponentialBackoff(numTries); + } + } + return response; + } + /** + * Needs to be called if keepAlive is set to true in request options. + */ + dispose() { + if (this._agent) { + this._agent.destroy(); + } + this._disposed = true; + } + /** + * Raw request. + * @param info + * @param data + */ + requestRaw(info, data) { + return new Promise((resolve, reject) => { + let callbackForResult = function (err, res) { + if (err) { + reject(err); + } + resolve(res); + }; + this.requestRawWithCallback(info, data, callbackForResult); + }); + } + /** + * Raw request with callback. + * @param info + * @param data + * @param onResult + */ + requestRawWithCallback(info, data, onResult) { + let socket; + if (typeof data === 'string') { + info.options.headers['Content-Length'] = Buffer.byteLength(data, 'utf8'); + } + let callbackCalled = false; + let handleResult = (err, res) => { + if (!callbackCalled) { + callbackCalled = true; + onResult(err, res); + } + }; + let req = info.httpModule.request(info.options, (msg) => { + let res = new HttpClientResponse(msg); + handleResult(null, res); + }); + req.on('socket', sock => { + socket = sock; + }); + // If we ever get disconnected, we want the socket to timeout eventually + req.setTimeout(this._socketTimeout || 3 * 60000, () => { + if (socket) { + socket.end(); + } + handleResult(new Error('Request timeout: ' + info.options.path), null); + }); + req.on('error', function (err) { + // err has statusCode property + // res should have headers + handleResult(err, null); + }); + if (data && typeof data === 'string') { + req.write(data, 'utf8'); + } + if (data && typeof data !== 'string') { + data.on('close', function () { + req.end(); + }); + data.pipe(req); + } + else { + req.end(); + } + } + /** + * Gets an http agent. This function is useful when you need an http agent that handles + * routing through a proxy server - depending upon the url and proxy environment variables. + * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com + */ + getAgent(serverUrl) { + let parsedUrl = new URL(serverUrl); + return this._getAgent(parsedUrl); + } + _prepareRequest(method, requestUrl, headers) { + const info = {}; + info.parsedUrl = requestUrl; + const usingSsl = info.parsedUrl.protocol === 'https:'; + info.httpModule = usingSsl ? https : http; + const defaultPort = usingSsl ? 443 : 80; + info.options = {}; + info.options.host = info.parsedUrl.hostname; + info.options.port = info.parsedUrl.port + ? parseInt(info.parsedUrl.port) + : defaultPort; + info.options.path = + (info.parsedUrl.pathname || '') + (info.parsedUrl.search || ''); + info.options.method = method; + info.options.headers = this._mergeHeaders(headers); + if (this.userAgent != null) { + info.options.headers['user-agent'] = this.userAgent; + } + info.options.agent = this._getAgent(info.parsedUrl); + // gives handlers an opportunity to participate + if (this.handlers) { + this.handlers.forEach(handler => { + handler.prepareRequest(info.options); + }); + } + return info; + } + _mergeHeaders(headers) { + const lowercaseKeys = obj => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {}); + if (this.requestOptions && this.requestOptions.headers) { + return Object.assign({}, lowercaseKeys(this.requestOptions.headers), lowercaseKeys(headers)); + } + return lowercaseKeys(headers || {}); + } + _getExistingOrDefaultHeader(additionalHeaders, header, _default) { + const lowercaseKeys = obj => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {}); + let clientHeader; + if (this.requestOptions && this.requestOptions.headers) { + clientHeader = lowercaseKeys(this.requestOptions.headers)[header]; + } + return additionalHeaders[header] || clientHeader || _default; + } + _getAgent(parsedUrl) { + let agent; + let proxyUrl = pm.getProxyUrl(parsedUrl); + let useProxy = proxyUrl && proxyUrl.hostname; + if (this._keepAlive && useProxy) { + agent = this._proxyAgent; + } + if (this._keepAlive && !useProxy) { + agent = this._agent; + } + // if agent is already assigned use that agent. + if (!!agent) { + return agent; + } + const usingSsl = parsedUrl.protocol === 'https:'; + let maxSockets = 100; + if (!!this.requestOptions) { + maxSockets = this.requestOptions.maxSockets || http.globalAgent.maxSockets; + } + if (useProxy) { + // If using proxy, need tunnel + if (!tunnel) { + tunnel = __webpack_require__(856); + } + const agentOptions = { + maxSockets: maxSockets, + keepAlive: this._keepAlive, + proxy: { + ...((proxyUrl.username || proxyUrl.password) && { + proxyAuth: `${proxyUrl.username}:${proxyUrl.password}` + }), + host: proxyUrl.hostname, + port: proxyUrl.port + } + }; + let tunnelAgent; + const overHttps = proxyUrl.protocol === 'https:'; + if (usingSsl) { + tunnelAgent = overHttps ? tunnel.httpsOverHttps : tunnel.httpsOverHttp; + } + else { + tunnelAgent = overHttps ? tunnel.httpOverHttps : tunnel.httpOverHttp; + } + agent = tunnelAgent(agentOptions); + this._proxyAgent = agent; + } + // if reusing agent across request and tunneling agent isn't assigned create a new agent + if (this._keepAlive && !agent) { + const options = { keepAlive: this._keepAlive, maxSockets: maxSockets }; + agent = usingSsl ? new https.Agent(options) : new http.Agent(options); + this._agent = agent; + } + // if not using private agent and tunnel agent isn't setup then use global agent + if (!agent) { + agent = usingSsl ? https.globalAgent : http.globalAgent; + } + if (usingSsl && this._ignoreSslError) { + // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process + // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options + // we have to cast it to any and change it directly + agent.options = Object.assign(agent.options || {}, { + rejectUnauthorized: false + }); + } + return agent; + } + _performExponentialBackoff(retryNumber) { + retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber); + const ms = ExponentialBackoffTimeSlice * Math.pow(2, retryNumber); + return new Promise(resolve => setTimeout(() => resolve(), ms)); + } + static dateTimeDeserializer(key, value) { + if (typeof value === 'string') { + let a = new Date(value); + if (!isNaN(a.valueOf())) { + return a; + } + } + return value; + } + async _processResponse(res, options) { + return new Promise(async (resolve, reject) => { + const statusCode = res.message.statusCode; + const response = { + statusCode: statusCode, + result: null, + headers: {} + }; + // not found leads to null obj returned + if (statusCode == HttpCodes.NotFound) { + resolve(response); + } + let obj; + let contents; + // get the result from the body + try { + contents = await res.readBody(); + if (contents && contents.length > 0) { + if (options && options.deserializeDates) { + obj = JSON.parse(contents, HttpClient.dateTimeDeserializer); + } + else { + obj = JSON.parse(contents); + } + response.result = obj; + } + response.headers = res.message.headers; + } + catch (err) { + // Invalid resource (contents not json); leaving result obj null + } + // note that 3xx redirects are handled by the http layer. + if (statusCode > 299) { + let msg; + // if exception/error in body, attempt to get better error + if (obj && obj.message) { + msg = obj.message; + } + else if (contents && contents.length > 0) { + // it may be the case that the exception is in the body message as string + msg = contents; + } + else { + msg = 'Failed request: (' + statusCode + ')'; + } + let err = new HttpClientError(msg, statusCode); + err.result = response.result; + reject(err); + } + else { + resolve(response); + } + }); + } } +exports.HttpClient = HttpClient; -Body.mixIn(Response.prototype); -Object.defineProperties(Response.prototype, { - url: { enumerable: true }, - status: { enumerable: true }, - ok: { enumerable: true }, - redirected: { enumerable: true }, - statusText: { enumerable: true }, - headers: { enumerable: true }, - clone: { enumerable: true } -}); +/***/ }), -Object.defineProperty(Response.prototype, Symbol.toStringTag, { - value: 'Response', - writable: false, - enumerable: false, - configurable: true -}); +/***/ 554: +/***/ (function(__unusedmodule, exports) { -const INTERNALS$2 = Symbol('Request internals'); +"use strict"; -// fix an issue where "format", "parse" aren't a named export for node <10 -const parse_url = Url.parse; -const format_url = Url.format; +// map types from key to human-friendly name +exports.name = new Map([ + ['0', 'File'], + // same as File + ['', 'OldFile'], + ['1', 'Link'], + ['2', 'SymbolicLink'], + // Devices and FIFOs aren't fully supported + // they are parsed, but skipped when unpacking + ['3', 'CharacterDevice'], + ['4', 'BlockDevice'], + ['5', 'Directory'], + ['6', 'FIFO'], + // same as File + ['7', 'ContiguousFile'], + // pax headers + ['g', 'GlobalExtendedHeader'], + ['x', 'ExtendedHeader'], + // vendor-specific stuff + // skip + ['A', 'SolarisACL'], + // like 5, but with data, which should be skipped + ['D', 'GNUDumpDir'], + // metadata only, skip + ['I', 'Inode'], + // data = link path of next file + ['K', 'NextFileHasLongLinkpath'], + // data = path of next file + ['L', 'NextFileHasLongPath'], + // skip + ['M', 'ContinuationFile'], + // like L + ['N', 'OldGnuLongPath'], + // skip + ['S', 'SparseFile'], + // skip + ['V', 'TapeVolumeHeader'], + // like x + ['X', 'OldExtendedHeader'] +]) -const streamDestructionSupported = 'destroy' in Stream.Readable.prototype; +// map the other direction +exports.code = new Map(Array.from(exports.name).map(kv => [kv[1], kv[0]])) -/** - * Check if a value is an instance of Request. - * - * @param Mixed input - * @return Boolean - */ -function isRequest(input) { - return typeof input === 'object' && typeof input[INTERNALS$2] === 'object'; -} -function isAbortSignal(signal) { - const proto = signal && typeof signal === 'object' && Object.getPrototypeOf(signal); - return !!(proto && proto.constructor.name === 'AbortSignal'); -} +/***/ }), -/** - * Request class - * - * @param Mixed input Url or Request instance - * @param Object init Custom options - * @return Void - */ -class Request { - constructor(input) { - let init = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; +/***/ 559: +/***/ (function(__unusedmodule, exports) { - let parsedURL; +"use strict"; - // normalize input - if (!isRequest(input)) { - if (input && input.href) { - // in order to support Node.js' Url objects; though WHATWG's URL objects - // will fall into this branch also (since their `toString()` will return - // `href` property anyway) - parsedURL = parse_url(input.href); - } else { - // coerce input to a string before attempting to parse - parsedURL = parse_url(`${input}`); - } - input = {}; - } else { - parsedURL = parse_url(input.url); - } - let method = init.method || input.method || 'GET'; - method = method.toUpperCase(); +Object.defineProperty(exports, '__esModule', { value: true }); - if ((init.body != null || isRequest(input) && input.body !== null) && (method === 'GET' || method === 'HEAD')) { - throw new TypeError('Request with GET/HEAD method cannot have body'); - } +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } - let inputBody = init.body != null ? init.body : isRequest(input) && input.body !== null ? clone(input) : null; + return obj; +} - Body.call(this, inputBody, { - timeout: init.timeout || input.timeout || 0, - size: init.size || input.size || 0 - }); +function ownKeys(object, enumerableOnly) { + var keys = Object.keys(object); - const headers = new Headers(init.headers || input.headers || {}); + if (Object.getOwnPropertySymbols) { + var symbols = Object.getOwnPropertySymbols(object); + if (enumerableOnly) symbols = symbols.filter(function (sym) { + return Object.getOwnPropertyDescriptor(object, sym).enumerable; + }); + keys.push.apply(keys, symbols); + } - if (inputBody != null && !headers.has('Content-Type')) { - const contentType = extractContentType(inputBody); - if (contentType) { - headers.append('Content-Type', contentType); - } - } + return keys; +} - let signal = isRequest(input) ? input.signal : null; - if ('signal' in init) signal = init.signal; +function _objectSpread2(target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i] != null ? arguments[i] : {}; - if (signal != null && !isAbortSignal(signal)) { - throw new TypeError('Expected signal to be an instanceof AbortSignal'); - } + if (i % 2) { + ownKeys(Object(source), true).forEach(function (key) { + _defineProperty(target, key, source[key]); + }); + } else if (Object.getOwnPropertyDescriptors) { + Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); + } else { + ownKeys(Object(source)).forEach(function (key) { + Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); + }); + } + } - this[INTERNALS$2] = { - method, - redirect: init.redirect || input.redirect || 'follow', - headers, - parsedURL, - signal - }; + return target; +} - // node-fetch-only options - this.follow = init.follow !== undefined ? init.follow : input.follow !== undefined ? input.follow : 20; - this.compress = init.compress !== undefined ? init.compress : input.compress !== undefined ? input.compress : true; - this.counter = init.counter || input.counter || 0; - this.agent = init.agent || input.agent; - } +const Endpoints = { + actions: { + addSelectedRepoToOrgSecret: ["PUT /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}"], + cancelWorkflowRun: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/cancel"], + createOrUpdateEnvironmentSecret: ["PUT /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}"], + createOrUpdateOrgSecret: ["PUT /orgs/{org}/actions/secrets/{secret_name}"], + createOrUpdateRepoSecret: ["PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}"], + createRegistrationTokenForOrg: ["POST /orgs/{org}/actions/runners/registration-token"], + createRegistrationTokenForRepo: ["POST /repos/{owner}/{repo}/actions/runners/registration-token"], + createRemoveTokenForOrg: ["POST /orgs/{org}/actions/runners/remove-token"], + createRemoveTokenForRepo: ["POST /repos/{owner}/{repo}/actions/runners/remove-token"], + createWorkflowDispatch: ["POST /repos/{owner}/{repo}/actions/workflows/{workflow_id}/dispatches"], + deleteArtifact: ["DELETE /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"], + deleteEnvironmentSecret: ["DELETE /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}"], + deleteOrgSecret: ["DELETE /orgs/{org}/actions/secrets/{secret_name}"], + deleteRepoSecret: ["DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}"], + deleteSelfHostedRunnerFromOrg: ["DELETE /orgs/{org}/actions/runners/{runner_id}"], + deleteSelfHostedRunnerFromRepo: ["DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}"], + deleteWorkflowRun: ["DELETE /repos/{owner}/{repo}/actions/runs/{run_id}"], + deleteWorkflowRunLogs: ["DELETE /repos/{owner}/{repo}/actions/runs/{run_id}/logs"], + disableSelectedRepositoryGithubActionsOrganization: ["DELETE /orgs/{org}/actions/permissions/repositories/{repository_id}"], + disableWorkflow: ["PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/disable"], + downloadArtifact: ["GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}/{archive_format}"], + downloadJobLogsForWorkflowRun: ["GET /repos/{owner}/{repo}/actions/jobs/{job_id}/logs"], + downloadWorkflowRunLogs: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/logs"], + enableSelectedRepositoryGithubActionsOrganization: ["PUT /orgs/{org}/actions/permissions/repositories/{repository_id}"], + enableWorkflow: ["PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/enable"], + getAllowedActionsOrganization: ["GET /orgs/{org}/actions/permissions/selected-actions"], + getAllowedActionsRepository: ["GET /repos/{owner}/{repo}/actions/permissions/selected-actions"], + getArtifact: ["GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"], + getEnvironmentPublicKey: ["GET /repositories/{repository_id}/environments/{environment_name}/secrets/public-key"], + getEnvironmentSecret: ["GET /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}"], + getGithubActionsPermissionsOrganization: ["GET /orgs/{org}/actions/permissions"], + getGithubActionsPermissionsRepository: ["GET /repos/{owner}/{repo}/actions/permissions"], + getJobForWorkflowRun: ["GET /repos/{owner}/{repo}/actions/jobs/{job_id}"], + getOrgPublicKey: ["GET /orgs/{org}/actions/secrets/public-key"], + getOrgSecret: ["GET /orgs/{org}/actions/secrets/{secret_name}"], + getPendingDeploymentsForRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments"], + getRepoPermissions: ["GET /repos/{owner}/{repo}/actions/permissions", {}, { + renamed: ["actions", "getGithubActionsPermissionsRepository"] + }], + getRepoPublicKey: ["GET /repos/{owner}/{repo}/actions/secrets/public-key"], + getRepoSecret: ["GET /repos/{owner}/{repo}/actions/secrets/{secret_name}"], + getReviewsForRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/approvals"], + getSelfHostedRunnerForOrg: ["GET /orgs/{org}/actions/runners/{runner_id}"], + getSelfHostedRunnerForRepo: ["GET /repos/{owner}/{repo}/actions/runners/{runner_id}"], + getWorkflow: ["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}"], + getWorkflowRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}"], + getWorkflowRunUsage: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/timing"], + getWorkflowUsage: ["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/timing"], + listArtifactsForRepo: ["GET /repos/{owner}/{repo}/actions/artifacts"], + listEnvironmentSecrets: ["GET /repositories/{repository_id}/environments/{environment_name}/secrets"], + listJobsForWorkflowRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs"], + listOrgSecrets: ["GET /orgs/{org}/actions/secrets"], + listRepoSecrets: ["GET /repos/{owner}/{repo}/actions/secrets"], + listRepoWorkflows: ["GET /repos/{owner}/{repo}/actions/workflows"], + listRunnerApplicationsForOrg: ["GET /orgs/{org}/actions/runners/downloads"], + listRunnerApplicationsForRepo: ["GET /repos/{owner}/{repo}/actions/runners/downloads"], + listSelectedReposForOrgSecret: ["GET /orgs/{org}/actions/secrets/{secret_name}/repositories"], + listSelectedRepositoriesEnabledGithubActionsOrganization: ["GET /orgs/{org}/actions/permissions/repositories"], + listSelfHostedRunnersForOrg: ["GET /orgs/{org}/actions/runners"], + listSelfHostedRunnersForRepo: ["GET /repos/{owner}/{repo}/actions/runners"], + listWorkflowRunArtifacts: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts"], + listWorkflowRuns: ["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs"], + listWorkflowRunsForRepo: ["GET /repos/{owner}/{repo}/actions/runs"], + reRunWorkflow: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun"], + removeSelectedRepoFromOrgSecret: ["DELETE /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}"], + reviewPendingDeploymentsForRun: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments"], + setAllowedActionsOrganization: ["PUT /orgs/{org}/actions/permissions/selected-actions"], + setAllowedActionsRepository: ["PUT /repos/{owner}/{repo}/actions/permissions/selected-actions"], + setGithubActionsPermissionsOrganization: ["PUT /orgs/{org}/actions/permissions"], + setGithubActionsPermissionsRepository: ["PUT /repos/{owner}/{repo}/actions/permissions"], + setSelectedReposForOrgSecret: ["PUT /orgs/{org}/actions/secrets/{secret_name}/repositories"], + setSelectedRepositoriesEnabledGithubActionsOrganization: ["PUT /orgs/{org}/actions/permissions/repositories"] + }, + activity: { + checkRepoIsStarredByAuthenticatedUser: ["GET /user/starred/{owner}/{repo}"], + deleteRepoSubscription: ["DELETE /repos/{owner}/{repo}/subscription"], + deleteThreadSubscription: ["DELETE /notifications/threads/{thread_id}/subscription"], + getFeeds: ["GET /feeds"], + getRepoSubscription: ["GET /repos/{owner}/{repo}/subscription"], + getThread: ["GET /notifications/threads/{thread_id}"], + getThreadSubscriptionForAuthenticatedUser: ["GET /notifications/threads/{thread_id}/subscription"], + listEventsForAuthenticatedUser: ["GET /users/{username}/events"], + listNotificationsForAuthenticatedUser: ["GET /notifications"], + listOrgEventsForAuthenticatedUser: ["GET /users/{username}/events/orgs/{org}"], + listPublicEvents: ["GET /events"], + listPublicEventsForRepoNetwork: ["GET /networks/{owner}/{repo}/events"], + listPublicEventsForUser: ["GET /users/{username}/events/public"], + listPublicOrgEvents: ["GET /orgs/{org}/events"], + listReceivedEventsForUser: ["GET /users/{username}/received_events"], + listReceivedPublicEventsForUser: ["GET /users/{username}/received_events/public"], + listRepoEvents: ["GET /repos/{owner}/{repo}/events"], + listRepoNotificationsForAuthenticatedUser: ["GET /repos/{owner}/{repo}/notifications"], + listReposStarredByAuthenticatedUser: ["GET /user/starred"], + listReposStarredByUser: ["GET /users/{username}/starred"], + listReposWatchedByUser: ["GET /users/{username}/subscriptions"], + listStargazersForRepo: ["GET /repos/{owner}/{repo}/stargazers"], + listWatchedReposForAuthenticatedUser: ["GET /user/subscriptions"], + listWatchersForRepo: ["GET /repos/{owner}/{repo}/subscribers"], + markNotificationsAsRead: ["PUT /notifications"], + markRepoNotificationsAsRead: ["PUT /repos/{owner}/{repo}/notifications"], + markThreadAsRead: ["PATCH /notifications/threads/{thread_id}"], + setRepoSubscription: ["PUT /repos/{owner}/{repo}/subscription"], + setThreadSubscription: ["PUT /notifications/threads/{thread_id}/subscription"], + starRepoForAuthenticatedUser: ["PUT /user/starred/{owner}/{repo}"], + unstarRepoForAuthenticatedUser: ["DELETE /user/starred/{owner}/{repo}"] + }, + apps: { + addRepoToInstallation: ["PUT /user/installations/{installation_id}/repositories/{repository_id}"], + checkToken: ["POST /applications/{client_id}/token"], + createContentAttachment: ["POST /content_references/{content_reference_id}/attachments", { + mediaType: { + previews: ["corsair"] + } + }], + createFromManifest: ["POST /app-manifests/{code}/conversions"], + createInstallationAccessToken: ["POST /app/installations/{installation_id}/access_tokens"], + deleteAuthorization: ["DELETE /applications/{client_id}/grant"], + deleteInstallation: ["DELETE /app/installations/{installation_id}"], + deleteToken: ["DELETE /applications/{client_id}/token"], + getAuthenticated: ["GET /app"], + getBySlug: ["GET /apps/{app_slug}"], + getInstallation: ["GET /app/installations/{installation_id}"], + getOrgInstallation: ["GET /orgs/{org}/installation"], + getRepoInstallation: ["GET /repos/{owner}/{repo}/installation"], + getSubscriptionPlanForAccount: ["GET /marketplace_listing/accounts/{account_id}"], + getSubscriptionPlanForAccountStubbed: ["GET /marketplace_listing/stubbed/accounts/{account_id}"], + getUserInstallation: ["GET /users/{username}/installation"], + getWebhookConfigForApp: ["GET /app/hook/config"], + listAccountsForPlan: ["GET /marketplace_listing/plans/{plan_id}/accounts"], + listAccountsForPlanStubbed: ["GET /marketplace_listing/stubbed/plans/{plan_id}/accounts"], + listInstallationReposForAuthenticatedUser: ["GET /user/installations/{installation_id}/repositories"], + listInstallations: ["GET /app/installations"], + listInstallationsForAuthenticatedUser: ["GET /user/installations"], + listPlans: ["GET /marketplace_listing/plans"], + listPlansStubbed: ["GET /marketplace_listing/stubbed/plans"], + listReposAccessibleToInstallation: ["GET /installation/repositories"], + listSubscriptionsForAuthenticatedUser: ["GET /user/marketplace_purchases"], + listSubscriptionsForAuthenticatedUserStubbed: ["GET /user/marketplace_purchases/stubbed"], + removeRepoFromInstallation: ["DELETE /user/installations/{installation_id}/repositories/{repository_id}"], + resetToken: ["PATCH /applications/{client_id}/token"], + revokeInstallationAccessToken: ["DELETE /installation/token"], + scopeToken: ["POST /applications/{client_id}/token/scoped"], + suspendInstallation: ["PUT /app/installations/{installation_id}/suspended"], + unsuspendInstallation: ["DELETE /app/installations/{installation_id}/suspended"], + updateWebhookConfigForApp: ["PATCH /app/hook/config"] + }, + billing: { + getGithubActionsBillingOrg: ["GET /orgs/{org}/settings/billing/actions"], + getGithubActionsBillingUser: ["GET /users/{username}/settings/billing/actions"], + getGithubPackagesBillingOrg: ["GET /orgs/{org}/settings/billing/packages"], + getGithubPackagesBillingUser: ["GET /users/{username}/settings/billing/packages"], + getSharedStorageBillingOrg: ["GET /orgs/{org}/settings/billing/shared-storage"], + getSharedStorageBillingUser: ["GET /users/{username}/settings/billing/shared-storage"] + }, + checks: { + create: ["POST /repos/{owner}/{repo}/check-runs"], + createSuite: ["POST /repos/{owner}/{repo}/check-suites"], + get: ["GET /repos/{owner}/{repo}/check-runs/{check_run_id}"], + getSuite: ["GET /repos/{owner}/{repo}/check-suites/{check_suite_id}"], + listAnnotations: ["GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations"], + listForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/check-runs"], + listForSuite: ["GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs"], + listSuitesForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/check-suites"], + rerequestSuite: ["POST /repos/{owner}/{repo}/check-suites/{check_suite_id}/rerequest"], + setSuitesPreferences: ["PATCH /repos/{owner}/{repo}/check-suites/preferences"], + update: ["PATCH /repos/{owner}/{repo}/check-runs/{check_run_id}"] + }, + codeScanning: { + deleteAnalysis: ["DELETE /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}{?confirm_delete}"], + getAlert: ["GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}", {}, { + renamedParameters: { + alert_id: "alert_number" + } + }], + getAnalysis: ["GET /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}"], + getSarif: ["GET /repos/{owner}/{repo}/code-scanning/sarifs/{sarif_id}"], + listAlertsForRepo: ["GET /repos/{owner}/{repo}/code-scanning/alerts"], + listAlertsInstances: ["GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances"], + listRecentAnalyses: ["GET /repos/{owner}/{repo}/code-scanning/analyses"], + updateAlert: ["PATCH /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}"], + uploadSarif: ["POST /repos/{owner}/{repo}/code-scanning/sarifs"] + }, + codesOfConduct: { + getAllCodesOfConduct: ["GET /codes_of_conduct", { + mediaType: { + previews: ["scarlet-witch"] + } + }], + getConductCode: ["GET /codes_of_conduct/{key}", { + mediaType: { + previews: ["scarlet-witch"] + } + }], + getForRepo: ["GET /repos/{owner}/{repo}/community/code_of_conduct", { + mediaType: { + previews: ["scarlet-witch"] + } + }] + }, + emojis: { + get: ["GET /emojis"] + }, + enterpriseAdmin: { + disableSelectedOrganizationGithubActionsEnterprise: ["DELETE /enterprises/{enterprise}/actions/permissions/organizations/{org_id}"], + enableSelectedOrganizationGithubActionsEnterprise: ["PUT /enterprises/{enterprise}/actions/permissions/organizations/{org_id}"], + getAllowedActionsEnterprise: ["GET /enterprises/{enterprise}/actions/permissions/selected-actions"], + getGithubActionsPermissionsEnterprise: ["GET /enterprises/{enterprise}/actions/permissions"], + listSelectedOrganizationsEnabledGithubActionsEnterprise: ["GET /enterprises/{enterprise}/actions/permissions/organizations"], + setAllowedActionsEnterprise: ["PUT /enterprises/{enterprise}/actions/permissions/selected-actions"], + setGithubActionsPermissionsEnterprise: ["PUT /enterprises/{enterprise}/actions/permissions"], + setSelectedOrganizationsEnabledGithubActionsEnterprise: ["PUT /enterprises/{enterprise}/actions/permissions/organizations"] + }, + gists: { + checkIsStarred: ["GET /gists/{gist_id}/star"], + create: ["POST /gists"], + createComment: ["POST /gists/{gist_id}/comments"], + delete: ["DELETE /gists/{gist_id}"], + deleteComment: ["DELETE /gists/{gist_id}/comments/{comment_id}"], + fork: ["POST /gists/{gist_id}/forks"], + get: ["GET /gists/{gist_id}"], + getComment: ["GET /gists/{gist_id}/comments/{comment_id}"], + getRevision: ["GET /gists/{gist_id}/{sha}"], + list: ["GET /gists"], + listComments: ["GET /gists/{gist_id}/comments"], + listCommits: ["GET /gists/{gist_id}/commits"], + listForUser: ["GET /users/{username}/gists"], + listForks: ["GET /gists/{gist_id}/forks"], + listPublic: ["GET /gists/public"], + listStarred: ["GET /gists/starred"], + star: ["PUT /gists/{gist_id}/star"], + unstar: ["DELETE /gists/{gist_id}/star"], + update: ["PATCH /gists/{gist_id}"], + updateComment: ["PATCH /gists/{gist_id}/comments/{comment_id}"] + }, + git: { + createBlob: ["POST /repos/{owner}/{repo}/git/blobs"], + createCommit: ["POST /repos/{owner}/{repo}/git/commits"], + createRef: ["POST /repos/{owner}/{repo}/git/refs"], + createTag: ["POST /repos/{owner}/{repo}/git/tags"], + createTree: ["POST /repos/{owner}/{repo}/git/trees"], + deleteRef: ["DELETE /repos/{owner}/{repo}/git/refs/{ref}"], + getBlob: ["GET /repos/{owner}/{repo}/git/blobs/{file_sha}"], + getCommit: ["GET /repos/{owner}/{repo}/git/commits/{commit_sha}"], + getRef: ["GET /repos/{owner}/{repo}/git/ref/{ref}"], + getTag: ["GET /repos/{owner}/{repo}/git/tags/{tag_sha}"], + getTree: ["GET /repos/{owner}/{repo}/git/trees/{tree_sha}"], + listMatchingRefs: ["GET /repos/{owner}/{repo}/git/matching-refs/{ref}"], + updateRef: ["PATCH /repos/{owner}/{repo}/git/refs/{ref}"] + }, + gitignore: { + getAllTemplates: ["GET /gitignore/templates"], + getTemplate: ["GET /gitignore/templates/{name}"] + }, + interactions: { + getRestrictionsForAuthenticatedUser: ["GET /user/interaction-limits"], + getRestrictionsForOrg: ["GET /orgs/{org}/interaction-limits"], + getRestrictionsForRepo: ["GET /repos/{owner}/{repo}/interaction-limits"], + getRestrictionsForYourPublicRepos: ["GET /user/interaction-limits", {}, { + renamed: ["interactions", "getRestrictionsForAuthenticatedUser"] + }], + removeRestrictionsForAuthenticatedUser: ["DELETE /user/interaction-limits"], + removeRestrictionsForOrg: ["DELETE /orgs/{org}/interaction-limits"], + removeRestrictionsForRepo: ["DELETE /repos/{owner}/{repo}/interaction-limits"], + removeRestrictionsForYourPublicRepos: ["DELETE /user/interaction-limits", {}, { + renamed: ["interactions", "removeRestrictionsForAuthenticatedUser"] + }], + setRestrictionsForAuthenticatedUser: ["PUT /user/interaction-limits"], + setRestrictionsForOrg: ["PUT /orgs/{org}/interaction-limits"], + setRestrictionsForRepo: ["PUT /repos/{owner}/{repo}/interaction-limits"], + setRestrictionsForYourPublicRepos: ["PUT /user/interaction-limits", {}, { + renamed: ["interactions", "setRestrictionsForAuthenticatedUser"] + }] + }, + issues: { + addAssignees: ["POST /repos/{owner}/{repo}/issues/{issue_number}/assignees"], + addLabels: ["POST /repos/{owner}/{repo}/issues/{issue_number}/labels"], + checkUserCanBeAssigned: ["GET /repos/{owner}/{repo}/assignees/{assignee}"], + create: ["POST /repos/{owner}/{repo}/issues"], + createComment: ["POST /repos/{owner}/{repo}/issues/{issue_number}/comments"], + createLabel: ["POST /repos/{owner}/{repo}/labels"], + createMilestone: ["POST /repos/{owner}/{repo}/milestones"], + deleteComment: ["DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}"], + deleteLabel: ["DELETE /repos/{owner}/{repo}/labels/{name}"], + deleteMilestone: ["DELETE /repos/{owner}/{repo}/milestones/{milestone_number}"], + get: ["GET /repos/{owner}/{repo}/issues/{issue_number}"], + getComment: ["GET /repos/{owner}/{repo}/issues/comments/{comment_id}"], + getEvent: ["GET /repos/{owner}/{repo}/issues/events/{event_id}"], + getLabel: ["GET /repos/{owner}/{repo}/labels/{name}"], + getMilestone: ["GET /repos/{owner}/{repo}/milestones/{milestone_number}"], + list: ["GET /issues"], + listAssignees: ["GET /repos/{owner}/{repo}/assignees"], + listComments: ["GET /repos/{owner}/{repo}/issues/{issue_number}/comments"], + listCommentsForRepo: ["GET /repos/{owner}/{repo}/issues/comments"], + listEvents: ["GET /repos/{owner}/{repo}/issues/{issue_number}/events"], + listEventsForRepo: ["GET /repos/{owner}/{repo}/issues/events"], + listEventsForTimeline: ["GET /repos/{owner}/{repo}/issues/{issue_number}/timeline", { + mediaType: { + previews: ["mockingbird"] + } + }], + listForAuthenticatedUser: ["GET /user/issues"], + listForOrg: ["GET /orgs/{org}/issues"], + listForRepo: ["GET /repos/{owner}/{repo}/issues"], + listLabelsForMilestone: ["GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels"], + listLabelsForRepo: ["GET /repos/{owner}/{repo}/labels"], + listLabelsOnIssue: ["GET /repos/{owner}/{repo}/issues/{issue_number}/labels"], + listMilestones: ["GET /repos/{owner}/{repo}/milestones"], + lock: ["PUT /repos/{owner}/{repo}/issues/{issue_number}/lock"], + removeAllLabels: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels"], + removeAssignees: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/assignees"], + removeLabel: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{name}"], + setLabels: ["PUT /repos/{owner}/{repo}/issues/{issue_number}/labels"], + unlock: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/lock"], + update: ["PATCH /repos/{owner}/{repo}/issues/{issue_number}"], + updateComment: ["PATCH /repos/{owner}/{repo}/issues/comments/{comment_id}"], + updateLabel: ["PATCH /repos/{owner}/{repo}/labels/{name}"], + updateMilestone: ["PATCH /repos/{owner}/{repo}/milestones/{milestone_number}"] + }, + licenses: { + get: ["GET /licenses/{license}"], + getAllCommonlyUsed: ["GET /licenses"], + getForRepo: ["GET /repos/{owner}/{repo}/license"] + }, + markdown: { + render: ["POST /markdown"], + renderRaw: ["POST /markdown/raw", { + headers: { + "content-type": "text/plain; charset=utf-8" + } + }] + }, + meta: { + get: ["GET /meta"], + getOctocat: ["GET /octocat"], + getZen: ["GET /zen"], + root: ["GET /"] + }, + migrations: { + cancelImport: ["DELETE /repos/{owner}/{repo}/import"], + deleteArchiveForAuthenticatedUser: ["DELETE /user/migrations/{migration_id}/archive", { + mediaType: { + previews: ["wyandotte"] + } + }], + deleteArchiveForOrg: ["DELETE /orgs/{org}/migrations/{migration_id}/archive", { + mediaType: { + previews: ["wyandotte"] + } + }], + downloadArchiveForOrg: ["GET /orgs/{org}/migrations/{migration_id}/archive", { + mediaType: { + previews: ["wyandotte"] + } + }], + getArchiveForAuthenticatedUser: ["GET /user/migrations/{migration_id}/archive", { + mediaType: { + previews: ["wyandotte"] + } + }], + getCommitAuthors: ["GET /repos/{owner}/{repo}/import/authors"], + getImportStatus: ["GET /repos/{owner}/{repo}/import"], + getLargeFiles: ["GET /repos/{owner}/{repo}/import/large_files"], + getStatusForAuthenticatedUser: ["GET /user/migrations/{migration_id}", { + mediaType: { + previews: ["wyandotte"] + } + }], + getStatusForOrg: ["GET /orgs/{org}/migrations/{migration_id}", { + mediaType: { + previews: ["wyandotte"] + } + }], + listForAuthenticatedUser: ["GET /user/migrations", { + mediaType: { + previews: ["wyandotte"] + } + }], + listForOrg: ["GET /orgs/{org}/migrations", { + mediaType: { + previews: ["wyandotte"] + } + }], + listReposForOrg: ["GET /orgs/{org}/migrations/{migration_id}/repositories", { + mediaType: { + previews: ["wyandotte"] + } + }], + listReposForUser: ["GET /user/migrations/{migration_id}/repositories", { + mediaType: { + previews: ["wyandotte"] + } + }], + mapCommitAuthor: ["PATCH /repos/{owner}/{repo}/import/authors/{author_id}"], + setLfsPreference: ["PATCH /repos/{owner}/{repo}/import/lfs"], + startForAuthenticatedUser: ["POST /user/migrations"], + startForOrg: ["POST /orgs/{org}/migrations"], + startImport: ["PUT /repos/{owner}/{repo}/import"], + unlockRepoForAuthenticatedUser: ["DELETE /user/migrations/{migration_id}/repos/{repo_name}/lock", { + mediaType: { + previews: ["wyandotte"] + } + }], + unlockRepoForOrg: ["DELETE /orgs/{org}/migrations/{migration_id}/repos/{repo_name}/lock", { + mediaType: { + previews: ["wyandotte"] + } + }], + updateImport: ["PATCH /repos/{owner}/{repo}/import"] + }, + orgs: { + blockUser: ["PUT /orgs/{org}/blocks/{username}"], + cancelInvitation: ["DELETE /orgs/{org}/invitations/{invitation_id}"], + checkBlockedUser: ["GET /orgs/{org}/blocks/{username}"], + checkMembershipForUser: ["GET /orgs/{org}/members/{username}"], + checkPublicMembershipForUser: ["GET /orgs/{org}/public_members/{username}"], + convertMemberToOutsideCollaborator: ["PUT /orgs/{org}/outside_collaborators/{username}"], + createInvitation: ["POST /orgs/{org}/invitations"], + createWebhook: ["POST /orgs/{org}/hooks"], + deleteWebhook: ["DELETE /orgs/{org}/hooks/{hook_id}"], + get: ["GET /orgs/{org}"], + getMembershipForAuthenticatedUser: ["GET /user/memberships/orgs/{org}"], + getMembershipForUser: ["GET /orgs/{org}/memberships/{username}"], + getWebhook: ["GET /orgs/{org}/hooks/{hook_id}"], + getWebhookConfigForOrg: ["GET /orgs/{org}/hooks/{hook_id}/config"], + list: ["GET /organizations"], + listAppInstallations: ["GET /orgs/{org}/installations"], + listBlockedUsers: ["GET /orgs/{org}/blocks"], + listFailedInvitations: ["GET /orgs/{org}/failed_invitations"], + listForAuthenticatedUser: ["GET /user/orgs"], + listForUser: ["GET /users/{username}/orgs"], + listInvitationTeams: ["GET /orgs/{org}/invitations/{invitation_id}/teams"], + listMembers: ["GET /orgs/{org}/members"], + listMembershipsForAuthenticatedUser: ["GET /user/memberships/orgs"], + listOutsideCollaborators: ["GET /orgs/{org}/outside_collaborators"], + listPendingInvitations: ["GET /orgs/{org}/invitations"], + listPublicMembers: ["GET /orgs/{org}/public_members"], + listWebhooks: ["GET /orgs/{org}/hooks"], + pingWebhook: ["POST /orgs/{org}/hooks/{hook_id}/pings"], + removeMember: ["DELETE /orgs/{org}/members/{username}"], + removeMembershipForUser: ["DELETE /orgs/{org}/memberships/{username}"], + removeOutsideCollaborator: ["DELETE /orgs/{org}/outside_collaborators/{username}"], + removePublicMembershipForAuthenticatedUser: ["DELETE /orgs/{org}/public_members/{username}"], + setMembershipForUser: ["PUT /orgs/{org}/memberships/{username}"], + setPublicMembershipForAuthenticatedUser: ["PUT /orgs/{org}/public_members/{username}"], + unblockUser: ["DELETE /orgs/{org}/blocks/{username}"], + update: ["PATCH /orgs/{org}"], + updateMembershipForAuthenticatedUser: ["PATCH /user/memberships/orgs/{org}"], + updateWebhook: ["PATCH /orgs/{org}/hooks/{hook_id}"], + updateWebhookConfigForOrg: ["PATCH /orgs/{org}/hooks/{hook_id}/config"] + }, + packages: { + deletePackageForAuthenticatedUser: ["DELETE /user/packages/{package_type}/{package_name}"], + deletePackageForOrg: ["DELETE /orgs/{org}/packages/{package_type}/{package_name}"], + deletePackageVersionForAuthenticatedUser: ["DELETE /user/packages/{package_type}/{package_name}/versions/{package_version_id}"], + deletePackageVersionForOrg: ["DELETE /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}"], + getAllPackageVersionsForAPackageOwnedByAnOrg: ["GET /orgs/{org}/packages/{package_type}/{package_name}/versions", {}, { + renamed: ["packages", "getAllPackageVersionsForPackageOwnedByOrg"] + }], + getAllPackageVersionsForAPackageOwnedByTheAuthenticatedUser: ["GET /user/packages/{package_type}/{package_name}/versions", {}, { + renamed: ["packages", "getAllPackageVersionsForPackageOwnedByAuthenticatedUser"] + }], + getAllPackageVersionsForPackageOwnedByAuthenticatedUser: ["GET /user/packages/{package_type}/{package_name}/versions"], + getAllPackageVersionsForPackageOwnedByOrg: ["GET /orgs/{org}/packages/{package_type}/{package_name}/versions"], + getAllPackageVersionsForPackageOwnedByUser: ["GET /users/{username}/packages/{package_type}/{package_name}/versions"], + getPackageForAuthenticatedUser: ["GET /user/packages/{package_type}/{package_name}"], + getPackageForOrganization: ["GET /orgs/{org}/packages/{package_type}/{package_name}"], + getPackageForUser: ["GET /users/{username}/packages/{package_type}/{package_name}"], + getPackageVersionForAuthenticatedUser: ["GET /user/packages/{package_type}/{package_name}/versions/{package_version_id}"], + getPackageVersionForOrganization: ["GET /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}"], + getPackageVersionForUser: ["GET /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}"], + restorePackageForAuthenticatedUser: ["POST /user/packages/{package_type}/{package_name}/restore{?token}"], + restorePackageForOrg: ["POST /orgs/{org}/packages/{package_type}/{package_name}/restore{?token}"], + restorePackageVersionForAuthenticatedUser: ["POST /user/packages/{package_type}/{package_name}/versions/{package_version_id}/restore"], + restorePackageVersionForOrg: ["POST /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore"] + }, + projects: { + addCollaborator: ["PUT /projects/{project_id}/collaborators/{username}", { + mediaType: { + previews: ["inertia"] + } + }], + createCard: ["POST /projects/columns/{column_id}/cards", { + mediaType: { + previews: ["inertia"] + } + }], + createColumn: ["POST /projects/{project_id}/columns", { + mediaType: { + previews: ["inertia"] + } + }], + createForAuthenticatedUser: ["POST /user/projects", { + mediaType: { + previews: ["inertia"] + } + }], + createForOrg: ["POST /orgs/{org}/projects", { + mediaType: { + previews: ["inertia"] + } + }], + createForRepo: ["POST /repos/{owner}/{repo}/projects", { + mediaType: { + previews: ["inertia"] + } + }], + delete: ["DELETE /projects/{project_id}", { + mediaType: { + previews: ["inertia"] + } + }], + deleteCard: ["DELETE /projects/columns/cards/{card_id}", { + mediaType: { + previews: ["inertia"] + } + }], + deleteColumn: ["DELETE /projects/columns/{column_id}", { + mediaType: { + previews: ["inertia"] + } + }], + get: ["GET /projects/{project_id}", { + mediaType: { + previews: ["inertia"] + } + }], + getCard: ["GET /projects/columns/cards/{card_id}", { + mediaType: { + previews: ["inertia"] + } + }], + getColumn: ["GET /projects/columns/{column_id}", { + mediaType: { + previews: ["inertia"] + } + }], + getPermissionForUser: ["GET /projects/{project_id}/collaborators/{username}/permission", { + mediaType: { + previews: ["inertia"] + } + }], + listCards: ["GET /projects/columns/{column_id}/cards", { + mediaType: { + previews: ["inertia"] + } + }], + listCollaborators: ["GET /projects/{project_id}/collaborators", { + mediaType: { + previews: ["inertia"] + } + }], + listColumns: ["GET /projects/{project_id}/columns", { + mediaType: { + previews: ["inertia"] + } + }], + listForOrg: ["GET /orgs/{org}/projects", { + mediaType: { + previews: ["inertia"] + } + }], + listForRepo: ["GET /repos/{owner}/{repo}/projects", { + mediaType: { + previews: ["inertia"] + } + }], + listForUser: ["GET /users/{username}/projects", { + mediaType: { + previews: ["inertia"] + } + }], + moveCard: ["POST /projects/columns/cards/{card_id}/moves", { + mediaType: { + previews: ["inertia"] + } + }], + moveColumn: ["POST /projects/columns/{column_id}/moves", { + mediaType: { + previews: ["inertia"] + } + }], + removeCollaborator: ["DELETE /projects/{project_id}/collaborators/{username}", { + mediaType: { + previews: ["inertia"] + } + }], + update: ["PATCH /projects/{project_id}", { + mediaType: { + previews: ["inertia"] + } + }], + updateCard: ["PATCH /projects/columns/cards/{card_id}", { + mediaType: { + previews: ["inertia"] + } + }], + updateColumn: ["PATCH /projects/columns/{column_id}", { + mediaType: { + previews: ["inertia"] + } + }] + }, + pulls: { + checkIfMerged: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/merge"], + create: ["POST /repos/{owner}/{repo}/pulls"], + createReplyForReviewComment: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/comments/{comment_id}/replies"], + createReview: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews"], + createReviewComment: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/comments"], + deletePendingReview: ["DELETE /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"], + deleteReviewComment: ["DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}"], + dismissReview: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/dismissals"], + get: ["GET /repos/{owner}/{repo}/pulls/{pull_number}"], + getReview: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"], + getReviewComment: ["GET /repos/{owner}/{repo}/pulls/comments/{comment_id}"], + list: ["GET /repos/{owner}/{repo}/pulls"], + listCommentsForReview: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments"], + listCommits: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/commits"], + listFiles: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/files"], + listRequestedReviewers: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"], + listReviewComments: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/comments"], + listReviewCommentsForRepo: ["GET /repos/{owner}/{repo}/pulls/comments"], + listReviews: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews"], + merge: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/merge"], + removeRequestedReviewers: ["DELETE /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"], + requestReviewers: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"], + submitReview: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/events"], + update: ["PATCH /repos/{owner}/{repo}/pulls/{pull_number}"], + updateBranch: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/update-branch", { + mediaType: { + previews: ["lydian"] + } + }], + updateReview: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"], + updateReviewComment: ["PATCH /repos/{owner}/{repo}/pulls/comments/{comment_id}"] + }, + rateLimit: { + get: ["GET /rate_limit"] + }, + reactions: { + createForCommitComment: ["POST /repos/{owner}/{repo}/comments/{comment_id}/reactions", { + mediaType: { + previews: ["squirrel-girl"] + } + }], + createForIssue: ["POST /repos/{owner}/{repo}/issues/{issue_number}/reactions", { + mediaType: { + previews: ["squirrel-girl"] + } + }], + createForIssueComment: ["POST /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions", { + mediaType: { + previews: ["squirrel-girl"] + } + }], + createForPullRequestReviewComment: ["POST /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions", { + mediaType: { + previews: ["squirrel-girl"] + } + }], + createForTeamDiscussionCommentInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions", { + mediaType: { + previews: ["squirrel-girl"] + } + }], + createForTeamDiscussionInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions", { + mediaType: { + previews: ["squirrel-girl"] + } + }], + deleteForCommitComment: ["DELETE /repos/{owner}/{repo}/comments/{comment_id}/reactions/{reaction_id}", { + mediaType: { + previews: ["squirrel-girl"] + } + }], + deleteForIssue: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/reactions/{reaction_id}", { + mediaType: { + previews: ["squirrel-girl"] + } + }], + deleteForIssueComment: ["DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions/{reaction_id}", { + mediaType: { + previews: ["squirrel-girl"] + } + }], + deleteForPullRequestComment: ["DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions/{reaction_id}", { + mediaType: { + previews: ["squirrel-girl"] + } + }], + deleteForTeamDiscussion: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions/{reaction_id}", { + mediaType: { + previews: ["squirrel-girl"] + } + }], + deleteForTeamDiscussionComment: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions/{reaction_id}", { + mediaType: { + previews: ["squirrel-girl"] + } + }], + deleteLegacy: ["DELETE /reactions/{reaction_id}", { + mediaType: { + previews: ["squirrel-girl"] + } + }, { + deprecated: "octokit.rest.reactions.deleteLegacy() is deprecated, see https://docs.github.com/rest/reference/reactions/#delete-a-reaction-legacy" + }], + listForCommitComment: ["GET /repos/{owner}/{repo}/comments/{comment_id}/reactions", { + mediaType: { + previews: ["squirrel-girl"] + } + }], + listForIssue: ["GET /repos/{owner}/{repo}/issues/{issue_number}/reactions", { + mediaType: { + previews: ["squirrel-girl"] + } + }], + listForIssueComment: ["GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions", { + mediaType: { + previews: ["squirrel-girl"] + } + }], + listForPullRequestReviewComment: ["GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions", { + mediaType: { + previews: ["squirrel-girl"] + } + }], + listForTeamDiscussionCommentInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions", { + mediaType: { + previews: ["squirrel-girl"] + } + }], + listForTeamDiscussionInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions", { + mediaType: { + previews: ["squirrel-girl"] + } + }] + }, + repos: { + acceptInvitation: ["PATCH /user/repository_invitations/{invitation_id}"], + addAppAccessRestrictions: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps", {}, { + mapToData: "apps" + }], + addCollaborator: ["PUT /repos/{owner}/{repo}/collaborators/{username}"], + addStatusCheckContexts: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts", {}, { + mapToData: "contexts" + }], + addTeamAccessRestrictions: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams", {}, { + mapToData: "teams" + }], + addUserAccessRestrictions: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users", {}, { + mapToData: "users" + }], + checkCollaborator: ["GET /repos/{owner}/{repo}/collaborators/{username}"], + checkVulnerabilityAlerts: ["GET /repos/{owner}/{repo}/vulnerability-alerts", { + mediaType: { + previews: ["dorian"] + } + }], + compareCommits: ["GET /repos/{owner}/{repo}/compare/{base}...{head}"], + createCommitComment: ["POST /repos/{owner}/{repo}/commits/{commit_sha}/comments"], + createCommitSignatureProtection: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures", { + mediaType: { + previews: ["zzzax"] + } + }], + createCommitStatus: ["POST /repos/{owner}/{repo}/statuses/{sha}"], + createDeployKey: ["POST /repos/{owner}/{repo}/keys"], + createDeployment: ["POST /repos/{owner}/{repo}/deployments"], + createDeploymentStatus: ["POST /repos/{owner}/{repo}/deployments/{deployment_id}/statuses"], + createDispatchEvent: ["POST /repos/{owner}/{repo}/dispatches"], + createForAuthenticatedUser: ["POST /user/repos"], + createFork: ["POST /repos/{owner}/{repo}/forks"], + createInOrg: ["POST /orgs/{org}/repos"], + createOrUpdateEnvironment: ["PUT /repos/{owner}/{repo}/environments/{environment_name}"], + createOrUpdateFileContents: ["PUT /repos/{owner}/{repo}/contents/{path}"], + createPagesSite: ["POST /repos/{owner}/{repo}/pages", { + mediaType: { + previews: ["switcheroo"] + } + }], + createRelease: ["POST /repos/{owner}/{repo}/releases"], + createUsingTemplate: ["POST /repos/{template_owner}/{template_repo}/generate", { + mediaType: { + previews: ["baptiste"] + } + }], + createWebhook: ["POST /repos/{owner}/{repo}/hooks"], + declineInvitation: ["DELETE /user/repository_invitations/{invitation_id}"], + delete: ["DELETE /repos/{owner}/{repo}"], + deleteAccessRestrictions: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions"], + deleteAdminBranchProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"], + deleteAnEnvironment: ["DELETE /repos/{owner}/{repo}/environments/{environment_name}"], + deleteBranchProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection"], + deleteCommitComment: ["DELETE /repos/{owner}/{repo}/comments/{comment_id}"], + deleteCommitSignatureProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures", { + mediaType: { + previews: ["zzzax"] + } + }], + deleteDeployKey: ["DELETE /repos/{owner}/{repo}/keys/{key_id}"], + deleteDeployment: ["DELETE /repos/{owner}/{repo}/deployments/{deployment_id}"], + deleteFile: ["DELETE /repos/{owner}/{repo}/contents/{path}"], + deleteInvitation: ["DELETE /repos/{owner}/{repo}/invitations/{invitation_id}"], + deletePagesSite: ["DELETE /repos/{owner}/{repo}/pages", { + mediaType: { + previews: ["switcheroo"] + } + }], + deletePullRequestReviewProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"], + deleteRelease: ["DELETE /repos/{owner}/{repo}/releases/{release_id}"], + deleteReleaseAsset: ["DELETE /repos/{owner}/{repo}/releases/assets/{asset_id}"], + deleteWebhook: ["DELETE /repos/{owner}/{repo}/hooks/{hook_id}"], + disableAutomatedSecurityFixes: ["DELETE /repos/{owner}/{repo}/automated-security-fixes", { + mediaType: { + previews: ["london"] + } + }], + disableVulnerabilityAlerts: ["DELETE /repos/{owner}/{repo}/vulnerability-alerts", { + mediaType: { + previews: ["dorian"] + } + }], + downloadArchive: ["GET /repos/{owner}/{repo}/zipball/{ref}", {}, { + renamed: ["repos", "downloadZipballArchive"] + }], + downloadTarballArchive: ["GET /repos/{owner}/{repo}/tarball/{ref}"], + downloadZipballArchive: ["GET /repos/{owner}/{repo}/zipball/{ref}"], + enableAutomatedSecurityFixes: ["PUT /repos/{owner}/{repo}/automated-security-fixes", { + mediaType: { + previews: ["london"] + } + }], + enableVulnerabilityAlerts: ["PUT /repos/{owner}/{repo}/vulnerability-alerts", { + mediaType: { + previews: ["dorian"] + } + }], + get: ["GET /repos/{owner}/{repo}"], + getAccessRestrictions: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions"], + getAdminBranchProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"], + getAllEnvironments: ["GET /repos/{owner}/{repo}/environments"], + getAllStatusCheckContexts: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts"], + getAllTopics: ["GET /repos/{owner}/{repo}/topics", { + mediaType: { + previews: ["mercy"] + } + }], + getAppsWithAccessToProtectedBranch: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps"], + getBranch: ["GET /repos/{owner}/{repo}/branches/{branch}"], + getBranchProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection"], + getClones: ["GET /repos/{owner}/{repo}/traffic/clones"], + getCodeFrequencyStats: ["GET /repos/{owner}/{repo}/stats/code_frequency"], + getCollaboratorPermissionLevel: ["GET /repos/{owner}/{repo}/collaborators/{username}/permission"], + getCombinedStatusForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/status"], + getCommit: ["GET /repos/{owner}/{repo}/commits/{ref}"], + getCommitActivityStats: ["GET /repos/{owner}/{repo}/stats/commit_activity"], + getCommitComment: ["GET /repos/{owner}/{repo}/comments/{comment_id}"], + getCommitSignatureProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures", { + mediaType: { + previews: ["zzzax"] + } + }], + getCommunityProfileMetrics: ["GET /repos/{owner}/{repo}/community/profile"], + getContent: ["GET /repos/{owner}/{repo}/contents/{path}"], + getContributorsStats: ["GET /repos/{owner}/{repo}/stats/contributors"], + getDeployKey: ["GET /repos/{owner}/{repo}/keys/{key_id}"], + getDeployment: ["GET /repos/{owner}/{repo}/deployments/{deployment_id}"], + getDeploymentStatus: ["GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses/{status_id}"], + getEnvironment: ["GET /repos/{owner}/{repo}/environments/{environment_name}"], + getLatestPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/latest"], + getLatestRelease: ["GET /repos/{owner}/{repo}/releases/latest"], + getPages: ["GET /repos/{owner}/{repo}/pages"], + getPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/{build_id}"], + getParticipationStats: ["GET /repos/{owner}/{repo}/stats/participation"], + getPullRequestReviewProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"], + getPunchCardStats: ["GET /repos/{owner}/{repo}/stats/punch_card"], + getReadme: ["GET /repos/{owner}/{repo}/readme"], + getReadmeInDirectory: ["GET /repos/{owner}/{repo}/readme/{dir}"], + getRelease: ["GET /repos/{owner}/{repo}/releases/{release_id}"], + getReleaseAsset: ["GET /repos/{owner}/{repo}/releases/assets/{asset_id}"], + getReleaseByTag: ["GET /repos/{owner}/{repo}/releases/tags/{tag}"], + getStatusChecksProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"], + getTeamsWithAccessToProtectedBranch: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams"], + getTopPaths: ["GET /repos/{owner}/{repo}/traffic/popular/paths"], + getTopReferrers: ["GET /repos/{owner}/{repo}/traffic/popular/referrers"], + getUsersWithAccessToProtectedBranch: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users"], + getViews: ["GET /repos/{owner}/{repo}/traffic/views"], + getWebhook: ["GET /repos/{owner}/{repo}/hooks/{hook_id}"], + getWebhookConfigForRepo: ["GET /repos/{owner}/{repo}/hooks/{hook_id}/config"], + listBranches: ["GET /repos/{owner}/{repo}/branches"], + listBranchesForHeadCommit: ["GET /repos/{owner}/{repo}/commits/{commit_sha}/branches-where-head", { + mediaType: { + previews: ["groot"] + } + }], + listCollaborators: ["GET /repos/{owner}/{repo}/collaborators"], + listCommentsForCommit: ["GET /repos/{owner}/{repo}/commits/{commit_sha}/comments"], + listCommitCommentsForRepo: ["GET /repos/{owner}/{repo}/comments"], + listCommitStatusesForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/statuses"], + listCommits: ["GET /repos/{owner}/{repo}/commits"], + listContributors: ["GET /repos/{owner}/{repo}/contributors"], + listDeployKeys: ["GET /repos/{owner}/{repo}/keys"], + listDeploymentStatuses: ["GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses"], + listDeployments: ["GET /repos/{owner}/{repo}/deployments"], + listForAuthenticatedUser: ["GET /user/repos"], + listForOrg: ["GET /orgs/{org}/repos"], + listForUser: ["GET /users/{username}/repos"], + listForks: ["GET /repos/{owner}/{repo}/forks"], + listInvitations: ["GET /repos/{owner}/{repo}/invitations"], + listInvitationsForAuthenticatedUser: ["GET /user/repository_invitations"], + listLanguages: ["GET /repos/{owner}/{repo}/languages"], + listPagesBuilds: ["GET /repos/{owner}/{repo}/pages/builds"], + listPublic: ["GET /repositories"], + listPullRequestsAssociatedWithCommit: ["GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls", { + mediaType: { + previews: ["groot"] + } + }], + listReleaseAssets: ["GET /repos/{owner}/{repo}/releases/{release_id}/assets"], + listReleases: ["GET /repos/{owner}/{repo}/releases"], + listTags: ["GET /repos/{owner}/{repo}/tags"], + listTeams: ["GET /repos/{owner}/{repo}/teams"], + listWebhooks: ["GET /repos/{owner}/{repo}/hooks"], + merge: ["POST /repos/{owner}/{repo}/merges"], + pingWebhook: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/pings"], + removeAppAccessRestrictions: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps", {}, { + mapToData: "apps" + }], + removeCollaborator: ["DELETE /repos/{owner}/{repo}/collaborators/{username}"], + removeStatusCheckContexts: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts", {}, { + mapToData: "contexts" + }], + removeStatusCheckProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"], + removeTeamAccessRestrictions: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams", {}, { + mapToData: "teams" + }], + removeUserAccessRestrictions: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users", {}, { + mapToData: "users" + }], + renameBranch: ["POST /repos/{owner}/{repo}/branches/{branch}/rename"], + replaceAllTopics: ["PUT /repos/{owner}/{repo}/topics", { + mediaType: { + previews: ["mercy"] + } + }], + requestPagesBuild: ["POST /repos/{owner}/{repo}/pages/builds"], + setAdminBranchProtection: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"], + setAppAccessRestrictions: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps", {}, { + mapToData: "apps" + }], + setStatusCheckContexts: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts", {}, { + mapToData: "contexts" + }], + setTeamAccessRestrictions: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams", {}, { + mapToData: "teams" + }], + setUserAccessRestrictions: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users", {}, { + mapToData: "users" + }], + testPushWebhook: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/tests"], + transfer: ["POST /repos/{owner}/{repo}/transfer"], + update: ["PATCH /repos/{owner}/{repo}"], + updateBranchProtection: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection"], + updateCommitComment: ["PATCH /repos/{owner}/{repo}/comments/{comment_id}"], + updateInformationAboutPagesSite: ["PUT /repos/{owner}/{repo}/pages"], + updateInvitation: ["PATCH /repos/{owner}/{repo}/invitations/{invitation_id}"], + updatePullRequestReviewProtection: ["PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"], + updateRelease: ["PATCH /repos/{owner}/{repo}/releases/{release_id}"], + updateReleaseAsset: ["PATCH /repos/{owner}/{repo}/releases/assets/{asset_id}"], + updateStatusCheckPotection: ["PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks", {}, { + renamed: ["repos", "updateStatusCheckProtection"] + }], + updateStatusCheckProtection: ["PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"], + updateWebhook: ["PATCH /repos/{owner}/{repo}/hooks/{hook_id}"], + updateWebhookConfigForRepo: ["PATCH /repos/{owner}/{repo}/hooks/{hook_id}/config"], + uploadReleaseAsset: ["POST /repos/{owner}/{repo}/releases/{release_id}/assets{?name,label}", { + baseUrl: "https://uploads.github.com" + }] + }, + search: { + code: ["GET /search/code"], + commits: ["GET /search/commits", { + mediaType: { + previews: ["cloak"] + } + }], + issuesAndPullRequests: ["GET /search/issues"], + labels: ["GET /search/labels"], + repos: ["GET /search/repositories"], + topics: ["GET /search/topics", { + mediaType: { + previews: ["mercy"] + } + }], + users: ["GET /search/users"] + }, + secretScanning: { + getAlert: ["GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}"], + listAlertsForRepo: ["GET /repos/{owner}/{repo}/secret-scanning/alerts"], + updateAlert: ["PATCH /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}"] + }, + teams: { + addOrUpdateMembershipForUserInOrg: ["PUT /orgs/{org}/teams/{team_slug}/memberships/{username}"], + addOrUpdateProjectPermissionsInOrg: ["PUT /orgs/{org}/teams/{team_slug}/projects/{project_id}", { + mediaType: { + previews: ["inertia"] + } + }], + addOrUpdateRepoPermissionsInOrg: ["PUT /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"], + checkPermissionsForProjectInOrg: ["GET /orgs/{org}/teams/{team_slug}/projects/{project_id}", { + mediaType: { + previews: ["inertia"] + } + }], + checkPermissionsForRepoInOrg: ["GET /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"], + create: ["POST /orgs/{org}/teams"], + createDiscussionCommentInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments"], + createDiscussionInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions"], + deleteDiscussionCommentInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"], + deleteDiscussionInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"], + deleteInOrg: ["DELETE /orgs/{org}/teams/{team_slug}"], + getByName: ["GET /orgs/{org}/teams/{team_slug}"], + getDiscussionCommentInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"], + getDiscussionInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"], + getMembershipForUserInOrg: ["GET /orgs/{org}/teams/{team_slug}/memberships/{username}"], + list: ["GET /orgs/{org}/teams"], + listChildInOrg: ["GET /orgs/{org}/teams/{team_slug}/teams"], + listDiscussionCommentsInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments"], + listDiscussionsInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions"], + listForAuthenticatedUser: ["GET /user/teams"], + listMembersInOrg: ["GET /orgs/{org}/teams/{team_slug}/members"], + listPendingInvitationsInOrg: ["GET /orgs/{org}/teams/{team_slug}/invitations"], + listProjectsInOrg: ["GET /orgs/{org}/teams/{team_slug}/projects", { + mediaType: { + previews: ["inertia"] + } + }], + listReposInOrg: ["GET /orgs/{org}/teams/{team_slug}/repos"], + removeMembershipForUserInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/memberships/{username}"], + removeProjectInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/projects/{project_id}"], + removeRepoInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"], + updateDiscussionCommentInOrg: ["PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"], + updateDiscussionInOrg: ["PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"], + updateInOrg: ["PATCH /orgs/{org}/teams/{team_slug}"] + }, + users: { + addEmailForAuthenticated: ["POST /user/emails"], + block: ["PUT /user/blocks/{username}"], + checkBlocked: ["GET /user/blocks/{username}"], + checkFollowingForUser: ["GET /users/{username}/following/{target_user}"], + checkPersonIsFollowedByAuthenticated: ["GET /user/following/{username}"], + createGpgKeyForAuthenticated: ["POST /user/gpg_keys"], + createPublicSshKeyForAuthenticated: ["POST /user/keys"], + deleteEmailForAuthenticated: ["DELETE /user/emails"], + deleteGpgKeyForAuthenticated: ["DELETE /user/gpg_keys/{gpg_key_id}"], + deletePublicSshKeyForAuthenticated: ["DELETE /user/keys/{key_id}"], + follow: ["PUT /user/following/{username}"], + getAuthenticated: ["GET /user"], + getByUsername: ["GET /users/{username}"], + getContextForUser: ["GET /users/{username}/hovercard"], + getGpgKeyForAuthenticated: ["GET /user/gpg_keys/{gpg_key_id}"], + getPublicSshKeyForAuthenticated: ["GET /user/keys/{key_id}"], + list: ["GET /users"], + listBlockedByAuthenticated: ["GET /user/blocks"], + listEmailsForAuthenticated: ["GET /user/emails"], + listFollowedByAuthenticated: ["GET /user/following"], + listFollowersForAuthenticatedUser: ["GET /user/followers"], + listFollowersForUser: ["GET /users/{username}/followers"], + listFollowingForUser: ["GET /users/{username}/following"], + listGpgKeysForAuthenticated: ["GET /user/gpg_keys"], + listGpgKeysForUser: ["GET /users/{username}/gpg_keys"], + listPublicEmailsForAuthenticated: ["GET /user/public_emails"], + listPublicKeysForUser: ["GET /users/{username}/keys"], + listPublicSshKeysForAuthenticated: ["GET /user/keys"], + setPrimaryEmailVisibilityForAuthenticated: ["PATCH /user/email/visibility"], + unblock: ["DELETE /user/blocks/{username}"], + unfollow: ["DELETE /user/following/{username}"], + updateAuthenticated: ["PATCH /user"] + } +}; - get method() { - return this[INTERNALS$2].method; - } +const VERSION = "4.15.1"; - get url() { - return format_url(this[INTERNALS$2].parsedURL); - } +function endpointsToMethods(octokit, endpointsMap) { + const newMethods = {}; - get headers() { - return this[INTERNALS$2].headers; - } + for (const [scope, endpoints] of Object.entries(endpointsMap)) { + for (const [methodName, endpoint] of Object.entries(endpoints)) { + const [route, defaults, decorations] = endpoint; + const [method, url] = route.split(/ /); + const endpointDefaults = Object.assign({ + method, + url + }, defaults); - get redirect() { - return this[INTERNALS$2].redirect; - } + if (!newMethods[scope]) { + newMethods[scope] = {}; + } - get signal() { - return this[INTERNALS$2].signal; - } + const scopeMethods = newMethods[scope]; - /** - * Clone this request - * - * @return Request - */ - clone() { - return new Request(this); - } -} + if (decorations) { + scopeMethods[methodName] = decorate(octokit, scope, methodName, endpointDefaults, decorations); + continue; + } -Body.mixIn(Request.prototype); + scopeMethods[methodName] = octokit.request.defaults(endpointDefaults); + } + } -Object.defineProperty(Request.prototype, Symbol.toStringTag, { - value: 'Request', - writable: false, - enumerable: false, - configurable: true -}); + return newMethods; +} -Object.defineProperties(Request.prototype, { - method: { enumerable: true }, - url: { enumerable: true }, - headers: { enumerable: true }, - redirect: { enumerable: true }, - clone: { enumerable: true }, - signal: { enumerable: true } -}); +function decorate(octokit, scope, methodName, defaults, decorations) { + const requestWithDefaults = octokit.request.defaults(defaults); + /* istanbul ignore next */ -/** - * Convert a Request to Node.js http request options. - * - * @param Request A Request instance - * @return Object The options object to be passed to http.request - */ -function getNodeRequestOptions(request) { - const parsedURL = request[INTERNALS$2].parsedURL; - const headers = new Headers(request[INTERNALS$2].headers); + function withDecorations(...args) { + // @ts-ignore https://github.com/microsoft/TypeScript/issues/25488 + let options = requestWithDefaults.endpoint.merge(...args); // There are currently no other decorations than `.mapToData` - // fetch step 1.3 - if (!headers.has('Accept')) { - headers.set('Accept', '*/*'); - } + if (decorations.mapToData) { + options = Object.assign({}, options, { + data: options[decorations.mapToData], + [decorations.mapToData]: undefined + }); + return requestWithDefaults(options); + } - // Basic fetch - if (!parsedURL.protocol || !parsedURL.hostname) { - throw new TypeError('Only absolute URLs are supported'); - } + if (decorations.renamed) { + const [newScope, newMethodName] = decorations.renamed; + octokit.log.warn(`octokit.${scope}.${methodName}() has been renamed to octokit.${newScope}.${newMethodName}()`); + } - if (!/^https?:$/.test(parsedURL.protocol)) { - throw new TypeError('Only HTTP(S) protocols are supported'); - } + if (decorations.deprecated) { + octokit.log.warn(decorations.deprecated); + } - if (request.signal && request.body instanceof Stream.Readable && !streamDestructionSupported) { - throw new Error('Cancellation of streamed requests with AbortSignal is not supported in node < 8'); - } + if (decorations.renamedParameters) { + // @ts-ignore https://github.com/microsoft/TypeScript/issues/25488 + const options = requestWithDefaults.endpoint.merge(...args); - // HTTP-network-or-cache fetch steps 2.4-2.7 - let contentLengthValue = null; - if (request.body == null && /^(POST|PUT)$/i.test(request.method)) { - contentLengthValue = '0'; - } - if (request.body != null) { - const totalBytes = getTotalBytes(request); - if (typeof totalBytes === 'number') { - contentLengthValue = String(totalBytes); - } - } - if (contentLengthValue) { - headers.set('Content-Length', contentLengthValue); - } + for (const [name, alias] of Object.entries(decorations.renamedParameters)) { + if (name in options) { + octokit.log.warn(`"${name}" parameter is deprecated for "octokit.${scope}.${methodName}()". Use "${alias}" instead`); - // HTTP-network-or-cache fetch step 2.11 - if (!headers.has('User-Agent')) { - headers.set('User-Agent', 'node-fetch/1.0 (+https://github.com/bitinn/node-fetch)'); - } + if (!(alias in options)) { + options[alias] = options[name]; + } - // HTTP-network-or-cache fetch step 2.15 - if (request.compress && !headers.has('Accept-Encoding')) { - headers.set('Accept-Encoding', 'gzip,deflate'); - } + delete options[name]; + } + } - let agent = request.agent; - if (typeof agent === 'function') { - agent = agent(parsedURL); - } + return requestWithDefaults(options); + } // @ts-ignore https://github.com/microsoft/TypeScript/issues/25488 - if (!headers.has('Connection') && !agent) { - headers.set('Connection', 'close'); - } - // HTTP-network fetch step 4.2 - // chunked encoding is handled by Node.js + return requestWithDefaults(...args); + } - return Object.assign({}, parsedURL, { - method: request.method, - headers: exportNodeCompatibleHeaders(headers), - agent - }); + return Object.assign(withDecorations, requestWithDefaults); } -/** - * abort-error.js - * - * AbortError interface for cancelled requests - */ - -/** - * Create AbortError instance - * - * @param String message Error message for human - * @return AbortError - */ -function AbortError(message) { - Error.call(this, message); +function restEndpointMethods(octokit) { + const api = endpointsToMethods(octokit, Endpoints); + return _objectSpread2(_objectSpread2({}, api), {}, { + rest: api + }); +} +restEndpointMethods.VERSION = VERSION; - this.type = 'aborted'; - this.message = message; +exports.restEndpointMethods = restEndpointMethods; +//# sourceMappingURL=index.js.map - // hide custom error implementation details from end-users - Error.captureStackTrace(this, this.constructor); -} -AbortError.prototype = Object.create(Error.prototype); -AbortError.prototype.constructor = AbortError; -AbortError.prototype.name = 'AbortError'; +/***/ }), -// fix an issue where "PassThrough", "resolve" aren't a named export for node <10 -const PassThrough$1 = Stream.PassThrough; -const resolve_url = Url.resolve; +/***/ 577: +/***/ (function(module, __unusedexports, __webpack_require__) { -/** - * Fetch function - * - * @param Mixed url Absolute url or Request instance - * @param Object opts Fetch options - * @return Promise - */ -function fetch(url, opts) { +"use strict"; - // allow custom promise - if (!fetch.Promise) { - throw new Error('native promise missing, set fetch.Promise to your favorite alternative'); - } +// wrapper around mkdirp for tar's needs. - Body.Promise = fetch.Promise; +// TODO: This should probably be a class, not functionally +// passing around state in a gazillion args. - // wrap http.request into fetch - return new fetch.Promise(function (resolve, reject) { - // build request object - const request = new Request(url, opts); - const options = getNodeRequestOptions(request); +const mkdirp = __webpack_require__(626) +const fs = __webpack_require__(747) +const path = __webpack_require__(622) +const chownr = __webpack_require__(941) - const send = (options.protocol === 'https:' ? https : http).request; - const signal = request.signal; +class SymlinkError extends Error { + constructor (symlink, path) { + super('Cannot extract through symbolic link') + this.path = path + this.symlink = symlink + } - let response = null; + get name () { + return 'SylinkError' + } +} - const abort = function abort() { - let error = new AbortError('The user aborted a request.'); - reject(error); - if (request.body && request.body instanceof Stream.Readable) { - request.body.destroy(error); - } - if (!response || !response.body) return; - response.body.emit('error', error); - }; +class CwdError extends Error { + constructor (path, code) { + super(code + ': Cannot cd into \'' + path + '\'') + this.path = path + this.code = code + } - if (signal && signal.aborted) { - abort(); - return; - } + get name () { + return 'CwdError' + } +} - const abortAndFinalize = function abortAndFinalize() { - abort(); - finalize(); - }; +const mkdir = module.exports = (dir, opt, cb) => { + // if there's any overlap between mask and mode, + // then we'll need an explicit chmod + const umask = opt.umask + const mode = opt.mode | 0o0700 + const needChmod = (mode & umask) !== 0 - // send request - const req = send(options); - let reqTimeout; + const uid = opt.uid + const gid = opt.gid + const doChown = typeof uid === 'number' && + typeof gid === 'number' && + ( uid !== opt.processUid || gid !== opt.processGid ) - if (signal) { - signal.addEventListener('abort', abortAndFinalize); - } + const preserve = opt.preserve + const unlink = opt.unlink + const cache = opt.cache + const cwd = opt.cwd - function finalize() { - req.abort(); - if (signal) signal.removeEventListener('abort', abortAndFinalize); - clearTimeout(reqTimeout); - } + const done = (er, created) => { + if (er) + cb(er) + else { + cache.set(dir, true) + if (created && doChown) + chownr(created, uid, gid, er => done(er)) + else if (needChmod) + fs.chmod(dir, mode, cb) + else + cb() + } + } - if (request.timeout) { - req.once('socket', function (socket) { - reqTimeout = setTimeout(function () { - reject(new FetchError(`network timeout at: ${request.url}`, 'request-timeout')); - finalize(); - }, request.timeout); - }); - } + if (cache && cache.get(dir) === true) + return done() - req.on('error', function (err) { - reject(new FetchError(`request to ${request.url} failed, reason: ${err.message}`, 'system', err)); - finalize(); - }); + if (dir === cwd) + return fs.stat(dir, (er, st) => { + if (er || !st.isDirectory()) + er = new CwdError(dir, er && er.code || 'ENOTDIR') + done(er) + }) - req.on('response', function (res) { - clearTimeout(reqTimeout); + if (preserve) + return mkdirp(dir, mode, done) - const headers = createHeadersLenient(res.headers); + const sub = path.relative(cwd, dir) + const parts = sub.split(/\/|\\/) + mkdir_(cwd, parts, mode, cache, unlink, cwd, null, done) +} - // HTTP fetch step 5 - if (fetch.isRedirect(res.statusCode)) { - // HTTP fetch step 5.2 - const location = headers.get('Location'); +const mkdir_ = (base, parts, mode, cache, unlink, cwd, created, cb) => { + if (!parts.length) + return cb(null, created) + const p = parts.shift() + const part = base + '/' + p + if (cache.get(part)) + return mkdir_(part, parts, mode, cache, unlink, cwd, created, cb) + fs.mkdir(part, mode, onmkdir(part, parts, mode, cache, unlink, cwd, created, cb)) +} - // HTTP fetch step 5.3 - const locationURL = location === null ? null : resolve_url(request.url, location); +const onmkdir = (part, parts, mode, cache, unlink, cwd, created, cb) => er => { + if (er) { + if (er.path && path.dirname(er.path) === cwd && + (er.code === 'ENOTDIR' || er.code === 'ENOENT')) + return cb(new CwdError(cwd, er.code)) - // HTTP fetch step 5.5 - switch (request.redirect) { - case 'error': - reject(new FetchError(`redirect mode is set to error: ${request.url}`, 'no-redirect')); - finalize(); - return; - case 'manual': - // node-fetch-specific step: make manual redirect a bit easier to use by setting the Location header value to the resolved URL. - if (locationURL !== null) { - // handle corrupted header - try { - headers.set('Location', locationURL); - } catch (err) { - // istanbul ignore next: nodejs server prevent invalid response headers, we can't test this through normal request - reject(err); - } - } - break; - case 'follow': - // HTTP-redirect fetch step 2 - if (locationURL === null) { - break; - } - - // HTTP-redirect fetch step 5 - if (request.counter >= request.follow) { - reject(new FetchError(`maximum redirect reached at: ${request.url}`, 'max-redirect')); - finalize(); - return; - } - - // HTTP-redirect fetch step 6 (counter increment) - // Create a new Request object. - const requestOpts = { - headers: new Headers(request.headers), - follow: request.follow, - counter: request.counter + 1, - agent: request.agent, - compress: request.compress, - method: request.method, - body: request.body, - signal: request.signal, - timeout: request.timeout - }; - - // HTTP-redirect fetch step 9 - if (res.statusCode !== 303 && request.body && getTotalBytes(request) === null) { - reject(new FetchError('Cannot follow redirect with body being a readable stream', 'unsupported-redirect')); - finalize(); - return; - } - - // HTTP-redirect fetch step 11 - if (res.statusCode === 303 || (res.statusCode === 301 || res.statusCode === 302) && request.method === 'POST') { - requestOpts.method = 'GET'; - requestOpts.body = undefined; - requestOpts.headers.delete('content-length'); - } + fs.lstat(part, (statEr, st) => { + if (statEr) + cb(statEr) + else if (st.isDirectory()) + mkdir_(part, parts, mode, cache, unlink, cwd, created, cb) + else if (unlink) + fs.unlink(part, er => { + if (er) + return cb(er) + fs.mkdir(part, mode, onmkdir(part, parts, mode, cache, unlink, cwd, created, cb)) + }) + else if (st.isSymbolicLink()) + return cb(new SymlinkError(part, part + '/' + parts.join('/'))) + else + cb(er) + }) + } else { + created = created || part + mkdir_(part, parts, mode, cache, unlink, cwd, created, cb) + } +} - // HTTP-redirect fetch step 15 - resolve(fetch(new Request(locationURL, requestOpts))); - finalize(); - return; - } - } +const mkdirSync = module.exports.sync = (dir, opt) => { + // if there's any overlap between mask and mode, + // then we'll need an explicit chmod + const umask = opt.umask + const mode = opt.mode | 0o0700 + const needChmod = (mode & umask) !== 0 - // prepare response - res.once('end', function () { - if (signal) signal.removeEventListener('abort', abortAndFinalize); - }); - let body = res.pipe(new PassThrough$1()); + const uid = opt.uid + const gid = opt.gid + const doChown = typeof uid === 'number' && + typeof gid === 'number' && + ( uid !== opt.processUid || gid !== opt.processGid ) - const response_options = { - url: request.url, - status: res.statusCode, - statusText: res.statusMessage, - headers: headers, - size: request.size, - timeout: request.timeout, - counter: request.counter - }; + const preserve = opt.preserve + const unlink = opt.unlink + const cache = opt.cache + const cwd = opt.cwd - // HTTP-network fetch step 12.1.1.3 - const codings = headers.get('Content-Encoding'); + const done = (created) => { + cache.set(dir, true) + if (created && doChown) + chownr.sync(created, uid, gid) + if (needChmod) + fs.chmodSync(dir, mode) + } - // HTTP-network fetch step 12.1.1.4: handle content codings + if (cache && cache.get(dir) === true) + return done() - // in following scenarios we ignore compression support - // 1. compression support is disabled - // 2. HEAD request - // 3. no Content-Encoding header - // 4. no content response (204) - // 5. content not modified response (304) - if (!request.compress || request.method === 'HEAD' || codings === null || res.statusCode === 204 || res.statusCode === 304) { - response = new Response(body, response_options); - resolve(response); - return; - } + if (dir === cwd) { + let ok = false + let code = 'ENOTDIR' + try { + ok = fs.statSync(dir).isDirectory() + } catch (er) { + code = er.code + } finally { + if (!ok) + throw new CwdError(dir, code) + } + done() + return + } - // For Node v6+ - // Be less strict when decoding compressed responses, since sometimes - // servers send slightly invalid responses that are still accepted - // by common browsers. - // Always using Z_SYNC_FLUSH is what cURL does. - const zlibOptions = { - flush: zlib.Z_SYNC_FLUSH, - finishFlush: zlib.Z_SYNC_FLUSH - }; + if (preserve) + return done(mkdirp.sync(dir, mode)) - // for gzip - if (codings == 'gzip' || codings == 'x-gzip') { - body = body.pipe(zlib.createGunzip(zlibOptions)); - response = new Response(body, response_options); - resolve(response); - return; - } + const sub = path.relative(cwd, dir) + const parts = sub.split(/\/|\\/) + let created = null + for (let p = parts.shift(), part = cwd; + p && (part += '/' + p); + p = parts.shift()) { - // for deflate - if (codings == 'deflate' || codings == 'x-deflate') { - // handle the infamous raw deflate response from old servers - // a hack for old IIS and Apache servers - const raw = res.pipe(new PassThrough$1()); - raw.once('data', function (chunk) { - // see http://stackoverflow.com/questions/37519828 - if ((chunk[0] & 0x0F) === 0x08) { - body = body.pipe(zlib.createInflate()); - } else { - body = body.pipe(zlib.createInflateRaw()); - } - response = new Response(body, response_options); - resolve(response); - }); - return; - } + if (cache.get(part)) + continue - // for br - if (codings == 'br' && typeof zlib.createBrotliDecompress === 'function') { - body = body.pipe(zlib.createBrotliDecompress()); - response = new Response(body, response_options); - resolve(response); - return; - } + try { + fs.mkdirSync(part, mode) + created = created || part + cache.set(part, true) + } catch (er) { + if (er.path && path.dirname(er.path) === cwd && + (er.code === 'ENOTDIR' || er.code === 'ENOENT')) + return new CwdError(cwd, er.code) - // otherwise, use response as-is - response = new Response(body, response_options); - resolve(response); - }); + const st = fs.lstatSync(part) + if (st.isDirectory()) { + cache.set(part, true) + continue + } else if (unlink) { + fs.unlinkSync(part) + fs.mkdirSync(part, mode) + created = created || part + cache.set(part, true) + continue + } else if (st.isSymbolicLink()) + return new SymlinkError(part, part + '/' + parts.join('/')) + } + } - writeToStream(req, request); - }); + return done(created) } -/** - * Redirect code matching - * - * @param Number code Status code - * @return Boolean - */ -fetch.isRedirect = function (code) { - return code === 301 || code === 302 || code === 303 || code === 307 || code === 308; -}; - -// expose Promise -fetch.Promise = global.Promise; - -module.exports = exports = fetch; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.default = exports; -exports.Headers = Headers; -exports.Request = Request; -exports.Response = Response; -exports.FetchError = FetchError; /***/ }), -/***/ 462: -/***/ (function(module) { +/***/ 582: +/***/ (function(module, __unusedexports, __webpack_require__) { "use strict"; +const Header = __webpack_require__(232) +const path = __webpack_require__(622) -// See http://www.robvanderwoude.com/escapechars.php -const metaCharsRegExp = /([()\][%!^"`<>&|;, *?])/g; - -function escapeCommand(arg) { - // Escape meta chars - arg = arg.replace(metaCharsRegExp, '^$1'); - - return arg; -} - -function escapeArgument(arg, doubleEscapeMetaChars) { - // Convert to string - arg = `${arg}`; - - // Algorithm below is based on https://qntm.org/cmd - - // Sequence of backslashes followed by a double quote: - // double up all the backslashes and escape the double quote - arg = arg.replace(/(\\*)"/g, '$1$1\\"'); - - // Sequence of backslashes followed by the end of the string - // (which will become a double quote later): - // double up all the backslashes - arg = arg.replace(/(\\*)$/, '$1$1'); - - // All other backslashes occur literally - - // Quote the whole thing: - arg = `"${arg}"`; - - // Escape meta chars - arg = arg.replace(metaCharsRegExp, '^$1'); - - // Double escape meta chars if necessary - if (doubleEscapeMetaChars) { - arg = arg.replace(metaCharsRegExp, '^$1'); - } - - return arg; -} - -module.exports.command = escapeCommand; -module.exports.argument = escapeArgument; +class Pax { + constructor (obj, global) { + this.atime = obj.atime || null + this.charset = obj.charset || null + this.comment = obj.comment || null + this.ctime = obj.ctime || null + this.gid = obj.gid || null + this.gname = obj.gname || null + this.linkpath = obj.linkpath || null + this.mtime = obj.mtime || null + this.path = obj.path || null + this.size = obj.size || null + this.uid = obj.uid || null + this.uname = obj.uname || null + this.dev = obj.dev || null + this.ino = obj.ino || null + this.nlink = obj.nlink || null + this.global = global || false + } + encode () { + const body = this.encodeBody() + if (body === '') + return null -/***/ }), + const bodyLen = Buffer.byteLength(body) + // round up to 512 bytes + // add 512 for header + const bufLen = 512 * Math.ceil(1 + bodyLen / 512) + const buf = Buffer.allocUnsafe(bufLen) -/***/ 463: -/***/ (function(__unusedmodule, exports, __webpack_require__) { + // 0-fill the header section, it might not hit every field + for (let i = 0; i < 512; i++) { + buf[i] = 0 + } -"use strict"; + new Header({ + // XXX split the path + // then the path should be PaxHeader + basename, but less than 99, + // prepend with the dirname + path: ('PaxHeader/' + path.basename(this.path)).slice(0, 99), + mode: this.mode || 0o644, + uid: this.uid || null, + gid: this.gid || null, + size: bodyLen, + mtime: this.mtime || null, + type: this.global ? 'GlobalExtendedHeader' : 'ExtendedHeader', + linkpath: '', + uname: this.uname || '', + gname: this.gname || '', + devmaj: 0, + devmin: 0, + atime: this.atime || null, + ctime: this.ctime || null + }).encode(buf) + buf.write(body, 512, bodyLen, 'utf8') -Object.defineProperty(exports, '__esModule', { value: true }); + // null pad after the body + for (let i = bodyLen + 512; i < buf.length; i++) { + buf[i] = 0 + } -function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } + return buf + } -var deprecation = __webpack_require__(692); -var once = _interopDefault(__webpack_require__(969)); + encodeBody () { + return ( + this.encodeField('path') + + this.encodeField('ctime') + + this.encodeField('atime') + + this.encodeField('dev') + + this.encodeField('ino') + + this.encodeField('nlink') + + this.encodeField('charset') + + this.encodeField('comment') + + this.encodeField('gid') + + this.encodeField('gname') + + this.encodeField('linkpath') + + this.encodeField('mtime') + + this.encodeField('size') + + this.encodeField('uid') + + this.encodeField('uname') + ) + } -const logOnce = once(deprecation => console.warn(deprecation)); -/** - * Error with extra properties to help with debugging - */ + encodeField (field) { + if (this[field] === null || this[field] === undefined) + return '' + const v = this[field] instanceof Date ? this[field].getTime() / 1000 + : this[field] + const s = ' ' + + (field === 'dev' || field === 'ino' || field === 'nlink' + ? 'SCHILY.' : '') + + field + '=' + v + '\n' + const byteLen = Buffer.byteLength(s) + // the digits includes the length of the digits in ascii base-10 + // so if it's 9 characters, then adding 1 for the 9 makes it 10 + // which makes it 11 chars. + let digits = Math.floor(Math.log(byteLen) / Math.log(10)) + 1 + if (byteLen + digits >= Math.pow(10, digits)) + digits += 1 + const len = digits + byteLen + return len + s + } +} -class RequestError extends Error { - constructor(message, statusCode, options) { - super(message); // Maintains proper stack trace (only available on V8) +Pax.parse = (string, ex, g) => new Pax(merge(parseKV(string), ex), g) - /* istanbul ignore next */ +const merge = (a, b) => + b ? Object.keys(a).reduce((s, k) => (s[k] = a[k], s), b) : a - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } +const parseKV = string => + string + .replace(/\n$/, '') + .split('\n') + .reduce(parseKVLine, Object.create(null)) - this.name = "HttpError"; - this.status = statusCode; - Object.defineProperty(this, "code", { - get() { - logOnce(new deprecation.Deprecation("[@octokit/request-error] `error.code` is deprecated, use `error.status`.")); - return statusCode; - } +const parseKVLine = (set, line) => { + const n = parseInt(line, 10) - }); - this.headers = options.headers || {}; // redact request credentials without mutating original request options + // XXX Values with \n in them will fail this. + // Refactor to not be a naive line-by-line parse. + if (n !== Buffer.byteLength(line) + 1) + return set - const requestCopy = Object.assign({}, options.request); + line = line.substr((n + ' ').length) + const kv = line.split('=') + const k = kv.shift().replace(/^SCHILY\.(dev|ino|nlink)/, '$1') + if (!k) + return set - if (options.request.headers.authorization) { - requestCopy.headers = Object.assign({}, options.request.headers, { - authorization: options.request.headers.authorization.replace(/ .*$/, " [REDACTED]") - }); - } + const v = kv.join('=') + set[k] = /^([A-Z]+\.)?([mac]|birth|creation)time$/.test(k) + ? new Date(v * 1000) + : /^[0-9]+$/.test(v) ? +v + : v + return set +} - requestCopy.url = requestCopy.url // client_id & client_secret can be passed as URL query parameters to increase rate limit - // see https://developer.github.com/v3/#increasing-the-unauthenticated-rate-limit-for-oauth-applications - .replace(/\bclient_secret=\w+/g, "client_secret=[REDACTED]") // OAuth tokens can be passed as URL query parameters, although it is not recommended - // see https://developer.github.com/v3/#oauth2-token-sent-in-a-header - .replace(/\baccess_token=\w+/g, "access_token=[REDACTED]"); - this.request = requestCopy; - } +module.exports = Pax -} -exports.RequestError = RequestError; -//# sourceMappingURL=index.js.map +/***/ }), +/***/ 605: +/***/ (function(module) { + +module.exports = require("http"); /***/ }), -/***/ 469: -/***/ (function(__unusedmodule, exports, __webpack_require__) { +/***/ 612: +/***/ (function(module, __unusedexports, __webpack_require__) { "use strict"; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; - result["default"] = mod; - return result; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -// Originally pulled from https://github.com/JasonEtco/actions-toolkit/blob/master/src/github.ts -const graphql_1 = __webpack_require__(503); -const rest_1 = __importDefault(__webpack_require__(0)); -const Context = __importStar(__webpack_require__(262)); -// We need this in order to extend Octokit -rest_1.default.prototype = new rest_1.default(); -exports.context = new Context.Context(); -class GitHub extends rest_1.default { - constructor(token, opts = {}) { - super(Object.assign(Object.assign({}, opts), { auth: `token ${token}` })); - this.graphql = graphql_1.defaults({ - headers: { authorization: `token ${token}` } - }); +module.exports = Yallist + +Yallist.Node = Node +Yallist.create = Yallist + +function Yallist (list) { + var self = this + if (!(self instanceof Yallist)) { + self = new Yallist() + } + + self.tail = null + self.head = null + self.length = 0 + + if (list && typeof list.forEach === 'function') { + list.forEach(function (item) { + self.push(item) + }) + } else if (arguments.length > 0) { + for (var i = 0, l = arguments.length; i < l; i++) { + self.push(arguments[i]) } + } + + return self } -exports.GitHub = GitHub; -//# sourceMappingURL=github.js.map -/***/ }), +Yallist.prototype.removeNode = function (node) { + if (node.list !== this) { + throw new Error('removing node which does not belong to this list') + } -/***/ 470: -/***/ (function(__unusedmodule, exports, __webpack_require__) { + var next = node.next + var prev = node.prev -"use strict"; + if (next) { + next.prev = prev + } -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; - result["default"] = mod; - return result; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const command_1 = __webpack_require__(431); -const os = __importStar(__webpack_require__(87)); -const path = __importStar(__webpack_require__(622)); -/** - * The code to exit an action - */ -var ExitCode; -(function (ExitCode) { - /** - * A code indicating that the action was successful - */ - ExitCode[ExitCode["Success"] = 0] = "Success"; - /** - * A code indicating that the action was a failure - */ - ExitCode[ExitCode["Failure"] = 1] = "Failure"; -})(ExitCode = exports.ExitCode || (exports.ExitCode = {})); -//----------------------------------------------------------------------- -// Variables -//----------------------------------------------------------------------- -/** - * Sets env variable for this action and future actions in the job - * @param name the name of the variable to set - * @param val the value of the variable - */ -function exportVariable(name, val) { - process.env[name] = val; - command_1.issueCommand('set-env', { name }, val); -} -exports.exportVariable = exportVariable; -/** - * Registers a secret which will get masked from logs - * @param secret value of the secret - */ -function setSecret(secret) { - command_1.issueCommand('add-mask', {}, secret); -} -exports.setSecret = setSecret; -/** - * Prepends inputPath to the PATH (for this action and future actions) - * @param inputPath - */ -function addPath(inputPath) { - command_1.issueCommand('add-path', {}, inputPath); - process.env['PATH'] = `${inputPath}${path.delimiter}${process.env['PATH']}`; -} -exports.addPath = addPath; -/** - * Gets the value of an input. The value is also trimmed. - * - * @param name name of the input to get - * @param options optional. See InputOptions. - * @returns string - */ -function getInput(name, options) { - const val = process.env[`INPUT_${name.replace(/ /g, '_').toUpperCase()}`] || ''; - if (options && options.required && !val) { - throw new Error(`Input required and not supplied: ${name}`); - } - return val.trim(); -} -exports.getInput = getInput; -/** - * Sets the value of an output. - * - * @param name name of the output to set - * @param value value to store - */ -function setOutput(name, value) { - command_1.issueCommand('set-output', { name }, value); -} -exports.setOutput = setOutput; -//----------------------------------------------------------------------- -// Results -//----------------------------------------------------------------------- -/** - * Sets the action status to failed. - * When the action exits it will be with an exit code of 1 - * @param message add error issue message - */ -function setFailed(message) { - process.exitCode = ExitCode.Failure; - error(message); -} -exports.setFailed = setFailed; -//----------------------------------------------------------------------- -// Logging Commands -//----------------------------------------------------------------------- -/** - * Writes debug message to user log - * @param message debug message - */ -function debug(message) { - command_1.issueCommand('debug', {}, message); -} -exports.debug = debug; -/** - * Adds an error issue - * @param message error issue message - */ -function error(message) { - command_1.issue('error', message); -} -exports.error = error; -/** - * Adds an warning issue - * @param message warning issue message - */ -function warning(message) { - command_1.issue('warning', message); -} -exports.warning = warning; -/** - * Writes info to log with console.log. - * @param message info message - */ -function info(message) { - process.stdout.write(message + os.EOL); -} -exports.info = info; -/** - * Begin an output group. - * - * Output until the next `groupEnd` will be foldable in this group - * - * @param name The name of the output group - */ -function startGroup(name) { - command_1.issue('group', name); -} -exports.startGroup = startGroup; -/** - * End an output group. - */ -function endGroup() { - command_1.issue('endgroup'); -} -exports.endGroup = endGroup; -/** - * Wrap an asynchronous function call in a group. - * - * Returns the same type as the function itself. - * - * @param name The name of the group - * @param fn The function to wrap in the group - */ -function group(name, fn) { - return __awaiter(this, void 0, void 0, function* () { - startGroup(name); - let result; - try { - result = yield fn(); - } - finally { - endGroup(); - } - return result; - }); -} -exports.group = group; -//----------------------------------------------------------------------- -// Wrapper action state -//----------------------------------------------------------------------- -/** - * Saves state for current action, the state can only be retrieved by this action's post job execution. - * - * @param name name of the state to store - * @param value value to store - */ -function saveState(name, value) { - command_1.issueCommand('save-state', { name }, value); -} -exports.saveState = saveState; -/** - * Gets the value of an state set by this action's main execution. - * - * @param name name of the state to get - * @returns string - */ -function getState(name) { - return process.env[`STATE_${name}`] || ''; -} -exports.getState = getState; -//# sourceMappingURL=core.js.map + if (prev) { + prev.next = next + } -/***/ }), + if (node === this.head) { + this.head = next + } + if (node === this.tail) { + this.tail = prev + } -/***/ 471: -/***/ (function(module, __unusedexports, __webpack_require__) { + node.list.length-- + node.next = null + node.prev = null + node.list = null -module.exports = authenticationBeforeRequest; + return next +} -const btoa = __webpack_require__(675); -const uniq = __webpack_require__(126); +Yallist.prototype.unshiftNode = function (node) { + if (node === this.head) { + return + } -function authenticationBeforeRequest(state, options) { - if (!state.auth.type) { - return; + if (node.list) { + node.list.removeNode(node) } - if (state.auth.type === "basic") { - const hash = btoa(`${state.auth.username}:${state.auth.password}`); - options.headers.authorization = `Basic ${hash}`; - return; + var head = this.head + node.list = this + node.next = head + if (head) { + head.prev = node } - if (state.auth.type === "token") { - options.headers.authorization = `token ${state.auth.token}`; - return; + this.head = node + if (!this.tail) { + this.tail = node } + this.length++ +} - if (state.auth.type === "app") { - options.headers.authorization = `Bearer ${state.auth.token}`; - const acceptHeaders = options.headers.accept - .split(",") - .concat("application/vnd.github.machine-man-preview+json"); - options.headers.accept = uniq(acceptHeaders) - .filter(Boolean) - .join(","); - return; +Yallist.prototype.pushNode = function (node) { + if (node === this.tail) { + return } - options.url += options.url.indexOf("?") === -1 ? "?" : "&"; + if (node.list) { + node.list.removeNode(node) + } - if (state.auth.token) { - options.url += `access_token=${encodeURIComponent(state.auth.token)}`; - return; + var tail = this.tail + node.list = this + node.prev = tail + if (tail) { + tail.next = node } - const key = encodeURIComponent(state.auth.key); - const secret = encodeURIComponent(state.auth.secret); - options.url += `client_id=${key}&client_secret=${secret}`; + this.tail = node + if (!this.head) { + this.head = node + } + this.length++ } +Yallist.prototype.push = function () { + for (var i = 0, l = arguments.length; i < l; i++) { + push(this, arguments[i]) + } + return this.length +} -/***/ }), - -/***/ 478: -/***/ (function(module) { +Yallist.prototype.unshift = function () { + for (var i = 0, l = arguments.length; i < l; i++) { + unshift(this, arguments[i]) + } + return this.length +} -"use strict"; +Yallist.prototype.pop = function () { + if (!this.tail) { + return undefined + } + var res = this.tail.value + this.tail = this.tail.prev + if (this.tail) { + this.tail.next = null + } else { + this.head = null + } + this.length-- + return res +} -// When writing files on Windows, translate the characters to their -// 0xf000 higher-encoded versions. +Yallist.prototype.shift = function () { + if (!this.head) { + return undefined + } -const raw = [ - '|', - '<', - '>', - '?', - ':' -] - -const win = raw.map(char => - String.fromCharCode(0xf000 + char.charCodeAt(0))) - -const toWin = new Map(raw.map((char, i) => [char, win[i]])) -const toRaw = new Map(win.map((char, i) => [char, raw[i]])) - -module.exports = { - encode: s => raw.reduce((s, c) => s.split(c).join(toWin.get(c)), s), - decode: s => win.reduce((s, c) => s.split(c).join(toRaw.get(c)), s) + var res = this.head.value + this.head = this.head.next + if (this.head) { + this.head.prev = null + } else { + this.tail = null + } + this.length-- + return res } - -/***/ }), - -/***/ 486: -/***/ (function(__unusedmodule, exports, __webpack_require__) { - -"use strict"; - -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; - result["default"] = mod; - return result; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const rest_1 = __webpack_require__(0); -const core = __importStar(__webpack_require__(470)); -const github = __importStar(__webpack_require__(469)); -function getTrivyIssues(client, image, labels) { - return __awaiter(this, void 0, void 0, function* () { - if (labels == null) { - return []; - } - let { data: trivyIssues, } = yield client.issues.listForRepo(Object.assign(Object.assign({}, github.context.repo), { state: "open", labels: labels.join(",") })); - return trivyIssues.filter(issue => issue.body.includes(image)); - }); -} -function createIssue(client, options) { - return __awaiter(this, void 0, void 0, function* () { - const { data: issue, } = yield client.issues.create(Object.assign(Object.assign({}, github.context.repo), options)); - return issue; - }); -} -function updateIssue(issueNumber, client, options) { - return __awaiter(this, void 0, void 0, function* () { - yield client.issues.update(Object.assign(Object.assign({}, github.context.repo), { issue_number: issueNumber, body: options.body })); - }); -} -function createOrUpdateIssue(token, image, options) { - return __awaiter(this, void 0, void 0, function* () { - const client = new rest_1.Octokit({ auth: token }); - const trivyIssues = yield getTrivyIssues(client, image, options.labels); - if (trivyIssues.length > 0) { - core.info("Found existing issue. Updating existing issue."); - const existingIssue = trivyIssues[0]; - yield updateIssue(existingIssue.number, client, options); - return { - issueNumber: existingIssue.number, - htmlUrl: existingIssue.html_url, - }; - } - else { - core.info("Create new issue"); - const newIssue = yield createIssue(client, options); - return { - issueNumber: newIssue.number, - htmlUrl: newIssue.html_url, - }; - } - }); +Yallist.prototype.forEach = function (fn, thisp) { + thisp = thisp || this + for (var walker = this.head, i = 0; walker !== null; i++) { + fn.call(thisp, walker.value, i, this) + walker = walker.next + } } -exports.createOrUpdateIssue = createOrUpdateIssue; - - -/***/ }), - -/***/ 489: -/***/ (function(module, __unusedexports, __webpack_require__) { - -"use strict"; - - -const path = __webpack_require__(622); -const which = __webpack_require__(814); -const pathKey = __webpack_require__(39)(); - -function resolveCommandAttempt(parsed, withoutPathExt) { - const cwd = process.cwd(); - const hasCustomCwd = parsed.options.cwd != null; - // If a custom `cwd` was specified, we need to change the process cwd - // because `which` will do stat calls but does not support a custom cwd - if (hasCustomCwd) { - try { - process.chdir(parsed.options.cwd); - } catch (err) { - /* Empty */ - } - } - - let resolved; - - try { - resolved = which.sync(parsed.command, { - path: (parsed.options.env || process.env)[pathKey], - pathExt: withoutPathExt ? path.delimiter : undefined, - }); - } catch (e) { - /* Empty */ - } finally { - process.chdir(cwd); - } - - // If we successfully resolved, ensure that an absolute path is returned - // Note that when a custom `cwd` was used, we need to resolve to an absolute path based on it - if (resolved) { - resolved = path.resolve(hasCustomCwd ? parsed.options.cwd : '', resolved); - } - - return resolved; +Yallist.prototype.forEachReverse = function (fn, thisp) { + thisp = thisp || this + for (var walker = this.tail, i = this.length - 1; walker !== null; i--) { + fn.call(thisp, walker.value, i, this) + walker = walker.prev + } } -function resolveCommand(parsed) { - return resolveCommandAttempt(parsed) || resolveCommandAttempt(parsed, true); +Yallist.prototype.get = function (n) { + for (var i = 0, walker = this.head; walker !== null && i < n; i++) { + // abort out of the list early if we hit a cycle + walker = walker.next + } + if (i === n && walker !== null) { + return walker.value + } } -module.exports = resolveCommand; - - -/***/ }), - -/***/ 500: -/***/ (function(module, __unusedexports, __webpack_require__) { - -module.exports = graphql +Yallist.prototype.getReverse = function (n) { + for (var i = 0, walker = this.tail; walker !== null && i < n; i++) { + // abort out of the list early if we hit a cycle + walker = walker.prev + } + if (i === n && walker !== null) { + return walker.value + } +} -const GraphqlError = __webpack_require__(862) +Yallist.prototype.map = function (fn, thisp) { + thisp = thisp || this + var res = new Yallist() + for (var walker = this.head; walker !== null;) { + res.push(fn.call(thisp, walker.value, this)) + walker = walker.next + } + return res +} -const NON_VARIABLE_OPTIONS = ['method', 'baseUrl', 'url', 'headers', 'request', 'query'] +Yallist.prototype.mapReverse = function (fn, thisp) { + thisp = thisp || this + var res = new Yallist() + for (var walker = this.tail; walker !== null;) { + res.push(fn.call(thisp, walker.value, this)) + walker = walker.prev + } + return res +} -function graphql (request, query, options) { - if (typeof query === 'string') { - options = Object.assign({ query }, options) +Yallist.prototype.reduce = function (fn, initial) { + var acc + var walker = this.head + if (arguments.length > 1) { + acc = initial + } else if (this.head) { + walker = this.head.next + acc = this.head.value } else { - options = query + throw new TypeError('Reduce of empty list with no initial value') } - const requestOptions = Object.keys(options).reduce((result, key) => { - if (NON_VARIABLE_OPTIONS.includes(key)) { - result[key] = options[key] - return result - } - - if (!result.variables) { - result.variables = {} - } - - result.variables[key] = options[key] - return result - }, {}) - - return request(requestOptions) - .then(response => { - if (response.data.errors) { - throw new GraphqlError(requestOptions, response) - } + for (var i = 0; walker !== null; i++) { + acc = fn(acc, walker.value, i) + walker = walker.next + } - return response.data.data - }) + return acc } - -/***/ }), - -/***/ 503: -/***/ (function(module, __unusedexports, __webpack_require__) { - -const { request } = __webpack_require__(753) -const getUserAgent = __webpack_require__(650) - -const version = __webpack_require__(314).version -const userAgent = `octokit-graphql.js/${version} ${getUserAgent()}` - -const withDefaults = __webpack_require__(958) - -module.exports = withDefaults(request, { - method: 'POST', - url: '/graphql', - headers: { - 'user-agent': userAgent +Yallist.prototype.reduceReverse = function (fn, initial) { + var acc + var walker = this.tail + if (arguments.length > 1) { + acc = initial + } else if (this.tail) { + walker = this.tail.prev + acc = this.tail.value + } else { + throw new TypeError('Reduce of empty list with no initial value') } -}) - - -/***/ }), -/***/ 510: -/***/ (function(module) { + for (var i = this.length - 1; walker !== null; i--) { + acc = fn(acc, walker.value, i) + walker = walker.prev + } -module.exports = addHook + return acc +} -function addHook (state, kind, name, hook) { - var orig = hook - if (!state.registry[name]) { - state.registry[name] = [] +Yallist.prototype.toArray = function () { + var arr = new Array(this.length) + for (var i = 0, walker = this.head; walker !== null; i++) { + arr[i] = walker.value + walker = walker.next } + return arr +} - if (kind === 'before') { - hook = function (method, options) { - return Promise.resolve() - .then(orig.bind(null, options)) - .then(method.bind(null, options)) - } +Yallist.prototype.toArrayReverse = function () { + var arr = new Array(this.length) + for (var i = 0, walker = this.tail; walker !== null; i++) { + arr[i] = walker.value + walker = walker.prev } + return arr +} - if (kind === 'after') { - hook = function (method, options) { - var result - return Promise.resolve() - .then(method.bind(null, options)) - .then(function (result_) { - result = result_ - return orig(result, options) - }) - .then(function () { - return result - }) - } +Yallist.prototype.slice = function (from, to) { + to = to || this.length + if (to < 0) { + to += this.length } - - if (kind === 'error') { - hook = function (method, options) { - return Promise.resolve() - .then(method.bind(null, options)) - .catch(function (error) { - return orig(error, options) - }) - } + from = from || 0 + if (from < 0) { + from += this.length } - - state.registry[name].push({ - hook: hook, - orig: orig - }) + var ret = new Yallist() + if (to < from || to < 0) { + return ret + } + if (from < 0) { + from = 0 + } + if (to > this.length) { + to = this.length + } + for (var i = 0, walker = this.head; walker !== null && i < from; i++) { + walker = walker.next + } + for (; walker !== null && i < to; i++, walker = walker.next) { + ret.push(walker.value) + } + return ret } +Yallist.prototype.sliceReverse = function (from, to) { + to = to || this.length + if (to < 0) { + to += this.length + } + from = from || 0 + if (from < 0) { + from += this.length + } + var ret = new Yallist() + if (to < from || to < 0) { + return ret + } + if (from < 0) { + from = 0 + } + if (to > this.length) { + to = this.length + } + for (var i = this.length, walker = this.tail; walker !== null && i > to; i--) { + walker = walker.prev + } + for (; walker !== null && i > from; i--, walker = walker.prev) { + ret.push(walker.value) + } + return ret +} -/***/ }), - -/***/ 523: -/***/ (function(module, __unusedexports, __webpack_require__) { +Yallist.prototype.splice = function (start, deleteCount, ...nodes) { + if (start > this.length) { + start = this.length - 1 + } + if (start < 0) { + start = this.length + start; + } -var register = __webpack_require__(363) -var addHook = __webpack_require__(510) -var removeHook = __webpack_require__(763) + for (var i = 0, walker = this.head; walker !== null && i < start; i++) { + walker = walker.next + } -// bind with array of arguments: https://stackoverflow.com/a/21792913 -var bind = Function.bind -var bindable = bind.bind(bind) + var ret = [] + for (var i = 0; walker && i < deleteCount; i++) { + ret.push(walker.value) + walker = this.removeNode(walker) + } + if (walker === null) { + walker = this.tail + } -function bindApi (hook, state, name) { - var removeHookRef = bindable(removeHook, null).apply(null, name ? [state, name] : [state]) - hook.api = { remove: removeHookRef } - hook.remove = removeHookRef + if (walker !== this.head && walker !== this.tail) { + walker = walker.prev + } - ;['before', 'error', 'after', 'wrap'].forEach(function (kind) { - var args = name ? [state, kind, name] : [state, kind] - hook[kind] = hook.api[kind] = bindable(addHook, null).apply(null, args) - }) + for (var i = 0; i < nodes.length; i++) { + walker = insert(this, walker, nodes[i]) + } + return ret; } -function HookSingular () { - var singularHookName = 'h' - var singularHookState = { - registry: {} +Yallist.prototype.reverse = function () { + var head = this.head + var tail = this.tail + for (var walker = head; walker !== null; walker = walker.prev) { + var p = walker.prev + walker.prev = walker.next + walker.next = p } - var singularHook = register.bind(null, singularHookState, singularHookName) - bindApi(singularHook, singularHookState, singularHookName) - return singularHook + this.head = tail + this.tail = head + return this } -function HookCollection () { - var state = { - registry: {} +function insert (self, node, value) { + var inserted = node === self.head ? + new Node(value, null, node, self) : + new Node(value, node, node.next, self) + + if (inserted.next === null) { + self.tail = inserted + } + if (inserted.prev === null) { + self.head = inserted } - var hook = register.bind(null, state) - bindApi(hook, state) + self.length++ - return hook + return inserted } -var collectionHookDeprecationMessageDisplayed = false -function Hook () { - if (!collectionHookDeprecationMessageDisplayed) { - console.warn('[before-after-hook]: "Hook()" repurposing warning, use "Hook.Collection()". Read more: https://git.io/upgrade-before-after-hook-to-1.4') - collectionHookDeprecationMessageDisplayed = true +function push (self, item) { + self.tail = new Node(item, self.tail, null, self) + if (!self.head) { + self.head = self.tail } - return HookCollection() + self.length++ } -Hook.Singular = HookSingular.bind() -Hook.Collection = HookCollection.bind() - -module.exports = Hook -// expose constructors as a named property for TypeScript -module.exports.Hook = Hook -module.exports.Singular = Hook.Singular -module.exports.Collection = Hook.Collection - - -/***/ }), - -/***/ 526: -/***/ (function(__unusedmodule, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, '__esModule', { value: true }); +function unshift (self, item) { + self.head = new Node(item, null, self.head, self) + if (!self.tail) { + self.tail = self.head + } + self.length++ +} -function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } +function Node (value, prev, next, list) { + if (!(this instanceof Node)) { + return new Node(value, prev, next, list) + } -var osName = _interopDefault(__webpack_require__(2)); + this.list = list + this.value = value -function getUserAgent() { - try { - return `Node.js/${process.version.substr(1)} (${osName()}; ${process.arch})`; - } catch (error) { - if (/wmic os get Caption/.test(error.message)) { - return "Windows "; - } + if (prev) { + prev.next = this + this.prev = prev + } else { + this.prev = null + } - throw error; + if (next) { + next.prev = this + this.next = next + } else { + this.next = null } } -exports.getUserAgent = getUserAgent; -//# sourceMappingURL=index.js.map +try { + // add if support for Symbol.iterator is present + __webpack_require__(396)(Yallist) +} catch (er) {} /***/ }), -/***/ 529: -/***/ (function(module, __unusedexports, __webpack_require__) { - -const factory = __webpack_require__(47); - -module.exports = factory(); +/***/ 614: +/***/ (function(module) { +module.exports = require("events"); /***/ }), -/***/ 536: -/***/ (function(module, __unusedexports, __webpack_require__) { - -module.exports = hasFirstPage - -const deprecate = __webpack_require__(370) -const getPageLinks = __webpack_require__(13) - -function hasFirstPage (link) { - deprecate(`octokit.hasFirstPage() – You can use octokit.paginate or async iterators instead: https://github.com/octokit/rest.js#pagination.`) - return getPageLinks(link).first -} +/***/ 622: +/***/ (function(module) { +module.exports = require("path"); /***/ }), -/***/ 548: -/***/ (function(module) { +/***/ 626: +/***/ (function(module, __unusedexports, __webpack_require__) { -"use strict"; +var path = __webpack_require__(622); +var fs = __webpack_require__(747); +var _0777 = parseInt('0777', 8); +module.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP; -/*! - * isobject - * - * Copyright (c) 2014-2017, Jon Schlinkert. - * Released under the MIT License. - */ +function mkdirP (p, opts, f, made) { + if (typeof opts === 'function') { + f = opts; + opts = {}; + } + else if (!opts || typeof opts !== 'object') { + opts = { mode: opts }; + } + + var mode = opts.mode; + var xfs = opts.fs || fs; + + if (mode === undefined) { + mode = _0777 + } + if (!made) made = null; + + var cb = f || function () {}; + p = path.resolve(p); + + xfs.mkdir(p, mode, function (er) { + if (!er) { + made = made || p; + return cb(null, made); + } + switch (er.code) { + case 'ENOENT': + if (path.dirname(p) === p) return cb(er); + mkdirP(path.dirname(p), opts, function (er, made) { + if (er) cb(er, made); + else mkdirP(p, opts, cb, made); + }); + break; -function isObject(val) { - return val != null && typeof val === 'object' && Array.isArray(val) === false; + // In the case of any other error, just see if there's a dir + // there already. If so, then hooray! If not, then something + // is borked. + default: + xfs.stat(p, function (er2, stat) { + // if the stat fails, then that's super weird. + // let the original error be the failure reason. + if (er2 || !stat.isDirectory()) cb(er, made) + else cb(null, made); + }); + break; + } + }); } -/*! - * is-plain-object - * - * Copyright (c) 2014-2017, Jon Schlinkert. - * Released under the MIT License. - */ +mkdirP.sync = function sync (p, opts, made) { + if (!opts || typeof opts !== 'object') { + opts = { mode: opts }; + } + + var mode = opts.mode; + var xfs = opts.fs || fs; + + if (mode === undefined) { + mode = _0777 + } + if (!made) made = null; -function isObjectObject(o) { - return isObject(o) === true - && Object.prototype.toString.call(o) === '[object Object]'; -} - -function isPlainObject(o) { - var ctor,prot; - - if (isObjectObject(o) === false) return false; - - // If has modified constructor - ctor = o.constructor; - if (typeof ctor !== 'function') return false; - - // If has modified prototype - prot = ctor.prototype; - if (isObjectObject(prot) === false) return false; + p = path.resolve(p); - // If constructor does not have an Object-specific method - if (prot.hasOwnProperty('isPrototypeOf') === false) { - return false; - } + try { + xfs.mkdirSync(p, mode); + made = made || p; + } + catch (err0) { + switch (err0.code) { + case 'ENOENT' : + made = sync(path.dirname(p), opts, made); + sync(p, opts, made); + break; - // Most likely a plain Object - return true; -} + // In the case of any other error, just see if there's a dir + // there already. If so, then hooray! If not, then something + // is borked. + default: + var stat; + try { + stat = xfs.statSync(p); + } + catch (err1) { + throw err0; + } + if (!stat.isDirectory()) throw err0; + break; + } + } -module.exports = isPlainObject; + return made; +}; /***/ }), -/***/ 550: +/***/ 630: /***/ (function(module, __unusedexports, __webpack_require__) { -module.exports = getNextPage - -const getPage = __webpack_require__(265) - -function getNextPage (octokit, link, headers) { - return getPage(octokit, link, 'next', headers) -} - - -/***/ }), - -/***/ 554: -/***/ (function(__unusedmodule, exports) { - "use strict"; -// map types from key to human-friendly name -exports.name = new Map([ - ['0', 'File'], - // same as File - ['', 'OldFile'], - ['1', 'Link'], - ['2', 'SymbolicLink'], - // Devices and FIFOs aren't fully supported - // they are parsed, but skipped when unpacking - ['3', 'CharacterDevice'], - ['4', 'BlockDevice'], - ['5', 'Directory'], - ['6', 'FIFO'], - // same as File - ['7', 'ContiguousFile'], - // pax headers - ['g', 'GlobalExtendedHeader'], - ['x', 'ExtendedHeader'], - // vendor-specific stuff - // skip - ['A', 'SolarisACL'], - // like 5, but with data, which should be skipped - ['D', 'GNUDumpDir'], - // metadata only, skip - ['I', 'Inode'], - // data = link path of next file - ['K', 'NextFileHasLongLinkpath'], - // data = path of next file - ['L', 'NextFileHasLongPath'], - // skip - ['M', 'ContinuationFile'], - // like L - ['N', 'OldGnuLongPath'], - // skip - ['S', 'SparseFile'], - // skip - ['V', 'TapeVolumeHeader'], - // like x - ['X', 'OldExtendedHeader'] -]) - -// map the other direction -exports.code = new Map(Array.from(exports.name).map(kv => [kv[1], kv[0]])) - - -/***/ }), - -/***/ 558: -/***/ (function(module, __unusedexports, __webpack_require__) { -module.exports = hasPreviousPage +// tar -r +const hlo = __webpack_require__(891) +const Pack = __webpack_require__(726) +const Parse = __webpack_require__(203) +const fs = __webpack_require__(747) +const fsm = __webpack_require__(827) +const t = __webpack_require__(381) +const path = __webpack_require__(622) -const deprecate = __webpack_require__(370) -const getPageLinks = __webpack_require__(13) +// starting at the head of the file, read a Header +// If the checksum is invalid, that's our position to start writing +// If it is, jump forward by the specified size (round up to 512) +// and try again. +// Write the new Pack stream starting there. -function hasPreviousPage (link) { - deprecate(`octokit.hasPreviousPage() – You can use octokit.paginate or async iterators instead: https://github.com/octokit/rest.js#pagination.`) - return getPageLinks(link).prev -} +const Header = __webpack_require__(232) +const r = module.exports = (opt_, files, cb) => { + const opt = hlo(opt_) -/***/ }), + if (!opt.file) + throw new TypeError('file is required') -/***/ 563: -/***/ (function(module, __unusedexports, __webpack_require__) { + if (opt.gzip) + throw new TypeError('cannot append to compressed archives') -module.exports = getPreviousPage + if (!files || !Array.isArray(files) || !files.length) + throw new TypeError('no files or directories specified') -const getPage = __webpack_require__(265) + files = Array.from(files) -function getPreviousPage (octokit, link, headers) { - return getPage(octokit, link, 'prev', headers) + return opt.sync ? replaceSync(opt, files) + : replace(opt, files, cb) } +const replaceSync = (opt, files) => { + const p = new Pack.Sync(opt) -/***/ }), - -/***/ 568: -/***/ (function(module, __unusedexports, __webpack_require__) { - -"use strict"; - - -const path = __webpack_require__(622); -const niceTry = __webpack_require__(948); -const resolveCommand = __webpack_require__(489); -const escape = __webpack_require__(462); -const readShebang = __webpack_require__(389); -const semver = __webpack_require__(280); + let threw = true + let fd + let position -const isWin = process.platform === 'win32'; -const isExecutableRegExp = /\.(?:com|exe)$/i; -const isCmdShimRegExp = /node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i; + try { + try { + fd = fs.openSync(opt.file, 'r+') + } catch (er) { + if (er.code === 'ENOENT') + fd = fs.openSync(opt.file, 'w+') + else + throw er + } -// `options.shell` is supported in Node ^4.8.0, ^5.7.0 and >= 6.0.0 -const supportsShellOption = niceTry(() => semver.satisfies(process.version, '^4.8.0 || ^5.7.0 || >= 6.0.0', true)) || false; + const st = fs.fstatSync(fd) + const headBuf = Buffer.alloc(512) -function detectShebang(parsed) { - parsed.file = resolveCommand(parsed); + POSITION: for (position = 0; position < st.size; position += 512) { + for (let bufPos = 0, bytes = 0; bufPos < 512; bufPos += bytes) { + bytes = fs.readSync( + fd, headBuf, bufPos, headBuf.length - bufPos, position + bufPos + ) - const shebang = parsed.file && readShebang(parsed.file); + if (position === 0 && headBuf[0] === 0x1f && headBuf[1] === 0x8b) + throw new Error('cannot append to compressed archives') - if (shebang) { - parsed.args.unshift(parsed.file); - parsed.command = shebang; + if (!bytes) + break POSITION + } - return resolveCommand(parsed); + let h = new Header(headBuf) + if (!h.cksumValid) + break + let entryBlockSize = 512 * Math.ceil(h.size / 512) + if (position + entryBlockSize + 512 > st.size) + break + // the 512 for the header we just parsed will be added as well + // also jump ahead all the blocks for the body + position += entryBlockSize + if (opt.mtimeCache) + opt.mtimeCache.set(h.path, h.mtime) } + threw = false - return parsed.file; + streamSync(opt, p, position, fd, files) + } finally { + if (threw) + try { fs.closeSync(fd) } catch (er) {} + } } -function parseNonShell(parsed) { - if (!isWin) { - return parsed; - } - - // Detect & add support for shebangs - const commandFile = detectShebang(parsed); - - // We don't need a shell if the command filename is an executable - const needsShell = !isExecutableRegExp.test(commandFile); +const streamSync = (opt, p, position, fd, files) => { + const stream = new fsm.WriteStreamSync(opt.file, { + fd: fd, + start: position + }) + p.pipe(stream) + addFilesSync(p, files) +} - // If a shell is required, use cmd.exe and take care of escaping everything correctly - // Note that `forceShell` is an hidden option used only in tests - if (parsed.options.forceShell || needsShell) { - // Need to double escape meta chars if the command is a cmd-shim located in `node_modules/.bin/` - // The cmd-shim simply calls execute the package bin file with NodeJS, proxying any argument - // Because the escape of metachars with ^ gets interpreted when the cmd.exe is first called, - // we need to double escape them - const needsDoubleEscapeMetaChars = isCmdShimRegExp.test(commandFile); +const replace = (opt, files, cb) => { + files = Array.from(files) + const p = new Pack(opt) - // Normalize posix paths into OS compatible paths (e.g.: foo/bar -> foo\bar) - // This is necessary otherwise it will always fail with ENOENT in those cases - parsed.command = path.normalize(parsed.command); + const getPos = (fd, size, cb_) => { + const cb = (er, pos) => { + if (er) + fs.close(fd, _ => cb_(er)) + else + cb_(null, pos) + } - // Escape command & arguments - parsed.command = escape.command(parsed.command); - parsed.args = parsed.args.map((arg) => escape.argument(arg, needsDoubleEscapeMetaChars)); + let position = 0 + if (size === 0) + return cb(null, 0) - const shellCommand = [parsed.command].concat(parsed.args).join(' '); + let bufPos = 0 + const headBuf = Buffer.alloc(512) + const onread = (er, bytes) => { + if (er) + return cb(er) + bufPos += bytes + if (bufPos < 512 && bytes) + return fs.read( + fd, headBuf, bufPos, headBuf.length - bufPos, + position + bufPos, onread + ) - parsed.args = ['/d', '/s', '/c', `"${shellCommand}"`]; - parsed.command = process.env.comspec || 'cmd.exe'; - parsed.options.windowsVerbatimArguments = true; // Tell node's spawn that the arguments are already escaped - } + if (position === 0 && headBuf[0] === 0x1f && headBuf[1] === 0x8b) + return cb(new Error('cannot append to compressed archives')) - return parsed; -} + // truncated header + if (bufPos < 512) + return cb(null, position) -function parseShell(parsed) { - // If node supports the shell option, there's no need to mimic its behavior - if (supportsShellOption) { - return parsed; - } + const h = new Header(headBuf) + if (!h.cksumValid) + return cb(null, position) - // Mimic node shell option - // See https://github.com/nodejs/node/blob/b9f6a2dc059a1062776133f3d4fd848c4da7d150/lib/child_process.js#L335 - const shellCommand = [parsed.command].concat(parsed.args).join(' '); + const entryBlockSize = 512 * Math.ceil(h.size / 512) + if (position + entryBlockSize + 512 > size) + return cb(null, position) - if (isWin) { - parsed.command = typeof parsed.options.shell === 'string' ? parsed.options.shell : process.env.comspec || 'cmd.exe'; - parsed.args = ['/d', '/s', '/c', `"${shellCommand}"`]; - parsed.options.windowsVerbatimArguments = true; // Tell node's spawn that the arguments are already escaped - } else { - if (typeof parsed.options.shell === 'string') { - parsed.command = parsed.options.shell; - } else if (process.platform === 'android') { - parsed.command = '/system/bin/sh'; - } else { - parsed.command = '/bin/sh'; - } + position += entryBlockSize + 512 + if (position >= size) + return cb(null, position) - parsed.args = ['-c', shellCommand]; + if (opt.mtimeCache) + opt.mtimeCache.set(h.path, h.mtime) + bufPos = 0 + fs.read(fd, headBuf, 0, 512, position, onread) } + fs.read(fd, headBuf, 0, 512, position, onread) + } - return parsed; -} - -function parse(command, args, options) { - // Normalize arguments, similar to nodejs - if (args && !Array.isArray(args)) { - options = args; - args = null; - } + const promise = new Promise((resolve, reject) => { + p.on('error', reject) + let flag = 'r+' + const onopen = (er, fd) => { + if (er && er.code === 'ENOENT' && flag === 'r+') { + flag = 'w+' + return fs.open(opt.file, flag, onopen) + } - args = args ? args.slice(0) : []; // Clone array to avoid changing the original - options = Object.assign({}, options); // Clone object to avoid changing the original + if (er) + return reject(er) - // Build our parsed object - const parsed = { - command, - args, - options, - file: undefined, - original: { - command, - args, - }, - }; + fs.fstat(fd, (er, st) => { + if (er) + return reject(er) + getPos(fd, st.size, (er, position) => { + if (er) + return reject(er) + const stream = new fsm.WriteStream(opt.file, { + fd: fd, + start: position + }) + p.pipe(stream) + stream.on('error', reject) + stream.on('close', resolve) + addFilesAsync(p, files) + }) + }) + } + fs.open(opt.file, flag, onopen) + }) + + return cb ? promise.then(cb, cb) : promise +} + +const addFilesSync = (p, files) => { + files.forEach(file => { + if (file.charAt(0) === '@') + t({ + file: path.resolve(p.cwd, file.substr(1)), + sync: true, + noResume: true, + onentry: entry => p.add(entry) + }) + else + p.add(file) + }) + p.end() +} - // Delegate further parsing to shell or non-shell - return options.shell ? parseShell(parsed) : parseNonShell(parsed); +const addFilesAsync = (p, files) => { + while (files.length) { + const file = files.shift() + if (file.charAt(0) === '@') + return t({ + file: path.resolve(p.cwd, file.substr(1)), + noResume: true, + onentry: entry => p.add(entry) + }).then(_ => addFilesAsync(p, files)) + else + p.add(file) + } + p.end() } -module.exports = parse; +/***/ }), + +/***/ 631: +/***/ (function(module) { + +module.exports = require("net"); /***/ }), -/***/ 577: +/***/ 656: /***/ (function(module, __unusedexports, __webpack_require__) { "use strict"; -// wrapper around mkdirp for tar's needs. - -// TODO: This should probably be a class, not functionally -// passing around state in a gazillion args. -const mkdirp = __webpack_require__(626) +// tar -x +const hlo = __webpack_require__(891) +const Unpack = __webpack_require__(63) const fs = __webpack_require__(747) +const fsm = __webpack_require__(827) const path = __webpack_require__(622) -const chownr = __webpack_require__(941) -class SymlinkError extends Error { - constructor (symlink, path) { - super('Cannot extract through symbolic link') - this.path = path - this.symlink = symlink - } +const x = module.exports = (opt_, files, cb) => { + if (typeof opt_ === 'function') + cb = opt_, files = null, opt_ = {} + else if (Array.isArray(opt_)) + files = opt_, opt_ = {} - get name () { - return 'SylinkError' - } -} + if (typeof files === 'function') + cb = files, files = null -class CwdError extends Error { - constructor (path, code) { - super(code + ': Cannot cd into \'' + path + '\'') - this.path = path - this.code = code - } + if (!files) + files = [] + else + files = Array.from(files) - get name () { - return 'CwdError' - } -} + const opt = hlo(opt_) -const mkdir = module.exports = (dir, opt, cb) => { - // if there's any overlap between mask and mode, - // then we'll need an explicit chmod - const umask = opt.umask - const mode = opt.mode | 0o0700 - const needChmod = (mode & umask) !== 0 + if (opt.sync && typeof cb === 'function') + throw new TypeError('callback not supported for sync tar functions') - const uid = opt.uid - const gid = opt.gid - const doChown = typeof uid === 'number' && - typeof gid === 'number' && - ( uid !== opt.processUid || gid !== opt.processGid ) + if (!opt.file && typeof cb === 'function') + throw new TypeError('callback only supported with file option') - const preserve = opt.preserve - const unlink = opt.unlink - const cache = opt.cache - const cwd = opt.cwd + if (files.length) + filesFilter(opt, files) - const done = (er, created) => { - if (er) - cb(er) - else { - cache.set(dir, true) - if (created && doChown) - chownr(created, uid, gid, er => done(er)) - else if (needChmod) - fs.chmod(dir, mode, cb) - else - cb() - } - } + return opt.file && opt.sync ? extractFileSync(opt) + : opt.file ? extractFile(opt, cb) + : opt.sync ? extractSync(opt) + : extract(opt) +} - if (cache && cache.get(dir) === true) - return done() +// construct a filter that limits the file entries listed +// include child entries if a dir is included +const filesFilter = (opt, files) => { + const map = new Map(files.map(f => [f.replace(/\/+$/, ''), true])) + const filter = opt.filter - if (dir === cwd) - return fs.stat(dir, (er, st) => { - if (er || !st.isDirectory()) - er = new CwdError(dir, er && er.code || 'ENOTDIR') - done(er) - }) + const mapHas = (file, r) => { + const root = r || path.parse(file).root || '.' + const ret = file === root ? false + : map.has(file) ? map.get(file) + : mapHas(path.dirname(file), root) - if (preserve) - return mkdirp(dir, mode, done) + map.set(file, ret) + return ret + } - const sub = path.relative(cwd, dir) - const parts = sub.split(/\/|\\/) - mkdir_(cwd, parts, mode, cache, unlink, cwd, null, done) + opt.filter = filter + ? (file, entry) => filter(file, entry) && mapHas(file.replace(/\/+$/, '')) + : file => mapHas(file.replace(/\/+$/, '')) } -const mkdir_ = (base, parts, mode, cache, unlink, cwd, created, cb) => { - if (!parts.length) - return cb(null, created) - const p = parts.shift() - const part = base + '/' + p - if (cache.get(part)) - return mkdir_(part, parts, mode, cache, unlink, cwd, created, cb) - fs.mkdir(part, mode, onmkdir(part, parts, mode, cache, unlink, cwd, created, cb)) +const extractFileSync = opt => { + const u = new Unpack.Sync(opt) + + const file = opt.file + let threw = true + let fd + const stat = fs.statSync(file) + // This trades a zero-byte read() syscall for a stat + // However, it will usually result in less memory allocation + const readSize = opt.maxReadSize || 16*1024*1024 + const stream = new fsm.ReadStreamSync(file, { + readSize: readSize, + size: stat.size + }) + stream.pipe(u) } -const onmkdir = (part, parts, mode, cache, unlink, cwd, created, cb) => er => { - if (er) { - if (er.path && path.dirname(er.path) === cwd && - (er.code === 'ENOTDIR' || er.code === 'ENOENT')) - return cb(new CwdError(cwd, er.code)) +const extractFile = (opt, cb) => { + const u = new Unpack(opt) + const readSize = opt.maxReadSize || 16*1024*1024 - fs.lstat(part, (statEr, st) => { - if (statEr) - cb(statEr) - else if (st.isDirectory()) - mkdir_(part, parts, mode, cache, unlink, cwd, created, cb) - else if (unlink) - fs.unlink(part, er => { - if (er) - return cb(er) - fs.mkdir(part, mode, onmkdir(part, parts, mode, cache, unlink, cwd, created, cb)) + const file = opt.file + const p = new Promise((resolve, reject) => { + u.on('error', reject) + u.on('close', resolve) + + // This trades a zero-byte read() syscall for a stat + // However, it will usually result in less memory allocation + fs.stat(file, (er, stat) => { + if (er) + reject(er) + else { + const stream = new fsm.ReadStream(file, { + readSize: readSize, + size: stat.size }) - else if (st.isSymbolicLink()) - return cb(new SymlinkError(part, part + '/' + parts.join('/'))) - else - cb(er) + stream.on('error', reject) + stream.pipe(u) + } }) - } else { - created = created || part - mkdir_(part, parts, mode, cache, unlink, cwd, created, cb) - } + }) + return cb ? p.then(cb, cb) : p } -const mkdirSync = module.exports.sync = (dir, opt) => { - // if there's any overlap between mask and mode, - // then we'll need an explicit chmod - const umask = opt.umask - const mode = opt.mode | 0o0700 - const needChmod = (mode & umask) !== 0 +const extractSync = opt => { + return new Unpack.Sync(opt) +} - const uid = opt.uid - const gid = opt.gid - const doChown = typeof uid === 'number' && - typeof gid === 'number' && - ( uid !== opt.processUid || gid !== opt.processGid ) +const extract = opt => { + return new Unpack(opt) +} - const preserve = opt.preserve - const unlink = opt.unlink - const cache = opt.cache - const cwd = opt.cwd - const done = (created) => { - cache.set(dir, true) - if (created && doChown) - chownr.sync(created, uid, gid) - if (needChmod) - fs.chmodSync(dir, mode) +/***/ }), + +/***/ 662: +/***/ (function(module, __unusedexports, __webpack_require__) { + +"use strict"; + +const types = __webpack_require__(554) +const MiniPass = __webpack_require__(720) + +const SLURP = Symbol('slurp') +module.exports = class ReadEntry extends MiniPass { + constructor (header, ex, gex) { + super() + // read entries always start life paused. this is to avoid the + // situation where Minipass's auto-ending empty streams results + // in an entry ending before we're ready for it. + this.pause() + this.extended = ex + this.globalExtended = gex + this.header = header + this.startBlockSize = 512 * Math.ceil(header.size / 512) + this.blockRemain = this.startBlockSize + this.remain = header.size + this.type = header.type + this.meta = false + this.ignore = false + switch (this.type) { + case 'File': + case 'OldFile': + case 'Link': + case 'SymbolicLink': + case 'CharacterDevice': + case 'BlockDevice': + case 'Directory': + case 'FIFO': + case 'ContiguousFile': + case 'GNUDumpDir': + break + + case 'NextFileHasLongLinkpath': + case 'NextFileHasLongPath': + case 'OldGnuLongPath': + case 'GlobalExtendedHeader': + case 'ExtendedHeader': + case 'OldExtendedHeader': + this.meta = true + break + + // NOTE: gnutar and bsdtar treat unrecognized types as 'File' + // it may be worth doing the same, but with a warning. + default: + this.ignore = true + } + + this.path = header.path + this.mode = header.mode + if (this.mode) + this.mode = this.mode & 0o7777 + this.uid = header.uid + this.gid = header.gid + this.uname = header.uname + this.gname = header.gname + this.size = header.size + this.mtime = header.mtime + this.atime = header.atime + this.ctime = header.ctime + this.linkpath = header.linkpath + this.uname = header.uname + this.gname = header.gname + + if (ex) this[SLURP](ex) + if (gex) this[SLURP](gex, true) } - if (cache && cache.get(dir) === true) - return done() + write (data) { + const writeLen = data.length + if (writeLen > this.blockRemain) + throw new Error('writing more to entry than is appropriate') - if (dir === cwd) { - let ok = false - let code = 'ENOTDIR' - try { - ok = fs.statSync(dir).isDirectory() - } catch (er) { - code = er.code - } finally { - if (!ok) - throw new CwdError(dir, code) + const r = this.remain + const br = this.blockRemain + this.remain = Math.max(0, r - writeLen) + this.blockRemain = Math.max(0, br - writeLen) + if (this.ignore) + return true + + if (r >= writeLen) + return super.write(data) + + // r < writeLen + return super.write(data.slice(0, r)) + } + + [SLURP] (ex, global) { + for (let k in ex) { + // we slurp in everything except for the path attribute in + // a global extended header, because that's weird. + if (ex[k] !== null && ex[k] !== undefined && + !(global && k === 'path')) + this[k] = ex[k] } - done() - return } +} - if (preserve) - return done(mkdirp.sync(dir, mode)) - const sub = path.relative(cwd, dir) - const parts = sub.split(/\/|\\/) - let created = null - for (let p = parts.shift(), part = cwd; - p && (part += '/' + p); - p = parts.shift()) { +/***/ }), - if (cache.get(part)) - continue +/***/ 669: +/***/ (function(module) { - try { - fs.mkdirSync(part, mode) - created = created || part - cache.set(part, true) - } catch (er) { - if (er.path && path.dirname(er.path) === cwd && - (er.code === 'ENOTDIR' || er.code === 'ENOENT')) - return new CwdError(cwd, er.code) +module.exports = require("util"); - const st = fs.lstatSync(part) - if (st.isDirectory()) { - cache.set(part, true) - continue - } else if (unlink) { - fs.unlinkSync(part) - fs.mkdirSync(part, mode) - created = created || part - cache.set(part, true) - continue - } else if (st.isSymbolicLink()) - return new SymlinkError(part, part + '/' + parts.join('/')) +/***/ }), + +/***/ 692: +/***/ (function(__unusedmodule, exports) { + +"use strict"; + + +Object.defineProperty(exports, '__esModule', { value: true }); + +class Deprecation extends Error { + constructor(message) { + super(message); // Maintains proper stack trace (only available on V8) + + /* istanbul ignore next */ + + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); } + + this.name = 'Deprecation'; } - return done(created) } +exports.Deprecation = Deprecation; + /***/ }), -/***/ 582: -/***/ (function(module, __unusedexports, __webpack_require__) { +/***/ 701: +/***/ (function(__unusedmodule, exports) { "use strict"; -const Header = __webpack_require__(232) -const path = __webpack_require__(622) -class Pax { - constructor (obj, global) { - this.atime = obj.atime || null - this.charset = obj.charset || null - this.comment = obj.comment || null - this.ctime = obj.ctime || null - this.gid = obj.gid || null - this.gname = obj.gname || null - this.linkpath = obj.linkpath || null - this.mtime = obj.mtime || null - this.path = obj.path || null - this.size = obj.size || null - this.uid = obj.uid || null - this.uname = obj.uname || null - this.dev = obj.dev || null - this.ino = obj.ino || null - this.nlink = obj.nlink || null - this.global = global || false - } +Object.defineProperty(exports, '__esModule', { value: true }); - encode () { - const body = this.encodeBody() - if (body === '') - return null +/*! + * is-plain-object + * + * Copyright (c) 2014-2017, Jon Schlinkert. + * Released under the MIT License. + */ - const bodyLen = Buffer.byteLength(body) - // round up to 512 bytes - // add 512 for header - const bufLen = 512 * Math.ceil(1 + bodyLen / 512) - const buf = Buffer.allocUnsafe(bufLen) +function isObject(o) { + return Object.prototype.toString.call(o) === '[object Object]'; +} - // 0-fill the header section, it might not hit every field - for (let i = 0; i < 512; i++) { - buf[i] = 0 - } +function isPlainObject(o) { + var ctor,prot; - new Header({ - // XXX split the path - // then the path should be PaxHeader + basename, but less than 99, - // prepend with the dirname - path: ('PaxHeader/' + path.basename(this.path)).slice(0, 99), - mode: this.mode || 0o644, - uid: this.uid || null, - gid: this.gid || null, - size: bodyLen, - mtime: this.mtime || null, - type: this.global ? 'GlobalExtendedHeader' : 'ExtendedHeader', - linkpath: '', - uname: this.uname || '', - gname: this.gname || '', - devmaj: 0, - devmin: 0, - atime: this.atime || null, - ctime: this.ctime || null - }).encode(buf) + if (isObject(o) === false) return false; - buf.write(body, 512, bodyLen, 'utf8') + // If has modified constructor + ctor = o.constructor; + if (ctor === undefined) return true; - // null pad after the body - for (let i = bodyLen + 512; i < buf.length; i++) { - buf[i] = 0 - } + // If has modified prototype + prot = ctor.prototype; + if (isObject(prot) === false) return false; - return buf + // If constructor does not have an Object-specific method + if (prot.hasOwnProperty('isPrototypeOf') === false) { + return false; } - encodeBody () { - return ( - this.encodeField('path') + - this.encodeField('ctime') + - this.encodeField('atime') + - this.encodeField('dev') + - this.encodeField('ino') + - this.encodeField('nlink') + - this.encodeField('charset') + - this.encodeField('comment') + - this.encodeField('gid') + - this.encodeField('gname') + - this.encodeField('linkpath') + - this.encodeField('mtime') + - this.encodeField('size') + - this.encodeField('uid') + - this.encodeField('uname') - ) - } - - encodeField (field) { - if (this[field] === null || this[field] === undefined) - return '' - const v = this[field] instanceof Date ? this[field].getTime() / 1000 - : this[field] - const s = ' ' + - (field === 'dev' || field === 'ino' || field === 'nlink' - ? 'SCHILY.' : '') + - field + '=' + v + '\n' - const byteLen = Buffer.byteLength(s) - // the digits includes the length of the digits in ascii base-10 - // so if it's 9 characters, then adding 1 for the 9 makes it 10 - // which makes it 11 chars. - let digits = Math.floor(Math.log(byteLen) / Math.log(10)) + 1 - if (byteLen + digits >= Math.pow(10, digits)) - digits += 1 - const len = digits + byteLen - return len + s - } + // Most likely a plain Object + return true; } -Pax.parse = (string, ex, g) => new Pax(merge(parseKV(string), ex), g) +exports.isPlainObject = isPlainObject; -const merge = (a, b) => - b ? Object.keys(a).reduce((s, k) => (s[k] = a[k], s), b) : a -const parseKV = string => - string - .replace(/\n$/, '') - .split('\n') - .reduce(parseKVLine, Object.create(null)) +/***/ }), -const parseKVLine = (set, line) => { - const n = parseInt(line, 10) +/***/ 720: +/***/ (function(module, __unusedexports, __webpack_require__) { - // XXX Values with \n in them will fail this. - // Refactor to not be a naive line-by-line parse. - if (n !== Buffer.byteLength(line) + 1) - return set +"use strict"; - line = line.substr((n + ' ').length) - const kv = line.split('=') - const k = kv.shift().replace(/^SCHILY\.(dev|ino|nlink)/, '$1') - if (!k) - return set +const EE = __webpack_require__(614) +const Stream = __webpack_require__(413) +const Yallist = __webpack_require__(612) +const SD = __webpack_require__(304).StringDecoder - const v = kv.join('=') - set[k] = /^([A-Z]+\.)?([mac]|birth|creation)time$/.test(k) - ? new Date(v * 1000) - : /^[0-9]+$/.test(v) ? +v - : v - return set -} +const EOF = Symbol('EOF') +const MAYBE_EMIT_END = Symbol('maybeEmitEnd') +const EMITTED_END = Symbol('emittedEnd') +const EMITTING_END = Symbol('emittingEnd') +const CLOSED = Symbol('closed') +const READ = Symbol('read') +const FLUSH = Symbol('flush') +const FLUSHCHUNK = Symbol('flushChunk') +const ENCODING = Symbol('encoding') +const DECODER = Symbol('decoder') +const FLOWING = Symbol('flowing') +const PAUSED = Symbol('paused') +const RESUME = Symbol('resume') +const BUFFERLENGTH = Symbol('bufferLength') +const BUFFERPUSH = Symbol('bufferPush') +const BUFFERSHIFT = Symbol('bufferShift') +const OBJECTMODE = Symbol('objectMode') +const DESTROYED = Symbol('destroyed') -module.exports = Pax +// TODO remove when Node v8 support drops +const doIter = global._MP_NO_ITERATOR_SYMBOLS_ !== '1' +const ASYNCITERATOR = doIter && Symbol.asyncIterator + || Symbol('asyncIterator not implemented') +const ITERATOR = doIter && Symbol.iterator + || Symbol('iterator not implemented') +// events that mean 'the stream is over' +// these are treated specially, and re-emitted +// if they are listened for after emitting. +const isEndish = ev => + ev === 'end' || + ev === 'finish' || + ev === 'prefinish' -/***/ }), +const isArrayBuffer = b => b instanceof ArrayBuffer || + typeof b === 'object' && + b.constructor && + b.constructor.name === 'ArrayBuffer' && + b.byteLength >= 0 -/***/ 605: -/***/ (function(module) { +const isArrayBufferView = b => !Buffer.isBuffer(b) && ArrayBuffer.isView(b) -module.exports = require("http"); +module.exports = class Minipass extends Stream { + constructor (options) { + super() + this[FLOWING] = false + // whether we're explicitly paused + this[PAUSED] = false + this.pipes = new Yallist() + this.buffer = new Yallist() + this[OBJECTMODE] = options && options.objectMode || false + if (this[OBJECTMODE]) + this[ENCODING] = null + else + this[ENCODING] = options && options.encoding || null + if (this[ENCODING] === 'buffer') + this[ENCODING] = null + this[DECODER] = this[ENCODING] ? new SD(this[ENCODING]) : null + this[EOF] = false + this[EMITTED_END] = false + this[EMITTING_END] = false + this[CLOSED] = false + this.writable = true + this.readable = true + this[BUFFERLENGTH] = 0 + this[DESTROYED] = false + } -/***/ }), + get bufferLength () { return this[BUFFERLENGTH] } -/***/ 612: -/***/ (function(module, __unusedexports, __webpack_require__) { + get encoding () { return this[ENCODING] } + set encoding (enc) { + if (this[OBJECTMODE]) + throw new Error('cannot set encoding in objectMode') -"use strict"; + if (this[ENCODING] && enc !== this[ENCODING] && + (this[DECODER] && this[DECODER].lastNeed || this[BUFFERLENGTH])) + throw new Error('cannot change encoding') -module.exports = Yallist + if (this[ENCODING] !== enc) { + this[DECODER] = enc ? new SD(enc) : null + if (this.buffer.length) + this.buffer = this.buffer.map(chunk => this[DECODER].write(chunk)) + } -Yallist.Node = Node -Yallist.create = Yallist + this[ENCODING] = enc + } -function Yallist (list) { - var self = this - if (!(self instanceof Yallist)) { - self = new Yallist() + setEncoding (enc) { + this.encoding = enc } - self.tail = null - self.head = null - self.length = 0 + get objectMode () { return this[OBJECTMODE] } + set objectMode (om) { this[OBJECTMODE] = this[OBJECTMODE] || !!om } - if (list && typeof list.forEach === 'function') { - list.forEach(function (item) { - self.push(item) - }) - } else if (arguments.length > 0) { - for (var i = 0, l = arguments.length; i < l; i++) { - self.push(arguments[i]) + write (chunk, encoding, cb) { + if (this[EOF]) + throw new Error('write after end') + + if (this[DESTROYED]) { + this.emit('error', Object.assign( + new Error('Cannot call write after a stream was destroyed'), + { code: 'ERR_STREAM_DESTROYED' } + )) + return true } - } - return self -} + if (typeof encoding === 'function') + cb = encoding, encoding = 'utf8' -Yallist.prototype.removeNode = function (node) { - if (node.list !== this) { - throw new Error('removing node which does not belong to this list') - } + if (!encoding) + encoding = 'utf8' - var next = node.next - var prev = node.prev + // convert array buffers and typed array views into buffers + // at some point in the future, we may want to do the opposite! + // leave strings and buffers as-is + // anything else switches us into object mode + if (!this[OBJECTMODE] && !Buffer.isBuffer(chunk)) { + if (isArrayBufferView(chunk)) + chunk = Buffer.from(chunk.buffer, chunk.byteOffset, chunk.byteLength) + else if (isArrayBuffer(chunk)) + chunk = Buffer.from(chunk) + else if (typeof chunk !== 'string') + // use the setter so we throw if we have encoding set + this.objectMode = true + } - if (next) { - next.prev = prev - } + // this ensures at this point that the chunk is a buffer or string + // don't buffer it up or send it to the decoder + if (!this.objectMode && !chunk.length) { + if (this[BUFFERLENGTH] !== 0) + this.emit('readable') + if (cb) + cb() + return this.flowing + } - if (prev) { - prev.next = next - } + // fast-path writing strings of same encoding to a stream with + // an empty buffer, skipping the buffer/decoder dance + if (typeof chunk === 'string' && !this[OBJECTMODE] && + // unless it is a string already ready for us to use + !(encoding === this[ENCODING] && !this[DECODER].lastNeed)) { + chunk = Buffer.from(chunk, encoding) + } - if (node === this.head) { - this.head = next - } - if (node === this.tail) { - this.tail = prev - } + if (Buffer.isBuffer(chunk) && this[ENCODING]) + chunk = this[DECODER].write(chunk) - node.list.length-- - node.next = null - node.prev = null - node.list = null + if (this.flowing) { + // if we somehow have something in the buffer, but we think we're + // flowing, then we need to flush all that out first, or we get + // chunks coming in out of order. Can't emit 'drain' here though, + // because we're mid-write, so that'd be bad. + if (this[BUFFERLENGTH] !== 0) + this[FLUSH](true) + this.emit('data', chunk) + } else + this[BUFFERPUSH](chunk) - return next -} + if (this[BUFFERLENGTH] !== 0) + this.emit('readable') -Yallist.prototype.unshiftNode = function (node) { - if (node === this.head) { - return - } - - if (node.list) { - node.list.removeNode(node) - } - - var head = this.head - node.list = this - node.next = head - if (head) { - head.prev = node - } - - this.head = node - if (!this.tail) { - this.tail = node - } - this.length++ -} - -Yallist.prototype.pushNode = function (node) { - if (node === this.tail) { - return - } - - if (node.list) { - node.list.removeNode(node) - } - - var tail = this.tail - node.list = this - node.prev = tail - if (tail) { - tail.next = node - } - - this.tail = node - if (!this.head) { - this.head = node - } - this.length++ -} - -Yallist.prototype.push = function () { - for (var i = 0, l = arguments.length; i < l; i++) { - push(this, arguments[i]) - } - return this.length -} - -Yallist.prototype.unshift = function () { - for (var i = 0, l = arguments.length; i < l; i++) { - unshift(this, arguments[i]) - } - return this.length -} - -Yallist.prototype.pop = function () { - if (!this.tail) { - return undefined - } - - var res = this.tail.value - this.tail = this.tail.prev - if (this.tail) { - this.tail.next = null - } else { - this.head = null - } - this.length-- - return res -} + if (cb) + cb() -Yallist.prototype.shift = function () { - if (!this.head) { - return undefined + return this.flowing } - var res = this.head.value - this.head = this.head.next - if (this.head) { - this.head.prev = null - } else { - this.tail = null - } - this.length-- - return res -} + read (n) { + if (this[DESTROYED]) + return null -Yallist.prototype.forEach = function (fn, thisp) { - thisp = thisp || this - for (var walker = this.head, i = 0; walker !== null; i++) { - fn.call(thisp, walker.value, i, this) - walker = walker.next - } -} + try { + if (this[BUFFERLENGTH] === 0 || n === 0 || n > this[BUFFERLENGTH]) + return null -Yallist.prototype.forEachReverse = function (fn, thisp) { - thisp = thisp || this - for (var walker = this.tail, i = this.length - 1; walker !== null; i--) { - fn.call(thisp, walker.value, i, this) - walker = walker.prev - } -} + if (this[OBJECTMODE]) + n = null -Yallist.prototype.get = function (n) { - for (var i = 0, walker = this.head; walker !== null && i < n; i++) { - // abort out of the list early if we hit a cycle - walker = walker.next - } - if (i === n && walker !== null) { - return walker.value - } -} + if (this.buffer.length > 1 && !this[OBJECTMODE]) { + if (this.encoding) + this.buffer = new Yallist([ + Array.from(this.buffer).join('') + ]) + else + this.buffer = new Yallist([ + Buffer.concat(Array.from(this.buffer), this[BUFFERLENGTH]) + ]) + } -Yallist.prototype.getReverse = function (n) { - for (var i = 0, walker = this.tail; walker !== null && i < n; i++) { - // abort out of the list early if we hit a cycle - walker = walker.prev - } - if (i === n && walker !== null) { - return walker.value + return this[READ](n || null, this.buffer.head.value) + } finally { + this[MAYBE_EMIT_END]() + } } -} -Yallist.prototype.map = function (fn, thisp) { - thisp = thisp || this - var res = new Yallist() - for (var walker = this.head; walker !== null;) { - res.push(fn.call(thisp, walker.value, this)) - walker = walker.next - } - return res -} + [READ] (n, chunk) { + if (n === chunk.length || n === null) + this[BUFFERSHIFT]() + else { + this.buffer.head.value = chunk.slice(n) + chunk = chunk.slice(0, n) + this[BUFFERLENGTH] -= n + } -Yallist.prototype.mapReverse = function (fn, thisp) { - thisp = thisp || this - var res = new Yallist() - for (var walker = this.tail; walker !== null;) { - res.push(fn.call(thisp, walker.value, this)) - walker = walker.prev - } - return res -} + this.emit('data', chunk) -Yallist.prototype.reduce = function (fn, initial) { - var acc - var walker = this.head - if (arguments.length > 1) { - acc = initial - } else if (this.head) { - walker = this.head.next - acc = this.head.value - } else { - throw new TypeError('Reduce of empty list with no initial value') - } + if (!this.buffer.length && !this[EOF]) + this.emit('drain') - for (var i = 0; walker !== null; i++) { - acc = fn(acc, walker.value, i) - walker = walker.next + return chunk } - return acc -} - -Yallist.prototype.reduceReverse = function (fn, initial) { - var acc - var walker = this.tail - if (arguments.length > 1) { - acc = initial - } else if (this.tail) { - walker = this.tail.prev - acc = this.tail.value - } else { - throw new TypeError('Reduce of empty list with no initial value') - } + end (chunk, encoding, cb) { + if (typeof chunk === 'function') + cb = chunk, chunk = null + if (typeof encoding === 'function') + cb = encoding, encoding = 'utf8' + if (chunk) + this.write(chunk, encoding) + if (cb) + this.once('end', cb) + this[EOF] = true + this.writable = false - for (var i = this.length - 1; walker !== null; i--) { - acc = fn(acc, walker.value, i) - walker = walker.prev + // if we haven't written anything, then go ahead and emit, + // even if we're not reading. + // we'll re-emit if a new 'end' listener is added anyway. + // This makes MP more suitable to write-only use cases. + if (this.flowing || !this[PAUSED]) + this[MAYBE_EMIT_END]() + return this } - return acc -} + // don't let the internal resume be overwritten + [RESUME] () { + if (this[DESTROYED]) + return -Yallist.prototype.toArray = function () { - var arr = new Array(this.length) - for (var i = 0, walker = this.head; walker !== null; i++) { - arr[i] = walker.value - walker = walker.next + this[PAUSED] = false + this[FLOWING] = true + this.emit('resume') + if (this.buffer.length) + this[FLUSH]() + else if (this[EOF]) + this[MAYBE_EMIT_END]() + else + this.emit('drain') } - return arr -} -Yallist.prototype.toArrayReverse = function () { - var arr = new Array(this.length) - for (var i = 0, walker = this.tail; walker !== null; i++) { - arr[i] = walker.value - walker = walker.prev + resume () { + return this[RESUME]() } - return arr -} -Yallist.prototype.slice = function (from, to) { - to = to || this.length - if (to < 0) { - to += this.length - } - from = from || 0 - if (from < 0) { - from += this.length - } - var ret = new Yallist() - if (to < from || to < 0) { - return ret - } - if (from < 0) { - from = 0 - } - if (to > this.length) { - to = this.length - } - for (var i = 0, walker = this.head; walker !== null && i < from; i++) { - walker = walker.next - } - for (; walker !== null && i < to; i++, walker = walker.next) { - ret.push(walker.value) - } - return ret -} - -Yallist.prototype.sliceReverse = function (from, to) { - to = to || this.length - if (to < 0) { - to += this.length - } - from = from || 0 - if (from < 0) { - from += this.length - } - var ret = new Yallist() - if (to < from || to < 0) { - return ret - } - if (from < 0) { - from = 0 - } - if (to > this.length) { - to = this.length - } - for (var i = this.length, walker = this.tail; walker !== null && i > to; i--) { - walker = walker.prev - } - for (; walker !== null && i > from; i--, walker = walker.prev) { - ret.push(walker.value) - } - return ret -} - -Yallist.prototype.splice = function (start, deleteCount, ...nodes) { - if (start > this.length) { - start = this.length - 1 - } - if (start < 0) { - start = this.length + start; - } - - for (var i = 0, walker = this.head; walker !== null && i < start; i++) { - walker = walker.next - } - - var ret = [] - for (var i = 0; walker && i < deleteCount; i++) { - ret.push(walker.value) - walker = this.removeNode(walker) - } - if (walker === null) { - walker = this.tail - } - - if (walker !== this.head && walker !== this.tail) { - walker = walker.prev - } - - for (var i = 0; i < nodes.length; i++) { - walker = insert(this, walker, nodes[i]) - } - return ret; -} - -Yallist.prototype.reverse = function () { - var head = this.head - var tail = this.tail - for (var walker = head; walker !== null; walker = walker.prev) { - var p = walker.prev - walker.prev = walker.next - walker.next = p - } - this.head = tail - this.tail = head - return this -} - -function insert (self, node, value) { - var inserted = node === self.head ? - new Node(value, null, node, self) : - new Node(value, node, node.next, self) - - if (inserted.next === null) { - self.tail = inserted - } - if (inserted.prev === null) { - self.head = inserted - } - - self.length++ - - return inserted -} - -function push (self, item) { - self.tail = new Node(item, self.tail, null, self) - if (!self.head) { - self.head = self.tail - } - self.length++ -} - -function unshift (self, item) { - self.head = new Node(item, null, self.head, self) - if (!self.tail) { - self.tail = self.head - } - self.length++ -} - -function Node (value, prev, next, list) { - if (!(this instanceof Node)) { - return new Node(value, prev, next, list) - } - - this.list = list - this.value = value - - if (prev) { - prev.next = this - this.prev = prev - } else { - this.prev = null - } - - if (next) { - next.prev = this - this.next = next - } else { - this.next = null - } -} - -try { - // add if support for Symbol.iterator is present - __webpack_require__(396)(Yallist) -} catch (er) {} - - -/***/ }), - -/***/ 614: -/***/ (function(module) { - -module.exports = require("events"); - -/***/ }), - -/***/ 621: -/***/ (function(module, __unusedexports, __webpack_require__) { - -"use strict"; - -const path = __webpack_require__(622); -const pathKey = __webpack_require__(39); - -module.exports = opts => { - opts = Object.assign({ - cwd: process.cwd(), - path: process.env[pathKey()] - }, opts); - - let prev; - let pth = path.resolve(opts.cwd); - const ret = []; - - while (prev !== pth) { - ret.push(path.join(pth, 'node_modules/.bin')); - prev = pth; - pth = path.resolve(pth, '..'); - } - - // ensure the running `node` binary is used - ret.push(path.dirname(process.execPath)); - - return ret.concat(opts.path).join(path.delimiter); -}; - -module.exports.env = opts => { - opts = Object.assign({ - env: process.env - }, opts); - - const env = Object.assign({}, opts.env); - const path = pathKey({env}); - - opts.path = env[path]; - env[path] = module.exports(opts); - - return env; -}; - - -/***/ }), - -/***/ 622: -/***/ (function(module) { - -module.exports = require("path"); - -/***/ }), - -/***/ 626: -/***/ (function(module, __unusedexports, __webpack_require__) { - -var path = __webpack_require__(622); -var fs = __webpack_require__(747); -var _0777 = parseInt('0777', 8); - -module.exports = mkdirP.mkdirp = mkdirP.mkdirP = mkdirP; - -function mkdirP (p, opts, f, made) { - if (typeof opts === 'function') { - f = opts; - opts = {}; - } - else if (!opts || typeof opts !== 'object') { - opts = { mode: opts }; - } - - var mode = opts.mode; - var xfs = opts.fs || fs; - - if (mode === undefined) { - mode = _0777 & (~process.umask()); - } - if (!made) made = null; - - var cb = f || function () {}; - p = path.resolve(p); - - xfs.mkdir(p, mode, function (er) { - if (!er) { - made = made || p; - return cb(null, made); - } - switch (er.code) { - case 'ENOENT': - mkdirP(path.dirname(p), opts, function (er, made) { - if (er) cb(er, made); - else mkdirP(p, opts, cb, made); - }); - break; - - // In the case of any other error, just see if there's a dir - // there already. If so, then hooray! If not, then something - // is borked. - default: - xfs.stat(p, function (er2, stat) { - // if the stat fails, then that's super weird. - // let the original error be the failure reason. - if (er2 || !stat.isDirectory()) cb(er, made) - else cb(null, made); - }); - break; - } - }); -} - -mkdirP.sync = function sync (p, opts, made) { - if (!opts || typeof opts !== 'object') { - opts = { mode: opts }; - } - - var mode = opts.mode; - var xfs = opts.fs || fs; - - if (mode === undefined) { - mode = _0777 & (~process.umask()); - } - if (!made) made = null; - - p = path.resolve(p); - - try { - xfs.mkdirSync(p, mode); - made = made || p; - } - catch (err0) { - switch (err0.code) { - case 'ENOENT' : - made = sync(path.dirname(p), opts, made); - sync(p, opts, made); - break; - - // In the case of any other error, just see if there's a dir - // there already. If so, then hooray! If not, then something - // is borked. - default: - var stat; - try { - stat = xfs.statSync(p); - } - catch (err1) { - throw err0; - } - if (!stat.isDirectory()) throw err0; - break; - } - } - - return made; -}; - - -/***/ }), - -/***/ 630: -/***/ (function(module, __unusedexports, __webpack_require__) { - -"use strict"; - - -// tar -r -const hlo = __webpack_require__(891) -const Pack = __webpack_require__(726) -const Parse = __webpack_require__(203) -const fs = __webpack_require__(747) -const fsm = __webpack_require__(827) -const t = __webpack_require__(381) -const path = __webpack_require__(622) - -// starting at the head of the file, read a Header -// If the checksum is invalid, that's our position to start writing -// If it is, jump forward by the specified size (round up to 512) -// and try again. -// Write the new Pack stream starting there. - -const Header = __webpack_require__(232) - -const r = module.exports = (opt_, files, cb) => { - const opt = hlo(opt_) - - if (!opt.file) - throw new TypeError('file is required') - - if (opt.gzip) - throw new TypeError('cannot append to compressed archives') - - if (!files || !Array.isArray(files) || !files.length) - throw new TypeError('no files or directories specified') - - files = Array.from(files) - - return opt.sync ? replaceSync(opt, files) - : replace(opt, files, cb) -} - -const replaceSync = (opt, files) => { - const p = new Pack.Sync(opt) - - let threw = true - let fd - let position - - try { - try { - fd = fs.openSync(opt.file, 'r+') - } catch (er) { - if (er.code === 'ENOENT') - fd = fs.openSync(opt.file, 'w+') - else - throw er - } - - const st = fs.fstatSync(fd) - const headBuf = Buffer.alloc(512) - - POSITION: for (position = 0; position < st.size; position += 512) { - for (let bufPos = 0, bytes = 0; bufPos < 512; bufPos += bytes) { - bytes = fs.readSync( - fd, headBuf, bufPos, headBuf.length - bufPos, position + bufPos - ) - - if (position === 0 && headBuf[0] === 0x1f && headBuf[1] === 0x8b) - throw new Error('cannot append to compressed archives') - - if (!bytes) - break POSITION - } - - let h = new Header(headBuf) - if (!h.cksumValid) - break - let entryBlockSize = 512 * Math.ceil(h.size / 512) - if (position + entryBlockSize + 512 > st.size) - break - // the 512 for the header we just parsed will be added as well - // also jump ahead all the blocks for the body - position += entryBlockSize - if (opt.mtimeCache) - opt.mtimeCache.set(h.path, h.mtime) - } - threw = false - - streamSync(opt, p, position, fd, files) - } finally { - if (threw) - try { fs.closeSync(fd) } catch (er) {} - } -} - -const streamSync = (opt, p, position, fd, files) => { - const stream = new fsm.WriteStreamSync(opt.file, { - fd: fd, - start: position - }) - p.pipe(stream) - addFilesSync(p, files) -} - -const replace = (opt, files, cb) => { - files = Array.from(files) - const p = new Pack(opt) - - const getPos = (fd, size, cb_) => { - const cb = (er, pos) => { - if (er) - fs.close(fd, _ => cb_(er)) - else - cb_(null, pos) - } - - let position = 0 - if (size === 0) - return cb(null, 0) - - let bufPos = 0 - const headBuf = Buffer.alloc(512) - const onread = (er, bytes) => { - if (er) - return cb(er) - bufPos += bytes - if (bufPos < 512 && bytes) - return fs.read( - fd, headBuf, bufPos, headBuf.length - bufPos, - position + bufPos, onread - ) - - if (position === 0 && headBuf[0] === 0x1f && headBuf[1] === 0x8b) - return cb(new Error('cannot append to compressed archives')) - - // truncated header - if (bufPos < 512) - return cb(null, position) - - const h = new Header(headBuf) - if (!h.cksumValid) - return cb(null, position) - - const entryBlockSize = 512 * Math.ceil(h.size / 512) - if (position + entryBlockSize + 512 > size) - return cb(null, position) - - position += entryBlockSize + 512 - if (position >= size) - return cb(null, position) - - if (opt.mtimeCache) - opt.mtimeCache.set(h.path, h.mtime) - bufPos = 0 - fs.read(fd, headBuf, 0, 512, position, onread) - } - fs.read(fd, headBuf, 0, 512, position, onread) - } - - const promise = new Promise((resolve, reject) => { - p.on('error', reject) - let flag = 'r+' - const onopen = (er, fd) => { - if (er && er.code === 'ENOENT' && flag === 'r+') { - flag = 'w+' - return fs.open(opt.file, flag, onopen) - } - - if (er) - return reject(er) - - fs.fstat(fd, (er, st) => { - if (er) - return reject(er) - getPos(fd, st.size, (er, position) => { - if (er) - return reject(er) - const stream = new fsm.WriteStream(opt.file, { - fd: fd, - start: position - }) - p.pipe(stream) - stream.on('error', reject) - stream.on('close', resolve) - addFilesAsync(p, files) - }) - }) - } - fs.open(opt.file, flag, onopen) - }) - - return cb ? promise.then(cb, cb) : promise -} - -const addFilesSync = (p, files) => { - files.forEach(file => { - if (file.charAt(0) === '@') - t({ - file: path.resolve(p.cwd, file.substr(1)), - sync: true, - noResume: true, - onentry: entry => p.add(entry) - }) - else - p.add(file) - }) - p.end() -} - -const addFilesAsync = (p, files) => { - while (files.length) { - const file = files.shift() - if (file.charAt(0) === '@') - return t({ - file: path.resolve(p.cwd, file.substr(1)), - noResume: true, - onentry: entry => p.add(entry) - }).then(_ => addFilesAsync(p, files)) - else - p.add(file) - } - p.end() -} - - -/***/ }), - -/***/ 649: -/***/ (function(module, __unusedexports, __webpack_require__) { - -module.exports = getLastPage - -const getPage = __webpack_require__(265) - -function getLastPage (octokit, link, headers) { - return getPage(octokit, link, 'last', headers) -} - - -/***/ }), - -/***/ 650: -/***/ (function(module, __unusedexports, __webpack_require__) { - -module.exports = getUserAgentNode - -const osName = __webpack_require__(2) - -function getUserAgentNode () { - try { - return `Node.js/${process.version.substr(1)} (${osName()}; ${process.arch})` - } catch (error) { - if (/wmic os get Caption/.test(error.message)) { - return 'Windows ' - } - - throw error - } -} - - -/***/ }), - -/***/ 654: -/***/ (function(module) { - -// This is not the set of all possible signals. -// -// It IS, however, the set of all signals that trigger -// an exit on either Linux or BSD systems. Linux is a -// superset of the signal names supported on BSD, and -// the unknown signals just fail to register, so we can -// catch that easily enough. -// -// Don't bother with SIGKILL. It's uncatchable, which -// means that we can't fire any callbacks anyway. -// -// If a user does happen to register a handler on a non- -// fatal signal like SIGWINCH or something, and then -// exit, it'll end up firing `process.emit('exit')`, so -// the handler will be fired anyway. -// -// SIGBUS, SIGFPE, SIGSEGV and SIGILL, when not raised -// artificially, inherently leave the process in a -// state from which it is not safe to try and enter JS -// listeners. -module.exports = [ - 'SIGABRT', - 'SIGALRM', - 'SIGHUP', - 'SIGINT', - 'SIGTERM' -] - -if (process.platform !== 'win32') { - module.exports.push( - 'SIGVTALRM', - 'SIGXCPU', - 'SIGXFSZ', - 'SIGUSR2', - 'SIGTRAP', - 'SIGSYS', - 'SIGQUIT', - 'SIGIOT' - // should detect profiler and enable/disable accordingly. - // see #21 - // 'SIGPROF' - ) -} - -if (process.platform === 'linux') { - module.exports.push( - 'SIGIO', - 'SIGPOLL', - 'SIGPWR', - 'SIGSTKFLT', - 'SIGUNUSED' - ) -} - - -/***/ }), - -/***/ 656: -/***/ (function(module, __unusedexports, __webpack_require__) { - -"use strict"; - - -// tar -x -const hlo = __webpack_require__(891) -const Unpack = __webpack_require__(63) -const fs = __webpack_require__(747) -const fsm = __webpack_require__(827) -const path = __webpack_require__(622) - -const x = module.exports = (opt_, files, cb) => { - if (typeof opt_ === 'function') - cb = opt_, files = null, opt_ = {} - else if (Array.isArray(opt_)) - files = opt_, opt_ = {} - - if (typeof files === 'function') - cb = files, files = null - - if (!files) - files = [] - else - files = Array.from(files) - - const opt = hlo(opt_) - - if (opt.sync && typeof cb === 'function') - throw new TypeError('callback not supported for sync tar functions') - - if (!opt.file && typeof cb === 'function') - throw new TypeError('callback only supported with file option') - - if (files.length) - filesFilter(opt, files) - - return opt.file && opt.sync ? extractFileSync(opt) - : opt.file ? extractFile(opt, cb) - : opt.sync ? extractSync(opt) - : extract(opt) -} - -// construct a filter that limits the file entries listed -// include child entries if a dir is included -const filesFilter = (opt, files) => { - const map = new Map(files.map(f => [f.replace(/\/+$/, ''), true])) - const filter = opt.filter - - const mapHas = (file, r) => { - const root = r || path.parse(file).root || '.' - const ret = file === root ? false - : map.has(file) ? map.get(file) - : mapHas(path.dirname(file), root) - - map.set(file, ret) - return ret - } - - opt.filter = filter - ? (file, entry) => filter(file, entry) && mapHas(file.replace(/\/+$/, '')) - : file => mapHas(file.replace(/\/+$/, '')) -} - -const extractFileSync = opt => { - const u = new Unpack.Sync(opt) - - const file = opt.file - let threw = true - let fd - const stat = fs.statSync(file) - // This trades a zero-byte read() syscall for a stat - // However, it will usually result in less memory allocation - const readSize = opt.maxReadSize || 16*1024*1024 - const stream = new fsm.ReadStreamSync(file, { - readSize: readSize, - size: stat.size - }) - stream.pipe(u) -} - -const extractFile = (opt, cb) => { - const u = new Unpack(opt) - const readSize = opt.maxReadSize || 16*1024*1024 - - const file = opt.file - const p = new Promise((resolve, reject) => { - u.on('error', reject) - u.on('close', resolve) - - // This trades a zero-byte read() syscall for a stat - // However, it will usually result in less memory allocation - fs.stat(file, (er, stat) => { - if (er) - reject(er) - else { - const stream = new fsm.ReadStream(file, { - readSize: readSize, - size: stat.size - }) - stream.on('error', reject) - stream.pipe(u) - } - }) - }) - return cb ? p.then(cb, cb) : p -} - -const extractSync = opt => { - return new Unpack.Sync(opt) -} - -const extract = opt => { - return new Unpack(opt) -} - - -/***/ }), - -/***/ 662: -/***/ (function(module, __unusedexports, __webpack_require__) { - -"use strict"; - -const types = __webpack_require__(554) -const MiniPass = __webpack_require__(720) - -const SLURP = Symbol('slurp') -module.exports = class ReadEntry extends MiniPass { - constructor (header, ex, gex) { - super() - // read entries always start life paused. this is to avoid the - // situation where Minipass's auto-ending empty streams results - // in an entry ending before we're ready for it. - this.pause() - this.extended = ex - this.globalExtended = gex - this.header = header - this.startBlockSize = 512 * Math.ceil(header.size / 512) - this.blockRemain = this.startBlockSize - this.remain = header.size - this.type = header.type - this.meta = false - this.ignore = false - switch (this.type) { - case 'File': - case 'OldFile': - case 'Link': - case 'SymbolicLink': - case 'CharacterDevice': - case 'BlockDevice': - case 'Directory': - case 'FIFO': - case 'ContiguousFile': - case 'GNUDumpDir': - break - - case 'NextFileHasLongLinkpath': - case 'NextFileHasLongPath': - case 'OldGnuLongPath': - case 'GlobalExtendedHeader': - case 'ExtendedHeader': - case 'OldExtendedHeader': - this.meta = true - break - - // NOTE: gnutar and bsdtar treat unrecognized types as 'File' - // it may be worth doing the same, but with a warning. - default: - this.ignore = true - } - - this.path = header.path - this.mode = header.mode - if (this.mode) - this.mode = this.mode & 0o7777 - this.uid = header.uid - this.gid = header.gid - this.uname = header.uname - this.gname = header.gname - this.size = header.size - this.mtime = header.mtime - this.atime = header.atime - this.ctime = header.ctime - this.linkpath = header.linkpath - this.uname = header.uname - this.gname = header.gname - - if (ex) this[SLURP](ex) - if (gex) this[SLURP](gex, true) - } - - write (data) { - const writeLen = data.length - if (writeLen > this.blockRemain) - throw new Error('writing more to entry than is appropriate') - - const r = this.remain - const br = this.blockRemain - this.remain = Math.max(0, r - writeLen) - this.blockRemain = Math.max(0, br - writeLen) - if (this.ignore) - return true - - if (r >= writeLen) - return super.write(data) - - // r < writeLen - return super.write(data.slice(0, r)) - } - - [SLURP] (ex, global) { - for (let k in ex) { - // we slurp in everything except for the path attribute in - // a global extended header, because that's weird. - if (ex[k] !== null && ex[k] !== undefined && - !(global && k === 'path')) - this[k] = ex[k] - } - } -} - - -/***/ }), - -/***/ 669: -/***/ (function(module) { - -module.exports = require("util"); - -/***/ }), - -/***/ 674: -/***/ (function(module, __unusedexports, __webpack_require__) { - -module.exports = authenticate; - -const { Deprecation } = __webpack_require__(692); -const once = __webpack_require__(969); - -const deprecateAuthenticate = once((log, deprecation) => log.warn(deprecation)); - -function authenticate(state, options) { - deprecateAuthenticate( - state.octokit.log, - new Deprecation( - '[@octokit/rest] octokit.authenticate() is deprecated. Use "auth" constructor option instead.' - ) - ); - - if (!options) { - state.auth = false; - return; - } - - switch (options.type) { - case "basic": - if (!options.username || !options.password) { - throw new Error( - "Basic authentication requires both a username and password to be set" - ); - } - break; - - case "oauth": - if (!options.token && !(options.key && options.secret)) { - throw new Error( - "OAuth2 authentication requires a token or key & secret to be set" - ); - } - break; - - case "token": - case "app": - if (!options.token) { - throw new Error("Token authentication requires a token to be set"); - } - break; - - default: - throw new Error( - "Invalid authentication type, must be 'basic', 'oauth', 'token' or 'app'" - ); - } - - state.auth = options; -} - - -/***/ }), - -/***/ 675: -/***/ (function(module) { - -module.exports = function btoa(str) { - return new Buffer(str).toString('base64') -} - - -/***/ }), - -/***/ 692: -/***/ (function(__unusedmodule, exports) { - -"use strict"; - - -Object.defineProperty(exports, '__esModule', { value: true }); - -class Deprecation extends Error { - constructor(message) { - super(message); // Maintains proper stack trace (only available on V8) - - /* istanbul ignore next */ - - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = 'Deprecation'; - } - -} - -exports.Deprecation = Deprecation; - - -/***/ }), - -/***/ 697: -/***/ (function(module) { - -"use strict"; - -module.exports = (promise, onFinally) => { - onFinally = onFinally || (() => {}); - - return promise.then( - val => new Promise(resolve => { - resolve(onFinally()); - }).then(() => val), - err => new Promise(resolve => { - resolve(onFinally()); - }).then(() => { - throw err; - }) - ); -}; - - -/***/ }), - -/***/ 720: -/***/ (function(module, __unusedexports, __webpack_require__) { - -"use strict"; - -const EE = __webpack_require__(614) -const Stream = __webpack_require__(413) -const Yallist = __webpack_require__(612) -const SD = __webpack_require__(304).StringDecoder - -const EOF = Symbol('EOF') -const MAYBE_EMIT_END = Symbol('maybeEmitEnd') -const EMITTED_END = Symbol('emittedEnd') -const EMITTING_END = Symbol('emittingEnd') -const CLOSED = Symbol('closed') -const READ = Symbol('read') -const FLUSH = Symbol('flush') -const FLUSHCHUNK = Symbol('flushChunk') -const ENCODING = Symbol('encoding') -const DECODER = Symbol('decoder') -const FLOWING = Symbol('flowing') -const PAUSED = Symbol('paused') -const RESUME = Symbol('resume') -const BUFFERLENGTH = Symbol('bufferLength') -const BUFFERPUSH = Symbol('bufferPush') -const BUFFERSHIFT = Symbol('bufferShift') -const OBJECTMODE = Symbol('objectMode') -const DESTROYED = Symbol('destroyed') - -// TODO remove when Node v8 support drops -const doIter = global._MP_NO_ITERATOR_SYMBOLS_ !== '1' -const ASYNCITERATOR = doIter && Symbol.asyncIterator - || Symbol('asyncIterator not implemented') -const ITERATOR = doIter && Symbol.iterator - || Symbol('iterator not implemented') - -// events that mean 'the stream is over' -// these are treated specially, and re-emitted -// if they are listened for after emitting. -const isEndish = ev => - ev === 'end' || - ev === 'finish' || - ev === 'prefinish' - -const isArrayBuffer = b => b instanceof ArrayBuffer || - typeof b === 'object' && - b.constructor && - b.constructor.name === 'ArrayBuffer' && - b.byteLength >= 0 - -const isArrayBufferView = b => !Buffer.isBuffer(b) && ArrayBuffer.isView(b) - -module.exports = class Minipass extends Stream { - constructor (options) { - super() - this[FLOWING] = false - // whether we're explicitly paused - this[PAUSED] = false - this.pipes = new Yallist() - this.buffer = new Yallist() - this[OBJECTMODE] = options && options.objectMode || false - if (this[OBJECTMODE]) - this[ENCODING] = null - else - this[ENCODING] = options && options.encoding || null - if (this[ENCODING] === 'buffer') - this[ENCODING] = null - this[DECODER] = this[ENCODING] ? new SD(this[ENCODING]) : null - this[EOF] = false - this[EMITTED_END] = false - this[EMITTING_END] = false - this[CLOSED] = false - this.writable = true - this.readable = true - this[BUFFERLENGTH] = 0 - this[DESTROYED] = false - } - - get bufferLength () { return this[BUFFERLENGTH] } - - get encoding () { return this[ENCODING] } - set encoding (enc) { - if (this[OBJECTMODE]) - throw new Error('cannot set encoding in objectMode') - - if (this[ENCODING] && enc !== this[ENCODING] && - (this[DECODER] && this[DECODER].lastNeed || this[BUFFERLENGTH])) - throw new Error('cannot change encoding') - - if (this[ENCODING] !== enc) { - this[DECODER] = enc ? new SD(enc) : null - if (this.buffer.length) - this.buffer = this.buffer.map(chunk => this[DECODER].write(chunk)) - } - - this[ENCODING] = enc - } - - setEncoding (enc) { - this.encoding = enc - } - - get objectMode () { return this[OBJECTMODE] } - set objectMode (ॐ ) { this[OBJECTMODE] = this[OBJECTMODE] || !!ॐ } - - write (chunk, encoding, cb) { - if (this[EOF]) - throw new Error('write after end') - - if (this[DESTROYED]) { - this.emit('error', Object.assign( - new Error('Cannot call write after a stream was destroyed'), - { code: 'ERR_STREAM_DESTROYED' } - )) - return true - } - - if (typeof encoding === 'function') - cb = encoding, encoding = 'utf8' - - if (!encoding) - encoding = 'utf8' - - // convert array buffers and typed array views into buffers - // at some point in the future, we may want to do the opposite! - // leave strings and buffers as-is - // anything else switches us into object mode - if (!this[OBJECTMODE] && !Buffer.isBuffer(chunk)) { - if (isArrayBufferView(chunk)) - chunk = Buffer.from(chunk.buffer, chunk.byteOffset, chunk.byteLength) - else if (isArrayBuffer(chunk)) - chunk = Buffer.from(chunk) - else if (typeof chunk !== 'string') - // use the setter so we throw if we have encoding set - this.objectMode = true - } - - // this ensures at this point that the chunk is a buffer or string - // don't buffer it up or send it to the decoder - if (!this.objectMode && !chunk.length) { - const ret = this.flowing - if (this[BUFFERLENGTH] !== 0) - this.emit('readable') - if (cb) - cb() - return ret - } - - // fast-path writing strings of same encoding to a stream with - // an empty buffer, skipping the buffer/decoder dance - if (typeof chunk === 'string' && !this[OBJECTMODE] && - // unless it is a string already ready for us to use - !(encoding === this[ENCODING] && !this[DECODER].lastNeed)) { - chunk = Buffer.from(chunk, encoding) - } - - if (Buffer.isBuffer(chunk) && this[ENCODING]) - chunk = this[DECODER].write(chunk) - - try { - return this.flowing - ? (this.emit('data', chunk), this.flowing) - : (this[BUFFERPUSH](chunk), false) - } finally { - if (this[BUFFERLENGTH] !== 0) - this.emit('readable') - if (cb) - cb() - } - } - - read (n) { - if (this[DESTROYED]) - return null - - try { - if (this[BUFFERLENGTH] === 0 || n === 0 || n > this[BUFFERLENGTH]) - return null - - if (this[OBJECTMODE]) - n = null - - if (this.buffer.length > 1 && !this[OBJECTMODE]) { - if (this.encoding) - this.buffer = new Yallist([ - Array.from(this.buffer).join('') - ]) - else - this.buffer = new Yallist([ - Buffer.concat(Array.from(this.buffer), this[BUFFERLENGTH]) - ]) - } - - return this[READ](n || null, this.buffer.head.value) - } finally { - this[MAYBE_EMIT_END]() - } - } - - [READ] (n, chunk) { - if (n === chunk.length || n === null) - this[BUFFERSHIFT]() - else { - this.buffer.head.value = chunk.slice(n) - chunk = chunk.slice(0, n) - this[BUFFERLENGTH] -= n - } - - this.emit('data', chunk) - - if (!this.buffer.length && !this[EOF]) - this.emit('drain') - - return chunk - } - - end (chunk, encoding, cb) { - if (typeof chunk === 'function') - cb = chunk, chunk = null - if (typeof encoding === 'function') - cb = encoding, encoding = 'utf8' - if (chunk) - this.write(chunk, encoding) - if (cb) - this.once('end', cb) - this[EOF] = true - this.writable = false - - // if we haven't written anything, then go ahead and emit, - // even if we're not reading. - // we'll re-emit if a new 'end' listener is added anyway. - // This makes MP more suitable to write-only use cases. - if (this.flowing || !this[PAUSED]) - this[MAYBE_EMIT_END]() - return this - } - - // don't let the internal resume be overwritten - [RESUME] () { - if (this[DESTROYED]) - return - - this[PAUSED] = false - this[FLOWING] = true - this.emit('resume') - if (this.buffer.length) - this[FLUSH]() - else if (this[EOF]) - this[MAYBE_EMIT_END]() - else - this.emit('drain') - } - - resume () { - return this[RESUME]() - } - - pause () { - this[FLOWING] = false - this[PAUSED] = true - } - - get destroyed () { - return this[DESTROYED] - } - - get flowing () { - return this[FLOWING] - } - - get paused () { - return this[PAUSED] - } - - [BUFFERPUSH] (chunk) { - if (this[OBJECTMODE]) - this[BUFFERLENGTH] += 1 - else - this[BUFFERLENGTH] += chunk.length - return this.buffer.push(chunk) - } - - [BUFFERSHIFT] () { - if (this.buffer.length) { - if (this[OBJECTMODE]) - this[BUFFERLENGTH] -= 1 - else - this[BUFFERLENGTH] -= this.buffer.head.value.length - } - return this.buffer.shift() - } - - [FLUSH] () { - do {} while (this[FLUSHCHUNK](this[BUFFERSHIFT]())) - - if (!this.buffer.length && !this[EOF]) - this.emit('drain') - } - - [FLUSHCHUNK] (chunk) { - return chunk ? (this.emit('data', chunk), this.flowing) : false - } - - pipe (dest, opts) { - if (this[DESTROYED]) - return - - const ended = this[EMITTED_END] - opts = opts || {} - if (dest === process.stdout || dest === process.stderr) - opts.end = false - else - opts.end = opts.end !== false - - const p = { dest: dest, opts: opts, ondrain: _ => this[RESUME]() } - this.pipes.push(p) - - dest.on('drain', p.ondrain) - this[RESUME]() - // piping an ended stream ends immediately - if (ended && p.opts.end) - p.dest.end() - return dest - } - - addListener (ev, fn) { - return this.on(ev, fn) - } - - on (ev, fn) { - try { - return super.on(ev, fn) - } finally { - if (ev === 'data' && !this.pipes.length && !this.flowing) - this[RESUME]() - else if (isEndish(ev) && this[EMITTED_END]) { - super.emit(ev) - this.removeAllListeners(ev) - } - } - } - - get emittedEnd () { - return this[EMITTED_END] - } - - [MAYBE_EMIT_END] () { - if (!this[EMITTING_END] && - !this[EMITTED_END] && - !this[DESTROYED] && - this.buffer.length === 0 && - this[EOF]) { - this[EMITTING_END] = true - this.emit('end') - this.emit('prefinish') - this.emit('finish') - if (this[CLOSED]) - this.emit('close') - this[EMITTING_END] = false - } - } - - emit (ev, data) { - // error and close are only events allowed after calling destroy() - if (ev !== 'error' && ev !== 'close' && ev !== DESTROYED && this[DESTROYED]) - return - else if (ev === 'data') { - if (!data) - return - - if (this.pipes.length) - this.pipes.forEach(p => - p.dest.write(data) === false && this.pause()) - } else if (ev === 'end') { - // only actual end gets this treatment - if (this[EMITTED_END] === true) - return - - this[EMITTED_END] = true - this.readable = false - - if (this[DECODER]) { - data = this[DECODER].end() - if (data) { - this.pipes.forEach(p => p.dest.write(data)) - super.emit('data', data) - } - } - - this.pipes.forEach(p => { - p.dest.removeListener('drain', p.ondrain) - if (p.opts.end) - p.dest.end() - }) - } else if (ev === 'close') { - this[CLOSED] = true - // don't emit close before 'end' and 'finish' - if (!this[EMITTED_END] && !this[DESTROYED]) - return - } - - // TODO: replace with a spread operator when Node v4 support drops - const args = new Array(arguments.length) - args[0] = ev - args[1] = data - if (arguments.length > 2) { - for (let i = 2; i < arguments.length; i++) { - args[i] = arguments[i] - } - } - - try { - return super.emit.apply(this, args) - } finally { - if (!isEndish(ev)) - this[MAYBE_EMIT_END]() - else - this.removeAllListeners(ev) - } - } - - // const all = await stream.collect() - collect () { - const buf = [] - if (!this[OBJECTMODE]) - buf.dataLength = 0 - // set the promise first, in case an error is raised - // by triggering the flow here. - const p = this.promise() - this.on('data', c => { - buf.push(c) - if (!this[OBJECTMODE]) - buf.dataLength += c.length - }) - return p.then(() => buf) - } - - // const data = await stream.concat() - concat () { - return this[OBJECTMODE] - ? Promise.reject(new Error('cannot concat in objectMode')) - : this.collect().then(buf => - this[OBJECTMODE] - ? Promise.reject(new Error('cannot concat in objectMode')) - : this[ENCODING] ? buf.join('') : Buffer.concat(buf, buf.dataLength)) - } - - // stream.promise().then(() => done, er => emitted error) - promise () { - return new Promise((resolve, reject) => { - this.on(DESTROYED, () => reject(new Error('stream destroyed'))) - this.on('end', () => resolve()) - this.on('error', er => reject(er)) - }) - } - - // for await (let chunk of stream) - [ASYNCITERATOR] () { - const next = () => { - const res = this.read() - if (res !== null) - return Promise.resolve({ done: false, value: res }) - - if (this[EOF]) - return Promise.resolve({ done: true }) - - let resolve = null - let reject = null - const onerr = er => { - this.removeListener('data', ondata) - this.removeListener('end', onend) - reject(er) - } - const ondata = value => { - this.removeListener('error', onerr) - this.removeListener('end', onend) - this.pause() - resolve({ value: value, done: !!this[EOF] }) - } - const onend = () => { - this.removeListener('error', onerr) - this.removeListener('data', ondata) - resolve({ done: true }) - } - const ondestroy = () => onerr(new Error('stream destroyed')) - return new Promise((res, rej) => { - reject = rej - resolve = res - this.once(DESTROYED, ondestroy) - this.once('error', onerr) - this.once('end', onend) - this.once('data', ondata) - }) - } - - return { next } - } - - // for (let chunk of stream) - [ITERATOR] () { - const next = () => { - const value = this.read() - const done = value === null - return { value, done } - } - return { next } - } - - destroy (er) { - if (this[DESTROYED]) { - if (er) - this.emit('error', er) - else - this.emit(DESTROYED) - return this - } - - this[DESTROYED] = true - - // throw away all buffered data, it's never coming out - this.buffer = new Yallist() - this[BUFFERLENGTH] = 0 - - if (typeof this.close === 'function' && !this[CLOSED]) - this.close() - - if (er) - this.emit('error', er) - else // if no error to emit, still reject pending promises - this.emit(DESTROYED) - - return this - } - - static isStream (s) { - return !!s && (s instanceof Minipass || s instanceof Stream || - s instanceof EE && ( - typeof s.pipe === 'function' || // readable - (typeof s.write === 'function' && typeof s.end === 'function') // writable - )) - } -} - - -/***/ }), - -/***/ 726: -/***/ (function(module, __unusedexports, __webpack_require__) { - -"use strict"; - - -// A readable tar stream creator -// Technically, this is a transform stream that you write paths into, -// and tar format comes out of. -// The `add()` method is like `write()` but returns this, -// and end() return `this` as well, so you can -// do `new Pack(opt).add('files').add('dir').end().pipe(output) -// You could also do something like: -// streamOfPaths().pipe(new Pack()).pipe(new fs.WriteStream('out.tar')) - -class PackJob { - constructor (path, absolute) { - this.path = path || './' - this.absolute = absolute - this.entry = null - this.stat = null - this.readdir = null - this.pending = false - this.ignore = false - this.piped = false - } -} - -const MiniPass = __webpack_require__(720) -const zlib = __webpack_require__(133) -const ReadEntry = __webpack_require__(662) -const WriteEntry = __webpack_require__(303) -const WriteEntrySync = WriteEntry.Sync -const WriteEntryTar = WriteEntry.Tar -const Yallist = __webpack_require__(612) -const EOF = Buffer.alloc(1024) -const ONSTAT = Symbol('onStat') -const ENDED = Symbol('ended') -const QUEUE = Symbol('queue') -const CURRENT = Symbol('current') -const PROCESS = Symbol('process') -const PROCESSING = Symbol('processing') -const PROCESSJOB = Symbol('processJob') -const JOBS = Symbol('jobs') -const JOBDONE = Symbol('jobDone') -const ADDFSENTRY = Symbol('addFSEntry') -const ADDTARENTRY = Symbol('addTarEntry') -const STAT = Symbol('stat') -const READDIR = Symbol('readdir') -const ONREADDIR = Symbol('onreaddir') -const PIPE = Symbol('pipe') -const ENTRY = Symbol('entry') -const ENTRYOPT = Symbol('entryOpt') -const WRITEENTRYCLASS = Symbol('writeEntryClass') -const WRITE = Symbol('write') -const ONDRAIN = Symbol('ondrain') - -const fs = __webpack_require__(747) -const path = __webpack_require__(622) -const warner = __webpack_require__(796) - -const Pack = warner(class Pack extends MiniPass { - constructor (opt) { - super(opt) - opt = opt || Object.create(null) - this.opt = opt - this.file = opt.file || '' - this.cwd = opt.cwd || process.cwd() - this.maxReadSize = opt.maxReadSize - this.preservePaths = !!opt.preservePaths - this.strict = !!opt.strict - this.noPax = !!opt.noPax - this.prefix = (opt.prefix || '').replace(/(\\|\/)+$/, '') - this.linkCache = opt.linkCache || new Map() - this.statCache = opt.statCache || new Map() - this.readdirCache = opt.readdirCache || new Map() - - this[WRITEENTRYCLASS] = WriteEntry - if (typeof opt.onwarn === 'function') - this.on('warn', opt.onwarn) - - this.portable = !!opt.portable - this.zip = null - if (opt.gzip) { - if (typeof opt.gzip !== 'object') - opt.gzip = {} - if (this.portable) - opt.gzip.portable = true - this.zip = new zlib.Gzip(opt.gzip) - this.zip.on('data', chunk => super.write(chunk)) - this.zip.on('end', _ => super.end()) - this.zip.on('drain', _ => this[ONDRAIN]()) - this.on('resume', _ => this.zip.resume()) - } else - this.on('drain', this[ONDRAIN]) - - this.noDirRecurse = !!opt.noDirRecurse - this.follow = !!opt.follow - this.noMtime = !!opt.noMtime - this.mtime = opt.mtime || null - - this.filter = typeof opt.filter === 'function' ? opt.filter : _ => true - - this[QUEUE] = new Yallist - this[JOBS] = 0 - this.jobs = +opt.jobs || 4 - this[PROCESSING] = false - this[ENDED] = false - } - - [WRITE] (chunk) { - return super.write(chunk) - } - - add (path) { - this.write(path) - return this - } - - end (path) { - if (path) - this.write(path) - this[ENDED] = true - this[PROCESS]() - return this - } - - write (path) { - if (this[ENDED]) - throw new Error('write after end') - - if (path instanceof ReadEntry) - this[ADDTARENTRY](path) - else - this[ADDFSENTRY](path) - return this.flowing - } - - [ADDTARENTRY] (p) { - const absolute = path.resolve(this.cwd, p.path) - if (this.prefix) - p.path = this.prefix + '/' + p.path.replace(/^\.(\/+|$)/, '') - - // in this case, we don't have to wait for the stat - if (!this.filter(p.path, p)) - p.resume() - else { - const job = new PackJob(p.path, absolute, false) - job.entry = new WriteEntryTar(p, this[ENTRYOPT](job)) - job.entry.on('end', _ => this[JOBDONE](job)) - this[JOBS] += 1 - this[QUEUE].push(job) - } - - this[PROCESS]() - } - - [ADDFSENTRY] (p) { - const absolute = path.resolve(this.cwd, p) - if (this.prefix) - p = this.prefix + '/' + p.replace(/^\.(\/+|$)/, '') - - this[QUEUE].push(new PackJob(p, absolute)) - this[PROCESS]() - } - - [STAT] (job) { - job.pending = true - this[JOBS] += 1 - const stat = this.follow ? 'stat' : 'lstat' - fs[stat](job.absolute, (er, stat) => { - job.pending = false - this[JOBS] -= 1 - if (er) - this.emit('error', er) - else - this[ONSTAT](job, stat) - }) - } - - [ONSTAT] (job, stat) { - this.statCache.set(job.absolute, stat) - job.stat = stat - - // now we have the stat, we can filter it. - if (!this.filter(job.path, stat)) - job.ignore = true - - this[PROCESS]() - } - - [READDIR] (job) { - job.pending = true - this[JOBS] += 1 - fs.readdir(job.absolute, (er, entries) => { - job.pending = false - this[JOBS] -= 1 - if (er) - return this.emit('error', er) - this[ONREADDIR](job, entries) - }) - } - - [ONREADDIR] (job, entries) { - this.readdirCache.set(job.absolute, entries) - job.readdir = entries - this[PROCESS]() - } - - [PROCESS] () { - if (this[PROCESSING]) - return - - this[PROCESSING] = true - for (let w = this[QUEUE].head; - w !== null && this[JOBS] < this.jobs; - w = w.next) { - this[PROCESSJOB](w.value) - if (w.value.ignore) { - const p = w.next - this[QUEUE].removeNode(w) - w.next = p - } - } - - this[PROCESSING] = false - - if (this[ENDED] && !this[QUEUE].length && this[JOBS] === 0) { - if (this.zip) - this.zip.end(EOF) - else { - super.write(EOF) - super.end() - } - } - } - - get [CURRENT] () { - return this[QUEUE] && this[QUEUE].head && this[QUEUE].head.value - } - - [JOBDONE] (job) { - this[QUEUE].shift() - this[JOBS] -= 1 - this[PROCESS]() - } - - [PROCESSJOB] (job) { - if (job.pending) - return - - if (job.entry) { - if (job === this[CURRENT] && !job.piped) - this[PIPE](job) - return - } - - if (!job.stat) { - if (this.statCache.has(job.absolute)) - this[ONSTAT](job, this.statCache.get(job.absolute)) - else - this[STAT](job) - } - if (!job.stat) - return - - // filtered out! - if (job.ignore) - return - - if (!this.noDirRecurse && job.stat.isDirectory() && !job.readdir) { - if (this.readdirCache.has(job.absolute)) - this[ONREADDIR](job, this.readdirCache.get(job.absolute)) - else - this[READDIR](job) - if (!job.readdir) - return - } - - // we know it doesn't have an entry, because that got checked above - job.entry = this[ENTRY](job) - if (!job.entry) { - job.ignore = true - return - } - - if (job === this[CURRENT] && !job.piped) - this[PIPE](job) - } - - [ENTRYOPT] (job) { - return { - onwarn: (code, msg, data) => this.warn(code, msg, data), - noPax: this.noPax, - cwd: this.cwd, - absolute: job.absolute, - preservePaths: this.preservePaths, - maxReadSize: this.maxReadSize, - strict: this.strict, - portable: this.portable, - linkCache: this.linkCache, - statCache: this.statCache, - noMtime: this.noMtime, - mtime: this.mtime - } - } - - [ENTRY] (job) { - this[JOBS] += 1 - try { - return new this[WRITEENTRYCLASS](job.path, this[ENTRYOPT](job)) - .on('end', () => this[JOBDONE](job)) - .on('error', er => this.emit('error', er)) - } catch (er) { - this.emit('error', er) - } - } - - [ONDRAIN] () { - if (this[CURRENT] && this[CURRENT].entry) - this[CURRENT].entry.resume() - } - - // like .pipe() but using super, because our write() is special - [PIPE] (job) { - job.piped = true - - if (job.readdir) - job.readdir.forEach(entry => { - const p = this.prefix ? - job.path.slice(this.prefix.length + 1) || './' - : job.path - - const base = p === './' ? '' : p.replace(/\/*$/, '/') - this[ADDFSENTRY](base + entry) - }) - - const source = job.entry - const zip = this.zip - - if (zip) - source.on('data', chunk => { - if (!zip.write(chunk)) - source.pause() - }) - else - source.on('data', chunk => { - if (!super.write(chunk)) - source.pause() - }) - } - - pause () { - if (this.zip) - this.zip.pause() - return super.pause() - } -}) - -class PackSync extends Pack { - constructor (opt) { - super(opt) - this[WRITEENTRYCLASS] = WriteEntrySync - } - - // pause/resume are no-ops in sync streams. - pause () {} - resume () {} - - [STAT] (job) { - const stat = this.follow ? 'statSync' : 'lstatSync' - this[ONSTAT](job, fs[stat](job.absolute)) - } - - [READDIR] (job, stat) { - this[ONREADDIR](job, fs.readdirSync(job.absolute)) - } - - // gotta get it all in this tick - [PIPE] (job) { - const source = job.entry - const zip = this.zip - - if (job.readdir) - job.readdir.forEach(entry => { - const p = this.prefix ? - job.path.slice(this.prefix.length + 1) || './' - : job.path - - const base = p === './' ? '' : p.replace(/\/*$/, '/') - this[ADDFSENTRY](base + entry) - }) - - if (zip) - source.on('data', chunk => { - zip.write(chunk) - }) - else - source.on('data', chunk => { - super[WRITE](chunk) - }) - } -} - -Pack.Sync = PackSync - -module.exports = Pack - - -/***/ }), - -/***/ 737: -/***/ (function(__unusedmodule, exports, __webpack_require__) { - -"use strict"; - -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const fs_1 = __importDefault(__webpack_require__(747)); -const zlib_1 = __importDefault(__webpack_require__(761)); -const tar_1 = __importDefault(__webpack_require__(885)); -const rest_1 = __webpack_require__(0); -const node_fetch_1 = __importDefault(__webpack_require__(454)); -const child_process_1 = __webpack_require__(129); -const utils_1 = __webpack_require__(163); -class Downloader { - constructor() { - this.githubClient = new rest_1.Octokit(); - } - download(version, trivyCmdDir = __dirname) { - return __awaiter(this, void 0, void 0, function* () { - const os = this.checkPlatform(process.platform); - const downloadUrl = yield this.getDownloadUrl(version, os); - console.debug(`Download URL: ${downloadUrl}`); - const trivyCmdBaseDir = process.env.GITHUB_WORKSPACE || trivyCmdDir; - const trivyCmdPath = yield this.downloadTrivyCmd(downloadUrl, trivyCmdBaseDir); - console.debug(`Trivy Command Path: ${trivyCmdPath}`); - return trivyCmdPath; - }); - } - checkPlatform(platform) { - switch (platform) { - case 'linux': - return 'Linux'; - case 'darwin': - return 'macOS'; - default: - const errorMsg = `Sorry, ${platform} is not supported. - Trivy support Linux, MacOS, FreeBSD and OpenBSD.`; - throw new Error(errorMsg); - } - } - getDownloadUrl(version, os) { - return __awaiter(this, void 0, void 0, function* () { - try { - const response = yield this.getAssets(version); - const filename = `trivy_${response.version}_${os}-64bit.tar.gz`; - for (const asset of response.assets) { - if (asset.name === filename) { - return asset.browser_download_url; - } - } - throw new Error(); - } - catch (error) { - const errorMsg = ` - Cloud not be found a Trivy asset that you specified. - Version: ${version} - OS: ${os} - `; - throw new Error(errorMsg); - } - }); - } - getAssets(version) { - return __awaiter(this, void 0, void 0, function* () { - let response; - if (version === 'latest') { - response = yield this.githubClient.repos.getLatestRelease(Object.assign({}, Downloader.trivyRepository)); - version = response.data.tag_name.replace(/v/, ''); - } - else { - response = yield this.githubClient.repos.getReleaseByTag(Object.assign(Object.assign({}, Downloader.trivyRepository), { tag: `v${version}` })); - } - return { assets: response.data.assets, version }; - }); - } - downloadTrivyCmd(downloadUrl, savedPath = '.') { - return __awaiter(this, void 0, void 0, function* () { - const response = yield node_fetch_1.default(downloadUrl); - return new Promise((resolve, reject) => { - const gunzip = zlib_1.default.createGunzip(); - const extract = tar_1.default.extract({ C: savedPath }, ['trivy']); - response.body - .on('error', reject) - .pipe(gunzip) - .on('error', reject) - .pipe(extract) - .on('error', reject) - .on('finish', () => { - if (!this.trivyExists(savedPath)) { - reject('Failed to extract Trivy command file.'); - } - resolve(`${savedPath}/trivy`); - }); - }); - }); - } - trivyExists(targetDir) { - const trivyCmdPaths = fs_1.default - .readdirSync(targetDir) - .filter(f => f === 'trivy'); - return trivyCmdPaths.length === 1; - } -} -exports.Downloader = Downloader; -Downloader.trivyRepository = { - owner: 'aquasecurity', - repo: 'trivy', -}; -class Trivy { - scan(trivyPath, image, option) { - this.validateOption(option); - const args = [ - '--severity', - option.severity, - '--vuln-type', - option.vulnType, - '--format', - option.format, - '--quiet', - '--no-progress', - ]; - if (option.ignoreUnfixed) - args.push('--ignore-unfixed'); - args.push(image); - const result = child_process_1.spawnSync(trivyPath, args, { - encoding: 'utf-8', - }); - if (result.stdout && result.stdout.length > 0) { - const vulnerabilities = option.format === 'json' ? JSON.parse(result.stdout) : result.stdout; - if (vulnerabilities.length > 0) { - return vulnerabilities; - } - } - throw new Error(`Failed vulnerability scan using Trivy. - stdout: ${result.stdout} - stderr: ${result.stderr} - error: ${result.error} - `); - } - parse(image, vulnerabilities) { - let issueContent = ''; - for (const vuln of vulnerabilities) { - if (vuln.Vulnerabilities === null) - continue; - issueContent += `## ${vuln.Target}\n`; - let vulnTable = '|Title|Severity|CVE|Package Name|'; - vulnTable += 'Installed Version|Fixed Version|References|\n'; - vulnTable += '|:--:|:--:|:--:|:--:|:--:|:--:|:--|\n'; - for (const cve of vuln.Vulnerabilities) { - vulnTable += `|${cve.Title || 'N/A'}|${cve.Severity || 'N/A'}`; - vulnTable += `|${cve.VulnerabilityID || 'N/A'}|${cve.PkgName || 'N/A'}`; - vulnTable += `|${cve.InstalledVersion || 'N/A'}|${cve.FixedVersion || - 'N/A'}|`; - const references = cve.References; - if (!utils_1.isIterable(references)) - continue; - for (const reference of references) { - vulnTable += `${reference || 'N/A'}
`; - } - vulnTable.replace(/
$/, '|\n'); - } - issueContent += `${vulnTable}\n\n`; - } - return issueContent ? `_(image scanned: \`${image}\`)_\n\n${issueContent}` : issueContent; - } - validateOption(option) { - this.validateSeverity(option.severity.split(',')); - this.validateVulnType(option.vulnType.split(',')); - } - validateSeverity(severities) { - const allowedSeverities = /UNKNOWN|LOW|MEDIUM|HIGH|CRITICAL/; - if (!validateArrayOption(allowedSeverities, severities)) { - throw new Error(`Trivy option error: ${severities.join(',')} is unknown severity. - Trivy supports UNKNOWN, LOW, MEDIUM, HIGH and CRITICAL.`); - } - return true; - } - validateVulnType(vulnTypes) { - const allowedVulnTypes = /os|library/; - if (!validateArrayOption(allowedVulnTypes, vulnTypes)) { - throw new Error(`Trivy option error: ${vulnTypes.join(',')} is unknown vuln-type. - Trivy supports os and library.`); - } - return true; - } -} -exports.Trivy = Trivy; -function validateArrayOption(allowedValue, options) { - for (const option of options) { - if (!allowedValue.test(option)) { - return false; - } - } - return true; -} - - -/***/ }), - -/***/ 742: -/***/ (function(module, __unusedexports, __webpack_require__) { - -var fs = __webpack_require__(747) -var core -if (process.platform === 'win32' || global.TESTING_WINDOWS) { - core = __webpack_require__(818) -} else { - core = __webpack_require__(197) -} - -module.exports = isexe -isexe.sync = sync - -function isexe (path, options, cb) { - if (typeof options === 'function') { - cb = options - options = {} - } - - if (!cb) { - if (typeof Promise !== 'function') { - throw new TypeError('callback not provided') - } - - return new Promise(function (resolve, reject) { - isexe(path, options || {}, function (er, is) { - if (er) { - reject(er) - } else { - resolve(is) - } - }) - }) - } - - core(path, options || {}, function (er, is) { - // ignore EACCES because that just means we aren't allowed to run it - if (er) { - if (er.code === 'EACCES' || options && options.ignoreErrors) { - er = null - is = false - } - } - cb(er, is) - }) -} - -function sync (path, options) { - // my kingdom for a filtered catch - try { - return core.sync(path, options || {}) - } catch (er) { - if (options && options.ignoreErrors || er.code === 'EACCES') { - return false - } else { - throw er - } - } -} - - -/***/ }), - -/***/ 747: -/***/ (function(module) { - -module.exports = require("fs"); - -/***/ }), - -/***/ 753: -/***/ (function(__unusedmodule, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, '__esModule', { value: true }); - -function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } - -var endpoint = __webpack_require__(385); -var universalUserAgent = __webpack_require__(526); -var isPlainObject = _interopDefault(__webpack_require__(548)); -var nodeFetch = _interopDefault(__webpack_require__(454)); -var requestError = __webpack_require__(463); - -const VERSION = "5.3.1"; - -function getBufferResponse(response) { - return response.arrayBuffer(); -} - -function fetchWrapper(requestOptions) { - if (isPlainObject(requestOptions.body) || Array.isArray(requestOptions.body)) { - requestOptions.body = JSON.stringify(requestOptions.body); - } - - let headers = {}; - let status; - let url; - const fetch = requestOptions.request && requestOptions.request.fetch || nodeFetch; - return fetch(requestOptions.url, Object.assign({ - method: requestOptions.method, - body: requestOptions.body, - headers: requestOptions.headers, - redirect: requestOptions.redirect - }, requestOptions.request)).then(response => { - url = response.url; - status = response.status; - - for (const keyAndValue of response.headers) { - headers[keyAndValue[0]] = keyAndValue[1]; - } - - if (status === 204 || status === 205) { - return; - } // GitHub API returns 200 for HEAD requsets - - - if (requestOptions.method === "HEAD") { - if (status < 400) { - return; - } - - throw new requestError.RequestError(response.statusText, status, { - headers, - request: requestOptions - }); - } - - if (status === 304) { - throw new requestError.RequestError("Not modified", status, { - headers, - request: requestOptions - }); - } - - if (status >= 400) { - return response.text().then(message => { - const error = new requestError.RequestError(message, status, { - headers, - request: requestOptions - }); - - try { - let responseBody = JSON.parse(error.message); - Object.assign(error, responseBody); - let errors = responseBody.errors; // Assumption `errors` would always be in Array Fotmat - - error.message = error.message + ": " + errors.map(JSON.stringify).join(", "); - } catch (e) {// ignore, see octokit/rest.js#684 - } - - throw error; - }); - } - - const contentType = response.headers.get("content-type"); - - if (/application\/json/.test(contentType)) { - return response.json(); - } - - if (!contentType || /^text\/|charset=utf-8$/.test(contentType)) { - return response.text(); - } - - return getBufferResponse(response); - }).then(data => { - return { - status, - url, - headers, - data - }; - }).catch(error => { - if (error instanceof requestError.RequestError) { - throw error; - } - - throw new requestError.RequestError(error.message, 500, { - headers, - request: requestOptions - }); - }); -} - -function withDefaults(oldEndpoint, newDefaults) { - const endpoint = oldEndpoint.defaults(newDefaults); - - const newApi = function (route, parameters) { - const endpointOptions = endpoint.merge(route, parameters); - - if (!endpointOptions.request || !endpointOptions.request.hook) { - return fetchWrapper(endpoint.parse(endpointOptions)); - } - - const request = (route, parameters) => { - return fetchWrapper(endpoint.parse(endpoint.merge(route, parameters))); - }; - - Object.assign(request, { - endpoint, - defaults: withDefaults.bind(null, endpoint) - }); - return endpointOptions.request.hook(request, endpointOptions); - }; - - return Object.assign(newApi, { - endpoint, - defaults: withDefaults.bind(null, endpoint) - }); -} - -const request = withDefaults(endpoint.endpoint, { - headers: { - "user-agent": `octokit-request.js/${VERSION} ${universalUserAgent.getUserAgent()}` - } -}); - -exports.request = request; -//# sourceMappingURL=index.js.map - - -/***/ }), - -/***/ 761: -/***/ (function(module) { - -module.exports = require("zlib"); - -/***/ }), - -/***/ 763: -/***/ (function(module) { - -module.exports = removeHook - -function removeHook (state, name, method) { - if (!state.registry[name]) { - return - } - - var index = state.registry[name] - .map(function (registered) { return registered.orig }) - .indexOf(method) - - if (index === -1) { - return - } - - state.registry[name].splice(index, 1) -} - - -/***/ }), - -/***/ 768: -/***/ (function(module) { - -"use strict"; - -module.exports = function (x) { - var lf = typeof x === 'string' ? '\n' : '\n'.charCodeAt(); - var cr = typeof x === 'string' ? '\r' : '\r'.charCodeAt(); - - if (x[x.length - 1] === lf) { - x = x.slice(0, x.length - 1); - } - - if (x[x.length - 1] === cr) { - x = x.slice(0, x.length - 1); - } - - return x; -}; - - -/***/ }), - -/***/ 777: -/***/ (function(module, __unusedexports, __webpack_require__) { - -module.exports = getFirstPage - -const getPage = __webpack_require__(265) - -function getFirstPage (octokit, link, headers) { - return getPage(octokit, link, 'first', headers) -} - - -/***/ }), - -/***/ 796: -/***/ (function(module) { - -"use strict"; - -module.exports = Base => class extends Base { - warn (code, message, data = {}) { - if (this.file) - data.file = this.file - if (this.cwd) - data.cwd = this.cwd - data.code = message instanceof Error && message.code || code - data.tarCode = code - if (!this.strict && data.recoverable !== false) { - if (message instanceof Error) { - data = Object.assign(message, data) - message = message.message - } - this.emit('warn', data.tarCode, message, data) - } else if (message instanceof Error) { - this.emit('error', Object.assign(message, data)) - } else - this.emit('error', Object.assign(new Error(`${code}: ${message}`), data)) - } -} - - -/***/ }), - -/***/ 813: -/***/ (function(__unusedmodule, exports) { - -"use strict"; - - -Object.defineProperty(exports, '__esModule', { value: true }); - -async function auth(token) { - const tokenType = token.split(/\./).length === 3 ? "app" : /^v\d+\./.test(token) ? "installation" : "oauth"; - return { - type: "token", - token: token, - tokenType - }; -} - -/** - * Prefix token for usage in the Authorization header - * - * @param token OAuth token or JSON Web Token - */ -function withAuthorizationPrefix(token) { - if (token.split(/\./).length === 3) { - return `bearer ${token}`; - } - - return `token ${token}`; -} - -async function hook(token, request, route, parameters) { - const endpoint = request.endpoint.merge(route, parameters); - endpoint.headers.authorization = withAuthorizationPrefix(token); - return request(endpoint); -} - -const createTokenAuth = function createTokenAuth(token) { - if (!token) { - throw new Error("[@octokit/auth-token] No token passed to createTokenAuth"); - } - - if (typeof token !== "string") { - throw new Error("[@octokit/auth-token] Token passed to createTokenAuth is not a string"); - } - - token = token.replace(/^(token|bearer) +/i, ""); - return Object.assign(auth.bind(null, token), { - hook: hook.bind(null, token) - }); -}; - -exports.createTokenAuth = createTokenAuth; -//# sourceMappingURL=index.js.map - - -/***/ }), - -/***/ 814: -/***/ (function(module, __unusedexports, __webpack_require__) { - -module.exports = which -which.sync = whichSync - -var isWindows = process.platform === 'win32' || - process.env.OSTYPE === 'cygwin' || - process.env.OSTYPE === 'msys' - -var path = __webpack_require__(622) -var COLON = isWindows ? ';' : ':' -var isexe = __webpack_require__(742) - -function getNotFoundError (cmd) { - var er = new Error('not found: ' + cmd) - er.code = 'ENOENT' - - return er -} - -function getPathInfo (cmd, opt) { - var colon = opt.colon || COLON - var pathEnv = opt.path || process.env.PATH || '' - var pathExt = [''] - - pathEnv = pathEnv.split(colon) - - var pathExtExe = '' - if (isWindows) { - pathEnv.unshift(process.cwd()) - pathExtExe = (opt.pathExt || process.env.PATHEXT || '.EXE;.CMD;.BAT;.COM') - pathExt = pathExtExe.split(colon) - - - // Always test the cmd itself first. isexe will check to make sure - // it's found in the pathExt set. - if (cmd.indexOf('.') !== -1 && pathExt[0] !== '') - pathExt.unshift('') - } - - // If it has a slash, then we don't bother searching the pathenv. - // just check the file itself, and that's it. - if (cmd.match(/\//) || isWindows && cmd.match(/\\/)) - pathEnv = [''] - - return { - env: pathEnv, - ext: pathExt, - extExe: pathExtExe - } -} - -function which (cmd, opt, cb) { - if (typeof opt === 'function') { - cb = opt - opt = {} - } - - var info = getPathInfo(cmd, opt) - var pathEnv = info.env - var pathExt = info.ext - var pathExtExe = info.extExe - var found = [] - - ;(function F (i, l) { - if (i === l) { - if (opt.all && found.length) - return cb(null, found) - else - return cb(getNotFoundError(cmd)) - } - - var pathPart = pathEnv[i] - if (pathPart.charAt(0) === '"' && pathPart.slice(-1) === '"') - pathPart = pathPart.slice(1, -1) - - var p = path.join(pathPart, cmd) - if (!pathPart && (/^\.[\\\/]/).test(cmd)) { - p = cmd.slice(0, 2) + p - } - ;(function E (ii, ll) { - if (ii === ll) return F(i + 1, l) - var ext = pathExt[ii] - isexe(p + ext, { pathExt: pathExtExe }, function (er, is) { - if (!er && is) { - if (opt.all) - found.push(p + ext) - else - return cb(null, p + ext) - } - return E(ii + 1, ll) - }) - })(0, pathExt.length) - })(0, pathEnv.length) -} - -function whichSync (cmd, opt) { - opt = opt || {} - - var info = getPathInfo(cmd, opt) - var pathEnv = info.env - var pathExt = info.ext - var pathExtExe = info.extExe - var found = [] - - for (var i = 0, l = pathEnv.length; i < l; i ++) { - var pathPart = pathEnv[i] - if (pathPart.charAt(0) === '"' && pathPart.slice(-1) === '"') - pathPart = pathPart.slice(1, -1) - - var p = path.join(pathPart, cmd) - if (!pathPart && /^\.[\\\/]/.test(cmd)) { - p = cmd.slice(0, 2) + p - } - for (var j = 0, ll = pathExt.length; j < ll; j ++) { - var cur = p + pathExt[j] - var is - try { - is = isexe.sync(cur, { pathExt: pathExtExe }) - if (is) { - if (opt.all) - found.push(cur) - else - return cur - } - } catch (ex) {} - } - } - - if (opt.all && found.length) - return found - - if (opt.nothrow) - return null - - throw getNotFoundError(cmd) -} - - -/***/ }), - -/***/ 816: -/***/ (function(module) { - -"use strict"; - -module.exports = /^#!.*/; - - -/***/ }), - -/***/ 818: -/***/ (function(module, __unusedexports, __webpack_require__) { - -module.exports = isexe -isexe.sync = sync - -var fs = __webpack_require__(747) - -function checkPathExt (path, options) { - var pathext = options.pathExt !== undefined ? - options.pathExt : process.env.PATHEXT - - if (!pathext) { - return true - } - - pathext = pathext.split(';') - if (pathext.indexOf('') !== -1) { - return true - } - for (var i = 0; i < pathext.length; i++) { - var p = pathext[i].toLowerCase() - if (p && path.substr(-p.length).toLowerCase() === p) { - return true - } - } - return false -} - -function checkStat (stat, path, options) { - if (!stat.isSymbolicLink() && !stat.isFile()) { - return false - } - return checkPathExt(path, options) -} - -function isexe (path, options, cb) { - fs.stat(path, function (er, stat) { - cb(er, er ? false : checkStat(stat, path, options)) - }) -} - -function sync (path, options) { - return checkStat(fs.statSync(path), path, options) -} - - -/***/ }), - -/***/ 827: -/***/ (function(__unusedmodule, exports, __webpack_require__) { - -"use strict"; - -const MiniPass = __webpack_require__(720) -const EE = __webpack_require__(614).EventEmitter -const fs = __webpack_require__(747) - -let writev = fs.writev -/* istanbul ignore next */ -if (!writev) { - // This entire block can be removed if support for earlier than Node.js - // 12.9.0 is not needed. - const binding = process.binding('fs') - const FSReqWrap = binding.FSReqWrap || binding.FSReqCallback - - writev = (fd, iovec, pos, cb) => { - const done = (er, bw) => cb(er, bw, iovec) - const req = new FSReqWrap() - req.oncomplete = done - binding.writeBuffers(fd, iovec, pos, req) - } -} - -const _autoClose = Symbol('_autoClose') -const _close = Symbol('_close') -const _ended = Symbol('_ended') -const _fd = Symbol('_fd') -const _finished = Symbol('_finished') -const _flags = Symbol('_flags') -const _flush = Symbol('_flush') -const _handleChunk = Symbol('_handleChunk') -const _makeBuf = Symbol('_makeBuf') -const _mode = Symbol('_mode') -const _needDrain = Symbol('_needDrain') -const _onerror = Symbol('_onerror') -const _onopen = Symbol('_onopen') -const _onread = Symbol('_onread') -const _onwrite = Symbol('_onwrite') -const _open = Symbol('_open') -const _path = Symbol('_path') -const _pos = Symbol('_pos') -const _queue = Symbol('_queue') -const _read = Symbol('_read') -const _readSize = Symbol('_readSize') -const _reading = Symbol('_reading') -const _remain = Symbol('_remain') -const _size = Symbol('_size') -const _write = Symbol('_write') -const _writing = Symbol('_writing') -const _defaultFlag = Symbol('_defaultFlag') -const _errored = Symbol('_errored') - -class ReadStream extends MiniPass { - constructor (path, opt) { - opt = opt || {} - super(opt) - - this.readable = true - this.writable = false - - if (typeof path !== 'string') - throw new TypeError('path must be a string') - - this[_errored] = false - this[_fd] = typeof opt.fd === 'number' ? opt.fd : null - this[_path] = path - this[_readSize] = opt.readSize || 16*1024*1024 - this[_reading] = false - this[_size] = typeof opt.size === 'number' ? opt.size : Infinity - this[_remain] = this[_size] - this[_autoClose] = typeof opt.autoClose === 'boolean' ? - opt.autoClose : true - - if (typeof this[_fd] === 'number') - this[_read]() - else - this[_open]() - } - - get fd () { return this[_fd] } - get path () { return this[_path] } - - write () { - throw new TypeError('this is a readable stream') - } - - end () { - throw new TypeError('this is a readable stream') - } - - [_open] () { - fs.open(this[_path], 'r', (er, fd) => this[_onopen](er, fd)) - } - - [_onopen] (er, fd) { - if (er) - this[_onerror](er) - else { - this[_fd] = fd - this.emit('open', fd) - this[_read]() - } - } - - [_makeBuf] () { - return Buffer.allocUnsafe(Math.min(this[_readSize], this[_remain])) - } - - [_read] () { - if (!this[_reading]) { - this[_reading] = true - const buf = this[_makeBuf]() - /* istanbul ignore if */ - if (buf.length === 0) - return process.nextTick(() => this[_onread](null, 0, buf)) - fs.read(this[_fd], buf, 0, buf.length, null, (er, br, buf) => - this[_onread](er, br, buf)) - } - } - - [_onread] (er, br, buf) { - this[_reading] = false - if (er) - this[_onerror](er) - else if (this[_handleChunk](br, buf)) - this[_read]() - } - - [_close] () { - if (this[_autoClose] && typeof this[_fd] === 'number') { - const fd = this[_fd] - this[_fd] = null - fs.close(fd, er => er ? this.emit('error', er) : this.emit('close')) - } - } - - [_onerror] (er) { - this[_reading] = true - this[_close]() - this.emit('error', er) - } - - [_handleChunk] (br, buf) { - let ret = false - // no effect if infinite - this[_remain] -= br - if (br > 0) - ret = super.write(br < buf.length ? buf.slice(0, br) : buf) - - if (br === 0 || this[_remain] <= 0) { - ret = false - this[_close]() - super.end() - } - - return ret - } - - emit (ev, data) { - switch (ev) { - case 'prefinish': - case 'finish': - break - - case 'drain': - if (typeof this[_fd] === 'number') - this[_read]() - break - - case 'error': - if (this[_errored]) - return - this[_errored] = true - return super.emit(ev, data) - - default: - return super.emit(ev, data) - } - } -} - -class ReadStreamSync extends ReadStream { - [_open] () { - let threw = true - try { - this[_onopen](null, fs.openSync(this[_path], 'r')) - threw = false - } finally { - if (threw) - this[_close]() - } - } - - [_read] () { - let threw = true - try { - if (!this[_reading]) { - this[_reading] = true - do { - const buf = this[_makeBuf]() - /* istanbul ignore next */ - const br = buf.length === 0 ? 0 - : fs.readSync(this[_fd], buf, 0, buf.length, null) - if (!this[_handleChunk](br, buf)) - break - } while (true) - this[_reading] = false - } - threw = false - } finally { - if (threw) - this[_close]() - } - } - - [_close] () { - if (this[_autoClose] && typeof this[_fd] === 'number') { - const fd = this[_fd] - this[_fd] = null - fs.closeSync(fd) - this.emit('close') - } - } -} - -class WriteStream extends EE { - constructor (path, opt) { - opt = opt || {} - super(opt) - this.readable = false - this.writable = true - this[_errored] = false - this[_writing] = false - this[_ended] = false - this[_needDrain] = false - this[_queue] = [] - this[_path] = path - this[_fd] = typeof opt.fd === 'number' ? opt.fd : null - this[_mode] = opt.mode === undefined ? 0o666 : opt.mode - this[_pos] = typeof opt.start === 'number' ? opt.start : null - this[_autoClose] = typeof opt.autoClose === 'boolean' ? - opt.autoClose : true - - // truncating makes no sense when writing into the middle - const defaultFlag = this[_pos] !== null ? 'r+' : 'w' - this[_defaultFlag] = opt.flags === undefined - this[_flags] = this[_defaultFlag] ? defaultFlag : opt.flags - - if (this[_fd] === null) - this[_open]() - } - - emit (ev, data) { - if (ev === 'error') { - if (this[_errored]) - return - this[_errored] = true - } - return super.emit(ev, data) - } - - - get fd () { return this[_fd] } - get path () { return this[_path] } - - [_onerror] (er) { - this[_close]() - this[_writing] = true - this.emit('error', er) - } - - [_open] () { - fs.open(this[_path], this[_flags], this[_mode], - (er, fd) => this[_onopen](er, fd)) - } - - [_onopen] (er, fd) { - if (this[_defaultFlag] && - this[_flags] === 'r+' && - er && er.code === 'ENOENT') { - this[_flags] = 'w' - this[_open]() - } else if (er) - this[_onerror](er) - else { - this[_fd] = fd - this.emit('open', fd) - this[_flush]() - } - } - - end (buf, enc) { - if (buf) - this.write(buf, enc) - - this[_ended] = true - - // synthetic after-write logic, where drain/finish live - if (!this[_writing] && !this[_queue].length && - typeof this[_fd] === 'number') - this[_onwrite](null, 0) - return this - } - - write (buf, enc) { - if (typeof buf === 'string') - buf = Buffer.from(buf, enc) - - if (this[_ended]) { - this.emit('error', new Error('write() after end()')) - return false - } - - if (this[_fd] === null || this[_writing] || this[_queue].length) { - this[_queue].push(buf) - this[_needDrain] = true - return false - } - - this[_writing] = true - this[_write](buf) - return true - } - - [_write] (buf) { - fs.write(this[_fd], buf, 0, buf.length, this[_pos], (er, bw) => - this[_onwrite](er, bw)) - } - - [_onwrite] (er, bw) { - if (er) - this[_onerror](er) - else { - if (this[_pos] !== null) - this[_pos] += bw - if (this[_queue].length) - this[_flush]() - else { - this[_writing] = false - - if (this[_ended] && !this[_finished]) { - this[_finished] = true - this[_close]() - this.emit('finish') - } else if (this[_needDrain]) { - this[_needDrain] = false - this.emit('drain') - } - } - } - } - - [_flush] () { - if (this[_queue].length === 0) { - if (this[_ended]) - this[_onwrite](null, 0) - } else if (this[_queue].length === 1) - this[_write](this[_queue].pop()) - else { - const iovec = this[_queue] - this[_queue] = [] - writev(this[_fd], iovec, this[_pos], - (er, bw) => this[_onwrite](er, bw)) - } - } - - [_close] () { - if (this[_autoClose] && typeof this[_fd] === 'number') { - const fd = this[_fd] - this[_fd] = null - fs.close(fd, er => er ? this.emit('error', er) : this.emit('close')) - } - } -} - -class WriteStreamSync extends WriteStream { - [_open] () { - let fd - // only wrap in a try{} block if we know we'll retry, to avoid - // the rethrow obscuring the error's source frame in most cases. - if (this[_defaultFlag] && this[_flags] === 'r+') { - try { - fd = fs.openSync(this[_path], this[_flags], this[_mode]) - } catch (er) { - if (er.code === 'ENOENT') { - this[_flags] = 'w' - return this[_open]() - } else - throw er - } - } else - fd = fs.openSync(this[_path], this[_flags], this[_mode]) - - this[_onopen](null, fd) - } - - [_close] () { - if (this[_autoClose] && typeof this[_fd] === 'number') { - const fd = this[_fd] - this[_fd] = null - fs.closeSync(fd) - this.emit('close') - } - } - - [_write] (buf) { - // throw the original, but try to close if it fails - let threw = true - try { - this[_onwrite](null, - fs.writeSync(this[_fd], buf, 0, buf.length, this[_pos])) - threw = false - } finally { - if (threw) - try { this[_close]() } catch (_) {} - } - } -} - -exports.ReadStream = ReadStream -exports.ReadStreamSync = ReadStreamSync - -exports.WriteStream = WriteStream -exports.WriteStreamSync = WriteStreamSync - - -/***/ }), - -/***/ 835: -/***/ (function(module) { - -module.exports = require("url"); - -/***/ }), - -/***/ 842: -/***/ (function(__unusedmodule, exports, __webpack_require__) { - -"use strict"; - - -Object.defineProperty(exports, '__esModule', { value: true }); - -var deprecation = __webpack_require__(692); - -var endpointsByScope = { - actions: { - cancelWorkflowRun: { - method: "POST", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - run_id: { - required: true, - type: "integer" - } - }, - url: "/repos/:owner/:repo/actions/runs/:run_id/cancel" - }, - createOrUpdateSecretForRepo: { - method: "PUT", - params: { - encrypted_value: { - type: "string" - }, - key_id: { - type: "string" - }, - name: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/actions/secrets/:name" - }, - createRegistrationToken: { - method: "POST", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/actions/runners/registration-token" - }, - createRemoveToken: { - method: "POST", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/actions/runners/remove-token" - }, - deleteArtifact: { - method: "DELETE", - params: { - artifact_id: { - required: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/actions/artifacts/:artifact_id" - }, - deleteSecretFromRepo: { - method: "DELETE", - params: { - name: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/actions/secrets/:name" - }, - downloadArtifact: { - method: "GET", - params: { - archive_format: { - required: true, - type: "string" - }, - artifact_id: { - required: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/actions/artifacts/:artifact_id/:archive_format" - }, - getArtifact: { - method: "GET", - params: { - artifact_id: { - required: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/actions/artifacts/:artifact_id" - }, - getPublicKey: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/actions/secrets/public-key" - }, - getSecret: { - method: "GET", - params: { - name: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/actions/secrets/:name" - }, - getSelfHostedRunner: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - runner_id: { - required: true, - type: "integer" - } - }, - url: "/repos/:owner/:repo/actions/runners/:runner_id" - }, - getWorkflow: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - workflow_id: { - required: true, - type: "integer" - } - }, - url: "/repos/:owner/:repo/actions/workflows/:workflow_id" - }, - getWorkflowJob: { - method: "GET", - params: { - job_id: { - required: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/actions/jobs/:job_id" - }, - getWorkflowRun: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - run_id: { - required: true, - type: "integer" - } - }, - url: "/repos/:owner/:repo/actions/runs/:run_id" - }, - listDownloadsForSelfHostedRunnerApplication: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/actions/runners/downloads" - }, - listJobsForWorkflowRun: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - }, - run_id: { - required: true, - type: "integer" - } - }, - url: "/repos/:owner/:repo/actions/runs/:run_id/jobs" - }, - listRepoWorkflowRuns: { - method: "GET", - params: { - actor: { - type: "string" - }, - branch: { - type: "string" - }, - event: { - type: "string" - }, - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - }, - status: { - enum: ["completed", "status", "conclusion"], - type: "string" - } - }, - url: "/repos/:owner/:repo/actions/runs" - }, - listRepoWorkflows: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/actions/workflows" - }, - listSecretsForRepo: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/actions/secrets" - }, - listSelfHostedRunnersForRepo: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/actions/runners" - }, - listWorkflowJobLogs: { - method: "GET", - params: { - job_id: { - required: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/actions/jobs/:job_id/logs" - }, - listWorkflowRunArtifacts: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - }, - run_id: { - required: true, - type: "integer" - } - }, - url: "/repos/:owner/:repo/actions/runs/:run_id/artifacts" - }, - listWorkflowRunLogs: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - }, - run_id: { - required: true, - type: "integer" - } - }, - url: "/repos/:owner/:repo/actions/runs/:run_id/logs" - }, - listWorkflowRuns: { - method: "GET", - params: { - actor: { - type: "string" - }, - branch: { - type: "string" - }, - event: { - type: "string" - }, - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - }, - status: { - enum: ["completed", "status", "conclusion"], - type: "string" - }, - workflow_id: { - required: true, - type: "integer" - } - }, - url: "/repos/:owner/:repo/actions/workflows/:workflow_id/runs" - }, - reRunWorkflow: { - method: "POST", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - run_id: { - required: true, - type: "integer" - } - }, - url: "/repos/:owner/:repo/actions/runs/:run_id/rerun" - }, - removeSelfHostedRunner: { - method: "DELETE", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - runner_id: { - required: true, - type: "integer" - } - }, - url: "/repos/:owner/:repo/actions/runners/:runner_id" - } - }, - activity: { - checkStarringRepo: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/user/starred/:owner/:repo" - }, - deleteRepoSubscription: { - method: "DELETE", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/subscription" - }, - deleteThreadSubscription: { - method: "DELETE", - params: { - thread_id: { - required: true, - type: "integer" - } - }, - url: "/notifications/threads/:thread_id/subscription" - }, - getRepoSubscription: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/subscription" - }, - getThread: { - method: "GET", - params: { - thread_id: { - required: true, - type: "integer" - } - }, - url: "/notifications/threads/:thread_id" - }, - getThreadSubscription: { - method: "GET", - params: { - thread_id: { - required: true, - type: "integer" - } - }, - url: "/notifications/threads/:thread_id/subscription" - }, - listEventsForOrg: { - method: "GET", - params: { - org: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - username: { - required: true, - type: "string" - } - }, - url: "/users/:username/events/orgs/:org" - }, - listEventsForUser: { - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - username: { - required: true, - type: "string" - } - }, - url: "/users/:username/events" - }, - listFeeds: { - method: "GET", - params: {}, - url: "/feeds" - }, - listNotifications: { - method: "GET", - params: { - all: { - type: "boolean" - }, - before: { - type: "string" - }, - page: { - type: "integer" - }, - participating: { - type: "boolean" - }, - per_page: { - type: "integer" - }, - since: { - type: "string" - } - }, - url: "/notifications" - }, - listNotificationsForRepo: { - method: "GET", - params: { - all: { - type: "boolean" - }, - before: { - type: "string" - }, - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - participating: { - type: "boolean" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - }, - since: { - type: "string" - } - }, - url: "/repos/:owner/:repo/notifications" - }, - listPublicEvents: { - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - } - }, - url: "/events" - }, - listPublicEventsForOrg: { - method: "GET", - params: { - org: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - } - }, - url: "/orgs/:org/events" - }, - listPublicEventsForRepoNetwork: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/networks/:owner/:repo/events" - }, - listPublicEventsForUser: { - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - username: { - required: true, - type: "string" - } - }, - url: "/users/:username/events/public" - }, - listReceivedEventsForUser: { - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - username: { - required: true, - type: "string" - } - }, - url: "/users/:username/received_events" - }, - listReceivedPublicEventsForUser: { - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - username: { - required: true, - type: "string" - } - }, - url: "/users/:username/received_events/public" - }, - listRepoEvents: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/events" - }, - listReposStarredByAuthenticatedUser: { - method: "GET", - params: { - direction: { - enum: ["asc", "desc"], - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - sort: { - enum: ["created", "updated"], - type: "string" - } - }, - url: "/user/starred" - }, - listReposStarredByUser: { - method: "GET", - params: { - direction: { - enum: ["asc", "desc"], - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - sort: { - enum: ["created", "updated"], - type: "string" - }, - username: { - required: true, - type: "string" - } - }, - url: "/users/:username/starred" - }, - listReposWatchedByUser: { - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - username: { - required: true, - type: "string" - } - }, - url: "/users/:username/subscriptions" - }, - listStargazersForRepo: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/stargazers" - }, - listWatchedReposForAuthenticatedUser: { - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - } - }, - url: "/user/subscriptions" - }, - listWatchersForRepo: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/subscribers" - }, - markAsRead: { - method: "PUT", - params: { - last_read_at: { - type: "string" - } - }, - url: "/notifications" - }, - markNotificationsAsReadForRepo: { - method: "PUT", - params: { - last_read_at: { - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/notifications" - }, - markThreadAsRead: { - method: "PATCH", - params: { - thread_id: { - required: true, - type: "integer" - } - }, - url: "/notifications/threads/:thread_id" - }, - setRepoSubscription: { - method: "PUT", - params: { - ignored: { - type: "boolean" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - subscribed: { - type: "boolean" - } - }, - url: "/repos/:owner/:repo/subscription" - }, - setThreadSubscription: { - method: "PUT", - params: { - ignored: { - type: "boolean" - }, - thread_id: { - required: true, - type: "integer" - } - }, - url: "/notifications/threads/:thread_id/subscription" - }, - starRepo: { - method: "PUT", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/user/starred/:owner/:repo" - }, - unstarRepo: { - method: "DELETE", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/user/starred/:owner/:repo" - } - }, - apps: { - addRepoToInstallation: { - headers: { - accept: "application/vnd.github.machine-man-preview+json" - }, - method: "PUT", - params: { - installation_id: { - required: true, - type: "integer" - }, - repository_id: { - required: true, - type: "integer" - } - }, - url: "/user/installations/:installation_id/repositories/:repository_id" - }, - checkAccountIsAssociatedWithAny: { - method: "GET", - params: { - account_id: { - required: true, - type: "integer" - } - }, - url: "/marketplace_listing/accounts/:account_id" - }, - checkAccountIsAssociatedWithAnyStubbed: { - method: "GET", - params: { - account_id: { - required: true, - type: "integer" - } - }, - url: "/marketplace_listing/stubbed/accounts/:account_id" - }, - checkAuthorization: { - deprecated: "octokit.apps.checkAuthorization() is deprecated, see https://developer.github.com/v3/apps/oauth_applications/#check-an-authorization", - method: "GET", - params: { - access_token: { - required: true, - type: "string" - }, - client_id: { - required: true, - type: "string" - } - }, - url: "/applications/:client_id/tokens/:access_token" - }, - checkToken: { - headers: { - accept: "application/vnd.github.doctor-strange-preview+json" - }, - method: "POST", - params: { - access_token: { - type: "string" - }, - client_id: { - required: true, - type: "string" - } - }, - url: "/applications/:client_id/token" - }, - createContentAttachment: { - headers: { - accept: "application/vnd.github.corsair-preview+json" - }, - method: "POST", - params: { - body: { - required: true, - type: "string" - }, - content_reference_id: { - required: true, - type: "integer" - }, - title: { - required: true, - type: "string" - } - }, - url: "/content_references/:content_reference_id/attachments" - }, - createFromManifest: { - headers: { - accept: "application/vnd.github.fury-preview+json" - }, - method: "POST", - params: { - code: { - required: true, - type: "string" - } - }, - url: "/app-manifests/:code/conversions" - }, - createInstallationToken: { - headers: { - accept: "application/vnd.github.machine-man-preview+json" - }, - method: "POST", - params: { - installation_id: { - required: true, - type: "integer" - }, - permissions: { - type: "object" - }, - repository_ids: { - type: "integer[]" - } - }, - url: "/app/installations/:installation_id/access_tokens" - }, - deleteAuthorization: { - headers: { - accept: "application/vnd.github.doctor-strange-preview+json" - }, - method: "DELETE", - params: { - access_token: { - type: "string" - }, - client_id: { - required: true, - type: "string" - } - }, - url: "/applications/:client_id/grant" - }, - deleteInstallation: { - headers: { - accept: "application/vnd.github.gambit-preview+json,application/vnd.github.machine-man-preview+json" - }, - method: "DELETE", - params: { - installation_id: { - required: true, - type: "integer" - } - }, - url: "/app/installations/:installation_id" - }, - deleteToken: { - headers: { - accept: "application/vnd.github.doctor-strange-preview+json" - }, - method: "DELETE", - params: { - access_token: { - type: "string" - }, - client_id: { - required: true, - type: "string" - } - }, - url: "/applications/:client_id/token" - }, - findOrgInstallation: { - deprecated: "octokit.apps.findOrgInstallation() has been renamed to octokit.apps.getOrgInstallation() (2019-04-10)", - headers: { - accept: "application/vnd.github.machine-man-preview+json" - }, - method: "GET", - params: { - org: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/installation" - }, - findRepoInstallation: { - deprecated: "octokit.apps.findRepoInstallation() has been renamed to octokit.apps.getRepoInstallation() (2019-04-10)", - headers: { - accept: "application/vnd.github.machine-man-preview+json" - }, - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/installation" - }, - findUserInstallation: { - deprecated: "octokit.apps.findUserInstallation() has been renamed to octokit.apps.getUserInstallation() (2019-04-10)", - headers: { - accept: "application/vnd.github.machine-man-preview+json" - }, - method: "GET", - params: { - username: { - required: true, - type: "string" - } - }, - url: "/users/:username/installation" - }, - getAuthenticated: { - headers: { - accept: "application/vnd.github.machine-man-preview+json" - }, - method: "GET", - params: {}, - url: "/app" - }, - getBySlug: { - headers: { - accept: "application/vnd.github.machine-man-preview+json" - }, - method: "GET", - params: { - app_slug: { - required: true, - type: "string" - } - }, - url: "/apps/:app_slug" - }, - getInstallation: { - headers: { - accept: "application/vnd.github.machine-man-preview+json" - }, - method: "GET", - params: { - installation_id: { - required: true, - type: "integer" - } - }, - url: "/app/installations/:installation_id" - }, - getOrgInstallation: { - headers: { - accept: "application/vnd.github.machine-man-preview+json" - }, - method: "GET", - params: { - org: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/installation" - }, - getRepoInstallation: { - headers: { - accept: "application/vnd.github.machine-man-preview+json" - }, - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/installation" - }, - getUserInstallation: { - headers: { - accept: "application/vnd.github.machine-man-preview+json" - }, - method: "GET", - params: { - username: { - required: true, - type: "string" - } - }, - url: "/users/:username/installation" - }, - listAccountsUserOrOrgOnPlan: { - method: "GET", - params: { - direction: { - enum: ["asc", "desc"], - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - plan_id: { - required: true, - type: "integer" - }, - sort: { - enum: ["created", "updated"], - type: "string" - } - }, - url: "/marketplace_listing/plans/:plan_id/accounts" - }, - listAccountsUserOrOrgOnPlanStubbed: { - method: "GET", - params: { - direction: { - enum: ["asc", "desc"], - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - plan_id: { - required: true, - type: "integer" - }, - sort: { - enum: ["created", "updated"], - type: "string" - } - }, - url: "/marketplace_listing/stubbed/plans/:plan_id/accounts" - }, - listInstallationReposForAuthenticatedUser: { - headers: { - accept: "application/vnd.github.machine-man-preview+json" - }, - method: "GET", - params: { - installation_id: { - required: true, - type: "integer" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - } - }, - url: "/user/installations/:installation_id/repositories" - }, - listInstallations: { - headers: { - accept: "application/vnd.github.machine-man-preview+json" - }, - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - } - }, - url: "/app/installations" - }, - listInstallationsForAuthenticatedUser: { - headers: { - accept: "application/vnd.github.machine-man-preview+json" - }, - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - } - }, - url: "/user/installations" - }, - listMarketplacePurchasesForAuthenticatedUser: { - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - } - }, - url: "/user/marketplace_purchases" - }, - listMarketplacePurchasesForAuthenticatedUserStubbed: { - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - } - }, - url: "/user/marketplace_purchases/stubbed" - }, - listPlans: { - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - } - }, - url: "/marketplace_listing/plans" - }, - listPlansStubbed: { - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - } - }, - url: "/marketplace_listing/stubbed/plans" - }, - listRepos: { - headers: { - accept: "application/vnd.github.machine-man-preview+json" - }, - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - } - }, - url: "/installation/repositories" - }, - removeRepoFromInstallation: { - headers: { - accept: "application/vnd.github.machine-man-preview+json" - }, - method: "DELETE", - params: { - installation_id: { - required: true, - type: "integer" - }, - repository_id: { - required: true, - type: "integer" - } - }, - url: "/user/installations/:installation_id/repositories/:repository_id" - }, - resetAuthorization: { - deprecated: "octokit.apps.resetAuthorization() is deprecated, see https://developer.github.com/v3/apps/oauth_applications/#reset-an-authorization", - method: "POST", - params: { - access_token: { - required: true, - type: "string" - }, - client_id: { - required: true, - type: "string" - } - }, - url: "/applications/:client_id/tokens/:access_token" - }, - resetToken: { - headers: { - accept: "application/vnd.github.doctor-strange-preview+json" - }, - method: "PATCH", - params: { - access_token: { - type: "string" - }, - client_id: { - required: true, - type: "string" - } - }, - url: "/applications/:client_id/token" - }, - revokeAuthorizationForApplication: { - deprecated: "octokit.apps.revokeAuthorizationForApplication() is deprecated, see https://developer.github.com/v3/apps/oauth_applications/#revoke-an-authorization-for-an-application", - method: "DELETE", - params: { - access_token: { - required: true, - type: "string" - }, - client_id: { - required: true, - type: "string" - } - }, - url: "/applications/:client_id/tokens/:access_token" - }, - revokeGrantForApplication: { - deprecated: "octokit.apps.revokeGrantForApplication() is deprecated, see https://developer.github.com/v3/apps/oauth_applications/#revoke-a-grant-for-an-application", - method: "DELETE", - params: { - access_token: { - required: true, - type: "string" - }, - client_id: { - required: true, - type: "string" - } - }, - url: "/applications/:client_id/grants/:access_token" - }, - revokeInstallationToken: { - headers: { - accept: "application/vnd.github.gambit-preview+json" - }, - method: "DELETE", - params: {}, - url: "/installation/token" - } - }, - checks: { - create: { - headers: { - accept: "application/vnd.github.antiope-preview+json" - }, - method: "POST", - params: { - actions: { - type: "object[]" - }, - "actions[].description": { - required: true, - type: "string" - }, - "actions[].identifier": { - required: true, - type: "string" - }, - "actions[].label": { - required: true, - type: "string" - }, - completed_at: { - type: "string" - }, - conclusion: { - enum: ["success", "failure", "neutral", "cancelled", "timed_out", "action_required"], - type: "string" - }, - details_url: { - type: "string" - }, - external_id: { - type: "string" - }, - head_sha: { - required: true, - type: "string" - }, - name: { - required: true, - type: "string" - }, - output: { - type: "object" - }, - "output.annotations": { - type: "object[]" - }, - "output.annotations[].annotation_level": { - enum: ["notice", "warning", "failure"], - required: true, - type: "string" - }, - "output.annotations[].end_column": { - type: "integer" - }, - "output.annotations[].end_line": { - required: true, - type: "integer" - }, - "output.annotations[].message": { - required: true, - type: "string" - }, - "output.annotations[].path": { - required: true, - type: "string" - }, - "output.annotations[].raw_details": { - type: "string" - }, - "output.annotations[].start_column": { - type: "integer" - }, - "output.annotations[].start_line": { - required: true, - type: "integer" - }, - "output.annotations[].title": { - type: "string" - }, - "output.images": { - type: "object[]" - }, - "output.images[].alt": { - required: true, - type: "string" - }, - "output.images[].caption": { - type: "string" - }, - "output.images[].image_url": { - required: true, - type: "string" - }, - "output.summary": { - required: true, - type: "string" - }, - "output.text": { - type: "string" - }, - "output.title": { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - started_at: { - type: "string" - }, - status: { - enum: ["queued", "in_progress", "completed"], - type: "string" - } - }, - url: "/repos/:owner/:repo/check-runs" - }, - createSuite: { - headers: { - accept: "application/vnd.github.antiope-preview+json" - }, - method: "POST", - params: { - head_sha: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/check-suites" - }, - get: { - headers: { - accept: "application/vnd.github.antiope-preview+json" - }, - method: "GET", - params: { - check_run_id: { - required: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/check-runs/:check_run_id" - }, - getSuite: { - headers: { - accept: "application/vnd.github.antiope-preview+json" - }, - method: "GET", - params: { - check_suite_id: { - required: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/check-suites/:check_suite_id" - }, - listAnnotations: { - headers: { - accept: "application/vnd.github.antiope-preview+json" - }, - method: "GET", - params: { - check_run_id: { - required: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/check-runs/:check_run_id/annotations" - }, - listForRef: { - headers: { - accept: "application/vnd.github.antiope-preview+json" - }, - method: "GET", - params: { - check_name: { - type: "string" - }, - filter: { - enum: ["latest", "all"], - type: "string" - }, - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - ref: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - status: { - enum: ["queued", "in_progress", "completed"], - type: "string" - } - }, - url: "/repos/:owner/:repo/commits/:ref/check-runs" - }, - listForSuite: { - headers: { - accept: "application/vnd.github.antiope-preview+json" - }, - method: "GET", - params: { - check_name: { - type: "string" - }, - check_suite_id: { - required: true, - type: "integer" - }, - filter: { - enum: ["latest", "all"], - type: "string" - }, - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - }, - status: { - enum: ["queued", "in_progress", "completed"], - type: "string" - } - }, - url: "/repos/:owner/:repo/check-suites/:check_suite_id/check-runs" - }, - listSuitesForRef: { - headers: { - accept: "application/vnd.github.antiope-preview+json" - }, - method: "GET", - params: { - app_id: { - type: "integer" - }, - check_name: { - type: "string" - }, - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - ref: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/commits/:ref/check-suites" - }, - rerequestSuite: { - headers: { - accept: "application/vnd.github.antiope-preview+json" - }, - method: "POST", - params: { - check_suite_id: { - required: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/check-suites/:check_suite_id/rerequest" - }, - setSuitesPreferences: { - headers: { - accept: "application/vnd.github.antiope-preview+json" - }, - method: "PATCH", - params: { - auto_trigger_checks: { - type: "object[]" - }, - "auto_trigger_checks[].app_id": { - required: true, - type: "integer" - }, - "auto_trigger_checks[].setting": { - required: true, - type: "boolean" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/check-suites/preferences" - }, - update: { - headers: { - accept: "application/vnd.github.antiope-preview+json" - }, - method: "PATCH", - params: { - actions: { - type: "object[]" - }, - "actions[].description": { - required: true, - type: "string" - }, - "actions[].identifier": { - required: true, - type: "string" - }, - "actions[].label": { - required: true, - type: "string" - }, - check_run_id: { - required: true, - type: "integer" - }, - completed_at: { - type: "string" - }, - conclusion: { - enum: ["success", "failure", "neutral", "cancelled", "timed_out", "action_required"], - type: "string" - }, - details_url: { - type: "string" - }, - external_id: { - type: "string" - }, - name: { - type: "string" - }, - output: { - type: "object" - }, - "output.annotations": { - type: "object[]" - }, - "output.annotations[].annotation_level": { - enum: ["notice", "warning", "failure"], - required: true, - type: "string" - }, - "output.annotations[].end_column": { - type: "integer" - }, - "output.annotations[].end_line": { - required: true, - type: "integer" - }, - "output.annotations[].message": { - required: true, - type: "string" - }, - "output.annotations[].path": { - required: true, - type: "string" - }, - "output.annotations[].raw_details": { - type: "string" - }, - "output.annotations[].start_column": { - type: "integer" - }, - "output.annotations[].start_line": { - required: true, - type: "integer" - }, - "output.annotations[].title": { - type: "string" - }, - "output.images": { - type: "object[]" - }, - "output.images[].alt": { - required: true, - type: "string" - }, - "output.images[].caption": { - type: "string" - }, - "output.images[].image_url": { - required: true, - type: "string" - }, - "output.summary": { - required: true, - type: "string" - }, - "output.text": { - type: "string" - }, - "output.title": { - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - started_at: { - type: "string" - }, - status: { - enum: ["queued", "in_progress", "completed"], - type: "string" - } - }, - url: "/repos/:owner/:repo/check-runs/:check_run_id" - } - }, - codesOfConduct: { - getConductCode: { - headers: { - accept: "application/vnd.github.scarlet-witch-preview+json" - }, - method: "GET", - params: { - key: { - required: true, - type: "string" - } - }, - url: "/codes_of_conduct/:key" - }, - getForRepo: { - headers: { - accept: "application/vnd.github.scarlet-witch-preview+json" - }, - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/community/code_of_conduct" - }, - listConductCodes: { - headers: { - accept: "application/vnd.github.scarlet-witch-preview+json" - }, - method: "GET", - params: {}, - url: "/codes_of_conduct" - } - }, - emojis: { - get: { - method: "GET", - params: {}, - url: "/emojis" - } - }, - gists: { - checkIsStarred: { - method: "GET", - params: { - gist_id: { - required: true, - type: "string" - } - }, - url: "/gists/:gist_id/star" - }, - create: { - method: "POST", - params: { - description: { - type: "string" - }, - files: { - required: true, - type: "object" - }, - "files.content": { - type: "string" - }, - public: { - type: "boolean" - } - }, - url: "/gists" - }, - createComment: { - method: "POST", - params: { - body: { - required: true, - type: "string" - }, - gist_id: { - required: true, - type: "string" - } - }, - url: "/gists/:gist_id/comments" - }, - delete: { - method: "DELETE", - params: { - gist_id: { - required: true, - type: "string" - } - }, - url: "/gists/:gist_id" - }, - deleteComment: { - method: "DELETE", - params: { - comment_id: { - required: true, - type: "integer" - }, - gist_id: { - required: true, - type: "string" - } - }, - url: "/gists/:gist_id/comments/:comment_id" - }, - fork: { - method: "POST", - params: { - gist_id: { - required: true, - type: "string" - } - }, - url: "/gists/:gist_id/forks" - }, - get: { - method: "GET", - params: { - gist_id: { - required: true, - type: "string" - } - }, - url: "/gists/:gist_id" - }, - getComment: { - method: "GET", - params: { - comment_id: { - required: true, - type: "integer" - }, - gist_id: { - required: true, - type: "string" - } - }, - url: "/gists/:gist_id/comments/:comment_id" - }, - getRevision: { - method: "GET", - params: { - gist_id: { - required: true, - type: "string" - }, - sha: { - required: true, - type: "string" - } - }, - url: "/gists/:gist_id/:sha" - }, - list: { - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - since: { - type: "string" - } - }, - url: "/gists" - }, - listComments: { - method: "GET", - params: { - gist_id: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - } - }, - url: "/gists/:gist_id/comments" - }, - listCommits: { - method: "GET", - params: { - gist_id: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - } - }, - url: "/gists/:gist_id/commits" - }, - listForks: { - method: "GET", - params: { - gist_id: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - } - }, - url: "/gists/:gist_id/forks" - }, - listPublic: { - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - since: { - type: "string" - } - }, - url: "/gists/public" - }, - listPublicForUser: { - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - since: { - type: "string" - }, - username: { - required: true, - type: "string" - } - }, - url: "/users/:username/gists" - }, - listStarred: { - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - since: { - type: "string" - } - }, - url: "/gists/starred" - }, - star: { - method: "PUT", - params: { - gist_id: { - required: true, - type: "string" - } - }, - url: "/gists/:gist_id/star" - }, - unstar: { - method: "DELETE", - params: { - gist_id: { - required: true, - type: "string" - } - }, - url: "/gists/:gist_id/star" - }, - update: { - method: "PATCH", - params: { - description: { - type: "string" - }, - files: { - type: "object" - }, - "files.content": { - type: "string" - }, - "files.filename": { - type: "string" - }, - gist_id: { - required: true, - type: "string" - } - }, - url: "/gists/:gist_id" - }, - updateComment: { - method: "PATCH", - params: { - body: { - required: true, - type: "string" - }, - comment_id: { - required: true, - type: "integer" - }, - gist_id: { - required: true, - type: "string" - } - }, - url: "/gists/:gist_id/comments/:comment_id" - } - }, - git: { - createBlob: { - method: "POST", - params: { - content: { - required: true, - type: "string" - }, - encoding: { - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/git/blobs" - }, - createCommit: { - method: "POST", - params: { - author: { - type: "object" - }, - "author.date": { - type: "string" - }, - "author.email": { - type: "string" - }, - "author.name": { - type: "string" - }, - committer: { - type: "object" - }, - "committer.date": { - type: "string" - }, - "committer.email": { - type: "string" - }, - "committer.name": { - type: "string" - }, - message: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - parents: { - required: true, - type: "string[]" - }, - repo: { - required: true, - type: "string" - }, - signature: { - type: "string" - }, - tree: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/git/commits" - }, - createRef: { - method: "POST", - params: { - owner: { - required: true, - type: "string" - }, - ref: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - sha: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/git/refs" - }, - createTag: { - method: "POST", - params: { - message: { - required: true, - type: "string" - }, - object: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - tag: { - required: true, - type: "string" - }, - tagger: { - type: "object" - }, - "tagger.date": { - type: "string" - }, - "tagger.email": { - type: "string" - }, - "tagger.name": { - type: "string" - }, - type: { - enum: ["commit", "tree", "blob"], - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/git/tags" - }, - createTree: { - method: "POST", - params: { - base_tree: { - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - tree: { - required: true, - type: "object[]" - }, - "tree[].content": { - type: "string" - }, - "tree[].mode": { - enum: ["100644", "100755", "040000", "160000", "120000"], - type: "string" - }, - "tree[].path": { - type: "string" - }, - "tree[].sha": { - allowNull: true, - type: "string" - }, - "tree[].type": { - enum: ["blob", "tree", "commit"], - type: "string" - } - }, - url: "/repos/:owner/:repo/git/trees" - }, - deleteRef: { - method: "DELETE", - params: { - owner: { - required: true, - type: "string" - }, - ref: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/git/refs/:ref" - }, - getBlob: { - method: "GET", - params: { - file_sha: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/git/blobs/:file_sha" - }, - getCommit: { - method: "GET", - params: { - commit_sha: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/git/commits/:commit_sha" - }, - getRef: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - ref: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/git/ref/:ref" - }, - getTag: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - tag_sha: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/git/tags/:tag_sha" - }, - getTree: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - recursive: { - enum: ["1"], - type: "integer" - }, - repo: { - required: true, - type: "string" - }, - tree_sha: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/git/trees/:tree_sha" - }, - listMatchingRefs: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - ref: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/git/matching-refs/:ref" - }, - listRefs: { - method: "GET", - params: { - namespace: { - type: "string" - }, - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/git/refs/:namespace" - }, - updateRef: { - method: "PATCH", - params: { - force: { - type: "boolean" - }, - owner: { - required: true, - type: "string" - }, - ref: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - sha: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/git/refs/:ref" - } - }, - gitignore: { - getTemplate: { - method: "GET", - params: { - name: { - required: true, - type: "string" - } - }, - url: "/gitignore/templates/:name" - }, - listTemplates: { - method: "GET", - params: {}, - url: "/gitignore/templates" - } - }, - interactions: { - addOrUpdateRestrictionsForOrg: { - headers: { - accept: "application/vnd.github.sombra-preview+json" - }, - method: "PUT", - params: { - limit: { - enum: ["existing_users", "contributors_only", "collaborators_only"], - required: true, - type: "string" - }, - org: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/interaction-limits" - }, - addOrUpdateRestrictionsForRepo: { - headers: { - accept: "application/vnd.github.sombra-preview+json" - }, - method: "PUT", - params: { - limit: { - enum: ["existing_users", "contributors_only", "collaborators_only"], - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/interaction-limits" - }, - getRestrictionsForOrg: { - headers: { - accept: "application/vnd.github.sombra-preview+json" - }, - method: "GET", - params: { - org: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/interaction-limits" - }, - getRestrictionsForRepo: { - headers: { - accept: "application/vnd.github.sombra-preview+json" - }, - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/interaction-limits" - }, - removeRestrictionsForOrg: { - headers: { - accept: "application/vnd.github.sombra-preview+json" - }, - method: "DELETE", - params: { - org: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/interaction-limits" - }, - removeRestrictionsForRepo: { - headers: { - accept: "application/vnd.github.sombra-preview+json" - }, - method: "DELETE", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/interaction-limits" - } - }, - issues: { - addAssignees: { - method: "POST", - params: { - assignees: { - type: "string[]" - }, - issue_number: { - required: true, - type: "integer" - }, - number: { - alias: "issue_number", - deprecated: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/issues/:issue_number/assignees" - }, - addLabels: { - method: "POST", - params: { - issue_number: { - required: true, - type: "integer" - }, - labels: { - required: true, - type: "string[]" - }, - number: { - alias: "issue_number", - deprecated: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/issues/:issue_number/labels" - }, - checkAssignee: { - method: "GET", - params: { - assignee: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/assignees/:assignee" - }, - create: { - method: "POST", - params: { - assignee: { - type: "string" - }, - assignees: { - type: "string[]" - }, - body: { - type: "string" - }, - labels: { - type: "string[]" - }, - milestone: { - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - title: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/issues" - }, - createComment: { - method: "POST", - params: { - body: { - required: true, - type: "string" - }, - issue_number: { - required: true, - type: "integer" - }, - number: { - alias: "issue_number", - deprecated: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/issues/:issue_number/comments" - }, - createLabel: { - method: "POST", - params: { - color: { - required: true, - type: "string" - }, - description: { - type: "string" - }, - name: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/labels" - }, - createMilestone: { - method: "POST", - params: { - description: { - type: "string" - }, - due_on: { - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - state: { - enum: ["open", "closed"], - type: "string" - }, - title: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/milestones" - }, - deleteComment: { - method: "DELETE", - params: { - comment_id: { - required: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/issues/comments/:comment_id" - }, - deleteLabel: { - method: "DELETE", - params: { - name: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/labels/:name" - }, - deleteMilestone: { - method: "DELETE", - params: { - milestone_number: { - required: true, - type: "integer" - }, - number: { - alias: "milestone_number", - deprecated: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/milestones/:milestone_number" - }, - get: { - method: "GET", - params: { - issue_number: { - required: true, - type: "integer" - }, - number: { - alias: "issue_number", - deprecated: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/issues/:issue_number" - }, - getComment: { - method: "GET", - params: { - comment_id: { - required: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/issues/comments/:comment_id" - }, - getEvent: { - method: "GET", - params: { - event_id: { - required: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/issues/events/:event_id" - }, - getLabel: { - method: "GET", - params: { - name: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/labels/:name" - }, - getMilestone: { - method: "GET", - params: { - milestone_number: { - required: true, - type: "integer" - }, - number: { - alias: "milestone_number", - deprecated: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/milestones/:milestone_number" - }, - list: { - method: "GET", - params: { - direction: { - enum: ["asc", "desc"], - type: "string" - }, - filter: { - enum: ["assigned", "created", "mentioned", "subscribed", "all"], - type: "string" - }, - labels: { - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - since: { - type: "string" - }, - sort: { - enum: ["created", "updated", "comments"], - type: "string" - }, - state: { - enum: ["open", "closed", "all"], - type: "string" - } - }, - url: "/issues" - }, - listAssignees: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/assignees" - }, - listComments: { - method: "GET", - params: { - issue_number: { - required: true, - type: "integer" - }, - number: { - alias: "issue_number", - deprecated: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - }, - since: { - type: "string" - } - }, - url: "/repos/:owner/:repo/issues/:issue_number/comments" - }, - listCommentsForRepo: { - method: "GET", - params: { - direction: { - enum: ["asc", "desc"], - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - since: { - type: "string" - }, - sort: { - enum: ["created", "updated"], - type: "string" - } - }, - url: "/repos/:owner/:repo/issues/comments" - }, - listEvents: { - method: "GET", - params: { - issue_number: { - required: true, - type: "integer" - }, - number: { - alias: "issue_number", - deprecated: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/issues/:issue_number/events" - }, - listEventsForRepo: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/issues/events" - }, - listEventsForTimeline: { - headers: { - accept: "application/vnd.github.mockingbird-preview+json" - }, - method: "GET", - params: { - issue_number: { - required: true, - type: "integer" - }, - number: { - alias: "issue_number", - deprecated: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/issues/:issue_number/timeline" - }, - listForAuthenticatedUser: { - method: "GET", - params: { - direction: { - enum: ["asc", "desc"], - type: "string" - }, - filter: { - enum: ["assigned", "created", "mentioned", "subscribed", "all"], - type: "string" - }, - labels: { - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - since: { - type: "string" - }, - sort: { - enum: ["created", "updated", "comments"], - type: "string" - }, - state: { - enum: ["open", "closed", "all"], - type: "string" - } - }, - url: "/user/issues" - }, - listForOrg: { - method: "GET", - params: { - direction: { - enum: ["asc", "desc"], - type: "string" - }, - filter: { - enum: ["assigned", "created", "mentioned", "subscribed", "all"], - type: "string" - }, - labels: { - type: "string" - }, - org: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - since: { - type: "string" - }, - sort: { - enum: ["created", "updated", "comments"], - type: "string" - }, - state: { - enum: ["open", "closed", "all"], - type: "string" - } - }, - url: "/orgs/:org/issues" - }, - listForRepo: { - method: "GET", - params: { - assignee: { - type: "string" - }, - creator: { - type: "string" - }, - direction: { - enum: ["asc", "desc"], - type: "string" - }, - labels: { - type: "string" - }, - mentioned: { - type: "string" - }, - milestone: { - type: "string" - }, - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - }, - since: { - type: "string" - }, - sort: { - enum: ["created", "updated", "comments"], - type: "string" - }, - state: { - enum: ["open", "closed", "all"], - type: "string" - } - }, - url: "/repos/:owner/:repo/issues" - }, - listLabelsForMilestone: { - method: "GET", - params: { - milestone_number: { - required: true, - type: "integer" - }, - number: { - alias: "milestone_number", - deprecated: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/milestones/:milestone_number/labels" - }, - listLabelsForRepo: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/labels" - }, - listLabelsOnIssue: { - method: "GET", - params: { - issue_number: { - required: true, - type: "integer" - }, - number: { - alias: "issue_number", - deprecated: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/issues/:issue_number/labels" - }, - listMilestonesForRepo: { - method: "GET", - params: { - direction: { - enum: ["asc", "desc"], - type: "string" - }, - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - }, - sort: { - enum: ["due_on", "completeness"], - type: "string" - }, - state: { - enum: ["open", "closed", "all"], - type: "string" - } - }, - url: "/repos/:owner/:repo/milestones" - }, - lock: { - method: "PUT", - params: { - issue_number: { - required: true, - type: "integer" - }, - lock_reason: { - enum: ["off-topic", "too heated", "resolved", "spam"], - type: "string" - }, - number: { - alias: "issue_number", - deprecated: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/issues/:issue_number/lock" - }, - removeAssignees: { - method: "DELETE", - params: { - assignees: { - type: "string[]" - }, - issue_number: { - required: true, - type: "integer" - }, - number: { - alias: "issue_number", - deprecated: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/issues/:issue_number/assignees" - }, - removeLabel: { - method: "DELETE", - params: { - issue_number: { - required: true, - type: "integer" - }, - name: { - required: true, - type: "string" - }, - number: { - alias: "issue_number", - deprecated: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/issues/:issue_number/labels/:name" - }, - removeLabels: { - method: "DELETE", - params: { - issue_number: { - required: true, - type: "integer" - }, - number: { - alias: "issue_number", - deprecated: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/issues/:issue_number/labels" - }, - replaceLabels: { - method: "PUT", - params: { - issue_number: { - required: true, - type: "integer" - }, - labels: { - type: "string[]" - }, - number: { - alias: "issue_number", - deprecated: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/issues/:issue_number/labels" - }, - unlock: { - method: "DELETE", - params: { - issue_number: { - required: true, - type: "integer" - }, - number: { - alias: "issue_number", - deprecated: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/issues/:issue_number/lock" - }, - update: { - method: "PATCH", - params: { - assignee: { - type: "string" - }, - assignees: { - type: "string[]" - }, - body: { - type: "string" - }, - issue_number: { - required: true, - type: "integer" - }, - labels: { - type: "string[]" - }, - milestone: { - allowNull: true, - type: "integer" - }, - number: { - alias: "issue_number", - deprecated: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - state: { - enum: ["open", "closed"], - type: "string" - }, - title: { - type: "string" - } - }, - url: "/repos/:owner/:repo/issues/:issue_number" - }, - updateComment: { - method: "PATCH", - params: { - body: { - required: true, - type: "string" - }, - comment_id: { - required: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/issues/comments/:comment_id" - }, - updateLabel: { - method: "PATCH", - params: { - color: { - type: "string" - }, - current_name: { - required: true, - type: "string" - }, - description: { - type: "string" - }, - name: { - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/labels/:current_name" - }, - updateMilestone: { - method: "PATCH", - params: { - description: { - type: "string" - }, - due_on: { - type: "string" - }, - milestone_number: { - required: true, - type: "integer" - }, - number: { - alias: "milestone_number", - deprecated: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - state: { - enum: ["open", "closed"], - type: "string" - }, - title: { - type: "string" - } - }, - url: "/repos/:owner/:repo/milestones/:milestone_number" - } - }, - licenses: { - get: { - method: "GET", - params: { - license: { - required: true, - type: "string" - } - }, - url: "/licenses/:license" - }, - getForRepo: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/license" - }, - list: { - deprecated: "octokit.licenses.list() has been renamed to octokit.licenses.listCommonlyUsed() (2019-03-05)", - method: "GET", - params: {}, - url: "/licenses" - }, - listCommonlyUsed: { - method: "GET", - params: {}, - url: "/licenses" - } - }, - markdown: { - render: { - method: "POST", - params: { - context: { - type: "string" - }, - mode: { - enum: ["markdown", "gfm"], - type: "string" - }, - text: { - required: true, - type: "string" - } - }, - url: "/markdown" - }, - renderRaw: { - headers: { - "content-type": "text/plain; charset=utf-8" - }, - method: "POST", - params: { - data: { - mapTo: "data", - required: true, - type: "string" - } - }, - url: "/markdown/raw" - } - }, - meta: { - get: { - method: "GET", - params: {}, - url: "/meta" - } - }, - migrations: { - cancelImport: { - method: "DELETE", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/import" - }, - deleteArchiveForAuthenticatedUser: { - headers: { - accept: "application/vnd.github.wyandotte-preview+json" - }, - method: "DELETE", - params: { - migration_id: { - required: true, - type: "integer" - } - }, - url: "/user/migrations/:migration_id/archive" - }, - deleteArchiveForOrg: { - headers: { - accept: "application/vnd.github.wyandotte-preview+json" - }, - method: "DELETE", - params: { - migration_id: { - required: true, - type: "integer" - }, - org: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/migrations/:migration_id/archive" - }, - downloadArchiveForOrg: { - headers: { - accept: "application/vnd.github.wyandotte-preview+json" - }, - method: "GET", - params: { - migration_id: { - required: true, - type: "integer" - }, - org: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/migrations/:migration_id/archive" - }, - getArchiveForAuthenticatedUser: { - headers: { - accept: "application/vnd.github.wyandotte-preview+json" - }, - method: "GET", - params: { - migration_id: { - required: true, - type: "integer" - } - }, - url: "/user/migrations/:migration_id/archive" - }, - getArchiveForOrg: { - deprecated: "octokit.migrations.getArchiveForOrg() has been renamed to octokit.migrations.downloadArchiveForOrg() (2020-01-27)", - headers: { - accept: "application/vnd.github.wyandotte-preview+json" - }, - method: "GET", - params: { - migration_id: { - required: true, - type: "integer" - }, - org: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/migrations/:migration_id/archive" - }, - getCommitAuthors: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - since: { - type: "string" - } - }, - url: "/repos/:owner/:repo/import/authors" - }, - getImportProgress: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/import" - }, - getLargeFiles: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/import/large_files" - }, - getStatusForAuthenticatedUser: { - headers: { - accept: "application/vnd.github.wyandotte-preview+json" - }, - method: "GET", - params: { - migration_id: { - required: true, - type: "integer" - } - }, - url: "/user/migrations/:migration_id" - }, - getStatusForOrg: { - headers: { - accept: "application/vnd.github.wyandotte-preview+json" - }, - method: "GET", - params: { - migration_id: { - required: true, - type: "integer" - }, - org: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/migrations/:migration_id" - }, - listForAuthenticatedUser: { - headers: { - accept: "application/vnd.github.wyandotte-preview+json" - }, - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - } - }, - url: "/user/migrations" - }, - listForOrg: { - headers: { - accept: "application/vnd.github.wyandotte-preview+json" - }, - method: "GET", - params: { - org: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - } - }, - url: "/orgs/:org/migrations" - }, - listReposForOrg: { - headers: { - accept: "application/vnd.github.wyandotte-preview+json" - }, - method: "GET", - params: { - migration_id: { - required: true, - type: "integer" - }, - org: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - } - }, - url: "/orgs/:org/migrations/:migration_id/repositories" - }, - listReposForUser: { - headers: { - accept: "application/vnd.github.wyandotte-preview+json" - }, - method: "GET", - params: { - migration_id: { - required: true, - type: "integer" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - } - }, - url: "/user/:migration_id/repositories" - }, - mapCommitAuthor: { - method: "PATCH", - params: { - author_id: { - required: true, - type: "integer" - }, - email: { - type: "string" - }, - name: { - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/import/authors/:author_id" - }, - setLfsPreference: { - method: "PATCH", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - use_lfs: { - enum: ["opt_in", "opt_out"], - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/import/lfs" - }, - startForAuthenticatedUser: { - method: "POST", - params: { - exclude_attachments: { - type: "boolean" - }, - lock_repositories: { - type: "boolean" - }, - repositories: { - required: true, - type: "string[]" - } - }, - url: "/user/migrations" - }, - startForOrg: { - method: "POST", - params: { - exclude_attachments: { - type: "boolean" - }, - lock_repositories: { - type: "boolean" - }, - org: { - required: true, - type: "string" - }, - repositories: { - required: true, - type: "string[]" - } - }, - url: "/orgs/:org/migrations" - }, - startImport: { - method: "PUT", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - tfvc_project: { - type: "string" - }, - vcs: { - enum: ["subversion", "git", "mercurial", "tfvc"], - type: "string" - }, - vcs_password: { - type: "string" - }, - vcs_url: { - required: true, - type: "string" - }, - vcs_username: { - type: "string" - } - }, - url: "/repos/:owner/:repo/import" - }, - unlockRepoForAuthenticatedUser: { - headers: { - accept: "application/vnd.github.wyandotte-preview+json" - }, - method: "DELETE", - params: { - migration_id: { - required: true, - type: "integer" - }, - repo_name: { - required: true, - type: "string" - } - }, - url: "/user/migrations/:migration_id/repos/:repo_name/lock" - }, - unlockRepoForOrg: { - headers: { - accept: "application/vnd.github.wyandotte-preview+json" - }, - method: "DELETE", - params: { - migration_id: { - required: true, - type: "integer" - }, - org: { - required: true, - type: "string" - }, - repo_name: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/migrations/:migration_id/repos/:repo_name/lock" - }, - updateImport: { - method: "PATCH", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - vcs_password: { - type: "string" - }, - vcs_username: { - type: "string" - } - }, - url: "/repos/:owner/:repo/import" - } - }, - oauthAuthorizations: { - checkAuthorization: { - deprecated: "octokit.oauthAuthorizations.checkAuthorization() has been renamed to octokit.apps.checkAuthorization() (2019-11-05)", - method: "GET", - params: { - access_token: { - required: true, - type: "string" - }, - client_id: { - required: true, - type: "string" - } - }, - url: "/applications/:client_id/tokens/:access_token" - }, - createAuthorization: { - deprecated: "octokit.oauthAuthorizations.createAuthorization() is deprecated, see https://developer.github.com/v3/oauth_authorizations/#create-a-new-authorization", - method: "POST", - params: { - client_id: { - type: "string" - }, - client_secret: { - type: "string" - }, - fingerprint: { - type: "string" - }, - note: { - required: true, - type: "string" - }, - note_url: { - type: "string" - }, - scopes: { - type: "string[]" - } - }, - url: "/authorizations" - }, - deleteAuthorization: { - deprecated: "octokit.oauthAuthorizations.deleteAuthorization() is deprecated, see https://developer.github.com/v3/oauth_authorizations/#delete-an-authorization", - method: "DELETE", - params: { - authorization_id: { - required: true, - type: "integer" - } - }, - url: "/authorizations/:authorization_id" - }, - deleteGrant: { - deprecated: "octokit.oauthAuthorizations.deleteGrant() is deprecated, see https://developer.github.com/v3/oauth_authorizations/#delete-a-grant", - method: "DELETE", - params: { - grant_id: { - required: true, - type: "integer" - } - }, - url: "/applications/grants/:grant_id" - }, - getAuthorization: { - deprecated: "octokit.oauthAuthorizations.getAuthorization() is deprecated, see https://developer.github.com/v3/oauth_authorizations/#get-a-single-authorization", - method: "GET", - params: { - authorization_id: { - required: true, - type: "integer" - } - }, - url: "/authorizations/:authorization_id" - }, - getGrant: { - deprecated: "octokit.oauthAuthorizations.getGrant() is deprecated, see https://developer.github.com/v3/oauth_authorizations/#get-a-single-grant", - method: "GET", - params: { - grant_id: { - required: true, - type: "integer" - } - }, - url: "/applications/grants/:grant_id" - }, - getOrCreateAuthorizationForApp: { - deprecated: "octokit.oauthAuthorizations.getOrCreateAuthorizationForApp() is deprecated, see https://developer.github.com/v3/oauth_authorizations/#get-or-create-an-authorization-for-a-specific-app", - method: "PUT", - params: { - client_id: { - required: true, - type: "string" - }, - client_secret: { - required: true, - type: "string" - }, - fingerprint: { - type: "string" - }, - note: { - type: "string" - }, - note_url: { - type: "string" - }, - scopes: { - type: "string[]" - } - }, - url: "/authorizations/clients/:client_id" - }, - getOrCreateAuthorizationForAppAndFingerprint: { - deprecated: "octokit.oauthAuthorizations.getOrCreateAuthorizationForAppAndFingerprint() is deprecated, see https://developer.github.com/v3/oauth_authorizations/#get-or-create-an-authorization-for-a-specific-app-and-fingerprint", - method: "PUT", - params: { - client_id: { - required: true, - type: "string" - }, - client_secret: { - required: true, - type: "string" - }, - fingerprint: { - required: true, - type: "string" - }, - note: { - type: "string" - }, - note_url: { - type: "string" - }, - scopes: { - type: "string[]" - } - }, - url: "/authorizations/clients/:client_id/:fingerprint" - }, - getOrCreateAuthorizationForAppFingerprint: { - deprecated: "octokit.oauthAuthorizations.getOrCreateAuthorizationForAppFingerprint() has been renamed to octokit.oauthAuthorizations.getOrCreateAuthorizationForAppAndFingerprint() (2018-12-27)", - method: "PUT", - params: { - client_id: { - required: true, - type: "string" - }, - client_secret: { - required: true, - type: "string" - }, - fingerprint: { - required: true, - type: "string" - }, - note: { - type: "string" - }, - note_url: { - type: "string" - }, - scopes: { - type: "string[]" - } - }, - url: "/authorizations/clients/:client_id/:fingerprint" - }, - listAuthorizations: { - deprecated: "octokit.oauthAuthorizations.listAuthorizations() is deprecated, see https://developer.github.com/v3/oauth_authorizations/#list-your-authorizations", - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - } - }, - url: "/authorizations" - }, - listGrants: { - deprecated: "octokit.oauthAuthorizations.listGrants() is deprecated, see https://developer.github.com/v3/oauth_authorizations/#list-your-grants", - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - } - }, - url: "/applications/grants" - }, - resetAuthorization: { - deprecated: "octokit.oauthAuthorizations.resetAuthorization() has been renamed to octokit.apps.resetAuthorization() (2019-11-05)", - method: "POST", - params: { - access_token: { - required: true, - type: "string" - }, - client_id: { - required: true, - type: "string" - } - }, - url: "/applications/:client_id/tokens/:access_token" - }, - revokeAuthorizationForApplication: { - deprecated: "octokit.oauthAuthorizations.revokeAuthorizationForApplication() has been renamed to octokit.apps.revokeAuthorizationForApplication() (2019-11-05)", - method: "DELETE", - params: { - access_token: { - required: true, - type: "string" - }, - client_id: { - required: true, - type: "string" - } - }, - url: "/applications/:client_id/tokens/:access_token" - }, - revokeGrantForApplication: { - deprecated: "octokit.oauthAuthorizations.revokeGrantForApplication() has been renamed to octokit.apps.revokeGrantForApplication() (2019-11-05)", - method: "DELETE", - params: { - access_token: { - required: true, - type: "string" - }, - client_id: { - required: true, - type: "string" - } - }, - url: "/applications/:client_id/grants/:access_token" - }, - updateAuthorization: { - deprecated: "octokit.oauthAuthorizations.updateAuthorization() is deprecated, see https://developer.github.com/v3/oauth_authorizations/#update-an-existing-authorization", - method: "PATCH", - params: { - add_scopes: { - type: "string[]" - }, - authorization_id: { - required: true, - type: "integer" - }, - fingerprint: { - type: "string" - }, - note: { - type: "string" - }, - note_url: { - type: "string" - }, - remove_scopes: { - type: "string[]" - }, - scopes: { - type: "string[]" - } - }, - url: "/authorizations/:authorization_id" - } - }, - orgs: { - addOrUpdateMembership: { - method: "PUT", - params: { - org: { - required: true, - type: "string" - }, - role: { - enum: ["admin", "member"], - type: "string" - }, - username: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/memberships/:username" - }, - blockUser: { - method: "PUT", - params: { - org: { - required: true, - type: "string" - }, - username: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/blocks/:username" - }, - checkBlockedUser: { - method: "GET", - params: { - org: { - required: true, - type: "string" - }, - username: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/blocks/:username" - }, - checkMembership: { - method: "GET", - params: { - org: { - required: true, - type: "string" - }, - username: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/members/:username" - }, - checkPublicMembership: { - method: "GET", - params: { - org: { - required: true, - type: "string" - }, - username: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/public_members/:username" - }, - concealMembership: { - method: "DELETE", - params: { - org: { - required: true, - type: "string" - }, - username: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/public_members/:username" - }, - convertMemberToOutsideCollaborator: { - method: "PUT", - params: { - org: { - required: true, - type: "string" - }, - username: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/outside_collaborators/:username" - }, - createHook: { - method: "POST", - params: { - active: { - type: "boolean" - }, - config: { - required: true, - type: "object" - }, - "config.content_type": { - type: "string" - }, - "config.insecure_ssl": { - type: "string" - }, - "config.secret": { - type: "string" - }, - "config.url": { - required: true, - type: "string" - }, - events: { - type: "string[]" - }, - name: { - required: true, - type: "string" - }, - org: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/hooks" - }, - createInvitation: { - method: "POST", - params: { - email: { - type: "string" - }, - invitee_id: { - type: "integer" - }, - org: { - required: true, - type: "string" - }, - role: { - enum: ["admin", "direct_member", "billing_manager"], - type: "string" - }, - team_ids: { - type: "integer[]" - } - }, - url: "/orgs/:org/invitations" - }, - deleteHook: { - method: "DELETE", - params: { - hook_id: { - required: true, - type: "integer" - }, - org: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/hooks/:hook_id" - }, - get: { - method: "GET", - params: { - org: { - required: true, - type: "string" - } - }, - url: "/orgs/:org" - }, - getHook: { - method: "GET", - params: { - hook_id: { - required: true, - type: "integer" - }, - org: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/hooks/:hook_id" - }, - getMembership: { - method: "GET", - params: { - org: { - required: true, - type: "string" - }, - username: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/memberships/:username" - }, - getMembershipForAuthenticatedUser: { - method: "GET", - params: { - org: { - required: true, - type: "string" - } - }, - url: "/user/memberships/orgs/:org" - }, - list: { - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - since: { - type: "integer" - } - }, - url: "/organizations" - }, - listBlockedUsers: { - method: "GET", - params: { - org: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/blocks" - }, - listForAuthenticatedUser: { - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - } - }, - url: "/user/orgs" - }, - listForUser: { - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - username: { - required: true, - type: "string" - } - }, - url: "/users/:username/orgs" - }, - listHooks: { - method: "GET", - params: { - org: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - } - }, - url: "/orgs/:org/hooks" - }, - listInstallations: { - headers: { - accept: "application/vnd.github.machine-man-preview+json" - }, - method: "GET", - params: { - org: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - } - }, - url: "/orgs/:org/installations" - }, - listInvitationTeams: { - method: "GET", - params: { - invitation_id: { - required: true, - type: "integer" - }, - org: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - } - }, - url: "/orgs/:org/invitations/:invitation_id/teams" - }, - listMembers: { - method: "GET", - params: { - filter: { - enum: ["2fa_disabled", "all"], - type: "string" - }, - org: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - role: { - enum: ["all", "admin", "member"], - type: "string" - } - }, - url: "/orgs/:org/members" - }, - listMemberships: { - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - state: { - enum: ["active", "pending"], - type: "string" - } - }, - url: "/user/memberships/orgs" - }, - listOutsideCollaborators: { - method: "GET", - params: { - filter: { - enum: ["2fa_disabled", "all"], - type: "string" - }, - org: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - } - }, - url: "/orgs/:org/outside_collaborators" - }, - listPendingInvitations: { - method: "GET", - params: { - org: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - } - }, - url: "/orgs/:org/invitations" - }, - listPublicMembers: { - method: "GET", - params: { - org: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - } - }, - url: "/orgs/:org/public_members" - }, - pingHook: { - method: "POST", - params: { - hook_id: { - required: true, - type: "integer" - }, - org: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/hooks/:hook_id/pings" - }, - publicizeMembership: { - method: "PUT", - params: { - org: { - required: true, - type: "string" - }, - username: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/public_members/:username" - }, - removeMember: { - method: "DELETE", - params: { - org: { - required: true, - type: "string" - }, - username: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/members/:username" - }, - removeMembership: { - method: "DELETE", - params: { - org: { - required: true, - type: "string" - }, - username: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/memberships/:username" - }, - removeOutsideCollaborator: { - method: "DELETE", - params: { - org: { - required: true, - type: "string" - }, - username: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/outside_collaborators/:username" - }, - unblockUser: { - method: "DELETE", - params: { - org: { - required: true, - type: "string" - }, - username: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/blocks/:username" - }, - update: { - method: "PATCH", - params: { - billing_email: { - type: "string" - }, - company: { - type: "string" - }, - default_repository_permission: { - enum: ["read", "write", "admin", "none"], - type: "string" - }, - description: { - type: "string" - }, - email: { - type: "string" - }, - has_organization_projects: { - type: "boolean" - }, - has_repository_projects: { - type: "boolean" - }, - location: { - type: "string" - }, - members_allowed_repository_creation_type: { - enum: ["all", "private", "none"], - type: "string" - }, - members_can_create_internal_repositories: { - type: "boolean" - }, - members_can_create_private_repositories: { - type: "boolean" - }, - members_can_create_public_repositories: { - type: "boolean" - }, - members_can_create_repositories: { - type: "boolean" - }, - name: { - type: "string" - }, - org: { - required: true, - type: "string" - } - }, - url: "/orgs/:org" - }, - updateHook: { - method: "PATCH", - params: { - active: { - type: "boolean" - }, - config: { - type: "object" - }, - "config.content_type": { - type: "string" - }, - "config.insecure_ssl": { - type: "string" - }, - "config.secret": { - type: "string" - }, - "config.url": { - required: true, - type: "string" - }, - events: { - type: "string[]" - }, - hook_id: { - required: true, - type: "integer" - }, - org: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/hooks/:hook_id" - }, - updateMembership: { - method: "PATCH", - params: { - org: { - required: true, - type: "string" - }, - state: { - enum: ["active"], - required: true, - type: "string" - } - }, - url: "/user/memberships/orgs/:org" - } - }, - projects: { - addCollaborator: { - headers: { - accept: "application/vnd.github.inertia-preview+json" - }, - method: "PUT", - params: { - permission: { - enum: ["read", "write", "admin"], - type: "string" - }, - project_id: { - required: true, - type: "integer" - }, - username: { - required: true, - type: "string" - } - }, - url: "/projects/:project_id/collaborators/:username" - }, - createCard: { - headers: { - accept: "application/vnd.github.inertia-preview+json" - }, - method: "POST", - params: { - column_id: { - required: true, - type: "integer" - }, - content_id: { - type: "integer" - }, - content_type: { - type: "string" - }, - note: { - type: "string" - } - }, - url: "/projects/columns/:column_id/cards" - }, - createColumn: { - headers: { - accept: "application/vnd.github.inertia-preview+json" - }, - method: "POST", - params: { - name: { - required: true, - type: "string" - }, - project_id: { - required: true, - type: "integer" - } - }, - url: "/projects/:project_id/columns" - }, - createForAuthenticatedUser: { - headers: { - accept: "application/vnd.github.inertia-preview+json" - }, - method: "POST", - params: { - body: { - type: "string" - }, - name: { - required: true, - type: "string" - } - }, - url: "/user/projects" - }, - createForOrg: { - headers: { - accept: "application/vnd.github.inertia-preview+json" - }, - method: "POST", - params: { - body: { - type: "string" - }, - name: { - required: true, - type: "string" - }, - org: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/projects" - }, - createForRepo: { - headers: { - accept: "application/vnd.github.inertia-preview+json" - }, - method: "POST", - params: { - body: { - type: "string" - }, - name: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/projects" - }, - delete: { - headers: { - accept: "application/vnd.github.inertia-preview+json" - }, - method: "DELETE", - params: { - project_id: { - required: true, - type: "integer" - } - }, - url: "/projects/:project_id" - }, - deleteCard: { - headers: { - accept: "application/vnd.github.inertia-preview+json" - }, - method: "DELETE", - params: { - card_id: { - required: true, - type: "integer" - } - }, - url: "/projects/columns/cards/:card_id" - }, - deleteColumn: { - headers: { - accept: "application/vnd.github.inertia-preview+json" - }, - method: "DELETE", - params: { - column_id: { - required: true, - type: "integer" - } - }, - url: "/projects/columns/:column_id" - }, - get: { - headers: { - accept: "application/vnd.github.inertia-preview+json" - }, - method: "GET", - params: { - project_id: { - required: true, - type: "integer" - } - }, - url: "/projects/:project_id" - }, - getCard: { - headers: { - accept: "application/vnd.github.inertia-preview+json" - }, - method: "GET", - params: { - card_id: { - required: true, - type: "integer" - } - }, - url: "/projects/columns/cards/:card_id" - }, - getColumn: { - headers: { - accept: "application/vnd.github.inertia-preview+json" - }, - method: "GET", - params: { - column_id: { - required: true, - type: "integer" - } - }, - url: "/projects/columns/:column_id" - }, - listCards: { - headers: { - accept: "application/vnd.github.inertia-preview+json" - }, - method: "GET", - params: { - archived_state: { - enum: ["all", "archived", "not_archived"], - type: "string" - }, - column_id: { - required: true, - type: "integer" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - } - }, - url: "/projects/columns/:column_id/cards" - }, - listCollaborators: { - headers: { - accept: "application/vnd.github.inertia-preview+json" - }, - method: "GET", - params: { - affiliation: { - enum: ["outside", "direct", "all"], - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - project_id: { - required: true, - type: "integer" - } - }, - url: "/projects/:project_id/collaborators" - }, - listColumns: { - headers: { - accept: "application/vnd.github.inertia-preview+json" - }, - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - project_id: { - required: true, - type: "integer" - } - }, - url: "/projects/:project_id/columns" - }, - listForOrg: { - headers: { - accept: "application/vnd.github.inertia-preview+json" - }, - method: "GET", - params: { - org: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - state: { - enum: ["open", "closed", "all"], - type: "string" - } - }, - url: "/orgs/:org/projects" - }, - listForRepo: { - headers: { - accept: "application/vnd.github.inertia-preview+json" - }, - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - }, - state: { - enum: ["open", "closed", "all"], - type: "string" - } - }, - url: "/repos/:owner/:repo/projects" - }, - listForUser: { - headers: { - accept: "application/vnd.github.inertia-preview+json" - }, - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - state: { - enum: ["open", "closed", "all"], - type: "string" - }, - username: { - required: true, - type: "string" - } - }, - url: "/users/:username/projects" - }, - moveCard: { - headers: { - accept: "application/vnd.github.inertia-preview+json" - }, - method: "POST", - params: { - card_id: { - required: true, - type: "integer" - }, - column_id: { - type: "integer" - }, - position: { - required: true, - type: "string", - validation: "^(top|bottom|after:\\d+)$" - } - }, - url: "/projects/columns/cards/:card_id/moves" - }, - moveColumn: { - headers: { - accept: "application/vnd.github.inertia-preview+json" - }, - method: "POST", - params: { - column_id: { - required: true, - type: "integer" - }, - position: { - required: true, - type: "string", - validation: "^(first|last|after:\\d+)$" - } - }, - url: "/projects/columns/:column_id/moves" - }, - removeCollaborator: { - headers: { - accept: "application/vnd.github.inertia-preview+json" - }, - method: "DELETE", - params: { - project_id: { - required: true, - type: "integer" - }, - username: { - required: true, - type: "string" - } - }, - url: "/projects/:project_id/collaborators/:username" - }, - reviewUserPermissionLevel: { - headers: { - accept: "application/vnd.github.inertia-preview+json" - }, - method: "GET", - params: { - project_id: { - required: true, - type: "integer" - }, - username: { - required: true, - type: "string" - } - }, - url: "/projects/:project_id/collaborators/:username/permission" - }, - update: { - headers: { - accept: "application/vnd.github.inertia-preview+json" - }, - method: "PATCH", - params: { - body: { - type: "string" - }, - name: { - type: "string" - }, - organization_permission: { - type: "string" - }, - private: { - type: "boolean" - }, - project_id: { - required: true, - type: "integer" - }, - state: { - enum: ["open", "closed"], - type: "string" - } - }, - url: "/projects/:project_id" - }, - updateCard: { - headers: { - accept: "application/vnd.github.inertia-preview+json" - }, - method: "PATCH", - params: { - archived: { - type: "boolean" - }, - card_id: { - required: true, - type: "integer" - }, - note: { - type: "string" - } - }, - url: "/projects/columns/cards/:card_id" - }, - updateColumn: { - headers: { - accept: "application/vnd.github.inertia-preview+json" - }, - method: "PATCH", - params: { - column_id: { - required: true, - type: "integer" - }, - name: { - required: true, - type: "string" - } - }, - url: "/projects/columns/:column_id" - } - }, - pulls: { - checkIfMerged: { - method: "GET", - params: { - number: { - alias: "pull_number", - deprecated: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - pull_number: { - required: true, - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/pulls/:pull_number/merge" - }, - create: { - method: "POST", - params: { - base: { - required: true, - type: "string" - }, - body: { - type: "string" - }, - draft: { - type: "boolean" - }, - head: { - required: true, - type: "string" - }, - maintainer_can_modify: { - type: "boolean" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - title: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/pulls" - }, - createComment: { - method: "POST", - params: { - body: { - required: true, - type: "string" - }, - commit_id: { - required: true, - type: "string" - }, - in_reply_to: { - deprecated: true, - description: "The comment ID to reply to. **Note**: This must be the ID of a top-level comment, not a reply to that comment. Replies to replies are not supported.", - type: "integer" - }, - line: { - type: "integer" - }, - number: { - alias: "pull_number", - deprecated: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - path: { - required: true, - type: "string" - }, - position: { - type: "integer" - }, - pull_number: { - required: true, - type: "integer" - }, - repo: { - required: true, - type: "string" - }, - side: { - enum: ["LEFT", "RIGHT"], - type: "string" - }, - start_line: { - type: "integer" - }, - start_side: { - enum: ["LEFT", "RIGHT", "side"], - type: "string" - } - }, - url: "/repos/:owner/:repo/pulls/:pull_number/comments" - }, - createCommentReply: { - deprecated: "octokit.pulls.createCommentReply() has been renamed to octokit.pulls.createComment() (2019-09-09)", - method: "POST", - params: { - body: { - required: true, - type: "string" - }, - commit_id: { - required: true, - type: "string" - }, - in_reply_to: { - deprecated: true, - description: "The comment ID to reply to. **Note**: This must be the ID of a top-level comment, not a reply to that comment. Replies to replies are not supported.", - type: "integer" - }, - line: { - type: "integer" - }, - number: { - alias: "pull_number", - deprecated: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - path: { - required: true, - type: "string" - }, - position: { - type: "integer" - }, - pull_number: { - required: true, - type: "integer" - }, - repo: { - required: true, - type: "string" - }, - side: { - enum: ["LEFT", "RIGHT"], - type: "string" - }, - start_line: { - type: "integer" - }, - start_side: { - enum: ["LEFT", "RIGHT", "side"], - type: "string" - } - }, - url: "/repos/:owner/:repo/pulls/:pull_number/comments" - }, - createFromIssue: { - deprecated: "octokit.pulls.createFromIssue() is deprecated, see https://developer.github.com/v3/pulls/#create-a-pull-request", - method: "POST", - params: { - base: { - required: true, - type: "string" - }, - draft: { - type: "boolean" - }, - head: { - required: true, - type: "string" - }, - issue: { - required: true, - type: "integer" - }, - maintainer_can_modify: { - type: "boolean" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/pulls" - }, - createReview: { - method: "POST", - params: { - body: { - type: "string" - }, - comments: { - type: "object[]" - }, - "comments[].body": { - required: true, - type: "string" - }, - "comments[].path": { - required: true, - type: "string" - }, - "comments[].position": { - required: true, - type: "integer" - }, - commit_id: { - type: "string" - }, - event: { - enum: ["APPROVE", "REQUEST_CHANGES", "COMMENT"], - type: "string" - }, - number: { - alias: "pull_number", - deprecated: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - pull_number: { - required: true, - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/pulls/:pull_number/reviews" - }, - createReviewCommentReply: { - method: "POST", - params: { - body: { - required: true, - type: "string" - }, - comment_id: { - required: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - pull_number: { - required: true, - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/pulls/:pull_number/comments/:comment_id/replies" - }, - createReviewRequest: { - method: "POST", - params: { - number: { - alias: "pull_number", - deprecated: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - pull_number: { - required: true, - type: "integer" - }, - repo: { - required: true, - type: "string" - }, - reviewers: { - type: "string[]" - }, - team_reviewers: { - type: "string[]" - } - }, - url: "/repos/:owner/:repo/pulls/:pull_number/requested_reviewers" - }, - deleteComment: { - method: "DELETE", - params: { - comment_id: { - required: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/pulls/comments/:comment_id" - }, - deletePendingReview: { - method: "DELETE", - params: { - number: { - alias: "pull_number", - deprecated: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - pull_number: { - required: true, - type: "integer" - }, - repo: { - required: true, - type: "string" - }, - review_id: { - required: true, - type: "integer" - } - }, - url: "/repos/:owner/:repo/pulls/:pull_number/reviews/:review_id" - }, - deleteReviewRequest: { - method: "DELETE", - params: { - number: { - alias: "pull_number", - deprecated: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - pull_number: { - required: true, - type: "integer" - }, - repo: { - required: true, - type: "string" - }, - reviewers: { - type: "string[]" - }, - team_reviewers: { - type: "string[]" - } - }, - url: "/repos/:owner/:repo/pulls/:pull_number/requested_reviewers" - }, - dismissReview: { - method: "PUT", - params: { - message: { - required: true, - type: "string" - }, - number: { - alias: "pull_number", - deprecated: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - pull_number: { - required: true, - type: "integer" - }, - repo: { - required: true, - type: "string" - }, - review_id: { - required: true, - type: "integer" - } - }, - url: "/repos/:owner/:repo/pulls/:pull_number/reviews/:review_id/dismissals" - }, - get: { - method: "GET", - params: { - number: { - alias: "pull_number", - deprecated: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - pull_number: { - required: true, - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/pulls/:pull_number" - }, - getComment: { - method: "GET", - params: { - comment_id: { - required: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/pulls/comments/:comment_id" - }, - getCommentsForReview: { - method: "GET", - params: { - number: { - alias: "pull_number", - deprecated: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - pull_number: { - required: true, - type: "integer" - }, - repo: { - required: true, - type: "string" - }, - review_id: { - required: true, - type: "integer" - } - }, - url: "/repos/:owner/:repo/pulls/:pull_number/reviews/:review_id/comments" - }, - getReview: { - method: "GET", - params: { - number: { - alias: "pull_number", - deprecated: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - pull_number: { - required: true, - type: "integer" - }, - repo: { - required: true, - type: "string" - }, - review_id: { - required: true, - type: "integer" - } - }, - url: "/repos/:owner/:repo/pulls/:pull_number/reviews/:review_id" - }, - list: { - method: "GET", - params: { - base: { - type: "string" - }, - direction: { - enum: ["asc", "desc"], - type: "string" - }, - head: { - type: "string" - }, - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - }, - sort: { - enum: ["created", "updated", "popularity", "long-running"], - type: "string" - }, - state: { - enum: ["open", "closed", "all"], - type: "string" - } - }, - url: "/repos/:owner/:repo/pulls" - }, - listComments: { - method: "GET", - params: { - direction: { - enum: ["asc", "desc"], - type: "string" - }, - number: { - alias: "pull_number", - deprecated: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - pull_number: { - required: true, - type: "integer" - }, - repo: { - required: true, - type: "string" - }, - since: { - type: "string" - }, - sort: { - enum: ["created", "updated"], - type: "string" - } - }, - url: "/repos/:owner/:repo/pulls/:pull_number/comments" - }, - listCommentsForRepo: { - method: "GET", - params: { - direction: { - enum: ["asc", "desc"], - type: "string" - }, - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - }, - since: { - type: "string" - }, - sort: { - enum: ["created", "updated"], - type: "string" - } - }, - url: "/repos/:owner/:repo/pulls/comments" - }, - listCommits: { - method: "GET", - params: { - number: { - alias: "pull_number", - deprecated: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - pull_number: { - required: true, - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/pulls/:pull_number/commits" - }, - listFiles: { - method: "GET", - params: { - number: { - alias: "pull_number", - deprecated: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - pull_number: { - required: true, - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/pulls/:pull_number/files" - }, - listReviewRequests: { - method: "GET", - params: { - number: { - alias: "pull_number", - deprecated: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - pull_number: { - required: true, - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/pulls/:pull_number/requested_reviewers" - }, - listReviews: { - method: "GET", - params: { - number: { - alias: "pull_number", - deprecated: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - pull_number: { - required: true, - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/pulls/:pull_number/reviews" - }, - merge: { - method: "PUT", - params: { - commit_message: { - type: "string" - }, - commit_title: { - type: "string" - }, - merge_method: { - enum: ["merge", "squash", "rebase"], - type: "string" - }, - number: { - alias: "pull_number", - deprecated: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - pull_number: { - required: true, - type: "integer" - }, - repo: { - required: true, - type: "string" - }, - sha: { - type: "string" - } - }, - url: "/repos/:owner/:repo/pulls/:pull_number/merge" - }, - submitReview: { - method: "POST", - params: { - body: { - type: "string" - }, - event: { - enum: ["APPROVE", "REQUEST_CHANGES", "COMMENT"], - required: true, - type: "string" - }, - number: { - alias: "pull_number", - deprecated: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - pull_number: { - required: true, - type: "integer" - }, - repo: { - required: true, - type: "string" - }, - review_id: { - required: true, - type: "integer" - } - }, - url: "/repos/:owner/:repo/pulls/:pull_number/reviews/:review_id/events" - }, - update: { - method: "PATCH", - params: { - base: { - type: "string" - }, - body: { - type: "string" - }, - maintainer_can_modify: { - type: "boolean" - }, - number: { - alias: "pull_number", - deprecated: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - pull_number: { - required: true, - type: "integer" - }, - repo: { - required: true, - type: "string" - }, - state: { - enum: ["open", "closed"], - type: "string" - }, - title: { - type: "string" - } - }, - url: "/repos/:owner/:repo/pulls/:pull_number" - }, - updateBranch: { - headers: { - accept: "application/vnd.github.lydian-preview+json" - }, - method: "PUT", - params: { - expected_head_sha: { - type: "string" - }, - owner: { - required: true, - type: "string" - }, - pull_number: { - required: true, - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/pulls/:pull_number/update-branch" - }, - updateComment: { - method: "PATCH", - params: { - body: { - required: true, - type: "string" - }, - comment_id: { - required: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/pulls/comments/:comment_id" - }, - updateReview: { - method: "PUT", - params: { - body: { - required: true, - type: "string" - }, - number: { - alias: "pull_number", - deprecated: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - pull_number: { - required: true, - type: "integer" - }, - repo: { - required: true, - type: "string" - }, - review_id: { - required: true, - type: "integer" - } - }, - url: "/repos/:owner/:repo/pulls/:pull_number/reviews/:review_id" - } - }, - rateLimit: { - get: { - method: "GET", - params: {}, - url: "/rate_limit" - } - }, - reactions: { - createForCommitComment: { - headers: { - accept: "application/vnd.github.squirrel-girl-preview+json" - }, - method: "POST", - params: { - comment_id: { - required: true, - type: "integer" - }, - content: { - enum: ["+1", "-1", "laugh", "confused", "heart", "hooray", "rocket", "eyes"], - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/comments/:comment_id/reactions" - }, - createForIssue: { - headers: { - accept: "application/vnd.github.squirrel-girl-preview+json" - }, - method: "POST", - params: { - content: { - enum: ["+1", "-1", "laugh", "confused", "heart", "hooray", "rocket", "eyes"], - required: true, - type: "string" - }, - issue_number: { - required: true, - type: "integer" - }, - number: { - alias: "issue_number", - deprecated: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/issues/:issue_number/reactions" - }, - createForIssueComment: { - headers: { - accept: "application/vnd.github.squirrel-girl-preview+json" - }, - method: "POST", - params: { - comment_id: { - required: true, - type: "integer" - }, - content: { - enum: ["+1", "-1", "laugh", "confused", "heart", "hooray", "rocket", "eyes"], - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/issues/comments/:comment_id/reactions" - }, - createForPullRequestReviewComment: { - headers: { - accept: "application/vnd.github.squirrel-girl-preview+json" - }, - method: "POST", - params: { - comment_id: { - required: true, - type: "integer" - }, - content: { - enum: ["+1", "-1", "laugh", "confused", "heart", "hooray", "rocket", "eyes"], - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/pulls/comments/:comment_id/reactions" - }, - createForTeamDiscussion: { - deprecated: "octokit.reactions.createForTeamDiscussion() has been renamed to octokit.reactions.createForTeamDiscussionLegacy() (2020-01-16)", - headers: { - accept: "application/vnd.github.squirrel-girl-preview+json" - }, - method: "POST", - params: { - content: { - enum: ["+1", "-1", "laugh", "confused", "heart", "hooray", "rocket", "eyes"], - required: true, - type: "string" - }, - discussion_number: { - required: true, - type: "integer" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/discussions/:discussion_number/reactions" - }, - createForTeamDiscussionComment: { - deprecated: "octokit.reactions.createForTeamDiscussionComment() has been renamed to octokit.reactions.createForTeamDiscussionCommentLegacy() (2020-01-16)", - headers: { - accept: "application/vnd.github.squirrel-girl-preview+json" - }, - method: "POST", - params: { - comment_number: { - required: true, - type: "integer" - }, - content: { - enum: ["+1", "-1", "laugh", "confused", "heart", "hooray", "rocket", "eyes"], - required: true, - type: "string" - }, - discussion_number: { - required: true, - type: "integer" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/discussions/:discussion_number/comments/:comment_number/reactions" - }, - createForTeamDiscussionCommentInOrg: { - headers: { - accept: "application/vnd.github.squirrel-girl-preview+json" - }, - method: "POST", - params: { - comment_number: { - required: true, - type: "integer" - }, - content: { - enum: ["+1", "-1", "laugh", "confused", "heart", "hooray", "rocket", "eyes"], - required: true, - type: "string" - }, - discussion_number: { - required: true, - type: "integer" - }, - org: { - required: true, - type: "string" - }, - team_slug: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/teams/:team_slug/discussions/:discussion_number/comments/:comment_number/reactions" - }, - createForTeamDiscussionCommentLegacy: { - deprecated: "octokit.reactions.createForTeamDiscussionCommentLegacy() is deprecated, see https://developer.github.com/v3/reactions/#create-reaction-for-a-team-discussion-comment-legacy", - headers: { - accept: "application/vnd.github.squirrel-girl-preview+json" - }, - method: "POST", - params: { - comment_number: { - required: true, - type: "integer" - }, - content: { - enum: ["+1", "-1", "laugh", "confused", "heart", "hooray", "rocket", "eyes"], - required: true, - type: "string" - }, - discussion_number: { - required: true, - type: "integer" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/discussions/:discussion_number/comments/:comment_number/reactions" - }, - createForTeamDiscussionInOrg: { - headers: { - accept: "application/vnd.github.squirrel-girl-preview+json" - }, - method: "POST", - params: { - content: { - enum: ["+1", "-1", "laugh", "confused", "heart", "hooray", "rocket", "eyes"], - required: true, - type: "string" - }, - discussion_number: { - required: true, - type: "integer" - }, - org: { - required: true, - type: "string" - }, - team_slug: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/teams/:team_slug/discussions/:discussion_number/reactions" - }, - createForTeamDiscussionLegacy: { - deprecated: "octokit.reactions.createForTeamDiscussionLegacy() is deprecated, see https://developer.github.com/v3/reactions/#create-reaction-for-a-team-discussion-legacy", - headers: { - accept: "application/vnd.github.squirrel-girl-preview+json" - }, - method: "POST", - params: { - content: { - enum: ["+1", "-1", "laugh", "confused", "heart", "hooray", "rocket", "eyes"], - required: true, - type: "string" - }, - discussion_number: { - required: true, - type: "integer" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/discussions/:discussion_number/reactions" - }, - delete: { - headers: { - accept: "application/vnd.github.squirrel-girl-preview+json" - }, - method: "DELETE", - params: { - reaction_id: { - required: true, - type: "integer" - } - }, - url: "/reactions/:reaction_id" - }, - listForCommitComment: { - headers: { - accept: "application/vnd.github.squirrel-girl-preview+json" - }, - method: "GET", - params: { - comment_id: { - required: true, - type: "integer" - }, - content: { - enum: ["+1", "-1", "laugh", "confused", "heart", "hooray", "rocket", "eyes"], - type: "string" - }, - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/comments/:comment_id/reactions" - }, - listForIssue: { - headers: { - accept: "application/vnd.github.squirrel-girl-preview+json" - }, - method: "GET", - params: { - content: { - enum: ["+1", "-1", "laugh", "confused", "heart", "hooray", "rocket", "eyes"], - type: "string" - }, - issue_number: { - required: true, - type: "integer" - }, - number: { - alias: "issue_number", - deprecated: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/issues/:issue_number/reactions" - }, - listForIssueComment: { - headers: { - accept: "application/vnd.github.squirrel-girl-preview+json" - }, - method: "GET", - params: { - comment_id: { - required: true, - type: "integer" - }, - content: { - enum: ["+1", "-1", "laugh", "confused", "heart", "hooray", "rocket", "eyes"], - type: "string" - }, - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/issues/comments/:comment_id/reactions" - }, - listForPullRequestReviewComment: { - headers: { - accept: "application/vnd.github.squirrel-girl-preview+json" - }, - method: "GET", - params: { - comment_id: { - required: true, - type: "integer" - }, - content: { - enum: ["+1", "-1", "laugh", "confused", "heart", "hooray", "rocket", "eyes"], - type: "string" - }, - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/pulls/comments/:comment_id/reactions" - }, - listForTeamDiscussion: { - deprecated: "octokit.reactions.listForTeamDiscussion() has been renamed to octokit.reactions.listForTeamDiscussionLegacy() (2020-01-16)", - headers: { - accept: "application/vnd.github.squirrel-girl-preview+json" - }, - method: "GET", - params: { - content: { - enum: ["+1", "-1", "laugh", "confused", "heart", "hooray", "rocket", "eyes"], - type: "string" - }, - discussion_number: { - required: true, - type: "integer" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/discussions/:discussion_number/reactions" - }, - listForTeamDiscussionComment: { - deprecated: "octokit.reactions.listForTeamDiscussionComment() has been renamed to octokit.reactions.listForTeamDiscussionCommentLegacy() (2020-01-16)", - headers: { - accept: "application/vnd.github.squirrel-girl-preview+json" - }, - method: "GET", - params: { - comment_number: { - required: true, - type: "integer" - }, - content: { - enum: ["+1", "-1", "laugh", "confused", "heart", "hooray", "rocket", "eyes"], - type: "string" - }, - discussion_number: { - required: true, - type: "integer" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/discussions/:discussion_number/comments/:comment_number/reactions" - }, - listForTeamDiscussionCommentInOrg: { - headers: { - accept: "application/vnd.github.squirrel-girl-preview+json" - }, - method: "GET", - params: { - comment_number: { - required: true, - type: "integer" - }, - content: { - enum: ["+1", "-1", "laugh", "confused", "heart", "hooray", "rocket", "eyes"], - type: "string" - }, - discussion_number: { - required: true, - type: "integer" - }, - org: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - team_slug: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/teams/:team_slug/discussions/:discussion_number/comments/:comment_number/reactions" - }, - listForTeamDiscussionCommentLegacy: { - deprecated: "octokit.reactions.listForTeamDiscussionCommentLegacy() is deprecated, see https://developer.github.com/v3/reactions/#list-reactions-for-a-team-discussion-comment-legacy", - headers: { - accept: "application/vnd.github.squirrel-girl-preview+json" - }, - method: "GET", - params: { - comment_number: { - required: true, - type: "integer" - }, - content: { - enum: ["+1", "-1", "laugh", "confused", "heart", "hooray", "rocket", "eyes"], - type: "string" - }, - discussion_number: { - required: true, - type: "integer" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/discussions/:discussion_number/comments/:comment_number/reactions" - }, - listForTeamDiscussionInOrg: { - headers: { - accept: "application/vnd.github.squirrel-girl-preview+json" - }, - method: "GET", - params: { - content: { - enum: ["+1", "-1", "laugh", "confused", "heart", "hooray", "rocket", "eyes"], - type: "string" - }, - discussion_number: { - required: true, - type: "integer" - }, - org: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - team_slug: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/teams/:team_slug/discussions/:discussion_number/reactions" - }, - listForTeamDiscussionLegacy: { - deprecated: "octokit.reactions.listForTeamDiscussionLegacy() is deprecated, see https://developer.github.com/v3/reactions/#list-reactions-for-a-team-discussion-legacy", - headers: { - accept: "application/vnd.github.squirrel-girl-preview+json" - }, - method: "GET", - params: { - content: { - enum: ["+1", "-1", "laugh", "confused", "heart", "hooray", "rocket", "eyes"], - type: "string" - }, - discussion_number: { - required: true, - type: "integer" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/discussions/:discussion_number/reactions" - } - }, - repos: { - acceptInvitation: { - method: "PATCH", - params: { - invitation_id: { - required: true, - type: "integer" - } - }, - url: "/user/repository_invitations/:invitation_id" - }, - addCollaborator: { - method: "PUT", - params: { - owner: { - required: true, - type: "string" - }, - permission: { - enum: ["pull", "push", "admin"], - type: "string" - }, - repo: { - required: true, - type: "string" - }, - username: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/collaborators/:username" - }, - addDeployKey: { - method: "POST", - params: { - key: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - read_only: { - type: "boolean" - }, - repo: { - required: true, - type: "string" - }, - title: { - type: "string" - } - }, - url: "/repos/:owner/:repo/keys" - }, - addProtectedBranchAdminEnforcement: { - method: "POST", - params: { - branch: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/branches/:branch/protection/enforce_admins" - }, - addProtectedBranchAppRestrictions: { - method: "POST", - params: { - apps: { - mapTo: "data", - required: true, - type: "string[]" - }, - branch: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/branches/:branch/protection/restrictions/apps" - }, - addProtectedBranchRequiredSignatures: { - headers: { - accept: "application/vnd.github.zzzax-preview+json" - }, - method: "POST", - params: { - branch: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/branches/:branch/protection/required_signatures" - }, - addProtectedBranchRequiredStatusChecksContexts: { - method: "POST", - params: { - branch: { - required: true, - type: "string" - }, - contexts: { - mapTo: "data", - required: true, - type: "string[]" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/branches/:branch/protection/required_status_checks/contexts" - }, - addProtectedBranchTeamRestrictions: { - method: "POST", - params: { - branch: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - teams: { - mapTo: "data", - required: true, - type: "string[]" - } - }, - url: "/repos/:owner/:repo/branches/:branch/protection/restrictions/teams" - }, - addProtectedBranchUserRestrictions: { - method: "POST", - params: { - branch: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - users: { - mapTo: "data", - required: true, - type: "string[]" - } - }, - url: "/repos/:owner/:repo/branches/:branch/protection/restrictions/users" - }, - checkCollaborator: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - username: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/collaborators/:username" - }, - checkVulnerabilityAlerts: { - headers: { - accept: "application/vnd.github.dorian-preview+json" - }, - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/vulnerability-alerts" - }, - compareCommits: { - method: "GET", - params: { - base: { - required: true, - type: "string" - }, - head: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/compare/:base...:head" - }, - createCommitComment: { - method: "POST", - params: { - body: { - required: true, - type: "string" - }, - commit_sha: { - required: true, - type: "string" - }, - line: { - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - path: { - type: "string" - }, - position: { - type: "integer" - }, - repo: { - required: true, - type: "string" - }, - sha: { - alias: "commit_sha", - deprecated: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/commits/:commit_sha/comments" - }, - createDeployment: { - method: "POST", - params: { - auto_merge: { - type: "boolean" - }, - description: { - type: "string" - }, - environment: { - type: "string" - }, - owner: { - required: true, - type: "string" - }, - payload: { - type: "string" - }, - production_environment: { - type: "boolean" - }, - ref: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - required_contexts: { - type: "string[]" - }, - task: { - type: "string" - }, - transient_environment: { - type: "boolean" - } - }, - url: "/repos/:owner/:repo/deployments" - }, - createDeploymentStatus: { - method: "POST", - params: { - auto_inactive: { - type: "boolean" - }, - deployment_id: { - required: true, - type: "integer" - }, - description: { - type: "string" - }, - environment: { - enum: ["production", "staging", "qa"], - type: "string" - }, - environment_url: { - type: "string" - }, - log_url: { - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - state: { - enum: ["error", "failure", "inactive", "in_progress", "queued", "pending", "success"], - required: true, - type: "string" - }, - target_url: { - type: "string" - } - }, - url: "/repos/:owner/:repo/deployments/:deployment_id/statuses" - }, - createDispatchEvent: { - method: "POST", - params: { - client_payload: { - type: "object" - }, - event_type: { - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/dispatches" - }, - createFile: { - deprecated: "octokit.repos.createFile() has been renamed to octokit.repos.createOrUpdateFile() (2019-06-07)", - method: "PUT", - params: { - author: { - type: "object" - }, - "author.email": { - required: true, - type: "string" - }, - "author.name": { - required: true, - type: "string" - }, - branch: { - type: "string" - }, - committer: { - type: "object" - }, - "committer.email": { - required: true, - type: "string" - }, - "committer.name": { - required: true, - type: "string" - }, - content: { - required: true, - type: "string" - }, - message: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - path: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - sha: { - type: "string" - } - }, - url: "/repos/:owner/:repo/contents/:path" - }, - createForAuthenticatedUser: { - method: "POST", - params: { - allow_merge_commit: { - type: "boolean" - }, - allow_rebase_merge: { - type: "boolean" - }, - allow_squash_merge: { - type: "boolean" - }, - auto_init: { - type: "boolean" - }, - delete_branch_on_merge: { - type: "boolean" - }, - description: { - type: "string" - }, - gitignore_template: { - type: "string" - }, - has_issues: { - type: "boolean" - }, - has_projects: { - type: "boolean" - }, - has_wiki: { - type: "boolean" - }, - homepage: { - type: "string" - }, - is_template: { - type: "boolean" - }, - license_template: { - type: "string" - }, - name: { - required: true, - type: "string" - }, - private: { - type: "boolean" - }, - team_id: { - type: "integer" - }, - visibility: { - enum: ["public", "private", "visibility", "internal"], - type: "string" - } - }, - url: "/user/repos" - }, - createFork: { - method: "POST", - params: { - organization: { - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/forks" - }, - createHook: { - method: "POST", - params: { - active: { - type: "boolean" - }, - config: { - required: true, - type: "object" - }, - "config.content_type": { - type: "string" - }, - "config.insecure_ssl": { - type: "string" - }, - "config.secret": { - type: "string" - }, - "config.url": { - required: true, - type: "string" - }, - events: { - type: "string[]" - }, - name: { - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/hooks" - }, - createInOrg: { - method: "POST", - params: { - allow_merge_commit: { - type: "boolean" - }, - allow_rebase_merge: { - type: "boolean" - }, - allow_squash_merge: { - type: "boolean" - }, - auto_init: { - type: "boolean" - }, - delete_branch_on_merge: { - type: "boolean" - }, - description: { - type: "string" - }, - gitignore_template: { - type: "string" - }, - has_issues: { - type: "boolean" - }, - has_projects: { - type: "boolean" - }, - has_wiki: { - type: "boolean" - }, - homepage: { - type: "string" - }, - is_template: { - type: "boolean" - }, - license_template: { - type: "string" - }, - name: { - required: true, - type: "string" - }, - org: { - required: true, - type: "string" - }, - private: { - type: "boolean" - }, - team_id: { - type: "integer" - }, - visibility: { - enum: ["public", "private", "visibility", "internal"], - type: "string" - } - }, - url: "/orgs/:org/repos" - }, - createOrUpdateFile: { - method: "PUT", - params: { - author: { - type: "object" - }, - "author.email": { - required: true, - type: "string" - }, - "author.name": { - required: true, - type: "string" - }, - branch: { - type: "string" - }, - committer: { - type: "object" - }, - "committer.email": { - required: true, - type: "string" - }, - "committer.name": { - required: true, - type: "string" - }, - content: { - required: true, - type: "string" - }, - message: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - path: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - sha: { - type: "string" - } - }, - url: "/repos/:owner/:repo/contents/:path" - }, - createRelease: { - method: "POST", - params: { - body: { - type: "string" - }, - draft: { - type: "boolean" - }, - name: { - type: "string" - }, - owner: { - required: true, - type: "string" - }, - prerelease: { - type: "boolean" - }, - repo: { - required: true, - type: "string" - }, - tag_name: { - required: true, - type: "string" - }, - target_commitish: { - type: "string" - } - }, - url: "/repos/:owner/:repo/releases" - }, - createStatus: { - method: "POST", - params: { - context: { - type: "string" - }, - description: { - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - sha: { - required: true, - type: "string" - }, - state: { - enum: ["error", "failure", "pending", "success"], - required: true, - type: "string" - }, - target_url: { - type: "string" - } - }, - url: "/repos/:owner/:repo/statuses/:sha" - }, - createUsingTemplate: { - headers: { - accept: "application/vnd.github.baptiste-preview+json" - }, - method: "POST", - params: { - description: { - type: "string" - }, - name: { - required: true, - type: "string" - }, - owner: { - type: "string" - }, - private: { - type: "boolean" - }, - template_owner: { - required: true, - type: "string" - }, - template_repo: { - required: true, - type: "string" - } - }, - url: "/repos/:template_owner/:template_repo/generate" - }, - declineInvitation: { - method: "DELETE", - params: { - invitation_id: { - required: true, - type: "integer" - } - }, - url: "/user/repository_invitations/:invitation_id" - }, - delete: { - method: "DELETE", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo" - }, - deleteCommitComment: { - method: "DELETE", - params: { - comment_id: { - required: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/comments/:comment_id" - }, - deleteDownload: { - method: "DELETE", - params: { - download_id: { - required: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/downloads/:download_id" - }, - deleteFile: { - method: "DELETE", - params: { - author: { - type: "object" - }, - "author.email": { - type: "string" - }, - "author.name": { - type: "string" - }, - branch: { - type: "string" - }, - committer: { - type: "object" - }, - "committer.email": { - type: "string" - }, - "committer.name": { - type: "string" - }, - message: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - path: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - sha: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/contents/:path" - }, - deleteHook: { - method: "DELETE", - params: { - hook_id: { - required: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/hooks/:hook_id" - }, - deleteInvitation: { - method: "DELETE", - params: { - invitation_id: { - required: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/invitations/:invitation_id" - }, - deleteRelease: { - method: "DELETE", - params: { - owner: { - required: true, - type: "string" - }, - release_id: { - required: true, - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/releases/:release_id" - }, - deleteReleaseAsset: { - method: "DELETE", - params: { - asset_id: { - required: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/releases/assets/:asset_id" - }, - disableAutomatedSecurityFixes: { - headers: { - accept: "application/vnd.github.london-preview+json" - }, - method: "DELETE", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/automated-security-fixes" - }, - disablePagesSite: { - headers: { - accept: "application/vnd.github.switcheroo-preview+json" - }, - method: "DELETE", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/pages" - }, - disableVulnerabilityAlerts: { - headers: { - accept: "application/vnd.github.dorian-preview+json" - }, - method: "DELETE", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/vulnerability-alerts" - }, - enableAutomatedSecurityFixes: { - headers: { - accept: "application/vnd.github.london-preview+json" - }, - method: "PUT", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/automated-security-fixes" - }, - enablePagesSite: { - headers: { - accept: "application/vnd.github.switcheroo-preview+json" - }, - method: "POST", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - source: { - type: "object" - }, - "source.branch": { - enum: ["master", "gh-pages"], - type: "string" - }, - "source.path": { - type: "string" - } - }, - url: "/repos/:owner/:repo/pages" - }, - enableVulnerabilityAlerts: { - headers: { - accept: "application/vnd.github.dorian-preview+json" - }, - method: "PUT", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/vulnerability-alerts" - }, - get: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo" - }, - getAppsWithAccessToProtectedBranch: { - method: "GET", - params: { - branch: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/branches/:branch/protection/restrictions/apps" - }, - getArchiveLink: { - method: "GET", - params: { - archive_format: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - ref: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/:archive_format/:ref" - }, - getBranch: { - method: "GET", - params: { - branch: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/branches/:branch" - }, - getBranchProtection: { - method: "GET", - params: { - branch: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/branches/:branch/protection" - }, - getClones: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - per: { - enum: ["day", "week"], - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/traffic/clones" - }, - getCodeFrequencyStats: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/stats/code_frequency" - }, - getCollaboratorPermissionLevel: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - username: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/collaborators/:username/permission" - }, - getCombinedStatusForRef: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - ref: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/commits/:ref/status" - }, - getCommit: { - method: "GET", - params: { - commit_sha: { - alias: "ref", - deprecated: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - ref: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - sha: { - alias: "ref", - deprecated: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/commits/:ref" - }, - getCommitActivityStats: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/stats/commit_activity" - }, - getCommitComment: { - method: "GET", - params: { - comment_id: { - required: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/comments/:comment_id" - }, - getCommitRefSha: { - deprecated: "octokit.repos.getCommitRefSha() is deprecated, see https://developer.github.com/v3/repos/commits/#get-a-single-commit", - headers: { - accept: "application/vnd.github.v3.sha" - }, - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - ref: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/commits/:ref" - }, - getContents: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - path: { - required: true, - type: "string" - }, - ref: { - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/contents/:path" - }, - getContributorsStats: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/stats/contributors" - }, - getDeployKey: { - method: "GET", - params: { - key_id: { - required: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/keys/:key_id" - }, - getDeployment: { - method: "GET", - params: { - deployment_id: { - required: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/deployments/:deployment_id" - }, - getDeploymentStatus: { - method: "GET", - params: { - deployment_id: { - required: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - status_id: { - required: true, - type: "integer" - } - }, - url: "/repos/:owner/:repo/deployments/:deployment_id/statuses/:status_id" - }, - getDownload: { - method: "GET", - params: { - download_id: { - required: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/downloads/:download_id" - }, - getHook: { - method: "GET", - params: { - hook_id: { - required: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/hooks/:hook_id" - }, - getLatestPagesBuild: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/pages/builds/latest" - }, - getLatestRelease: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/releases/latest" - }, - getPages: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/pages" - }, - getPagesBuild: { - method: "GET", - params: { - build_id: { - required: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/pages/builds/:build_id" - }, - getParticipationStats: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/stats/participation" - }, - getProtectedBranchAdminEnforcement: { - method: "GET", - params: { - branch: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/branches/:branch/protection/enforce_admins" - }, - getProtectedBranchPullRequestReviewEnforcement: { - method: "GET", - params: { - branch: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/branches/:branch/protection/required_pull_request_reviews" - }, - getProtectedBranchRequiredSignatures: { - headers: { - accept: "application/vnd.github.zzzax-preview+json" - }, - method: "GET", - params: { - branch: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/branches/:branch/protection/required_signatures" - }, - getProtectedBranchRequiredStatusChecks: { - method: "GET", - params: { - branch: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/branches/:branch/protection/required_status_checks" - }, - getProtectedBranchRestrictions: { - method: "GET", - params: { - branch: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/branches/:branch/protection/restrictions" - }, - getPunchCardStats: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/stats/punch_card" - }, - getReadme: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - ref: { - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/readme" - }, - getRelease: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - release_id: { - required: true, - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/releases/:release_id" - }, - getReleaseAsset: { - method: "GET", - params: { - asset_id: { - required: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/releases/assets/:asset_id" - }, - getReleaseByTag: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - tag: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/releases/tags/:tag" - }, - getTeamsWithAccessToProtectedBranch: { - method: "GET", - params: { - branch: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/branches/:branch/protection/restrictions/teams" - }, - getTopPaths: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/traffic/popular/paths" - }, - getTopReferrers: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/traffic/popular/referrers" - }, - getUsersWithAccessToProtectedBranch: { - method: "GET", - params: { - branch: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/branches/:branch/protection/restrictions/users" - }, - getViews: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - per: { - enum: ["day", "week"], - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/traffic/views" - }, - list: { - method: "GET", - params: { - affiliation: { - type: "string" - }, - direction: { - enum: ["asc", "desc"], - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - sort: { - enum: ["created", "updated", "pushed", "full_name"], - type: "string" - }, - type: { - enum: ["all", "owner", "public", "private", "member"], - type: "string" - }, - visibility: { - enum: ["all", "public", "private"], - type: "string" - } - }, - url: "/user/repos" - }, - listAppsWithAccessToProtectedBranch: { - deprecated: "octokit.repos.listAppsWithAccessToProtectedBranch() has been renamed to octokit.repos.getAppsWithAccessToProtectedBranch() (2019-09-13)", - method: "GET", - params: { - branch: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/branches/:branch/protection/restrictions/apps" - }, - listAssetsForRelease: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - release_id: { - required: true, - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/releases/:release_id/assets" - }, - listBranches: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - protected: { - type: "boolean" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/branches" - }, - listBranchesForHeadCommit: { - headers: { - accept: "application/vnd.github.groot-preview+json" - }, - method: "GET", - params: { - commit_sha: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/commits/:commit_sha/branches-where-head" - }, - listCollaborators: { - method: "GET", - params: { - affiliation: { - enum: ["outside", "direct", "all"], - type: "string" - }, - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/collaborators" - }, - listCommentsForCommit: { - method: "GET", - params: { - commit_sha: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - ref: { - alias: "commit_sha", - deprecated: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/commits/:commit_sha/comments" - }, - listCommitComments: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/comments" - }, - listCommits: { - method: "GET", - params: { - author: { - type: "string" - }, - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - path: { - type: "string" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - }, - sha: { - type: "string" - }, - since: { - type: "string" - }, - until: { - type: "string" - } - }, - url: "/repos/:owner/:repo/commits" - }, - listContributors: { - method: "GET", - params: { - anon: { - type: "string" - }, - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/contributors" - }, - listDeployKeys: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/keys" - }, - listDeploymentStatuses: { - method: "GET", - params: { - deployment_id: { - required: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/deployments/:deployment_id/statuses" - }, - listDeployments: { - method: "GET", - params: { - environment: { - type: "string" - }, - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - ref: { - type: "string" - }, - repo: { - required: true, - type: "string" - }, - sha: { - type: "string" - }, - task: { - type: "string" - } - }, - url: "/repos/:owner/:repo/deployments" - }, - listDownloads: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/downloads" - }, - listForOrg: { - method: "GET", - params: { - direction: { - enum: ["asc", "desc"], - type: "string" - }, - org: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - sort: { - enum: ["created", "updated", "pushed", "full_name"], - type: "string" - }, - type: { - enum: ["all", "public", "private", "forks", "sources", "member", "internal"], - type: "string" - } - }, - url: "/orgs/:org/repos" - }, - listForUser: { - method: "GET", - params: { - direction: { - enum: ["asc", "desc"], - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - sort: { - enum: ["created", "updated", "pushed", "full_name"], - type: "string" - }, - type: { - enum: ["all", "owner", "member"], - type: "string" - }, - username: { - required: true, - type: "string" - } - }, - url: "/users/:username/repos" - }, - listForks: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - }, - sort: { - enum: ["newest", "oldest", "stargazers"], - type: "string" - } - }, - url: "/repos/:owner/:repo/forks" - }, - listHooks: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/hooks" - }, - listInvitations: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/invitations" - }, - listInvitationsForAuthenticatedUser: { - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - } - }, - url: "/user/repository_invitations" - }, - listLanguages: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/languages" - }, - listPagesBuilds: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/pages/builds" - }, - listProtectedBranchRequiredStatusChecksContexts: { - method: "GET", - params: { - branch: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/branches/:branch/protection/required_status_checks/contexts" - }, - listProtectedBranchTeamRestrictions: { - deprecated: "octokit.repos.listProtectedBranchTeamRestrictions() has been renamed to octokit.repos.getTeamsWithAccessToProtectedBranch() (2019-09-09)", - method: "GET", - params: { - branch: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/branches/:branch/protection/restrictions/teams" - }, - listProtectedBranchUserRestrictions: { - deprecated: "octokit.repos.listProtectedBranchUserRestrictions() has been renamed to octokit.repos.getUsersWithAccessToProtectedBranch() (2019-09-09)", - method: "GET", - params: { - branch: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/branches/:branch/protection/restrictions/users" - }, - listPublic: { - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - since: { - type: "integer" - } - }, - url: "/repositories" - }, - listPullRequestsAssociatedWithCommit: { - headers: { - accept: "application/vnd.github.groot-preview+json" - }, - method: "GET", - params: { - commit_sha: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/commits/:commit_sha/pulls" - }, - listReleases: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/releases" - }, - listStatusesForRef: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - ref: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/commits/:ref/statuses" - }, - listTags: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/tags" - }, - listTeams: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/teams" - }, - listTeamsWithAccessToProtectedBranch: { - deprecated: "octokit.repos.listTeamsWithAccessToProtectedBranch() has been renamed to octokit.repos.getTeamsWithAccessToProtectedBranch() (2019-09-13)", - method: "GET", - params: { - branch: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/branches/:branch/protection/restrictions/teams" - }, - listTopics: { - headers: { - accept: "application/vnd.github.mercy-preview+json" - }, - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/topics" - }, - listUsersWithAccessToProtectedBranch: { - deprecated: "octokit.repos.listUsersWithAccessToProtectedBranch() has been renamed to octokit.repos.getUsersWithAccessToProtectedBranch() (2019-09-13)", - method: "GET", - params: { - branch: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/branches/:branch/protection/restrictions/users" - }, - merge: { - method: "POST", - params: { - base: { - required: true, - type: "string" - }, - commit_message: { - type: "string" - }, - head: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/merges" - }, - pingHook: { - method: "POST", - params: { - hook_id: { - required: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/hooks/:hook_id/pings" - }, - removeBranchProtection: { - method: "DELETE", - params: { - branch: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/branches/:branch/protection" - }, - removeCollaborator: { - method: "DELETE", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - username: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/collaborators/:username" - }, - removeDeployKey: { - method: "DELETE", - params: { - key_id: { - required: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/keys/:key_id" - }, - removeProtectedBranchAdminEnforcement: { - method: "DELETE", - params: { - branch: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/branches/:branch/protection/enforce_admins" - }, - removeProtectedBranchAppRestrictions: { - method: "DELETE", - params: { - apps: { - mapTo: "data", - required: true, - type: "string[]" - }, - branch: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/branches/:branch/protection/restrictions/apps" - }, - removeProtectedBranchPullRequestReviewEnforcement: { - method: "DELETE", - params: { - branch: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/branches/:branch/protection/required_pull_request_reviews" - }, - removeProtectedBranchRequiredSignatures: { - headers: { - accept: "application/vnd.github.zzzax-preview+json" - }, - method: "DELETE", - params: { - branch: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/branches/:branch/protection/required_signatures" - }, - removeProtectedBranchRequiredStatusChecks: { - method: "DELETE", - params: { - branch: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/branches/:branch/protection/required_status_checks" - }, - removeProtectedBranchRequiredStatusChecksContexts: { - method: "DELETE", - params: { - branch: { - required: true, - type: "string" - }, - contexts: { - mapTo: "data", - required: true, - type: "string[]" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/branches/:branch/protection/required_status_checks/contexts" - }, - removeProtectedBranchRestrictions: { - method: "DELETE", - params: { - branch: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/branches/:branch/protection/restrictions" - }, - removeProtectedBranchTeamRestrictions: { - method: "DELETE", - params: { - branch: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - teams: { - mapTo: "data", - required: true, - type: "string[]" - } - }, - url: "/repos/:owner/:repo/branches/:branch/protection/restrictions/teams" - }, - removeProtectedBranchUserRestrictions: { - method: "DELETE", - params: { - branch: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - users: { - mapTo: "data", - required: true, - type: "string[]" - } - }, - url: "/repos/:owner/:repo/branches/:branch/protection/restrictions/users" - }, - replaceProtectedBranchAppRestrictions: { - method: "PUT", - params: { - apps: { - mapTo: "data", - required: true, - type: "string[]" - }, - branch: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/branches/:branch/protection/restrictions/apps" - }, - replaceProtectedBranchRequiredStatusChecksContexts: { - method: "PUT", - params: { - branch: { - required: true, - type: "string" - }, - contexts: { - mapTo: "data", - required: true, - type: "string[]" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/branches/:branch/protection/required_status_checks/contexts" - }, - replaceProtectedBranchTeamRestrictions: { - method: "PUT", - params: { - branch: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - teams: { - mapTo: "data", - required: true, - type: "string[]" - } - }, - url: "/repos/:owner/:repo/branches/:branch/protection/restrictions/teams" - }, - replaceProtectedBranchUserRestrictions: { - method: "PUT", - params: { - branch: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - users: { - mapTo: "data", - required: true, - type: "string[]" - } - }, - url: "/repos/:owner/:repo/branches/:branch/protection/restrictions/users" - }, - replaceTopics: { - headers: { - accept: "application/vnd.github.mercy-preview+json" - }, - method: "PUT", - params: { - names: { - required: true, - type: "string[]" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/topics" - }, - requestPageBuild: { - method: "POST", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/pages/builds" - }, - retrieveCommunityProfileMetrics: { - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/community/profile" - }, - testPushHook: { - method: "POST", - params: { - hook_id: { - required: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/hooks/:hook_id/tests" - }, - transfer: { - method: "POST", - params: { - new_owner: { - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - team_ids: { - type: "integer[]" - } - }, - url: "/repos/:owner/:repo/transfer" - }, - update: { - method: "PATCH", - params: { - allow_merge_commit: { - type: "boolean" - }, - allow_rebase_merge: { - type: "boolean" - }, - allow_squash_merge: { - type: "boolean" - }, - archived: { - type: "boolean" - }, - default_branch: { - type: "string" - }, - delete_branch_on_merge: { - type: "boolean" - }, - description: { - type: "string" - }, - has_issues: { - type: "boolean" - }, - has_projects: { - type: "boolean" - }, - has_wiki: { - type: "boolean" - }, - homepage: { - type: "string" - }, - is_template: { - type: "boolean" - }, - name: { - type: "string" - }, - owner: { - required: true, - type: "string" - }, - private: { - type: "boolean" - }, - repo: { - required: true, - type: "string" - }, - visibility: { - enum: ["public", "private", "visibility", "internal"], - type: "string" - } - }, - url: "/repos/:owner/:repo" - }, - updateBranchProtection: { - method: "PUT", - params: { - allow_deletions: { - type: "boolean" - }, - allow_force_pushes: { - allowNull: true, - type: "boolean" - }, - branch: { - required: true, - type: "string" - }, - enforce_admins: { - allowNull: true, - required: true, - type: "boolean" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - required_linear_history: { - type: "boolean" - }, - required_pull_request_reviews: { - allowNull: true, - required: true, - type: "object" - }, - "required_pull_request_reviews.dismiss_stale_reviews": { - type: "boolean" - }, - "required_pull_request_reviews.dismissal_restrictions": { - type: "object" - }, - "required_pull_request_reviews.dismissal_restrictions.teams": { - type: "string[]" - }, - "required_pull_request_reviews.dismissal_restrictions.users": { - type: "string[]" - }, - "required_pull_request_reviews.require_code_owner_reviews": { - type: "boolean" - }, - "required_pull_request_reviews.required_approving_review_count": { - type: "integer" - }, - required_status_checks: { - allowNull: true, - required: true, - type: "object" - }, - "required_status_checks.contexts": { - required: true, - type: "string[]" - }, - "required_status_checks.strict": { - required: true, - type: "boolean" - }, - restrictions: { - allowNull: true, - required: true, - type: "object" - }, - "restrictions.apps": { - type: "string[]" - }, - "restrictions.teams": { - required: true, - type: "string[]" - }, - "restrictions.users": { - required: true, - type: "string[]" - } - }, - url: "/repos/:owner/:repo/branches/:branch/protection" - }, - updateCommitComment: { - method: "PATCH", - params: { - body: { - required: true, - type: "string" - }, - comment_id: { - required: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/comments/:comment_id" - }, - updateFile: { - deprecated: "octokit.repos.updateFile() has been renamed to octokit.repos.createOrUpdateFile() (2019-06-07)", - method: "PUT", - params: { - author: { - type: "object" - }, - "author.email": { - required: true, - type: "string" - }, - "author.name": { - required: true, - type: "string" - }, - branch: { - type: "string" - }, - committer: { - type: "object" - }, - "committer.email": { - required: true, - type: "string" - }, - "committer.name": { - required: true, - type: "string" - }, - content: { - required: true, - type: "string" - }, - message: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - path: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - sha: { - type: "string" - } - }, - url: "/repos/:owner/:repo/contents/:path" - }, - updateHook: { - method: "PATCH", - params: { - active: { - type: "boolean" - }, - add_events: { - type: "string[]" - }, - config: { - type: "object" - }, - "config.content_type": { - type: "string" - }, - "config.insecure_ssl": { - type: "string" - }, - "config.secret": { - type: "string" - }, - "config.url": { - required: true, - type: "string" - }, - events: { - type: "string[]" - }, - hook_id: { - required: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - remove_events: { - type: "string[]" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/hooks/:hook_id" - }, - updateInformationAboutPagesSite: { - method: "PUT", - params: { - cname: { - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - source: { - enum: ['"gh-pages"', '"master"', '"master /docs"'], - type: "string" - } - }, - url: "/repos/:owner/:repo/pages" - }, - updateInvitation: { - method: "PATCH", - params: { - invitation_id: { - required: true, - type: "integer" - }, - owner: { - required: true, - type: "string" - }, - permissions: { - enum: ["read", "write", "admin"], - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/invitations/:invitation_id" - }, - updateProtectedBranchPullRequestReviewEnforcement: { - method: "PATCH", - params: { - branch: { - required: true, - type: "string" - }, - dismiss_stale_reviews: { - type: "boolean" - }, - dismissal_restrictions: { - type: "object" - }, - "dismissal_restrictions.teams": { - type: "string[]" - }, - "dismissal_restrictions.users": { - type: "string[]" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - require_code_owner_reviews: { - type: "boolean" - }, - required_approving_review_count: { - type: "integer" - } - }, - url: "/repos/:owner/:repo/branches/:branch/protection/required_pull_request_reviews" - }, - updateProtectedBranchRequiredStatusChecks: { - method: "PATCH", - params: { - branch: { - required: true, - type: "string" - }, - contexts: { - type: "string[]" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - strict: { - type: "boolean" - } - }, - url: "/repos/:owner/:repo/branches/:branch/protection/required_status_checks" - }, - updateRelease: { - method: "PATCH", - params: { - body: { - type: "string" - }, - draft: { - type: "boolean" - }, - name: { - type: "string" - }, - owner: { - required: true, - type: "string" - }, - prerelease: { - type: "boolean" - }, - release_id: { - required: true, - type: "integer" - }, - repo: { - required: true, - type: "string" - }, - tag_name: { - type: "string" - }, - target_commitish: { - type: "string" - } - }, - url: "/repos/:owner/:repo/releases/:release_id" - }, - updateReleaseAsset: { - method: "PATCH", - params: { - asset_id: { - required: true, - type: "integer" - }, - label: { - type: "string" - }, - name: { - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - } - }, - url: "/repos/:owner/:repo/releases/assets/:asset_id" - }, - uploadReleaseAsset: { - method: "POST", - params: { - data: { - mapTo: "data", - required: true, - type: "string | object" - }, - file: { - alias: "data", - deprecated: true, - type: "string | object" - }, - headers: { - required: true, - type: "object" - }, - "headers.content-length": { - required: true, - type: "integer" - }, - "headers.content-type": { - required: true, - type: "string" - }, - label: { - type: "string" - }, - name: { - required: true, - type: "string" - }, - url: { - required: true, - type: "string" - } - }, - url: ":url" - } - }, - search: { - code: { - method: "GET", - params: { - order: { - enum: ["desc", "asc"], - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - q: { - required: true, - type: "string" - }, - sort: { - enum: ["indexed"], - type: "string" - } - }, - url: "/search/code" - }, - commits: { - headers: { - accept: "application/vnd.github.cloak-preview+json" - }, - method: "GET", - params: { - order: { - enum: ["desc", "asc"], - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - q: { - required: true, - type: "string" - }, - sort: { - enum: ["author-date", "committer-date"], - type: "string" - } - }, - url: "/search/commits" - }, - issues: { - deprecated: "octokit.search.issues() has been renamed to octokit.search.issuesAndPullRequests() (2018-12-27)", - method: "GET", - params: { - order: { - enum: ["desc", "asc"], - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - q: { - required: true, - type: "string" - }, - sort: { - enum: ["comments", "reactions", "reactions-+1", "reactions--1", "reactions-smile", "reactions-thinking_face", "reactions-heart", "reactions-tada", "interactions", "created", "updated"], - type: "string" - } - }, - url: "/search/issues" - }, - issuesAndPullRequests: { - method: "GET", - params: { - order: { - enum: ["desc", "asc"], - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - q: { - required: true, - type: "string" - }, - sort: { - enum: ["comments", "reactions", "reactions-+1", "reactions--1", "reactions-smile", "reactions-thinking_face", "reactions-heart", "reactions-tada", "interactions", "created", "updated"], - type: "string" - } - }, - url: "/search/issues" - }, - labels: { - method: "GET", - params: { - order: { - enum: ["desc", "asc"], - type: "string" - }, - q: { - required: true, - type: "string" - }, - repository_id: { - required: true, - type: "integer" - }, - sort: { - enum: ["created", "updated"], - type: "string" - } - }, - url: "/search/labels" - }, - repos: { - method: "GET", - params: { - order: { - enum: ["desc", "asc"], - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - q: { - required: true, - type: "string" - }, - sort: { - enum: ["stars", "forks", "help-wanted-issues", "updated"], - type: "string" - } - }, - url: "/search/repositories" - }, - topics: { - method: "GET", - params: { - q: { - required: true, - type: "string" - } - }, - url: "/search/topics" - }, - users: { - method: "GET", - params: { - order: { - enum: ["desc", "asc"], - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - q: { - required: true, - type: "string" - }, - sort: { - enum: ["followers", "repositories", "joined"], - type: "string" - } - }, - url: "/search/users" - } - }, - teams: { - addMember: { - deprecated: "octokit.teams.addMember() has been renamed to octokit.teams.addMemberLegacy() (2020-01-16)", - method: "PUT", - params: { - team_id: { - required: true, - type: "integer" - }, - username: { - required: true, - type: "string" - } - }, - url: "/teams/:team_id/members/:username" - }, - addMemberLegacy: { - deprecated: "octokit.teams.addMemberLegacy() is deprecated, see https://developer.github.com/v3/teams/members/#add-team-member-legacy", - method: "PUT", - params: { - team_id: { - required: true, - type: "integer" - }, - username: { - required: true, - type: "string" - } - }, - url: "/teams/:team_id/members/:username" - }, - addOrUpdateMembership: { - deprecated: "octokit.teams.addOrUpdateMembership() has been renamed to octokit.teams.addOrUpdateMembershipLegacy() (2020-01-16)", - method: "PUT", - params: { - role: { - enum: ["member", "maintainer"], - type: "string" - }, - team_id: { - required: true, - type: "integer" - }, - username: { - required: true, - type: "string" - } - }, - url: "/teams/:team_id/memberships/:username" - }, - addOrUpdateMembershipInOrg: { - method: "PUT", - params: { - org: { - required: true, - type: "string" - }, - role: { - enum: ["member", "maintainer"], - type: "string" - }, - team_slug: { - required: true, - type: "string" - }, - username: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/teams/:team_slug/memberships/:username" - }, - addOrUpdateMembershipLegacy: { - deprecated: "octokit.teams.addOrUpdateMembershipLegacy() is deprecated, see https://developer.github.com/v3/teams/members/#add-or-update-team-membership-legacy", - method: "PUT", - params: { - role: { - enum: ["member", "maintainer"], - type: "string" - }, - team_id: { - required: true, - type: "integer" - }, - username: { - required: true, - type: "string" - } - }, - url: "/teams/:team_id/memberships/:username" - }, - addOrUpdateProject: { - deprecated: "octokit.teams.addOrUpdateProject() has been renamed to octokit.teams.addOrUpdateProjectLegacy() (2020-01-16)", - headers: { - accept: "application/vnd.github.inertia-preview+json" - }, - method: "PUT", - params: { - permission: { - enum: ["read", "write", "admin"], - type: "string" - }, - project_id: { - required: true, - type: "integer" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/projects/:project_id" - }, - addOrUpdateProjectInOrg: { - headers: { - accept: "application/vnd.github.inertia-preview+json" - }, - method: "PUT", - params: { - org: { - required: true, - type: "string" - }, - permission: { - enum: ["read", "write", "admin"], - type: "string" - }, - project_id: { - required: true, - type: "integer" - }, - team_slug: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/teams/:team_slug/projects/:project_id" - }, - addOrUpdateProjectLegacy: { - deprecated: "octokit.teams.addOrUpdateProjectLegacy() is deprecated, see https://developer.github.com/v3/teams/#add-or-update-team-project-legacy", - headers: { - accept: "application/vnd.github.inertia-preview+json" - }, - method: "PUT", - params: { - permission: { - enum: ["read", "write", "admin"], - type: "string" - }, - project_id: { - required: true, - type: "integer" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/projects/:project_id" - }, - addOrUpdateRepo: { - deprecated: "octokit.teams.addOrUpdateRepo() has been renamed to octokit.teams.addOrUpdateRepoLegacy() (2020-01-16)", - method: "PUT", - params: { - owner: { - required: true, - type: "string" - }, - permission: { - enum: ["pull", "push", "admin"], - type: "string" - }, - repo: { - required: true, - type: "string" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/repos/:owner/:repo" - }, - addOrUpdateRepoInOrg: { - method: "PUT", - params: { - org: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - permission: { - enum: ["pull", "push", "admin"], - type: "string" - }, - repo: { - required: true, - type: "string" - }, - team_slug: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/teams/:team_slug/repos/:owner/:repo" - }, - addOrUpdateRepoLegacy: { - deprecated: "octokit.teams.addOrUpdateRepoLegacy() is deprecated, see https://developer.github.com/v3/teams/#add-or-update-team-repository-legacy", - method: "PUT", - params: { - owner: { - required: true, - type: "string" - }, - permission: { - enum: ["pull", "push", "admin"], - type: "string" - }, - repo: { - required: true, - type: "string" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/repos/:owner/:repo" - }, - checkManagesRepo: { - deprecated: "octokit.teams.checkManagesRepo() has been renamed to octokit.teams.checkManagesRepoLegacy() (2020-01-16)", - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/repos/:owner/:repo" - }, - checkManagesRepoInOrg: { - method: "GET", - params: { - org: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - team_slug: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/teams/:team_slug/repos/:owner/:repo" - }, - checkManagesRepoLegacy: { - deprecated: "octokit.teams.checkManagesRepoLegacy() is deprecated, see https://developer.github.com/v3/teams/#check-if-a-team-manages-a-repository-legacy", - method: "GET", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/repos/:owner/:repo" - }, - create: { - method: "POST", - params: { - description: { - type: "string" - }, - maintainers: { - type: "string[]" - }, - name: { - required: true, - type: "string" - }, - org: { - required: true, - type: "string" - }, - parent_team_id: { - type: "integer" - }, - permission: { - enum: ["pull", "push", "admin"], - type: "string" - }, - privacy: { - enum: ["secret", "closed"], - type: "string" - }, - repo_names: { - type: "string[]" - } - }, - url: "/orgs/:org/teams" - }, - createDiscussion: { - deprecated: "octokit.teams.createDiscussion() has been renamed to octokit.teams.createDiscussionLegacy() (2020-01-16)", - method: "POST", - params: { - body: { - required: true, - type: "string" - }, - private: { - type: "boolean" - }, - team_id: { - required: true, - type: "integer" - }, - title: { - required: true, - type: "string" - } - }, - url: "/teams/:team_id/discussions" - }, - createDiscussionComment: { - deprecated: "octokit.teams.createDiscussionComment() has been renamed to octokit.teams.createDiscussionCommentLegacy() (2020-01-16)", - method: "POST", - params: { - body: { - required: true, - type: "string" - }, - discussion_number: { - required: true, - type: "integer" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/discussions/:discussion_number/comments" - }, - createDiscussionCommentInOrg: { - method: "POST", - params: { - body: { - required: true, - type: "string" - }, - discussion_number: { - required: true, - type: "integer" - }, - org: { - required: true, - type: "string" - }, - team_slug: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/teams/:team_slug/discussions/:discussion_number/comments" - }, - createDiscussionCommentLegacy: { - deprecated: "octokit.teams.createDiscussionCommentLegacy() is deprecated, see https://developer.github.com/v3/teams/discussion_comments/#create-a-comment-legacy", - method: "POST", - params: { - body: { - required: true, - type: "string" - }, - discussion_number: { - required: true, - type: "integer" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/discussions/:discussion_number/comments" - }, - createDiscussionInOrg: { - method: "POST", - params: { - body: { - required: true, - type: "string" - }, - org: { - required: true, - type: "string" - }, - private: { - type: "boolean" - }, - team_slug: { - required: true, - type: "string" - }, - title: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/teams/:team_slug/discussions" - }, - createDiscussionLegacy: { - deprecated: "octokit.teams.createDiscussionLegacy() is deprecated, see https://developer.github.com/v3/teams/discussions/#create-a-discussion-legacy", - method: "POST", - params: { - body: { - required: true, - type: "string" - }, - private: { - type: "boolean" - }, - team_id: { - required: true, - type: "integer" - }, - title: { - required: true, - type: "string" - } - }, - url: "/teams/:team_id/discussions" - }, - delete: { - deprecated: "octokit.teams.delete() has been renamed to octokit.teams.deleteLegacy() (2020-01-16)", - method: "DELETE", - params: { - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id" - }, - deleteDiscussion: { - deprecated: "octokit.teams.deleteDiscussion() has been renamed to octokit.teams.deleteDiscussionLegacy() (2020-01-16)", - method: "DELETE", - params: { - discussion_number: { - required: true, - type: "integer" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/discussions/:discussion_number" - }, - deleteDiscussionComment: { - deprecated: "octokit.teams.deleteDiscussionComment() has been renamed to octokit.teams.deleteDiscussionCommentLegacy() (2020-01-16)", - method: "DELETE", - params: { - comment_number: { - required: true, - type: "integer" - }, - discussion_number: { - required: true, - type: "integer" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/discussions/:discussion_number/comments/:comment_number" - }, - deleteDiscussionCommentInOrg: { - method: "DELETE", - params: { - comment_number: { - required: true, - type: "integer" - }, - discussion_number: { - required: true, - type: "integer" - }, - org: { - required: true, - type: "string" - }, - team_slug: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/teams/:team_slug/discussions/:discussion_number/comments/:comment_number" - }, - deleteDiscussionCommentLegacy: { - deprecated: "octokit.teams.deleteDiscussionCommentLegacy() is deprecated, see https://developer.github.com/v3/teams/discussion_comments/#delete-a-comment-legacy", - method: "DELETE", - params: { - comment_number: { - required: true, - type: "integer" - }, - discussion_number: { - required: true, - type: "integer" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/discussions/:discussion_number/comments/:comment_number" - }, - deleteDiscussionInOrg: { - method: "DELETE", - params: { - discussion_number: { - required: true, - type: "integer" - }, - org: { - required: true, - type: "string" - }, - team_slug: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/teams/:team_slug/discussions/:discussion_number" - }, - deleteDiscussionLegacy: { - deprecated: "octokit.teams.deleteDiscussionLegacy() is deprecated, see https://developer.github.com/v3/teams/discussions/#delete-a-discussion-legacy", - method: "DELETE", - params: { - discussion_number: { - required: true, - type: "integer" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/discussions/:discussion_number" - }, - deleteInOrg: { - method: "DELETE", - params: { - org: { - required: true, - type: "string" - }, - team_slug: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/teams/:team_slug" - }, - deleteLegacy: { - deprecated: "octokit.teams.deleteLegacy() is deprecated, see https://developer.github.com/v3/teams/#delete-team-legacy", - method: "DELETE", - params: { - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id" - }, - get: { - deprecated: "octokit.teams.get() has been renamed to octokit.teams.getLegacy() (2020-01-16)", - method: "GET", - params: { - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id" - }, - getByName: { - method: "GET", - params: { - org: { - required: true, - type: "string" - }, - team_slug: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/teams/:team_slug" - }, - getDiscussion: { - deprecated: "octokit.teams.getDiscussion() has been renamed to octokit.teams.getDiscussionLegacy() (2020-01-16)", - method: "GET", - params: { - discussion_number: { - required: true, - type: "integer" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/discussions/:discussion_number" - }, - getDiscussionComment: { - deprecated: "octokit.teams.getDiscussionComment() has been renamed to octokit.teams.getDiscussionCommentLegacy() (2020-01-16)", - method: "GET", - params: { - comment_number: { - required: true, - type: "integer" - }, - discussion_number: { - required: true, - type: "integer" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/discussions/:discussion_number/comments/:comment_number" - }, - getDiscussionCommentInOrg: { - method: "GET", - params: { - comment_number: { - required: true, - type: "integer" - }, - discussion_number: { - required: true, - type: "integer" - }, - org: { - required: true, - type: "string" - }, - team_slug: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/teams/:team_slug/discussions/:discussion_number/comments/:comment_number" - }, - getDiscussionCommentLegacy: { - deprecated: "octokit.teams.getDiscussionCommentLegacy() is deprecated, see https://developer.github.com/v3/teams/discussion_comments/#get-a-single-comment-legacy", - method: "GET", - params: { - comment_number: { - required: true, - type: "integer" - }, - discussion_number: { - required: true, - type: "integer" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/discussions/:discussion_number/comments/:comment_number" - }, - getDiscussionInOrg: { - method: "GET", - params: { - discussion_number: { - required: true, - type: "integer" - }, - org: { - required: true, - type: "string" - }, - team_slug: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/teams/:team_slug/discussions/:discussion_number" - }, - getDiscussionLegacy: { - deprecated: "octokit.teams.getDiscussionLegacy() is deprecated, see https://developer.github.com/v3/teams/discussions/#get-a-single-discussion-legacy", - method: "GET", - params: { - discussion_number: { - required: true, - type: "integer" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/discussions/:discussion_number" - }, - getLegacy: { - deprecated: "octokit.teams.getLegacy() is deprecated, see https://developer.github.com/v3/teams/#get-team-legacy", - method: "GET", - params: { - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id" - }, - getMember: { - deprecated: "octokit.teams.getMember() has been renamed to octokit.teams.getMemberLegacy() (2020-01-16)", - method: "GET", - params: { - team_id: { - required: true, - type: "integer" - }, - username: { - required: true, - type: "string" - } - }, - url: "/teams/:team_id/members/:username" - }, - getMemberLegacy: { - deprecated: "octokit.teams.getMemberLegacy() is deprecated, see https://developer.github.com/v3/teams/members/#get-team-member-legacy", - method: "GET", - params: { - team_id: { - required: true, - type: "integer" - }, - username: { - required: true, - type: "string" - } - }, - url: "/teams/:team_id/members/:username" - }, - getMembership: { - deprecated: "octokit.teams.getMembership() has been renamed to octokit.teams.getMembershipLegacy() (2020-01-16)", - method: "GET", - params: { - team_id: { - required: true, - type: "integer" - }, - username: { - required: true, - type: "string" - } - }, - url: "/teams/:team_id/memberships/:username" - }, - getMembershipInOrg: { - method: "GET", - params: { - org: { - required: true, - type: "string" - }, - team_slug: { - required: true, - type: "string" - }, - username: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/teams/:team_slug/memberships/:username" - }, - getMembershipLegacy: { - deprecated: "octokit.teams.getMembershipLegacy() is deprecated, see https://developer.github.com/v3/teams/members/#get-team-membership-legacy", - method: "GET", - params: { - team_id: { - required: true, - type: "integer" - }, - username: { - required: true, - type: "string" - } - }, - url: "/teams/:team_id/memberships/:username" - }, - list: { - method: "GET", - params: { - org: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - } - }, - url: "/orgs/:org/teams" - }, - listChild: { - deprecated: "octokit.teams.listChild() has been renamed to octokit.teams.listChildLegacy() (2020-01-16)", - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/teams" - }, - listChildInOrg: { - method: "GET", - params: { - org: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - team_slug: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/teams/:team_slug/teams" - }, - listChildLegacy: { - deprecated: "octokit.teams.listChildLegacy() is deprecated, see https://developer.github.com/v3/teams/#list-child-teams-legacy", - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/teams" - }, - listDiscussionComments: { - deprecated: "octokit.teams.listDiscussionComments() has been renamed to octokit.teams.listDiscussionCommentsLegacy() (2020-01-16)", - method: "GET", - params: { - direction: { - enum: ["asc", "desc"], - type: "string" - }, - discussion_number: { - required: true, - type: "integer" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/discussions/:discussion_number/comments" - }, - listDiscussionCommentsInOrg: { - method: "GET", - params: { - direction: { - enum: ["asc", "desc"], - type: "string" - }, - discussion_number: { - required: true, - type: "integer" - }, - org: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - team_slug: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/teams/:team_slug/discussions/:discussion_number/comments" - }, - listDiscussionCommentsLegacy: { - deprecated: "octokit.teams.listDiscussionCommentsLegacy() is deprecated, see https://developer.github.com/v3/teams/discussion_comments/#list-comments-legacy", - method: "GET", - params: { - direction: { - enum: ["asc", "desc"], - type: "string" - }, - discussion_number: { - required: true, - type: "integer" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/discussions/:discussion_number/comments" - }, - listDiscussions: { - deprecated: "octokit.teams.listDiscussions() has been renamed to octokit.teams.listDiscussionsLegacy() (2020-01-16)", - method: "GET", - params: { - direction: { - enum: ["asc", "desc"], - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/discussions" - }, - listDiscussionsInOrg: { - method: "GET", - params: { - direction: { - enum: ["asc", "desc"], - type: "string" - }, - org: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - team_slug: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/teams/:team_slug/discussions" - }, - listDiscussionsLegacy: { - deprecated: "octokit.teams.listDiscussionsLegacy() is deprecated, see https://developer.github.com/v3/teams/discussions/#list-discussions-legacy", - method: "GET", - params: { - direction: { - enum: ["asc", "desc"], - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/discussions" - }, - listForAuthenticatedUser: { - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - } - }, - url: "/user/teams" - }, - listMembers: { - deprecated: "octokit.teams.listMembers() has been renamed to octokit.teams.listMembersLegacy() (2020-01-16)", - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - role: { - enum: ["member", "maintainer", "all"], - type: "string" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/members" - }, - listMembersInOrg: { - method: "GET", - params: { - org: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - role: { - enum: ["member", "maintainer", "all"], - type: "string" - }, - team_slug: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/teams/:team_slug/members" - }, - listMembersLegacy: { - deprecated: "octokit.teams.listMembersLegacy() is deprecated, see https://developer.github.com/v3/teams/members/#list-team-members-legacy", - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - role: { - enum: ["member", "maintainer", "all"], - type: "string" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/members" - }, - listPendingInvitations: { - deprecated: "octokit.teams.listPendingInvitations() has been renamed to octokit.teams.listPendingInvitationsLegacy() (2020-01-16)", - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/invitations" - }, - listPendingInvitationsInOrg: { - method: "GET", - params: { - org: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - team_slug: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/teams/:team_slug/invitations" - }, - listPendingInvitationsLegacy: { - deprecated: "octokit.teams.listPendingInvitationsLegacy() is deprecated, see https://developer.github.com/v3/teams/members/#list-pending-team-invitations-legacy", - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/invitations" - }, - listProjects: { - deprecated: "octokit.teams.listProjects() has been renamed to octokit.teams.listProjectsLegacy() (2020-01-16)", - headers: { - accept: "application/vnd.github.inertia-preview+json" - }, - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/projects" - }, - listProjectsInOrg: { - headers: { - accept: "application/vnd.github.inertia-preview+json" - }, - method: "GET", - params: { - org: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - team_slug: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/teams/:team_slug/projects" - }, - listProjectsLegacy: { - deprecated: "octokit.teams.listProjectsLegacy() is deprecated, see https://developer.github.com/v3/teams/#list-team-projects-legacy", - headers: { - accept: "application/vnd.github.inertia-preview+json" - }, - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/projects" - }, - listRepos: { - deprecated: "octokit.teams.listRepos() has been renamed to octokit.teams.listReposLegacy() (2020-01-16)", - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/repos" - }, - listReposInOrg: { - method: "GET", - params: { - org: { - required: true, - type: "string" - }, - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - team_slug: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/teams/:team_slug/repos" - }, - listReposLegacy: { - deprecated: "octokit.teams.listReposLegacy() is deprecated, see https://developer.github.com/v3/teams/#list-team-repos-legacy", - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/repos" - }, - removeMember: { - deprecated: "octokit.teams.removeMember() has been renamed to octokit.teams.removeMemberLegacy() (2020-01-16)", - method: "DELETE", - params: { - team_id: { - required: true, - type: "integer" - }, - username: { - required: true, - type: "string" - } - }, - url: "/teams/:team_id/members/:username" - }, - removeMemberLegacy: { - deprecated: "octokit.teams.removeMemberLegacy() is deprecated, see https://developer.github.com/v3/teams/members/#remove-team-member-legacy", - method: "DELETE", - params: { - team_id: { - required: true, - type: "integer" - }, - username: { - required: true, - type: "string" - } - }, - url: "/teams/:team_id/members/:username" - }, - removeMembership: { - deprecated: "octokit.teams.removeMembership() has been renamed to octokit.teams.removeMembershipLegacy() (2020-01-16)", - method: "DELETE", - params: { - team_id: { - required: true, - type: "integer" - }, - username: { - required: true, - type: "string" - } - }, - url: "/teams/:team_id/memberships/:username" - }, - removeMembershipInOrg: { - method: "DELETE", - params: { - org: { - required: true, - type: "string" - }, - team_slug: { - required: true, - type: "string" - }, - username: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/teams/:team_slug/memberships/:username" - }, - removeMembershipLegacy: { - deprecated: "octokit.teams.removeMembershipLegacy() is deprecated, see https://developer.github.com/v3/teams/members/#remove-team-membership-legacy", - method: "DELETE", - params: { - team_id: { - required: true, - type: "integer" - }, - username: { - required: true, - type: "string" - } - }, - url: "/teams/:team_id/memberships/:username" - }, - removeProject: { - deprecated: "octokit.teams.removeProject() has been renamed to octokit.teams.removeProjectLegacy() (2020-01-16)", - method: "DELETE", - params: { - project_id: { - required: true, - type: "integer" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/projects/:project_id" - }, - removeProjectInOrg: { - method: "DELETE", - params: { - org: { - required: true, - type: "string" - }, - project_id: { - required: true, - type: "integer" - }, - team_slug: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/teams/:team_slug/projects/:project_id" - }, - removeProjectLegacy: { - deprecated: "octokit.teams.removeProjectLegacy() is deprecated, see https://developer.github.com/v3/teams/#remove-team-project-legacy", - method: "DELETE", - params: { - project_id: { - required: true, - type: "integer" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/projects/:project_id" - }, - removeRepo: { - deprecated: "octokit.teams.removeRepo() has been renamed to octokit.teams.removeRepoLegacy() (2020-01-16)", - method: "DELETE", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/repos/:owner/:repo" - }, - removeRepoInOrg: { - method: "DELETE", - params: { - org: { - required: true, - type: "string" - }, - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - team_slug: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/teams/:team_slug/repos/:owner/:repo" - }, - removeRepoLegacy: { - deprecated: "octokit.teams.removeRepoLegacy() is deprecated, see https://developer.github.com/v3/teams/#remove-team-repository-legacy", - method: "DELETE", - params: { - owner: { - required: true, - type: "string" - }, - repo: { - required: true, - type: "string" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/repos/:owner/:repo" - }, - reviewProject: { - deprecated: "octokit.teams.reviewProject() has been renamed to octokit.teams.reviewProjectLegacy() (2020-01-16)", - headers: { - accept: "application/vnd.github.inertia-preview+json" - }, - method: "GET", - params: { - project_id: { - required: true, - type: "integer" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/projects/:project_id" - }, - reviewProjectInOrg: { - headers: { - accept: "application/vnd.github.inertia-preview+json" - }, - method: "GET", - params: { - org: { - required: true, - type: "string" - }, - project_id: { - required: true, - type: "integer" - }, - team_slug: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/teams/:team_slug/projects/:project_id" - }, - reviewProjectLegacy: { - deprecated: "octokit.teams.reviewProjectLegacy() is deprecated, see https://developer.github.com/v3/teams/#review-a-team-project-legacy", - headers: { - accept: "application/vnd.github.inertia-preview+json" - }, - method: "GET", - params: { - project_id: { - required: true, - type: "integer" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/projects/:project_id" - }, - update: { - deprecated: "octokit.teams.update() has been renamed to octokit.teams.updateLegacy() (2020-01-16)", - method: "PATCH", - params: { - description: { - type: "string" - }, - name: { - required: true, - type: "string" - }, - parent_team_id: { - type: "integer" - }, - permission: { - enum: ["pull", "push", "admin"], - type: "string" - }, - privacy: { - enum: ["secret", "closed"], - type: "string" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id" - }, - updateDiscussion: { - deprecated: "octokit.teams.updateDiscussion() has been renamed to octokit.teams.updateDiscussionLegacy() (2020-01-16)", - method: "PATCH", - params: { - body: { - type: "string" - }, - discussion_number: { - required: true, - type: "integer" - }, - team_id: { - required: true, - type: "integer" - }, - title: { - type: "string" - } - }, - url: "/teams/:team_id/discussions/:discussion_number" - }, - updateDiscussionComment: { - deprecated: "octokit.teams.updateDiscussionComment() has been renamed to octokit.teams.updateDiscussionCommentLegacy() (2020-01-16)", - method: "PATCH", - params: { - body: { - required: true, - type: "string" - }, - comment_number: { - required: true, - type: "integer" - }, - discussion_number: { - required: true, - type: "integer" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/discussions/:discussion_number/comments/:comment_number" - }, - updateDiscussionCommentInOrg: { - method: "PATCH", - params: { - body: { - required: true, - type: "string" - }, - comment_number: { - required: true, - type: "integer" - }, - discussion_number: { - required: true, - type: "integer" - }, - org: { - required: true, - type: "string" - }, - team_slug: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/teams/:team_slug/discussions/:discussion_number/comments/:comment_number" - }, - updateDiscussionCommentLegacy: { - deprecated: "octokit.teams.updateDiscussionCommentLegacy() is deprecated, see https://developer.github.com/v3/teams/discussion_comments/#edit-a-comment-legacy", - method: "PATCH", - params: { - body: { - required: true, - type: "string" - }, - comment_number: { - required: true, - type: "integer" - }, - discussion_number: { - required: true, - type: "integer" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id/discussions/:discussion_number/comments/:comment_number" - }, - updateDiscussionInOrg: { - method: "PATCH", - params: { - body: { - type: "string" - }, - discussion_number: { - required: true, - type: "integer" - }, - org: { - required: true, - type: "string" - }, - team_slug: { - required: true, - type: "string" - }, - title: { - type: "string" - } - }, - url: "/orgs/:org/teams/:team_slug/discussions/:discussion_number" - }, - updateDiscussionLegacy: { - deprecated: "octokit.teams.updateDiscussionLegacy() is deprecated, see https://developer.github.com/v3/teams/discussions/#edit-a-discussion-legacy", - method: "PATCH", - params: { - body: { - type: "string" - }, - discussion_number: { - required: true, - type: "integer" - }, - team_id: { - required: true, - type: "integer" - }, - title: { - type: "string" - } - }, - url: "/teams/:team_id/discussions/:discussion_number" - }, - updateInOrg: { - method: "PATCH", - params: { - description: { - type: "string" - }, - name: { - required: true, - type: "string" - }, - org: { - required: true, - type: "string" - }, - parent_team_id: { - type: "integer" - }, - permission: { - enum: ["pull", "push", "admin"], - type: "string" - }, - privacy: { - enum: ["secret", "closed"], - type: "string" - }, - team_slug: { - required: true, - type: "string" - } - }, - url: "/orgs/:org/teams/:team_slug" - }, - updateLegacy: { - deprecated: "octokit.teams.updateLegacy() is deprecated, see https://developer.github.com/v3/teams/#edit-team-legacy", - method: "PATCH", - params: { - description: { - type: "string" - }, - name: { - required: true, - type: "string" - }, - parent_team_id: { - type: "integer" - }, - permission: { - enum: ["pull", "push", "admin"], - type: "string" - }, - privacy: { - enum: ["secret", "closed"], - type: "string" - }, - team_id: { - required: true, - type: "integer" - } - }, - url: "/teams/:team_id" - } - }, - users: { - addEmails: { - method: "POST", - params: { - emails: { - required: true, - type: "string[]" - } - }, - url: "/user/emails" - }, - block: { - method: "PUT", - params: { - username: { - required: true, - type: "string" - } - }, - url: "/user/blocks/:username" - }, - checkBlocked: { - method: "GET", - params: { - username: { - required: true, - type: "string" - } - }, - url: "/user/blocks/:username" - }, - checkFollowing: { - method: "GET", - params: { - username: { - required: true, - type: "string" - } - }, - url: "/user/following/:username" - }, - checkFollowingForUser: { - method: "GET", - params: { - target_user: { - required: true, - type: "string" - }, - username: { - required: true, - type: "string" - } - }, - url: "/users/:username/following/:target_user" - }, - createGpgKey: { - method: "POST", - params: { - armored_public_key: { - type: "string" - } - }, - url: "/user/gpg_keys" - }, - createPublicKey: { - method: "POST", - params: { - key: { - type: "string" - }, - title: { - type: "string" - } - }, - url: "/user/keys" - }, - deleteEmails: { - method: "DELETE", - params: { - emails: { - required: true, - type: "string[]" - } - }, - url: "/user/emails" - }, - deleteGpgKey: { - method: "DELETE", - params: { - gpg_key_id: { - required: true, - type: "integer" - } - }, - url: "/user/gpg_keys/:gpg_key_id" - }, - deletePublicKey: { - method: "DELETE", - params: { - key_id: { - required: true, - type: "integer" - } - }, - url: "/user/keys/:key_id" - }, - follow: { - method: "PUT", - params: { - username: { - required: true, - type: "string" - } - }, - url: "/user/following/:username" - }, - getAuthenticated: { - method: "GET", - params: {}, - url: "/user" - }, - getByUsername: { - method: "GET", - params: { - username: { - required: true, - type: "string" - } - }, - url: "/users/:username" - }, - getContextForUser: { - method: "GET", - params: { - subject_id: { - type: "string" - }, - subject_type: { - enum: ["organization", "repository", "issue", "pull_request"], - type: "string" - }, - username: { - required: true, - type: "string" - } - }, - url: "/users/:username/hovercard" - }, - getGpgKey: { - method: "GET", - params: { - gpg_key_id: { - required: true, - type: "integer" - } - }, - url: "/user/gpg_keys/:gpg_key_id" - }, - getPublicKey: { - method: "GET", - params: { - key_id: { - required: true, - type: "integer" - } - }, - url: "/user/keys/:key_id" - }, - list: { - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - since: { - type: "string" - } - }, - url: "/users" - }, - listBlocked: { - method: "GET", - params: {}, - url: "/user/blocks" - }, - listEmails: { - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - } - }, - url: "/user/emails" - }, - listFollowersForAuthenticatedUser: { - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - } - }, - url: "/user/followers" - }, - listFollowersForUser: { - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - username: { - required: true, - type: "string" - } - }, - url: "/users/:username/followers" - }, - listFollowingForAuthenticatedUser: { - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - } - }, - url: "/user/following" - }, - listFollowingForUser: { - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - username: { - required: true, - type: "string" - } - }, - url: "/users/:username/following" - }, - listGpgKeys: { - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - } - }, - url: "/user/gpg_keys" - }, - listGpgKeysForUser: { - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - username: { - required: true, - type: "string" - } - }, - url: "/users/:username/gpg_keys" - }, - listPublicEmails: { - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - } - }, - url: "/user/public_emails" - }, - listPublicKeys: { - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - } - }, - url: "/user/keys" - }, - listPublicKeysForUser: { - method: "GET", - params: { - page: { - type: "integer" - }, - per_page: { - type: "integer" - }, - username: { - required: true, - type: "string" - } - }, - url: "/users/:username/keys" - }, - togglePrimaryEmailVisibility: { - method: "PATCH", - params: { - email: { - required: true, - type: "string" - }, - visibility: { - required: true, - type: "string" - } - }, - url: "/user/email/visibility" - }, - unblock: { - method: "DELETE", - params: { - username: { - required: true, - type: "string" - } - }, - url: "/user/blocks/:username" - }, - unfollow: { - method: "DELETE", - params: { - username: { - required: true, - type: "string" - } - }, - url: "/user/following/:username" - }, - updateAuthenticated: { - method: "PATCH", - params: { - bio: { - type: "string" - }, - blog: { - type: "string" - }, - company: { - type: "string" - }, - email: { - type: "string" - }, - hireable: { - type: "boolean" - }, - location: { - type: "string" - }, - name: { - type: "string" - } - }, - url: "/user" - } + pause () { + this[FLOWING] = false + this[PAUSED] = true + } + + get destroyed () { + return this[DESTROYED] + } + + get flowing () { + return this[FLOWING] + } + + get paused () { + return this[PAUSED] } -}; -const VERSION = "2.4.0"; + [BUFFERPUSH] (chunk) { + if (this[OBJECTMODE]) + this[BUFFERLENGTH] += 1 + else + this[BUFFERLENGTH] += chunk.length + return this.buffer.push(chunk) + } -function registerEndpoints(octokit, routes) { - Object.keys(routes).forEach(namespaceName => { - if (!octokit[namespaceName]) { - octokit[namespaceName] = {}; + [BUFFERSHIFT] () { + if (this.buffer.length) { + if (this[OBJECTMODE]) + this[BUFFERLENGTH] -= 1 + else + this[BUFFERLENGTH] -= this.buffer.head.value.length } + return this.buffer.shift() + } - Object.keys(routes[namespaceName]).forEach(apiName => { - const apiOptions = routes[namespaceName][apiName]; - const endpointDefaults = ["method", "url", "headers"].reduce((map, key) => { - if (typeof apiOptions[key] !== "undefined") { - map[key] = apiOptions[key]; - } + [FLUSH] (noDrain) { + do {} while (this[FLUSHCHUNK](this[BUFFERSHIFT]())) - return map; - }, {}); - endpointDefaults.request = { - validate: apiOptions.params - }; - let request = octokit.request.defaults(endpointDefaults); // patch request & endpoint methods to support deprecated parameters. - // Not the most elegant solution, but we don’t want to move deprecation - // logic into octokit/endpoint.js as it’s out of scope - - const hasDeprecatedParam = Object.keys(apiOptions.params || {}).find(key => apiOptions.params[key].deprecated); - - if (hasDeprecatedParam) { - const patch = patchForDeprecation.bind(null, octokit, apiOptions); - request = patch(octokit.request.defaults(endpointDefaults), `.${namespaceName}.${apiName}()`); - request.endpoint = patch(request.endpoint, `.${namespaceName}.${apiName}.endpoint()`); - request.endpoint.merge = patch(request.endpoint.merge, `.${namespaceName}.${apiName}.endpoint.merge()`); - } + if (!noDrain && !this.buffer.length && !this[EOF]) + this.emit('drain') + } - if (apiOptions.deprecated) { - octokit[namespaceName][apiName] = Object.assign(function deprecatedEndpointMethod() { - octokit.log.warn(new deprecation.Deprecation(`[@octokit/rest] ${apiOptions.deprecated}`)); - octokit[namespaceName][apiName] = request; - return request.apply(null, arguments); - }, request); - return; - } + [FLUSHCHUNK] (chunk) { + return chunk ? (this.emit('data', chunk), this.flowing) : false + } - octokit[namespaceName][apiName] = request; - }); - }); -} + pipe (dest, opts) { + if (this[DESTROYED]) + return + + const ended = this[EMITTED_END] + opts = opts || {} + if (dest === process.stdout || dest === process.stderr) + opts.end = false + else + opts.end = opts.end !== false -function patchForDeprecation(octokit, apiOptions, method, methodName) { - const patchedMethod = options => { - options = Object.assign({}, options); - Object.keys(options).forEach(key => { - if (apiOptions.params[key] && apiOptions.params[key].deprecated) { - const aliasKey = apiOptions.params[key].alias; - octokit.log.warn(new deprecation.Deprecation(`[@octokit/rest] "${key}" parameter is deprecated for "${methodName}". Use "${aliasKey}" instead`)); + const p = { dest: dest, opts: opts, ondrain: _ => this[RESUME]() } + this.pipes.push(p) - if (!(aliasKey in options)) { - options[aliasKey] = options[key]; - } + dest.on('drain', p.ondrain) + this[RESUME]() + // piping an ended stream ends immediately + if (ended && p.opts.end) + p.dest.end() + return dest + } + + addListener (ev, fn) { + return this.on(ev, fn) + } - delete options[key]; + on (ev, fn) { + try { + return super.on(ev, fn) + } finally { + if (ev === 'data' && !this.pipes.length && !this.flowing) + this[RESUME]() + else if (isEndish(ev) && this[EMITTED_END]) { + super.emit(ev) + this.removeAllListeners(ev) } - }); - return method(options); - }; + } + } - Object.keys(method).forEach(key => { - patchedMethod[key] = method[key]; - }); - return patchedMethod; -} + get emittedEnd () { + return this[EMITTED_END] + } -/** - * This plugin is a 1:1 copy of internal @octokit/rest plugins. The primary - * goal is to rebuild @octokit/rest on top of @octokit/core. Once that is - * done, we will remove the registerEndpoints methods and return the methods - * directly as with the other plugins. At that point we will also remove the - * legacy workarounds and deprecations. - * - * See the plan at - * https://github.com/octokit/plugin-rest-endpoint-methods.js/pull/1 - */ + [MAYBE_EMIT_END] () { + if (!this[EMITTING_END] && + !this[EMITTED_END] && + !this[DESTROYED] && + this.buffer.length === 0 && + this[EOF]) { + this[EMITTING_END] = true + this.emit('end') + this.emit('prefinish') + this.emit('finish') + if (this[CLOSED]) + this.emit('close') + this[EMITTING_END] = false + } + } -function restEndpointMethods(octokit) { - // @ts-ignore - octokit.registerEndpoints = registerEndpoints.bind(null, octokit); - registerEndpoints(octokit, endpointsByScope); // Aliasing scopes for backward compatibility - // See https://github.com/octokit/rest.js/pull/1134 + emit (ev, data) { + // error and close are only events allowed after calling destroy() + if (ev !== 'error' && ev !== 'close' && ev !== DESTROYED && this[DESTROYED]) + return + else if (ev === 'data') { + if (!data) + return - [["gitdata", "git"], ["authorization", "oauthAuthorizations"], ["pullRequests", "pulls"]].forEach(([deprecatedScope, scope]) => { - Object.defineProperty(octokit, deprecatedScope, { - get() { - octokit.log.warn( // @ts-ignore - new deprecation.Deprecation(`[@octokit/plugin-rest-endpoint-methods] "octokit.${deprecatedScope}.*" methods are deprecated, use "octokit.${scope}.*" instead`)); // @ts-ignore + if (this.pipes.length) + this.pipes.forEach(p => + p.dest.write(data) === false && this.pause()) + } else if (ev === 'end') { + // only actual end gets this treatment + if (this[EMITTED_END] === true) + return + + this[EMITTED_END] = true + this.readable = false - return octokit[scope]; + if (this[DECODER]) { + data = this[DECODER].end() + if (data) { + this.pipes.forEach(p => p.dest.write(data)) + super.emit('data', data) + } } - }); - }); - return {}; -} -restEndpointMethods.VERSION = VERSION; + this.pipes.forEach(p => { + p.dest.removeListener('drain', p.ondrain) + if (p.opts.end) + p.dest.end() + }) + } else if (ev === 'close') { + this[CLOSED] = true + // don't emit close before 'end' and 'finish' + if (!this[EMITTED_END] && !this[DESTROYED]) + return + } -exports.restEndpointMethods = restEndpointMethods; -//# sourceMappingURL=index.js.map + // TODO: replace with a spread operator when Node v4 support drops + const args = new Array(arguments.length) + args[0] = ev + args[1] = data + if (arguments.length > 2) { + for (let i = 2; i < arguments.length; i++) { + args[i] = arguments[i] + } + } + + try { + return super.emit.apply(this, args) + } finally { + if (!isEndish(ev)) + this[MAYBE_EMIT_END]() + else + this.removeAllListeners(ev) + } + } + // const all = await stream.collect() + collect () { + const buf = [] + if (!this[OBJECTMODE]) + buf.dataLength = 0 + // set the promise first, in case an error is raised + // by triggering the flow here. + const p = this.promise() + this.on('data', c => { + buf.push(c) + if (!this[OBJECTMODE]) + buf.dataLength += c.length + }) + return p.then(() => buf) + } -/***/ }), + // const data = await stream.concat() + concat () { + return this[OBJECTMODE] + ? Promise.reject(new Error('cannot concat in objectMode')) + : this.collect().then(buf => + this[OBJECTMODE] + ? Promise.reject(new Error('cannot concat in objectMode')) + : this[ENCODING] ? buf.join('') : Buffer.concat(buf, buf.dataLength)) + } -/***/ 850: -/***/ (function(module, __unusedexports, __webpack_require__) { + // stream.promise().then(() => done, er => emitted error) + promise () { + return new Promise((resolve, reject) => { + this.on(DESTROYED, () => reject(new Error('stream destroyed'))) + this.on('end', () => resolve()) + this.on('error', er => reject(er)) + }) + } -module.exports = paginationMethodsPlugin + // for await (let chunk of stream) + [ASYNCITERATOR] () { + const next = () => { + const res = this.read() + if (res !== null) + return Promise.resolve({ done: false, value: res }) -function paginationMethodsPlugin (octokit) { - octokit.getFirstPage = __webpack_require__(777).bind(null, octokit) - octokit.getLastPage = __webpack_require__(649).bind(null, octokit) - octokit.getNextPage = __webpack_require__(550).bind(null, octokit) - octokit.getPreviousPage = __webpack_require__(563).bind(null, octokit) - octokit.hasFirstPage = __webpack_require__(536) - octokit.hasLastPage = __webpack_require__(336) - octokit.hasNextPage = __webpack_require__(929) - octokit.hasPreviousPage = __webpack_require__(558) -} + if (this[EOF]) + return Promise.resolve({ done: true }) + let resolve = null + let reject = null + const onerr = er => { + this.removeListener('data', ondata) + this.removeListener('end', onend) + reject(er) + } + const ondata = value => { + this.removeListener('error', onerr) + this.removeListener('end', onend) + this.pause() + resolve({ value: value, done: !!this[EOF] }) + } + const onend = () => { + this.removeListener('error', onerr) + this.removeListener('data', ondata) + resolve({ done: true }) + } + const ondestroy = () => onerr(new Error('stream destroyed')) + return new Promise((res, rej) => { + reject = rej + resolve = res + this.once(DESTROYED, ondestroy) + this.once('error', onerr) + this.once('end', onend) + this.once('data', ondata) + }) + } -/***/ }), + return { next } + } -/***/ 854: -/***/ (function(module) { + // for (let chunk of stream) + [ITERATOR] () { + const next = () => { + const value = this.read() + const done = value === null + return { value, done } + } + return { next } + } -/** - * lodash (Custom Build) - * Build: `lodash modularize exports="npm" -o ./` - * Copyright jQuery Foundation and other contributors - * Released under MIT license - * Based on Underscore.js 1.8.3 - * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors - */ + destroy (er) { + if (this[DESTROYED]) { + if (er) + this.emit('error', er) + else + this.emit(DESTROYED) + return this + } -/** Used as the `TypeError` message for "Functions" methods. */ -var FUNC_ERROR_TEXT = 'Expected a function'; + this[DESTROYED] = true -/** Used to stand-in for `undefined` hash values. */ -var HASH_UNDEFINED = '__lodash_hash_undefined__'; + // throw away all buffered data, it's never coming out + this.buffer = new Yallist() + this[BUFFERLENGTH] = 0 -/** Used as references for various `Number` constants. */ -var INFINITY = 1 / 0; + if (typeof this.close === 'function' && !this[CLOSED]) + this.close() -/** `Object#toString` result references. */ -var funcTag = '[object Function]', - genTag = '[object GeneratorFunction]', - symbolTag = '[object Symbol]'; + if (er) + this.emit('error', er) + else // if no error to emit, still reject pending promises + this.emit(DESTROYED) -/** Used to match property names within property paths. */ -var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, - reIsPlainProp = /^\w*$/, - reLeadingDot = /^\./, - rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; + return this + } -/** - * Used to match `RegExp` - * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). - */ -var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; + static isStream (s) { + return !!s && (s instanceof Minipass || s instanceof Stream || + s instanceof EE && ( + typeof s.pipe === 'function' || // readable + (typeof s.write === 'function' && typeof s.end === 'function') // writable + )) + } +} -/** Used to match backslashes in property paths. */ -var reEscapeChar = /\\(\\)?/g; -/** Used to detect host constructors (Safari). */ -var reIsHostCtor = /^\[object .+?Constructor\]$/; +/***/ }), -/** Detect free variable `global` from Node.js. */ -var freeGlobal = typeof global == 'object' && global && global.Object === Object && global; +/***/ 726: +/***/ (function(module, __unusedexports, __webpack_require__) { -/** Detect free variable `self`. */ -var freeSelf = typeof self == 'object' && self && self.Object === Object && self; +"use strict"; -/** Used as a reference to the global object. */ -var root = freeGlobal || freeSelf || Function('return this')(); -/** - * Gets the value at `key` of `object`. - * - * @private - * @param {Object} [object] The object to query. - * @param {string} key The key of the property to get. - * @returns {*} Returns the property value. - */ -function getValue(object, key) { - return object == null ? undefined : object[key]; -} +// A readable tar stream creator +// Technically, this is a transform stream that you write paths into, +// and tar format comes out of. +// The `add()` method is like `write()` but returns this, +// and end() return `this` as well, so you can +// do `new Pack(opt).add('files').add('dir').end().pipe(output) +// You could also do something like: +// streamOfPaths().pipe(new Pack()).pipe(new fs.WriteStream('out.tar')) -/** - * Checks if `value` is a host object in IE < 9. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a host object, else `false`. - */ -function isHostObject(value) { - // Many host objects are `Object` objects that can coerce to strings - // despite having improperly defined `toString` methods. - var result = false; - if (value != null && typeof value.toString != 'function') { - try { - result = !!(value + ''); - } catch (e) {} +class PackJob { + constructor (path, absolute) { + this.path = path || './' + this.absolute = absolute + this.entry = null + this.stat = null + this.readdir = null + this.pending = false + this.ignore = false + this.piped = false } - return result; } -/** Used for built-in method references. */ -var arrayProto = Array.prototype, - funcProto = Function.prototype, - objectProto = Object.prototype; - -/** Used to detect overreaching core-js shims. */ -var coreJsData = root['__core-js_shared__']; - -/** Used to detect methods masquerading as native. */ -var maskSrcKey = (function() { - var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ''); - return uid ? ('Symbol(src)_1.' + uid) : ''; -}()); - -/** Used to resolve the decompiled source of functions. */ -var funcToString = funcProto.toString; - -/** Used to check objects for own properties. */ -var hasOwnProperty = objectProto.hasOwnProperty; +const MiniPass = __webpack_require__(720) +const zlib = __webpack_require__(133) +const ReadEntry = __webpack_require__(662) +const WriteEntry = __webpack_require__(303) +const WriteEntrySync = WriteEntry.Sync +const WriteEntryTar = WriteEntry.Tar +const Yallist = __webpack_require__(612) +const EOF = Buffer.alloc(1024) +const ONSTAT = Symbol('onStat') +const ENDED = Symbol('ended') +const QUEUE = Symbol('queue') +const CURRENT = Symbol('current') +const PROCESS = Symbol('process') +const PROCESSING = Symbol('processing') +const PROCESSJOB = Symbol('processJob') +const JOBS = Symbol('jobs') +const JOBDONE = Symbol('jobDone') +const ADDFSENTRY = Symbol('addFSEntry') +const ADDTARENTRY = Symbol('addTarEntry') +const STAT = Symbol('stat') +const READDIR = Symbol('readdir') +const ONREADDIR = Symbol('onreaddir') +const PIPE = Symbol('pipe') +const ENTRY = Symbol('entry') +const ENTRYOPT = Symbol('entryOpt') +const WRITEENTRYCLASS = Symbol('writeEntryClass') +const WRITE = Symbol('write') +const ONDRAIN = Symbol('ondrain') -/** - * Used to resolve the - * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) - * of values. - */ -var objectToString = objectProto.toString; +const fs = __webpack_require__(747) +const path = __webpack_require__(622) +const warner = __webpack_require__(796) -/** Used to detect if a method is native. */ -var reIsNative = RegExp('^' + - funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&') - .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' -); +const Pack = warner(class Pack extends MiniPass { + constructor (opt) { + super(opt) + opt = opt || Object.create(null) + this.opt = opt + this.file = opt.file || '' + this.cwd = opt.cwd || process.cwd() + this.maxReadSize = opt.maxReadSize + this.preservePaths = !!opt.preservePaths + this.strict = !!opt.strict + this.noPax = !!opt.noPax + this.prefix = (opt.prefix || '').replace(/(\\|\/)+$/, '') + this.linkCache = opt.linkCache || new Map() + this.statCache = opt.statCache || new Map() + this.readdirCache = opt.readdirCache || new Map() -/** Built-in value references. */ -var Symbol = root.Symbol, - splice = arrayProto.splice; + this[WRITEENTRYCLASS] = WriteEntry + if (typeof opt.onwarn === 'function') + this.on('warn', opt.onwarn) -/* Built-in method references that are verified to be native. */ -var Map = getNative(root, 'Map'), - nativeCreate = getNative(Object, 'create'); + this.portable = !!opt.portable + this.zip = null + if (opt.gzip) { + if (typeof opt.gzip !== 'object') + opt.gzip = {} + if (this.portable) + opt.gzip.portable = true + this.zip = new zlib.Gzip(opt.gzip) + this.zip.on('data', chunk => super.write(chunk)) + this.zip.on('end', _ => super.end()) + this.zip.on('drain', _ => this[ONDRAIN]()) + this.on('resume', _ => this.zip.resume()) + } else + this.on('drain', this[ONDRAIN]) -/** Used to convert symbols to primitives and strings. */ -var symbolProto = Symbol ? Symbol.prototype : undefined, - symbolToString = symbolProto ? symbolProto.toString : undefined; + this.noDirRecurse = !!opt.noDirRecurse + this.follow = !!opt.follow + this.noMtime = !!opt.noMtime + this.mtime = opt.mtime || null -/** - * Creates a hash object. - * - * @private - * @constructor - * @param {Array} [entries] The key-value pairs to cache. - */ -function Hash(entries) { - var index = -1, - length = entries ? entries.length : 0; + this.filter = typeof opt.filter === 'function' ? opt.filter : _ => true - this.clear(); - while (++index < length) { - var entry = entries[index]; - this.set(entry[0], entry[1]); + this[QUEUE] = new Yallist + this[JOBS] = 0 + this.jobs = +opt.jobs || 4 + this[PROCESSING] = false + this[ENDED] = false } -} -/** - * Removes all key-value entries from the hash. - * - * @private - * @name clear - * @memberOf Hash - */ -function hashClear() { - this.__data__ = nativeCreate ? nativeCreate(null) : {}; -} + [WRITE] (chunk) { + return super.write(chunk) + } -/** - * Removes `key` and its value from the hash. - * - * @private - * @name delete - * @memberOf Hash - * @param {Object} hash The hash to modify. - * @param {string} key The key of the value to remove. - * @returns {boolean} Returns `true` if the entry was removed, else `false`. - */ -function hashDelete(key) { - return this.has(key) && delete this.__data__[key]; -} + add (path) { + this.write(path) + return this + } -/** - * Gets the hash value for `key`. - * - * @private - * @name get - * @memberOf Hash - * @param {string} key The key of the value to get. - * @returns {*} Returns the entry value. - */ -function hashGet(key) { - var data = this.__data__; - if (nativeCreate) { - var result = data[key]; - return result === HASH_UNDEFINED ? undefined : result; + end (path) { + if (path) + this.write(path) + this[ENDED] = true + this[PROCESS]() + return this } - return hasOwnProperty.call(data, key) ? data[key] : undefined; -} -/** - * Checks if a hash value for `key` exists. - * - * @private - * @name has - * @memberOf Hash - * @param {string} key The key of the entry to check. - * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. - */ -function hashHas(key) { - var data = this.__data__; - return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key); -} + write (path) { + if (this[ENDED]) + throw new Error('write after end') -/** - * Sets the hash `key` to `value`. - * - * @private - * @name set - * @memberOf Hash - * @param {string} key The key of the value to set. - * @param {*} value The value to set. - * @returns {Object} Returns the hash instance. - */ -function hashSet(key, value) { - var data = this.__data__; - data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value; - return this; -} + if (path instanceof ReadEntry) + this[ADDTARENTRY](path) + else + this[ADDFSENTRY](path) + return this.flowing + } -// Add methods to `Hash`. -Hash.prototype.clear = hashClear; -Hash.prototype['delete'] = hashDelete; -Hash.prototype.get = hashGet; -Hash.prototype.has = hashHas; -Hash.prototype.set = hashSet; + [ADDTARENTRY] (p) { + const absolute = path.resolve(this.cwd, p.path) + if (this.prefix) + p.path = this.prefix + '/' + p.path.replace(/^\.(\/+|$)/, '') -/** - * Creates an list cache object. - * - * @private - * @constructor - * @param {Array} [entries] The key-value pairs to cache. - */ -function ListCache(entries) { - var index = -1, - length = entries ? entries.length : 0; + // in this case, we don't have to wait for the stat + if (!this.filter(p.path, p)) + p.resume() + else { + const job = new PackJob(p.path, absolute, false) + job.entry = new WriteEntryTar(p, this[ENTRYOPT](job)) + job.entry.on('end', _ => this[JOBDONE](job)) + this[JOBS] += 1 + this[QUEUE].push(job) + } - this.clear(); - while (++index < length) { - var entry = entries[index]; - this.set(entry[0], entry[1]); + this[PROCESS]() } -} - -/** - * Removes all key-value entries from the list cache. - * - * @private - * @name clear - * @memberOf ListCache - */ -function listCacheClear() { - this.__data__ = []; -} -/** - * Removes `key` and its value from the list cache. - * - * @private - * @name delete - * @memberOf ListCache - * @param {string} key The key of the value to remove. - * @returns {boolean} Returns `true` if the entry was removed, else `false`. - */ -function listCacheDelete(key) { - var data = this.__data__, - index = assocIndexOf(data, key); + [ADDFSENTRY] (p) { + const absolute = path.resolve(this.cwd, p) + if (this.prefix) + p = this.prefix + '/' + p.replace(/^\.(\/+|$)/, '') - if (index < 0) { - return false; + this[QUEUE].push(new PackJob(p, absolute)) + this[PROCESS]() } - var lastIndex = data.length - 1; - if (index == lastIndex) { - data.pop(); - } else { - splice.call(data, index, 1); + + [STAT] (job) { + job.pending = true + this[JOBS] += 1 + const stat = this.follow ? 'stat' : 'lstat' + fs[stat](job.absolute, (er, stat) => { + job.pending = false + this[JOBS] -= 1 + if (er) + this.emit('error', er) + else + this[ONSTAT](job, stat) + }) } - return true; -} -/** - * Gets the list cache value for `key`. - * - * @private - * @name get - * @memberOf ListCache - * @param {string} key The key of the value to get. - * @returns {*} Returns the entry value. - */ -function listCacheGet(key) { - var data = this.__data__, - index = assocIndexOf(data, key); + [ONSTAT] (job, stat) { + this.statCache.set(job.absolute, stat) + job.stat = stat - return index < 0 ? undefined : data[index][1]; -} + // now we have the stat, we can filter it. + if (!this.filter(job.path, stat)) + job.ignore = true -/** - * Checks if a list cache value for `key` exists. - * - * @private - * @name has - * @memberOf ListCache - * @param {string} key The key of the entry to check. - * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. - */ -function listCacheHas(key) { - return assocIndexOf(this.__data__, key) > -1; -} + this[PROCESS]() + } -/** - * Sets the list cache `key` to `value`. - * - * @private - * @name set - * @memberOf ListCache - * @param {string} key The key of the value to set. - * @param {*} value The value to set. - * @returns {Object} Returns the list cache instance. - */ -function listCacheSet(key, value) { - var data = this.__data__, - index = assocIndexOf(data, key); + [READDIR] (job) { + job.pending = true + this[JOBS] += 1 + fs.readdir(job.absolute, (er, entries) => { + job.pending = false + this[JOBS] -= 1 + if (er) + return this.emit('error', er) + this[ONREADDIR](job, entries) + }) + } - if (index < 0) { - data.push([key, value]); - } else { - data[index][1] = value; + [ONREADDIR] (job, entries) { + this.readdirCache.set(job.absolute, entries) + job.readdir = entries + this[PROCESS]() } - return this; -} -// Add methods to `ListCache`. -ListCache.prototype.clear = listCacheClear; -ListCache.prototype['delete'] = listCacheDelete; -ListCache.prototype.get = listCacheGet; -ListCache.prototype.has = listCacheHas; -ListCache.prototype.set = listCacheSet; + [PROCESS] () { + if (this[PROCESSING]) + return -/** - * Creates a map cache object to store key-value pairs. - * - * @private - * @constructor - * @param {Array} [entries] The key-value pairs to cache. - */ -function MapCache(entries) { - var index = -1, - length = entries ? entries.length : 0; + this[PROCESSING] = true + for (let w = this[QUEUE].head; + w !== null && this[JOBS] < this.jobs; + w = w.next) { + this[PROCESSJOB](w.value) + if (w.value.ignore) { + const p = w.next + this[QUEUE].removeNode(w) + w.next = p + } + } + + this[PROCESSING] = false - this.clear(); - while (++index < length) { - var entry = entries[index]; - this.set(entry[0], entry[1]); + if (this[ENDED] && !this[QUEUE].length && this[JOBS] === 0) { + if (this.zip) + this.zip.end(EOF) + else { + super.write(EOF) + super.end() + } + } } -} -/** - * Removes all key-value entries from the map. - * - * @private - * @name clear - * @memberOf MapCache - */ -function mapCacheClear() { - this.__data__ = { - 'hash': new Hash, - 'map': new (Map || ListCache), - 'string': new Hash - }; -} + get [CURRENT] () { + return this[QUEUE] && this[QUEUE].head && this[QUEUE].head.value + } -/** - * Removes `key` and its value from the map. - * - * @private - * @name delete - * @memberOf MapCache - * @param {string} key The key of the value to remove. - * @returns {boolean} Returns `true` if the entry was removed, else `false`. - */ -function mapCacheDelete(key) { - return getMapData(this, key)['delete'](key); -} + [JOBDONE] (job) { + this[QUEUE].shift() + this[JOBS] -= 1 + this[PROCESS]() + } -/** - * Gets the map value for `key`. - * - * @private - * @name get - * @memberOf MapCache - * @param {string} key The key of the value to get. - * @returns {*} Returns the entry value. - */ -function mapCacheGet(key) { - return getMapData(this, key).get(key); -} + [PROCESSJOB] (job) { + if (job.pending) + return -/** - * Checks if a map value for `key` exists. - * - * @private - * @name has - * @memberOf MapCache - * @param {string} key The key of the entry to check. - * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. - */ -function mapCacheHas(key) { - return getMapData(this, key).has(key); -} + if (job.entry) { + if (job === this[CURRENT] && !job.piped) + this[PIPE](job) + return + } -/** - * Sets the map `key` to `value`. - * - * @private - * @name set - * @memberOf MapCache - * @param {string} key The key of the value to set. - * @param {*} value The value to set. - * @returns {Object} Returns the map cache instance. - */ -function mapCacheSet(key, value) { - getMapData(this, key).set(key, value); - return this; -} + if (!job.stat) { + if (this.statCache.has(job.absolute)) + this[ONSTAT](job, this.statCache.get(job.absolute)) + else + this[STAT](job) + } + if (!job.stat) + return -// Add methods to `MapCache`. -MapCache.prototype.clear = mapCacheClear; -MapCache.prototype['delete'] = mapCacheDelete; -MapCache.prototype.get = mapCacheGet; -MapCache.prototype.has = mapCacheHas; -MapCache.prototype.set = mapCacheSet; + // filtered out! + if (job.ignore) + return -/** - * Gets the index at which the `key` is found in `array` of key-value pairs. - * - * @private - * @param {Array} array The array to inspect. - * @param {*} key The key to search for. - * @returns {number} Returns the index of the matched value, else `-1`. - */ -function assocIndexOf(array, key) { - var length = array.length; - while (length--) { - if (eq(array[length][0], key)) { - return length; + if (!this.noDirRecurse && job.stat.isDirectory() && !job.readdir) { + if (this.readdirCache.has(job.absolute)) + this[ONREADDIR](job, this.readdirCache.get(job.absolute)) + else + this[READDIR](job) + if (!job.readdir) + return } - } - return -1; -} - -/** - * The base implementation of `_.get` without support for default values. - * - * @private - * @param {Object} object The object to query. - * @param {Array|string} path The path of the property to get. - * @returns {*} Returns the resolved value. - */ -function baseGet(object, path) { - path = isKey(path, object) ? [path] : castPath(path); - var index = 0, - length = path.length; + // we know it doesn't have an entry, because that got checked above + job.entry = this[ENTRY](job) + if (!job.entry) { + job.ignore = true + return + } - while (object != null && index < length) { - object = object[toKey(path[index++])]; + if (job === this[CURRENT] && !job.piped) + this[PIPE](job) } - return (index && index == length) ? object : undefined; -} -/** - * The base implementation of `_.isNative` without bad shim checks. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a native function, - * else `false`. - */ -function baseIsNative(value) { - if (!isObject(value) || isMasked(value)) { - return false; + [ENTRYOPT] (job) { + return { + onwarn: (code, msg, data) => this.warn(code, msg, data), + noPax: this.noPax, + cwd: this.cwd, + absolute: job.absolute, + preservePaths: this.preservePaths, + maxReadSize: this.maxReadSize, + strict: this.strict, + portable: this.portable, + linkCache: this.linkCache, + statCache: this.statCache, + noMtime: this.noMtime, + mtime: this.mtime + } } - var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor; - return pattern.test(toSource(value)); -} -/** - * The base implementation of `_.toString` which doesn't convert nullish - * values to empty strings. - * - * @private - * @param {*} value The value to process. - * @returns {string} Returns the string. - */ -function baseToString(value) { - // Exit early for strings to avoid a performance hit in some environments. - if (typeof value == 'string') { - return value; - } - if (isSymbol(value)) { - return symbolToString ? symbolToString.call(value) : ''; + [ENTRY] (job) { + this[JOBS] += 1 + try { + return new this[WRITEENTRYCLASS](job.path, this[ENTRYOPT](job)) + .on('end', () => this[JOBDONE](job)) + .on('error', er => this.emit('error', er)) + } catch (er) { + this.emit('error', er) + } } - var result = (value + ''); - return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; -} - -/** - * Casts `value` to a path array if it's not one. - * - * @private - * @param {*} value The value to inspect. - * @returns {Array} Returns the cast property path array. - */ -function castPath(value) { - return isArray(value) ? value : stringToPath(value); -} - -/** - * Gets the data for `map`. - * - * @private - * @param {Object} map The map to query. - * @param {string} key The reference key. - * @returns {*} Returns the map data. - */ -function getMapData(map, key) { - var data = map.__data__; - return isKeyable(key) - ? data[typeof key == 'string' ? 'string' : 'hash'] - : data.map; -} - -/** - * Gets the native function at `key` of `object`. - * - * @private - * @param {Object} object The object to query. - * @param {string} key The key of the method to get. - * @returns {*} Returns the function if it's native, else `undefined`. - */ -function getNative(object, key) { - var value = getValue(object, key); - return baseIsNative(value) ? value : undefined; -} -/** - * Checks if `value` is a property name and not a property path. - * - * @private - * @param {*} value The value to check. - * @param {Object} [object] The object to query keys on. - * @returns {boolean} Returns `true` if `value` is a property name, else `false`. - */ -function isKey(value, object) { - if (isArray(value)) { - return false; - } - var type = typeof value; - if (type == 'number' || type == 'symbol' || type == 'boolean' || - value == null || isSymbol(value)) { - return true; + [ONDRAIN] () { + if (this[CURRENT] && this[CURRENT].entry) + this[CURRENT].entry.resume() } - return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || - (object != null && value in Object(object)); -} -/** - * Checks if `value` is suitable for use as unique object key. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is suitable, else `false`. - */ -function isKeyable(value) { - var type = typeof value; - return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') - ? (value !== '__proto__') - : (value === null); -} + // like .pipe() but using super, because our write() is special + [PIPE] (job) { + job.piped = true -/** - * Checks if `func` has its source masked. - * - * @private - * @param {Function} func The function to check. - * @returns {boolean} Returns `true` if `func` is masked, else `false`. - */ -function isMasked(func) { - return !!maskSrcKey && (maskSrcKey in func); -} + if (job.readdir) + job.readdir.forEach(entry => { + const p = this.prefix ? + job.path.slice(this.prefix.length + 1) || './' + : job.path -/** - * Converts `string` to a property path array. - * - * @private - * @param {string} string The string to convert. - * @returns {Array} Returns the property path array. - */ -var stringToPath = memoize(function(string) { - string = toString(string); + const base = p === './' ? '' : p.replace(/\/*$/, '/') + this[ADDFSENTRY](base + entry) + }) - var result = []; - if (reLeadingDot.test(string)) { - result.push(''); - } - string.replace(rePropName, function(match, number, quote, string) { - result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match)); - }); - return result; -}); + const source = job.entry + const zip = this.zip -/** - * Converts `value` to a string key if it's not a string or symbol. - * - * @private - * @param {*} value The value to inspect. - * @returns {string|symbol} Returns the key. - */ -function toKey(value) { - if (typeof value == 'string' || isSymbol(value)) { - return value; + if (zip) + source.on('data', chunk => { + if (!zip.write(chunk)) + source.pause() + }) + else + source.on('data', chunk => { + if (!super.write(chunk)) + source.pause() + }) } - var result = (value + ''); - return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; -} -/** - * Converts `func` to its source code. - * - * @private - * @param {Function} func The function to process. - * @returns {string} Returns the source code. - */ -function toSource(func) { - if (func != null) { - try { - return funcToString.call(func); - } catch (e) {} - try { - return (func + ''); - } catch (e) {} + pause () { + if (this.zip) + this.zip.pause() + return super.pause() } - return ''; -} +}) -/** - * Creates a function that memoizes the result of `func`. If `resolver` is - * provided, it determines the cache key for storing the result based on the - * arguments provided to the memoized function. By default, the first argument - * provided to the memoized function is used as the map cache key. The `func` - * is invoked with the `this` binding of the memoized function. - * - * **Note:** The cache is exposed as the `cache` property on the memoized - * function. Its creation may be customized by replacing the `_.memoize.Cache` - * constructor with one whose instances implement the - * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object) - * method interface of `delete`, `get`, `has`, and `set`. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Function - * @param {Function} func The function to have its output memoized. - * @param {Function} [resolver] The function to resolve the cache key. - * @returns {Function} Returns the new memoized function. - * @example - * - * var object = { 'a': 1, 'b': 2 }; - * var other = { 'c': 3, 'd': 4 }; - * - * var values = _.memoize(_.values); - * values(object); - * // => [1, 2] - * - * values(other); - * // => [3, 4] - * - * object.a = 2; - * values(object); - * // => [1, 2] - * - * // Modify the result cache. - * values.cache.set(object, ['a', 'b']); - * values(object); - * // => ['a', 'b'] - * - * // Replace `_.memoize.Cache`. - * _.memoize.Cache = WeakMap; - */ -function memoize(func, resolver) { - if (typeof func != 'function' || (resolver && typeof resolver != 'function')) { - throw new TypeError(FUNC_ERROR_TEXT); +class PackSync extends Pack { + constructor (opt) { + super(opt) + this[WRITEENTRYCLASS] = WriteEntrySync } - var memoized = function() { - var args = arguments, - key = resolver ? resolver.apply(this, args) : args[0], - cache = memoized.cache; - - if (cache.has(key)) { - return cache.get(key); - } - var result = func.apply(this, args); - memoized.cache = cache.set(key, result); - return result; - }; - memoized.cache = new (memoize.Cache || MapCache); - return memoized; -} - -// Assign cache to `_.memoize`. -memoize.Cache = MapCache; -/** - * Performs a - * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) - * comparison between two values to determine if they are equivalent. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to compare. - * @param {*} other The other value to compare. - * @returns {boolean} Returns `true` if the values are equivalent, else `false`. - * @example - * - * var object = { 'a': 1 }; - * var other = { 'a': 1 }; - * - * _.eq(object, object); - * // => true - * - * _.eq(object, other); - * // => false - * - * _.eq('a', 'a'); - * // => true - * - * _.eq('a', Object('a')); - * // => false - * - * _.eq(NaN, NaN); - * // => true - */ -function eq(value, other) { - return value === other || (value !== value && other !== other); -} + // pause/resume are no-ops in sync streams. + pause () {} + resume () {} -/** - * Checks if `value` is classified as an `Array` object. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an array, else `false`. - * @example - * - * _.isArray([1, 2, 3]); - * // => true - * - * _.isArray(document.body.children); - * // => false - * - * _.isArray('abc'); - * // => false - * - * _.isArray(_.noop); - * // => false - */ -var isArray = Array.isArray; + [STAT] (job) { + const stat = this.follow ? 'statSync' : 'lstatSync' + this[ONSTAT](job, fs[stat](job.absolute)) + } -/** - * Checks if `value` is classified as a `Function` object. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a function, else `false`. - * @example - * - * _.isFunction(_); - * // => true - * - * _.isFunction(/abc/); - * // => false - */ -function isFunction(value) { - // The use of `Object#toString` avoids issues with the `typeof` operator - // in Safari 8-9 which returns 'object' for typed array and other constructors. - var tag = isObject(value) ? objectToString.call(value) : ''; - return tag == funcTag || tag == genTag; -} + [READDIR] (job, stat) { + this[ONREADDIR](job, fs.readdirSync(job.absolute)) + } -/** - * Checks if `value` is the - * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) - * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an object, else `false`. - * @example - * - * _.isObject({}); - * // => true - * - * _.isObject([1, 2, 3]); - * // => true - * - * _.isObject(_.noop); - * // => true - * - * _.isObject(null); - * // => false - */ -function isObject(value) { - var type = typeof value; - return !!value && (type == 'object' || type == 'function'); -} + // gotta get it all in this tick + [PIPE] (job) { + const source = job.entry + const zip = this.zip -/** - * Checks if `value` is object-like. A value is object-like if it's not `null` - * and has a `typeof` result of "object". - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is object-like, else `false`. - * @example - * - * _.isObjectLike({}); - * // => true - * - * _.isObjectLike([1, 2, 3]); - * // => true - * - * _.isObjectLike(_.noop); - * // => false - * - * _.isObjectLike(null); - * // => false - */ -function isObjectLike(value) { - return !!value && typeof value == 'object'; -} + if (job.readdir) + job.readdir.forEach(entry => { + const p = this.prefix ? + job.path.slice(this.prefix.length + 1) || './' + : job.path -/** - * Checks if `value` is classified as a `Symbol` primitive or object. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. - * @example - * - * _.isSymbol(Symbol.iterator); - * // => true - * - * _.isSymbol('abc'); - * // => false - */ -function isSymbol(value) { - return typeof value == 'symbol' || - (isObjectLike(value) && objectToString.call(value) == symbolTag); -} + const base = p === './' ? '' : p.replace(/\/*$/, '/') + this[ADDFSENTRY](base + entry) + }) -/** - * Converts `value` to a string. An empty string is returned for `null` - * and `undefined` values. The sign of `-0` is preserved. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to process. - * @returns {string} Returns the string. - * @example - * - * _.toString(null); - * // => '' - * - * _.toString(-0); - * // => '-0' - * - * _.toString([1, 2, 3]); - * // => '1,2,3' - */ -function toString(value) { - return value == null ? '' : baseToString(value); + if (zip) + source.on('data', chunk => { + zip.write(chunk) + }) + else + source.on('data', chunk => { + super[WRITE](chunk) + }) + } } -/** - * Gets the value at `path` of `object`. If the resolved value is - * `undefined`, the `defaultValue` is returned in its place. - * - * @static - * @memberOf _ - * @since 3.7.0 - * @category Object - * @param {Object} object The object to query. - * @param {Array|string} path The path of the property to get. - * @param {*} [defaultValue] The value returned for `undefined` resolved values. - * @returns {*} Returns the resolved value. - * @example - * - * var object = { 'a': [{ 'b': { 'c': 3 } }] }; - * - * _.get(object, 'a[0].b.c'); - * // => 3 - * - * _.get(object, ['a', '0', 'b', 'c']); - * // => 3 - * - * _.get(object, 'a.b.c', 'default'); - * // => 'default' - */ -function get(object, path, defaultValue) { - var result = object == null ? undefined : baseGet(object, path); - return result === undefined ? defaultValue : result; -} +Pack.Sync = PackSync -module.exports = get; +module.exports = Pack /***/ }), -/***/ 855: -/***/ (function(module, __unusedexports, __webpack_require__) { - -module.exports = registerPlugin; +/***/ 737: +/***/ (function(__unusedmodule, exports, __webpack_require__) { -const factory = __webpack_require__(47); +"use strict"; -function registerPlugin(plugins, pluginFunction) { - return factory( - plugins.includes(pluginFunction) ? plugins : plugins.concat(pluginFunction) - ); +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.scan = void 0; +const child_process_1 = __webpack_require__(129); +const core = __importStar(__webpack_require__(470)); +function scan(trivyPath, image, option) { + validateOption(option); + const args = [ + '--severity', + option.severity, + '--vuln-type', + option.vulnType, + '--format', + 'template', + '--template', + option.template, + '--quiet', + '--no-progress', + '--exit-code', + '255' + ]; + if (option.ignoreUnfixed) + args.push('--ignore-unfixed'); + args.push(image); + const result = child_process_1.spawnSync(trivyPath, args, { encoding: 'utf-8' }); + switch (result.status) { + case 0: + core.info(`Vulnerabilities were not found. + Your maintenance looks good 👍`); + case 255: + if (result.stdout && result.stdout.length > 0) { + core.info('Vulnerabilities found !!!'); + return result.stdout; + } + default: + throw new Error(`Failed to execute Trivy command. + exit code: ${result.status} + stdout: ${result.stdout} + stderr: ${result.stderr}`); + } +} +exports.scan = scan; +function validateOption(option) { + validateSeverity(option.severity.split(',')); + validateVulnType(option.vulnType.split(',')); +} +function validateSeverity(severities) { + const allowedSeverities = /UNKNOWN|LOW|MEDIUM|HIGH|CRITICAL/; + if (!validateArrayOption(allowedSeverities, severities)) { + throw new Error(`Trivy option error: ${severities.join(',')} is unknown severity. + Trivy supports UNKNOWN, LOW, MEDIUM, HIGH and CRITICAL.`); + } + return true; +} +function validateVulnType(vulnTypes) { + const allowedVulnTypes = /os|library/; + if (!validateArrayOption(allowedVulnTypes, vulnTypes)) { + throw new Error(`Trivy option error: ${vulnTypes.join(',')} is unknown vuln-type. + Trivy supports os and library.`); + } + return true; +} +function validateArrayOption(allowedValue, options) { + for (const option of options) { + if (!allowedValue.test(option)) { + return false; + } + } + return true; } /***/ }), -/***/ 858: -/***/ (function(__unusedmodule, exports) { +/***/ 747: +/***/ (function(module) { -"use strict"; +module.exports = require("fs"); -// Tar can encode large and negative numbers using a leading byte of -// 0xff for negative, and 0x80 for positive. +/***/ }), -const encode = exports.encode = (num, buf) => { - if (!Number.isSafeInteger(num)) - // The number is so large that javascript cannot represent it with integer - // precision. - throw Error('cannot encode number outside of javascript safe integer range') - else if (num < 0) - encodeNegative(num, buf) - else - encodePositive(num, buf) - return buf -} +/***/ 753: +/***/ (function(__unusedmodule, exports, __webpack_require__) { -const encodePositive = (num, buf) => { - buf[0] = 0x80 +"use strict"; - for (var i = buf.length; i > 1; i--) { - buf[i-1] = num & 0xff - num = Math.floor(num / 0x100) - } -} -const encodeNegative = (num, buf) => { - buf[0] = 0xff - var flipped = false - num = num * -1 - for (var i = buf.length; i > 1; i--) { - var byte = num & 0xff - num = Math.floor(num / 0x100) - if (flipped) - buf[i-1] = onesComp(byte) - else if (byte === 0) - buf[i-1] = 0 - else { - flipped = true - buf[i-1] = twosComp(byte) - } - } -} +Object.defineProperty(exports, '__esModule', { value: true }); -const parse = exports.parse = (buf) => { - var post = buf[buf.length - 1] - var pre = buf[0] - var value; - if (pre === 0x80) - value = pos(buf.slice(1, buf.length)) - else if (pre === 0xff) - value = twos(buf) - else - throw Error('invalid base256 encoding') +function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } - if (!Number.isSafeInteger(value)) - // The number is so large that javascript cannot represent it with integer - // precision. - throw Error('parsed number outside of javascript safe integer range') +var endpoint = __webpack_require__(385); +var universalUserAgent = __webpack_require__(526); +var isPlainObject = __webpack_require__(701); +var nodeFetch = _interopDefault(__webpack_require__(454)); +var requestError = __webpack_require__(463); - return value -} +const VERSION = "5.4.15"; -const twos = (buf) => { - var len = buf.length - var sum = 0 - var flipped = false - for (var i = len - 1; i > -1; i--) { - var byte = buf[i] - var f - if (flipped) - f = onesComp(byte) - else if (byte === 0) - f = byte - else { - flipped = true - f = twosComp(byte) - } - if (f !== 0) - sum -= f * Math.pow(256, len - i - 1) - } - return sum +function getBufferResponse(response) { + return response.arrayBuffer(); } -const pos = (buf) => { - var len = buf.length - var sum = 0 - for (var i = len - 1; i > -1; i--) { - var byte = buf[i] - if (byte !== 0) - sum += byte * Math.pow(256, len - i - 1) +function fetchWrapper(requestOptions) { + if (isPlainObject.isPlainObject(requestOptions.body) || Array.isArray(requestOptions.body)) { + requestOptions.body = JSON.stringify(requestOptions.body); } - return sum -} - -const onesComp = byte => (0xff ^ byte) & 0xff - -const twosComp = byte => ((0xff ^ byte) + 1) & 0xff + let headers = {}; + let status; + let url; + const fetch = requestOptions.request && requestOptions.request.fetch || nodeFetch; + return fetch(requestOptions.url, Object.assign({ + method: requestOptions.method, + body: requestOptions.body, + headers: requestOptions.headers, + redirect: requestOptions.redirect + }, // `requestOptions.request.agent` type is incompatible + // see https://github.com/octokit/types.ts/pull/264 + requestOptions.request)).then(response => { + url = response.url; + status = response.status; -/***/ }), + for (const keyAndValue of response.headers) { + headers[keyAndValue[0]] = keyAndValue[1]; + } -/***/ 862: -/***/ (function(module) { + if (status === 204 || status === 205) { + return; + } // GitHub API returns 200 for HEAD requests -module.exports = class GraphqlError extends Error { - constructor (request, response) { - const message = response.data.errors[0].message - super(message) - Object.assign(this, response.data) - this.name = 'GraphqlError' - this.request = request + if (requestOptions.method === "HEAD") { + if (status < 400) { + return; + } - // Maintains proper stack trace (only available on V8) - /* istanbul ignore next */ - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor) + throw new requestError.RequestError(response.statusText, status, { + headers, + request: requestOptions + }); } - } -} + if (status === 304) { + throw new requestError.RequestError("Not modified", status, { + headers, + request: requestOptions + }); + } -/***/ }), - -/***/ 863: -/***/ (function(module, __unusedexports, __webpack_require__) { + if (status >= 400) { + return response.text().then(message => { + const error = new requestError.RequestError(message, status, { + headers, + request: requestOptions + }); -module.exports = authenticationBeforeRequest; + try { + let responseBody = JSON.parse(error.message); + Object.assign(error, responseBody); + let errors = responseBody.errors; // Assumption `errors` would always be in Array format -const btoa = __webpack_require__(675); + error.message = error.message + ": " + errors.map(JSON.stringify).join(", "); + } catch (e) {// ignore, see octokit/rest.js#684 + } -const withAuthorizationPrefix = __webpack_require__(143); + throw error; + }); + } -function authenticationBeforeRequest(state, options) { - if (typeof state.auth === "string") { - options.headers.authorization = withAuthorizationPrefix(state.auth); - return; - } + const contentType = response.headers.get("content-type"); - if (state.auth.username) { - const hash = btoa(`${state.auth.username}:${state.auth.password}`); - options.headers.authorization = `Basic ${hash}`; - if (state.otp) { - options.headers["x-github-otp"] = state.otp; + if (/application\/json/.test(contentType)) { + return response.json(); } - return; - } - if (state.auth.clientId) { - // There is a special case for OAuth applications, when `clientId` and `clientSecret` is passed as - // Basic Authorization instead of query parameters. The only routes where that applies share the same - // URL though: `/applications/:client_id/tokens/:access_token`. - // - // 1. [Check an authorization](https://developer.github.com/v3/oauth_authorizations/#check-an-authorization) - // 2. [Reset an authorization](https://developer.github.com/v3/oauth_authorizations/#reset-an-authorization) - // 3. [Revoke an authorization for an application](https://developer.github.com/v3/oauth_authorizations/#revoke-an-authorization-for-an-application) - // - // We identify by checking the URL. It must merge both "/applications/:client_id/tokens/:access_token" - // as well as "/applications/123/tokens/token456" - if (/\/applications\/:?[\w_]+\/tokens\/:?[\w_]+($|\?)/.test(options.url)) { - const hash = btoa(`${state.auth.clientId}:${state.auth.clientSecret}`); - options.headers.authorization = `Basic ${hash}`; - return; + if (!contentType || /^text\/|charset=utf-8$/.test(contentType)) { + return response.text(); } - options.url += options.url.indexOf("?") === -1 ? "?" : "&"; - options.url += `client_id=${state.auth.clientId}&client_secret=${state.auth.clientSecret}`; - return; - } - - return Promise.resolve() - - .then(() => { - return state.auth(); - }) + return getBufferResponse(response); + }).then(data => { + return { + status, + url, + headers, + data + }; + }).catch(error => { + if (error instanceof requestError.RequestError) { + throw error; + } - .then(authorization => { - options.headers.authorization = withAuthorizationPrefix(authorization); + throw new requestError.RequestError(error.message, 500, { + headers, + request: requestOptions }); + }); } +function withDefaults(oldEndpoint, newDefaults) { + const endpoint = oldEndpoint.defaults(newDefaults); -/***/ }), - -/***/ 866: -/***/ (function(module, __unusedexports, __webpack_require__) { + const newApi = function (route, parameters) { + const endpointOptions = endpoint.merge(route, parameters); -"use strict"; + if (!endpointOptions.request || !endpointOptions.request.hook) { + return fetchWrapper(endpoint.parse(endpointOptions)); + } -var shebangRegex = __webpack_require__(816); + const request = (route, parameters) => { + return fetchWrapper(endpoint.parse(endpoint.merge(route, parameters))); + }; -module.exports = function (str) { - var match = str.match(shebangRegex); + Object.assign(request, { + endpoint, + defaults: withDefaults.bind(null, endpoint) + }); + return endpointOptions.request.hook(request, endpointOptions); + }; - if (!match) { - return null; - } + return Object.assign(newApi, { + endpoint, + defaults: withDefaults.bind(null, endpoint) + }); +} - var arr = match[0].replace(/#! ?/, '').split(' '); - var bin = arr[0].split('/').pop(); - var arg = arr[1]; +const request = withDefaults(endpoint.endpoint, { + headers: { + "user-agent": `octokit-request.js/${VERSION} ${universalUserAgent.getUserAgent()}` + } +}); - return (bin === 'env' ? - arg : - bin + (arg ? ' ' + arg : '') - ); -}; +exports.request = request; +//# sourceMappingURL=index.js.map /***/ }), -/***/ 881: +/***/ 761: /***/ (function(module) { -"use strict"; - - -const isWin = process.platform === 'win32'; - -function notFoundError(original, syscall) { - return Object.assign(new Error(`${syscall} ${original.command} ENOENT`), { - code: 'ENOENT', - errno: 'ENOENT', - syscall: `${syscall} ${original.command}`, - path: original.command, - spawnargs: original.args, - }); -} - -function hookChildProcess(cp, parsed) { - if (!isWin) { - return; - } +module.exports = require("zlib"); - const originalEmit = cp.emit; +/***/ }), - cp.emit = function (name, arg1) { - // If emitting "exit" event and exit code is 1, we need to check if - // the command exists and emit an "error" instead - // See https://github.com/IndigoUnited/node-cross-spawn/issues/16 - if (name === 'exit') { - const err = verifyENOENT(arg1, parsed, 'spawn'); +/***/ 796: +/***/ (function(module) { - if (err) { - return originalEmit.call(cp, 'error', err); - } - } +"use strict"; - return originalEmit.apply(cp, arguments); // eslint-disable-line prefer-rest-params - }; +module.exports = Base => class extends Base { + warn (code, message, data = {}) { + if (this.file) + data.file = this.file + if (this.cwd) + data.cwd = this.cwd + data.code = message instanceof Error && message.code || code + data.tarCode = code + if (!this.strict && data.recoverable !== false) { + if (message instanceof Error) { + data = Object.assign(message, data) + message = message.message + } + this.emit('warn', data.tarCode, message, data) + } else if (message instanceof Error) { + this.emit('error', Object.assign(message, data)) + } else + this.emit('error', Object.assign(new Error(`${code}: ${message}`), data)) + } } -function verifyENOENT(status, parsed) { - if (isWin && status === 1 && !parsed.file) { - return notFoundError(parsed.original, 'spawn'); - } - - return null; -} -function verifyENOENTSync(status, parsed) { - if (isWin && status === 1 && !parsed.file) { - return notFoundError(parsed.original, 'spawnSync'); - } +/***/ }), - return null; -} +/***/ 813: +/***/ (function(__unusedmodule, exports) { -module.exports = { - hookChildProcess, - verifyENOENT, - verifyENOENTSync, - notFoundError, -}; +"use strict"; -/***/ }), +Object.defineProperty(exports, '__esModule', { value: true }); -/***/ 883: -/***/ (function(module) { +async function auth(token) { + const tokenType = token.split(/\./).length === 3 ? "app" : /^v\d+\./.test(token) ? "installation" : "oauth"; + return { + type: "token", + token: token, + tokenType + }; +} /** - * lodash (Custom Build) - * Build: `lodash modularize exports="npm" -o ./` - * Copyright jQuery Foundation and other contributors - * Released under MIT license - * Based on Underscore.js 1.8.3 - * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors + * Prefix token for usage in the Authorization header + * + * @param token OAuth token or JSON Web Token */ +function withAuthorizationPrefix(token) { + if (token.split(/\./).length === 3) { + return `bearer ${token}`; + } -/** Used as the `TypeError` message for "Functions" methods. */ -var FUNC_ERROR_TEXT = 'Expected a function'; - -/** Used to stand-in for `undefined` hash values. */ -var HASH_UNDEFINED = '__lodash_hash_undefined__'; + return `token ${token}`; +} -/** Used as references for various `Number` constants. */ -var INFINITY = 1 / 0, - MAX_SAFE_INTEGER = 9007199254740991; +async function hook(token, request, route, parameters) { + const endpoint = request.endpoint.merge(route, parameters); + endpoint.headers.authorization = withAuthorizationPrefix(token); + return request(endpoint); +} -/** `Object#toString` result references. */ -var funcTag = '[object Function]', - genTag = '[object GeneratorFunction]', - symbolTag = '[object Symbol]'; +const createTokenAuth = function createTokenAuth(token) { + if (!token) { + throw new Error("[@octokit/auth-token] No token passed to createTokenAuth"); + } -/** Used to match property names within property paths. */ -var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, - reIsPlainProp = /^\w*$/, - reLeadingDot = /^\./, - rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; + if (typeof token !== "string") { + throw new Error("[@octokit/auth-token] Token passed to createTokenAuth is not a string"); + } -/** - * Used to match `RegExp` - * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). - */ -var reRegExpChar = /[\\^$.*+?()[\]{}|]/g; + token = token.replace(/^(token|bearer) +/i, ""); + return Object.assign(auth.bind(null, token), { + hook: hook.bind(null, token) + }); +}; -/** Used to match backslashes in property paths. */ -var reEscapeChar = /\\(\\)?/g; +exports.createTokenAuth = createTokenAuth; +//# sourceMappingURL=index.js.map -/** Used to detect host constructors (Safari). */ -var reIsHostCtor = /^\[object .+?Constructor\]$/; -/** Used to detect unsigned integer values. */ -var reIsUint = /^(?:0|[1-9]\d*)$/; +/***/ }), -/** Detect free variable `global` from Node.js. */ -var freeGlobal = typeof global == 'object' && global && global.Object === Object && global; +/***/ 827: +/***/ (function(__unusedmodule, exports, __webpack_require__) { -/** Detect free variable `self`. */ -var freeSelf = typeof self == 'object' && self && self.Object === Object && self; +"use strict"; -/** Used as a reference to the global object. */ -var root = freeGlobal || freeSelf || Function('return this')(); +const MiniPass = __webpack_require__(720) +const EE = __webpack_require__(614).EventEmitter +const fs = __webpack_require__(747) -/** - * Gets the value at `key` of `object`. - * - * @private - * @param {Object} [object] The object to query. - * @param {string} key The key of the property to get. - * @returns {*} Returns the property value. - */ -function getValue(object, key) { - return object == null ? undefined : object[key]; -} +let writev = fs.writev +/* istanbul ignore next */ +if (!writev) { + // This entire block can be removed if support for earlier than Node.js + // 12.9.0 is not needed. + const binding = process.binding('fs') + const FSReqWrap = binding.FSReqWrap || binding.FSReqCallback -/** - * Checks if `value` is a host object in IE < 9. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a host object, else `false`. - */ -function isHostObject(value) { - // Many host objects are `Object` objects that can coerce to strings - // despite having improperly defined `toString` methods. - var result = false; - if (value != null && typeof value.toString != 'function') { - try { - result = !!(value + ''); - } catch (e) {} + writev = (fd, iovec, pos, cb) => { + const done = (er, bw) => cb(er, bw, iovec) + const req = new FSReqWrap() + req.oncomplete = done + binding.writeBuffers(fd, iovec, pos, req) } - return result; } -/** Used for built-in method references. */ -var arrayProto = Array.prototype, - funcProto = Function.prototype, - objectProto = Object.prototype; - -/** Used to detect overreaching core-js shims. */ -var coreJsData = root['__core-js_shared__']; - -/** Used to detect methods masquerading as native. */ -var maskSrcKey = (function() { - var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || ''); - return uid ? ('Symbol(src)_1.' + uid) : ''; -}()); - -/** Used to resolve the decompiled source of functions. */ -var funcToString = funcProto.toString; - -/** Used to check objects for own properties. */ -var hasOwnProperty = objectProto.hasOwnProperty; - -/** - * Used to resolve the - * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) - * of values. - */ -var objectToString = objectProto.toString; - -/** Used to detect if a method is native. */ -var reIsNative = RegExp('^' + - funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&') - .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$' -); +const _autoClose = Symbol('_autoClose') +const _close = Symbol('_close') +const _ended = Symbol('_ended') +const _fd = Symbol('_fd') +const _finished = Symbol('_finished') +const _flags = Symbol('_flags') +const _flush = Symbol('_flush') +const _handleChunk = Symbol('_handleChunk') +const _makeBuf = Symbol('_makeBuf') +const _mode = Symbol('_mode') +const _needDrain = Symbol('_needDrain') +const _onerror = Symbol('_onerror') +const _onopen = Symbol('_onopen') +const _onread = Symbol('_onread') +const _onwrite = Symbol('_onwrite') +const _open = Symbol('_open') +const _path = Symbol('_path') +const _pos = Symbol('_pos') +const _queue = Symbol('_queue') +const _read = Symbol('_read') +const _readSize = Symbol('_readSize') +const _reading = Symbol('_reading') +const _remain = Symbol('_remain') +const _size = Symbol('_size') +const _write = Symbol('_write') +const _writing = Symbol('_writing') +const _defaultFlag = Symbol('_defaultFlag') +const _errored = Symbol('_errored') -/** Built-in value references. */ -var Symbol = root.Symbol, - splice = arrayProto.splice; +class ReadStream extends MiniPass { + constructor (path, opt) { + opt = opt || {} + super(opt) -/* Built-in method references that are verified to be native. */ -var Map = getNative(root, 'Map'), - nativeCreate = getNative(Object, 'create'); + this.readable = true + this.writable = false -/** Used to convert symbols to primitives and strings. */ -var symbolProto = Symbol ? Symbol.prototype : undefined, - symbolToString = symbolProto ? symbolProto.toString : undefined; + if (typeof path !== 'string') + throw new TypeError('path must be a string') -/** - * Creates a hash object. - * - * @private - * @constructor - * @param {Array} [entries] The key-value pairs to cache. - */ -function Hash(entries) { - var index = -1, - length = entries ? entries.length : 0; + this[_errored] = false + this[_fd] = typeof opt.fd === 'number' ? opt.fd : null + this[_path] = path + this[_readSize] = opt.readSize || 16*1024*1024 + this[_reading] = false + this[_size] = typeof opt.size === 'number' ? opt.size : Infinity + this[_remain] = this[_size] + this[_autoClose] = typeof opt.autoClose === 'boolean' ? + opt.autoClose : true - this.clear(); - while (++index < length) { - var entry = entries[index]; - this.set(entry[0], entry[1]); + if (typeof this[_fd] === 'number') + this[_read]() + else + this[_open]() } -} - -/** - * Removes all key-value entries from the hash. - * - * @private - * @name clear - * @memberOf Hash - */ -function hashClear() { - this.__data__ = nativeCreate ? nativeCreate(null) : {}; -} -/** - * Removes `key` and its value from the hash. - * - * @private - * @name delete - * @memberOf Hash - * @param {Object} hash The hash to modify. - * @param {string} key The key of the value to remove. - * @returns {boolean} Returns `true` if the entry was removed, else `false`. - */ -function hashDelete(key) { - return this.has(key) && delete this.__data__[key]; -} + get fd () { return this[_fd] } + get path () { return this[_path] } -/** - * Gets the hash value for `key`. - * - * @private - * @name get - * @memberOf Hash - * @param {string} key The key of the value to get. - * @returns {*} Returns the entry value. - */ -function hashGet(key) { - var data = this.__data__; - if (nativeCreate) { - var result = data[key]; - return result === HASH_UNDEFINED ? undefined : result; + write () { + throw new TypeError('this is a readable stream') } - return hasOwnProperty.call(data, key) ? data[key] : undefined; -} - -/** - * Checks if a hash value for `key` exists. - * - * @private - * @name has - * @memberOf Hash - * @param {string} key The key of the entry to check. - * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. - */ -function hashHas(key) { - var data = this.__data__; - return nativeCreate ? data[key] !== undefined : hasOwnProperty.call(data, key); -} - -/** - * Sets the hash `key` to `value`. - * - * @private - * @name set - * @memberOf Hash - * @param {string} key The key of the value to set. - * @param {*} value The value to set. - * @returns {Object} Returns the hash instance. - */ -function hashSet(key, value) { - var data = this.__data__; - data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value; - return this; -} - -// Add methods to `Hash`. -Hash.prototype.clear = hashClear; -Hash.prototype['delete'] = hashDelete; -Hash.prototype.get = hashGet; -Hash.prototype.has = hashHas; -Hash.prototype.set = hashSet; -/** - * Creates an list cache object. - * - * @private - * @constructor - * @param {Array} [entries] The key-value pairs to cache. - */ -function ListCache(entries) { - var index = -1, - length = entries ? entries.length : 0; + end () { + throw new TypeError('this is a readable stream') + } - this.clear(); - while (++index < length) { - var entry = entries[index]; - this.set(entry[0], entry[1]); + [_open] () { + fs.open(this[_path], 'r', (er, fd) => this[_onopen](er, fd)) } -} -/** - * Removes all key-value entries from the list cache. - * - * @private - * @name clear - * @memberOf ListCache - */ -function listCacheClear() { - this.__data__ = []; -} + [_onopen] (er, fd) { + if (er) + this[_onerror](er) + else { + this[_fd] = fd + this.emit('open', fd) + this[_read]() + } + } -/** - * Removes `key` and its value from the list cache. - * - * @private - * @name delete - * @memberOf ListCache - * @param {string} key The key of the value to remove. - * @returns {boolean} Returns `true` if the entry was removed, else `false`. - */ -function listCacheDelete(key) { - var data = this.__data__, - index = assocIndexOf(data, key); + [_makeBuf] () { + return Buffer.allocUnsafe(Math.min(this[_readSize], this[_remain])) + } - if (index < 0) { - return false; + [_read] () { + if (!this[_reading]) { + this[_reading] = true + const buf = this[_makeBuf]() + /* istanbul ignore if */ + if (buf.length === 0) + return process.nextTick(() => this[_onread](null, 0, buf)) + fs.read(this[_fd], buf, 0, buf.length, null, (er, br, buf) => + this[_onread](er, br, buf)) + } } - var lastIndex = data.length - 1; - if (index == lastIndex) { - data.pop(); - } else { - splice.call(data, index, 1); + + [_onread] (er, br, buf) { + this[_reading] = false + if (er) + this[_onerror](er) + else if (this[_handleChunk](br, buf)) + this[_read]() } - return true; -} -/** - * Gets the list cache value for `key`. - * - * @private - * @name get - * @memberOf ListCache - * @param {string} key The key of the value to get. - * @returns {*} Returns the entry value. - */ -function listCacheGet(key) { - var data = this.__data__, - index = assocIndexOf(data, key); + [_close] () { + if (this[_autoClose] && typeof this[_fd] === 'number') { + const fd = this[_fd] + this[_fd] = null + fs.close(fd, er => er ? this.emit('error', er) : this.emit('close')) + } + } - return index < 0 ? undefined : data[index][1]; -} + [_onerror] (er) { + this[_reading] = true + this[_close]() + this.emit('error', er) + } -/** - * Checks if a list cache value for `key` exists. - * - * @private - * @name has - * @memberOf ListCache - * @param {string} key The key of the entry to check. - * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. - */ -function listCacheHas(key) { - return assocIndexOf(this.__data__, key) > -1; -} + [_handleChunk] (br, buf) { + let ret = false + // no effect if infinite + this[_remain] -= br + if (br > 0) + ret = super.write(br < buf.length ? buf.slice(0, br) : buf) -/** - * Sets the list cache `key` to `value`. - * - * @private - * @name set - * @memberOf ListCache - * @param {string} key The key of the value to set. - * @param {*} value The value to set. - * @returns {Object} Returns the list cache instance. - */ -function listCacheSet(key, value) { - var data = this.__data__, - index = assocIndexOf(data, key); + if (br === 0 || this[_remain] <= 0) { + ret = false + this[_close]() + super.end() + } - if (index < 0) { - data.push([key, value]); - } else { - data[index][1] = value; + return ret } - return this; -} -// Add methods to `ListCache`. -ListCache.prototype.clear = listCacheClear; -ListCache.prototype['delete'] = listCacheDelete; -ListCache.prototype.get = listCacheGet; -ListCache.prototype.has = listCacheHas; -ListCache.prototype.set = listCacheSet; + emit (ev, data) { + switch (ev) { + case 'prefinish': + case 'finish': + break -/** - * Creates a map cache object to store key-value pairs. - * - * @private - * @constructor - * @param {Array} [entries] The key-value pairs to cache. - */ -function MapCache(entries) { - var index = -1, - length = entries ? entries.length : 0; + case 'drain': + if (typeof this[_fd] === 'number') + this[_read]() + break - this.clear(); - while (++index < length) { - var entry = entries[index]; - this.set(entry[0], entry[1]); - } -} + case 'error': + if (this[_errored]) + return + this[_errored] = true + return super.emit(ev, data) -/** - * Removes all key-value entries from the map. - * - * @private - * @name clear - * @memberOf MapCache - */ -function mapCacheClear() { - this.__data__ = { - 'hash': new Hash, - 'map': new (Map || ListCache), - 'string': new Hash - }; + default: + return super.emit(ev, data) + } + } } -/** - * Removes `key` and its value from the map. - * - * @private - * @name delete - * @memberOf MapCache - * @param {string} key The key of the value to remove. - * @returns {boolean} Returns `true` if the entry was removed, else `false`. - */ -function mapCacheDelete(key) { - return getMapData(this, key)['delete'](key); -} +class ReadStreamSync extends ReadStream { + [_open] () { + let threw = true + try { + this[_onopen](null, fs.openSync(this[_path], 'r')) + threw = false + } finally { + if (threw) + this[_close]() + } + } -/** - * Gets the map value for `key`. - * - * @private - * @name get - * @memberOf MapCache - * @param {string} key The key of the value to get. - * @returns {*} Returns the entry value. - */ -function mapCacheGet(key) { - return getMapData(this, key).get(key); -} + [_read] () { + let threw = true + try { + if (!this[_reading]) { + this[_reading] = true + do { + const buf = this[_makeBuf]() + /* istanbul ignore next */ + const br = buf.length === 0 ? 0 + : fs.readSync(this[_fd], buf, 0, buf.length, null) + if (!this[_handleChunk](br, buf)) + break + } while (true) + this[_reading] = false + } + threw = false + } finally { + if (threw) + this[_close]() + } + } -/** - * Checks if a map value for `key` exists. - * - * @private - * @name has - * @memberOf MapCache - * @param {string} key The key of the entry to check. - * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`. - */ -function mapCacheHas(key) { - return getMapData(this, key).has(key); + [_close] () { + if (this[_autoClose] && typeof this[_fd] === 'number') { + const fd = this[_fd] + this[_fd] = null + fs.closeSync(fd) + this.emit('close') + } + } } -/** - * Sets the map `key` to `value`. - * - * @private - * @name set - * @memberOf MapCache - * @param {string} key The key of the value to set. - * @param {*} value The value to set. - * @returns {Object} Returns the map cache instance. - */ -function mapCacheSet(key, value) { - getMapData(this, key).set(key, value); - return this; -} +class WriteStream extends EE { + constructor (path, opt) { + opt = opt || {} + super(opt) + this.readable = false + this.writable = true + this[_errored] = false + this[_writing] = false + this[_ended] = false + this[_needDrain] = false + this[_queue] = [] + this[_path] = path + this[_fd] = typeof opt.fd === 'number' ? opt.fd : null + this[_mode] = opt.mode === undefined ? 0o666 : opt.mode + this[_pos] = typeof opt.start === 'number' ? opt.start : null + this[_autoClose] = typeof opt.autoClose === 'boolean' ? + opt.autoClose : true -// Add methods to `MapCache`. -MapCache.prototype.clear = mapCacheClear; -MapCache.prototype['delete'] = mapCacheDelete; -MapCache.prototype.get = mapCacheGet; -MapCache.prototype.has = mapCacheHas; -MapCache.prototype.set = mapCacheSet; + // truncating makes no sense when writing into the middle + const defaultFlag = this[_pos] !== null ? 'r+' : 'w' + this[_defaultFlag] = opt.flags === undefined + this[_flags] = this[_defaultFlag] ? defaultFlag : opt.flags -/** - * Assigns `value` to `key` of `object` if the existing value is not equivalent - * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) - * for equality comparisons. - * - * @private - * @param {Object} object The object to modify. - * @param {string} key The key of the property to assign. - * @param {*} value The value to assign. - */ -function assignValue(object, key, value) { - var objValue = object[key]; - if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) || - (value === undefined && !(key in object))) { - object[key] = value; + if (this[_fd] === null) + this[_open]() } -} -/** - * Gets the index at which the `key` is found in `array` of key-value pairs. - * - * @private - * @param {Array} array The array to inspect. - * @param {*} key The key to search for. - * @returns {number} Returns the index of the matched value, else `-1`. - */ -function assocIndexOf(array, key) { - var length = array.length; - while (length--) { - if (eq(array[length][0], key)) { - return length; + emit (ev, data) { + if (ev === 'error') { + if (this[_errored]) + return + this[_errored] = true } + return super.emit(ev, data) } - return -1; -} -/** - * The base implementation of `_.isNative` without bad shim checks. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a native function, - * else `false`. - */ -function baseIsNative(value) { - if (!isObject(value) || isMasked(value)) { - return false; - } - var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor; - return pattern.test(toSource(value)); -} -/** - * The base implementation of `_.set`. - * - * @private - * @param {Object} object The object to modify. - * @param {Array|string} path The path of the property to set. - * @param {*} value The value to set. - * @param {Function} [customizer] The function to customize path creation. - * @returns {Object} Returns `object`. - */ -function baseSet(object, path, value, customizer) { - if (!isObject(object)) { - return object; - } - path = isKey(path, object) ? [path] : castPath(path); - - var index = -1, - length = path.length, - lastIndex = length - 1, - nested = object; - - while (nested != null && ++index < length) { - var key = toKey(path[index]), - newValue = value; - - if (index != lastIndex) { - var objValue = nested[key]; - newValue = customizer ? customizer(objValue, key, nested) : undefined; - if (newValue === undefined) { - newValue = isObject(objValue) - ? objValue - : (isIndex(path[index + 1]) ? [] : {}); - } - } - assignValue(nested, key, newValue); - nested = nested[key]; + get fd () { return this[_fd] } + get path () { return this[_path] } + + [_onerror] (er) { + this[_close]() + this[_writing] = true + this.emit('error', er) } - return object; -} -/** - * The base implementation of `_.toString` which doesn't convert nullish - * values to empty strings. - * - * @private - * @param {*} value The value to process. - * @returns {string} Returns the string. - */ -function baseToString(value) { - // Exit early for strings to avoid a performance hit in some environments. - if (typeof value == 'string') { - return value; - } - if (isSymbol(value)) { - return symbolToString ? symbolToString.call(value) : ''; + [_open] () { + fs.open(this[_path], this[_flags], this[_mode], + (er, fd) => this[_onopen](er, fd)) } - var result = (value + ''); - return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; -} - -/** - * Casts `value` to a path array if it's not one. - * - * @private - * @param {*} value The value to inspect. - * @returns {Array} Returns the cast property path array. - */ -function castPath(value) { - return isArray(value) ? value : stringToPath(value); -} -/** - * Gets the data for `map`. - * - * @private - * @param {Object} map The map to query. - * @param {string} key The reference key. - * @returns {*} Returns the map data. - */ -function getMapData(map, key) { - var data = map.__data__; - return isKeyable(key) - ? data[typeof key == 'string' ? 'string' : 'hash'] - : data.map; -} + [_onopen] (er, fd) { + if (this[_defaultFlag] && + this[_flags] === 'r+' && + er && er.code === 'ENOENT') { + this[_flags] = 'w' + this[_open]() + } else if (er) + this[_onerror](er) + else { + this[_fd] = fd + this.emit('open', fd) + this[_flush]() + } + } -/** - * Gets the native function at `key` of `object`. - * - * @private - * @param {Object} object The object to query. - * @param {string} key The key of the method to get. - * @returns {*} Returns the function if it's native, else `undefined`. - */ -function getNative(object, key) { - var value = getValue(object, key); - return baseIsNative(value) ? value : undefined; -} + end (buf, enc) { + if (buf) + this.write(buf, enc) -/** - * Checks if `value` is a valid array-like index. - * - * @private - * @param {*} value The value to check. - * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. - * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. - */ -function isIndex(value, length) { - length = length == null ? MAX_SAFE_INTEGER : length; - return !!length && - (typeof value == 'number' || reIsUint.test(value)) && - (value > -1 && value % 1 == 0 && value < length); -} + this[_ended] = true -/** - * Checks if `value` is a property name and not a property path. - * - * @private - * @param {*} value The value to check. - * @param {Object} [object] The object to query keys on. - * @returns {boolean} Returns `true` if `value` is a property name, else `false`. - */ -function isKey(value, object) { - if (isArray(value)) { - return false; - } - var type = typeof value; - if (type == 'number' || type == 'symbol' || type == 'boolean' || - value == null || isSymbol(value)) { - return true; + // synthetic after-write logic, where drain/finish live + if (!this[_writing] && !this[_queue].length && + typeof this[_fd] === 'number') + this[_onwrite](null, 0) + return this } - return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || - (object != null && value in Object(object)); -} -/** - * Checks if `value` is suitable for use as unique object key. - * - * @private - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is suitable, else `false`. - */ -function isKeyable(value) { - var type = typeof value; - return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean') - ? (value !== '__proto__') - : (value === null); -} + write (buf, enc) { + if (typeof buf === 'string') + buf = Buffer.from(buf, enc) -/** - * Checks if `func` has its source masked. - * - * @private - * @param {Function} func The function to check. - * @returns {boolean} Returns `true` if `func` is masked, else `false`. - */ -function isMasked(func) { - return !!maskSrcKey && (maskSrcKey in func); -} + if (this[_ended]) { + this.emit('error', new Error('write() after end()')) + return false + } -/** - * Converts `string` to a property path array. - * - * @private - * @param {string} string The string to convert. - * @returns {Array} Returns the property path array. - */ -var stringToPath = memoize(function(string) { - string = toString(string); + if (this[_fd] === null || this[_writing] || this[_queue].length) { + this[_queue].push(buf) + this[_needDrain] = true + return false + } - var result = []; - if (reLeadingDot.test(string)) { - result.push(''); + this[_writing] = true + this[_write](buf) + return true } - string.replace(rePropName, function(match, number, quote, string) { - result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match)); - }); - return result; -}); -/** - * Converts `value` to a string key if it's not a string or symbol. - * - * @private - * @param {*} value The value to inspect. - * @returns {string|symbol} Returns the key. - */ -function toKey(value) { - if (typeof value == 'string' || isSymbol(value)) { - return value; + [_write] (buf) { + fs.write(this[_fd], buf, 0, buf.length, this[_pos], (er, bw) => + this[_onwrite](er, bw)) } - var result = (value + ''); - return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; -} -/** - * Converts `func` to its source code. - * - * @private - * @param {Function} func The function to process. - * @returns {string} Returns the source code. - */ -function toSource(func) { - if (func != null) { - try { - return funcToString.call(func); - } catch (e) {} - try { - return (func + ''); - } catch (e) {} - } - return ''; -} + [_onwrite] (er, bw) { + if (er) + this[_onerror](er) + else { + if (this[_pos] !== null) + this[_pos] += bw + if (this[_queue].length) + this[_flush]() + else { + this[_writing] = false -/** - * Creates a function that memoizes the result of `func`. If `resolver` is - * provided, it determines the cache key for storing the result based on the - * arguments provided to the memoized function. By default, the first argument - * provided to the memoized function is used as the map cache key. The `func` - * is invoked with the `this` binding of the memoized function. - * - * **Note:** The cache is exposed as the `cache` property on the memoized - * function. Its creation may be customized by replacing the `_.memoize.Cache` - * constructor with one whose instances implement the - * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object) - * method interface of `delete`, `get`, `has`, and `set`. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Function - * @param {Function} func The function to have its output memoized. - * @param {Function} [resolver] The function to resolve the cache key. - * @returns {Function} Returns the new memoized function. - * @example - * - * var object = { 'a': 1, 'b': 2 }; - * var other = { 'c': 3, 'd': 4 }; - * - * var values = _.memoize(_.values); - * values(object); - * // => [1, 2] - * - * values(other); - * // => [3, 4] - * - * object.a = 2; - * values(object); - * // => [1, 2] - * - * // Modify the result cache. - * values.cache.set(object, ['a', 'b']); - * values(object); - * // => ['a', 'b'] - * - * // Replace `_.memoize.Cache`. - * _.memoize.Cache = WeakMap; - */ -function memoize(func, resolver) { - if (typeof func != 'function' || (resolver && typeof resolver != 'function')) { - throw new TypeError(FUNC_ERROR_TEXT); + if (this[_ended] && !this[_finished]) { + this[_finished] = true + this[_close]() + this.emit('finish') + } else if (this[_needDrain]) { + this[_needDrain] = false + this.emit('drain') + } + } + } } - var memoized = function() { - var args = arguments, - key = resolver ? resolver.apply(this, args) : args[0], - cache = memoized.cache; - if (cache.has(key)) { - return cache.get(key); + [_flush] () { + if (this[_queue].length === 0) { + if (this[_ended]) + this[_onwrite](null, 0) + } else if (this[_queue].length === 1) + this[_write](this[_queue].pop()) + else { + const iovec = this[_queue] + this[_queue] = [] + writev(this[_fd], iovec, this[_pos], + (er, bw) => this[_onwrite](er, bw)) } - var result = func.apply(this, args); - memoized.cache = cache.set(key, result); - return result; - }; - memoized.cache = new (memoize.Cache || MapCache); - return memoized; -} - -// Assign cache to `_.memoize`. -memoize.Cache = MapCache; + } -/** - * Performs a - * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) - * comparison between two values to determine if they are equivalent. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to compare. - * @param {*} other The other value to compare. - * @returns {boolean} Returns `true` if the values are equivalent, else `false`. - * @example - * - * var object = { 'a': 1 }; - * var other = { 'a': 1 }; - * - * _.eq(object, object); - * // => true - * - * _.eq(object, other); - * // => false - * - * _.eq('a', 'a'); - * // => true - * - * _.eq('a', Object('a')); - * // => false - * - * _.eq(NaN, NaN); - * // => true - */ -function eq(value, other) { - return value === other || (value !== value && other !== other); + [_close] () { + if (this[_autoClose] && typeof this[_fd] === 'number') { + const fd = this[_fd] + this[_fd] = null + fs.close(fd, er => er ? this.emit('error', er) : this.emit('close')) + } + } } -/** - * Checks if `value` is classified as an `Array` object. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an array, else `false`. - * @example - * - * _.isArray([1, 2, 3]); - * // => true - * - * _.isArray(document.body.children); - * // => false - * - * _.isArray('abc'); - * // => false - * - * _.isArray(_.noop); - * // => false - */ -var isArray = Array.isArray; - -/** - * Checks if `value` is classified as a `Function` object. - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a function, else `false`. - * @example - * - * _.isFunction(_); - * // => true - * - * _.isFunction(/abc/); - * // => false - */ -function isFunction(value) { - // The use of `Object#toString` avoids issues with the `typeof` operator - // in Safari 8-9 which returns 'object' for typed array and other constructors. - var tag = isObject(value) ? objectToString.call(value) : ''; - return tag == funcTag || tag == genTag; -} +class WriteStreamSync extends WriteStream { + [_open] () { + let fd + // only wrap in a try{} block if we know we'll retry, to avoid + // the rethrow obscuring the error's source frame in most cases. + if (this[_defaultFlag] && this[_flags] === 'r+') { + try { + fd = fs.openSync(this[_path], this[_flags], this[_mode]) + } catch (er) { + if (er.code === 'ENOENT') { + this[_flags] = 'w' + return this[_open]() + } else + throw er + } + } else + fd = fs.openSync(this[_path], this[_flags], this[_mode]) -/** - * Checks if `value` is the - * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) - * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) - * - * @static - * @memberOf _ - * @since 0.1.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is an object, else `false`. - * @example - * - * _.isObject({}); - * // => true - * - * _.isObject([1, 2, 3]); - * // => true - * - * _.isObject(_.noop); - * // => true - * - * _.isObject(null); - * // => false - */ -function isObject(value) { - var type = typeof value; - return !!value && (type == 'object' || type == 'function'); -} + this[_onopen](null, fd) + } -/** - * Checks if `value` is object-like. A value is object-like if it's not `null` - * and has a `typeof` result of "object". - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is object-like, else `false`. - * @example - * - * _.isObjectLike({}); - * // => true - * - * _.isObjectLike([1, 2, 3]); - * // => true - * - * _.isObjectLike(_.noop); - * // => false - * - * _.isObjectLike(null); - * // => false - */ -function isObjectLike(value) { - return !!value && typeof value == 'object'; -} + [_close] () { + if (this[_autoClose] && typeof this[_fd] === 'number') { + const fd = this[_fd] + this[_fd] = null + fs.closeSync(fd) + this.emit('close') + } + } -/** - * Checks if `value` is classified as a `Symbol` primitive or object. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to check. - * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. - * @example - * - * _.isSymbol(Symbol.iterator); - * // => true - * - * _.isSymbol('abc'); - * // => false - */ -function isSymbol(value) { - return typeof value == 'symbol' || - (isObjectLike(value) && objectToString.call(value) == symbolTag); + [_write] (buf) { + // throw the original, but try to close if it fails + let threw = true + try { + this[_onwrite](null, + fs.writeSync(this[_fd], buf, 0, buf.length, this[_pos])) + threw = false + } finally { + if (threw) + try { this[_close]() } catch (_) {} + } + } } -/** - * Converts `value` to a string. An empty string is returned for `null` - * and `undefined` values. The sign of `-0` is preserved. - * - * @static - * @memberOf _ - * @since 4.0.0 - * @category Lang - * @param {*} value The value to process. - * @returns {string} Returns the string. - * @example - * - * _.toString(null); - * // => '' - * - * _.toString(-0); - * // => '-0' - * - * _.toString([1, 2, 3]); - * // => '1,2,3' - */ -function toString(value) { - return value == null ? '' : baseToString(value); -} +exports.ReadStream = ReadStream +exports.ReadStreamSync = ReadStreamSync -/** - * Sets the value at `path` of `object`. If a portion of `path` doesn't exist, - * it's created. Arrays are created for missing index properties while objects - * are created for all other missing properties. Use `_.setWith` to customize - * `path` creation. - * - * **Note:** This method mutates `object`. - * - * @static - * @memberOf _ - * @since 3.7.0 - * @category Object - * @param {Object} object The object to modify. - * @param {Array|string} path The path of the property to set. - * @param {*} value The value to set. - * @returns {Object} Returns `object`. - * @example - * - * var object = { 'a': [{ 'b': { 'c': 3 } }] }; - * - * _.set(object, 'a[0].b.c', 4); - * console.log(object.a[0].b.c); - * // => 4 - * - * _.set(object, ['x', '0', 'y', 'z'], 5); - * console.log(object.x[0].y.z); - * // => 5 - */ -function set(object, path, value) { - return object == null ? object : baseSet(object, path, value); -} +exports.WriteStream = WriteStream +exports.WriteStreamSync = WriteStreamSync + + +/***/ }), -module.exports = set; +/***/ 835: +/***/ (function(module) { +module.exports = require("url"); /***/ }), -/***/ 885: -/***/ (function(__unusedmodule, exports, __webpack_require__) { +/***/ 842: +/***/ (function(__unusedmodule, exports) { "use strict"; -// high-level commands -exports.c = exports.create = __webpack_require__(159) -exports.r = exports.replace = __webpack_require__(630) -exports.t = exports.list = __webpack_require__(381) -exports.u = exports.update = __webpack_require__(966) -exports.x = exports.extract = __webpack_require__(656) +Object.defineProperty(exports, '__esModule', { value: true }); -// classes -exports.Pack = __webpack_require__(726) -exports.Unpack = __webpack_require__(63) -exports.Parse = __webpack_require__(203) -exports.ReadEntry = __webpack_require__(662) -exports.WriteEntry = __webpack_require__(303) -exports.Header = __webpack_require__(232) -exports.Pax = __webpack_require__(582) -exports.types = __webpack_require__(554) +function ownKeys(object, enumerableOnly) { + var keys = Object.keys(object); + if (Object.getOwnPropertySymbols) { + var symbols = Object.getOwnPropertySymbols(object); -/***/ }), + if (enumerableOnly) { + symbols = symbols.filter(function (sym) { + return Object.getOwnPropertyDescriptor(object, sym).enumerable; + }); + } -/***/ 891: -/***/ (function(module) { + keys.push.apply(keys, symbols); + } -"use strict"; + return keys; +} +function _objectSpread2(target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i] != null ? arguments[i] : {}; -// turn tar(1) style args like `C` into the more verbose things like `cwd` + if (i % 2) { + ownKeys(Object(source), true).forEach(function (key) { + _defineProperty(target, key, source[key]); + }); + } else if (Object.getOwnPropertyDescriptors) { + Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); + } else { + ownKeys(Object(source)).forEach(function (key) { + Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); + }); + } + } -const argmap = new Map([ - ['C', 'cwd'], - ['f', 'file'], - ['z', 'gzip'], - ['P', 'preservePaths'], - ['U', 'unlink'], - ['strip-components', 'strip'], - ['stripComponents', 'strip'], - ['keep-newer', 'newer'], - ['keepNewer', 'newer'], - ['keep-newer-files', 'newer'], - ['keepNewerFiles', 'newer'], - ['k', 'keep'], - ['keep-existing', 'keep'], - ['keepExisting', 'keep'], - ['m', 'noMtime'], - ['no-mtime', 'noMtime'], - ['p', 'preserveOwner'], - ['L', 'follow'], - ['h', 'follow'] -]) + return target; +} -const parse = module.exports = opt => opt ? Object.keys(opt).map(k => [ - argmap.has(k) ? argmap.get(k) : k, opt[k] -]).reduce((set, kv) => (set[kv[0]] = kv[1], set), Object.create(null)) : {} +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + return obj; +} -/***/ }), +const Endpoints = { + actions: { + addSelectedRepoToOrgSecret: ["PUT /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}"], + approveWorkflowRun: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/approve"], + cancelWorkflowRun: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/cancel"], + createOrUpdateEnvironmentSecret: ["PUT /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}"], + createOrUpdateOrgSecret: ["PUT /orgs/{org}/actions/secrets/{secret_name}"], + createOrUpdateRepoSecret: ["PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}"], + createRegistrationTokenForOrg: ["POST /orgs/{org}/actions/runners/registration-token"], + createRegistrationTokenForRepo: ["POST /repos/{owner}/{repo}/actions/runners/registration-token"], + createRemoveTokenForOrg: ["POST /orgs/{org}/actions/runners/remove-token"], + createRemoveTokenForRepo: ["POST /repos/{owner}/{repo}/actions/runners/remove-token"], + createWorkflowDispatch: ["POST /repos/{owner}/{repo}/actions/workflows/{workflow_id}/dispatches"], + deleteArtifact: ["DELETE /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"], + deleteEnvironmentSecret: ["DELETE /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}"], + deleteOrgSecret: ["DELETE /orgs/{org}/actions/secrets/{secret_name}"], + deleteRepoSecret: ["DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}"], + deleteSelfHostedRunnerFromOrg: ["DELETE /orgs/{org}/actions/runners/{runner_id}"], + deleteSelfHostedRunnerFromRepo: ["DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}"], + deleteWorkflowRun: ["DELETE /repos/{owner}/{repo}/actions/runs/{run_id}"], + deleteWorkflowRunLogs: ["DELETE /repos/{owner}/{repo}/actions/runs/{run_id}/logs"], + disableSelectedRepositoryGithubActionsOrganization: ["DELETE /orgs/{org}/actions/permissions/repositories/{repository_id}"], + disableWorkflow: ["PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/disable"], + downloadArtifact: ["GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}/{archive_format}"], + downloadJobLogsForWorkflowRun: ["GET /repos/{owner}/{repo}/actions/jobs/{job_id}/logs"], + downloadWorkflowRunLogs: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/logs"], + enableSelectedRepositoryGithubActionsOrganization: ["PUT /orgs/{org}/actions/permissions/repositories/{repository_id}"], + enableWorkflow: ["PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/enable"], + getAllowedActionsOrganization: ["GET /orgs/{org}/actions/permissions/selected-actions"], + getAllowedActionsRepository: ["GET /repos/{owner}/{repo}/actions/permissions/selected-actions"], + getArtifact: ["GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"], + getEnvironmentPublicKey: ["GET /repositories/{repository_id}/environments/{environment_name}/secrets/public-key"], + getEnvironmentSecret: ["GET /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}"], + getGithubActionsPermissionsOrganization: ["GET /orgs/{org}/actions/permissions"], + getGithubActionsPermissionsRepository: ["GET /repos/{owner}/{repo}/actions/permissions"], + getJobForWorkflowRun: ["GET /repos/{owner}/{repo}/actions/jobs/{job_id}"], + getOrgPublicKey: ["GET /orgs/{org}/actions/secrets/public-key"], + getOrgSecret: ["GET /orgs/{org}/actions/secrets/{secret_name}"], + getPendingDeploymentsForRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments"], + getRepoPermissions: ["GET /repos/{owner}/{repo}/actions/permissions", {}, { + renamed: ["actions", "getGithubActionsPermissionsRepository"] + }], + getRepoPublicKey: ["GET /repos/{owner}/{repo}/actions/secrets/public-key"], + getRepoSecret: ["GET /repos/{owner}/{repo}/actions/secrets/{secret_name}"], + getReviewsForRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/approvals"], + getSelfHostedRunnerForOrg: ["GET /orgs/{org}/actions/runners/{runner_id}"], + getSelfHostedRunnerForRepo: ["GET /repos/{owner}/{repo}/actions/runners/{runner_id}"], + getWorkflow: ["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}"], + getWorkflowRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}"], + getWorkflowRunUsage: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/timing"], + getWorkflowUsage: ["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/timing"], + listArtifactsForRepo: ["GET /repos/{owner}/{repo}/actions/artifacts"], + listEnvironmentSecrets: ["GET /repositories/{repository_id}/environments/{environment_name}/secrets"], + listJobsForWorkflowRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs"], + listOrgSecrets: ["GET /orgs/{org}/actions/secrets"], + listRepoSecrets: ["GET /repos/{owner}/{repo}/actions/secrets"], + listRepoWorkflows: ["GET /repos/{owner}/{repo}/actions/workflows"], + listRunnerApplicationsForOrg: ["GET /orgs/{org}/actions/runners/downloads"], + listRunnerApplicationsForRepo: ["GET /repos/{owner}/{repo}/actions/runners/downloads"], + listSelectedReposForOrgSecret: ["GET /orgs/{org}/actions/secrets/{secret_name}/repositories"], + listSelectedRepositoriesEnabledGithubActionsOrganization: ["GET /orgs/{org}/actions/permissions/repositories"], + listSelfHostedRunnersForOrg: ["GET /orgs/{org}/actions/runners"], + listSelfHostedRunnersForRepo: ["GET /repos/{owner}/{repo}/actions/runners"], + listWorkflowRunArtifacts: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts"], + listWorkflowRuns: ["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs"], + listWorkflowRunsForRepo: ["GET /repos/{owner}/{repo}/actions/runs"], + reRunWorkflow: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun"], + removeSelectedRepoFromOrgSecret: ["DELETE /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}"], + reviewPendingDeploymentsForRun: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments"], + setAllowedActionsOrganization: ["PUT /orgs/{org}/actions/permissions/selected-actions"], + setAllowedActionsRepository: ["PUT /repos/{owner}/{repo}/actions/permissions/selected-actions"], + setGithubActionsPermissionsOrganization: ["PUT /orgs/{org}/actions/permissions"], + setGithubActionsPermissionsRepository: ["PUT /repos/{owner}/{repo}/actions/permissions"], + setSelectedReposForOrgSecret: ["PUT /orgs/{org}/actions/secrets/{secret_name}/repositories"], + setSelectedRepositoriesEnabledGithubActionsOrganization: ["PUT /orgs/{org}/actions/permissions/repositories"] + }, + activity: { + checkRepoIsStarredByAuthenticatedUser: ["GET /user/starred/{owner}/{repo}"], + deleteRepoSubscription: ["DELETE /repos/{owner}/{repo}/subscription"], + deleteThreadSubscription: ["DELETE /notifications/threads/{thread_id}/subscription"], + getFeeds: ["GET /feeds"], + getRepoSubscription: ["GET /repos/{owner}/{repo}/subscription"], + getThread: ["GET /notifications/threads/{thread_id}"], + getThreadSubscriptionForAuthenticatedUser: ["GET /notifications/threads/{thread_id}/subscription"], + listEventsForAuthenticatedUser: ["GET /users/{username}/events"], + listNotificationsForAuthenticatedUser: ["GET /notifications"], + listOrgEventsForAuthenticatedUser: ["GET /users/{username}/events/orgs/{org}"], + listPublicEvents: ["GET /events"], + listPublicEventsForRepoNetwork: ["GET /networks/{owner}/{repo}/events"], + listPublicEventsForUser: ["GET /users/{username}/events/public"], + listPublicOrgEvents: ["GET /orgs/{org}/events"], + listReceivedEventsForUser: ["GET /users/{username}/received_events"], + listReceivedPublicEventsForUser: ["GET /users/{username}/received_events/public"], + listRepoEvents: ["GET /repos/{owner}/{repo}/events"], + listRepoNotificationsForAuthenticatedUser: ["GET /repos/{owner}/{repo}/notifications"], + listReposStarredByAuthenticatedUser: ["GET /user/starred"], + listReposStarredByUser: ["GET /users/{username}/starred"], + listReposWatchedByUser: ["GET /users/{username}/subscriptions"], + listStargazersForRepo: ["GET /repos/{owner}/{repo}/stargazers"], + listWatchedReposForAuthenticatedUser: ["GET /user/subscriptions"], + listWatchersForRepo: ["GET /repos/{owner}/{repo}/subscribers"], + markNotificationsAsRead: ["PUT /notifications"], + markRepoNotificationsAsRead: ["PUT /repos/{owner}/{repo}/notifications"], + markThreadAsRead: ["PATCH /notifications/threads/{thread_id}"], + setRepoSubscription: ["PUT /repos/{owner}/{repo}/subscription"], + setThreadSubscription: ["PUT /notifications/threads/{thread_id}/subscription"], + starRepoForAuthenticatedUser: ["PUT /user/starred/{owner}/{repo}"], + unstarRepoForAuthenticatedUser: ["DELETE /user/starred/{owner}/{repo}"] + }, + apps: { + addRepoToInstallation: ["PUT /user/installations/{installation_id}/repositories/{repository_id}"], + checkToken: ["POST /applications/{client_id}/token"], + createContentAttachment: ["POST /content_references/{content_reference_id}/attachments", { + mediaType: { + previews: ["corsair"] + } + }], + createContentAttachmentForRepo: ["POST /repos/{owner}/{repo}/content_references/{content_reference_id}/attachments", { + mediaType: { + previews: ["corsair"] + } + }], + createFromManifest: ["POST /app-manifests/{code}/conversions"], + createInstallationAccessToken: ["POST /app/installations/{installation_id}/access_tokens"], + deleteAuthorization: ["DELETE /applications/{client_id}/grant"], + deleteInstallation: ["DELETE /app/installations/{installation_id}"], + deleteToken: ["DELETE /applications/{client_id}/token"], + getAuthenticated: ["GET /app"], + getBySlug: ["GET /apps/{app_slug}"], + getInstallation: ["GET /app/installations/{installation_id}"], + getOrgInstallation: ["GET /orgs/{org}/installation"], + getRepoInstallation: ["GET /repos/{owner}/{repo}/installation"], + getSubscriptionPlanForAccount: ["GET /marketplace_listing/accounts/{account_id}"], + getSubscriptionPlanForAccountStubbed: ["GET /marketplace_listing/stubbed/accounts/{account_id}"], + getUserInstallation: ["GET /users/{username}/installation"], + getWebhookConfigForApp: ["GET /app/hook/config"], + listAccountsForPlan: ["GET /marketplace_listing/plans/{plan_id}/accounts"], + listAccountsForPlanStubbed: ["GET /marketplace_listing/stubbed/plans/{plan_id}/accounts"], + listInstallationReposForAuthenticatedUser: ["GET /user/installations/{installation_id}/repositories"], + listInstallations: ["GET /app/installations"], + listInstallationsForAuthenticatedUser: ["GET /user/installations"], + listPlans: ["GET /marketplace_listing/plans"], + listPlansStubbed: ["GET /marketplace_listing/stubbed/plans"], + listReposAccessibleToInstallation: ["GET /installation/repositories"], + listSubscriptionsForAuthenticatedUser: ["GET /user/marketplace_purchases"], + listSubscriptionsForAuthenticatedUserStubbed: ["GET /user/marketplace_purchases/stubbed"], + removeRepoFromInstallation: ["DELETE /user/installations/{installation_id}/repositories/{repository_id}"], + resetToken: ["PATCH /applications/{client_id}/token"], + revokeInstallationAccessToken: ["DELETE /installation/token"], + scopeToken: ["POST /applications/{client_id}/token/scoped"], + suspendInstallation: ["PUT /app/installations/{installation_id}/suspended"], + unsuspendInstallation: ["DELETE /app/installations/{installation_id}/suspended"], + updateWebhookConfigForApp: ["PATCH /app/hook/config"] + }, + billing: { + getGithubActionsBillingOrg: ["GET /orgs/{org}/settings/billing/actions"], + getGithubActionsBillingUser: ["GET /users/{username}/settings/billing/actions"], + getGithubPackagesBillingOrg: ["GET /orgs/{org}/settings/billing/packages"], + getGithubPackagesBillingUser: ["GET /users/{username}/settings/billing/packages"], + getSharedStorageBillingOrg: ["GET /orgs/{org}/settings/billing/shared-storage"], + getSharedStorageBillingUser: ["GET /users/{username}/settings/billing/shared-storage"] + }, + checks: { + create: ["POST /repos/{owner}/{repo}/check-runs"], + createSuite: ["POST /repos/{owner}/{repo}/check-suites"], + get: ["GET /repos/{owner}/{repo}/check-runs/{check_run_id}"], + getSuite: ["GET /repos/{owner}/{repo}/check-suites/{check_suite_id}"], + listAnnotations: ["GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations"], + listForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/check-runs"], + listForSuite: ["GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs"], + listSuitesForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/check-suites"], + rerequestSuite: ["POST /repos/{owner}/{repo}/check-suites/{check_suite_id}/rerequest"], + setSuitesPreferences: ["PATCH /repos/{owner}/{repo}/check-suites/preferences"], + update: ["PATCH /repos/{owner}/{repo}/check-runs/{check_run_id}"] + }, + codeScanning: { + deleteAnalysis: ["DELETE /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}{?confirm_delete}"], + getAlert: ["GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}", {}, { + renamedParameters: { + alert_id: "alert_number" + } + }], + getAnalysis: ["GET /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}"], + getSarif: ["GET /repos/{owner}/{repo}/code-scanning/sarifs/{sarif_id}"], + listAlertInstances: ["GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances"], + listAlertsForRepo: ["GET /repos/{owner}/{repo}/code-scanning/alerts"], + listAlertsInstances: ["GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances", {}, { + renamed: ["codeScanning", "listAlertInstances"] + }], + listRecentAnalyses: ["GET /repos/{owner}/{repo}/code-scanning/analyses"], + updateAlert: ["PATCH /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}"], + uploadSarif: ["POST /repos/{owner}/{repo}/code-scanning/sarifs"] + }, + codesOfConduct: { + getAllCodesOfConduct: ["GET /codes_of_conduct", { + mediaType: { + previews: ["scarlet-witch"] + } + }], + getConductCode: ["GET /codes_of_conduct/{key}", { + mediaType: { + previews: ["scarlet-witch"] + } + }], + getForRepo: ["GET /repos/{owner}/{repo}/community/code_of_conduct", { + mediaType: { + previews: ["scarlet-witch"] + } + }] + }, + emojis: { + get: ["GET /emojis"] + }, + enterpriseAdmin: { + disableSelectedOrganizationGithubActionsEnterprise: ["DELETE /enterprises/{enterprise}/actions/permissions/organizations/{org_id}"], + enableSelectedOrganizationGithubActionsEnterprise: ["PUT /enterprises/{enterprise}/actions/permissions/organizations/{org_id}"], + getAllowedActionsEnterprise: ["GET /enterprises/{enterprise}/actions/permissions/selected-actions"], + getGithubActionsPermissionsEnterprise: ["GET /enterprises/{enterprise}/actions/permissions"], + listSelectedOrganizationsEnabledGithubActionsEnterprise: ["GET /enterprises/{enterprise}/actions/permissions/organizations"], + setAllowedActionsEnterprise: ["PUT /enterprises/{enterprise}/actions/permissions/selected-actions"], + setGithubActionsPermissionsEnterprise: ["PUT /enterprises/{enterprise}/actions/permissions"], + setSelectedOrganizationsEnabledGithubActionsEnterprise: ["PUT /enterprises/{enterprise}/actions/permissions/organizations"] + }, + gists: { + checkIsStarred: ["GET /gists/{gist_id}/star"], + create: ["POST /gists"], + createComment: ["POST /gists/{gist_id}/comments"], + delete: ["DELETE /gists/{gist_id}"], + deleteComment: ["DELETE /gists/{gist_id}/comments/{comment_id}"], + fork: ["POST /gists/{gist_id}/forks"], + get: ["GET /gists/{gist_id}"], + getComment: ["GET /gists/{gist_id}/comments/{comment_id}"], + getRevision: ["GET /gists/{gist_id}/{sha}"], + list: ["GET /gists"], + listComments: ["GET /gists/{gist_id}/comments"], + listCommits: ["GET /gists/{gist_id}/commits"], + listForUser: ["GET /users/{username}/gists"], + listForks: ["GET /gists/{gist_id}/forks"], + listPublic: ["GET /gists/public"], + listStarred: ["GET /gists/starred"], + star: ["PUT /gists/{gist_id}/star"], + unstar: ["DELETE /gists/{gist_id}/star"], + update: ["PATCH /gists/{gist_id}"], + updateComment: ["PATCH /gists/{gist_id}/comments/{comment_id}"] + }, + git: { + createBlob: ["POST /repos/{owner}/{repo}/git/blobs"], + createCommit: ["POST /repos/{owner}/{repo}/git/commits"], + createRef: ["POST /repos/{owner}/{repo}/git/refs"], + createTag: ["POST /repos/{owner}/{repo}/git/tags"], + createTree: ["POST /repos/{owner}/{repo}/git/trees"], + deleteRef: ["DELETE /repos/{owner}/{repo}/git/refs/{ref}"], + getBlob: ["GET /repos/{owner}/{repo}/git/blobs/{file_sha}"], + getCommit: ["GET /repos/{owner}/{repo}/git/commits/{commit_sha}"], + getRef: ["GET /repos/{owner}/{repo}/git/ref/{ref}"], + getTag: ["GET /repos/{owner}/{repo}/git/tags/{tag_sha}"], + getTree: ["GET /repos/{owner}/{repo}/git/trees/{tree_sha}"], + listMatchingRefs: ["GET /repos/{owner}/{repo}/git/matching-refs/{ref}"], + updateRef: ["PATCH /repos/{owner}/{repo}/git/refs/{ref}"] + }, + gitignore: { + getAllTemplates: ["GET /gitignore/templates"], + getTemplate: ["GET /gitignore/templates/{name}"] + }, + interactions: { + getRestrictionsForAuthenticatedUser: ["GET /user/interaction-limits"], + getRestrictionsForOrg: ["GET /orgs/{org}/interaction-limits"], + getRestrictionsForRepo: ["GET /repos/{owner}/{repo}/interaction-limits"], + getRestrictionsForYourPublicRepos: ["GET /user/interaction-limits", {}, { + renamed: ["interactions", "getRestrictionsForAuthenticatedUser"] + }], + removeRestrictionsForAuthenticatedUser: ["DELETE /user/interaction-limits"], + removeRestrictionsForOrg: ["DELETE /orgs/{org}/interaction-limits"], + removeRestrictionsForRepo: ["DELETE /repos/{owner}/{repo}/interaction-limits"], + removeRestrictionsForYourPublicRepos: ["DELETE /user/interaction-limits", {}, { + renamed: ["interactions", "removeRestrictionsForAuthenticatedUser"] + }], + setRestrictionsForAuthenticatedUser: ["PUT /user/interaction-limits"], + setRestrictionsForOrg: ["PUT /orgs/{org}/interaction-limits"], + setRestrictionsForRepo: ["PUT /repos/{owner}/{repo}/interaction-limits"], + setRestrictionsForYourPublicRepos: ["PUT /user/interaction-limits", {}, { + renamed: ["interactions", "setRestrictionsForAuthenticatedUser"] + }] + }, + issues: { + addAssignees: ["POST /repos/{owner}/{repo}/issues/{issue_number}/assignees"], + addLabels: ["POST /repos/{owner}/{repo}/issues/{issue_number}/labels"], + checkUserCanBeAssigned: ["GET /repos/{owner}/{repo}/assignees/{assignee}"], + create: ["POST /repos/{owner}/{repo}/issues"], + createComment: ["POST /repos/{owner}/{repo}/issues/{issue_number}/comments"], + createLabel: ["POST /repos/{owner}/{repo}/labels"], + createMilestone: ["POST /repos/{owner}/{repo}/milestones"], + deleteComment: ["DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}"], + deleteLabel: ["DELETE /repos/{owner}/{repo}/labels/{name}"], + deleteMilestone: ["DELETE /repos/{owner}/{repo}/milestones/{milestone_number}"], + get: ["GET /repos/{owner}/{repo}/issues/{issue_number}"], + getComment: ["GET /repos/{owner}/{repo}/issues/comments/{comment_id}"], + getEvent: ["GET /repos/{owner}/{repo}/issues/events/{event_id}"], + getLabel: ["GET /repos/{owner}/{repo}/labels/{name}"], + getMilestone: ["GET /repos/{owner}/{repo}/milestones/{milestone_number}"], + list: ["GET /issues"], + listAssignees: ["GET /repos/{owner}/{repo}/assignees"], + listComments: ["GET /repos/{owner}/{repo}/issues/{issue_number}/comments"], + listCommentsForRepo: ["GET /repos/{owner}/{repo}/issues/comments"], + listEvents: ["GET /repos/{owner}/{repo}/issues/{issue_number}/events"], + listEventsForRepo: ["GET /repos/{owner}/{repo}/issues/events"], + listEventsForTimeline: ["GET /repos/{owner}/{repo}/issues/{issue_number}/timeline", { + mediaType: { + previews: ["mockingbird"] + } + }], + listForAuthenticatedUser: ["GET /user/issues"], + listForOrg: ["GET /orgs/{org}/issues"], + listForRepo: ["GET /repos/{owner}/{repo}/issues"], + listLabelsForMilestone: ["GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels"], + listLabelsForRepo: ["GET /repos/{owner}/{repo}/labels"], + listLabelsOnIssue: ["GET /repos/{owner}/{repo}/issues/{issue_number}/labels"], + listMilestones: ["GET /repos/{owner}/{repo}/milestones"], + lock: ["PUT /repos/{owner}/{repo}/issues/{issue_number}/lock"], + removeAllLabels: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels"], + removeAssignees: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/assignees"], + removeLabel: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{name}"], + setLabels: ["PUT /repos/{owner}/{repo}/issues/{issue_number}/labels"], + unlock: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/lock"], + update: ["PATCH /repos/{owner}/{repo}/issues/{issue_number}"], + updateComment: ["PATCH /repos/{owner}/{repo}/issues/comments/{comment_id}"], + updateLabel: ["PATCH /repos/{owner}/{repo}/labels/{name}"], + updateMilestone: ["PATCH /repos/{owner}/{repo}/milestones/{milestone_number}"] + }, + licenses: { + get: ["GET /licenses/{license}"], + getAllCommonlyUsed: ["GET /licenses"], + getForRepo: ["GET /repos/{owner}/{repo}/license"] + }, + markdown: { + render: ["POST /markdown"], + renderRaw: ["POST /markdown/raw", { + headers: { + "content-type": "text/plain; charset=utf-8" + } + }] + }, + meta: { + get: ["GET /meta"], + getOctocat: ["GET /octocat"], + getZen: ["GET /zen"], + root: ["GET /"] + }, + migrations: { + cancelImport: ["DELETE /repos/{owner}/{repo}/import"], + deleteArchiveForAuthenticatedUser: ["DELETE /user/migrations/{migration_id}/archive", { + mediaType: { + previews: ["wyandotte"] + } + }], + deleteArchiveForOrg: ["DELETE /orgs/{org}/migrations/{migration_id}/archive", { + mediaType: { + previews: ["wyandotte"] + } + }], + downloadArchiveForOrg: ["GET /orgs/{org}/migrations/{migration_id}/archive", { + mediaType: { + previews: ["wyandotte"] + } + }], + getArchiveForAuthenticatedUser: ["GET /user/migrations/{migration_id}/archive", { + mediaType: { + previews: ["wyandotte"] + } + }], + getCommitAuthors: ["GET /repos/{owner}/{repo}/import/authors"], + getImportStatus: ["GET /repos/{owner}/{repo}/import"], + getLargeFiles: ["GET /repos/{owner}/{repo}/import/large_files"], + getStatusForAuthenticatedUser: ["GET /user/migrations/{migration_id}", { + mediaType: { + previews: ["wyandotte"] + } + }], + getStatusForOrg: ["GET /orgs/{org}/migrations/{migration_id}", { + mediaType: { + previews: ["wyandotte"] + } + }], + listForAuthenticatedUser: ["GET /user/migrations", { + mediaType: { + previews: ["wyandotte"] + } + }], + listForOrg: ["GET /orgs/{org}/migrations", { + mediaType: { + previews: ["wyandotte"] + } + }], + listReposForOrg: ["GET /orgs/{org}/migrations/{migration_id}/repositories", { + mediaType: { + previews: ["wyandotte"] + } + }], + listReposForUser: ["GET /user/migrations/{migration_id}/repositories", { + mediaType: { + previews: ["wyandotte"] + } + }], + mapCommitAuthor: ["PATCH /repos/{owner}/{repo}/import/authors/{author_id}"], + setLfsPreference: ["PATCH /repos/{owner}/{repo}/import/lfs"], + startForAuthenticatedUser: ["POST /user/migrations"], + startForOrg: ["POST /orgs/{org}/migrations"], + startImport: ["PUT /repos/{owner}/{repo}/import"], + unlockRepoForAuthenticatedUser: ["DELETE /user/migrations/{migration_id}/repos/{repo_name}/lock", { + mediaType: { + previews: ["wyandotte"] + } + }], + unlockRepoForOrg: ["DELETE /orgs/{org}/migrations/{migration_id}/repos/{repo_name}/lock", { + mediaType: { + previews: ["wyandotte"] + } + }], + updateImport: ["PATCH /repos/{owner}/{repo}/import"] + }, + orgs: { + blockUser: ["PUT /orgs/{org}/blocks/{username}"], + cancelInvitation: ["DELETE /orgs/{org}/invitations/{invitation_id}"], + checkBlockedUser: ["GET /orgs/{org}/blocks/{username}"], + checkMembershipForUser: ["GET /orgs/{org}/members/{username}"], + checkPublicMembershipForUser: ["GET /orgs/{org}/public_members/{username}"], + convertMemberToOutsideCollaborator: ["PUT /orgs/{org}/outside_collaborators/{username}"], + createInvitation: ["POST /orgs/{org}/invitations"], + createWebhook: ["POST /orgs/{org}/hooks"], + deleteWebhook: ["DELETE /orgs/{org}/hooks/{hook_id}"], + get: ["GET /orgs/{org}"], + getMembershipForAuthenticatedUser: ["GET /user/memberships/orgs/{org}"], + getMembershipForUser: ["GET /orgs/{org}/memberships/{username}"], + getWebhook: ["GET /orgs/{org}/hooks/{hook_id}"], + getWebhookConfigForOrg: ["GET /orgs/{org}/hooks/{hook_id}/config"], + list: ["GET /organizations"], + listAppInstallations: ["GET /orgs/{org}/installations"], + listBlockedUsers: ["GET /orgs/{org}/blocks"], + listFailedInvitations: ["GET /orgs/{org}/failed_invitations"], + listForAuthenticatedUser: ["GET /user/orgs"], + listForUser: ["GET /users/{username}/orgs"], + listInvitationTeams: ["GET /orgs/{org}/invitations/{invitation_id}/teams"], + listMembers: ["GET /orgs/{org}/members"], + listMembershipsForAuthenticatedUser: ["GET /user/memberships/orgs"], + listOutsideCollaborators: ["GET /orgs/{org}/outside_collaborators"], + listPendingInvitations: ["GET /orgs/{org}/invitations"], + listPublicMembers: ["GET /orgs/{org}/public_members"], + listWebhooks: ["GET /orgs/{org}/hooks"], + pingWebhook: ["POST /orgs/{org}/hooks/{hook_id}/pings"], + removeMember: ["DELETE /orgs/{org}/members/{username}"], + removeMembershipForUser: ["DELETE /orgs/{org}/memberships/{username}"], + removeOutsideCollaborator: ["DELETE /orgs/{org}/outside_collaborators/{username}"], + removePublicMembershipForAuthenticatedUser: ["DELETE /orgs/{org}/public_members/{username}"], + setMembershipForUser: ["PUT /orgs/{org}/memberships/{username}"], + setPublicMembershipForAuthenticatedUser: ["PUT /orgs/{org}/public_members/{username}"], + unblockUser: ["DELETE /orgs/{org}/blocks/{username}"], + update: ["PATCH /orgs/{org}"], + updateMembershipForAuthenticatedUser: ["PATCH /user/memberships/orgs/{org}"], + updateWebhook: ["PATCH /orgs/{org}/hooks/{hook_id}"], + updateWebhookConfigForOrg: ["PATCH /orgs/{org}/hooks/{hook_id}/config"] + }, + packages: { + deletePackageForAuthenticatedUser: ["DELETE /user/packages/{package_type}/{package_name}"], + deletePackageForOrg: ["DELETE /orgs/{org}/packages/{package_type}/{package_name}"], + deletePackageVersionForAuthenticatedUser: ["DELETE /user/packages/{package_type}/{package_name}/versions/{package_version_id}"], + deletePackageVersionForOrg: ["DELETE /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}"], + getAllPackageVersionsForAPackageOwnedByAnOrg: ["GET /orgs/{org}/packages/{package_type}/{package_name}/versions", {}, { + renamed: ["packages", "getAllPackageVersionsForPackageOwnedByOrg"] + }], + getAllPackageVersionsForAPackageOwnedByTheAuthenticatedUser: ["GET /user/packages/{package_type}/{package_name}/versions", {}, { + renamed: ["packages", "getAllPackageVersionsForPackageOwnedByAuthenticatedUser"] + }], + getAllPackageVersionsForPackageOwnedByAuthenticatedUser: ["GET /user/packages/{package_type}/{package_name}/versions"], + getAllPackageVersionsForPackageOwnedByOrg: ["GET /orgs/{org}/packages/{package_type}/{package_name}/versions"], + getAllPackageVersionsForPackageOwnedByUser: ["GET /users/{username}/packages/{package_type}/{package_name}/versions"], + getPackageForAuthenticatedUser: ["GET /user/packages/{package_type}/{package_name}"], + getPackageForOrganization: ["GET /orgs/{org}/packages/{package_type}/{package_name}"], + getPackageForUser: ["GET /users/{username}/packages/{package_type}/{package_name}"], + getPackageVersionForAuthenticatedUser: ["GET /user/packages/{package_type}/{package_name}/versions/{package_version_id}"], + getPackageVersionForOrganization: ["GET /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}"], + getPackageVersionForUser: ["GET /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}"], + restorePackageForAuthenticatedUser: ["POST /user/packages/{package_type}/{package_name}/restore{?token}"], + restorePackageForOrg: ["POST /orgs/{org}/packages/{package_type}/{package_name}/restore{?token}"], + restorePackageVersionForAuthenticatedUser: ["POST /user/packages/{package_type}/{package_name}/versions/{package_version_id}/restore"], + restorePackageVersionForOrg: ["POST /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore"] + }, + projects: { + addCollaborator: ["PUT /projects/{project_id}/collaborators/{username}", { + mediaType: { + previews: ["inertia"] + } + }], + createCard: ["POST /projects/columns/{column_id}/cards", { + mediaType: { + previews: ["inertia"] + } + }], + createColumn: ["POST /projects/{project_id}/columns", { + mediaType: { + previews: ["inertia"] + } + }], + createForAuthenticatedUser: ["POST /user/projects", { + mediaType: { + previews: ["inertia"] + } + }], + createForOrg: ["POST /orgs/{org}/projects", { + mediaType: { + previews: ["inertia"] + } + }], + createForRepo: ["POST /repos/{owner}/{repo}/projects", { + mediaType: { + previews: ["inertia"] + } + }], + delete: ["DELETE /projects/{project_id}", { + mediaType: { + previews: ["inertia"] + } + }], + deleteCard: ["DELETE /projects/columns/cards/{card_id}", { + mediaType: { + previews: ["inertia"] + } + }], + deleteColumn: ["DELETE /projects/columns/{column_id}", { + mediaType: { + previews: ["inertia"] + } + }], + get: ["GET /projects/{project_id}", { + mediaType: { + previews: ["inertia"] + } + }], + getCard: ["GET /projects/columns/cards/{card_id}", { + mediaType: { + previews: ["inertia"] + } + }], + getColumn: ["GET /projects/columns/{column_id}", { + mediaType: { + previews: ["inertia"] + } + }], + getPermissionForUser: ["GET /projects/{project_id}/collaborators/{username}/permission", { + mediaType: { + previews: ["inertia"] + } + }], + listCards: ["GET /projects/columns/{column_id}/cards", { + mediaType: { + previews: ["inertia"] + } + }], + listCollaborators: ["GET /projects/{project_id}/collaborators", { + mediaType: { + previews: ["inertia"] + } + }], + listColumns: ["GET /projects/{project_id}/columns", { + mediaType: { + previews: ["inertia"] + } + }], + listForOrg: ["GET /orgs/{org}/projects", { + mediaType: { + previews: ["inertia"] + } + }], + listForRepo: ["GET /repos/{owner}/{repo}/projects", { + mediaType: { + previews: ["inertia"] + } + }], + listForUser: ["GET /users/{username}/projects", { + mediaType: { + previews: ["inertia"] + } + }], + moveCard: ["POST /projects/columns/cards/{card_id}/moves", { + mediaType: { + previews: ["inertia"] + } + }], + moveColumn: ["POST /projects/columns/{column_id}/moves", { + mediaType: { + previews: ["inertia"] + } + }], + removeCollaborator: ["DELETE /projects/{project_id}/collaborators/{username}", { + mediaType: { + previews: ["inertia"] + } + }], + update: ["PATCH /projects/{project_id}", { + mediaType: { + previews: ["inertia"] + } + }], + updateCard: ["PATCH /projects/columns/cards/{card_id}", { + mediaType: { + previews: ["inertia"] + } + }], + updateColumn: ["PATCH /projects/columns/{column_id}", { + mediaType: { + previews: ["inertia"] + } + }] + }, + pulls: { + checkIfMerged: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/merge"], + create: ["POST /repos/{owner}/{repo}/pulls"], + createReplyForReviewComment: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/comments/{comment_id}/replies"], + createReview: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews"], + createReviewComment: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/comments"], + deletePendingReview: ["DELETE /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"], + deleteReviewComment: ["DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}"], + dismissReview: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/dismissals"], + get: ["GET /repos/{owner}/{repo}/pulls/{pull_number}"], + getReview: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"], + getReviewComment: ["GET /repos/{owner}/{repo}/pulls/comments/{comment_id}"], + list: ["GET /repos/{owner}/{repo}/pulls"], + listCommentsForReview: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments"], + listCommits: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/commits"], + listFiles: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/files"], + listRequestedReviewers: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"], + listReviewComments: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/comments"], + listReviewCommentsForRepo: ["GET /repos/{owner}/{repo}/pulls/comments"], + listReviews: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews"], + merge: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/merge"], + removeRequestedReviewers: ["DELETE /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"], + requestReviewers: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"], + submitReview: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/events"], + update: ["PATCH /repos/{owner}/{repo}/pulls/{pull_number}"], + updateBranch: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/update-branch", { + mediaType: { + previews: ["lydian"] + } + }], + updateReview: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"], + updateReviewComment: ["PATCH /repos/{owner}/{repo}/pulls/comments/{comment_id}"] + }, + rateLimit: { + get: ["GET /rate_limit"] + }, + reactions: { + createForCommitComment: ["POST /repos/{owner}/{repo}/comments/{comment_id}/reactions", { + mediaType: { + previews: ["squirrel-girl"] + } + }], + createForIssue: ["POST /repos/{owner}/{repo}/issues/{issue_number}/reactions", { + mediaType: { + previews: ["squirrel-girl"] + } + }], + createForIssueComment: ["POST /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions", { + mediaType: { + previews: ["squirrel-girl"] + } + }], + createForPullRequestReviewComment: ["POST /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions", { + mediaType: { + previews: ["squirrel-girl"] + } + }], + createForRelease: ["POST /repos/{owner}/{repo}/releases/{release_id}/reactions", { + mediaType: { + previews: ["squirrel-girl"] + } + }], + createForTeamDiscussionCommentInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions", { + mediaType: { + previews: ["squirrel-girl"] + } + }], + createForTeamDiscussionInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions", { + mediaType: { + previews: ["squirrel-girl"] + } + }], + deleteForCommitComment: ["DELETE /repos/{owner}/{repo}/comments/{comment_id}/reactions/{reaction_id}", { + mediaType: { + previews: ["squirrel-girl"] + } + }], + deleteForIssue: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/reactions/{reaction_id}", { + mediaType: { + previews: ["squirrel-girl"] + } + }], + deleteForIssueComment: ["DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions/{reaction_id}", { + mediaType: { + previews: ["squirrel-girl"] + } + }], + deleteForPullRequestComment: ["DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions/{reaction_id}", { + mediaType: { + previews: ["squirrel-girl"] + } + }], + deleteForTeamDiscussion: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions/{reaction_id}", { + mediaType: { + previews: ["squirrel-girl"] + } + }], + deleteForTeamDiscussionComment: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions/{reaction_id}", { + mediaType: { + previews: ["squirrel-girl"] + } + }], + deleteLegacy: ["DELETE /reactions/{reaction_id}", { + mediaType: { + previews: ["squirrel-girl"] + } + }, { + deprecated: "octokit.rest.reactions.deleteLegacy() is deprecated, see https://docs.github.com/rest/reference/reactions/#delete-a-reaction-legacy" + }], + listForCommitComment: ["GET /repos/{owner}/{repo}/comments/{comment_id}/reactions", { + mediaType: { + previews: ["squirrel-girl"] + } + }], + listForIssue: ["GET /repos/{owner}/{repo}/issues/{issue_number}/reactions", { + mediaType: { + previews: ["squirrel-girl"] + } + }], + listForIssueComment: ["GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions", { + mediaType: { + previews: ["squirrel-girl"] + } + }], + listForPullRequestReviewComment: ["GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions", { + mediaType: { + previews: ["squirrel-girl"] + } + }], + listForTeamDiscussionCommentInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions", { + mediaType: { + previews: ["squirrel-girl"] + } + }], + listForTeamDiscussionInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions", { + mediaType: { + previews: ["squirrel-girl"] + } + }] + }, + repos: { + acceptInvitation: ["PATCH /user/repository_invitations/{invitation_id}"], + addAppAccessRestrictions: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps", {}, { + mapToData: "apps" + }], + addCollaborator: ["PUT /repos/{owner}/{repo}/collaborators/{username}"], + addStatusCheckContexts: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts", {}, { + mapToData: "contexts" + }], + addTeamAccessRestrictions: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams", {}, { + mapToData: "teams" + }], + addUserAccessRestrictions: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users", {}, { + mapToData: "users" + }], + checkCollaborator: ["GET /repos/{owner}/{repo}/collaborators/{username}"], + checkVulnerabilityAlerts: ["GET /repos/{owner}/{repo}/vulnerability-alerts", { + mediaType: { + previews: ["dorian"] + } + }], + compareCommits: ["GET /repos/{owner}/{repo}/compare/{base}...{head}"], + compareCommitsWithBasehead: ["GET /repos/{owner}/{repo}/compare/{basehead}"], + createCommitComment: ["POST /repos/{owner}/{repo}/commits/{commit_sha}/comments"], + createCommitSignatureProtection: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures", { + mediaType: { + previews: ["zzzax"] + } + }], + createCommitStatus: ["POST /repos/{owner}/{repo}/statuses/{sha}"], + createDeployKey: ["POST /repos/{owner}/{repo}/keys"], + createDeployment: ["POST /repos/{owner}/{repo}/deployments"], + createDeploymentStatus: ["POST /repos/{owner}/{repo}/deployments/{deployment_id}/statuses"], + createDispatchEvent: ["POST /repos/{owner}/{repo}/dispatches"], + createForAuthenticatedUser: ["POST /user/repos"], + createFork: ["POST /repos/{owner}/{repo}/forks"], + createInOrg: ["POST /orgs/{org}/repos"], + createOrUpdateEnvironment: ["PUT /repos/{owner}/{repo}/environments/{environment_name}"], + createOrUpdateFileContents: ["PUT /repos/{owner}/{repo}/contents/{path}"], + createPagesSite: ["POST /repos/{owner}/{repo}/pages", { + mediaType: { + previews: ["switcheroo"] + } + }], + createRelease: ["POST /repos/{owner}/{repo}/releases"], + createUsingTemplate: ["POST /repos/{template_owner}/{template_repo}/generate", { + mediaType: { + previews: ["baptiste"] + } + }], + createWebhook: ["POST /repos/{owner}/{repo}/hooks"], + declineInvitation: ["DELETE /user/repository_invitations/{invitation_id}"], + delete: ["DELETE /repos/{owner}/{repo}"], + deleteAccessRestrictions: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions"], + deleteAdminBranchProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"], + deleteAnEnvironment: ["DELETE /repos/{owner}/{repo}/environments/{environment_name}"], + deleteBranchProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection"], + deleteCommitComment: ["DELETE /repos/{owner}/{repo}/comments/{comment_id}"], + deleteCommitSignatureProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures", { + mediaType: { + previews: ["zzzax"] + } + }], + deleteDeployKey: ["DELETE /repos/{owner}/{repo}/keys/{key_id}"], + deleteDeployment: ["DELETE /repos/{owner}/{repo}/deployments/{deployment_id}"], + deleteFile: ["DELETE /repos/{owner}/{repo}/contents/{path}"], + deleteInvitation: ["DELETE /repos/{owner}/{repo}/invitations/{invitation_id}"], + deletePagesSite: ["DELETE /repos/{owner}/{repo}/pages", { + mediaType: { + previews: ["switcheroo"] + } + }], + deletePullRequestReviewProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"], + deleteRelease: ["DELETE /repos/{owner}/{repo}/releases/{release_id}"], + deleteReleaseAsset: ["DELETE /repos/{owner}/{repo}/releases/assets/{asset_id}"], + deleteWebhook: ["DELETE /repos/{owner}/{repo}/hooks/{hook_id}"], + disableAutomatedSecurityFixes: ["DELETE /repos/{owner}/{repo}/automated-security-fixes", { + mediaType: { + previews: ["london"] + } + }], + disableVulnerabilityAlerts: ["DELETE /repos/{owner}/{repo}/vulnerability-alerts", { + mediaType: { + previews: ["dorian"] + } + }], + downloadArchive: ["GET /repos/{owner}/{repo}/zipball/{ref}", {}, { + renamed: ["repos", "downloadZipballArchive"] + }], + downloadTarballArchive: ["GET /repos/{owner}/{repo}/tarball/{ref}"], + downloadZipballArchive: ["GET /repos/{owner}/{repo}/zipball/{ref}"], + enableAutomatedSecurityFixes: ["PUT /repos/{owner}/{repo}/automated-security-fixes", { + mediaType: { + previews: ["london"] + } + }], + enableVulnerabilityAlerts: ["PUT /repos/{owner}/{repo}/vulnerability-alerts", { + mediaType: { + previews: ["dorian"] + } + }], + get: ["GET /repos/{owner}/{repo}"], + getAccessRestrictions: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions"], + getAdminBranchProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"], + getAllEnvironments: ["GET /repos/{owner}/{repo}/environments"], + getAllStatusCheckContexts: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts"], + getAllTopics: ["GET /repos/{owner}/{repo}/topics", { + mediaType: { + previews: ["mercy"] + } + }], + getAppsWithAccessToProtectedBranch: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps"], + getBranch: ["GET /repos/{owner}/{repo}/branches/{branch}"], + getBranchProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection"], + getClones: ["GET /repos/{owner}/{repo}/traffic/clones"], + getCodeFrequencyStats: ["GET /repos/{owner}/{repo}/stats/code_frequency"], + getCollaboratorPermissionLevel: ["GET /repos/{owner}/{repo}/collaborators/{username}/permission"], + getCombinedStatusForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/status"], + getCommit: ["GET /repos/{owner}/{repo}/commits/{ref}"], + getCommitActivityStats: ["GET /repos/{owner}/{repo}/stats/commit_activity"], + getCommitComment: ["GET /repos/{owner}/{repo}/comments/{comment_id}"], + getCommitSignatureProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures", { + mediaType: { + previews: ["zzzax"] + } + }], + getCommunityProfileMetrics: ["GET /repos/{owner}/{repo}/community/profile"], + getContent: ["GET /repos/{owner}/{repo}/contents/{path}"], + getContributorsStats: ["GET /repos/{owner}/{repo}/stats/contributors"], + getDeployKey: ["GET /repos/{owner}/{repo}/keys/{key_id}"], + getDeployment: ["GET /repos/{owner}/{repo}/deployments/{deployment_id}"], + getDeploymentStatus: ["GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses/{status_id}"], + getEnvironment: ["GET /repos/{owner}/{repo}/environments/{environment_name}"], + getLatestPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/latest"], + getLatestRelease: ["GET /repos/{owner}/{repo}/releases/latest"], + getPages: ["GET /repos/{owner}/{repo}/pages"], + getPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/{build_id}"], + getPagesHealthCheck: ["GET /repos/{owner}/{repo}/pages/health"], + getParticipationStats: ["GET /repos/{owner}/{repo}/stats/participation"], + getPullRequestReviewProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"], + getPunchCardStats: ["GET /repos/{owner}/{repo}/stats/punch_card"], + getReadme: ["GET /repos/{owner}/{repo}/readme"], + getReadmeInDirectory: ["GET /repos/{owner}/{repo}/readme/{dir}"], + getRelease: ["GET /repos/{owner}/{repo}/releases/{release_id}"], + getReleaseAsset: ["GET /repos/{owner}/{repo}/releases/assets/{asset_id}"], + getReleaseByTag: ["GET /repos/{owner}/{repo}/releases/tags/{tag}"], + getStatusChecksProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"], + getTeamsWithAccessToProtectedBranch: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams"], + getTopPaths: ["GET /repos/{owner}/{repo}/traffic/popular/paths"], + getTopReferrers: ["GET /repos/{owner}/{repo}/traffic/popular/referrers"], + getUsersWithAccessToProtectedBranch: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users"], + getViews: ["GET /repos/{owner}/{repo}/traffic/views"], + getWebhook: ["GET /repos/{owner}/{repo}/hooks/{hook_id}"], + getWebhookConfigForRepo: ["GET /repos/{owner}/{repo}/hooks/{hook_id}/config"], + listBranches: ["GET /repos/{owner}/{repo}/branches"], + listBranchesForHeadCommit: ["GET /repos/{owner}/{repo}/commits/{commit_sha}/branches-where-head", { + mediaType: { + previews: ["groot"] + } + }], + listCollaborators: ["GET /repos/{owner}/{repo}/collaborators"], + listCommentsForCommit: ["GET /repos/{owner}/{repo}/commits/{commit_sha}/comments"], + listCommitCommentsForRepo: ["GET /repos/{owner}/{repo}/comments"], + listCommitStatusesForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/statuses"], + listCommits: ["GET /repos/{owner}/{repo}/commits"], + listContributors: ["GET /repos/{owner}/{repo}/contributors"], + listDeployKeys: ["GET /repos/{owner}/{repo}/keys"], + listDeploymentStatuses: ["GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses"], + listDeployments: ["GET /repos/{owner}/{repo}/deployments"], + listForAuthenticatedUser: ["GET /user/repos"], + listForOrg: ["GET /orgs/{org}/repos"], + listForUser: ["GET /users/{username}/repos"], + listForks: ["GET /repos/{owner}/{repo}/forks"], + listInvitations: ["GET /repos/{owner}/{repo}/invitations"], + listInvitationsForAuthenticatedUser: ["GET /user/repository_invitations"], + listLanguages: ["GET /repos/{owner}/{repo}/languages"], + listPagesBuilds: ["GET /repos/{owner}/{repo}/pages/builds"], + listPublic: ["GET /repositories"], + listPullRequestsAssociatedWithCommit: ["GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls", { + mediaType: { + previews: ["groot"] + } + }], + listReleaseAssets: ["GET /repos/{owner}/{repo}/releases/{release_id}/assets"], + listReleases: ["GET /repos/{owner}/{repo}/releases"], + listTags: ["GET /repos/{owner}/{repo}/tags"], + listTeams: ["GET /repos/{owner}/{repo}/teams"], + listWebhooks: ["GET /repos/{owner}/{repo}/hooks"], + merge: ["POST /repos/{owner}/{repo}/merges"], + pingWebhook: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/pings"], + removeAppAccessRestrictions: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps", {}, { + mapToData: "apps" + }], + removeCollaborator: ["DELETE /repos/{owner}/{repo}/collaborators/{username}"], + removeStatusCheckContexts: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts", {}, { + mapToData: "contexts" + }], + removeStatusCheckProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"], + removeTeamAccessRestrictions: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams", {}, { + mapToData: "teams" + }], + removeUserAccessRestrictions: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users", {}, { + mapToData: "users" + }], + renameBranch: ["POST /repos/{owner}/{repo}/branches/{branch}/rename"], + replaceAllTopics: ["PUT /repos/{owner}/{repo}/topics", { + mediaType: { + previews: ["mercy"] + } + }], + requestPagesBuild: ["POST /repos/{owner}/{repo}/pages/builds"], + setAdminBranchProtection: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"], + setAppAccessRestrictions: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps", {}, { + mapToData: "apps" + }], + setStatusCheckContexts: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts", {}, { + mapToData: "contexts" + }], + setTeamAccessRestrictions: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams", {}, { + mapToData: "teams" + }], + setUserAccessRestrictions: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users", {}, { + mapToData: "users" + }], + testPushWebhook: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/tests"], + transfer: ["POST /repos/{owner}/{repo}/transfer"], + update: ["PATCH /repos/{owner}/{repo}"], + updateBranchProtection: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection"], + updateCommitComment: ["PATCH /repos/{owner}/{repo}/comments/{comment_id}"], + updateInformationAboutPagesSite: ["PUT /repos/{owner}/{repo}/pages"], + updateInvitation: ["PATCH /repos/{owner}/{repo}/invitations/{invitation_id}"], + updatePullRequestReviewProtection: ["PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"], + updateRelease: ["PATCH /repos/{owner}/{repo}/releases/{release_id}"], + updateReleaseAsset: ["PATCH /repos/{owner}/{repo}/releases/assets/{asset_id}"], + updateStatusCheckPotection: ["PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks", {}, { + renamed: ["repos", "updateStatusCheckProtection"] + }], + updateStatusCheckProtection: ["PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"], + updateWebhook: ["PATCH /repos/{owner}/{repo}/hooks/{hook_id}"], + updateWebhookConfigForRepo: ["PATCH /repos/{owner}/{repo}/hooks/{hook_id}/config"], + uploadReleaseAsset: ["POST /repos/{owner}/{repo}/releases/{release_id}/assets{?name,label}", { + baseUrl: "https://uploads.github.com" + }] + }, + search: { + code: ["GET /search/code"], + commits: ["GET /search/commits", { + mediaType: { + previews: ["cloak"] + } + }], + issuesAndPullRequests: ["GET /search/issues"], + labels: ["GET /search/labels"], + repos: ["GET /search/repositories"], + topics: ["GET /search/topics", { + mediaType: { + previews: ["mercy"] + } + }], + users: ["GET /search/users"] + }, + secretScanning: { + getAlert: ["GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}"], + listAlertsForRepo: ["GET /repos/{owner}/{repo}/secret-scanning/alerts"], + updateAlert: ["PATCH /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}"] + }, + teams: { + addOrUpdateMembershipForUserInOrg: ["PUT /orgs/{org}/teams/{team_slug}/memberships/{username}"], + addOrUpdateProjectPermissionsInOrg: ["PUT /orgs/{org}/teams/{team_slug}/projects/{project_id}", { + mediaType: { + previews: ["inertia"] + } + }], + addOrUpdateRepoPermissionsInOrg: ["PUT /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"], + checkPermissionsForProjectInOrg: ["GET /orgs/{org}/teams/{team_slug}/projects/{project_id}", { + mediaType: { + previews: ["inertia"] + } + }], + checkPermissionsForRepoInOrg: ["GET /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"], + create: ["POST /orgs/{org}/teams"], + createDiscussionCommentInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments"], + createDiscussionInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions"], + deleteDiscussionCommentInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"], + deleteDiscussionInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"], + deleteInOrg: ["DELETE /orgs/{org}/teams/{team_slug}"], + getByName: ["GET /orgs/{org}/teams/{team_slug}"], + getDiscussionCommentInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"], + getDiscussionInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"], + getMembershipForUserInOrg: ["GET /orgs/{org}/teams/{team_slug}/memberships/{username}"], + list: ["GET /orgs/{org}/teams"], + listChildInOrg: ["GET /orgs/{org}/teams/{team_slug}/teams"], + listDiscussionCommentsInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments"], + listDiscussionsInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions"], + listForAuthenticatedUser: ["GET /user/teams"], + listMembersInOrg: ["GET /orgs/{org}/teams/{team_slug}/members"], + listPendingInvitationsInOrg: ["GET /orgs/{org}/teams/{team_slug}/invitations"], + listProjectsInOrg: ["GET /orgs/{org}/teams/{team_slug}/projects", { + mediaType: { + previews: ["inertia"] + } + }], + listReposInOrg: ["GET /orgs/{org}/teams/{team_slug}/repos"], + removeMembershipForUserInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/memberships/{username}"], + removeProjectInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/projects/{project_id}"], + removeRepoInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"], + updateDiscussionCommentInOrg: ["PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"], + updateDiscussionInOrg: ["PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"], + updateInOrg: ["PATCH /orgs/{org}/teams/{team_slug}"] + }, + users: { + addEmailForAuthenticated: ["POST /user/emails"], + block: ["PUT /user/blocks/{username}"], + checkBlocked: ["GET /user/blocks/{username}"], + checkFollowingForUser: ["GET /users/{username}/following/{target_user}"], + checkPersonIsFollowedByAuthenticated: ["GET /user/following/{username}"], + createGpgKeyForAuthenticated: ["POST /user/gpg_keys"], + createPublicSshKeyForAuthenticated: ["POST /user/keys"], + deleteEmailForAuthenticated: ["DELETE /user/emails"], + deleteGpgKeyForAuthenticated: ["DELETE /user/gpg_keys/{gpg_key_id}"], + deletePublicSshKeyForAuthenticated: ["DELETE /user/keys/{key_id}"], + follow: ["PUT /user/following/{username}"], + getAuthenticated: ["GET /user"], + getByUsername: ["GET /users/{username}"], + getContextForUser: ["GET /users/{username}/hovercard"], + getGpgKeyForAuthenticated: ["GET /user/gpg_keys/{gpg_key_id}"], + getPublicSshKeyForAuthenticated: ["GET /user/keys/{key_id}"], + list: ["GET /users"], + listBlockedByAuthenticated: ["GET /user/blocks"], + listEmailsForAuthenticated: ["GET /user/emails"], + listFollowedByAuthenticated: ["GET /user/following"], + listFollowersForAuthenticatedUser: ["GET /user/followers"], + listFollowersForUser: ["GET /users/{username}/followers"], + listFollowingForUser: ["GET /users/{username}/following"], + listGpgKeysForAuthenticated: ["GET /user/gpg_keys"], + listGpgKeysForUser: ["GET /users/{username}/gpg_keys"], + listPublicEmailsForAuthenticated: ["GET /user/public_emails"], + listPublicKeysForUser: ["GET /users/{username}/keys"], + listPublicSshKeysForAuthenticated: ["GET /user/keys"], + setPrimaryEmailVisibilityForAuthenticated: ["PATCH /user/email/visibility"], + unblock: ["DELETE /user/blocks/{username}"], + unfollow: ["DELETE /user/following/{username}"], + updateAuthenticated: ["PATCH /user"] + } +}; -/***/ 904: -/***/ (function(module) { +const VERSION = "5.3.1"; -"use strict"; +function endpointsToMethods(octokit, endpointsMap) { + const newMethods = {}; -module.exports = (mode, isDir, portable) => { - mode &= 0o7777 + for (const [scope, endpoints] of Object.entries(endpointsMap)) { + for (const [methodName, endpoint] of Object.entries(endpoints)) { + const [route, defaults, decorations] = endpoint; + const [method, url] = route.split(/ /); + const endpointDefaults = Object.assign({ + method, + url + }, defaults); - // in portable mode, use the minimum reasonable umask - // if this system creates files with 0o664 by default - // (as some linux distros do), then we'll write the - // archive with 0o644 instead. Also, don't ever create - // a file that is not readable/writable by the owner. - if (portable) { - mode = (mode | 0o600) &~0o22 - } + if (!newMethods[scope]) { + newMethods[scope] = {}; + } - // if dirs are readable, then they should be listable - if (isDir) { - if (mode & 0o400) - mode |= 0o100 - if (mode & 0o40) - mode |= 0o10 - if (mode & 0o4) - mode |= 0o1 + const scopeMethods = newMethods[scope]; + + if (decorations) { + scopeMethods[methodName] = decorate(octokit, scope, methodName, endpointDefaults, decorations); + continue; + } + + scopeMethods[methodName] = octokit.request.defaults(endpointDefaults); + } } - return mode + + return newMethods; } +function decorate(octokit, scope, methodName, defaults, decorations) { + const requestWithDefaults = octokit.request.defaults(defaults); + /* istanbul ignore next */ -/***/ }), + function withDecorations(...args) { + // @ts-ignore https://github.com/microsoft/TypeScript/issues/25488 + let options = requestWithDefaults.endpoint.merge(...args); // There are currently no other decorations than `.mapToData` -/***/ 916: -/***/ (function(__unusedmodule, exports) { + if (decorations.mapToData) { + options = Object.assign({}, options, { + data: options[decorations.mapToData], + [decorations.mapToData]: undefined + }); + return requestWithDefaults(options); + } + + if (decorations.renamed) { + const [newScope, newMethodName] = decorations.renamed; + octokit.log.warn(`octokit.${scope}.${methodName}() has been renamed to octokit.${newScope}.${newMethodName}()`); + } + + if (decorations.deprecated) { + octokit.log.warn(decorations.deprecated); + } + + if (decorations.renamedParameters) { + // @ts-ignore https://github.com/microsoft/TypeScript/issues/25488 + const options = requestWithDefaults.endpoint.merge(...args); + + for (const [name, alias] of Object.entries(decorations.renamedParameters)) { + if (name in options) { + octokit.log.warn(`"${name}" parameter is deprecated for "octokit.${scope}.${methodName}()". Use "${alias}" instead`); + + if (!(alias in options)) { + options[alias] = options[name]; + } -"use strict"; + delete options[name]; + } + } + return requestWithDefaults(options); + } // @ts-ignore https://github.com/microsoft/TypeScript/issues/25488 -Object.defineProperty(exports, '__esModule', { value: true }); -const VERSION = "1.0.0"; + return requestWithDefaults(...args); + } -/** - * @param octokit Octokit instance - * @param options Options passed to Octokit constructor - */ + return Object.assign(withDecorations, requestWithDefaults); +} -function requestLog(octokit) { - octokit.hook.wrap("request", (request, options) => { - octokit.log.debug("request", options); - const start = Date.now(); - const requestOptions = octokit.request.endpoint.parse(options); - const path = requestOptions.url.replace(options.baseUrl, ""); - return request(options).then(response => { - octokit.log.info(`${requestOptions.method} ${path} - ${response.status} in ${Date.now() - start}ms`); - return response; - }).catch(error => { - octokit.log.info(`${requestOptions.method} ${path} - ${error.status} in ${Date.now() - start}ms`); - throw error; - }); +function restEndpointMethods(octokit) { + const api = endpointsToMethods(octokit, Endpoints); + return { + rest: api + }; +} +restEndpointMethods.VERSION = VERSION; +function legacyRestEndpointMethods(octokit) { + const api = endpointsToMethods(octokit, Endpoints); + return _objectSpread2(_objectSpread2({}, api), {}, { + rest: api }); } -requestLog.VERSION = VERSION; +legacyRestEndpointMethods.VERSION = VERSION; -exports.requestLog = requestLog; +exports.legacyRestEndpointMethods = legacyRestEndpointMethods; +exports.restEndpointMethods = restEndpointMethods; //# sourceMappingURL=index.js.map /***/ }), -/***/ 929: +/***/ 856: /***/ (function(module, __unusedexports, __webpack_require__) { -module.exports = hasNextPage - -const deprecate = __webpack_require__(370) -const getPageLinks = __webpack_require__(13) - -function hasNextPage (link) { - deprecate(`octokit.hasNextPage() – You can use octokit.paginate or async iterators instead: https://github.com/octokit/rest.js#pagination.`) - return getPageLinks(link).next -} +module.exports = __webpack_require__(141); /***/ }), -/***/ 941: -/***/ (function(module, __unusedexports, __webpack_require__) { +/***/ 858: +/***/ (function(__unusedmodule, exports) { "use strict"; -const fs = __webpack_require__(747) -const path = __webpack_require__(622) +// Tar can encode large and negative numbers using a leading byte of +// 0xff for negative, and 0x80 for positive. -/* istanbul ignore next */ -const LCHOWN = fs.lchown ? 'lchown' : 'chown' -/* istanbul ignore next */ -const LCHOWNSYNC = fs.lchownSync ? 'lchownSync' : 'chownSync' +const encode = exports.encode = (num, buf) => { + if (!Number.isSafeInteger(num)) + // The number is so large that javascript cannot represent it with integer + // precision. + throw Error('cannot encode number outside of javascript safe integer range') + else if (num < 0) + encodeNegative(num, buf) + else + encodePositive(num, buf) + return buf +} -/* istanbul ignore next */ -const needEISDIRHandled = fs.lchown && - !process.version.match(/v1[1-9]+\./) && - !process.version.match(/v10\.[6-9]/) +const encodePositive = (num, buf) => { + buf[0] = 0x80 -const lchownSync = (path, uid, gid) => { - try { - return fs[LCHOWNSYNC](path, uid, gid) - } catch (er) { - if (er.code !== 'ENOENT') - throw er + for (var i = buf.length; i > 1; i--) { + buf[i-1] = num & 0xff + num = Math.floor(num / 0x100) } } -/* istanbul ignore next */ -const chownSync = (path, uid, gid) => { - try { - return fs.chownSync(path, uid, gid) - } catch (er) { - if (er.code !== 'ENOENT') - throw er +const encodeNegative = (num, buf) => { + buf[0] = 0xff + var flipped = false + num = num * -1 + for (var i = buf.length; i > 1; i--) { + var byte = num & 0xff + num = Math.floor(num / 0x100) + if (flipped) + buf[i-1] = onesComp(byte) + else if (byte === 0) + buf[i-1] = 0 + else { + flipped = true + buf[i-1] = twosComp(byte) + } } } -/* istanbul ignore next */ -const handleEISDIR = - needEISDIRHandled ? (path, uid, gid, cb) => er => { - // Node prior to v10 had a very questionable implementation of - // fs.lchown, which would always try to call fs.open on a directory - // Fall back to fs.chown in those cases. - if (!er || er.code !== 'EISDIR') - cb(er) - else - fs.chown(path, uid, gid, cb) - } - : (_, __, ___, cb) => cb - -/* istanbul ignore next */ -const handleEISDirSync = - needEISDIRHandled ? (path, uid, gid) => { - try { - return lchownSync(path, uid, gid) - } catch (er) { - if (er.code !== 'EISDIR') - throw er - chownSync(path, uid, gid) - } - } - : (path, uid, gid) => lchownSync(path, uid, gid) +const parse = exports.parse = (buf) => { + var post = buf[buf.length - 1] + var pre = buf[0] + var value; + if (pre === 0x80) + value = pos(buf.slice(1, buf.length)) + else if (pre === 0xff) + value = twos(buf) + else + throw Error('invalid base256 encoding') -// fs.readdir could only accept an options object as of node v6 -const nodeVersion = process.version -let readdir = (path, options, cb) => fs.readdir(path, options, cb) -let readdirSync = (path, options) => fs.readdirSync(path, options) -/* istanbul ignore next */ -if (/^v4\./.test(nodeVersion)) - readdir = (path, options, cb) => fs.readdir(path, cb) + if (!Number.isSafeInteger(value)) + // The number is so large that javascript cannot represent it with integer + // precision. + throw Error('parsed number outside of javascript safe integer range') -const chown = (cpath, uid, gid, cb) => { - fs[LCHOWN](cpath, uid, gid, handleEISDIR(cpath, uid, gid, er => { - // Skip ENOENT error - cb(er && er.code !== 'ENOENT' ? er : null) - })) + return value } -const chownrKid = (p, child, uid, gid, cb) => { - if (typeof child === 'string') - return fs.lstat(path.resolve(p, child), (er, stats) => { - // Skip ENOENT error - if (er) - return cb(er.code !== 'ENOENT' ? er : null) - stats.name = child - chownrKid(p, stats, uid, gid, cb) - }) - - if (child.isDirectory()) { - chownr(path.resolve(p, child.name), uid, gid, er => { - if (er) - return cb(er) - const cpath = path.resolve(p, child.name) - chown(cpath, uid, gid, cb) - }) - } else { - const cpath = path.resolve(p, child.name) - chown(cpath, uid, gid, cb) +const twos = (buf) => { + var len = buf.length + var sum = 0 + var flipped = false + for (var i = len - 1; i > -1; i--) { + var byte = buf[i] + var f + if (flipped) + f = onesComp(byte) + else if (byte === 0) + f = byte + else { + flipped = true + f = twosComp(byte) + } + if (f !== 0) + sum -= f * Math.pow(256, len - i - 1) } + return sum } +const pos = (buf) => { + var len = buf.length + var sum = 0 + for (var i = len - 1; i > -1; i--) { + var byte = buf[i] + if (byte !== 0) + sum += byte * Math.pow(256, len - i - 1) + } + return sum +} -const chownr = (p, uid, gid, cb) => { - readdir(p, { withFileTypes: true }, (er, children) => { - // any error other than ENOTDIR or ENOTSUP means it's not readable, - // or doesn't exist. give up. - if (er) { - if (er.code === 'ENOENT') - return cb() - else if (er.code !== 'ENOTDIR' && er.code !== 'ENOTSUP') - return cb(er) - } - if (er || !children.length) - return chown(p, uid, gid, cb) +const onesComp = byte => (0xff ^ byte) & 0xff - let len = children.length - let errState = null - const then = er => { - if (errState) - return - if (er) - return cb(errState = er) - if (-- len === 0) - return chown(p, uid, gid, cb) - } +const twosComp = byte => ((0xff ^ byte) + 1) & 0xff - children.forEach(child => chownrKid(p, child, uid, gid, then)) - }) -} -const chownrKidSync = (p, child, uid, gid) => { - if (typeof child === 'string') { - try { - const stats = fs.lstatSync(path.resolve(p, child)) - stats.name = child - child = stats - } catch (er) { - if (er.code === 'ENOENT') - return - else - throw er - } - } +/***/ }), - if (child.isDirectory()) - chownrSync(path.resolve(p, child.name), uid, gid) +/***/ 866: +/***/ (function(module) { - handleEISDirSync(path.resolve(p, child.name), uid, gid) -} +module.exports = removeHook; -const chownrSync = (p, uid, gid) => { - let children - try { - children = readdirSync(p, { withFileTypes: true }) - } catch (er) { - if (er.code === 'ENOENT') - return - else if (er.code === 'ENOTDIR' || er.code === 'ENOTSUP') - return handleEISDirSync(p, uid, gid) - else - throw er +function removeHook(state, name, method) { + if (!state.registry[name]) { + return; } - if (children && children.length) - children.forEach(child => chownrKidSync(p, child, uid, gid)) + var index = state.registry[name] + .map(function (registered) { + return registered.orig; + }) + .indexOf(method); + + if (index === -1) { + return; + } - return handleEISDirSync(p, uid, gid) + state.registry[name].splice(index, 1); } -module.exports = chownr -chownr.sync = chownrSync - /***/ }), -/***/ 948: -/***/ (function(module) { +/***/ 885: +/***/ (function(__unusedmodule, exports, __webpack_require__) { "use strict"; -/** - * Tries to execute a function and discards any error that occurs. - * @param {Function} fn - Function that might or might not throw an error. - * @returns {?*} Return-value of the function when no error occurred. - */ -module.exports = function(fn) { +// high-level commands +exports.c = exports.create = __webpack_require__(159) +exports.r = exports.replace = __webpack_require__(630) +exports.t = exports.list = __webpack_require__(381) +exports.u = exports.update = __webpack_require__(966) +exports.x = exports.extract = __webpack_require__(656) - try { return fn() } catch (e) {} +// classes +exports.Pack = __webpack_require__(726) +exports.Unpack = __webpack_require__(63) +exports.Parse = __webpack_require__(203) +exports.ReadEntry = __webpack_require__(662) +exports.WriteEntry = __webpack_require__(303) +exports.Header = __webpack_require__(232) +exports.Pax = __webpack_require__(582) +exports.types = __webpack_require__(554) -} /***/ }), -/***/ 953: -/***/ (function(module, __unusedexports, __webpack_require__) { +/***/ 889: +/***/ (function(__unusedmodule, exports, __webpack_require__) { -// Get the appropriate flag to use for creating files -// We use fmap on Windows platforms for files less than -// 512kb. This is a fairly low limit, but avoids making -// things slower in some cases. Since most of what this -// library is used for is extracting tarballs of many -// relatively small files in npm packages and the like, -// it can be a big boost on Windows platforms. -// Only supported in Node v12.9.0 and above. -const platform = process.env.__FAKE_PLATFORM__ || process.platform -const isWindows = platform === 'win32' -const fs = global.__FAKE_TESTING_FS__ || __webpack_require__(747) +"use strict"; -/* istanbul ignore next */ -const { O_CREAT, O_TRUNC, O_WRONLY, UV_FS_O_FILEMAP = 0 } = fs.constants -const fMapEnabled = isWindows && !!UV_FS_O_FILEMAP -const fMapLimit = 512 * 1024 -const fMapFlag = UV_FS_O_FILEMAP | O_TRUNC | O_CREAT | O_WRONLY -module.exports = !fMapEnabled ? () => 'w' - : size => size < fMapLimit ? fMapFlag : 'w' +Object.defineProperty(exports, '__esModule', { value: true }); + +var core = __webpack_require__(448); +var pluginRequestLog = __webpack_require__(916); +var pluginPaginateRest = __webpack_require__(299); +var pluginRestEndpointMethods = __webpack_require__(842); + +const VERSION = "18.5.6"; + +const Octokit = core.Octokit.plugin(pluginRequestLog.requestLog, pluginRestEndpointMethods.legacyRestEndpointMethods, pluginPaginateRest.paginateRest).defaults({ + userAgent: `octokit-rest.js/${VERSION}` +}); + +exports.Octokit = Octokit; +//# sourceMappingURL=index.js.map /***/ }), -/***/ 954: +/***/ 891: /***/ (function(module) { -module.exports = validateAuth; - -function validateAuth(auth) { - if (typeof auth === "string") { - return; - } +"use strict"; - if (typeof auth === "function") { - return; - } - if (auth.username && auth.password) { - return; - } +// turn tar(1) style args like `C` into the more verbose things like `cwd` - if (auth.clientId && auth.clientSecret) { - return; - } +const argmap = new Map([ + ['C', 'cwd'], + ['f', 'file'], + ['z', 'gzip'], + ['P', 'preservePaths'], + ['U', 'unlink'], + ['strip-components', 'strip'], + ['stripComponents', 'strip'], + ['keep-newer', 'newer'], + ['keepNewer', 'newer'], + ['keep-newer-files', 'newer'], + ['keepNewerFiles', 'newer'], + ['k', 'keep'], + ['keep-existing', 'keep'], + ['keepExisting', 'keep'], + ['m', 'noMtime'], + ['no-mtime', 'noMtime'], + ['p', 'preserveOwner'], + ['L', 'follow'], + ['h', 'follow'] +]) - throw new Error(`Invalid "auth" option: ${JSON.stringify(auth)}`); -} +const parse = module.exports = opt => opt ? Object.keys(opt).map(k => [ + argmap.has(k) ? argmap.get(k) : k, opt[k] +]).reduce((set, kv) => (set[kv[0]] = kv[1], set), Object.create(null)) : {} /***/ }), -/***/ 955: -/***/ (function(module, __unusedexports, __webpack_require__) { +/***/ 898: +/***/ (function(__unusedmodule, exports, __webpack_require__) { "use strict"; -const path = __webpack_require__(622); -const childProcess = __webpack_require__(129); -const crossSpawn = __webpack_require__(20); -const stripEof = __webpack_require__(768); -const npmRunPath = __webpack_require__(621); -const isStream = __webpack_require__(323); -const _getStream = __webpack_require__(145); -const pFinally = __webpack_require__(697); -const onExit = __webpack_require__(260); -const errname = __webpack_require__(427); -const stdio = __webpack_require__(168); - -const TEN_MEGABYTES = 1000 * 1000 * 10; - -function handleArgs(cmd, args, opts) { - let parsed; - - opts = Object.assign({ - extendEnv: true, - env: {} - }, opts); - - if (opts.extendEnv) { - opts.env = Object.assign({}, process.env, opts.env); - } - if (opts.__winShell === true) { - delete opts.__winShell; - parsed = { - command: cmd, - args, - options: opts, - file: cmd, - original: { - cmd, - args - } - }; - } else { - parsed = crossSpawn._parse(cmd, args, opts); - } +Object.defineProperty(exports, '__esModule', { value: true }); - opts = Object.assign({ - maxBuffer: TEN_MEGABYTES, - buffer: true, - stripEof: true, - preferLocal: true, - localDir: parsed.options.cwd || process.cwd(), - encoding: 'utf8', - reject: true, - cleanup: true - }, parsed.options); - - opts.stdio = stdio(opts); - - if (opts.preferLocal) { - opts.env = npmRunPath.env(Object.assign({}, opts, {cwd: opts.localDir})); - } +var request = __webpack_require__(753); +var universalUserAgent = __webpack_require__(526); - if (opts.detached) { - // #115 - opts.cleanup = false; - } +const VERSION = "4.6.2"; - if (process.platform === 'win32' && path.basename(parsed.command) === 'cmd.exe') { - // #116 - parsed.args.unshift('/q'); - } +class GraphqlError extends Error { + constructor(request, response) { + const message = response.data.errors[0].message; + super(message); + Object.assign(this, response.data); + Object.assign(this, { + headers: response.headers + }); + this.name = "GraphqlError"; + this.request = request; // Maintains proper stack trace (only available on V8) - return { - cmd: parsed.command, - args: parsed.args, - opts, - parsed - }; -} + /* istanbul ignore next */ -function handleInput(spawned, input) { - if (input === null || input === undefined) { - return; - } + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + } - if (isStream(input)) { - input.pipe(spawned.stdin); - } else { - spawned.stdin.end(input); - } } -function handleOutput(opts, val) { - if (val && opts.stripEof) { - val = stripEof(val); - } +const NON_VARIABLE_OPTIONS = ["method", "baseUrl", "url", "headers", "request", "query", "mediaType"]; +const FORBIDDEN_VARIABLE_OPTIONS = ["query", "method", "url"]; +const GHES_V3_SUFFIX_REGEX = /\/api\/v3\/?$/; +function graphql(request, query, options) { + if (options) { + if (typeof query === "string" && "query" in options) { + return Promise.reject(new Error(`[@octokit/graphql] "query" cannot be used as variable name`)); + } - return val; -} + for (const key in options) { + if (!FORBIDDEN_VARIABLE_OPTIONS.includes(key)) continue; + return Promise.reject(new Error(`[@octokit/graphql] "${key}" cannot be used as variable name`)); + } + } + + const parsedOptions = typeof query === "string" ? Object.assign({ + query + }, options) : query; + const requestOptions = Object.keys(parsedOptions).reduce((result, key) => { + if (NON_VARIABLE_OPTIONS.includes(key)) { + result[key] = parsedOptions[key]; + return result; + } -function handleShell(fn, cmd, opts) { - let file = '/bin/sh'; - let args = ['-c', cmd]; + if (!result.variables) { + result.variables = {}; + } - opts = Object.assign({}, opts); + result.variables[key] = parsedOptions[key]; + return result; + }, {}); // workaround for GitHub Enterprise baseUrl set with /api/v3 suffix + // https://github.com/octokit/auth-app.js/issues/111#issuecomment-657610451 - if (process.platform === 'win32') { - opts.__winShell = true; - file = process.env.comspec || 'cmd.exe'; - args = ['/s', '/c', `"${cmd}"`]; - opts.windowsVerbatimArguments = true; - } + const baseUrl = parsedOptions.baseUrl || request.endpoint.DEFAULTS.baseUrl; - if (opts.shell) { - file = opts.shell; - delete opts.shell; - } + if (GHES_V3_SUFFIX_REGEX.test(baseUrl)) { + requestOptions.url = baseUrl.replace(GHES_V3_SUFFIX_REGEX, "/api/graphql"); + } - return fn(file, args, opts); -} + return request(requestOptions).then(response => { + if (response.data.errors) { + const headers = {}; -function getStream(process, stream, {encoding, buffer, maxBuffer}) { - if (!process[stream]) { - return null; - } + for (const key of Object.keys(response.headers)) { + headers[key] = response.headers[key]; + } - let ret; + throw new GraphqlError(requestOptions, { + headers, + data: response.data + }); + } - if (!buffer) { - // TODO: Use `ret = util.promisify(stream.finished)(process[stream]);` when targeting Node.js 10 - ret = new Promise((resolve, reject) => { - process[stream] - .once('end', resolve) - .once('error', reject); - }); - } else if (encoding) { - ret = _getStream(process[stream], { - encoding, - maxBuffer - }); - } else { - ret = _getStream.buffer(process[stream], {maxBuffer}); - } + return response.data.data; + }); +} - return ret.catch(err => { - err.stream = stream; - err.message = `${stream} ${err.message}`; - throw err; - }); +function withDefaults(request$1, newDefaults) { + const newRequest = request$1.defaults(newDefaults); + + const newApi = (query, options) => { + return graphql(newRequest, query, options); + }; + + return Object.assign(newApi, { + defaults: withDefaults.bind(null, newRequest), + endpoint: request.request.endpoint + }); } -function makeError(result, options) { - const {stdout, stderr} = result; +const graphql$1 = withDefaults(request.request, { + headers: { + "user-agent": `octokit-graphql.js/${VERSION} ${universalUserAgent.getUserAgent()}` + }, + method: "POST", + url: "/graphql" +}); +function withCustomRequest(customRequest) { + return withDefaults(customRequest, { + method: "POST", + url: "/graphql" + }); +} - let err = result.error; - const {code, signal} = result; +exports.graphql = graphql$1; +exports.withCustomRequest = withCustomRequest; +//# sourceMappingURL=index.js.map - const {parsed, joinedCmd} = options; - const timedOut = options.timedOut || false; - if (!err) { - let output = ''; +/***/ }), - if (Array.isArray(parsed.opts.stdio)) { - if (parsed.opts.stdio[2] !== 'inherit') { - output += output.length > 0 ? stderr : `\n${stderr}`; - } +/***/ 904: +/***/ (function(module) { - if (parsed.opts.stdio[1] !== 'inherit') { - output += `\n${stdout}`; - } - } else if (parsed.opts.stdio !== 'inherit') { - output = `\n${stderr}${stdout}`; - } +"use strict"; - err = new Error(`Command failed: ${joinedCmd}${output}`); - err.code = code < 0 ? errname(code) : code; - } +module.exports = (mode, isDir, portable) => { + mode &= 0o7777 - err.stdout = stdout; - err.stderr = stderr; - err.failed = true; - err.signal = signal || null; - err.cmd = joinedCmd; - err.timedOut = timedOut; + // in portable mode, use the minimum reasonable umask + // if this system creates files with 0o664 by default + // (as some linux distros do), then we'll write the + // archive with 0o644 instead. Also, don't ever create + // a file that is not readable/writable by the owner. + if (portable) { + mode = (mode | 0o600) &~0o22 + } - return err; + // if dirs are readable, then they should be listable + if (isDir) { + if (mode & 0o400) + mode |= 0o100 + if (mode & 0o40) + mode |= 0o10 + if (mode & 0o4) + mode |= 0o1 + } + return mode } -function joinCmd(cmd, args) { - let joinedCmd = cmd; - if (Array.isArray(args) && args.length > 0) { - joinedCmd += ' ' + args.join(' '); - } +/***/ }), + +/***/ 916: +/***/ (function(__unusedmodule, exports) { - return joinedCmd; +"use strict"; + + +Object.defineProperty(exports, '__esModule', { value: true }); + +const VERSION = "1.0.3"; + +/** + * @param octokit Octokit instance + * @param options Options passed to Octokit constructor + */ + +function requestLog(octokit) { + octokit.hook.wrap("request", (request, options) => { + octokit.log.debug("request", options); + const start = Date.now(); + const requestOptions = octokit.request.endpoint.parse(options); + const path = requestOptions.url.replace(options.baseUrl, ""); + return request(options).then(response => { + octokit.log.info(`${requestOptions.method} ${path} - ${response.status} in ${Date.now() - start}ms`); + return response; + }).catch(error => { + octokit.log.info(`${requestOptions.method} ${path} - ${error.status} in ${Date.now() - start}ms`); + throw error; + }); + }); } +requestLog.VERSION = VERSION; -module.exports = (cmd, args, opts) => { - const parsed = handleArgs(cmd, args, opts); - const {encoding, buffer, maxBuffer} = parsed.opts; - const joinedCmd = joinCmd(cmd, args); +exports.requestLog = requestLog; +//# sourceMappingURL=index.js.map - let spawned; - try { - spawned = childProcess.spawn(parsed.cmd, parsed.args, parsed.opts); - } catch (err) { - return Promise.reject(err); - } - let removeExitHandler; - if (parsed.opts.cleanup) { - removeExitHandler = onExit(() => { - spawned.kill(); - }); - } +/***/ }), - let timeoutId = null; - let timedOut = false; +/***/ 941: +/***/ (function(module, __unusedexports, __webpack_require__) { - const cleanup = () => { - if (timeoutId) { - clearTimeout(timeoutId); - timeoutId = null; - } +"use strict"; - if (removeExitHandler) { - removeExitHandler(); - } - }; +const fs = __webpack_require__(747) +const path = __webpack_require__(622) - if (parsed.opts.timeout > 0) { - timeoutId = setTimeout(() => { - timeoutId = null; - timedOut = true; - spawned.kill(parsed.opts.killSignal); - }, parsed.opts.timeout); - } +/* istanbul ignore next */ +const LCHOWN = fs.lchown ? 'lchown' : 'chown' +/* istanbul ignore next */ +const LCHOWNSYNC = fs.lchownSync ? 'lchownSync' : 'chownSync' - const processDone = new Promise(resolve => { - spawned.on('exit', (code, signal) => { - cleanup(); - resolve({code, signal}); - }); +/* istanbul ignore next */ +const needEISDIRHandled = fs.lchown && + !process.version.match(/v1[1-9]+\./) && + !process.version.match(/v10\.[6-9]/) - spawned.on('error', err => { - cleanup(); - resolve({error: err}); - }); +const lchownSync = (path, uid, gid) => { + try { + return fs[LCHOWNSYNC](path, uid, gid) + } catch (er) { + if (er.code !== 'ENOENT') + throw er + } +} - if (spawned.stdin) { - spawned.stdin.on('error', err => { - cleanup(); - resolve({error: err}); - }); - } - }); +/* istanbul ignore next */ +const chownSync = (path, uid, gid) => { + try { + return fs.chownSync(path, uid, gid) + } catch (er) { + if (er.code !== 'ENOENT') + throw er + } +} - function destroy() { - if (spawned.stdout) { - spawned.stdout.destroy(); - } +/* istanbul ignore next */ +const handleEISDIR = + needEISDIRHandled ? (path, uid, gid, cb) => er => { + // Node prior to v10 had a very questionable implementation of + // fs.lchown, which would always try to call fs.open on a directory + // Fall back to fs.chown in those cases. + if (!er || er.code !== 'EISDIR') + cb(er) + else + fs.chown(path, uid, gid, cb) + } + : (_, __, ___, cb) => cb - if (spawned.stderr) { - spawned.stderr.destroy(); - } - } +/* istanbul ignore next */ +const handleEISDirSync = + needEISDIRHandled ? (path, uid, gid) => { + try { + return lchownSync(path, uid, gid) + } catch (er) { + if (er.code !== 'EISDIR') + throw er + chownSync(path, uid, gid) + } + } + : (path, uid, gid) => lchownSync(path, uid, gid) - const handlePromise = () => pFinally(Promise.all([ - processDone, - getStream(spawned, 'stdout', {encoding, buffer, maxBuffer}), - getStream(spawned, 'stderr', {encoding, buffer, maxBuffer}) - ]).then(arr => { - const result = arr[0]; - result.stdout = arr[1]; - result.stderr = arr[2]; - - if (result.error || result.code !== 0 || result.signal !== null) { - const err = makeError(result, { - joinedCmd, - parsed, - timedOut - }); +// fs.readdir could only accept an options object as of node v6 +const nodeVersion = process.version +let readdir = (path, options, cb) => fs.readdir(path, options, cb) +let readdirSync = (path, options) => fs.readdirSync(path, options) +/* istanbul ignore next */ +if (/^v4\./.test(nodeVersion)) + readdir = (path, options, cb) => fs.readdir(path, cb) - // TODO: missing some timeout logic for killed - // https://github.com/nodejs/node/blob/master/lib/child_process.js#L203 - // err.killed = spawned.killed || killed; - err.killed = err.killed || spawned.killed; +const chown = (cpath, uid, gid, cb) => { + fs[LCHOWN](cpath, uid, gid, handleEISDIR(cpath, uid, gid, er => { + // Skip ENOENT error + cb(er && er.code !== 'ENOENT' ? er : null) + })) +} - if (!parsed.opts.reject) { - return err; - } +const chownrKid = (p, child, uid, gid, cb) => { + if (typeof child === 'string') + return fs.lstat(path.resolve(p, child), (er, stats) => { + // Skip ENOENT error + if (er) + return cb(er.code !== 'ENOENT' ? er : null) + stats.name = child + chownrKid(p, stats, uid, gid, cb) + }) - throw err; - } + if (child.isDirectory()) { + chownr(path.resolve(p, child.name), uid, gid, er => { + if (er) + return cb(er) + const cpath = path.resolve(p, child.name) + chown(cpath, uid, gid, cb) + }) + } else { + const cpath = path.resolve(p, child.name) + chown(cpath, uid, gid, cb) + } +} - return { - stdout: handleOutput(parsed.opts, result.stdout), - stderr: handleOutput(parsed.opts, result.stderr), - code: 0, - failed: false, - killed: false, - signal: null, - cmd: joinedCmd, - timedOut: false - }; - }), destroy); - crossSpawn._enoent.hookChildProcess(spawned, parsed.parsed); +const chownr = (p, uid, gid, cb) => { + readdir(p, { withFileTypes: true }, (er, children) => { + // any error other than ENOTDIR or ENOTSUP means it's not readable, + // or doesn't exist. give up. + if (er) { + if (er.code === 'ENOENT') + return cb() + else if (er.code !== 'ENOTDIR' && er.code !== 'ENOTSUP') + return cb(er) + } + if (er || !children.length) + return chown(p, uid, gid, cb) - handleInput(spawned, parsed.opts.input); + let len = children.length + let errState = null + const then = er => { + if (errState) + return + if (er) + return cb(errState = er) + if (-- len === 0) + return chown(p, uid, gid, cb) + } - spawned.then = (onfulfilled, onrejected) => handlePromise().then(onfulfilled, onrejected); - spawned.catch = onrejected => handlePromise().catch(onrejected); + children.forEach(child => chownrKid(p, child, uid, gid, then)) + }) +} - return spawned; -}; +const chownrKidSync = (p, child, uid, gid) => { + if (typeof child === 'string') { + try { + const stats = fs.lstatSync(path.resolve(p, child)) + stats.name = child + child = stats + } catch (er) { + if (er.code === 'ENOENT') + return + else + throw er + } + } -// TODO: set `stderr: 'ignore'` when that option is implemented -module.exports.stdout = (...args) => module.exports(...args).then(x => x.stdout); + if (child.isDirectory()) + chownrSync(path.resolve(p, child.name), uid, gid) -// TODO: set `stdout: 'ignore'` when that option is implemented -module.exports.stderr = (...args) => module.exports(...args).then(x => x.stderr); + handleEISDirSync(path.resolve(p, child.name), uid, gid) +} -module.exports.shell = (cmd, opts) => handleShell(module.exports, cmd, opts); +const chownrSync = (p, uid, gid) => { + let children + try { + children = readdirSync(p, { withFileTypes: true }) + } catch (er) { + if (er.code === 'ENOENT') + return + else if (er.code === 'ENOTDIR' || er.code === 'ENOTSUP') + return handleEISDirSync(p, uid, gid) + else + throw er + } -module.exports.sync = (cmd, args, opts) => { - const parsed = handleArgs(cmd, args, opts); - const joinedCmd = joinCmd(cmd, args); + if (children && children.length) + children.forEach(child => chownrKidSync(p, child, uid, gid)) - if (isStream(parsed.opts.input)) { - throw new TypeError('The `input` option cannot be a stream in sync mode'); - } + return handleEISDirSync(p, uid, gid) +} - const result = childProcess.spawnSync(parsed.cmd, parsed.args, parsed.opts); - result.code = result.status; +module.exports = chownr +chownr.sync = chownrSync - if (result.error || result.status !== 0 || result.signal !== null) { - const err = makeError(result, { - joinedCmd, - parsed - }); - if (!parsed.opts.reject) { - return err; - } +/***/ }), - throw err; - } +/***/ 950: +/***/ (function(__unusedmodule, exports) { - return { - stdout: handleOutput(parsed.opts, result.stdout), - stderr: handleOutput(parsed.opts, result.stderr), - code: 0, - failed: false, - signal: null, - cmd: joinedCmd, - timedOut: false - }; -}; +"use strict"; -module.exports.shellSync = (cmd, opts) => handleShell(module.exports.sync, cmd, opts); +Object.defineProperty(exports, "__esModule", { value: true }); +function getProxyUrl(reqUrl) { + let usingSsl = reqUrl.protocol === 'https:'; + let proxyUrl; + if (checkBypass(reqUrl)) { + return proxyUrl; + } + let proxyVar; + if (usingSsl) { + proxyVar = process.env['https_proxy'] || process.env['HTTPS_PROXY']; + } + else { + proxyVar = process.env['http_proxy'] || process.env['HTTP_PROXY']; + } + if (proxyVar) { + proxyUrl = new URL(proxyVar); + } + return proxyUrl; +} +exports.getProxyUrl = getProxyUrl; +function checkBypass(reqUrl) { + if (!reqUrl.hostname) { + return false; + } + let noProxy = process.env['no_proxy'] || process.env['NO_PROXY'] || ''; + if (!noProxy) { + return false; + } + // Determine the request port + let reqPort; + if (reqUrl.port) { + reqPort = Number(reqUrl.port); + } + else if (reqUrl.protocol === 'http:') { + reqPort = 80; + } + else if (reqUrl.protocol === 'https:') { + reqPort = 443; + } + // Format the request hostname and hostname with port + let upperReqHosts = [reqUrl.hostname.toUpperCase()]; + if (typeof reqPort === 'number') { + upperReqHosts.push(`${upperReqHosts[0]}:${reqPort}`); + } + // Compare request host against noproxy + for (let upperNoProxyItem of noProxy + .split(',') + .map(x => x.trim().toUpperCase()) + .filter(x => x)) { + if (upperReqHosts.some(x => x === upperNoProxyItem)) { + return true; + } + } + return false; +} +exports.checkBypass = checkBypass; /***/ }), -/***/ 958: +/***/ 953: /***/ (function(module, __unusedexports, __webpack_require__) { -module.exports = withDefaults - -const graphql = __webpack_require__(500) +// Get the appropriate flag to use for creating files +// We use fmap on Windows platforms for files less than +// 512kb. This is a fairly low limit, but avoids making +// things slower in some cases. Since most of what this +// library is used for is extracting tarballs of many +// relatively small files in npm packages and the like, +// it can be a big boost on Windows platforms. +// Only supported in Node v12.9.0 and above. +const platform = process.env.__FAKE_PLATFORM__ || process.platform +const isWindows = platform === 'win32' +const fs = global.__FAKE_TESTING_FS__ || __webpack_require__(747) -function withDefaults (request, newDefaults) { - const newRequest = request.defaults(newDefaults) - const newApi = function (query, options) { - return graphql(newRequest, query, options) - } +/* istanbul ignore next */ +const { O_CREAT, O_TRUNC, O_WRONLY, UV_FS_O_FILEMAP = 0 } = fs.constants - newApi.defaults = withDefaults.bind(null, newRequest) - return newApi -} +const fMapEnabled = isWindows && !!UV_FS_O_FILEMAP +const fMapLimit = 512 * 1024 +const fMapFlag = UV_FS_O_FILEMAP | O_TRUNC | O_CREAT | O_WRONLY +module.exports = !fMapEnabled ? () => 'w' + : size => size < fMapLimit ? fMapFlag : 'w' /***/ }), @@ -30701,123 +14015,6 @@ const mtimeFilter = opt => { } -/***/ }), - -/***/ 969: -/***/ (function(module, __unusedexports, __webpack_require__) { - -var wrappy = __webpack_require__(11) -module.exports = wrappy(once) -module.exports.strict = wrappy(onceStrict) - -once.proto = once(function () { - Object.defineProperty(Function.prototype, 'once', { - value: function () { - return once(this) - }, - configurable: true - }) - - Object.defineProperty(Function.prototype, 'onceStrict', { - value: function () { - return onceStrict(this) - }, - configurable: true - }) -}) - -function once (fn) { - var f = function () { - if (f.called) return f.value - f.called = true - return f.value = fn.apply(this, arguments) - } - f.called = false - return f -} - -function onceStrict (fn) { - var f = function () { - if (f.called) - throw new Error(f.onceError) - f.called = true - return f.value = fn.apply(this, arguments) - } - var name = fn.name || 'Function wrapped with `once`' - f.onceError = name + " shouldn't be called more than once" - f.called = false - return f -} - - -/***/ }), - -/***/ 991: -/***/ (function(module, __unusedexports, __webpack_require__) { - -module.exports = authenticationRequestError; - -const { RequestError } = __webpack_require__(463); - -function authenticationRequestError(state, error, options) { - if (!error.headers) throw error; - - const otpRequired = /required/.test(error.headers["x-github-otp"] || ""); - // handle "2FA required" error only - if (error.status !== 401 || !otpRequired) { - throw error; - } - - if ( - error.status === 401 && - otpRequired && - error.request && - error.request.headers["x-github-otp"] - ) { - if (state.otp) { - delete state.otp; // no longer valid, request again - } else { - throw new RequestError( - "Invalid one-time password for two-factor authentication", - 401, - { - headers: error.headers, - request: options - } - ); - } - } - - if (typeof state.auth.on2fa !== "function") { - throw new RequestError( - "2FA required, but options.on2fa is not a function. See https://github.com/octokit/rest.js#authentication", - 401, - { - headers: error.headers, - request: options - } - ); - } - - return Promise.resolve() - .then(() => { - return state.auth.on2fa(); - }) - .then(oneTimePassword => { - const newOptions = Object.assign(options, { - headers: Object.assign(options.headers, { - "x-github-otp": oneTimePassword - }) - }); - return state.octokit.request(newOptions).then(response => { - // If OTP still valid, then persist it for following requests - state.otp = oneTimePassword; - return response; - }); - }); -} - - /***/ }) /******/ }); \ No newline at end of file From eaefbcde88ddc5f324b70929263584fbb2be9eed Mon Sep 17 00:00:00 2001 From: homoluctus Date: Fri, 4 Jun 2021 03:00:29 +0900 Subject: [PATCH 32/46] ci: Unify YAML extension to yaml --- .../workflows/{integration-test.yml => integration-test.yaml} | 2 +- .github/workflows/{unit-test.yml => unit-test.yaml} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename .github/workflows/{integration-test.yml => integration-test.yaml} (98%) rename .github/workflows/{unit-test.yml => unit-test.yaml} (100%) diff --git a/.github/workflows/integration-test.yml b/.github/workflows/integration-test.yaml similarity index 98% rename from .github/workflows/integration-test.yml rename to .github/workflows/integration-test.yaml index f5674a4..ff91d4f 100644 --- a/.github/workflows/integration-test.yml +++ b/.github/workflows/integration-test.yaml @@ -3,7 +3,7 @@ name: Integration Test on: pull_request: paths: - - "dist" + - "dist/**" env: IMAGE_NAME: knqyf263/vuln-image diff --git a/.github/workflows/unit-test.yml b/.github/workflows/unit-test.yaml similarity index 100% rename from .github/workflows/unit-test.yml rename to .github/workflows/unit-test.yaml From dd5695a71869465fcea33ecc78ffb93cd325df37 Mon Sep 17 00:00:00 2001 From: homoluctus Date: Fri, 4 Jun 2021 03:37:11 +0900 Subject: [PATCH 33/46] refactor: Separate the process of input parameters --- __tests__/trivy.test.ts | 30 ++---------- src/index.ts | 41 ++++------------ src/inputs.ts | 100 ++++++++++++++++++++++++++++++++++++++++ src/interface.ts | 14 ++++-- src/trivy.ts | 42 +---------------- 5 files changed, 125 insertions(+), 102 deletions(-) create mode 100644 src/inputs.ts diff --git a/__tests__/trivy.test.ts b/__tests__/trivy.test.ts index d482725..386643c 100644 --- a/__tests__/trivy.test.ts +++ b/__tests__/trivy.test.ts @@ -1,7 +1,7 @@ import * as path from 'path'; import { Downloader } from '../src/downloader'; import { scan } from '../src/trivy'; -import { TrivyOption } from '../src/interface'; +import { TrivyCmdOption } from '../src/interface'; import { removeTrivyCmd } from './helper'; const downloader = new Downloader(); @@ -22,7 +22,7 @@ describe('Trivy scan', () => { }); test('with valid option', () => { - const option: TrivyOption = { + const option: TrivyCmdOption = { severity: 'HIGH,CRITICAL', vulnType: 'os,library', ignoreUnfixed: true, @@ -33,7 +33,7 @@ describe('Trivy scan', () => { }); test('without ignoreUnfixed', () => { - const option: TrivyOption = { + const option: TrivyCmdOption = { severity: 'HIGH,CRITICAL', vulnType: 'os,library', ignoreUnfixed: false, @@ -42,28 +42,4 @@ describe('Trivy scan', () => { const result: string = scan(trivyPath, image, option) as string; expect(result.length).toBeGreaterThanOrEqual(1); }); - - test('with invalid severity', () => { - const invalidOption: TrivyOption = { - severity: 'INVALID', - vulnType: 'os,library', - ignoreUnfixed: true, - template - }; - expect(() => { - scan(trivyPath, image, invalidOption); - }).toThrowError('Trivy option error: INVALID is unknown severity'); - }); - - test('with invalid vulnType', () => { - const invalidOption: TrivyOption = { - severity: 'HIGH', - vulnType: 'INVALID', - ignoreUnfixed: true, - template - }; - expect(() => { - scan(trivyPath, image, invalidOption); - }).toThrowError('Trivy option error: INVALID is unknown vuln-type'); - }); }); diff --git a/src/index.ts b/src/index.ts index ad372a9..9e349d9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,52 +1,29 @@ import * as core from '@actions/core'; import { Downloader } from './downloader'; import { GitHub } from './github'; +import { Inputs } from './inputs'; import { scan } from './trivy'; -import { TrivyOption } from './interface'; async function run(): Promise { - const trivyVersion = core.getInput('trivy_version').replace(/^v/, ''); - const image = core.getInput('image') || process.env.IMAGE_NAME; - - if (!image) { - throw new Error('Please specify scan target image name'); - } - - const trivyOption: TrivyOption = { - severity: core.getInput('severity').replace(/\s+/g, ''), - vulnType: core.getInput('vuln_type').replace(/\s+/g, ''), - ignoreUnfixed: core.getInput('ignore_unfixed').toLowerCase() === 'true', - template: core.getInput('template') || `${__dirname}/template/default.tpl`, - }; + const inputs = new Inputs(); + inputs.validate(); const downloader = new Downloader(); - const trivyCmdPath = await downloader.download(trivyVersion); - const result = scan(trivyCmdPath, image, trivyOption); + const trivyCmdPath = await downloader.download(inputs.trivy.version); + const result = scan(trivyCmdPath, inputs.image, inputs.trivy.option); if (!result) { return; } - const issueOption = { - title: core.getInput('issue_title'), - body: result, - labels: core - .getInput('issue_label') - .replace(/\s+/g, '') - .split(','), - assignees: core - .getInput('issue_assignee') - .replace(/\s+/g, '') - .split(','), - }; - const token = core.getInput('token', { required: true }); - const github = new GitHub(token); - const output = await github.createOrUpdateIssue(image, issueOption); + const github = new GitHub(inputs.token); + const issueOption = { body: result, ...inputs.issue }; + const output = await github.createOrUpdateIssue(inputs.image, issueOption); core.setOutput('html_url', output.htmlUrl); core.setOutput('issue_number', output.issueNumber.toString()); - if (core.getInput('fail_on_vulnerabilities') === 'true') { + if (inputs.fail_on_vulnerabilities) { throw new Error('Abnormal termination because vulnerabilities found'); } } diff --git a/src/inputs.ts b/src/inputs.ts new file mode 100644 index 0000000..7b889ba --- /dev/null +++ b/src/inputs.ts @@ -0,0 +1,100 @@ +import * as core from '@actions/core'; +import { TrivyInputs, TrivyCmdOption, IssueInputs } from './interface'; + +export class Inputs { + token: string; + image: string; + trivy: TrivyInputs; + issue: IssueInputs; + fail_on_vulnerabilities: boolean; + + constructor() { + this.token = core.getInput('token', { required: true }); + + const image = core.getInput('image') || process.env.IMAGE_NAME; + if (!image) { + throw new Error('Please specify target image'); + } + this.image = image; + + this.trivy = { + version: core.getInput('trivy_version').replace(/^v/, ''), + option: { + severity: core.getInput('severity').replace(/\s+/g, ''), + vulnType: core.getInput('vuln_type').replace(/\s+/g, ''), + ignoreUnfixed: core.getInput('ignore_unfixed').toLowerCase() === 'true', + template: + core.getInput('template') || `${__dirname}/template/default.tpl` + } + }; + + this.issue = { + title: core.getInput('issue_title'), + labels: core + .getInput('issue_label') + .replace(/\s+/g, '') + .split(','), + assignees: core + .getInput('issue_assignee') + .replace(/\s+/g, '') + .split(',') + }; + + this.fail_on_vulnerabilities = + core.getInput('fail_on_vulnerabilities') === 'true'; + } + + validate(): void { + const trivy = new TrivyCmdOptionValidator(this.trivy.option); + trivy.validate(); + } +} + +class TrivyCmdOptionValidator { + option: TrivyCmdOption; + + constructor(option: TrivyCmdOption) { + this.option = option; + } + + validate(): void { + this.validateSeverity(); + this.validateVulnType(); + } + + private validateSeverity(): boolean { + const severities = this.option.severity.split(','); + const allowedSeverities = /UNKNOWN|LOW|MEDIUM|HIGH|CRITICAL/; + if (!this.validateArrayOption(allowedSeverities, severities)) { + throw new Error( + `Trivy option error: ${severities.join(',')} is unknown severity. + Trivy supports UNKNOWN, LOW, MEDIUM, HIGH and CRITICAL.` + ); + } + return true; + } + + private validateVulnType(): boolean { + const vulnTypes = this.option.vulnType.split(','); + const allowedVulnTypes = /os|library/; + if (!this.validateArrayOption(allowedVulnTypes, vulnTypes)) { + throw new Error( + `Trivy option error: ${vulnTypes.join(',')} is unknown vuln-type. + Trivy supports os and library.` + ); + } + return true; + } + + private validateArrayOption( + allowedValue: RegExp, + options: string[] + ): boolean { + for (const option of options) { + if (!allowedValue.test(option)) { + return false; + } + } + return true; + } +} diff --git a/src/interface.ts b/src/interface.ts index 86c359b..f88eea6 100644 --- a/src/interface.ts +++ b/src/interface.ts @@ -1,16 +1,24 @@ -export interface IssueOption { +export interface IssueInputs { title: string; - body: string; labels?: string[]; assignees?: string[]; } +export interface IssueOption extends IssueInputs { + body: string; +} + export interface IssueResponse { issueNumber: number; htmlUrl: string; } -export interface TrivyOption { +export interface TrivyInputs { + version: string; + option: TrivyCmdOption; +} + +export interface TrivyCmdOption { severity: string; vulnType: string; ignoreUnfixed: boolean; diff --git a/src/trivy.ts b/src/trivy.ts index 389b72e..d37b02c 100644 --- a/src/trivy.ts +++ b/src/trivy.ts @@ -1,14 +1,12 @@ import { spawnSync } from 'child_process'; import * as core from '@actions/core'; -import { TrivyOption } from './interface'; +import { TrivyCmdOption } from './interface'; export function scan( trivyPath: string, image: string, - option: TrivyOption + option: TrivyCmdOption ): string | undefined { - validateOption(option); - const args = [ '--severity', option.severity, @@ -44,39 +42,3 @@ export function scan( stderr: ${result.stderr}`); } } - -function validateOption(option: TrivyOption): void { - validateSeverity(option.severity.split(',')); - validateVulnType(option.vulnType.split(',')); -} - -function validateSeverity(severities: string[]): boolean { - const allowedSeverities = /UNKNOWN|LOW|MEDIUM|HIGH|CRITICAL/; - if (!validateArrayOption(allowedSeverities, severities)) { - throw new Error( - `Trivy option error: ${severities.join(',')} is unknown severity. - Trivy supports UNKNOWN, LOW, MEDIUM, HIGH and CRITICAL.` - ); - } - return true; -} - -function validateVulnType(vulnTypes: string[]): boolean { - const allowedVulnTypes = /os|library/; - if (!validateArrayOption(allowedVulnTypes, vulnTypes)) { - throw new Error( - `Trivy option error: ${vulnTypes.join(',')} is unknown vuln-type. - Trivy supports os and library.` - ); - } - return true; -} - -function validateArrayOption(allowedValue: RegExp, options: string[]): boolean { - for (const option of options) { - if (!allowedValue.test(option)) { - return false; - } - } - return true; -} From cd7e033066efd1667c3ddc2eae3b28265eff96bd Mon Sep 17 00:00:00 2001 From: homoluctus Date: Fri, 4 Jun 2021 03:40:37 +0900 Subject: [PATCH 34/46] refactor: Use Validator interface for validator classes --- src/inputs.ts | 9 +++++++-- src/interface.ts | 4 ++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/inputs.ts b/src/inputs.ts index 7b889ba..051cb85 100644 --- a/src/inputs.ts +++ b/src/inputs.ts @@ -1,5 +1,10 @@ import * as core from '@actions/core'; -import { TrivyInputs, TrivyCmdOption, IssueInputs } from './interface'; +import { + IssueInputs, + TrivyInputs, + TrivyCmdOption, + Validator +} from './interface'; export class Inputs { token: string; @@ -50,7 +55,7 @@ export class Inputs { } } -class TrivyCmdOptionValidator { +class TrivyCmdOptionValidator implements Validator { option: TrivyCmdOption; constructor(option: TrivyCmdOption) { diff --git a/src/interface.ts b/src/interface.ts index f88eea6..e399202 100644 --- a/src/interface.ts +++ b/src/interface.ts @@ -1,3 +1,7 @@ +export interface Validator { + validate(): void; +} + export interface IssueInputs { title: string; labels?: string[]; From 649dc511b5e9602e36908d1d2f97dc57772f60c1 Mon Sep 17 00:00:00 2001 From: homoluctus Date: Fri, 4 Jun 2021 04:11:34 +0900 Subject: [PATCH 35/46] feat: Add validate function for template parameter --- src/inputs.ts | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/inputs.ts b/src/inputs.ts index 051cb85..fc64244 100644 --- a/src/inputs.ts +++ b/src/inputs.ts @@ -1,3 +1,4 @@ +import * as fs from 'fs'; import * as core from '@actions/core'; import { IssueInputs, @@ -65,9 +66,10 @@ class TrivyCmdOptionValidator implements Validator { validate(): void { this.validateSeverity(); this.validateVulnType(); + this.validateTemplate(); } - private validateSeverity(): boolean { + private validateSeverity(): void { const severities = this.option.severity.split(','); const allowedSeverities = /UNKNOWN|LOW|MEDIUM|HIGH|CRITICAL/; if (!this.validateArrayOption(allowedSeverities, severities)) { @@ -76,10 +78,9 @@ class TrivyCmdOptionValidator implements Validator { Trivy supports UNKNOWN, LOW, MEDIUM, HIGH and CRITICAL.` ); } - return true; } - private validateVulnType(): boolean { + private validateVulnType(): void { const vulnTypes = this.option.vulnType.split(','); const allowedVulnTypes = /os|library/; if (!this.validateArrayOption(allowedVulnTypes, vulnTypes)) { @@ -88,7 +89,6 @@ class TrivyCmdOptionValidator implements Validator { Trivy supports os and library.` ); } - return true; } private validateArrayOption( @@ -102,4 +102,18 @@ class TrivyCmdOptionValidator implements Validator { } return true; } + + private validateTemplate(): void { + const template = this.option.template; + + const exists = fs.existsSync(template); + if (!exists) { + throw new Error(`Could not find ${template}`); + } + + const isFile = fs.statSync(template).isFile(); + if (!isFile) { + throw new Error(`${template} is not a file`); + } + } } From a09f0f71a0bf8978a049810ab156166a64c85220 Mon Sep 17 00:00:00 2001 From: homoluctus Date: Fri, 4 Jun 2021 04:11:51 +0900 Subject: [PATCH 36/46] test: Add a test for inputs.ts --- __tests__/inputs.test.ts | 59 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 __tests__/inputs.test.ts diff --git a/__tests__/inputs.test.ts b/__tests__/inputs.test.ts new file mode 100644 index 0000000..ce231ba --- /dev/null +++ b/__tests__/inputs.test.ts @@ -0,0 +1,59 @@ +import * as path from 'path'; +import { Inputs } from '../src/inputs'; + +describe('Inputs class Test', () => { + const initEnv = process.env; + const template = path.join(__dirname, '../src/template/default.tpl'); + + beforeEach(() => { + process.env = { + INPUT_TOKEN: 'xxxxx', + INPUT_IMAGE: 'yyyyy', + ...initEnv + }; + }); + + test('Specify required parameters only', () => { + expect(() => new Inputs()).not.toThrow(); + }); + + test('Specify all parameter', () => { + process.env = { + INPUT_TOKEN: 'xxx', + INPUT_IMAGE: 'yyy', + INPUT_TRIVY_VERSION: '0.18.3', + INPUT_SEVERITY: 'HIGH', + INPUT_VULN_TYPE: 'os', + INPUT_IGNORE_UNFIXED: 'true', + INPUT_TEMPLATE: template, + INPUT_ISSUE_TITLE: 'hello', + INPUT_ISSUE_LABEL: 'world', + INPUT_ISSUE_ASSIGNEE: 'aaaa', + ...initEnv + }; + const inputs = new Inputs(); + expect(() => inputs.validate()).not.toThrow(); + }); + + test('Invalid severity', () => { + process.env['INPUT_SEVERITY'] = '?'; + const inputs = new Inputs(); + expect(() => inputs.validate()).toThrow( + 'Trivy option error: ? is unknown severity.' + ); + }); + + test('Invalid vuln_type', () => { + process.env['INPUT_VULN_TYPE'] = '?'; + const inputs = new Inputs(); + expect(() => inputs.validate()).toThrow( + 'Trivy option error: ? is unknown vuln-type' + ); + }); + + test('Invalid template', () => { + process.env['INPUT_TEMPLATE'] = '?'; + const inputs = new Inputs(); + expect(() => inputs.validate()).toThrow('Could not find ?'); + }); +}); From 133cc553335c3c548fef59b13321add53e4d5c45 Mon Sep 17 00:00:00 2001 From: homoluctus Date: Fri, 4 Jun 2021 04:17:28 +0900 Subject: [PATCH 37/46] refactor: Separate inputs and validator in two files --- src/inputs.ts | 71 ++---------------------------------------------- src/validator.ts | 64 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+), 69 deletions(-) create mode 100644 src/validator.ts diff --git a/src/inputs.ts b/src/inputs.ts index fc64244..c1226f8 100644 --- a/src/inputs.ts +++ b/src/inputs.ts @@ -1,11 +1,6 @@ -import * as fs from 'fs'; import * as core from '@actions/core'; -import { - IssueInputs, - TrivyInputs, - TrivyCmdOption, - Validator -} from './interface'; +import { IssueInputs, TrivyInputs } from './interface'; +import { TrivyCmdOptionValidator } from './validator'; export class Inputs { token: string; @@ -55,65 +50,3 @@ export class Inputs { trivy.validate(); } } - -class TrivyCmdOptionValidator implements Validator { - option: TrivyCmdOption; - - constructor(option: TrivyCmdOption) { - this.option = option; - } - - validate(): void { - this.validateSeverity(); - this.validateVulnType(); - this.validateTemplate(); - } - - private validateSeverity(): void { - const severities = this.option.severity.split(','); - const allowedSeverities = /UNKNOWN|LOW|MEDIUM|HIGH|CRITICAL/; - if (!this.validateArrayOption(allowedSeverities, severities)) { - throw new Error( - `Trivy option error: ${severities.join(',')} is unknown severity. - Trivy supports UNKNOWN, LOW, MEDIUM, HIGH and CRITICAL.` - ); - } - } - - private validateVulnType(): void { - const vulnTypes = this.option.vulnType.split(','); - const allowedVulnTypes = /os|library/; - if (!this.validateArrayOption(allowedVulnTypes, vulnTypes)) { - throw new Error( - `Trivy option error: ${vulnTypes.join(',')} is unknown vuln-type. - Trivy supports os and library.` - ); - } - } - - private validateArrayOption( - allowedValue: RegExp, - options: string[] - ): boolean { - for (const option of options) { - if (!allowedValue.test(option)) { - return false; - } - } - return true; - } - - private validateTemplate(): void { - const template = this.option.template; - - const exists = fs.existsSync(template); - if (!exists) { - throw new Error(`Could not find ${template}`); - } - - const isFile = fs.statSync(template).isFile(); - if (!isFile) { - throw new Error(`${template} is not a file`); - } - } -} diff --git a/src/validator.ts b/src/validator.ts new file mode 100644 index 0000000..a170b32 --- /dev/null +++ b/src/validator.ts @@ -0,0 +1,64 @@ +import * as fs from 'fs'; +import { TrivyCmdOption, Validator } from './interface'; + +export class TrivyCmdOptionValidator implements Validator { + option: TrivyCmdOption; + + constructor(option: TrivyCmdOption) { + this.option = option; + } + + validate(): void { + this.validateSeverity(); + this.validateVulnType(); + this.validateTemplate(); + } + + private validateSeverity(): void { + const severities = this.option.severity.split(','); + const allowedSeverities = /UNKNOWN|LOW|MEDIUM|HIGH|CRITICAL/; + if (!this.validateArrayOption(allowedSeverities, severities)) { + throw new Error( + `Trivy option error: ${severities.join(',')} is unknown severity. + Trivy supports UNKNOWN, LOW, MEDIUM, HIGH and CRITICAL.` + ); + } + } + + private validateVulnType(): void { + const vulnTypes = this.option.vulnType.split(','); + const allowedVulnTypes = /os|library/; + if (!this.validateArrayOption(allowedVulnTypes, vulnTypes)) { + throw new Error( + `Trivy option error: ${vulnTypes.join(',')} is unknown vuln-type. + Trivy supports os and library.` + ); + } + } + + private validateArrayOption( + allowedValue: RegExp, + options: string[] + ): boolean { + for (const option of options) { + if (!allowedValue.test(option)) { + return false; + } + } + return true; + } + + private validateTemplate(): void { + const template = this.option.template; + + const exists = fs.existsSync(template); + if (!exists) { + throw new Error(`Could not find ${template}`); + } + + const isFile = fs.statSync(template).isFile(); + if (!isFile) { + throw new Error(`${template} is not a file`); + } + } +} From f95014a412ba9329027448f4e8e2e6efa3ccf12d Mon Sep 17 00:00:00 2001 From: homoluctus Date: Fri, 4 Jun 2021 04:24:47 +0900 Subject: [PATCH 38/46] test: Add a test for validator --- __tests__/helper.ts | 3 +++ __tests__/inputs.test.ts | 25 +------------------ __tests__/validator.test.ts | 48 +++++++++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+), 24 deletions(-) create mode 100644 __tests__/validator.test.ts diff --git a/__tests__/helper.ts b/__tests__/helper.ts index 89061f2..80c5b45 100644 --- a/__tests__/helper.ts +++ b/__tests__/helper.ts @@ -1,6 +1,9 @@ import * as fs from 'fs'; +import * as path from 'path'; import { Downloader } from '../src/downloader'; +export const template = path.join(__dirname, '../src/template/default.tpl'); + const downloader = new Downloader(); export function removeTrivyCmd(path: string) { diff --git a/__tests__/inputs.test.ts b/__tests__/inputs.test.ts index ce231ba..56cbb5a 100644 --- a/__tests__/inputs.test.ts +++ b/__tests__/inputs.test.ts @@ -1,9 +1,8 @@ -import * as path from 'path'; import { Inputs } from '../src/inputs'; +import { template } from './helper'; describe('Inputs class Test', () => { const initEnv = process.env; - const template = path.join(__dirname, '../src/template/default.tpl'); beforeEach(() => { process.env = { @@ -34,26 +33,4 @@ describe('Inputs class Test', () => { const inputs = new Inputs(); expect(() => inputs.validate()).not.toThrow(); }); - - test('Invalid severity', () => { - process.env['INPUT_SEVERITY'] = '?'; - const inputs = new Inputs(); - expect(() => inputs.validate()).toThrow( - 'Trivy option error: ? is unknown severity.' - ); - }); - - test('Invalid vuln_type', () => { - process.env['INPUT_VULN_TYPE'] = '?'; - const inputs = new Inputs(); - expect(() => inputs.validate()).toThrow( - 'Trivy option error: ? is unknown vuln-type' - ); - }); - - test('Invalid template', () => { - process.env['INPUT_TEMPLATE'] = '?'; - const inputs = new Inputs(); - expect(() => inputs.validate()).toThrow('Could not find ?'); - }); }); diff --git a/__tests__/validator.test.ts b/__tests__/validator.test.ts new file mode 100644 index 0000000..16750c2 --- /dev/null +++ b/__tests__/validator.test.ts @@ -0,0 +1,48 @@ +import { TrivyCmdOptionValidator } from '../src/validator'; +import { template } from './helper'; + +describe('TrivyCmdOptionValidator Test', () => { + test('Correct option', () => { + const validator = new TrivyCmdOptionValidator({ + severity: 'HIGH', + vulnType: 'os', + ignoreUnfixed: false, + template + }); + expect(() => validator.validate()).not.toThrow(); + }); + + test('Invalid severity', () => { + const validator = new TrivyCmdOptionValidator({ + severity: '?', + vulnType: 'os', + ignoreUnfixed: false, + template + }); + expect(() => validator.validate()).toThrow( + 'Trivy option error: ? is unknown severity' + ); + }); + + test('Invalid vuln_type', () => { + const validator = new TrivyCmdOptionValidator({ + severity: 'HIGH', + vulnType: '?', + ignoreUnfixed: false, + template + }); + expect(() => validator.validate()).toThrow( + 'Trivy option error: ? is unknown vuln-type' + ); + }); + + test('Invalid template', () => { + const validator = new TrivyCmdOptionValidator({ + severity: 'HIGH', + vulnType: 'os', + ignoreUnfixed: false, + template: '?' + }); + expect(() => validator.validate()).toThrow('Could not find ?'); + }); +}); From 276493cb31ebd416154d44df1ed258878295c83c Mon Sep 17 00:00:00 2001 From: homoluctus Date: Thu, 3 Jun 2021 19:27:25 +0000 Subject: [PATCH 39/46] build: Transpile --- dist/index.js | 213 ++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 155 insertions(+), 58 deletions(-) diff --git a/dist/index.js b/dist/index.js index dec3c7f..c22a56f 100644 --- a/dist/index.js +++ b/dist/index.js @@ -3634,44 +3634,24 @@ Object.defineProperty(exports, "__esModule", { value: true }); const core = __importStar(__webpack_require__(470)); const downloader_1 = __webpack_require__(379); const github_1 = __webpack_require__(146); +const inputs_1 = __webpack_require__(679); const trivy_1 = __webpack_require__(737); function run() { return __awaiter(this, void 0, void 0, function* () { - const trivyVersion = core.getInput('trivy_version').replace(/^v/, ''); - const image = core.getInput('image') || process.env.IMAGE_NAME; - if (!image) { - throw new Error('Please specify scan target image name'); - } - const trivyOption = { - severity: core.getInput('severity').replace(/\s+/g, ''), - vulnType: core.getInput('vuln_type').replace(/\s+/g, ''), - ignoreUnfixed: core.getInput('ignore_unfixed').toLowerCase() === 'true', - template: core.getInput('template') || __webpack_require__.ab + "default.tpl", - }; + const inputs = new inputs_1.Inputs(); + inputs.validate(); const downloader = new downloader_1.Downloader(); - const trivyCmdPath = yield downloader.download(trivyVersion); - const result = trivy_1.scan(trivyCmdPath, image, trivyOption); + const trivyCmdPath = yield downloader.download(inputs.trivy.version); + const result = trivy_1.scan(trivyCmdPath, inputs.image, inputs.trivy.option); if (!result) { return; } - const issueOption = { - title: core.getInput('issue_title'), - body: result, - labels: core - .getInput('issue_label') - .replace(/\s+/g, '') - .split(','), - assignees: core - .getInput('issue_assignee') - .replace(/\s+/g, '') - .split(','), - }; - const token = core.getInput('token', { required: true }); - const github = new github_1.GitHub(token); - const output = yield github.createOrUpdateIssue(image, issueOption); + const github = new github_1.GitHub(inputs.token); + const issueOption = Object.assign({ body: result }, inputs.issue); + const output = yield github.createOrUpdateIssue(inputs.image, issueOption); core.setOutput('html_url', output.htmlUrl); core.setOutput('issue_number', output.issueNumber.toString()); - if (core.getInput('fail_on_vulnerabilities') === 'true') { + if (inputs.fail_on_vulnerabilities) { throw new Error('Abnormal termination because vulnerabilities found'); } }); @@ -4379,6 +4359,83 @@ module.exports = function (Yallist) { } +/***/ }), + +/***/ 409: +/***/ (function(__unusedmodule, exports, __webpack_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.TrivyCmdOptionValidator = void 0; +const fs = __importStar(__webpack_require__(747)); +class TrivyCmdOptionValidator { + constructor(option) { + this.option = option; + } + validate() { + this.validateSeverity(); + this.validateVulnType(); + this.validateTemplate(); + } + validateSeverity() { + const severities = this.option.severity.split(','); + const allowedSeverities = /UNKNOWN|LOW|MEDIUM|HIGH|CRITICAL/; + if (!this.validateArrayOption(allowedSeverities, severities)) { + throw new Error(`Trivy option error: ${severities.join(',')} is unknown severity. + Trivy supports UNKNOWN, LOW, MEDIUM, HIGH and CRITICAL.`); + } + } + validateVulnType() { + const vulnTypes = this.option.vulnType.split(','); + const allowedVulnTypes = /os|library/; + if (!this.validateArrayOption(allowedVulnTypes, vulnTypes)) { + throw new Error(`Trivy option error: ${vulnTypes.join(',')} is unknown vuln-type. + Trivy supports os and library.`); + } + } + validateArrayOption(allowedValue, options) { + for (const option of options) { + if (!allowedValue.test(option)) { + return false; + } + } + return true; + } + validateTemplate() { + const template = this.option.template; + const exists = fs.existsSync(template); + if (!exists) { + throw new Error(`Could not find ${template}`); + } + const isFile = fs.statSync(template).isFile(); + if (!isFile) { + throw new Error(`${template} is not a file`); + } + } +} +exports.TrivyCmdOptionValidator = TrivyCmdOptionValidator; + + /***/ }), /***/ 413: @@ -10188,6 +10245,75 @@ module.exports = class ReadEntry extends MiniPass { module.exports = require("util"); +/***/ }), + +/***/ 679: +/***/ (function(__unusedmodule, exports, __webpack_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Inputs = void 0; +const core = __importStar(__webpack_require__(470)); +const validator_1 = __webpack_require__(409); +class Inputs { + constructor() { + this.token = core.getInput('token', { required: true }); + const image = core.getInput('image') || process.env.IMAGE_NAME; + if (!image) { + throw new Error('Please specify target image'); + } + this.image = image; + this.trivy = { + version: core.getInput('trivy_version').replace(/^v/, ''), + option: { + severity: core.getInput('severity').replace(/\s+/g, ''), + vulnType: core.getInput('vuln_type').replace(/\s+/g, ''), + ignoreUnfixed: core.getInput('ignore_unfixed').toLowerCase() === 'true', + template: core.getInput('template') || __webpack_require__.ab + "default.tpl" + } + }; + this.issue = { + title: core.getInput('issue_title'), + labels: core + .getInput('issue_label') + .replace(/\s+/g, '') + .split(','), + assignees: core + .getInput('issue_assignee') + .replace(/\s+/g, '') + .split(',') + }; + this.fail_on_vulnerabilities = + core.getInput('fail_on_vulnerabilities') === 'true'; + } + validate() { + const trivy = new validator_1.TrivyCmdOptionValidator(this.trivy.option); + trivy.validate(); + } +} +exports.Inputs = Inputs; + + /***/ }), /***/ 692: @@ -11257,7 +11383,6 @@ exports.scan = void 0; const child_process_1 = __webpack_require__(129); const core = __importStar(__webpack_require__(470)); function scan(trivyPath, image, option) { - validateOption(option); const args = [ '--severity', option.severity, @@ -11293,34 +11418,6 @@ function scan(trivyPath, image, option) { } } exports.scan = scan; -function validateOption(option) { - validateSeverity(option.severity.split(',')); - validateVulnType(option.vulnType.split(',')); -} -function validateSeverity(severities) { - const allowedSeverities = /UNKNOWN|LOW|MEDIUM|HIGH|CRITICAL/; - if (!validateArrayOption(allowedSeverities, severities)) { - throw new Error(`Trivy option error: ${severities.join(',')} is unknown severity. - Trivy supports UNKNOWN, LOW, MEDIUM, HIGH and CRITICAL.`); - } - return true; -} -function validateVulnType(vulnTypes) { - const allowedVulnTypes = /os|library/; - if (!validateArrayOption(allowedVulnTypes, vulnTypes)) { - throw new Error(`Trivy option error: ${vulnTypes.join(',')} is unknown vuln-type. - Trivy supports os and library.`); - } - return true; -} -function validateArrayOption(allowedValue, options) { - for (const option of options) { - if (!allowedValue.test(option)) { - return false; - } - } - return true; -} /***/ }), From 3279ae996f81ec47a6cdabfe3f13dedf3db05d9a Mon Sep 17 00:00:00 2001 From: homoluctus Date: Fri, 4 Jun 2021 05:39:57 +0900 Subject: [PATCH 40/46] ci: Add workflow_dispatch to integration test as trigger --- .github/workflows/integration-test.yaml | 36 +++---------------------- README.md | 4 +-- 2 files changed, 6 insertions(+), 34 deletions(-) diff --git a/.github/workflows/integration-test.yaml b/.github/workflows/integration-test.yaml index ff91d4f..f6ff03e 100644 --- a/.github/workflows/integration-test.yaml +++ b/.github/workflows/integration-test.yaml @@ -3,14 +3,15 @@ name: Integration Test on: pull_request: paths: - - "dist/**" + - 'dist/**' + workflow_dispatch: env: IMAGE_NAME: knqyf263/vuln-image jobs: - test1: - name: Test parameters + test: + name: Integration Test runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 @@ -25,32 +26,3 @@ jobs: issue_label: trivy,vulnerability,test issue_title: Security Alert Test issue_assignee: homoluctus - - test2: - name: Getting image name from enviroment variable - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - - name: Pull docker image - run: docker pull ${{ env.IMAGE_NAME }} - - - uses: ./ - with: - token: ${{ secrets.GITHUB_TOKEN }} - issue_label: trivy,vulnerability,test - issue_title: Security Alert Test - issue_assignee: homoluctus - - test3: - name: Not create issue - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - - name: Pull docker image - run: docker pull ${{ env.IMAGE_NAME }} - - - uses: ./ - with: - issue: 'false' diff --git a/README.md b/README.md index ffd3df1..baf1ddc 100644 --- a/README.md +++ b/README.md @@ -15,13 +15,13 @@ If vulnerabilities are found by Trivy, it creates the following GitHub Issue. |Parameter|Required|Default Value|Description| |:--:|:--:|:--:|:--| -|trivy_version|False|latest|Trivy version| +|token|True|N/A|GitHub Access Token.
${{ secrets.GITHUB_TOKEN }} is recommended.| |image|True|N/A|The target image name to scan the vulnerability
Specify this parameter or `IMAGE_NAME` environment variable| +|trivy_version|False|latest|Trivy version| |severity|False|HIGH,CRITICAL|Severities of vulnerabilities (separated by commma)| |vuln_type|False|os,library|Scan target are os and / or library (separated by commma)| |ignore_unfixed|False|false|Ignore unfixed vulnerabilities
Please specify `true` or `false`| |template|False|N/A|Trivy --template option
By default, it uses src/template/default.tpl which is based on [contrib/html.tpl](https://github.com/aquasecurity/trivy/blob/main/contrib/html.tpl)
reference: [Report Formats - Trivy](https://aquasecurity.github.io/trivy/v0.18.3/examples/report/#template)| -|token|True|N/A|GitHub Access Token.
${{ secrets.GITHUB_TOKEN }} is recommended.| |issue_title|False|Security Alert|Issue title| |issue_label|False|trivy,vulnerability|Issue label (separated by commma)| |issue_assignee|False|N/A|Issue assignee (separated by commma)| From 381b4a7b10cd258ed7f56589c29b1fcf733708df Mon Sep 17 00:00:00 2001 From: homoluctus Date: Fri, 4 Jun 2021 06:09:09 +0900 Subject: [PATCH 41/46] chore(template): Remove unneed codes --- src/template/default.tpl | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/template/default.tpl b/src/template/default.tpl index 38ac5c9..3ae7bdd 100644 --- a/src/template/default.tpl +++ b/src/template/default.tpl @@ -2,9 +2,6 @@ {{- range . }} - {{- if (eq (len .Vulnerabilities) 0) }} - - {{- else }} @@ -26,7 +23,6 @@ {{- end }} - {{- end }} {{- end }} {{- end }}
{{ escapeXML .Type }}
No Vulnerabilities found
Package Vulnerability ID
\ No newline at end of file From b9f66c1a02bdb51c1bbfb4c45a8143c53fe9733a Mon Sep 17 00:00:00 2001 From: homoluctus Date: Fri, 4 Jun 2021 06:12:59 +0900 Subject: [PATCH 42/46] feat: Check template parameter prefix is @ --- __tests__/trivy.test.ts | 10 +++++++--- src/inputs.ts | 2 +- src/validator.ts | 8 +++++++- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/__tests__/trivy.test.ts b/__tests__/trivy.test.ts index 386643c..4ae4852 100644 --- a/__tests__/trivy.test.ts +++ b/__tests__/trivy.test.ts @@ -5,7 +5,7 @@ import { TrivyCmdOption } from '../src/interface'; import { removeTrivyCmd } from './helper'; const downloader = new Downloader(); -const template = path.join(__dirname, '../src/template/default.tpl'); +const template = `@${path.join(__dirname, '../src/template/default.tpl')}`; describe('Trivy scan', () => { let trivyPath: string; @@ -29,7 +29,9 @@ describe('Trivy scan', () => { template }; const result = scan(trivyPath, image, option) as string; - expect(result.length).toBeGreaterThanOrEqual(1); + expect(result).toContain( + 'knqyf263/vuln-image (alpine 3.7.1) - Trivy Report' + ); }); test('without ignoreUnfixed', () => { @@ -40,6 +42,8 @@ describe('Trivy scan', () => { template }; const result: string = scan(trivyPath, image, option) as string; - expect(result.length).toBeGreaterThanOrEqual(1); + expect(result).toContain( + 'knqyf263/vuln-image (alpine 3.7.1) - Trivy Report' + ); }); }); diff --git a/src/inputs.ts b/src/inputs.ts index c1226f8..4f581c1 100644 --- a/src/inputs.ts +++ b/src/inputs.ts @@ -25,7 +25,7 @@ export class Inputs { vulnType: core.getInput('vuln_type').replace(/\s+/g, ''), ignoreUnfixed: core.getInput('ignore_unfixed').toLowerCase() === 'true', template: - core.getInput('template') || `${__dirname}/template/default.tpl` + core.getInput('template') || `@${__dirname}/template/default.tpl` } }; diff --git a/src/validator.ts b/src/validator.ts index a170b32..c5d9525 100644 --- a/src/validator.ts +++ b/src/validator.ts @@ -1,4 +1,5 @@ import * as fs from 'fs'; +import * as core from '@actions/core'; import { TrivyCmdOption, Validator } from './interface'; export class TrivyCmdOptionValidator implements Validator { @@ -49,7 +50,12 @@ export class TrivyCmdOptionValidator implements Validator { } private validateTemplate(): void { - const template = this.option.template; + if (!this.option.template.startsWith('@')) { + core.warning('template parameter prefix must be "@"'); + this.option.template = `@${this.option.template}`; + } + + const template = this.option.template.replace('@', ''); const exists = fs.existsSync(template); if (!exists) { From cf1cc308f8971cf58aaae7832be9e55625f2a93b Mon Sep 17 00:00:00 2001 From: homoluctus Date: Fri, 4 Jun 2021 06:19:59 +0900 Subject: [PATCH 43/46] chore: Move default.tpl from src/template/ to src/ --- README.md | 2 +- __tests__/helper.ts | 2 +- __tests__/trivy.test.ts | 2 +- src/{template => }/default.tpl | 0 src/inputs.ts | 3 +-- 5 files changed, 4 insertions(+), 5 deletions(-) rename src/{template => }/default.tpl (100%) diff --git a/README.md b/README.md index baf1ddc..f401205 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ If vulnerabilities are found by Trivy, it creates the following GitHub Issue. |severity|False|HIGH,CRITICAL|Severities of vulnerabilities (separated by commma)| |vuln_type|False|os,library|Scan target are os and / or library (separated by commma)| |ignore_unfixed|False|false|Ignore unfixed vulnerabilities
Please specify `true` or `false`| -|template|False|N/A|Trivy --template option
By default, it uses src/template/default.tpl which is based on [contrib/html.tpl](https://github.com/aquasecurity/trivy/blob/main/contrib/html.tpl)
reference: [Report Formats - Trivy](https://aquasecurity.github.io/trivy/v0.18.3/examples/report/#template)| +|template|False|N/A|Trivy --template option
By default, it uses src/default.tpl which is based on [contrib/html.tpl](https://github.com/aquasecurity/trivy/blob/main/contrib/html.tpl)
reference: [Report Formats - Trivy](https://aquasecurity.github.io/trivy/v0.18.3/examples/report/#template)| |issue_title|False|Security Alert|Issue title| |issue_label|False|trivy,vulnerability|Issue label (separated by commma)| |issue_assignee|False|N/A|Issue assignee (separated by commma)| diff --git a/__tests__/helper.ts b/__tests__/helper.ts index 80c5b45..7a046c8 100644 --- a/__tests__/helper.ts +++ b/__tests__/helper.ts @@ -2,7 +2,7 @@ import * as fs from 'fs'; import * as path from 'path'; import { Downloader } from '../src/downloader'; -export const template = path.join(__dirname, '../src/template/default.tpl'); +export const template = path.join(__dirname, '../src/default.tpl'); const downloader = new Downloader(); diff --git a/__tests__/trivy.test.ts b/__tests__/trivy.test.ts index 4ae4852..fc08613 100644 --- a/__tests__/trivy.test.ts +++ b/__tests__/trivy.test.ts @@ -5,7 +5,7 @@ import { TrivyCmdOption } from '../src/interface'; import { removeTrivyCmd } from './helper'; const downloader = new Downloader(); -const template = `@${path.join(__dirname, '../src/template/default.tpl')}`; +const template = `@${path.join(__dirname, '../src/default.tpl')}`; describe('Trivy scan', () => { let trivyPath: string; diff --git a/src/template/default.tpl b/src/default.tpl similarity index 100% rename from src/template/default.tpl rename to src/default.tpl diff --git a/src/inputs.ts b/src/inputs.ts index 4f581c1..456694c 100644 --- a/src/inputs.ts +++ b/src/inputs.ts @@ -24,8 +24,7 @@ export class Inputs { severity: core.getInput('severity').replace(/\s+/g, ''), vulnType: core.getInput('vuln_type').replace(/\s+/g, ''), ignoreUnfixed: core.getInput('ignore_unfixed').toLowerCase() === 'true', - template: - core.getInput('template') || `@${__dirname}/template/default.tpl` + template: core.getInput('template') || `@${__dirname}/default.tpl` } }; From e7d128a8555233136eda2ebc556485680d8195ba Mon Sep 17 00:00:00 2001 From: homoluctus Date: Thu, 3 Jun 2021 21:21:50 +0000 Subject: [PATCH 44/46] build: Transpile --- dist/index.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/dist/index.js b/dist/index.js index c22a56f..ea4ab06 100644 --- a/dist/index.js +++ b/dist/index.js @@ -4388,6 +4388,7 @@ var __importStar = (this && this.__importStar) || function (mod) { Object.defineProperty(exports, "__esModule", { value: true }); exports.TrivyCmdOptionValidator = void 0; const fs = __importStar(__webpack_require__(747)); +const core = __importStar(__webpack_require__(470)); class TrivyCmdOptionValidator { constructor(option) { this.option = option; @@ -4422,7 +4423,11 @@ class TrivyCmdOptionValidator { return true; } validateTemplate() { - const template = this.option.template; + if (!this.option.template.startsWith('@')) { + core.warning('template parameter prefix must be "@"'); + this.option.template = `@${this.option.template}`; + } + const template = this.option.template.replace('@', ''); const exists = fs.existsSync(template); if (!exists) { throw new Error(`Could not find ${template}`); @@ -10289,7 +10294,7 @@ class Inputs { severity: core.getInput('severity').replace(/\s+/g, ''), vulnType: core.getInput('vuln_type').replace(/\s+/g, ''), ignoreUnfixed: core.getInput('ignore_unfixed').toLowerCase() === 'true', - template: core.getInput('template') || __webpack_require__.ab + "default.tpl" + template: core.getInput('template') || `@${__dirname}/default.tpl` } }; this.issue = { From ef8596e1096a8ed10c764bd75a7a5f0bafed9aba Mon Sep 17 00:00:00 2001 From: homoluctus Date: Fri, 4 Jun 2021 06:35:11 +0900 Subject: [PATCH 45/46] chore(readme): Update image and description --- README.md | 9 ++++++++- assets/img/issue.png | Bin 65875 -> 278495 bytes 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index f401205..8c05e30 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,13 @@ If vulnerabilities are found by Trivy, it creates the following GitHub Issue. ![image](./assets/img/issue.png) +## Feature + +- Scan vulnerability used by Trivy +- Create or Update GitHub Issue if vulnerabilities found + - Customize Issue title, label and assignee + - Issue body is generated by template parameter + ## Inputs |Parameter|Required|Default Value|Description| @@ -21,7 +28,7 @@ If vulnerabilities are found by Trivy, it creates the following GitHub Issue. |severity|False|HIGH,CRITICAL|Severities of vulnerabilities (separated by commma)| |vuln_type|False|os,library|Scan target are os and / or library (separated by commma)| |ignore_unfixed|False|false|Ignore unfixed vulnerabilities
Please specify `true` or `false`| -|template|False|N/A|Trivy --template option
By default, it uses src/default.tpl which is based on [contrib/html.tpl](https://github.com/aquasecurity/trivy/blob/main/contrib/html.tpl)
reference: [Report Formats - Trivy](https://aquasecurity.github.io/trivy/v0.18.3/examples/report/#template)| +|template|False|N/A|Path to template file
This parameter equals trivy --template option
By default, it uses src/default.tpl which is based on [contrib/html.tpl](https://github.com/aquasecurity/trivy/blob/main/contrib/html.tpl)
reference: [Report Formats - Trivy](https://aquasecurity.github.io/trivy/v0.18.3/examples/report/#template)| |issue_title|False|Security Alert|Issue title| |issue_label|False|trivy,vulnerability|Issue label (separated by commma)| |issue_assignee|False|N/A|Issue assignee (separated by commma)| diff --git a/assets/img/issue.png b/assets/img/issue.png index 12b6438628c08f03d4a464fbd9c80e3e1d96c615..2b8cd6f74d3f5636867e0dc8c06fbeb4e9a32431 100644 GIT binary patch literal 278495 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

tu4KZYO%ysuy-MDH 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 literal 65875 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

p)83ZvOWP!yx`?gVJf228Y*g#>t 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 Date: Fri, 4 Jun 2021 06:47:56 +0900 Subject: [PATCH 46/46] chore(readme): Update action version in example --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8c05e30..73f715e 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,7 @@ jobs: - name: Pull docker image run: docker pull sample - - uses: lazy-actions/gitrivy@v2 + - uses: lazy-actions/gitrivy@v3 with: token: ${{ secrets.GITHUB_TOKEN }} image: sample