diff --git a/.github/ISSUE_TEMPLATE/bug.md b/.github/ISSUE_TEMPLATE/bug.md
new file mode 100644
index 0000000..e1581e7
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug.md
@@ -0,0 +1,23 @@
+---
+name: Bug report
+about: Create a report to help us improve
+title: ''
+labels: 'bug'
+assignees: ''
+
+---
+
+**Describe the bug**
+A clear and concise description of what the bug is.
+
+**To Reproduce**
+Steps to reproduce the behavior:
+1. Do this '...'
+2. Do that '....'
+3. See error
+
+**Expected behavior**
+A clear and concise description of what you expected to happen.
+
+**Additional context**
+Add any other context about the problem here.
\ No newline at end of file
diff --git a/.github/ISSUE_TEMPLATE/chore.md b/.github/ISSUE_TEMPLATE/chore.md
new file mode 100644
index 0000000..2af5c99
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/chore.md
@@ -0,0 +1,8 @@
+---
+name: Chore issue
+about: General purpose issues related to chores, project management, etc.
+title: ''
+labels: 'chore'
+assignees: ''
+
+---
\ No newline at end of file
diff --git a/.github/ISSUE_TEMPLATE/feature.md b/.github/ISSUE_TEMPLATE/feature.md
new file mode 100644
index 0000000..b3b4ea8
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature.md
@@ -0,0 +1,20 @@
+---
+name: Feature request
+about: Suggest an idea for this project
+title: ''
+labels: 'feature'
+assignees: ''
+
+---
+
+**Is your feature request related to a problem? Please describe.**
+A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
+
+**Describe the solution you'd like**
+A clear and concise description of what you want to happen.
+
+**Describe alternatives you've considered**
+A clear and concise description of any alternative solutions or features you've considered.
+
+**Additional context**
+Add any other context or screenshots about the feature request here.
\ No newline at end of file
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
index b1b4695..37f00ed 100644
--- a/.github/pull_request_template.md
+++ b/.github/pull_request_template.md
@@ -1,20 +1,58 @@
**Thank you for submitting this pull request**
-fix _(please add the issue ID if it exists)_
+fixes _(please add the issue ID if it exists)_
-### Referenced pull requests
+## Description
+
-
-
+## How Has This Been Tested?
+
+
+
### Checklist
- [ ] Tests added if applicable.
- [ ] Documentation updated if applicable.
+### Merge criteria:
+
+
+
+- [ ] The commits and have meaningful messages; the author will squash them _after approval_ or will ask to merge with squash.
+- [ ] Testing instructions have been added in the PR body (for PRs involving changes that are not immediately obvious).
+- [ ] The developer has manually tested the changes and verified that the changes work
+
> **Note:** `dist/cli/index.js` and `dist/gha/index.js` are automatically generated by git hooks and gh workflows.
+
+
+
+First time here?
+
+
+This project follows [git conventional commits](https://gist.github.com/qoomon/5dfcdf8eec66a051ecd85625518cfd13) pattern, therefore the commits should have the following format:
+
+```
+():
+empty separator line
+
+empty separator line
+
+```
+
+Where the type must be one of `[build, chore, ci, docs, feat, fix, perf, refactor, revert, style, test]`
+
+> **NOTE**: if you are still in a `work in progress` branch and you want to push your changes remotely, consider adding `--no-verify` for both `commit` and `push`, e.g., `git push origin --no-verify` - this could become useful to push changes where there are still tests failures. Once the pull request is ready, please `amend` the commit and force-push it to keep following the adopted git commit standard.
+
+
+
+
+
+How to prepare for a new release?
+
+
+There is no need to manually update `package.json` version and `CHANGELOG.md` information. This process has been automated in [Prepare Release](./workflows/prepare-release.yml) *Github* workflow.
+
+Therefore whenever enough changes are merged into the `main` branch, one of the maintainers will trigger this workflow that will automatically update `version` and `changelog` based on the commits on the git tree.
+
+More details can be found in [package release](https://github.com/kiegroup/git-backporting/blob/main/README.md#package-release) section of the README.
+
\ No newline at end of file
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 775fa65..27fe954 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -1,7 +1,7 @@
# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
-name: "Main CI"
+name: "main ci"
on:
push:
@@ -10,17 +10,18 @@ on:
jobs:
build-and-test:
+ name: ${{ matrix.os }} - node ${{ matrix.node-version }}
strategy:
matrix:
- node-version: [16]
+ node-version: [16, 18, 20]
os: [ubuntu-latest]
- fail-fast: true
+ fail-fast: false
runs-on: ${{ matrix.os }}
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- name: Setup Node ${{ matrix.node-version }}
- uses: actions/setup-node@v3
+ uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
- run: npm ci
diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml
new file mode 100644
index 0000000..12de602
--- /dev/null
+++ b/.github/workflows/coverage.yml
@@ -0,0 +1,22 @@
+name: 'coverage report'
+
+on:
+ pull_request_target:
+ branches:
+ - main
+ paths-ignore:
+ - 'LICENSE*'
+ - '**.gitignore'
+ - '**.md'
+ - '**.txt'
+ - '.github/ISSUE_TEMPLATE/**'
+ - '.github/dependabot.yml'
+
+jobs:
+ coverage:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - uses: ArtiomTr/jest-coverage-report-action@v2
+ with:
+ test-script: npm test
\ No newline at end of file
diff --git a/.github/workflows/prepare-release.yml b/.github/workflows/prepare-release.yml
new file mode 100644
index 0000000..611d29d
--- /dev/null
+++ b/.github/workflows/prepare-release.yml
@@ -0,0 +1,50 @@
+# this workflow prepare the project for the next release, it will update changelog and version based on the previous commits.
+# after that it will open a pull request for this change
+name: "prepare release"
+
+on:
+ workflow_dispatch:
+ inputs:
+ options:
+ description: 'Additional release-it options'
+ required: false
+ default: ''
+
+env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
+
+jobs:
+ prepare-release:
+ name: Prepare release
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ - name: Setup Node
+ uses: actions/setup-node@v4
+ with:
+ node-version: 18
+ - name: Git config
+ run: |
+ git config user.name "${GITHUB_ACTOR}"
+ git config user.email "${GITHUB_ACTOR}@users.noreply.github.com"
+ - name: Npm config
+ run: npm config set //registry.npmjs.org/:_authToken $NPM_TOKEN
+ - run: npm ci
+ - name: Compute next version
+ run: |
+ next_version=$(npx release-it --release-version --no-git.requireCleanWorkingDir)
+ echo "NEXT_VERSION=${next_version}" >> $GITHUB_ENV
+ - name: Prepare the release changes
+ run: npm run release:prepare -- --ci --no-git.commit ${{ github.event.inputs.options }}
+ - name: Create Pull Request
+ uses: gr2m/create-or-update-pull-request-action@v1.x
+ with:
+ title: "chore: release v${{ env.NEXT_VERSION }}"
+ body: >
+ Creating changes for the next release.
+ branch: release/v${{ env.NEXT_VERSION }}
+ commit-message: "chore: release v${{ env.NEXT_VERSION }}"
+ reviewers: lampajr
\ No newline at end of file
diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml
index 917b434..d0dce86 100644
--- a/.github/workflows/pull-request.yml
+++ b/.github/workflows/pull-request.yml
@@ -1,23 +1,32 @@
# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
-name: "Pull Request Checks"
+name: "pull request check"
-on: pull_request
+on:
+ pull_request:
+ paths-ignore:
+ - 'LICENSE*'
+ - '**.gitignore'
+ - '**.md'
+ - '**.txt'
+ - '.github/ISSUE_TEMPLATE/**'
+ - '.github/dependabot.yml'
jobs:
build:
+ name: ${{ matrix.os }} - node ${{ matrix.node-version }}
strategy:
matrix:
- node-version: [16]
+ node-version: [16, 18, 20]
os: [ubuntu-latest]
fail-fast: false
runs-on: ${{ matrix.os }}
steps:
- - uses: actions/checkout@v3
+ - uses: actions/checkout@v4
- name: Setup Node ${{ matrix.node-version }}
- uses: actions/setup-node@v3
+ uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
- run: npm ci
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 0000000..cdfe93f
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,37 @@
+name: "release package"
+
+on:
+ workflow_dispatch:
+ inputs:
+ options:
+ description: 'Additional release-it options'
+ required: false
+ default: ''
+
+env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
+
+jobs:
+ release:
+ name: Release package
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ - name: Setup Node
+ uses: actions/setup-node@v4
+ with:
+ node-version: 18
+ - name: Git config
+ run: |
+ git config user.name "${GITHUB_ACTOR}"
+ git config user.email "${GITHUB_ACTOR}@users.noreply.github.com"
+ - name: Npm config
+ run: npm config set //registry.npmjs.org/:_authToken $NPM_TOKEN
+ - run: npm ci
+ # the version/changelog must be already updated on main branch using "npm run release:prepare"
+ # or check prepare-release.yml workflow
+ - name: New version release
+ run: npm run release -- --ci --no-increment --no-git.commit ${{ github.event.inputs.options }}
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index 0ef820f..115c77e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,7 +6,12 @@ test/**/_temp/**/*
yarn.lock
coverage/
test-report.xml
+report.json
.idea/
.vscode/
build/
-# dist/
\ No newline at end of file
+.npmrc
+
+# temporary files created during tests
+*test*.json
+bp
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2c9ceeb..e3a24a6 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,23 +1,212 @@
# Changelog
-## [2.1.0](https://github.com/lampajr/backporting/compare/v2.0.1...v2.1.0) (2023-06-20)
+## 4.8.5 (2025-04-15)
+* build(deps): audit fix (#150) ([3a9d367](https://github.com/kiegroup/git-backporting/commit/3a9d367)), closes [#150](https://github.com/kiegroup/git-backporting/issues/150)
+* build(deps): upgrade release-it to v18 (#153) ([c9a7375](https://github.com/kiegroup/git-backporting/commit/c9a7375)), closes [#153](https://github.com/kiegroup/git-backporting/issues/153)
+* fix(#151): fix gitlab post comments url (#152) ([d74a787](https://github.com/kiegroup/git-backporting/commit/d74a787)), closes [#152](https://github.com/kiegroup/git-backporting/issues/152)
-### Features
-
-* **issue-17:** override backporting pr data ([#29](https://github.com/lampajr/backporting/issues/29)) ([941beda](https://github.com/lampajr/backporting/commit/941beda208e4a8c1577bd4d39299fbbfbf569c06))
+## [4.8.4](https://github.com/kiegroup/git-backporting/compare/v4.8.3...v4.8.4) (2024-11-02)
### Bug Fixes
-* gha input parser ([95b35aa](https://github.com/lampajr/backporting/commit/95b35aa4efb86e2bc4990d920feec1ec5c4eb8e4))
+* abort conflicting cherry-pick before starting new one ([#146](https://github.com/kiegroup/git-backporting/issues/146)) ([3deee59](https://github.com/kiegroup/git-backporting/commit/3deee59d4c3b726ae131b5974af4618dd5e7d1d2))
-## [2.0.1](https://github.com/lampajr/backporting/compare/v2.0.0...v2.0.1) (2023-01-05)
+## [4.8.3](https://github.com/kiegroup/git-backporting/compare/v4.8.2...v4.8.3) (2024-10-10)
-## [2.0.0](https://github.com/lampajr/backporting/compare/v1.0.0...v2.0.0) (2023-01-05)
+
+### Bug Fixes
+
+* auto-no-squash inference for GitLab ([#140](https://github.com/kiegroup/git-backporting/issues/140)) ([b4d0481](https://github.com/kiegroup/git-backporting/commit/b4d0481c5649115367f1ae0724d12d55b6b86e10))
+
+## [4.8.2](https://github.com/kiegroup/git-backporting/compare/v4.8.1...v4.8.2) (2024-10-07)
+
+
+### Bug Fixes
+
+* cherry-pick order on GitLab by reversing commmit list only once ([#137](https://github.com/kiegroup/git-backporting/issues/137)) ([e2d73d0](https://github.com/kiegroup/git-backporting/commit/e2d73d050c8387c0858877ac3c56c565bacaf4f9))
+* handle Codeberg returning null entry in requested_reviewers ([#136](https://github.com/kiegroup/git-backporting/issues/136)) ([1e8358b](https://github.com/kiegroup/git-backporting/commit/1e8358bb2c461c56cf86e82bec4d71284866b13b))
+
+## [4.8.1](https://github.com/kiegroup/git-backporting/compare/v4.8.0...v4.8.1) (2024-07-16)
+
+
+### Bug Fixes
+
+* **gh130:** apply commits in the correct order on github ([#131](https://github.com/kiegroup/git-backporting/issues/131)) ([cb3473d](https://github.com/kiegroup/git-backporting/commit/cb3473d7c9de66cb7bec188f08538e134cdc4bc0))
+
+## [4.8.0](https://github.com/kiegroup/git-backporting/compare/v4.7.1...v4.8.0) (2024-04-11)
### Features
-* backport still open pull requests ([b3936e0](https://github.com/lampajr/backporting/commit/b3936e019a19976281c5e2582904264e974b8b42))
-* pull request backporting ([b3936e0](https://github.com/lampajr/backporting/commit/b3936e019a19976281c5e2582904264e974b8b42))
\ No newline at end of file
+* auto-detect the value of the no-squash option ([#118](https://github.com/kiegroup/git-backporting/issues/118)) ([6042bcc](https://github.com/kiegroup/git-backporting/commit/6042bcc40ba83593a23dfe4d92cf50655a05b1cd))
+* implement error notification as pr comment ([#124](https://github.com/kiegroup/git-backporting/issues/124)) ([2bb7f73](https://github.com/kiegroup/git-backporting/commit/2bb7f731127e099d1f196e6785e992589f7c4940))
+
+## [4.7.1](https://github.com/kiegroup/git-backporting/compare/v4.7.0...v4.7.1) (2024-04-03)
+
+
+### Bug Fixes
+
+* gha input is target-branch-pattern, not target-reg-exp ([#120](https://github.com/kiegroup/git-backporting/issues/120)) ([e6f86f8](https://github.com/kiegroup/git-backporting/commit/e6f86f8f839bc86adf36fa0d3c8dcad6cab2f92e))
+
+## [4.7.0](https://github.com/kiegroup/git-backporting/compare/v4.6.0...v4.7.0) (2024-04-02)
+
+
+### Features
+
+* add --cherry-pick-options to add to all cherry-pick run ([#116](https://github.com/kiegroup/git-backporting/issues/116)) ([fe6be83](https://github.com/kiegroup/git-backporting/commit/fe6be83074476d91c1b038fd7f03c4868e96f113))
+* **gh75:** extract target branched from pr labels ([#112](https://github.com/kiegroup/git-backporting/issues/112)) ([53cc505](https://github.com/kiegroup/git-backporting/commit/53cc505f17630fb30daa70f75895323325cc0c7d))
+
+
+### Bug Fixes
+
+* return GitHub no-squash commits in order ([#115](https://github.com/kiegroup/git-backporting/issues/115)) ([6d9b9db](https://github.com/kiegroup/git-backporting/commit/6d9b9db590f9713e2b056bcc8e20fc3f3c70618b))
+
+## [4.6.0](https://github.com/kiegroup/git-backporting/compare/v4.5.2...v4.6.0) (2024-03-25)
+
+
+### Features
+
+* add --git-client to explicitly set the type of forge ([#106](https://github.com/kiegroup/git-backporting/issues/106)) ([80a0b55](https://github.com/kiegroup/git-backporting/commit/80a0b554f0c1920a178e28bd678f709581a1b224))
+
+## [4.5.2](https://github.com/kiegroup/git-backporting/compare/v4.5.1...v4.5.2) (2024-03-08)
+
+### Improvements
+
+* upgrade to node20 for gha ([c8ede8d](https://github.com/kiegroup/git-backporting/commit/c8ede8d4e2428cb3f4dc2d727f24b37e5781cbb1))
+
+## [4.5.1](https://github.com/kiegroup/git-backporting/compare/v4.5.0...v4.5.1) (2024-02-23)
+
+
+### Bug Fixes
+
+* --auth when --git-user contains space ([#95](https://github.com/kiegroup/git-backporting/issues/95)) ([9bcd6e6](https://github.com/kiegroup/git-backporting/commit/9bcd6e6b5547974c45ade756b623eb385bb76019))
+* --no-squash on single-commit GitLab MR ([#93](https://github.com/kiegroup/git-backporting/issues/93)) ([300fa91](https://github.com/kiegroup/git-backporting/commit/300fa91a8ae065b7f6f6370882b10929bbde6309))
+* **gh-96:** fix git token parsing ([#98](https://github.com/kiegroup/git-backporting/issues/98)) ([c57fca6](https://github.com/kiegroup/git-backporting/commit/c57fca6bd6b9c241c11ad1f728cc9bc0acfd7f88))
+
+## [4.5.0](https://github.com/kiegroup/git-backporting/compare/v4.4.1...v4.5.0) (2023-12-10)
+
+
+### Features
+
+* **gh-85:** take git tokens from environment ([#88](https://github.com/kiegroup/git-backporting/issues/88)) ([70da575](https://github.com/kiegroup/git-backporting/commit/70da575afce603190eafed927637922a37fbd087))
+
+## [4.4.1](https://github.com/kiegroup/git-backporting/compare/v4.4.0...v4.4.1) (2023-12-05)
+
+
+### Bug Fixes
+
+* namespace parsing in gitlab ([#84](https://github.com/kiegroup/git-backporting/issues/84)) ([ed32d22](https://github.com/kiegroup/git-backporting/commit/ed32d2275b6008d31e456c41beecd536eceb23dc))
+
+## [4.4.0](https://github.com/kiegroup/git-backporting/compare/v4.3.0...v4.4.0) (2023-08-18)
+
+
+### Features
+
+* integrate with codeberg ([#80](https://github.com/kiegroup/git-backporting/issues/80)) ([9f0fbc0](https://github.com/kiegroup/git-backporting/commit/9f0fbc0b2fd8d449207660323be87f6d2fa8c017))
+* **issue-77:** handle multiple target branches ([#78](https://github.com/kiegroup/git-backporting/issues/78)) ([5fc72e1](https://github.com/kiegroup/git-backporting/commit/5fc72e127bedb3177f4e17ff1182827c78154ef1))
+
+## [4.3.0](https://github.com/kiegroup/git-backporting/compare/v4.2.0...v4.3.0) (2023-07-27)
+
+
+### Features
+
+* **issue-70:** additional pr comments ([bed7e29](https://github.com/kiegroup/git-backporting/commit/bed7e29ddc1ba5498faa2c7cc33ec3b127947dcf))
+
+
+### Bug Fixes
+
+* gha skip whitespace trim on body ([#73](https://github.com/kiegroup/git-backporting/issues/73)) ([29589a6](https://github.com/kiegroup/git-backporting/commit/29589a63b503b30820a13a442de533239dec06f4))
+* preserve new lines in body and comments ([#72](https://github.com/kiegroup/git-backporting/issues/72)) ([fa43ffc](https://github.com/kiegroup/git-backporting/commit/fa43ffc1dc5572a06309c28e93ee6ab5fba14780))
+
+## [4.2.0](https://github.com/kiegroup/git-backporting/compare/v4.1.0...v4.2.0) (2023-07-13)
+
+
+### Features
+
+* **issue-62:** make cherry-pick strategy configurable ([#63](https://github.com/kiegroup/git-backporting/issues/63)) ([265955d](https://github.com/kiegroup/git-backporting/commit/265955dda77a8191fd1f64517fec20e8d5f8c5b4))
+
+
+### Bug Fixes
+
+* **issue-57:** truncate the bp branch name ([#58](https://github.com/kiegroup/git-backporting/issues/58)) ([ead1322](https://github.com/kiegroup/git-backporting/commit/ead1322c0f6bb5de96c487e8f6b6565734144853))
+
+
+### Performance Improvements
+
+* use concurrent promises instead of awaiting them one by one ([#59](https://github.com/kiegroup/git-backporting/issues/59)) ([49a7350](https://github.com/kiegroup/git-backporting/commit/49a73504066396ca2a074f55bb23815e13ae462e))
+
+## [4.1.0](https://github.com/kiegroup/git-backporting/compare/v4.0.0...v4.1.0) (2023-07-11)
+
+
+### Features
+
+* **issue-41:** set and inherit labels ([#48](https://github.com/kiegroup/git-backporting/issues/48)) ([fcc0167](https://github.com/kiegroup/git-backporting/commit/fcc01673f4bc9aa2786faf6dfd503a29e5ca0cd9))
+* **issue-54:** backport pr commits without squash ([#55](https://github.com/kiegroup/git-backporting/issues/55)) ([c4dbb26](https://github.com/kiegroup/git-backporting/commit/c4dbb26c1d9d266ed86f3f0d6016b8cff7743f8b))
+
+
+### Bug Fixes
+
+* **issue-52:** use pull request github api url as source ([#53](https://github.com/kiegroup/git-backporting/issues/53)) ([a737aa7](https://github.com/kiegroup/git-backporting/commit/a737aa7c4c66983de358b8472121ab918de922e3))
+
+## [4.0.0](https://github.com/kiegroup/git-backporting/compare/v3.0.0...v4.0.0) (2023-07-06)
+
+Project moved under @kiegroup organization.
+
+## [3.1.1](https://github.com/kiegroup/git-backporting/compare/v3.1.0...v3.1.1) (2023-07-06)
+
+## [3.1.0](https://github.com/kiegroup/git-backporting/compare/v3.0.0...v3.1.0) (2023-07-05)
+
+
+### Features
+
+* config file as option ([#42](https://github.com/kiegroup/git-backporting/issues/42)) ([5ead31f](https://github.com/kiegroup/git-backporting/commit/5ead31f606b585ecdf7ed2e9de8ebd841b935898))
+
+## [3.0.0](https://github.com/kiegroup/git-backporting/compare/v2.2.1...v3.0.0) (2023-07-01)
+
+
+### Features
+
+* integrate tool with gitlab service ([#39](https://github.com/kiegroup/git-backporting/issues/39)) ([107f5e5](https://github.com/kiegroup/git-backporting/commit/107f5e52d663157145aa14f6cf7fa4d6704cb844))
+
+
+### Bug Fixes
+
+* removed 'powered by..' pr body suffix ([6869bec](https://github.com/kiegroup/git-backporting/commit/6869becb3e5979b24f6fe29bf38141e15c1bdc66))
+
+## [2.2.1](https://github.com/kiegroup/git-backporting/compare/v2.2.0...v2.2.1) (2023-06-27)
+
+
+### Bug Fixes
+
+* fix gha no-inherit-reviewers input ([8b586cc](https://github.com/kiegroup/git-backporting/commit/8b586ccdfe0e6b90ed41ea8a5eecdbc24893fe25))
+
+## [2.2.0](https://github.com/kiegroup/git-backporting/compare/v2.1.0...v2.2.0) (2023-06-22)
+
+
+### Features
+
+* override backporting pr fields ([#38](https://github.com/kiegroup/git-backporting/issues/38)) ([a32e8cd](https://github.com/kiegroup/git-backporting/commit/a32e8cd34c757358668fe8f88f6d1733d3fa8391))
+
+## [2.1.0](https://github.com/kiegroup/git-backporting/compare/v2.0.1...v2.1.0) (2023-06-20)
+
+
+### Features
+
+* **issue-17:** override backporting pr data ([#29](https://github.com/kiegroup/git-backporting/issues/29)) ([941beda](https://github.com/kiegroup/git-backporting/commit/941beda208e4a8c1577bd4d39299fbbfbf569c06))
+
+
+### Bug Fixes
+
+* gha input parser ([95b35aa](https://github.com/kiegroup/git-backporting/commit/95b35aa4efb86e2bc4990d920feec1ec5c4eb8e4))
+
+## [2.0.1](https://github.com/kiegroup/git-backporting/compare/v2.0.0...v2.0.1) (2023-01-05)
+
+## [2.0.0](https://github.com/kiegroup/git-backporting/compare/v1.0.0...v2.0.0) (2023-01-05)
+
+
+### Features
+
+* backport still open pull requests ([b3936e0](https://github.com/kiegroup/git-backporting/commit/b3936e019a19976281c5e2582904264e974b8b42))
+* pull request backporting ([b3936e0](https://github.com/kiegroup/git-backporting/commit/b3936e019a19976281c5e2582904264e974b8b42))
diff --git a/README.md b/README.md
index 5346116..cdf9c1a 100644
--- a/README.md
+++ b/README.md
@@ -1,69 +1,185 @@
- BPER: Git Backporter
+ Git Backporting
:outbox_tray: :inbox_tray:
-
-
+
+
+
+
+
---
-**BPer** is a [NodeJS](https://nodejs.org/) command line tool that provides capabilities to *backport* [1] pull requests in an automated way. This tool also comes with a predefined GitHub action in order to make CI/CD integration easier for all users.
+**Git Backporting** is a [NodeJS](https://nodejs.org/) command line tool that provides capabilities to *backport* pull requests (on *GitHub*) and merge requests (on *GitLab*) in an automated way. This tool also comes with a predefined *GitHub* action in order to make CI/CD integration easier for all users.
-[1] *backporting* is an action aiming to move a change (usually a commit) from a branch (usually the main one) to another one, which is generally referring to a still maintained release branch. Keeping it simple: it is about to move a specific change or a set of them from one branch to another.
Table of content
----------------
-* **[Usage](#usage)**
-* **[GitHub Action](#github-action)**
-* **[Limitations](#limitations)**
-* **[Contributions](#contributing)**
+* **[Who is this tool for](#who-is-this-tool-for)**
+* **[CLI tool](#cli-tool)**
+* **[GitHub action](#github-action)**
+* **[Future works](#future-works)**
+* **[Development](#development)**
+* **[Contributing](#contributing)**
* **[License](#license)**
+## Who is this tool for?
-## Usage
+`git-backporting` is a fully configurable tool that provides capabilities to *backport* pull requests (on *GitHub*) and merge requests (on *GitLab*) in an automated way.
+
+> *What is backporting?* - backporting is an action aiming to move a change (usually a commit) from a branch (usually the main one) to another one, which is generally referring to a still maintained release branch. Keeping it simple: it is about to move a specific change or a set of them from one branch to another.
+
+Therefore this tools is for anybody who is working on projects where they have to maintain multiple active branches/versions at the same time. If you are actively cherry-picking many changes from your main branch to other ones, and you mainly do changes through pull requests or merge requests, maybe this tool may be right for you.
+
+## CLI tool
+
+> All instructions provided below pertain to version `v4` of the tool. If you wish to use an earlier version, please refer to the documentation from the corresponding tag/release.
This tool is released on the [public npm registry](https://www.npmjs.com/), therefore it can be easily installed using `npm`:
```bash
-$ npm install -g @lampajr/bper
+$ npm install -g @kie/git-backporting
```
-Then it can be used as any other command line tool:
+Then you just have to choose the pull request (or merge request on *Gitlab*) that you would like to backport and the target branch and then simply run the following command:
```bash
-$ bper -tb -pr -a [-f ]
+$ git-backporting -tb -pr -a
```
+A real example could be the following one:
+```bash
+$ git-backporting -tb develop -pr https://github.com/kiegroup/git-backporting-example/pull/47 -a *****
+```
+
+This is the easiest invocation where you let the tool set / compute most of the backported pull request data. Obviously most of that data can be overridden with appropriate tool options, more details can be found in the [inputs](#inputs) section.
+
+### Requirements
+
+* Node 16 or higher, more details on Node can be found [here](https://nodejs.org/en).
+* Git, see [how to install](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) if you need help.
+
+### How it works?
+
+It works in this way: given the provided `pull/merge request` it infers the server API to use (either *Github* or *Gitlab* for now) and retrieves the corresponding pull request object (original pull/merge request to be backported into another branch).
+
+After that it clones the corresponding git repository, check out in the provided `target branch` and create a new branch from that (name automatically generated if not provided as option).
+
+By default the tool will try to cherry-pick the single squashed/merged commit into the newly created branch. The `--no-squash` and `--auto-no-squash` options control this behavior according the following table.
+
+| No squash | Auto no squash |Behavior|
+|---|---|---|
+| unset/false | unset/false | cherry-pick a single commit, squashed or merged |
+| set/true | unset/false | cherry-pick all commits found in the the original pull/merge request|
+| (ignored) | set/true | cherry-pick all commits if the original pull/merge request was merged, a single commit if it was squashed |
+
+Based on the original pull request, creates a new one containing the backporting to the target branch. Note that most of these information can be overridden with appropriate CLI options or GHA inputs.
+
+#### cherry-pick strategy
+
+The default cherry-pick strategy is `recursive` with `theirs` option for automatic conflicts resolution. Therefore, by default, all commits are cherry-picked using the following git-equivalent command:
+```bash
+$ git cherry-pick -m 1 --strategy=recursive --strategy-option=theirs
+```
+
+From version `v4.2.0` both can be configured via the `strategy` or `strategy-option` inputs if using the action and the `--strategy` or `--strategy-option` arguments if using the CLI.
+
+The [default strategy](https://git-scm.com/docs/git-merge#Documentation/git-merge.txt--sltstrategygt) of the `git-cherry-pick` command is different from the defaults of `git-backporting`.
+```bash
+$ git cherry-pick -m 1
+```
+is the same as:
+```bash
+$ git cherry-pick -m 1 --strategy=ort --strategy-option=find-renames
+```
+If there is a conflict the backport will fail and require manual intervention.
+
+> **NOTE**: If there are any conflicts, the tool will block the process and exit signalling the failure as there are still no ways to interactively resolve them. In these cases a manual cherry-pick is needed, or alternatively users could manually resume the process in the cloned repository (here the user will have to resolve the conflicts, push the branch and create the pull request - all manually).
+
### Inputs
-This toold comes with some inputs that allow users to override the default behavior, here the full list of available inputs:
+This tool comes with some inputs that allow users to override the default behavior, here the full list of available inputs:
| **Name** | **Command** | **Required** | **Description** | **Default** |
|---------------|----------------------|--------------|--------------------------------------------------------------------------------------------------------------------------------------------------------|-------------|
| Version | -V, --version | - | Current version of the tool | |
| Help | -h, --help | - | Display the help message | |
-| Target Branch | -tb, --target-branch | Y | Branch where the changes must be backported to | |
-| Pull Request | -pr, --pull-request | Y | Original pull request url, the one that must be backported, e.g., https://github.com/lampajr/backporting/pull/1 | |
-| Auth | -a, --auth | N | `GITHUB_TOKEN` or a `repo` scoped [Personal Access Token](https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token) | "" |
-| Folder | -f, --folder | N | Local folder where the repo will be checked out, e.g., /tmp/folder | {cwd}/bp |
+| Target Branches | -tb, --target-branch | N | Comma separated list of branches where the changes must be backported to | |
+| Target Branches Pattern | -tbp, --target-branch-pattern | N | Regular expression pattern to extract target branch(es) from pr labels. The branches will be extracted from the pattern's required `target` named capturing group, e.g., `^backport (?([^ ]+))$` | |
+| Pull Request | -pr, --pull-request | N | Original pull request url, the one that must be backported, e.g., https://github.com/kiegroup/git-backporting/pull/1 | |
+| Configuration File | -cf, --config-file | N | Configuration file, in JSON format, containing all options to be overridded, note that if provided all other CLI options will be ignored | |
+| Auth | -a, --auth | N | Git access/authorization token, if provided all token env variables will be ignored. See [auth token](#authorization-token) section for more details | "" |
+| Folder | -f, --folder | N | Local folder full name of the repository that will be checked out, e.g., /tmp/folder | {cwd}/bp |
+| Git Client | --git-client | N | Git client type , if not set it is infered from pull-request
+| Git User | -gu, --git-user | N | Local git user name | "GitHub" |
+| Git Email | -ge, --git-email | N | Local git user email | "noreply@github.com" |
| Title | --title | N | Backporting pull request title | "{original-pr-title}" |
| Body | --body | N | Backporting pull request body | "{original-pr-body}" |
| Body Prefix | --body-prefix | N | Prefix to the backporting pull request body | "Backport: {original-pr-link}" |
-| Backport Branch Name | --bp-branch-name | N | Name of the backporting pull request branch | bp-{target-branch}-{sha} |
+| Reviewers | --reviewers | N | Backporting pull request comma-separated reviewers list | [] |
+| Assignees | --assignes | N | Backporting pull request comma-separated assignees list | [] |
+| No Reviewers Inheritance | --no-inherit-reviewers | N | Considered only if reviewers is empty, if true keep reviewers as empty list, otherwise inherit from original pull request | false |
+| Backport Branch Names | --bp-branch-name | N | Comma separated lists of the backporting pull request branch names, if they exceeds 250 chars they will be truncated | bp-{target-branch}-{sha1}...{shaN} |
+| Labels | --labels | N | Provide custom labels to be added to the backporting pull request | [] |
+| Inherit labels | --inherit-labels | N | If enabled inherit lables from the original pull request | false |
+| No squash | --no-squash | N | Backport all commits found in the pull request. The default behavior is to only backport the first commit that was merged in the base branch. | |
+| Auto no squash | --auto-no-squash | N | If the pull request was merged or is open, backport all commits. If the pull request commits were squashed, backport the squashed commit. | |
+| Strategy | --strategy | N | Cherry pick merging strategy, see [git-merge](https://git-scm.com/docs/git-merge#_merge_strategies) doc for all possible values | "recursive" |
+| Strategy Option | --strategy-option | N | Cherry pick merging strategy option, see [git-merge](https://git-scm.com/docs/git-merge#_merge_strategies) doc for all possible values | "theirs" |
+| Cherry-pick Options | --cherry-pick-options | N | Additional cherry-pick options, see [git-cherry-pick](https://git-scm.com/docs/git-cherry-pick) doc for all possible values | "theirs" |
+| Additional comments | --comments | N | Semicolon separated list of additional comments to be posted to the backported pull request | [] |
+| Enable error notification | --enable-err-notification | N | If true, enable the error notification as comment on the original pull request | false |
| Dry Run | -d, --dry-run | N | If enabled the tool does not push nor create anything remotely, use this to skip PR creation | false |
+> **NOTE**: `pull request` and (`target branch` or `target branch pattern`) are *mandatory*, they must be provided as CLI options or as part of the configuration file (if used).
-## GitHub Action
+#### Authorization token
-This action can be used in any GitHub workflow, below you can find a simple example of manually triggered workflow backporting a specific pull request (provided as input).
+Since version `4.5.0` we introduced a new feature that allows user to provide the git access token through environment variables. These env variables are taken into consideration only if the `--auth/-a` is not provided as argument/input.
+Here the supported list of env variables:
+- `GITHUB_TOKEN`: this is checked only if backporting on Github platform.
+- `GITLAB_TOKEN`: this is checked only if backporting on Gitlab platform.
+- `CODEBERG_TOKEN`: this is checked only if backporting on Codeberg platform.
+- `GIT_TOKEN`: this is considered if none of the previous envs are set.
+
+> **NOTE**: if `--auth` argument is provided, all env variables will be ignored even if not empty.
+
+#### Configuration file example
+
+This is an example of a configuration file that can be used.
+```json
+{
+ "pullRequest": "https://gitlab.com///-/merge_requests/1",
+ "targetBranch": "old",
+ "folder": "/tmp/my-folder",
+ "title": "Override Title",
+ "auth": "*****"
+}
+```
+Keep in mind that its structure MUST match the [Args](src/service/args/args.types.ts) interface, which is actually a camel-case version of the CLI options.
+
+### Supported git services
+
+Right now **Git Backporting** supports the following git management services:
+ * ***GITHUB***: Introduced since the first release of this tool (version `1.0.0`). The interaction with this system is performed using [*octokit*](https://octokit.github.io/rest.js) client library.
+
+ * ***GITLAB***: This has been introduced since version `3.0.0`, it works for both public and private *GitLab* servers. The interaction with this service is performed using plain [*axios*](https://axios-http.com) requests. The *gitlab* api version that is used to make requests is `v4`, at the moment there is no possibility to override it.
+
+ * ***CODEBERG***: Introduced since version `4.4.0`, it works for public [codeberg.org](https://codeberg.org/) platform. Thanks to the api compatibility with GitHub, the interaction with this service is performed using using [*octokit*](https://octokit.github.io/rest.js) client library.
+
+> **NOTE**: by default, all gitlab requests are performed setting `rejectUnauthorized=false`, planning to make this configurable too.
+
+## GitHub action
+
+This action can be used in any *GitHub* workflow, below you can find a simple example of manually triggered workflow backporting a specific pull request (provided as input).
```yml
-name: Pull Request Backporting using BPer
+name: Pull Request Backporting using Git Backporting
on:
workflow_dispatch:
@@ -88,7 +204,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Backporting
- uses: lampajr/backporting@main
+ uses: kiegroup/git-backporting@main
with:
target-branch: ${{ inputs.targetBranch }}
pull-request: ${{ inputs.pullRequest }}
@@ -101,7 +217,7 @@ You can also use this action with other events - you'll just need to specify `ta
For example, this configuration creates a pull request against branch `v1` once the current one is merged, provided that the label `backport-v1` is applied:
```yaml
-name: Pull Request Backporting using BPer
+name: Pull Request Backporting using Git Backporting
on:
pull_request_target:
@@ -109,6 +225,9 @@ on:
- closed
- labeled
+env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+
jobs:
backporting:
name: "Backporting"
@@ -127,37 +246,69 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Backporting
- uses: lampajr/backporting@main
+ uses: kiegroup/git-backporting@main
with:
target-branch: v1
pull-request: ${{ github.event.pull_request.url }}
- auth: ${{ secrets.GITHUB_TOKEN }}
```
For a complete description of all inputs see [Inputs section](#inputs).
-## Limitations
+## Future works
-**BPer** is in development mode, this means that it has many limitations right now. I'll try to summarize the most importan ones:
+**Git Backporting** is still in development mode, this means that there are still many future works and extension that can be implemented. I'll try to summarize the most important ones:
-- You can backport pull requests only.
-- It only works for [GitHub](https://github.com/).
-- Integrated in GitHub Actions CI/CD only.
+- Provide a way to backport single commit (or a set of them) if no original pull request is present.
+- Integrate this tool with other git management services (like Bitbucket) to make it as generic as possible.
+- Integrate it into other CI/CD services like gitlab CI.
+- Provide some reusable *GitHub* workflows.
-Based on these limitations, the next **Future Works** could be the following:
-- Provide a way to backport single commit too (or a set of them), even if no original pull request is present.
-- Integrate this tool with other git management services (like GitLab and Bitbucket) to make it as generic as possible.
-- Provide some reusable GitHub workflows.
+## Development
+
+### Package release
+
+The release of this package is entirely based on [release-it](https://github.com/release-it/release-it) tool. I created some useful scripts that can make the release itself quite easy.
+
+
+#### Automatic release
+
+The first step is to prepare the changes for the next release, this is done by running:
+
+```bash
+$ npm run release:prepare:all
+```
+
+> NOTE: running locally this requires `npm login`, please consider using `.github/workflows/prepare-release.yml` if you don't have permission on the npm package.
+
+This script performs the following steps:
+ 1. Automatically computes the next version based on the last commits
+ 2. Create a new branch `release/v${computed_version}`
+ 3. Apply all changes, like version and changelog upgrade
+ 4. Commit those changes: `chore: release v${compute_version}`
+
+After that you should just push the new branch and open the pull request.
+> NOTE: if you don't want to run this preparation from you local environment, there is already a workflow that does all these steps, including the pull request. See [Prepare release](.github/workflows/prepare-release.yml) workflow.
+
+Once the release preparion pull request got merged, you can run [Release package](.github/workflows/release.yml) workflow that automatically performs the release itself, including npm publishing, git tag and github release.
+
+#### Manual release
+
+In case we would like to perform a manual release, it would be enough to open a pull request changing the following items:
+- Package version inside the `package.json`
+- Provide exhaustive changelog information inside `CHANGELOG.md`
+- Commit like `chore: release v`
+
+Once the release preparion pull request got merged, run [Release package](.github/workflows/release.yml) workflow.
## Contributing
This is an open source project, and you are more than welcome to contribute :heart:!
-Every change must be submitted through a GitHub pull request (PR). Backporting uses continuous integration (CI). The CI runs checks against your branch after you submit the PR to ensure that your PR doesn’t introduce errors. If the CI identifies a potential problem, our friendly PR maintainers will help you resolve it.
+Every change must be submitted through a *GitHub* pull request (PR). Backporting uses continuous integration (CI). The CI runs checks against your branch after you submit the PR to ensure that your PR doesn’t introduce errors. If the CI identifies a potential problem, our friendly PR maintainers will help you resolve it.
> **Note**: this project follows [git-conventional-commits](https://gist.github.com/qoomon/5dfcdf8eec66a051ecd85625518cfd13) standards, thanks to the [commit-msg hook](./.husky/commit-msg) you are not allowed to use commits that do not follow those standards.
-1. Fork it (https://github.com/lampajr/backporting).
+1. Fork it (https://github.com/kiegroup/git-backporting).
2. Create your feature branch: (git checkout -b feature).
@@ -169,6 +320,8 @@ Every change must be submitted through a GitHub pull request (PR). Backporting u
> **Note**: you don't need to take care about typescript compilation and minifycation, there are automated [git hooks](./.husky) taking care of that!
+**Hint**: if you are still in a `work in progress` branch and you want to push your changes remotely, consider adding `--no-verify` for both `commit` and `push`, e.g., `git push origin --no-verify`
+
## License
-Backporting (BPer) open source project is licensed under the [MIT](./LICENSE) license.
\ No newline at end of file
+Git backporting open source project is licensed under the [MIT](./LICENSE) license.
diff --git a/action.yml b/action.yml
index e734ec4..d468e9e 100644
--- a/action.yml
+++ b/action.yml
@@ -1,35 +1,122 @@
name: "Backporting GitHub Action"
-description: "GitHub action providing an automated way to backport pull requests from one branch to another"
+description: GitHub action providing an automated way to backport pull requests from one branch to another
inputs:
+ pull-request:
+ description: >
+ URL of the pull request to backport, e.g., "https://github.com/kiegroup/git-backporting/pull/1"
+ required: false
+ target-branch:
+ description: >
+ Comma separated list of branches where the pull request must be backported to
+ required: false
+ target-branch-pattern:
+ description: >
+ Regular expression pattern to extract target branch(es) from pr labels.
+ The branches will be extracted from the pattern's required `target` named capturing group,
+ for instance "^backport (?([^ ]+))$"
+ required: false
+ config-file:
+ description: >
+ Path to a file containing the json configuration for this tool,
+ the object must match the Args interface
+ required: false
dry-run:
- description: "If enabled the tool does not create any pull request nor push anything remotely."
+ description: >
+ If enabled the tool does not create any pull request nor push anything remotely
required: false
default: "false"
auth:
- description: "GITHUB_TOKEN or a `repo` scoped Personal Access Token (PAT)."
+ description: >
+ GITHUB_TOKEN or a `repo` scoped Personal Access Token (PAT),
+ if not provided will look for existing env variables like GITHUB_TOKEN
default: ${{ github.token }}
required: false
- pull-request:
- description: "URL of the pull request to backport, e.g., https://github.com/lampajr/backporting/pull/1."
- required: true
- target-branch:
- description: "Branch where the pull request must be backported to."
- required: true
- title:
- description: "Backporting PR title. Default is the original PR title prefixed by the target branch."
+ git-client:
+ description: >
+ Git client type , if not set it is infered from pull-request
required: false
- body:
- description: "Backporting PR body. Default is the original PR body prefixed by `backport: `."
+ git-user:
+ description: Local git user name
+ default: "GitHub"
+ required: false
+ git-email:
+ description: Local git user email
+ default: "noreply@github.com"
+ required: false
+ title:
+ description: >
+ Backporting PR title. Default is the original PR title prefixed by the target branch
required: false
body-prefix:
- description: "Backporting PR body prefix. Default is `backport: `"
+ description: >
+ Backporting PR body prefix. Default is `Backport: `
+ required: false
+ body:
+ description: >
+ Backporting PR body. Default is the original PR body
required: false
bp-branch-name:
- description: "Backporting PR branch name. Default is auto-generated from commit."
+ description: >
+ Comma separated list of backporting PR branch names.
+ Default is auto-generated from commit and target branches
required: false
+ reviewers:
+ description: >
+ Comma separated list of reviewers for the backporting pull request
+ required: false
+ assignees:
+ description: >
+ Comma separated list of reviewers for the backporting pull request
+ required: false
+ no-inherit-reviewers:
+ description: >
+ Considered only if reviewers is empty, if true keep reviewers as empty list,
+ otherwise inherit from original pull request
+ required: false
+ default: "false"
+ labels:
+ description: >
+ Comma separated list of labels to be assigned to the backported pull request
+ required: false
+ inherit-labels:
+ description: >
+ If true the backported pull request will inherit labels from the original one
+ required: false
+ default: "false"
+ no-squash:
+ description: >
+ Backport all commits found in the pull request.
+ The default behavior is to only backport the first commit that was merged in the base branch.
+ required: false
+ auto-no-squash:
+ description: >
+ If the pull request was merged or is open, backport all commits.
+ If the pull request commits were squashed, backport the squashed commit.
+ required: false
+ strategy:
+ description: Cherry-pick merge strategy
+ required: false
+ default: "recursive"
+ strategy-option:
+ description: Cherry-pick merge strategy option
+ required: false
+ default: "theirs"
+ cherry-pick-options:
+ description: >
+ Additional cherry-pick options
+ required: false
+ comments:
+ description: >
+ Semicolon separated list of additional comments to be posted to the backported pull request
+ required: false
+ enable-err-notification:
+ description: >
+ If true, enable the error notification as comment on the original pull request
+ required: false
+ default: "false"
runs:
- using: node16
+ using: node20
main: dist/gha/index.js
branding:
diff --git a/dist/cli/index.js b/dist/cli/index.js
index 7467d3a..61bd8fd 100755
--- a/dist/cli/index.js
+++ b/dist/cli/index.js
@@ -22,44 +22,237 @@ runner.run();
/***/ }),
-/***/ 7938:
-/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
+/***/ 3025:
+/***/ ((__unused_webpack_module, exports) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
+/**
+ * Abstract arguments parser interface in charge to parse inputs and
+ * produce a common Args object
+ */
+class ArgsParser {
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ getOrDefault(parsedValue, defaultValue) {
+ return parsedValue === undefined ? defaultValue : parsedValue;
+ }
+ parse() {
+ const args = this.readArgs();
+ if (!args.pullRequest) {
+ throw new Error("Missing option: pull request must be provided");
+ }
+ // validate and fill with defaults
+ if ((!args.targetBranch || args.targetBranch.trim().length == 0) && !args.targetBranchPattern) {
+ throw new Error("Missing option: target branch(es) or target regular expression must be provided");
+ }
+ return {
+ pullRequest: args.pullRequest,
+ targetBranch: args.targetBranch,
+ targetBranchPattern: args.targetBranchPattern,
+ dryRun: this.getOrDefault(args.dryRun, false),
+ auth: this.getOrDefault(args.auth),
+ folder: this.getOrDefault(args.folder),
+ gitClient: this.getOrDefault(args.gitClient),
+ gitUser: this.getOrDefault(args.gitUser),
+ gitEmail: this.getOrDefault(args.gitEmail),
+ title: this.getOrDefault(args.title),
+ body: this.getOrDefault(args.body),
+ bodyPrefix: this.getOrDefault(args.bodyPrefix),
+ bpBranchName: this.getOrDefault(args.bpBranchName),
+ reviewers: this.getOrDefault(args.reviewers, []),
+ assignees: this.getOrDefault(args.assignees, []),
+ inheritReviewers: this.getOrDefault(args.inheritReviewers, true),
+ labels: this.getOrDefault(args.labels, []),
+ inheritLabels: this.getOrDefault(args.inheritLabels, false),
+ squash: this.getOrDefault(args.squash, true),
+ autoNoSquash: this.getOrDefault(args.autoNoSquash, false),
+ strategy: this.getOrDefault(args.strategy),
+ strategyOption: this.getOrDefault(args.strategyOption),
+ cherryPickOptions: this.getOrDefault(args.cherryPickOptions),
+ comments: this.getOrDefault(args.comments),
+ enableErrorNotification: this.getOrDefault(args.enableErrorNotification, false),
+ };
+ }
+}
+exports["default"] = ArgsParser;
+
+
+/***/ }),
+
+/***/ 8048:
+/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
+
+"use strict";
+
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ var desc = Object.getOwnPropertyDescriptor(m, k);
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+ desc = { enumerable: true, get: function() { return m[k]; } };
+ }
+ Object.defineProperty(o, k2, desc);
+}) : (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.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ __setModuleDefault(result, mod);
+ return result;
+};
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.getAsBooleanOrUndefined = exports.getAsSemicolonSeparatedList = exports.getAsCommaSeparatedList = exports.getAsCleanedCommaSeparatedList = exports.getOrUndefined = exports.readConfigFile = exports.parseArgs = void 0;
+const fs = __importStar(__nccwpck_require__(7147));
+/**
+ * Parse the input configuation string as json object and
+ * return it as Args
+ * @param configFileContent
+ * @returns {Args}
+ */
+function parseArgs(configFileContent) {
+ return JSON.parse(configFileContent);
+}
+exports.parseArgs = parseArgs;
+/**
+ * Read a configuration file in json format anf parse it as {Args}
+ * @param pathToFile Full path name of the config file, e.g., /tmp/dir/config-file.json
+ * @returns {Args}
+ */
+function readConfigFile(pathToFile) {
+ const asString = fs.readFileSync(pathToFile, "utf-8");
+ return parseArgs(asString);
+}
+exports.readConfigFile = readConfigFile;
+/**
+ * Return the input only if it is not a blank or null string, otherwise returns undefined
+ * @param key input key
+ * @returns the value or undefined
+ */
+function getOrUndefined(value) {
+ return value !== "" ? value : undefined;
+}
+exports.getOrUndefined = getOrUndefined;
+// get rid of inner spaces too
+function getAsCleanedCommaSeparatedList(value) {
+ // trim the value
+ const trimmed = value.trim();
+ return trimmed !== "" ? trimmed.replace(/\s/g, "").split(",") : undefined;
+}
+exports.getAsCleanedCommaSeparatedList = getAsCleanedCommaSeparatedList;
+// preserve inner spaces
+function getAsCommaSeparatedList(value) {
+ // trim the value
+ const trimmed = value.trim();
+ return trimmed !== "" ? trimmed.split(",").map(v => v.trim()) : undefined;
+}
+exports.getAsCommaSeparatedList = getAsCommaSeparatedList;
+function getAsSemicolonSeparatedList(value) {
+ // trim the value
+ const trimmed = value.trim();
+ return trimmed !== "" ? trimmed.split(";").map(v => v.trim()) : undefined;
+}
+exports.getAsSemicolonSeparatedList = getAsSemicolonSeparatedList;
+function getAsBooleanOrUndefined(value) {
+ const trimmed = value.trim();
+ return trimmed !== "" ? trimmed.toLowerCase() === "true" : undefined;
+}
+exports.getAsBooleanOrUndefined = getAsBooleanOrUndefined;
+
+
+/***/ }),
+
+/***/ 7938:
+/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
+
+"use strict";
+
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+const args_parser_1 = __importDefault(__nccwpck_require__(3025));
const commander_1 = __nccwpck_require__(4379);
const package_json_1 = __nccwpck_require__(6625);
-class CLIArgsParser {
+const args_utils_1 = __nccwpck_require__(8048);
+class CLIArgsParser extends args_parser_1.default {
getCommand() {
return new commander_1.Command(package_json_1.name)
.version(package_json_1.version)
.description(package_json_1.description)
- .requiredOption("-tb, --target-branch ", "branch where changes must be backported to.")
- .requiredOption("-pr, --pull-request ", "pull request url, e.g., https://github.com/lampajr/backporting/pull/1.")
- .option("-d, --dry-run", "if enabled the tool does not create any pull request nor push anything remotely", false)
- .option("-a, --auth ", "git service authentication string, e.g., github token.", "")
- .option("-f, --folder ", "local folder where the repo will be checked out, e.g., /tmp/folder.", undefined)
- .option("--title ", "backport pr title, default original pr title prefixed by target branch.", undefined)
- .option("--body ", "backport pr title, default original pr body prefixed by bodyPrefix.", undefined)
- .option("--body-prefix ", "backport pr body prefix, default `backport `.", undefined)
- .option("--bp-branch-name ", "backport pr branch name, default auto-generated by the commit.", undefined);
+ .option("-tb, --target-branch ", "comma separated list of branches where changes must be backported to")
+ .option("-tbp, --target-branch-pattern ", "regular expression pattern to extract target branch(es) from pr labels, the branches will be extracted from the pattern's required `target` named capturing group")
+ .option("-pr, --pull-request ", "pull request url, e.g., https://github.com/kiegroup/git-backporting/pull/1")
+ .option("-d, --dry-run", "if enabled the tool does not create any pull request nor push anything remotely")
+ .option("-a, --auth ", "git authentication string, if not provided fallback by looking for existing env variables like GITHUB_TOKEN")
+ .option("--git-client ", "git client type, if not set it is infered from --pull-request")
+ .option("-gu, --git-user ", "local git user name, default is 'GitHub'")
+ .option("-ge, --git-email ", "local git user email, default is 'noreply@github.com'")
+ .option("-f, --folder ", "local folder where the repo will be checked out, e.g., /tmp/folder")
+ .option("--title ", "backport pr title, default original pr title prefixed by target branch")
+ .option("--body ", "backport pr title, default original pr body prefixed by bodyPrefix")
+ .option("--body-prefix ", "backport pr body prefix, default `backport `")
+ .option("--bp-branch-name ", "comma separated list of backport pr branch names, default auto-generated by the commit and target branch")
+ .option("--reviewers ", "comma separated list of reviewers for the backporting pull request", args_utils_1.getAsCleanedCommaSeparatedList)
+ .option("--assignees ", "comma separated list of assignees for the backporting pull request", args_utils_1.getAsCleanedCommaSeparatedList)
+ .option("--no-inherit-reviewers", "if provided and reviewers option is empty then inherit them from original pull request")
+ .option("--labels ", "comma separated list of labels to be assigned to the backported pull request", args_utils_1.getAsCommaSeparatedList)
+ .option("--inherit-labels", "if true the backported pull request will inherit labels from the original one")
+ .option("--no-squash", "backport all commits found in the pull request. The default behavior is to only backport the first commit that was merged in the base branch")
+ .option("--auto-no-squash", "if the pull request was merged or is open, backport all commits. If the pull request commits were squashed, backport the squashed commit.")
+ .option("--strategy ", "cherry-pick merge strategy, default to 'recursive'", undefined)
+ .option("--strategy-option ", "cherry-pick merge strategy option, default to 'theirs'")
+ .option("--cherry-pick-options ", "additional cherry-pick options")
+ .option("--comments ", "semicolon separated list of additional comments to be posted to the backported pull request", args_utils_1.getAsSemicolonSeparatedList)
+ .option("--enable-err-notification", "if true, enable the error notification as comment on the original pull request")
+ .option("-cf, --config-file ", "configuration file containing all valid options, the json must match Args interface");
}
- parse() {
+ readArgs() {
const opts = this.getCommand()
.parse()
.opts();
- return {
- dryRun: opts.dryRun,
- auth: opts.auth,
- pullRequest: opts.pullRequest,
- targetBranch: opts.targetBranch,
- folder: opts.folder,
- title: opts.title,
- body: opts.body,
- bodyPrefix: opts.bodyPrefix,
- bpBranchName: opts.bpBranchName,
- };
+ let args;
+ if (opts.configFile) {
+ // if config file is set ignore all other options
+ args = (0, args_utils_1.readConfigFile)(opts.configFile);
+ }
+ else {
+ args = {
+ dryRun: opts.dryRun,
+ auth: opts.auth,
+ pullRequest: opts.pullRequest,
+ targetBranch: opts.targetBranch,
+ targetBranchPattern: opts.targetBranchPattern,
+ folder: opts.folder,
+ gitClient: opts.gitClient,
+ gitUser: opts.gitUser,
+ gitEmail: opts.gitEmail,
+ title: opts.title,
+ body: opts.body,
+ bodyPrefix: opts.bodyPrefix,
+ bpBranchName: opts.bpBranchName,
+ reviewers: opts.reviewers,
+ assignees: opts.assignees,
+ inheritReviewers: opts.inheritReviewers,
+ labels: opts.labels,
+ inheritLabels: opts.inheritLabels,
+ squash: opts.squash,
+ autoNoSquash: opts.autoNoSquash,
+ strategy: opts.strategy,
+ strategyOption: opts.strategyOption,
+ cherryPickOptions: opts.cherryPickOptions,
+ comments: opts.comments,
+ enableErrorNotification: opts.enableErrNotification,
+ };
+ }
+ return args;
}
}
exports["default"] = CLIArgsParser;
@@ -90,11 +283,11 @@ class ConfigsParser {
// apply validation, throw errors if something is wrong
// if pr is opened check if the there exists one single commit
if (configs.originalPullRequest.state == "open") {
- this.logger.warn("Trying to backport an open pull request!");
+ this.logger.warn("Trying to backport an open pull request");
}
- // if PR is closed and not merged log a warning
+ // if PR is closed and not merged throw an error
if (configs.originalPullRequest.state == "closed" && !configs.originalPullRequest.merged) {
- throw new Error("Provided pull request is closed and not merged!");
+ throw new Error("Provided pull request is closed and not merged");
}
return Promise.resolve(configs);
}
@@ -102,6 +295,30 @@ class ConfigsParser {
exports["default"] = ConfigsParser;
+/***/ }),
+
+/***/ 4753:
+/***/ ((__unused_webpack_module, exports) => {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.AuthTokenId = exports.MESSAGE_TARGET_BRANCH_PLACEHOLDER = exports.MESSAGE_ERROR_PLACEHOLDER = void 0;
+exports.MESSAGE_ERROR_PLACEHOLDER = "{{error}}";
+exports.MESSAGE_TARGET_BRANCH_PLACEHOLDER = "{{target-branch}}";
+var AuthTokenId;
+(function (AuthTokenId) {
+ // github specific token
+ AuthTokenId["GITHUB_TOKEN"] = "GITHUB_TOKEN";
+ // gitlab specific token
+ AuthTokenId["GITLAB_TOKEN"] = "GITLAB_TOKEN";
+ // codeberg specific token
+ AuthTokenId["CODEBERG_TOKEN"] = "CODEBERG_TOKEN";
+ // generic git token
+ AuthTokenId["GIT_TOKEN"] = "GIT_TOKEN";
+})(AuthTokenId = exports.AuthTokenId || (exports.AuthTokenId = {}));
+
+
/***/ }),
/***/ 6618:
@@ -113,29 +330,92 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
+const args_utils_1 = __nccwpck_require__(8048);
const configs_parser_1 = __importDefault(__nccwpck_require__(5799));
-const git_service_factory_1 = __importDefault(__nccwpck_require__(5107));
+const configs_types_1 = __nccwpck_require__(4753);
+const git_client_factory_1 = __importDefault(__nccwpck_require__(8550));
class PullRequestConfigsParser extends configs_parser_1.default {
constructor() {
super();
- this.gitService = git_service_factory_1.default.getService();
+ this.gitClient = git_client_factory_1.default.getClient();
}
async parse(args) {
- const pr = await this.gitService.getPullRequestFromUrl(args.pullRequest);
+ let pr;
+ if (args.autoNoSquash) {
+ args.squash = undefined;
+ }
+ try {
+ pr = await this.gitClient.getPullRequestFromUrl(args.pullRequest, args.squash);
+ }
+ catch (error) {
+ this.logger.error("Something went wrong retrieving pull request");
+ throw error;
+ }
const folder = args.folder ?? this.getDefaultFolder();
+ let targetBranches = [];
+ if (args.targetBranchPattern) {
+ // parse labels to extract target branch(es)
+ targetBranches = this.getTargetBranchesFromLabels(args.targetBranchPattern, pr.labels);
+ if (targetBranches.length === 0) {
+ throw new Error(`Unable to extract target branches with regular expression "${args.targetBranchPattern}"`);
+ }
+ }
+ else {
+ // target branch must be provided if targetRegExp is missing
+ targetBranches = [...new Set((0, args_utils_1.getAsCommaSeparatedList)(args.targetBranch))];
+ }
+ const bpBranchNames = [...new Set(args.bpBranchName ? ((0, args_utils_1.getAsCleanedCommaSeparatedList)(args.bpBranchName) ?? []) : [])];
+ if (bpBranchNames.length > 1 && bpBranchNames.length != targetBranches.length) {
+ throw new Error(`The number of backport branch names, if provided, must match the number of target branches or just one, provided ${bpBranchNames.length} branch names instead`);
+ }
return {
dryRun: args.dryRun,
auth: args.auth,
- author: args.author ?? pr.author,
folder: `${folder.startsWith("/") ? "" : process.cwd() + "/"}${args.folder ?? this.getDefaultFolder()}`,
- targetBranch: args.targetBranch,
+ mergeStrategy: args.strategy,
+ mergeStrategyOption: args.strategyOption,
+ cherryPickOptions: args.cherryPickOptions,
originalPullRequest: pr,
- backportPullRequest: this.getDefaultBackportPullRequest(pr, args)
+ backportPullRequests: this.generateBackportPullRequestsData(pr, args, targetBranches, bpBranchNames),
+ git: {
+ user: args.gitUser ?? this.gitClient.getDefaultGitUser(),
+ email: args.gitEmail ?? this.gitClient.getDefaultGitEmail(),
+ },
+ errorNotification: {
+ enabled: args.enableErrorNotification ?? false,
+ message: this.getDefaultErrorComment(),
+ },
};
}
getDefaultFolder() {
return "bp";
}
+ getDefaultErrorComment() {
+ // TODO: fetch from arg or set default with placeholder {{error}}
+ return `The backport to \`${configs_types_1.MESSAGE_TARGET_BRANCH_PLACEHOLDER}\` failed. Check the latest run for more details.`;
+ }
+ /**
+ * Parse the provided labels and return a list of target branches
+ * obtained by applying the provided pattern as regular expression extractor
+ * @param pattern reg exp pattern to extract target branch from label name
+ * @param labels list of labels to check
+ * @returns list of target branches
+ */
+ getTargetBranchesFromLabels(pattern, labels) {
+ this.logger.debug(`Extracting branches from [${labels}] using ${pattern}`);
+ const regExp = new RegExp(pattern);
+ const branches = [];
+ for (const l of labels) {
+ const result = regExp.exec(l);
+ if (result?.groups) {
+ const { target } = result.groups;
+ if (target) {
+ branches.push(target);
+ }
+ }
+ }
+ return [...new Set(branches)];
+ }
/**
* Create a backport pull request starting from the target branch and
* the original pr to be backported
@@ -143,25 +423,52 @@ class PullRequestConfigsParser extends configs_parser_1.default {
* @param targetBranch target branch where the backport should be applied
* @returns {GitPullRequest}
*/
- getDefaultBackportPullRequest(originalPullRequest, args) {
- const reviewers = [];
- reviewers.push(originalPullRequest.author);
- if (originalPullRequest.mergedBy) {
- reviewers.push(originalPullRequest.mergedBy);
+ generateBackportPullRequestsData(originalPullRequest, args, targetBranches, bpBranchNames) {
+ const reviewers = args.reviewers ?? [];
+ if (reviewers.length == 0 && args.inheritReviewers) {
+ // inherit only if args.reviewers is empty and args.inheritReviewers set to true
+ reviewers.push(originalPullRequest.author);
+ if (originalPullRequest.mergedBy) {
+ reviewers.push(originalPullRequest.mergedBy);
+ }
}
const bodyPrefix = args.bodyPrefix ?? `**Backport:** ${originalPullRequest.htmlUrl}\r\n\r\n`;
- const body = args.body ?? `${originalPullRequest.body}\r\n\r\nPowered by [BPer](https://github.com/lampajr/backporting).`;
- return {
- author: originalPullRequest.author,
- title: args.title ?? `[${args.targetBranch}] ${originalPullRequest.title}`,
- body: `${bodyPrefix}${body}`,
- reviewers: [...new Set(reviewers)],
- targetRepo: originalPullRequest.targetRepo,
- sourceRepo: originalPullRequest.targetRepo,
- branchName: args.bpBranchName,
- nCommits: 0,
- commits: [] // TODO needed?
- };
+ const body = bodyPrefix + (args.body ?? `${originalPullRequest.body}`);
+ const labels = args.labels ?? [];
+ if (args.inheritLabels) {
+ labels.push(...originalPullRequest.labels);
+ }
+ return targetBranches.map((tb, idx) => {
+ // if there multiple branch names take the corresponding one, otherwise get the the first one if it exists
+ let backportBranch = bpBranchNames.length > 1 ? bpBranchNames[idx] : bpBranchNames[0];
+ if (backportBranch === undefined || backportBranch.trim() === "") {
+ // for each commit takes the first 7 chars that are enough to uniquely identify them in most of the projects
+ const concatenatedCommits = originalPullRequest.commits.map(c => c.slice(0, 7)).join("-");
+ backportBranch = `bp-${tb}-${concatenatedCommits}`;
+ }
+ else if (bpBranchNames.length == 1 && targetBranches.length > 1) {
+ // multiple targets and single custom backport branch name we need to differentiate branch names
+ // so append "-${tb}" to the provided name
+ backportBranch = backportBranch + `-${tb}`;
+ }
+ if (backportBranch.length > 250) {
+ this.logger.warn(`Backport branch (length=${backportBranch.length}) exceeded the max length of 250 chars, branch name truncated!`);
+ backportBranch = backportBranch.slice(0, 250);
+ }
+ return {
+ owner: originalPullRequest.targetRepo.owner,
+ repo: originalPullRequest.targetRepo.project,
+ head: backportBranch,
+ base: tb,
+ title: args.title ?? `[${tb}] ${originalPullRequest.title}`,
+ // preserve new line chars
+ body: body.replace(/\\n/g, "\n").replace(/\\r/g, "\r"),
+ reviewers: [...new Set(reviewers)],
+ assignees: [...new Set(args.assignees)],
+ labels: [...new Set(labels)],
+ comments: args.comments?.map(c => c.replace(/\\n/g, "\n").replace(/\\r/g, "\r")) ?? [],
+ };
+ });
}
}
exports["default"] = PullRequestConfigsParser;
@@ -185,10 +492,10 @@ const fs_1 = __importDefault(__nccwpck_require__(7147));
* Command line git commands executor service
*/
class GitCLIService {
- constructor(auth, author) {
+ constructor(auth, gitData) {
this.logger = logger_service_factory_1.default.getLogger();
this.auth = auth;
- this.author = author;
+ this.gitData = gitData;
}
/**
* Return a pre-configured SimpleGit instance able to execute commands from current
@@ -198,15 +505,16 @@ class GitCLIService {
*/
git(cwd) {
const gitConfig = { ...(cwd ? { baseDir: cwd } : {}) };
- return (0, simple_git_1.default)(gitConfig).addConfig("user.name", this.author).addConfig("user.email", "noreply@github.com");
+ return (0, simple_git_1.default)(gitConfig).addConfig("user.name", this.gitData.user).addConfig("user.email", this.gitData.email);
}
/**
* Update the provided remote URL by adding the auth token if not empty
- * @param remoteURL remote link, e.g., https://github.com/lampajr/backporting-example.git
+ * @param remoteURL remote link, e.g., https://github.com/kiegroup/git-backporting-example.git
*/
remoteWithAuth(remoteURL) {
- if (this.auth && this.author) {
- return remoteURL.replace("://", `://${this.author}:${this.auth}@`);
+ if (this.auth) {
+ // Anything will work as a username.
+ return remoteURL.replace("://", `://token:${this.auth}@`);
}
// return remote as it is
return remoteURL;
@@ -227,13 +535,22 @@ class GitCLIService {
* @param branch branch which should be cloned
*/
async clone(from, to, branch) {
- this.logger.info(`Cloning repository ${from} to ${to}.`);
+ this.logger.info(`Cloning repository ${from} to ${to}`);
if (!fs_1.default.existsSync(to)) {
await (0, simple_git_1.default)().clone(this.remoteWithAuth(from), to, ["--quiet", "--shallow-submodules", "--no-tags", "--branch", branch]);
+ return;
}
- else {
- this.logger.warn(`Folder ${to} already exist. Won't clone`);
+ this.logger.info(`Folder ${to} already exist. Won't clone`);
+ // ensure the working tree is properly reset - no stale changes
+ // from previous (failed) backport
+ const ongoingCherryPick = await this.anyConflict(to);
+ if (ongoingCherryPick) {
+ this.logger.warn("Found previously failed cherry-pick, aborting it");
+ await this.git(to).raw(["cherry-pick", "--abort"]);
}
+ // checkout to the proper branch
+ this.logger.info(`Checking out branch ${branch}`);
+ await this.git(to).checkout(branch);
}
/**
* Create a new branch starting from the current one and checkout in it
@@ -241,7 +558,7 @@ class GitCLIService {
* @param newBranch new branch name
*/
async createLocalBranch(cwd, newBranch) {
- this.logger.info(`Creating branch ${newBranch}.`);
+ this.logger.info(`Creating branch ${newBranch}`);
await this.git(cwd).checkoutLocalBranch(newBranch);
}
/**
@@ -251,7 +568,7 @@ class GitCLIService {
* @param remoteName [optional] name of the remote, by default 'fork' is used
*/
async addRemote(cwd, remote, remoteName = "fork") {
- this.logger.info(`Adding new remote ${remote}.`);
+ this.logger.info(`Adding new remote ${remote}`);
await this.git(cwd).addRemote(remoteName, this.remoteWithAuth(remote));
}
/**
@@ -261,7 +578,7 @@ class GitCLIService {
* @param remote [optional] the remote to fetch, by default origin
*/
async fetch(cwd, branch, remote = "origin") {
- this.logger.info(`Fetching ${remote} ${branch}.`);
+ this.logger.info(`Fetching ${remote} ${branch}`);
await this.git(cwd).fetch(remote, branch, ["--quiet"]);
}
/**
@@ -269,9 +586,38 @@ class GitCLIService {
* @param cwd repository in which the sha should be cherry picked to
* @param sha commit sha
*/
- async cherryPick(cwd, sha) {
- this.logger.info(`Cherry picking ${sha}.`);
- await this.git(cwd).raw(["cherry-pick", "-m", "1", "--strategy=recursive", "--strategy-option=theirs", sha]);
+ async cherryPick(cwd, sha, strategy = "recursive", strategyOption = "theirs", cherryPickOptions) {
+ this.logger.info(`Cherry picking ${sha}`);
+ let options = ["cherry-pick", "-m", "1", `--strategy=${strategy}`, `--strategy-option=${strategyOption}`];
+ if (cherryPickOptions !== undefined) {
+ options = options.concat(cherryPickOptions.split(" "));
+ }
+ options.push(sha);
+ this.logger.debug(`Cherry picking command git ${options}`);
+ try {
+ await this.git(cwd).raw(options);
+ }
+ catch (error) {
+ const diff = await this.git(cwd).diff();
+ if (diff) {
+ throw new Error(`${error}\r\nShowing git diff:\r\n` + diff);
+ }
+ throw error;
+ }
+ }
+ /**
+ * Check whether there are some conflicts in the current working directory
+ * which means there is an ongoing cherry-pick that did not complete successfully
+ * @param cwd repository in which the check should be performed
+ * @return true if there is some conflict, false otherwise
+ */
+ async anyConflict(cwd) {
+ const status = await this.git(cwd).status();
+ if (status.conflicted.length > 0) {
+ this.logger.debug(`Found conflicts in branch ${status.current}`);
+ return true;
+ }
+ return false;
}
/**
* Push a branch to a remote
@@ -280,7 +626,7 @@ class GitCLIService {
* @param remote [optional] remote to which the branch should be pushed to, by default 'origin'
*/
async push(cwd, branch, remote = "origin", force = false) {
- this.logger.info(`Pushing ${branch} to ${remote}.`);
+ this.logger.info(`Pushing ${branch} to ${remote}`);
const options = ["--quiet"];
if (force) {
options.push("--force-with-lease");
@@ -293,7 +639,7 @@ exports["default"] = GitCLIService;
/***/ }),
-/***/ 5107:
+/***/ 8550:
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
"use strict";
@@ -303,39 +649,170 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
const git_types_1 = __nccwpck_require__(750);
-const github_service_1 = __importDefault(__nccwpck_require__(944));
+const github_client_1 = __importDefault(__nccwpck_require__(4628));
const logger_service_factory_1 = __importDefault(__nccwpck_require__(8936));
+const gitlab_client_1 = __importDefault(__nccwpck_require__(4077));
/**
* Singleton git service factory class
*/
-class GitServiceFactory {
- static getService() {
- if (!GitServiceFactory.instance) {
- throw new Error("You must call `init` method first!");
+class GitClientFactory {
+ // this method assumes there already exists a singleton client instance, otherwise it will fail
+ static getClient() {
+ if (!GitClientFactory.instance) {
+ throw new Error("You must call `getOrCreate` method first");
}
- return GitServiceFactory.instance;
+ return GitClientFactory.instance;
}
/**
* Initialize the singleton git management service
* @param type git management service type
- * @param auth authentication, like github token
+ * @param authToken authentication token, like github/gitlab token
*/
- static init(type, auth) {
- if (GitServiceFactory.instance) {
- GitServiceFactory.logger.warn("Git service already initialized!");
- return;
+ static getOrCreate(type, authToken, apiUrl) {
+ if (GitClientFactory.instance) {
+ GitClientFactory.logger.warn("Git service already initialized");
+ return GitClientFactory.instance;
}
+ this.logger.debug(`Setting up ${type} client: apiUrl=${apiUrl}, token=****`);
switch (type) {
- case git_types_1.GitServiceType.GITHUB:
- GitServiceFactory.instance = new github_service_1.default(auth);
+ case git_types_1.GitClientType.GITHUB:
+ GitClientFactory.instance = new github_client_1.default(authToken, apiUrl);
+ break;
+ case git_types_1.GitClientType.GITLAB:
+ GitClientFactory.instance = new gitlab_client_1.default(authToken, apiUrl);
+ break;
+ case git_types_1.GitClientType.CODEBERG:
+ GitClientFactory.instance = new github_client_1.default(authToken, apiUrl, true);
break;
default:
throw new Error(`Invalid git service type received: ${type}`);
}
+ return GitClientFactory.instance;
+ }
+ // this is used for testing purposes
+ static reset() {
+ GitClientFactory.logger.warn("Resetting git service");
+ GitClientFactory.instance = undefined;
}
}
-exports["default"] = GitServiceFactory;
-GitServiceFactory.logger = logger_service_factory_1.default.getLogger();
+exports["default"] = GitClientFactory;
+GitClientFactory.logger = logger_service_factory_1.default.getLogger();
+
+
+/***/ }),
+
+/***/ 9080:
+/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
+
+"use strict";
+
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.getEnv = exports.getGitTokenFromEnv = exports.inferSquash = exports.inferGitApiUrl = exports.inferGitClient = void 0;
+const logger_service_factory_1 = __importDefault(__nccwpck_require__(8936));
+const git_types_1 = __nccwpck_require__(750);
+const configs_types_1 = __nccwpck_require__(4753);
+const PUBLIC_GITHUB_URL = "https://github.com";
+const PUBLIC_GITHUB_API = "https://api.github.com";
+/**
+ * Infer the remote GIT service to interact with based on the provided
+ * pull request URL
+ * @param prUrl provided pull request URL
+ * @returns {GitClientType}
+ */
+const inferGitClient = (prUrl) => {
+ const stdPrUrl = prUrl.toLowerCase().trim();
+ if (stdPrUrl.includes(git_types_1.GitClientType.GITHUB.toString())) {
+ return git_types_1.GitClientType.GITHUB;
+ }
+ else if (stdPrUrl.includes(git_types_1.GitClientType.GITLAB.toString())) {
+ return git_types_1.GitClientType.GITLAB;
+ }
+ else if (stdPrUrl.includes(git_types_1.GitClientType.CODEBERG.toString())) {
+ return git_types_1.GitClientType.CODEBERG;
+ }
+ throw new Error(`Remote git service not recognized from pr url: ${prUrl}`);
+};
+exports.inferGitClient = inferGitClient;
+/**
+ * Infer the host git service from the pull request url
+ * @param prUrl pull/merge request url
+ * @param apiVersion the api version, ignored in case of public github
+ * @returns api URL like https://api.github.com or https://gitlab.com/api/v4
+ */
+const inferGitApiUrl = (prUrl, apiVersion = "v4") => {
+ const url = new URL(prUrl);
+ const baseUrl = `${url.protocol}//${url.host}`;
+ if (baseUrl.includes(PUBLIC_GITHUB_URL) || baseUrl.includes(PUBLIC_GITHUB_API)) {
+ return PUBLIC_GITHUB_API;
+ }
+ return `${baseUrl}/api/${apiVersion}`;
+};
+exports.inferGitApiUrl = inferGitApiUrl;
+/**
+ * Infer the value of the squash option
+ * @param open true if the pull/merge request is still open
+ * @param squash_commit undefined or null if the pull/merge request was merged, the sha of the squashed commit if it was squashed
+ * @returns true if a single commit must be cherry-picked, false if all merged commits must be cherry-picked
+ */
+const inferSquash = (open, squash_commit) => {
+ const logger = logger_service_factory_1.default.getLogger();
+ if (open) {
+ logger.debug("cherry-pick all commits because they have not been merged (or squashed) in the base branch yet");
+ return false;
+ }
+ else {
+ if (squash_commit) {
+ logger.debug(`cherry-pick the squashed commit ${squash_commit}`);
+ return true;
+ }
+ else {
+ logger.debug("cherry-pick the merged commit(s)");
+ return false;
+ }
+ }
+};
+exports.inferSquash = inferSquash;
+/**
+ * Retrieve the git token from env variable, the default is taken from GIT_TOKEN env.
+ * All specific git env variable have precedence and override the default one.
+ * @param gitType
+ * @returns tuple where
+ * - the first element is the corresponding env value
+ * - the second element is true if the value is not undefined nor empty
+ */
+const getGitTokenFromEnv = (gitType) => {
+ let [token] = (0, exports.getEnv)(configs_types_1.AuthTokenId.GIT_TOKEN);
+ let [specToken, specOk] = [undefined, false];
+ if (git_types_1.GitClientType.GITHUB == gitType) {
+ [specToken, specOk] = (0, exports.getEnv)(configs_types_1.AuthTokenId.GITHUB_TOKEN);
+ }
+ else if (git_types_1.GitClientType.GITLAB == gitType) {
+ [specToken, specOk] = (0, exports.getEnv)(configs_types_1.AuthTokenId.GITLAB_TOKEN);
+ }
+ else if (git_types_1.GitClientType.CODEBERG == gitType) {
+ [specToken, specOk] = (0, exports.getEnv)(configs_types_1.AuthTokenId.CODEBERG_TOKEN);
+ }
+ if (specOk) {
+ token = specToken;
+ }
+ return token;
+};
+exports.getGitTokenFromEnv = getGitTokenFromEnv;
+/**
+ * Get process env variable given the input key string
+ * @param key
+ * @returns tuple where
+ * - the first element is the corresponding env value
+ * - the second element is true if the value is not undefined nor empty
+ */
+const getEnv = (key) => {
+ const val = process.env[key];
+ return [val, val !== undefined && val !== ""];
+};
+exports.getEnv = getEnv;
/***/ }),
@@ -346,56 +823,25 @@ GitServiceFactory.logger = logger_service_factory_1.default.getLogger();
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.GitServiceType = void 0;
-var GitServiceType;
-(function (GitServiceType) {
- GitServiceType["GITHUB"] = "github";
-})(GitServiceType = exports.GitServiceType || (exports.GitServiceType = {}));
+exports.GitRepoState = exports.GitClientType = void 0;
+var GitClientType;
+(function (GitClientType) {
+ GitClientType["GITHUB"] = "github";
+ GitClientType["GITLAB"] = "gitlab";
+ GitClientType["CODEBERG"] = "codeberg";
+})(GitClientType = exports.GitClientType || (exports.GitClientType = {}));
+var GitRepoState;
+(function (GitRepoState) {
+ GitRepoState["OPEN"] = "open";
+ GitRepoState["CLOSED"] = "closed";
+ GitRepoState["LOCKED"] = "locked";
+ GitRepoState["MERGED"] = "merged";
+})(GitRepoState = exports.GitRepoState || (exports.GitRepoState = {}));
/***/ }),
-/***/ 5764:
-/***/ ((__unused_webpack_module, exports) => {
-
-"use strict";
-
-Object.defineProperty(exports, "__esModule", ({ value: true }));
-class GitHubMapper {
- mapPullRequest(pr) {
- return {
- number: pr.number,
- author: pr.user.login,
- url: pr.url,
- htmlUrl: pr.html_url,
- title: pr.title,
- body: pr.body ?? "",
- state: pr.state,
- merged: pr.merged ?? false,
- mergedBy: pr.merged_by?.login,
- reviewers: pr.requested_reviewers.filter(r => "login" in r).map((r => r?.login)),
- sourceRepo: {
- owner: pr.head.repo.full_name.split("/")[0],
- project: pr.head.repo.full_name.split("/")[1],
- cloneUrl: pr.head.repo.clone_url
- },
- targetRepo: {
- owner: pr.base.repo.full_name.split("/")[0],
- project: pr.base.repo.full_name.split("/")[1],
- cloneUrl: pr.base.repo.clone_url
- },
- nCommits: pr.commits,
- // if pr is open use latest commit sha otherwise use merge_commit_sha
- commits: pr.state === "open" ? [pr.head.sha] : [pr.merge_commit_sha]
- };
- }
-}
-exports["default"] = GitHubMapper;
-
-
-/***/ }),
-
-/***/ 944:
+/***/ 4628:
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
"use strict";
@@ -404,32 +850,80 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
+const git_util_1 = __nccwpck_require__(9080);
+const git_types_1 = __nccwpck_require__(750);
const github_mapper_1 = __importDefault(__nccwpck_require__(5764));
const octokit_factory_1 = __importDefault(__nccwpck_require__(4257));
const logger_service_factory_1 = __importDefault(__nccwpck_require__(8936));
-class GitHubService {
- constructor(token) {
+class GitHubClient {
+ constructor(token, apiUrl, isForCodeberg = false) {
+ this.apiUrl = apiUrl;
+ this.isForCodeberg = isForCodeberg;
this.logger = logger_service_factory_1.default.getLogger();
- this.octokit = octokit_factory_1.default.getOctokit(token);
+ this.octokit = octokit_factory_1.default.getOctokit(token, this.apiUrl);
this.mapper = new github_mapper_1.default();
}
+ getClientType() {
+ return this.isForCodeberg ? git_types_1.GitClientType.CODEBERG : git_types_1.GitClientType.GITHUB;
+ }
// READ
- async getPullRequest(owner, repo, prNumber) {
- this.logger.info(`Getting pull request ${owner}/${repo}/${prNumber}.`);
+ getDefaultGitUser() {
+ return this.apiUrl.includes(git_types_1.GitClientType.CODEBERG.toString()) ? "Codeberg" : "GitHub";
+ }
+ getDefaultGitEmail() {
+ return "noreply@github.com";
+ }
+ async getPullRequest(owner, repo, prNumber, squash) {
+ this.logger.debug(`Fetching pull request ${owner}/${repo}/${prNumber}`);
const { data } = await this.octokit.rest.pulls.get({
owner: owner,
repo: repo,
- pull_number: prNumber
+ pull_number: prNumber,
});
- return this.mapper.mapPullRequest(data);
+ if (squash === undefined) {
+ let commit_sha = undefined;
+ const open = data.state == "open";
+ if (!open) {
+ const commit = await this.octokit.rest.git.getCommit({
+ owner: owner,
+ repo: repo,
+ commit_sha: data.merge_commit_sha,
+ });
+ if (commit.data.parents.length === 1) {
+ commit_sha = data.merge_commit_sha;
+ }
+ }
+ squash = (0, git_util_1.inferSquash)(open, commit_sha);
+ }
+ const commits = [];
+ if (!squash) {
+ // fetch all commits
+ try {
+ const { data } = await this.octokit.rest.pulls.listCommits({
+ owner: owner,
+ repo: repo,
+ pull_number: prNumber,
+ });
+ commits.push(...data.map(c => c.sha));
+ if (this.isForCodeberg) {
+ // For some reason, even though Codeberg advertises API compatibility
+ // with GitHub, it returns commits in reversed order.
+ commits.reverse();
+ }
+ }
+ catch (error) {
+ throw new Error(`Failed to retrieve commits for pull request n. ${prNumber}`);
+ }
+ }
+ return this.mapper.mapPullRequest(data, commits);
}
- async getPullRequestFromUrl(prUrl) {
- const { owner, project } = this.getRepositoryFromPrUrl(prUrl);
- return this.getPullRequest(owner, project, parseInt(prUrl.substring(prUrl.lastIndexOf("/") + 1, prUrl.length)));
+ async getPullRequestFromUrl(prUrl, squash) {
+ const { owner, project, id } = this.extractPullRequestData(prUrl);
+ return this.getPullRequest(owner, project, id, squash);
}
// WRITE
async createPullRequest(backport) {
- this.logger.info(`Creating pull request ${backport.head} -> ${backport.base}.`);
+ this.logger.info(`Creating pull request ${backport.head} -> ${backport.base}`);
this.logger.info(`${JSON.stringify(backport, null, 2)}`);
const { data } = await this.octokit.pulls.create({
owner: backport.owner,
@@ -437,21 +931,68 @@ class GitHubService {
head: backport.head,
base: backport.base,
title: backport.title,
- body: backport.body
+ body: backport.body,
});
+ if (!data) {
+ throw new Error("Pull request creation failed");
+ }
+ const promises = [];
+ if (backport.labels.length > 0) {
+ promises.push(this.octokit.issues.addLabels({
+ owner: backport.owner,
+ repo: backport.repo,
+ issue_number: data.number,
+ labels: backport.labels,
+ }).catch(error => this.logger.error(`Error setting labels: ${error}`)));
+ }
if (backport.reviewers.length > 0) {
- try {
- await this.octokit.pulls.requestReviewers({
+ promises.push(this.octokit.pulls.requestReviewers({
+ owner: backport.owner,
+ repo: backport.repo,
+ pull_number: data.number,
+ reviewers: backport.reviewers,
+ }).catch(error => this.logger.error(`Error requesting reviewers: ${error}`)));
+ }
+ if (backport.assignees.length > 0) {
+ promises.push(this.octokit.issues.addAssignees({
+ owner: backport.owner,
+ repo: backport.repo,
+ issue_number: data.number,
+ assignees: backport.assignees,
+ }).catch(error => this.logger.error(`Error setting assignees: ${error}`)));
+ }
+ if (backport.comments.length > 0) {
+ backport.comments.forEach(c => {
+ promises.push(this.octokit.issues.createComment({
owner: backport.owner,
repo: backport.repo,
- pull_number: data.number,
- reviewers: backport.reviewers
- });
- }
- catch (error) {
- this.logger.error(`Error requesting reviewers: ${error}`);
- }
+ issue_number: data.number,
+ body: c,
+ }).catch(error => this.logger.error(`Error posting comment: ${error}`)));
+ });
}
+ await Promise.all(promises);
+ return data.html_url;
+ }
+ async createPullRequestComment(prUrl, comment) {
+ let commentUrl = undefined;
+ try {
+ const { owner, project, id } = this.extractPullRequestData(prUrl);
+ const { data } = await this.octokit.issues.createComment({
+ owner: owner,
+ repo: project,
+ issue_number: id,
+ body: comment
+ });
+ if (!data) {
+ throw new Error("Pull request comment creation failed");
+ }
+ commentUrl = data.url;
+ }
+ catch (error) {
+ this.logger.error(`Error creating comment on pull request ${prUrl}: ${error}`);
+ }
+ return commentUrl;
}
// UTILS
/**
@@ -459,15 +1000,77 @@ class GitHubService {
* @param prUrl pull request url
* @returns {{owner: string, project: string}}
*/
- getRepositoryFromPrUrl(prUrl) {
+ extractPullRequestData(prUrl) {
const elems = prUrl.split("/");
return {
owner: elems[elems.length - 4],
- project: elems[elems.length - 3]
+ project: elems[elems.length - 3],
+ id: parseInt(prUrl.substring(prUrl.lastIndexOf("/") + 1, prUrl.length)),
};
}
}
-exports["default"] = GitHubService;
+exports["default"] = GitHubClient;
+
+
+/***/ }),
+
+/***/ 5764:
+/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+const git_types_1 = __nccwpck_require__(750);
+class GitHubMapper {
+ mapGitState(state) {
+ switch (state) {
+ case "open":
+ return git_types_1.GitRepoState.OPEN;
+ default:
+ return git_types_1.GitRepoState.CLOSED;
+ }
+ }
+ async mapPullRequest(pr, commits) {
+ return {
+ number: pr.number,
+ author: pr.user.login,
+ url: pr.url,
+ htmlUrl: pr.html_url,
+ title: pr.title,
+ body: pr.body ?? "",
+ state: this.mapGitState(pr.state),
+ merged: pr.merged ?? false,
+ mergedBy: pr.merged_by?.login,
+ reviewers: pr.requested_reviewers?.filter(r => r && "login" in r).map((r => r?.login)) ?? [],
+ assignees: pr.assignees?.filter(r => r && "login" in r).map(r => r.login) ?? [],
+ labels: pr.labels?.map(l => l.name) ?? [],
+ sourceRepo: await this.mapSourceRepo(pr),
+ targetRepo: await this.mapTargetRepo(pr),
+ nCommits: pr.commits,
+ // if commits is provided use them, otherwise fetch the single sha representing the whole pr
+ commits: (commits && commits.length > 0) ? commits : this.getSha(pr),
+ };
+ }
+ getSha(pr) {
+ // if pr is open use latest commit sha otherwise use merge_commit_sha
+ return pr.state === "open" ? [pr.head.sha] : [pr.merge_commit_sha];
+ }
+ async mapSourceRepo(pr) {
+ return Promise.resolve({
+ owner: pr.head.repo.full_name.split("/")[0],
+ project: pr.head.repo.full_name.split("/")[1],
+ cloneUrl: pr.head.repo.clone_url
+ });
+ }
+ async mapTargetRepo(pr) {
+ return Promise.resolve({
+ owner: pr.base.repo.full_name.split("/")[0],
+ project: pr.base.repo.full_name.split("/")[1],
+ cloneUrl: pr.base.repo.clone_url
+ });
+ }
+}
+exports["default"] = GitHubMapper;
/***/ }),
@@ -487,12 +1090,12 @@ const rest_1 = __nccwpck_require__(5375);
* Singleton factory class for {Octokit} instance
*/
class OctokitFactory {
- static getOctokit(token) {
+ static getOctokit(token, apiUrl) {
if (!OctokitFactory.octokit) {
- OctokitFactory.logger.info("Creating octokit instance.");
OctokitFactory.octokit = new rest_1.Octokit({
auth: token,
- userAgent: "lampajr/backporting"
+ userAgent: "kiegroup/git-backporting",
+ baseUrl: apiUrl
});
}
return OctokitFactory.octokit;
@@ -502,6 +1105,284 @@ exports["default"] = OctokitFactory;
OctokitFactory.logger = logger_service_factory_1.default.getLogger();
+/***/ }),
+
+/***/ 4077:
+/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
+
+"use strict";
+
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+const git_util_1 = __nccwpck_require__(9080);
+const git_types_1 = __nccwpck_require__(750);
+const logger_service_factory_1 = __importDefault(__nccwpck_require__(8936));
+const gitlab_mapper_1 = __importDefault(__nccwpck_require__(2675));
+const axios_1 = __importDefault(__nccwpck_require__(8757));
+const https_1 = __importDefault(__nccwpck_require__(5687));
+class GitLabClient {
+ constructor(token, apiUrl, rejectUnauthorized = false) {
+ this.logger = logger_service_factory_1.default.getLogger();
+ this.apiUrl = apiUrl;
+ this.client = axios_1.default.create({
+ baseURL: this.apiUrl,
+ headers: {
+ Authorization: token ? `Bearer ${token}` : "",
+ "User-Agent": "kiegroup/git-backporting",
+ },
+ httpsAgent: new https_1.default.Agent({
+ rejectUnauthorized
+ })
+ });
+ this.mapper = new gitlab_mapper_1.default(this.client);
+ }
+ getClientType() {
+ return git_types_1.GitClientType.GITLAB;
+ }
+ getDefaultGitUser() {
+ return "Gitlab";
+ }
+ getDefaultGitEmail() {
+ return "noreply@gitlab.com";
+ }
+ // READ
+ // example: /api/v4/projects/%2Fbackporting-example/merge_requests/1
+ async getPullRequest(namespace, repo, mrNumber, squash) {
+ const projectId = this.getProjectId(namespace, repo);
+ const url = `/projects/${projectId}/merge_requests/${mrNumber}`;
+ this.logger.debug(`Fetching pull request ${url}`);
+ const { data } = await this.client.get(`${url}`);
+ if (squash === undefined) {
+ squash = (0, git_util_1.inferSquash)(data.state === "opened", data.squash_commit_sha);
+ }
+ const commits = [];
+ if (!squash) {
+ // fetch all commits
+ try {
+ const { data } = await this.client.get(`/projects/${projectId}/merge_requests/${mrNumber}/commits`);
+ // gitlab returns them in reverse order
+ commits.push(...data.map(c => c.id).reverse());
+ }
+ catch (error) {
+ throw new Error(`Failed to retrieve commits for merge request n. ${mrNumber}`);
+ }
+ }
+ return this.mapper.mapPullRequest(data, commits);
+ }
+ getPullRequestFromUrl(mrUrl, squash) {
+ const { namespace, project, id } = this.extractMergeRequestData(mrUrl);
+ return this.getPullRequest(namespace, project, id, squash);
+ }
+ // WRITE
+ async createPullRequest(backport) {
+ this.logger.info(`Creating pull request ${backport.head} -> ${backport.base}`);
+ this.logger.info(`${JSON.stringify(backport, null, 2)}`);
+ const projectId = this.getProjectId(backport.owner, backport.repo);
+ const { data } = await this.client.post(`/projects/${projectId}/merge_requests`, {
+ source_branch: backport.head,
+ target_branch: backport.base,
+ title: backport.title,
+ description: backport.body,
+ reviewer_ids: [],
+ assignee_ids: [],
+ });
+ const mr = data;
+ const promises = [];
+ // labels
+ if (backport.labels.length > 0) {
+ this.logger.info("Setting labels: " + backport.labels);
+ promises.push(this.client.put(`/projects/${projectId}/merge_requests/${mr.iid}`, {
+ labels: backport.labels.join(","),
+ }).catch(error => this.logger.warn("Failure trying to update labels. " + error)));
+ }
+ // comments
+ if (backport.comments.length > 0) {
+ this.logger.info("Posting comments: " + backport.comments);
+ backport.comments.forEach(c => {
+ promises.push(this.client.post(`/projects/${projectId}/merge_requests/${mr.iid}/notes`, {
+ body: c,
+ }).catch(error => this.logger.warn("Failure trying to post comment. " + error)));
+ });
+ }
+ // reviewers
+ const reviewerIds = await Promise.all(backport.reviewers.map(async (r) => {
+ this.logger.debug("Retrieving user: " + r);
+ return this.getUser(r).then(user => user.id).catch(() => {
+ this.logger.warn(`Failed to retrieve reviewer ${r}`);
+ return undefined;
+ });
+ }));
+ if (reviewerIds.length > 0) {
+ this.logger.info("Setting reviewers: " + reviewerIds);
+ promises.push(this.client.put(`/projects/${projectId}/merge_requests/${mr.iid}`, {
+ reviewer_ids: reviewerIds.filter(r => r !== undefined),
+ }).catch(error => this.logger.warn("Failure trying to update reviewers. " + error)));
+ }
+ // assignees
+ const assigneeIds = await Promise.all(backport.assignees.map(async (a) => {
+ this.logger.debug("Retrieving user: " + a);
+ return this.getUser(a).then(user => user.id).catch(() => {
+ this.logger.warn(`Failed to retrieve assignee ${a}`);
+ return undefined;
+ });
+ }));
+ if (assigneeIds.length > 0) {
+ this.logger.info("Setting assignees: " + assigneeIds);
+ promises.push(this.client.put(`/projects/${projectId}/merge_requests/${mr.iid}`, {
+ assignee_ids: assigneeIds.filter(a => a !== undefined),
+ }).catch(error => this.logger.warn("Failure trying to update assignees. " + error)));
+ }
+ await Promise.all(promises);
+ return mr.web_url;
+ }
+ // https://docs.gitlab.com/ee/api/notes.html#create-new-issue-note
+ async createPullRequestComment(mrUrl, comment) {
+ const commentUrl = undefined;
+ try {
+ const { namespace, project, id } = this.extractMergeRequestData(mrUrl);
+ const projectId = this.getProjectId(namespace, project);
+ const { data } = await this.client.post(`/projects/${projectId}/merge_requests/${id}/notes`, {
+ body: comment,
+ });
+ if (!data) {
+ throw new Error("Merge request comment creation failed");
+ }
+ }
+ catch (error) {
+ this.logger.error(`Error creating comment on merge request ${mrUrl}: ${error}`);
+ }
+ return commentUrl;
+ }
+ // UTILS
+ /**
+ * Retrieve a gitlab user given its username
+ * @param username
+ * @returns UserSchema
+ */
+ async getUser(username) {
+ const { data } = await this.client.get(`/users?username=${username}`);
+ const users = data;
+ if (users.length > 1) {
+ throw new Error("Too many users found with username=" + username);
+ }
+ if (users.length == 0) {
+ throw new Error("User " + username + " not found");
+ }
+ return users[0];
+ }
+ /**
+ * Extract repository namespace, project and mr number from the merge request url
+ * example: //backporting-example/-/merge_requests/1
+ * note: "-/" could be omitted
+ * @param mrUrl merge request url
+ * @returns {{owner: string, project: string}}
+ */
+ extractMergeRequestData(mrUrl) {
+ const { pathname } = new URL(mrUrl);
+ const elems = pathname.substring(1).replace("/-/", "/").split("/");
+ let namespace = "";
+ for (let i = 0; i < elems.length - 3; i++) {
+ namespace += elems[i] + "/";
+ }
+ namespace = namespace.substring(0, namespace.length - 1);
+ return {
+ namespace: namespace,
+ project: elems[elems.length - 3],
+ id: parseInt(mrUrl.substring(mrUrl.lastIndexOf("/") + 1, mrUrl.length)),
+ };
+ }
+ getProjectId(namespace, repo) {
+ // e.g., %2F
+ return encodeURIComponent(`${namespace}/${repo}`);
+ }
+}
+exports["default"] = GitLabClient;
+
+
+/***/ }),
+
+/***/ 2675:
+/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+const git_types_1 = __nccwpck_require__(750);
+class GitLabMapper {
+ // needs client to perform additional requests
+ constructor(client) {
+ this.client = client;
+ }
+ mapGitState(state) {
+ switch (state) {
+ case "opened":
+ return git_types_1.GitRepoState.OPEN;
+ case "closed":
+ return git_types_1.GitRepoState.CLOSED;
+ case "merged":
+ return git_types_1.GitRepoState.MERGED;
+ default:
+ return git_types_1.GitRepoState.LOCKED;
+ }
+ }
+ async mapPullRequest(mr, commits) {
+ return {
+ number: mr.iid,
+ author: mr.author.username,
+ url: mr.web_url,
+ htmlUrl: mr.web_url,
+ title: mr.title,
+ body: mr.description,
+ state: this.mapGitState(mr.state),
+ merged: this.isMerged(mr),
+ mergedBy: mr.merged_by?.username,
+ reviewers: mr.reviewers?.map((r => r.username)) ?? [],
+ assignees: mr.assignees?.map((r => r.username)) ?? [],
+ labels: mr.labels ?? [],
+ sourceRepo: await this.mapSourceRepo(mr),
+ targetRepo: await this.mapTargetRepo(mr),
+ // if commits list is provided use that as source
+ nCommits: (commits && commits.length > 0) ? commits.length : 1,
+ commits: (commits && commits.length > 0) ? commits : this.getSha(mr)
+ };
+ }
+ getSha(mr) {
+ // if mr is merged, use merge_commit_sha otherwise use sha
+ // what is the difference between sha and diff_refs.head_sha?
+ return this.isMerged(mr) ? [mr.squash_commit_sha ? mr.squash_commit_sha : mr.merge_commit_sha] : [mr.sha];
+ }
+ async mapSourceRepo(mr) {
+ const project = await this.getProject(mr.source_project_id);
+ return {
+ owner: project.namespace.full_path,
+ project: project.path,
+ cloneUrl: project.http_url_to_repo,
+ };
+ }
+ async mapTargetRepo(mr) {
+ const project = await this.getProject(mr.target_project_id);
+ return {
+ owner: project.namespace.full_path,
+ project: project.path,
+ cloneUrl: project.http_url_to_repo,
+ };
+ }
+ isMerged(mr) {
+ return this.mapGitState(mr.state) === git_types_1.GitRepoState.MERGED;
+ }
+ async getProject(projectId) {
+ const { data } = await this.client.get(`/projects/${projectId}`);
+ if (!data) {
+ throw new Error(`Project ${projectId} not found`);
+ }
+ return data;
+ }
+}
+exports["default"] = GitLabMapper;
+
+
/***/ }),
/***/ 8679:
@@ -515,23 +1396,38 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
Object.defineProperty(exports, "__esModule", ({ value: true }));
const logger_1 = __importDefault(__nccwpck_require__(1855));
class ConsoleLoggerService {
- constructor() {
+ constructor(verbose = true) {
this.logger = new logger_1.default();
+ this.verbose = verbose;
+ }
+ setContext(newContext) {
+ this.context = newContext;
+ }
+ getContext() {
+ return this.context;
+ }
+ clearContext() {
+ this.context = undefined;
}
trace(message) {
- this.logger.log("[TRACE]", message);
+ this.logger.log("TRACE", this.fromContext(message));
}
debug(message) {
- this.logger.log("[DEBUG]", message);
+ if (this.verbose) {
+ this.logger.log("DEBUG", this.fromContext(message));
+ }
}
info(message) {
- this.logger.log("[INFO]", message);
+ this.logger.log("INFO", this.fromContext(message));
}
warn(message) {
- this.logger.log("[WARN]", message);
+ this.logger.log("WARN", this.fromContext(message));
}
error(message) {
- this.logger.log("[ERROR]", message);
+ this.logger.log("ERROR", this.fromContext(message));
+ }
+ fromContext(msg) {
+ return this.context ? `[${this.context}] ${msg}` : msg;
}
}
exports["default"] = ConsoleLoggerService;
@@ -577,7 +1473,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
class Logger {
log(prefix, ...str) {
// eslint-disable-next-line no-console
- console.log.apply(console, [prefix, ...str]);
+ console.log.apply(console, [`[${prefix.padEnd(5)}]`, ...str]);
}
emptyLine() {
this.log("", "");
@@ -586,6 +1482,39 @@ class Logger {
exports["default"] = Logger;
+/***/ }),
+
+/***/ 9632:
+/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.injectTargetBranch = exports.injectError = void 0;
+const configs_types_1 = __nccwpck_require__(4753);
+/**
+ * Inject the error message in the provided `message`.
+ * This is injected in place of the MESSAGE_ERROR_PLACEHOLDER placeholder
+ * @param message string that needs to be updated
+ * @param errMsg the error message that needs to be injected
+ */
+const injectError = (message, errMsg) => {
+ return message.replace(configs_types_1.MESSAGE_ERROR_PLACEHOLDER, errMsg);
+};
+exports.injectError = injectError;
+/**
+ * Inject the target branch into the provided `message`.
+ * This is injected in place of the MESSAGE_TARGET_BRANCH_PLACEHOLDER placeholder
+ * @param message string that needs to be updated
+ * @param targetBranch the target branch to inject
+ * @returns
+ */
+const injectTargetBranch = (message, targetBranch) => {
+ return message.replace(configs_types_1.MESSAGE_TARGET_BRANCH_PLACEHOLDER, targetBranch);
+};
+exports.injectTargetBranch = injectTargetBranch;
+
+
/***/ }),
/***/ 8810:
@@ -599,9 +1528,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
Object.defineProperty(exports, "__esModule", ({ value: true }));
const pr_configs_parser_1 = __importDefault(__nccwpck_require__(6618));
const git_cli_1 = __importDefault(__nccwpck_require__(7538));
-const git_service_factory_1 = __importDefault(__nccwpck_require__(5107));
+const git_client_factory_1 = __importDefault(__nccwpck_require__(8550));
const git_types_1 = __nccwpck_require__(750);
const logger_service_factory_1 = __importDefault(__nccwpck_require__(8936));
+const git_util_1 = __nccwpck_require__(9080);
+const runner_util_1 = __nccwpck_require__(9632);
/**
* Main runner implementation, it implements the core logic flow
*/
@@ -610,32 +1541,18 @@ class Runner {
this.logger = logger_service_factory_1.default.getLogger();
this.argsParser = parser;
}
- /**
- * Infer the remote GIT service to interact with based on the provided
- * pull request URL
- * @param prUrl provided pull request URL
- * @returns {GitServiceType}
- */
- inferRemoteGitService(prUrl) {
- const stdPrUrl = prUrl.toLowerCase().trim();
- if (stdPrUrl.includes(git_types_1.GitServiceType.GITHUB.toString())) {
- return git_types_1.GitServiceType.GITHUB;
- }
- throw new Error(`Remote GIT service not recognixed from PR url: ${prUrl}`);
- }
/**
* Entry point invoked by the command line or gha
*/
async run() {
- this.logger.info("Starting process.");
try {
await this.execute();
- this.logger.info("Process succeeded!");
+ this.logger.info("Process succeeded");
process.exit(0);
}
catch (error) {
this.logger.error(`${error}`);
- this.logger.info("Process failed!");
+ this.logger.info("Process failed");
process.exit(1);
}
}
@@ -646,50 +1563,105 @@ class Runner {
// 1. parse args
const args = this.argsParser.parse();
if (args.dryRun) {
- this.logger.warn("Dry run enabled!");
+ this.logger.warn("Dry run enabled");
}
// 2. init git service
- git_service_factory_1.default.init(this.inferRemoteGitService(args.pullRequest), args.auth);
- const gitApi = git_service_factory_1.default.getService();
+ let gitClientType;
+ if (args.gitClient === undefined) {
+ gitClientType = (0, git_util_1.inferGitClient)(args.pullRequest);
+ }
+ else {
+ gitClientType = args.gitClient;
+ }
+ // the api version is ignored in case of github
+ const apiUrl = (0, git_util_1.inferGitApiUrl)(args.pullRequest, gitClientType === git_types_1.GitClientType.CODEBERG ? "v1" : undefined);
+ const token = this.fetchToken(args, gitClientType);
+ const gitApi = git_client_factory_1.default.getOrCreate(gitClientType, token, apiUrl);
// 3. parse configs
+ this.logger.debug("Parsing configs..");
+ args.auth = token; // override auth
const configs = await new pr_configs_parser_1.default().parseAndValidate(args);
- const originalPR = configs.originalPullRequest;
- const backportPR = configs.backportPullRequest;
+ const backportPRs = configs.backportPullRequests;
// start local git operations
- const git = new git_cli_1.default(configs.auth, configs.author);
+ const git = new git_cli_1.default(configs.auth, configs.git);
+ const failures = [];
+ // we need sequential backporting as they will operate on the same folder
+ // avoid cloning the same repo multiple times
+ for (const pr of backportPRs) {
+ try {
+ await this.executeBackport(configs, pr, {
+ gitClientType: gitClientType,
+ gitClientApi: gitApi,
+ gitCli: git,
+ });
+ }
+ catch (error) {
+ this.logger.error(`Something went wrong backporting to ${pr.base}: ${error}`);
+ if (!configs.dryRun && configs.errorNotification.enabled && configs.errorNotification.message.length > 0) {
+ // notify the failure as comment in the original pull request
+ let comment = (0, runner_util_1.injectError)(configs.errorNotification.message, error);
+ comment = (0, runner_util_1.injectTargetBranch)(comment, pr.base);
+ await gitApi.createPullRequestComment(configs.originalPullRequest.url, comment);
+ }
+ failures.push(error);
+ }
+ }
+ if (failures.length > 0) {
+ throw new Error(`Failure occurred during one of the backports: [${failures.join(" ; ")}]`);
+ }
+ }
+ /**
+ * Fetch the GIT token from the provided Args obj, if not empty, otherwise fallback
+ * to the environment variables.
+ * @param args input arguments
+ * @param gitType git client type
+ * @returns the provided or fetched token, or undefined if not set anywhere
+ */
+ fetchToken(args, gitType) {
+ let token = args.auth;
+ if (token === undefined) {
+ // try to fetch the auth from env variable
+ this.logger.info("Auth argument not provided, checking available tokens from env..");
+ token = (0, git_util_1.getGitTokenFromEnv)(gitType);
+ if (!token) {
+ this.logger.info("Git token not found in the environment");
+ }
+ }
+ return token;
+ }
+ async executeBackport(configs, backportPR, git) {
+ this.logger.setContext(backportPR.base);
+ const originalPR = configs.originalPullRequest;
// 4. clone the repository
- await git.clone(configs.originalPullRequest.targetRepo.cloneUrl, configs.folder, configs.targetBranch);
+ this.logger.debug("Cloning repo..");
+ await git.gitCli.clone(configs.originalPullRequest.targetRepo.cloneUrl, configs.folder, backportPR.base);
// 5. create new branch from target one and checkout
- const backportBranch = backportPR.branchName ?? `bp-${configs.targetBranch}-${originalPR.commits.join("-")}`;
- await git.createLocalBranch(configs.folder, backportBranch);
+ this.logger.debug("Creating local branch..");
+ await git.gitCli.createLocalBranch(configs.folder, backportPR.head);
// 6. fetch pull request remote if source owner != target owner or pull request still open
if (configs.originalPullRequest.sourceRepo.owner !== configs.originalPullRequest.targetRepo.owner ||
configs.originalPullRequest.state === "open") {
- await git.fetch(configs.folder, `pull/${configs.originalPullRequest.number}/head:pr/${configs.originalPullRequest.number}`);
+ this.logger.debug("Fetching pull request remote..");
+ const prefix = git.gitClientType === git_types_1.GitClientType.GITLAB ? "merge-requests" : "pull"; // default is for gitlab
+ await git.gitCli.fetch(configs.folder, `${prefix}/${configs.originalPullRequest.number}/head:pr/${configs.originalPullRequest.number}`);
}
// 7. apply all changes to the new branch
+ this.logger.debug("Cherry picking commits..");
for (const sha of originalPR.commits) {
- await git.cherryPick(configs.folder, sha);
+ await git.gitCli.cherryPick(configs.folder, sha, configs.mergeStrategy, configs.mergeStrategyOption, configs.cherryPickOptions);
}
- const backport = {
- owner: originalPR.targetRepo.owner,
- repo: originalPR.targetRepo.project,
- head: backportBranch,
- base: configs.targetBranch,
- title: backportPR.title,
- body: backportPR.body,
- reviewers: backportPR.reviewers
- };
if (!configs.dryRun) {
// 8. push the new branch to origin
- await git.push(configs.folder, backportBranch);
+ await git.gitCli.push(configs.folder, backportPR.head);
// 9. create pull request new branch -> target branch (using octokit)
- await gitApi.createPullRequest(backport);
+ const prUrl = await git.gitClientApi.createPullRequest(backportPR);
+ this.logger.info(`Pull request created: ${prUrl}`);
}
else {
- this.logger.warn("Pull request creation and remote push skipped!");
- this.logger.info(`${JSON.stringify(backport, null, 2)}`);
+ this.logger.warn("Pull request creation and remote push skipped");
+ this.logger.info(`${JSON.stringify(backportPR, null, 2)}`);
}
+ this.logger.clearContext();
}
}
exports["default"] = Runner;
@@ -839,7 +1811,1398 @@ exports["default"] = deferred;
/***/ }),
-/***/ 334:
+/***/ 4193:
+/***/ ((__unused_webpack_module, exports) => {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+
+const VERSION = "2.21.3";
+
+function ownKeys(object, enumerableOnly) {
+ var keys = Object.keys(object);
+
+ if (Object.getOwnPropertySymbols) {
+ var symbols = Object.getOwnPropertySymbols(object);
+ enumerableOnly && (symbols = symbols.filter(function (sym) {
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
+ })), keys.push.apply(keys, symbols);
+ }
+
+ return keys;
+}
+
+function _objectSpread2(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = null != arguments[i] ? arguments[i] : {};
+ i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {
+ _defineProperty(target, key, source[key]);
+ }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
+ });
+ }
+
+ return target;
+}
+
+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;
+}
+
+/**
+ * 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) {
+ // endpoints can respond with 204 if repository is empty
+ if (!response.data) {
+ return _objectSpread2(_objectSpread2({}, response), {}, {
+ data: []
+ });
+ }
+
+ 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.
+
+ 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 (typeof incompleteResults !== "undefined") {
+ response.data.incomplete_results = incompleteResults;
+ }
+
+ if (typeof repositorySelection !== "undefined") {
+ response.data.repository_selection = repositorySelection;
+ }
+
+ response.data.total_count = totalCount;
+ return response;
+}
+
+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
+ };
+
+ try {
+ 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
+ };
+ } catch (error) {
+ if (error.status !== 409) throw error;
+ url = "";
+ return {
+ value: {
+ status: 200,
+ headers: {},
+ data: []
+ }
+ };
+ }
+ }
+
+ })
+ };
+}
+
+function paginate(octokit, route, parameters, mapFn) {
+ if (typeof parameters === "function") {
+ mapFn = parameters;
+ parameters = undefined;
+ }
+
+ 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;
+ }
+
+ let earlyExit = false;
+
+ function done() {
+ earlyExit = true;
+ }
+
+ results = results.concat(mapFn ? mapFn(result.value, done) : result.value.data);
+
+ if (earlyExit) {
+ return results;
+ }
+
+ return gather(octokit, results, iterator, mapFn);
+ });
+}
+
+const composePaginateRest = Object.assign(paginate, {
+ iterator
+});
+
+const paginatingEndpoints = ["GET /app/hook/deliveries", "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}/audit-log", "GET /enterprises/{enterprise}/secret-scanning/alerts", "GET /enterprises/{enterprise}/settings/billing/advanced-security", "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 /licenses", "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/cache/usage-by-repository", "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/secrets", "GET /orgs/{org}/actions/secrets/{secret_name}/repositories", "GET /orgs/{org}/audit-log", "GET /orgs/{org}/blocks", "GET /orgs/{org}/code-scanning/alerts", "GET /orgs/{org}/codespaces", "GET /orgs/{org}/credential-authorizations", "GET /orgs/{org}/dependabot/secrets", "GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories", "GET /orgs/{org}/events", "GET /orgs/{org}/external-groups", "GET /orgs/{org}/failed_invitations", "GET /orgs/{org}/hooks", "GET /orgs/{org}/hooks/{hook_id}/deliveries", "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}/packages", "GET /orgs/{org}/packages/{package_type}/{package_name}/versions", "GET /orgs/{org}/projects", "GET /orgs/{org}/public_members", "GET /orgs/{org}/repos", "GET /orgs/{org}/secret-scanning/alerts", "GET /orgs/{org}/settings/billing/advanced-security", "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}/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/caches", "GET /repos/{owner}/{repo}/actions/runners", "GET /repos/{owner}/{repo}/actions/runs", "GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts", "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs", "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}/codespaces", "GET /repos/{owner}/{repo}/codespaces/devcontainers", "GET /repos/{owner}/{repo}/codespaces/secrets", "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}/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}/status", "GET /repos/{owner}/{repo}/commits/{ref}/statuses", "GET /repos/{owner}/{repo}/contributors", "GET /repos/{owner}/{repo}/dependabot/secrets", "GET /repos/{owner}/{repo}/deployments", "GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses", "GET /repos/{owner}/{repo}/environments", "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}/hooks/{hook_id}/deliveries", "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}/releases/{release_id}/reactions", "GET /repos/{owner}/{repo}/secret-scanning/alerts", "GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations", "GET /repos/{owner}/{repo}/stargazers", "GET /repos/{owner}/{repo}/subscribers", "GET /repos/{owner}/{repo}/tags", "GET /repos/{owner}/{repo}/teams", "GET /repos/{owner}/{repo}/topics", "GET /repositories", "GET /repositories/{repository_id}/environments/{environment_name}/secrets", "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}/teams", "GET /user/blocks", "GET /user/codespaces", "GET /user/codespaces/secrets", "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/packages", "GET /user/packages/{package_type}/{package_name}/versions", "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}/packages", "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"];
+
+function isPaginatingEndpoint(arg) {
+ if (typeof arg === "string") {
+ return paginatingEndpoints.includes(arg);
+ } else {
+ return false;
+ }
+}
+
+/**
+ * @param octokit Octokit instance
+ * @param options Options passed to Octokit constructor
+ */
+
+function paginateRest(octokit) {
+ return {
+ paginate: Object.assign(paginate.bind(null, octokit), {
+ iterator: iterator.bind(null, octokit)
+ })
+ };
+}
+paginateRest.VERSION = VERSION;
+
+exports.composePaginateRest = composePaginateRest;
+exports.isPaginatingEndpoint = isPaginatingEndpoint;
+exports.paginateRest = paginateRest;
+exports.paginatingEndpoints = paginatingEndpoints;
+//# sourceMappingURL=index.js.map
+
+
+/***/ }),
+
+/***/ 8883:
+/***/ ((__unused_webpack_module, exports) => {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+
+const VERSION = "1.0.4";
+
+/**
+ * @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;
+
+exports.requestLog = requestLog;
+//# sourceMappingURL=index.js.map
+
+
+/***/ }),
+
+/***/ 3044:
+/***/ ((__unused_webpack_module, exports) => {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+
+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;
+ });
+ }
+
+ keys.push.apply(keys, symbols);
+ }
+
+ return keys;
+}
+
+function _objectSpread2(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i] != null ? arguments[i] : {};
+
+ 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));
+ });
+ }
+ }
+
+ return target;
+}
+
+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: {
+ addCustomLabelsToSelfHostedRunnerForOrg: ["POST /orgs/{org}/actions/runners/{runner_id}/labels"],
+ addCustomLabelsToSelfHostedRunnerForRepo: ["POST /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"],
+ 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"],
+ deleteActionsCacheById: ["DELETE /repos/{owner}/{repo}/actions/caches/{cache_id}"],
+ deleteActionsCacheByKey: ["DELETE /repos/{owner}/{repo}/actions/caches{?key,ref}"],
+ 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"],
+ downloadWorkflowRunAttemptLogs: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/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"],
+ getActionsCacheList: ["GET /repos/{owner}/{repo}/actions/caches"],
+ getActionsCacheUsage: ["GET /repos/{owner}/{repo}/actions/cache/usage"],
+ getActionsCacheUsageByRepoForOrg: ["GET /orgs/{org}/actions/cache/usage-by-repository"],
+ getActionsCacheUsageForEnterprise: ["GET /enterprises/{enterprise}/actions/cache/usage"],
+ getActionsCacheUsageForOrg: ["GET /orgs/{org}/actions/cache/usage"],
+ 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}"],
+ getGithubActionsDefaultWorkflowPermissionsEnterprise: ["GET /enterprises/{enterprise}/actions/permissions/workflow"],
+ getGithubActionsDefaultWorkflowPermissionsOrganization: ["GET /orgs/{org}/actions/permissions/workflow"],
+ getGithubActionsDefaultWorkflowPermissionsRepository: ["GET /repos/{owner}/{repo}/actions/permissions/workflow"],
+ 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}"],
+ getWorkflowAccessToRepository: ["GET /repos/{owner}/{repo}/actions/permissions/access"],
+ getWorkflowRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}"],
+ getWorkflowRunAttempt: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}"],
+ 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"],
+ listJobsForWorkflowRunAttempt: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs"],
+ listLabelsForSelfHostedRunnerForOrg: ["GET /orgs/{org}/actions/runners/{runner_id}/labels"],
+ listLabelsForSelfHostedRunnerForRepo: ["GET /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"],
+ 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"],
+ reRunJobForWorkflowRun: ["POST /repos/{owner}/{repo}/actions/jobs/{job_id}/rerun"],
+ reRunWorkflow: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun"],
+ reRunWorkflowFailedJobs: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun-failed-jobs"],
+ removeAllCustomLabelsFromSelfHostedRunnerForOrg: ["DELETE /orgs/{org}/actions/runners/{runner_id}/labels"],
+ removeAllCustomLabelsFromSelfHostedRunnerForRepo: ["DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"],
+ removeCustomLabelFromSelfHostedRunnerForOrg: ["DELETE /orgs/{org}/actions/runners/{runner_id}/labels/{name}"],
+ removeCustomLabelFromSelfHostedRunnerForRepo: ["DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels/{name}"],
+ 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"],
+ setCustomLabelsForSelfHostedRunnerForOrg: ["PUT /orgs/{org}/actions/runners/{runner_id}/labels"],
+ setCustomLabelsForSelfHostedRunnerForRepo: ["PUT /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"],
+ setGithubActionsDefaultWorkflowPermissionsEnterprise: ["PUT /enterprises/{enterprise}/actions/permissions/workflow"],
+ setGithubActionsDefaultWorkflowPermissionsOrganization: ["PUT /orgs/{org}/actions/permissions/workflow"],
+ setGithubActionsDefaultWorkflowPermissionsRepository: ["PUT /repos/{owner}/{repo}/actions/permissions/workflow"],
+ 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"],
+ setWorkflowAccessToRepository: ["PUT /repos/{owner}/{repo}/actions/permissions/access"]
+ },
+ 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}", {}, {
+ renamed: ["apps", "addRepoToInstallationForAuthenticatedUser"]
+ }],
+ addRepoToInstallationForAuthenticatedUser: ["PUT /user/installations/{installation_id}/repositories/{repository_id}"],
+ checkToken: ["POST /applications/{client_id}/token"],
+ 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"],
+ getWebhookDelivery: ["GET /app/hook/deliveries/{delivery_id}"],
+ 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"],
+ listWebhookDeliveries: ["GET /app/hook/deliveries"],
+ redeliverWebhookDelivery: ["POST /app/hook/deliveries/{delivery_id}/attempts"],
+ removeRepoFromInstallation: ["DELETE /user/installations/{installation_id}/repositories/{repository_id}", {}, {
+ renamed: ["apps", "removeRepoFromInstallationForAuthenticatedUser"]
+ }],
+ removeRepoFromInstallationForAuthenticatedUser: ["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"],
+ getGithubAdvancedSecurityBillingGhe: ["GET /enterprises/{enterprise}/settings/billing/advanced-security"],
+ getGithubAdvancedSecurityBillingOrg: ["GET /orgs/{org}/settings/billing/advanced-security"],
+ 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"],
+ rerequestRun: ["POST /repos/{owner}/{repo}/check-runs/{check_run_id}/rerequest"],
+ 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"],
+ listAlertsForOrg: ["GET /orgs/{org}/code-scanning/alerts"],
+ 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"],
+ getConductCode: ["GET /codes_of_conduct/{key}"]
+ },
+ codespaces: {
+ addRepositoryForSecretForAuthenticatedUser: ["PUT /user/codespaces/secrets/{secret_name}/repositories/{repository_id}"],
+ codespaceMachinesForAuthenticatedUser: ["GET /user/codespaces/{codespace_name}/machines"],
+ createForAuthenticatedUser: ["POST /user/codespaces"],
+ createOrUpdateRepoSecret: ["PUT /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"],
+ createOrUpdateSecretForAuthenticatedUser: ["PUT /user/codespaces/secrets/{secret_name}"],
+ createWithPrForAuthenticatedUser: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/codespaces"],
+ createWithRepoForAuthenticatedUser: ["POST /repos/{owner}/{repo}/codespaces"],
+ deleteForAuthenticatedUser: ["DELETE /user/codespaces/{codespace_name}"],
+ deleteFromOrganization: ["DELETE /orgs/{org}/members/{username}/codespaces/{codespace_name}"],
+ deleteRepoSecret: ["DELETE /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"],
+ deleteSecretForAuthenticatedUser: ["DELETE /user/codespaces/secrets/{secret_name}"],
+ exportForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/exports"],
+ getExportDetailsForAuthenticatedUser: ["GET /user/codespaces/{codespace_name}/exports/{export_id}"],
+ getForAuthenticatedUser: ["GET /user/codespaces/{codespace_name}"],
+ getPublicKeyForAuthenticatedUser: ["GET /user/codespaces/secrets/public-key"],
+ getRepoPublicKey: ["GET /repos/{owner}/{repo}/codespaces/secrets/public-key"],
+ getRepoSecret: ["GET /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"],
+ getSecretForAuthenticatedUser: ["GET /user/codespaces/secrets/{secret_name}"],
+ listDevcontainersInRepositoryForAuthenticatedUser: ["GET /repos/{owner}/{repo}/codespaces/devcontainers"],
+ listForAuthenticatedUser: ["GET /user/codespaces"],
+ listInOrganization: ["GET /orgs/{org}/codespaces", {}, {
+ renamedParameters: {
+ org_id: "org"
+ }
+ }],
+ listInRepositoryForAuthenticatedUser: ["GET /repos/{owner}/{repo}/codespaces"],
+ listRepoSecrets: ["GET /repos/{owner}/{repo}/codespaces/secrets"],
+ listRepositoriesForSecretForAuthenticatedUser: ["GET /user/codespaces/secrets/{secret_name}/repositories"],
+ listSecretsForAuthenticatedUser: ["GET /user/codespaces/secrets"],
+ removeRepositoryForSecretForAuthenticatedUser: ["DELETE /user/codespaces/secrets/{secret_name}/repositories/{repository_id}"],
+ repoMachinesForAuthenticatedUser: ["GET /repos/{owner}/{repo}/codespaces/machines"],
+ setRepositoriesForSecretForAuthenticatedUser: ["PUT /user/codespaces/secrets/{secret_name}/repositories"],
+ startForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/start"],
+ stopForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/stop"],
+ stopInOrganization: ["POST /orgs/{org}/members/{username}/codespaces/{codespace_name}/stop"],
+ updateForAuthenticatedUser: ["PATCH /user/codespaces/{codespace_name}"]
+ },
+ dependabot: {
+ addSelectedRepoToOrgSecret: ["PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}"],
+ createOrUpdateOrgSecret: ["PUT /orgs/{org}/dependabot/secrets/{secret_name}"],
+ createOrUpdateRepoSecret: ["PUT /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"],
+ deleteOrgSecret: ["DELETE /orgs/{org}/dependabot/secrets/{secret_name}"],
+ deleteRepoSecret: ["DELETE /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"],
+ getOrgPublicKey: ["GET /orgs/{org}/dependabot/secrets/public-key"],
+ getOrgSecret: ["GET /orgs/{org}/dependabot/secrets/{secret_name}"],
+ getRepoPublicKey: ["GET /repos/{owner}/{repo}/dependabot/secrets/public-key"],
+ getRepoSecret: ["GET /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"],
+ listOrgSecrets: ["GET /orgs/{org}/dependabot/secrets"],
+ listRepoSecrets: ["GET /repos/{owner}/{repo}/dependabot/secrets"],
+ listSelectedReposForOrgSecret: ["GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories"],
+ removeSelectedRepoFromOrgSecret: ["DELETE /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}"],
+ setSelectedReposForOrgSecret: ["PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories"]
+ },
+ dependencyGraph: {
+ createRepositorySnapshot: ["POST /repos/{owner}/{repo}/dependency-graph/snapshots"],
+ diffRange: ["GET /repos/{owner}/{repo}/dependency-graph/compare/{basehead}"]
+ },
+ emojis: {
+ get: ["GET /emojis"]
+ },
+ enterpriseAdmin: {
+ addCustomLabelsToSelfHostedRunnerForEnterprise: ["POST /enterprises/{enterprise}/actions/runners/{runner_id}/labels"],
+ 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"],
+ getServerStatistics: ["GET /enterprise-installation/{enterprise_or_org}/server-statistics"],
+ listLabelsForSelfHostedRunnerForEnterprise: ["GET /enterprises/{enterprise}/actions/runners/{runner_id}/labels"],
+ listSelectedOrganizationsEnabledGithubActionsEnterprise: ["GET /enterprises/{enterprise}/actions/permissions/organizations"],
+ removeAllCustomLabelsFromSelfHostedRunnerForEnterprise: ["DELETE /enterprises/{enterprise}/actions/runners/{runner_id}/labels"],
+ removeCustomLabelFromSelfHostedRunnerForEnterprise: ["DELETE /enterprises/{enterprise}/actions/runners/{runner_id}/labels/{name}"],
+ setAllowedActionsEnterprise: ["PUT /enterprises/{enterprise}/actions/permissions/selected-actions"],
+ setCustomLabelsForSelfHostedRunnerForEnterprise: ["PUT /enterprises/{enterprise}/actions/runners/{runner_id}/labels"],
+ 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"],
+ 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"],
+ deleteArchiveForOrg: ["DELETE /orgs/{org}/migrations/{migration_id}/archive"],
+ downloadArchiveForOrg: ["GET /orgs/{org}/migrations/{migration_id}/archive"],
+ getArchiveForAuthenticatedUser: ["GET /user/migrations/{migration_id}/archive"],
+ 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}"],
+ getStatusForOrg: ["GET /orgs/{org}/migrations/{migration_id}"],
+ listForAuthenticatedUser: ["GET /user/migrations"],
+ listForOrg: ["GET /orgs/{org}/migrations"],
+ listReposForAuthenticatedUser: ["GET /user/migrations/{migration_id}/repositories"],
+ listReposForOrg: ["GET /orgs/{org}/migrations/{migration_id}/repositories"],
+ listReposForUser: ["GET /user/migrations/{migration_id}/repositories", {}, {
+ renamed: ["migrations", "listReposForAuthenticatedUser"]
+ }],
+ 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"],
+ unlockRepoForOrg: ["DELETE /orgs/{org}/migrations/{migration_id}/repos/{repo_name}/lock"],
+ 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"],
+ getWebhookDelivery: ["GET /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}"],
+ list: ["GET /organizations"],
+ listAppInstallations: ["GET /orgs/{org}/installations"],
+ listBlockedUsers: ["GET /orgs/{org}/blocks"],
+ listCustomRoles: ["GET /organizations/{organization_id}/custom_roles"],
+ 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"],
+ listWebhookDeliveries: ["GET /orgs/{org}/hooks/{hook_id}/deliveries"],
+ listWebhooks: ["GET /orgs/{org}/hooks"],
+ pingWebhook: ["POST /orgs/{org}/hooks/{hook_id}/pings"],
+ redeliverWebhookDelivery: ["POST /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}/attempts"],
+ 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}"],
+ deletePackageForUser: ["DELETE /users/{username}/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}"],
+ deletePackageVersionForUser: ["DELETE /users/{username}/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}"],
+ listPackagesForAuthenticatedUser: ["GET /user/packages"],
+ listPackagesForOrganization: ["GET /orgs/{org}/packages"],
+ listPackagesForUser: ["GET /users/{username}/packages"],
+ restorePackageForAuthenticatedUser: ["POST /user/packages/{package_type}/{package_name}/restore{?token}"],
+ restorePackageForOrg: ["POST /orgs/{org}/packages/{package_type}/{package_name}/restore{?token}"],
+ restorePackageForUser: ["POST /users/{username}/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"],
+ restorePackageVersionForUser: ["POST /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore"]
+ },
+ projects: {
+ addCollaborator: ["PUT /projects/{project_id}/collaborators/{username}"],
+ createCard: ["POST /projects/columns/{column_id}/cards"],
+ createColumn: ["POST /projects/{project_id}/columns"],
+ createForAuthenticatedUser: ["POST /user/projects"],
+ createForOrg: ["POST /orgs/{org}/projects"],
+ createForRepo: ["POST /repos/{owner}/{repo}/projects"],
+ delete: ["DELETE /projects/{project_id}"],
+ deleteCard: ["DELETE /projects/columns/cards/{card_id}"],
+ deleteColumn: ["DELETE /projects/columns/{column_id}"],
+ get: ["GET /projects/{project_id}"],
+ getCard: ["GET /projects/columns/cards/{card_id}"],
+ getColumn: ["GET /projects/columns/{column_id}"],
+ getPermissionForUser: ["GET /projects/{project_id}/collaborators/{username}/permission"],
+ listCards: ["GET /projects/columns/{column_id}/cards"],
+ listCollaborators: ["GET /projects/{project_id}/collaborators"],
+ listColumns: ["GET /projects/{project_id}/columns"],
+ listForOrg: ["GET /orgs/{org}/projects"],
+ listForRepo: ["GET /repos/{owner}/{repo}/projects"],
+ listForUser: ["GET /users/{username}/projects"],
+ moveCard: ["POST /projects/columns/cards/{card_id}/moves"],
+ moveColumn: ["POST /projects/columns/{column_id}/moves"],
+ removeCollaborator: ["DELETE /projects/{project_id}/collaborators/{username}"],
+ update: ["PATCH /projects/{project_id}"],
+ updateCard: ["PATCH /projects/columns/cards/{card_id}"],
+ updateColumn: ["PATCH /projects/columns/{column_id}"]
+ },
+ 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"],
+ 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"],
+ createForIssue: ["POST /repos/{owner}/{repo}/issues/{issue_number}/reactions"],
+ createForIssueComment: ["POST /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions"],
+ createForPullRequestReviewComment: ["POST /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions"],
+ createForRelease: ["POST /repos/{owner}/{repo}/releases/{release_id}/reactions"],
+ createForTeamDiscussionCommentInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions"],
+ createForTeamDiscussionInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions"],
+ deleteForCommitComment: ["DELETE /repos/{owner}/{repo}/comments/{comment_id}/reactions/{reaction_id}"],
+ deleteForIssue: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/reactions/{reaction_id}"],
+ deleteForIssueComment: ["DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions/{reaction_id}"],
+ deleteForPullRequestComment: ["DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions/{reaction_id}"],
+ deleteForRelease: ["DELETE /repos/{owner}/{repo}/releases/{release_id}/reactions/{reaction_id}"],
+ deleteForTeamDiscussion: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions/{reaction_id}"],
+ deleteForTeamDiscussionComment: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions/{reaction_id}"],
+ listForCommitComment: ["GET /repos/{owner}/{repo}/comments/{comment_id}/reactions"],
+ listForIssue: ["GET /repos/{owner}/{repo}/issues/{issue_number}/reactions"],
+ listForIssueComment: ["GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions"],
+ listForPullRequestReviewComment: ["GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions"],
+ listForRelease: ["GET /repos/{owner}/{repo}/releases/{release_id}/reactions"],
+ listForTeamDiscussionCommentInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions"],
+ listForTeamDiscussionInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions"]
+ },
+ repos: {
+ acceptInvitation: ["PATCH /user/repository_invitations/{invitation_id}", {}, {
+ renamed: ["repos", "acceptInvitationForAuthenticatedUser"]
+ }],
+ acceptInvitationForAuthenticatedUser: ["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"],
+ codeownersErrors: ["GET /repos/{owner}/{repo}/codeowners/errors"],
+ compareCommits: ["GET /repos/{owner}/{repo}/compare/{base}...{head}"],
+ compareCommitsWithBasehead: ["GET /repos/{owner}/{repo}/compare/{basehead}"],
+ createAutolink: ["POST /repos/{owner}/{repo}/autolinks"],
+ createCommitComment: ["POST /repos/{owner}/{repo}/commits/{commit_sha}/comments"],
+ createCommitSignatureProtection: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures"],
+ 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"],
+ createRelease: ["POST /repos/{owner}/{repo}/releases"],
+ createTagProtection: ["POST /repos/{owner}/{repo}/tags/protection"],
+ createUsingTemplate: ["POST /repos/{template_owner}/{template_repo}/generate"],
+ createWebhook: ["POST /repos/{owner}/{repo}/hooks"],
+ declineInvitation: ["DELETE /user/repository_invitations/{invitation_id}", {}, {
+ renamed: ["repos", "declineInvitationForAuthenticatedUser"]
+ }],
+ declineInvitationForAuthenticatedUser: ["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}"],
+ deleteAutolink: ["DELETE /repos/{owner}/{repo}/autolinks/{autolink_id}"],
+ 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"],
+ 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"],
+ 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}"],
+ deleteTagProtection: ["DELETE /repos/{owner}/{repo}/tags/protection/{tag_protection_id}"],
+ deleteWebhook: ["DELETE /repos/{owner}/{repo}/hooks/{hook_id}"],
+ disableAutomatedSecurityFixes: ["DELETE /repos/{owner}/{repo}/automated-security-fixes"],
+ disableLfsForRepo: ["DELETE /repos/{owner}/{repo}/lfs"],
+ disableVulnerabilityAlerts: ["DELETE /repos/{owner}/{repo}/vulnerability-alerts"],
+ 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"],
+ enableLfsForRepo: ["PUT /repos/{owner}/{repo}/lfs"],
+ enableVulnerabilityAlerts: ["PUT /repos/{owner}/{repo}/vulnerability-alerts"],
+ generateReleaseNotes: ["POST /repos/{owner}/{repo}/releases/generate-notes"],
+ 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"],
+ getAppsWithAccessToProtectedBranch: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps"],
+ getAutolink: ["GET /repos/{owner}/{repo}/autolinks/{autolink_id}"],
+ 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"],
+ 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"],
+ getWebhookDelivery: ["GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}"],
+ listAutolinks: ["GET /repos/{owner}/{repo}/autolinks"],
+ listBranches: ["GET /repos/{owner}/{repo}/branches"],
+ listBranchesForHeadCommit: ["GET /repos/{owner}/{repo}/commits/{commit_sha}/branches-where-head"],
+ 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"],
+ listReleaseAssets: ["GET /repos/{owner}/{repo}/releases/{release_id}/assets"],
+ listReleases: ["GET /repos/{owner}/{repo}/releases"],
+ listTagProtection: ["GET /repos/{owner}/{repo}/tags/protection"],
+ listTags: ["GET /repos/{owner}/{repo}/tags"],
+ listTeams: ["GET /repos/{owner}/{repo}/teams"],
+ listWebhookDeliveries: ["GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries"],
+ listWebhooks: ["GET /repos/{owner}/{repo}/hooks"],
+ merge: ["POST /repos/{owner}/{repo}/merges"],
+ mergeUpstream: ["POST /repos/{owner}/{repo}/merge-upstream"],
+ pingWebhook: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/pings"],
+ redeliverWebhookDelivery: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}/attempts"],
+ 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"],
+ 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"],
+ issuesAndPullRequests: ["GET /search/issues"],
+ labels: ["GET /search/labels"],
+ repos: ["GET /search/repositories"],
+ topics: ["GET /search/topics"],
+ users: ["GET /search/users"]
+ },
+ secretScanning: {
+ getAlert: ["GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}"],
+ listAlertsForEnterprise: ["GET /enterprises/{enterprise}/secret-scanning/alerts"],
+ listAlertsForOrg: ["GET /orgs/{org}/secret-scanning/alerts"],
+ listAlertsForRepo: ["GET /repos/{owner}/{repo}/secret-scanning/alerts"],
+ listLocationsForAlert: ["GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations"],
+ 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}"],
+ addOrUpdateRepoPermissionsInOrg: ["PUT /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"],
+ checkPermissionsForProjectInOrg: ["GET /orgs/{org}/teams/{team_slug}/projects/{project_id}"],
+ 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"],
+ 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", {}, {
+ renamed: ["users", "addEmailForAuthenticatedUser"]
+ }],
+ addEmailForAuthenticatedUser: ["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", {}, {
+ renamed: ["users", "createGpgKeyForAuthenticatedUser"]
+ }],
+ createGpgKeyForAuthenticatedUser: ["POST /user/gpg_keys"],
+ createPublicSshKeyForAuthenticated: ["POST /user/keys", {}, {
+ renamed: ["users", "createPublicSshKeyForAuthenticatedUser"]
+ }],
+ createPublicSshKeyForAuthenticatedUser: ["POST /user/keys"],
+ deleteEmailForAuthenticated: ["DELETE /user/emails", {}, {
+ renamed: ["users", "deleteEmailForAuthenticatedUser"]
+ }],
+ deleteEmailForAuthenticatedUser: ["DELETE /user/emails"],
+ deleteGpgKeyForAuthenticated: ["DELETE /user/gpg_keys/{gpg_key_id}", {}, {
+ renamed: ["users", "deleteGpgKeyForAuthenticatedUser"]
+ }],
+ deleteGpgKeyForAuthenticatedUser: ["DELETE /user/gpg_keys/{gpg_key_id}"],
+ deletePublicSshKeyForAuthenticated: ["DELETE /user/keys/{key_id}", {}, {
+ renamed: ["users", "deletePublicSshKeyForAuthenticatedUser"]
+ }],
+ deletePublicSshKeyForAuthenticatedUser: ["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}", {}, {
+ renamed: ["users", "getGpgKeyForAuthenticatedUser"]
+ }],
+ getGpgKeyForAuthenticatedUser: ["GET /user/gpg_keys/{gpg_key_id}"],
+ getPublicSshKeyForAuthenticated: ["GET /user/keys/{key_id}", {}, {
+ renamed: ["users", "getPublicSshKeyForAuthenticatedUser"]
+ }],
+ getPublicSshKeyForAuthenticatedUser: ["GET /user/keys/{key_id}"],
+ list: ["GET /users"],
+ listBlockedByAuthenticated: ["GET /user/blocks", {}, {
+ renamed: ["users", "listBlockedByAuthenticatedUser"]
+ }],
+ listBlockedByAuthenticatedUser: ["GET /user/blocks"],
+ listEmailsForAuthenticated: ["GET /user/emails", {}, {
+ renamed: ["users", "listEmailsForAuthenticatedUser"]
+ }],
+ listEmailsForAuthenticatedUser: ["GET /user/emails"],
+ listFollowedByAuthenticated: ["GET /user/following", {}, {
+ renamed: ["users", "listFollowedByAuthenticatedUser"]
+ }],
+ listFollowedByAuthenticatedUser: ["GET /user/following"],
+ listFollowersForAuthenticatedUser: ["GET /user/followers"],
+ listFollowersForUser: ["GET /users/{username}/followers"],
+ listFollowingForUser: ["GET /users/{username}/following"],
+ listGpgKeysForAuthenticated: ["GET /user/gpg_keys", {}, {
+ renamed: ["users", "listGpgKeysForAuthenticatedUser"]
+ }],
+ listGpgKeysForAuthenticatedUser: ["GET /user/gpg_keys"],
+ listGpgKeysForUser: ["GET /users/{username}/gpg_keys"],
+ listPublicEmailsForAuthenticated: ["GET /user/public_emails", {}, {
+ renamed: ["users", "listPublicEmailsForAuthenticatedUser"]
+ }],
+ listPublicEmailsForAuthenticatedUser: ["GET /user/public_emails"],
+ listPublicKeysForUser: ["GET /users/{username}/keys"],
+ listPublicSshKeysForAuthenticated: ["GET /user/keys", {}, {
+ renamed: ["users", "listPublicSshKeysForAuthenticatedUser"]
+ }],
+ listPublicSshKeysForAuthenticatedUser: ["GET /user/keys"],
+ setPrimaryEmailVisibilityForAuthenticated: ["PATCH /user/email/visibility", {}, {
+ renamed: ["users", "setPrimaryEmailVisibilityForAuthenticatedUser"]
+ }],
+ setPrimaryEmailVisibilityForAuthenticatedUser: ["PATCH /user/email/visibility"],
+ unblock: ["DELETE /user/blocks/{username}"],
+ unfollow: ["DELETE /user/following/{username}"],
+ updateAuthenticated: ["PATCH /user"]
+ }
+};
+
+const VERSION = "5.16.2";
+
+function endpointsToMethods(octokit, endpointsMap) {
+ const newMethods = {};
+
+ 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);
+
+ if (!newMethods[scope]) {
+ newMethods[scope] = {};
+ }
+
+ const scopeMethods = newMethods[scope];
+
+ if (decorations) {
+ scopeMethods[methodName] = decorate(octokit, scope, methodName, endpointDefaults, decorations);
+ continue;
+ }
+
+ scopeMethods[methodName] = octokit.request.defaults(endpointDefaults);
+ }
+ }
+
+ 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`
+
+ 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];
+ }
+
+ delete options[name];
+ }
+ }
+
+ return requestWithDefaults(options);
+ } // @ts-ignore https://github.com/microsoft/TypeScript/issues/25488
+
+
+ return requestWithDefaults(...args);
+ }
+
+ return Object.assign(withDecorations, requestWithDefaults);
+}
+
+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
+ });
+}
+legacyRestEndpointMethods.VERSION = VERSION;
+
+exports.legacyRestEndpointMethods = legacyRestEndpointMethods;
+exports.restEndpointMethods = restEndpointMethods;
+//# sourceMappingURL=index.js.map
+
+
+/***/ }),
+
+/***/ 5375:
+/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+
+var core = __nccwpck_require__(4952);
+var pluginRequestLog = __nccwpck_require__(8883);
+var pluginPaginateRest = __nccwpck_require__(4193);
+var pluginRestEndpointMethods = __nccwpck_require__(3044);
+
+const VERSION = "18.12.0";
+
+const Octokit = core.Octokit.plugin(pluginRequestLog.requestLog, pluginRestEndpointMethods.legacyRestEndpointMethods, pluginPaginateRest.paginateRest).defaults({
+ userAgent: `octokit-rest.js/${VERSION}`
+});
+
+exports.Octokit = Octokit;
+//# sourceMappingURL=index.js.map
+
+
+/***/ }),
+
+/***/ 7633:
/***/ ((__unused_webpack_module, exports) => {
"use strict";
@@ -902,7 +3265,7 @@ exports.createTokenAuth = createTokenAuth;
/***/ }),
-/***/ 6762:
+/***/ 4952:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
@@ -912,12 +3275,49 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
var universalUserAgent = __nccwpck_require__(5030);
var beforeAfterHook = __nccwpck_require__(3682);
-var request = __nccwpck_require__(6234);
-var graphql = __nccwpck_require__(8467);
-var authToken = __nccwpck_require__(334);
+var request = __nccwpck_require__(6206);
+var graphql = __nccwpck_require__(7461);
+var authToken = __nccwpck_require__(7633);
-const VERSION = "4.1.0";
+function _objectWithoutPropertiesLoose(source, excluded) {
+ if (source == null) return {};
+ var target = {};
+ var sourceKeys = Object.keys(source);
+ var key, i;
+ for (i = 0; i < sourceKeys.length; i++) {
+ key = sourceKeys[i];
+ if (excluded.indexOf(key) >= 0) continue;
+ target[key] = source[key];
+ }
+
+ return target;
+}
+
+function _objectWithoutProperties(source, excluded) {
+ if (source == null) return {};
+
+ var target = _objectWithoutPropertiesLoose(source, excluded);
+
+ var key, i;
+
+ 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];
+ }
+ }
+
+ return target;
+}
+
+const VERSION = "3.6.0";
+
+const _excluded = ["authStrategy"];
class Octokit {
constructor(options = {}) {
const hook = new beforeAfterHook.Collection();
@@ -977,9 +3377,10 @@ class Octokit {
}
} else {
const {
- authStrategy,
- ...otherOptions
- } = options;
+ authStrategy
+ } = options,
+ otherOptions = _objectWithoutProperties(options, _excluded);
+
const auth = authStrategy(Object.assign({
request: this.request,
log: this.log,
@@ -1048,7 +3449,7 @@ exports.Octokit = Octokit;
/***/ }),
-/***/ 9440:
+/***/ 6065:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
@@ -1376,6 +3777,8 @@ function parse(options) {
} else {
if (Object.keys(remainingParameters).length) {
body = remainingParameters;
+ } else {
+ headers["content-length"] = 0;
}
}
} // default content-type for JSON if body is set
@@ -1418,7 +3821,7 @@ function withDefaults(oldDefaults, newDefaults) {
});
}
-const VERSION = "7.0.3";
+const VERSION = "6.0.12";
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.
@@ -1444,7 +3847,7 @@ exports.endpoint = endpoint;
/***/ }),
-/***/ 8467:
+/***/ 7461:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
@@ -1452,30 +3855,33 @@ exports.endpoint = endpoint;
Object.defineProperty(exports, "__esModule", ({ value: true }));
-var request = __nccwpck_require__(6234);
+var request = __nccwpck_require__(6206);
var universalUserAgent = __nccwpck_require__(5030);
-const VERSION = "5.0.4";
+const VERSION = "4.8.0";
function _buildMessageForResponseErrors(data) {
return `Request failed due to following response errors:\n` + data.errors.map(e => ` - ${e.message}`).join("\n");
}
+
class GraphqlResponseError extends Error {
constructor(request, headers, response) {
super(_buildMessageForResponseErrors(response));
this.request = request;
this.headers = headers;
this.response = response;
- this.name = "GraphqlResponseError";
- // Expose the errors and response data in their shorthand properties.
+ this.name = "GraphqlResponseError"; // Expose the errors and response data in their shorthand properties.
+
this.errors = response.errors;
- this.data = response.data;
- // Maintains proper stack trace (only available on V8)
+ this.data = response.data; // Maintains proper stack trace (only available on V8)
+
/* istanbul ignore next */
+
if (Error.captureStackTrace) {
Error.captureStackTrace(this, this.constructor);
}
}
+
}
const NON_VARIABLE_OPTIONS = ["method", "baseUrl", "url", "headers", "request", "query", "mediaType"];
@@ -1486,11 +3892,13 @@ function graphql(request, query, options) {
if (typeof query === "string" && "query" in options) {
return Promise.reject(new Error(`[@octokit/graphql] "query" cannot be used as variable name`));
}
+
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;
@@ -1499,38 +3907,47 @@ function graphql(request, query, options) {
result[key] = parsedOptions[key];
return result;
}
+
if (!result.variables) {
result.variables = {};
}
+
result.variables[key] = parsedOptions[key];
return result;
- }, {});
- // workaround for GitHub Enterprise baseUrl set with /api/v3 suffix
+ }, {}); // workaround for GitHub Enterprise baseUrl set with /api/v3 suffix
// https://github.com/octokit/auth-app.js/issues/111#issuecomment-657610451
+
const baseUrl = parsedOptions.baseUrl || request.endpoint.DEFAULTS.baseUrl;
+
if (GHES_V3_SUFFIX_REGEX.test(baseUrl)) {
requestOptions.url = baseUrl.replace(GHES_V3_SUFFIX_REGEX, "/api/graphql");
}
+
return request(requestOptions).then(response => {
if (response.data.errors) {
const headers = {};
+
for (const key of Object.keys(response.headers)) {
headers[key] = response.headers[key];
}
+
throw new GraphqlResponseError(requestOptions, headers, response.data);
}
+
return response.data.data;
});
}
-function withDefaults(request, newDefaults) {
- const newRequest = request.defaults(newDefaults);
+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: newRequest.endpoint
+ endpoint: request.request.endpoint
});
}
@@ -1556,1285 +3973,7 @@ exports.withCustomRequest = withCustomRequest;
/***/ }),
-/***/ 4193:
-/***/ ((__unused_webpack_module, exports) => {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", ({ value: true }));
-
-const VERSION = "5.0.1";
-
-/**
- * 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) {
- // endpoints can respond with 204 if repository is empty
- if (!response.data) {
- return {
- ...response,
- data: []
- };
- }
- 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.
- 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 (typeof incompleteResults !== "undefined") {
- response.data.incomplete_results = incompleteResults;
- }
- if (typeof repositorySelection !== "undefined") {
- response.data.repository_selection = repositorySelection;
- }
- response.data.total_count = totalCount;
- return response;
-}
-
-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
- };
- try {
- 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
- };
- } catch (error) {
- if (error.status !== 409) throw error;
- url = "";
- return {
- value: {
- status: 200,
- headers: {},
- data: []
- }
- };
- }
- }
- })
- };
-}
-
-function paginate(octokit, route, parameters, mapFn) {
- if (typeof parameters === "function") {
- mapFn = parameters;
- parameters = undefined;
- }
- 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;
- }
- let earlyExit = false;
- function done() {
- earlyExit = true;
- }
- results = results.concat(mapFn ? mapFn(result.value, done) : result.value.data);
- if (earlyExit) {
- return results;
- }
- return gather(octokit, results, iterator, mapFn);
- });
-}
-
-const composePaginateRest = Object.assign(paginate, {
- iterator
-});
-
-const paginatingEndpoints = ["GET /app/hook/deliveries", "GET /app/installations", "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}/code-scanning/alerts", "GET /enterprises/{enterprise}/secret-scanning/alerts", "GET /enterprises/{enterprise}/settings/billing/advanced-security", "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 /licenses", "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 /organizations/{org}/codespaces/secrets", "GET /organizations/{org}/codespaces/secrets/{secret_name}/repositories", "GET /orgs/{org}/actions/cache/usage-by-repository", "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/secrets", "GET /orgs/{org}/actions/secrets/{secret_name}/repositories", "GET /orgs/{org}/blocks", "GET /orgs/{org}/code-scanning/alerts", "GET /orgs/{org}/codespaces", "GET /orgs/{org}/dependabot/secrets", "GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories", "GET /orgs/{org}/events", "GET /orgs/{org}/failed_invitations", "GET /orgs/{org}/hooks", "GET /orgs/{org}/hooks/{hook_id}/deliveries", "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}/packages", "GET /orgs/{org}/packages/{package_type}/{package_name}/versions", "GET /orgs/{org}/projects", "GET /orgs/{org}/public_members", "GET /orgs/{org}/repos", "GET /orgs/{org}/secret-scanning/alerts", "GET /orgs/{org}/settings/billing/advanced-security", "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}/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/caches", "GET /repos/{owner}/{repo}/actions/runners", "GET /repos/{owner}/{repo}/actions/runs", "GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts", "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs", "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}/codespaces", "GET /repos/{owner}/{repo}/codespaces/devcontainers", "GET /repos/{owner}/{repo}/codespaces/secrets", "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}/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}/status", "GET /repos/{owner}/{repo}/commits/{ref}/statuses", "GET /repos/{owner}/{repo}/contributors", "GET /repos/{owner}/{repo}/dependabot/alerts", "GET /repos/{owner}/{repo}/dependabot/secrets", "GET /repos/{owner}/{repo}/deployments", "GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses", "GET /repos/{owner}/{repo}/environments", "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies", "GET /repos/{owner}/{repo}/events", "GET /repos/{owner}/{repo}/forks", "GET /repos/{owner}/{repo}/hooks", "GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries", "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}/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}/releases/{release_id}/reactions", "GET /repos/{owner}/{repo}/secret-scanning/alerts", "GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations", "GET /repos/{owner}/{repo}/stargazers", "GET /repos/{owner}/{repo}/subscribers", "GET /repos/{owner}/{repo}/tags", "GET /repos/{owner}/{repo}/teams", "GET /repos/{owner}/{repo}/topics", "GET /repositories", "GET /repositories/{repository_id}/environments/{environment_name}/secrets", "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}/teams", "GET /user/blocks", "GET /user/codespaces", "GET /user/codespaces/secrets", "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/packages", "GET /user/packages/{package_type}/{package_name}/versions", "GET /user/public_emails", "GET /user/repos", "GET /user/repository_invitations", "GET /user/ssh_signing_keys", "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}/packages", "GET /users/{username}/projects", "GET /users/{username}/received_events", "GET /users/{username}/received_events/public", "GET /users/{username}/repos", "GET /users/{username}/ssh_signing_keys", "GET /users/{username}/starred", "GET /users/{username}/subscriptions"];
-
-function isPaginatingEndpoint(arg) {
- if (typeof arg === "string") {
- return paginatingEndpoints.includes(arg);
- } else {
- return false;
- }
-}
-
-/**
- * @param octokit Octokit instance
- * @param options Options passed to Octokit constructor
- */
-function paginateRest(octokit) {
- return {
- paginate: Object.assign(paginate.bind(null, octokit), {
- iterator: iterator.bind(null, octokit)
- })
- };
-}
-paginateRest.VERSION = VERSION;
-
-exports.composePaginateRest = composePaginateRest;
-exports.isPaginatingEndpoint = isPaginatingEndpoint;
-exports.paginateRest = paginateRest;
-exports.paginatingEndpoints = paginatingEndpoints;
-//# sourceMappingURL=index.js.map
-
-
-/***/ }),
-
-/***/ 8883:
-/***/ ((__unused_webpack_module, exports) => {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", ({ value: true }));
-
-const VERSION = "1.0.4";
-
-/**
- * @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;
-
-exports.requestLog = requestLog;
-//# sourceMappingURL=index.js.map
-
-
-/***/ }),
-
-/***/ 3044:
-/***/ ((__unused_webpack_module, exports) => {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", ({ value: true }));
-
-const Endpoints = {
- actions: {
- addCustomLabelsToSelfHostedRunnerForOrg: ["POST /orgs/{org}/actions/runners/{runner_id}/labels"],
- addCustomLabelsToSelfHostedRunnerForRepo: ["POST /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"],
- 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"],
- deleteActionsCacheById: ["DELETE /repos/{owner}/{repo}/actions/caches/{cache_id}"],
- deleteActionsCacheByKey: ["DELETE /repos/{owner}/{repo}/actions/caches{?key,ref}"],
- 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"],
- downloadWorkflowRunAttemptLogs: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/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"],
- getActionsCacheList: ["GET /repos/{owner}/{repo}/actions/caches"],
- getActionsCacheUsage: ["GET /repos/{owner}/{repo}/actions/cache/usage"],
- getActionsCacheUsageByRepoForOrg: ["GET /orgs/{org}/actions/cache/usage-by-repository"],
- getActionsCacheUsageForEnterprise: ["GET /enterprises/{enterprise}/actions/cache/usage"],
- getActionsCacheUsageForOrg: ["GET /orgs/{org}/actions/cache/usage"],
- 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}"],
- getGithubActionsDefaultWorkflowPermissionsEnterprise: ["GET /enterprises/{enterprise}/actions/permissions/workflow"],
- getGithubActionsDefaultWorkflowPermissionsOrganization: ["GET /orgs/{org}/actions/permissions/workflow"],
- getGithubActionsDefaultWorkflowPermissionsRepository: ["GET /repos/{owner}/{repo}/actions/permissions/workflow"],
- 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}"],
- getWorkflowAccessToRepository: ["GET /repos/{owner}/{repo}/actions/permissions/access"],
- getWorkflowRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}"],
- getWorkflowRunAttempt: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}"],
- 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"],
- listJobsForWorkflowRunAttempt: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs"],
- listLabelsForSelfHostedRunnerForOrg: ["GET /orgs/{org}/actions/runners/{runner_id}/labels"],
- listLabelsForSelfHostedRunnerForRepo: ["GET /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"],
- 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"],
- reRunJobForWorkflowRun: ["POST /repos/{owner}/{repo}/actions/jobs/{job_id}/rerun"],
- reRunWorkflow: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun"],
- reRunWorkflowFailedJobs: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun-failed-jobs"],
- removeAllCustomLabelsFromSelfHostedRunnerForOrg: ["DELETE /orgs/{org}/actions/runners/{runner_id}/labels"],
- removeAllCustomLabelsFromSelfHostedRunnerForRepo: ["DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"],
- removeCustomLabelFromSelfHostedRunnerForOrg: ["DELETE /orgs/{org}/actions/runners/{runner_id}/labels/{name}"],
- removeCustomLabelFromSelfHostedRunnerForRepo: ["DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels/{name}"],
- 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"],
- setCustomLabelsForSelfHostedRunnerForOrg: ["PUT /orgs/{org}/actions/runners/{runner_id}/labels"],
- setCustomLabelsForSelfHostedRunnerForRepo: ["PUT /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"],
- setGithubActionsDefaultWorkflowPermissionsEnterprise: ["PUT /enterprises/{enterprise}/actions/permissions/workflow"],
- setGithubActionsDefaultWorkflowPermissionsOrganization: ["PUT /orgs/{org}/actions/permissions/workflow"],
- setGithubActionsDefaultWorkflowPermissionsRepository: ["PUT /repos/{owner}/{repo}/actions/permissions/workflow"],
- 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"],
- setWorkflowAccessToRepository: ["PUT /repos/{owner}/{repo}/actions/permissions/access"]
- },
- 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}", {}, {
- renamed: ["apps", "addRepoToInstallationForAuthenticatedUser"]
- }],
- addRepoToInstallationForAuthenticatedUser: ["PUT /user/installations/{installation_id}/repositories/{repository_id}"],
- checkToken: ["POST /applications/{client_id}/token"],
- 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"],
- getWebhookDelivery: ["GET /app/hook/deliveries/{delivery_id}"],
- 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"],
- listWebhookDeliveries: ["GET /app/hook/deliveries"],
- redeliverWebhookDelivery: ["POST /app/hook/deliveries/{delivery_id}/attempts"],
- removeRepoFromInstallation: ["DELETE /user/installations/{installation_id}/repositories/{repository_id}", {}, {
- renamed: ["apps", "removeRepoFromInstallationForAuthenticatedUser"]
- }],
- removeRepoFromInstallationForAuthenticatedUser: ["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"],
- getGithubAdvancedSecurityBillingGhe: ["GET /enterprises/{enterprise}/settings/billing/advanced-security"],
- getGithubAdvancedSecurityBillingOrg: ["GET /orgs/{org}/settings/billing/advanced-security"],
- 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"],
- rerequestRun: ["POST /repos/{owner}/{repo}/check-runs/{check_run_id}/rerequest"],
- 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}"],
- getCodeqlDatabase: ["GET /repos/{owner}/{repo}/code-scanning/codeql/databases/{language}"],
- getSarif: ["GET /repos/{owner}/{repo}/code-scanning/sarifs/{sarif_id}"],
- listAlertInstances: ["GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances"],
- listAlertsForEnterprise: ["GET /enterprises/{enterprise}/code-scanning/alerts"],
- listAlertsForOrg: ["GET /orgs/{org}/code-scanning/alerts"],
- listAlertsForRepo: ["GET /repos/{owner}/{repo}/code-scanning/alerts"],
- listAlertsInstances: ["GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances", {}, {
- renamed: ["codeScanning", "listAlertInstances"]
- }],
- listCodeqlDatabases: ["GET /repos/{owner}/{repo}/code-scanning/codeql/databases"],
- 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"],
- getConductCode: ["GET /codes_of_conduct/{key}"]
- },
- codespaces: {
- addRepositoryForSecretForAuthenticatedUser: ["PUT /user/codespaces/secrets/{secret_name}/repositories/{repository_id}"],
- addSelectedRepoToOrgSecret: ["PUT /organizations/{org}/codespaces/secrets/{secret_name}/repositories/{repository_id}"],
- codespaceMachinesForAuthenticatedUser: ["GET /user/codespaces/{codespace_name}/machines"],
- createForAuthenticatedUser: ["POST /user/codespaces"],
- createOrUpdateOrgSecret: ["PUT /organizations/{org}/codespaces/secrets/{secret_name}"],
- createOrUpdateRepoSecret: ["PUT /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"],
- createOrUpdateSecretForAuthenticatedUser: ["PUT /user/codespaces/secrets/{secret_name}"],
- createWithPrForAuthenticatedUser: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/codespaces"],
- createWithRepoForAuthenticatedUser: ["POST /repos/{owner}/{repo}/codespaces"],
- deleteForAuthenticatedUser: ["DELETE /user/codespaces/{codespace_name}"],
- deleteFromOrganization: ["DELETE /orgs/{org}/members/{username}/codespaces/{codespace_name}"],
- deleteOrgSecret: ["DELETE /organizations/{org}/codespaces/secrets/{secret_name}"],
- deleteRepoSecret: ["DELETE /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"],
- deleteSecretForAuthenticatedUser: ["DELETE /user/codespaces/secrets/{secret_name}"],
- exportForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/exports"],
- getExportDetailsForAuthenticatedUser: ["GET /user/codespaces/{codespace_name}/exports/{export_id}"],
- getForAuthenticatedUser: ["GET /user/codespaces/{codespace_name}"],
- getOrgPublicKey: ["GET /organizations/{org}/codespaces/secrets/public-key"],
- getOrgSecret: ["GET /organizations/{org}/codespaces/secrets/{secret_name}"],
- getPublicKeyForAuthenticatedUser: ["GET /user/codespaces/secrets/public-key"],
- getRepoPublicKey: ["GET /repos/{owner}/{repo}/codespaces/secrets/public-key"],
- getRepoSecret: ["GET /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"],
- getSecretForAuthenticatedUser: ["GET /user/codespaces/secrets/{secret_name}"],
- listDevcontainersInRepositoryForAuthenticatedUser: ["GET /repos/{owner}/{repo}/codespaces/devcontainers"],
- listForAuthenticatedUser: ["GET /user/codespaces"],
- listInOrganization: ["GET /orgs/{org}/codespaces", {}, {
- renamedParameters: {
- org_id: "org"
- }
- }],
- listInRepositoryForAuthenticatedUser: ["GET /repos/{owner}/{repo}/codespaces"],
- listOrgSecrets: ["GET /organizations/{org}/codespaces/secrets"],
- listRepoSecrets: ["GET /repos/{owner}/{repo}/codespaces/secrets"],
- listRepositoriesForSecretForAuthenticatedUser: ["GET /user/codespaces/secrets/{secret_name}/repositories"],
- listSecretsForAuthenticatedUser: ["GET /user/codespaces/secrets"],
- listSelectedReposForOrgSecret: ["GET /organizations/{org}/codespaces/secrets/{secret_name}/repositories"],
- preFlightWithRepoForAuthenticatedUser: ["GET /repos/{owner}/{repo}/codespaces/new"],
- removeRepositoryForSecretForAuthenticatedUser: ["DELETE /user/codespaces/secrets/{secret_name}/repositories/{repository_id}"],
- removeSelectedRepoFromOrgSecret: ["DELETE /organizations/{org}/codespaces/secrets/{secret_name}/repositories/{repository_id}"],
- repoMachinesForAuthenticatedUser: ["GET /repos/{owner}/{repo}/codespaces/machines"],
- setRepositoriesForSecretForAuthenticatedUser: ["PUT /user/codespaces/secrets/{secret_name}/repositories"],
- setSelectedReposForOrgSecret: ["PUT /organizations/{org}/codespaces/secrets/{secret_name}/repositories"],
- startForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/start"],
- stopForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/stop"],
- stopInOrganization: ["POST /orgs/{org}/members/{username}/codespaces/{codespace_name}/stop"],
- updateForAuthenticatedUser: ["PATCH /user/codespaces/{codespace_name}"]
- },
- dependabot: {
- addSelectedRepoToOrgSecret: ["PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}"],
- createOrUpdateOrgSecret: ["PUT /orgs/{org}/dependabot/secrets/{secret_name}"],
- createOrUpdateRepoSecret: ["PUT /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"],
- deleteOrgSecret: ["DELETE /orgs/{org}/dependabot/secrets/{secret_name}"],
- deleteRepoSecret: ["DELETE /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"],
- getAlert: ["GET /repos/{owner}/{repo}/dependabot/alerts/{alert_number}"],
- getOrgPublicKey: ["GET /orgs/{org}/dependabot/secrets/public-key"],
- getOrgSecret: ["GET /orgs/{org}/dependabot/secrets/{secret_name}"],
- getRepoPublicKey: ["GET /repos/{owner}/{repo}/dependabot/secrets/public-key"],
- getRepoSecret: ["GET /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"],
- listAlertsForRepo: ["GET /repos/{owner}/{repo}/dependabot/alerts"],
- listOrgSecrets: ["GET /orgs/{org}/dependabot/secrets"],
- listRepoSecrets: ["GET /repos/{owner}/{repo}/dependabot/secrets"],
- listSelectedReposForOrgSecret: ["GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories"],
- removeSelectedRepoFromOrgSecret: ["DELETE /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}"],
- setSelectedReposForOrgSecret: ["PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories"],
- updateAlert: ["PATCH /repos/{owner}/{repo}/dependabot/alerts/{alert_number}"]
- },
- dependencyGraph: {
- createRepositorySnapshot: ["POST /repos/{owner}/{repo}/dependency-graph/snapshots"],
- diffRange: ["GET /repos/{owner}/{repo}/dependency-graph/compare/{basehead}"]
- },
- emojis: {
- get: ["GET /emojis"]
- },
- enterpriseAdmin: {
- addCustomLabelsToSelfHostedRunnerForEnterprise: ["POST /enterprises/{enterprise}/actions/runners/{runner_id}/labels"],
- 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"],
- getServerStatistics: ["GET /enterprise-installation/{enterprise_or_org}/server-statistics"],
- listLabelsForSelfHostedRunnerForEnterprise: ["GET /enterprises/{enterprise}/actions/runners/{runner_id}/labels"],
- listSelectedOrganizationsEnabledGithubActionsEnterprise: ["GET /enterprises/{enterprise}/actions/permissions/organizations"],
- removeAllCustomLabelsFromSelfHostedRunnerForEnterprise: ["DELETE /enterprises/{enterprise}/actions/runners/{runner_id}/labels"],
- removeCustomLabelFromSelfHostedRunnerForEnterprise: ["DELETE /enterprises/{enterprise}/actions/runners/{runner_id}/labels/{name}"],
- setAllowedActionsEnterprise: ["PUT /enterprises/{enterprise}/actions/permissions/selected-actions"],
- setCustomLabelsForSelfHostedRunnerForEnterprise: ["PUT /enterprises/{enterprise}/actions/runners/{runner_id}/labels"],
- 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"],
- 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"],
- deleteArchiveForOrg: ["DELETE /orgs/{org}/migrations/{migration_id}/archive"],
- downloadArchiveForOrg: ["GET /orgs/{org}/migrations/{migration_id}/archive"],
- getArchiveForAuthenticatedUser: ["GET /user/migrations/{migration_id}/archive"],
- 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}"],
- getStatusForOrg: ["GET /orgs/{org}/migrations/{migration_id}"],
- listForAuthenticatedUser: ["GET /user/migrations"],
- listForOrg: ["GET /orgs/{org}/migrations"],
- listReposForAuthenticatedUser: ["GET /user/migrations/{migration_id}/repositories"],
- listReposForOrg: ["GET /orgs/{org}/migrations/{migration_id}/repositories"],
- listReposForUser: ["GET /user/migrations/{migration_id}/repositories", {}, {
- renamed: ["migrations", "listReposForAuthenticatedUser"]
- }],
- 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"],
- unlockRepoForOrg: ["DELETE /orgs/{org}/migrations/{migration_id}/repos/{repo_name}/lock"],
- updateImport: ["PATCH /repos/{owner}/{repo}/import"]
- },
- orgs: {
- addSecurityManagerTeam: ["PUT /orgs/{org}/security-managers/teams/{team_slug}"],
- 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}"],
- createCustomRole: ["POST /orgs/{org}/custom_roles"],
- createInvitation: ["POST /orgs/{org}/invitations"],
- createWebhook: ["POST /orgs/{org}/hooks"],
- deleteCustomRole: ["DELETE /orgs/{org}/custom_roles/{role_id}"],
- deleteWebhook: ["DELETE /orgs/{org}/hooks/{hook_id}"],
- enableOrDisableSecurityProductOnAllOrgRepos: ["POST /orgs/{org}/{security_product}/{enablement}"],
- 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"],
- getWebhookDelivery: ["GET /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}"],
- list: ["GET /organizations"],
- listAppInstallations: ["GET /orgs/{org}/installations"],
- listBlockedUsers: ["GET /orgs/{org}/blocks"],
- listCustomRoles: ["GET /organizations/{organization_id}/custom_roles"],
- listFailedInvitations: ["GET /orgs/{org}/failed_invitations"],
- listFineGrainedPermissions: ["GET /orgs/{org}/fine_grained_permissions"],
- 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"],
- listSecurityManagerTeams: ["GET /orgs/{org}/security-managers"],
- listWebhookDeliveries: ["GET /orgs/{org}/hooks/{hook_id}/deliveries"],
- listWebhooks: ["GET /orgs/{org}/hooks"],
- pingWebhook: ["POST /orgs/{org}/hooks/{hook_id}/pings"],
- redeliverWebhookDelivery: ["POST /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}/attempts"],
- 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}"],
- removeSecurityManagerTeam: ["DELETE /orgs/{org}/security-managers/teams/{team_slug}"],
- setMembershipForUser: ["PUT /orgs/{org}/memberships/{username}"],
- setPublicMembershipForAuthenticatedUser: ["PUT /orgs/{org}/public_members/{username}"],
- unblockUser: ["DELETE /orgs/{org}/blocks/{username}"],
- update: ["PATCH /orgs/{org}"],
- updateCustomRole: ["PATCH /orgs/{org}/custom_roles/{role_id}"],
- 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}"],
- deletePackageForUser: ["DELETE /users/{username}/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}"],
- deletePackageVersionForUser: ["DELETE /users/{username}/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}"],
- listPackagesForAuthenticatedUser: ["GET /user/packages"],
- listPackagesForOrganization: ["GET /orgs/{org}/packages"],
- listPackagesForUser: ["GET /users/{username}/packages"],
- restorePackageForAuthenticatedUser: ["POST /user/packages/{package_type}/{package_name}/restore{?token}"],
- restorePackageForOrg: ["POST /orgs/{org}/packages/{package_type}/{package_name}/restore{?token}"],
- restorePackageForUser: ["POST /users/{username}/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"],
- restorePackageVersionForUser: ["POST /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore"]
- },
- projects: {
- addCollaborator: ["PUT /projects/{project_id}/collaborators/{username}"],
- createCard: ["POST /projects/columns/{column_id}/cards"],
- createColumn: ["POST /projects/{project_id}/columns"],
- createForAuthenticatedUser: ["POST /user/projects"],
- createForOrg: ["POST /orgs/{org}/projects"],
- createForRepo: ["POST /repos/{owner}/{repo}/projects"],
- delete: ["DELETE /projects/{project_id}"],
- deleteCard: ["DELETE /projects/columns/cards/{card_id}"],
- deleteColumn: ["DELETE /projects/columns/{column_id}"],
- get: ["GET /projects/{project_id}"],
- getCard: ["GET /projects/columns/cards/{card_id}"],
- getColumn: ["GET /projects/columns/{column_id}"],
- getPermissionForUser: ["GET /projects/{project_id}/collaborators/{username}/permission"],
- listCards: ["GET /projects/columns/{column_id}/cards"],
- listCollaborators: ["GET /projects/{project_id}/collaborators"],
- listColumns: ["GET /projects/{project_id}/columns"],
- listForOrg: ["GET /orgs/{org}/projects"],
- listForRepo: ["GET /repos/{owner}/{repo}/projects"],
- listForUser: ["GET /users/{username}/projects"],
- moveCard: ["POST /projects/columns/cards/{card_id}/moves"],
- moveColumn: ["POST /projects/columns/{column_id}/moves"],
- removeCollaborator: ["DELETE /projects/{project_id}/collaborators/{username}"],
- update: ["PATCH /projects/{project_id}"],
- updateCard: ["PATCH /projects/columns/cards/{card_id}"],
- updateColumn: ["PATCH /projects/columns/{column_id}"]
- },
- 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"],
- 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"],
- createForIssue: ["POST /repos/{owner}/{repo}/issues/{issue_number}/reactions"],
- createForIssueComment: ["POST /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions"],
- createForPullRequestReviewComment: ["POST /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions"],
- createForRelease: ["POST /repos/{owner}/{repo}/releases/{release_id}/reactions"],
- createForTeamDiscussionCommentInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions"],
- createForTeamDiscussionInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions"],
- deleteForCommitComment: ["DELETE /repos/{owner}/{repo}/comments/{comment_id}/reactions/{reaction_id}"],
- deleteForIssue: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/reactions/{reaction_id}"],
- deleteForIssueComment: ["DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions/{reaction_id}"],
- deleteForPullRequestComment: ["DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions/{reaction_id}"],
- deleteForRelease: ["DELETE /repos/{owner}/{repo}/releases/{release_id}/reactions/{reaction_id}"],
- deleteForTeamDiscussion: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions/{reaction_id}"],
- deleteForTeamDiscussionComment: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions/{reaction_id}"],
- listForCommitComment: ["GET /repos/{owner}/{repo}/comments/{comment_id}/reactions"],
- listForIssue: ["GET /repos/{owner}/{repo}/issues/{issue_number}/reactions"],
- listForIssueComment: ["GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions"],
- listForPullRequestReviewComment: ["GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions"],
- listForRelease: ["GET /repos/{owner}/{repo}/releases/{release_id}/reactions"],
- listForTeamDiscussionCommentInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions"],
- listForTeamDiscussionInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions"]
- },
- repos: {
- acceptInvitation: ["PATCH /user/repository_invitations/{invitation_id}", {}, {
- renamed: ["repos", "acceptInvitationForAuthenticatedUser"]
- }],
- acceptInvitationForAuthenticatedUser: ["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"],
- codeownersErrors: ["GET /repos/{owner}/{repo}/codeowners/errors"],
- compareCommits: ["GET /repos/{owner}/{repo}/compare/{base}...{head}"],
- compareCommitsWithBasehead: ["GET /repos/{owner}/{repo}/compare/{basehead}"],
- createAutolink: ["POST /repos/{owner}/{repo}/autolinks"],
- createCommitComment: ["POST /repos/{owner}/{repo}/commits/{commit_sha}/comments"],
- createCommitSignatureProtection: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures"],
- createCommitStatus: ["POST /repos/{owner}/{repo}/statuses/{sha}"],
- createDeployKey: ["POST /repos/{owner}/{repo}/keys"],
- createDeployment: ["POST /repos/{owner}/{repo}/deployments"],
- createDeploymentBranchPolicy: ["POST /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies"],
- 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}"],
- createPagesDeployment: ["POST /repos/{owner}/{repo}/pages/deployment"],
- createPagesSite: ["POST /repos/{owner}/{repo}/pages"],
- createRelease: ["POST /repos/{owner}/{repo}/releases"],
- createTagProtection: ["POST /repos/{owner}/{repo}/tags/protection"],
- createUsingTemplate: ["POST /repos/{template_owner}/{template_repo}/generate"],
- createWebhook: ["POST /repos/{owner}/{repo}/hooks"],
- declineInvitation: ["DELETE /user/repository_invitations/{invitation_id}", {}, {
- renamed: ["repos", "declineInvitationForAuthenticatedUser"]
- }],
- declineInvitationForAuthenticatedUser: ["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}"],
- deleteAutolink: ["DELETE /repos/{owner}/{repo}/autolinks/{autolink_id}"],
- 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"],
- deleteDeployKey: ["DELETE /repos/{owner}/{repo}/keys/{key_id}"],
- deleteDeployment: ["DELETE /repos/{owner}/{repo}/deployments/{deployment_id}"],
- deleteDeploymentBranchPolicy: ["DELETE /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}"],
- deleteFile: ["DELETE /repos/{owner}/{repo}/contents/{path}"],
- deleteInvitation: ["DELETE /repos/{owner}/{repo}/invitations/{invitation_id}"],
- deletePagesSite: ["DELETE /repos/{owner}/{repo}/pages"],
- 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}"],
- deleteTagProtection: ["DELETE /repos/{owner}/{repo}/tags/protection/{tag_protection_id}"],
- deleteWebhook: ["DELETE /repos/{owner}/{repo}/hooks/{hook_id}"],
- disableAutomatedSecurityFixes: ["DELETE /repos/{owner}/{repo}/automated-security-fixes"],
- disableLfsForRepo: ["DELETE /repos/{owner}/{repo}/lfs"],
- disableVulnerabilityAlerts: ["DELETE /repos/{owner}/{repo}/vulnerability-alerts"],
- 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"],
- enableLfsForRepo: ["PUT /repos/{owner}/{repo}/lfs"],
- enableVulnerabilityAlerts: ["PUT /repos/{owner}/{repo}/vulnerability-alerts"],
- generateReleaseNotes: ["POST /repos/{owner}/{repo}/releases/generate-notes"],
- 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"],
- getAppsWithAccessToProtectedBranch: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps"],
- getAutolink: ["GET /repos/{owner}/{repo}/autolinks/{autolink_id}"],
- 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"],
- 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}"],
- getDeploymentBranchPolicy: ["GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_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"],
- getWebhookDelivery: ["GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}"],
- listAutolinks: ["GET /repos/{owner}/{repo}/autolinks"],
- listBranches: ["GET /repos/{owner}/{repo}/branches"],
- listBranchesForHeadCommit: ["GET /repos/{owner}/{repo}/commits/{commit_sha}/branches-where-head"],
- 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"],
- listDeploymentBranchPolicies: ["GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies"],
- 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"],
- listReleaseAssets: ["GET /repos/{owner}/{repo}/releases/{release_id}/assets"],
- listReleases: ["GET /repos/{owner}/{repo}/releases"],
- listTagProtection: ["GET /repos/{owner}/{repo}/tags/protection"],
- listTags: ["GET /repos/{owner}/{repo}/tags"],
- listTeams: ["GET /repos/{owner}/{repo}/teams"],
- listWebhookDeliveries: ["GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries"],
- listWebhooks: ["GET /repos/{owner}/{repo}/hooks"],
- merge: ["POST /repos/{owner}/{repo}/merges"],
- mergeUpstream: ["POST /repos/{owner}/{repo}/merge-upstream"],
- pingWebhook: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/pings"],
- redeliverWebhookDelivery: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}/attempts"],
- 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"],
- 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}"],
- updateDeploymentBranchPolicy: ["PUT /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_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"],
- issuesAndPullRequests: ["GET /search/issues"],
- labels: ["GET /search/labels"],
- repos: ["GET /search/repositories"],
- topics: ["GET /search/topics"],
- users: ["GET /search/users"]
- },
- secretScanning: {
- getAlert: ["GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}"],
- listAlertsForEnterprise: ["GET /enterprises/{enterprise}/secret-scanning/alerts"],
- listAlertsForOrg: ["GET /orgs/{org}/secret-scanning/alerts"],
- listAlertsForRepo: ["GET /repos/{owner}/{repo}/secret-scanning/alerts"],
- listLocationsForAlert: ["GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations"],
- 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}"],
- addOrUpdateRepoPermissionsInOrg: ["PUT /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"],
- checkPermissionsForProjectInOrg: ["GET /orgs/{org}/teams/{team_slug}/projects/{project_id}"],
- 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"],
- 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", {}, {
- renamed: ["users", "addEmailForAuthenticatedUser"]
- }],
- addEmailForAuthenticatedUser: ["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", {}, {
- renamed: ["users", "createGpgKeyForAuthenticatedUser"]
- }],
- createGpgKeyForAuthenticatedUser: ["POST /user/gpg_keys"],
- createPublicSshKeyForAuthenticated: ["POST /user/keys", {}, {
- renamed: ["users", "createPublicSshKeyForAuthenticatedUser"]
- }],
- createPublicSshKeyForAuthenticatedUser: ["POST /user/keys"],
- createSshSigningKeyForAuthenticatedUser: ["POST /user/ssh_signing_keys"],
- deleteEmailForAuthenticated: ["DELETE /user/emails", {}, {
- renamed: ["users", "deleteEmailForAuthenticatedUser"]
- }],
- deleteEmailForAuthenticatedUser: ["DELETE /user/emails"],
- deleteGpgKeyForAuthenticated: ["DELETE /user/gpg_keys/{gpg_key_id}", {}, {
- renamed: ["users", "deleteGpgKeyForAuthenticatedUser"]
- }],
- deleteGpgKeyForAuthenticatedUser: ["DELETE /user/gpg_keys/{gpg_key_id}"],
- deletePublicSshKeyForAuthenticated: ["DELETE /user/keys/{key_id}", {}, {
- renamed: ["users", "deletePublicSshKeyForAuthenticatedUser"]
- }],
- deletePublicSshKeyForAuthenticatedUser: ["DELETE /user/keys/{key_id}"],
- deleteSshSigningKeyForAuthenticatedUser: ["DELETE /user/ssh_signing_keys/{ssh_signing_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}", {}, {
- renamed: ["users", "getGpgKeyForAuthenticatedUser"]
- }],
- getGpgKeyForAuthenticatedUser: ["GET /user/gpg_keys/{gpg_key_id}"],
- getPublicSshKeyForAuthenticated: ["GET /user/keys/{key_id}", {}, {
- renamed: ["users", "getPublicSshKeyForAuthenticatedUser"]
- }],
- getPublicSshKeyForAuthenticatedUser: ["GET /user/keys/{key_id}"],
- getSshSigningKeyForAuthenticatedUser: ["GET /user/ssh_signing_keys/{ssh_signing_key_id}"],
- list: ["GET /users"],
- listBlockedByAuthenticated: ["GET /user/blocks", {}, {
- renamed: ["users", "listBlockedByAuthenticatedUser"]
- }],
- listBlockedByAuthenticatedUser: ["GET /user/blocks"],
- listEmailsForAuthenticated: ["GET /user/emails", {}, {
- renamed: ["users", "listEmailsForAuthenticatedUser"]
- }],
- listEmailsForAuthenticatedUser: ["GET /user/emails"],
- listFollowedByAuthenticated: ["GET /user/following", {}, {
- renamed: ["users", "listFollowedByAuthenticatedUser"]
- }],
- listFollowedByAuthenticatedUser: ["GET /user/following"],
- listFollowersForAuthenticatedUser: ["GET /user/followers"],
- listFollowersForUser: ["GET /users/{username}/followers"],
- listFollowingForUser: ["GET /users/{username}/following"],
- listGpgKeysForAuthenticated: ["GET /user/gpg_keys", {}, {
- renamed: ["users", "listGpgKeysForAuthenticatedUser"]
- }],
- listGpgKeysForAuthenticatedUser: ["GET /user/gpg_keys"],
- listGpgKeysForUser: ["GET /users/{username}/gpg_keys"],
- listPublicEmailsForAuthenticated: ["GET /user/public_emails", {}, {
- renamed: ["users", "listPublicEmailsForAuthenticatedUser"]
- }],
- listPublicEmailsForAuthenticatedUser: ["GET /user/public_emails"],
- listPublicKeysForUser: ["GET /users/{username}/keys"],
- listPublicSshKeysForAuthenticated: ["GET /user/keys", {}, {
- renamed: ["users", "listPublicSshKeysForAuthenticatedUser"]
- }],
- listPublicSshKeysForAuthenticatedUser: ["GET /user/keys"],
- listSshSigningKeysForAuthenticatedUser: ["GET /user/ssh_signing_keys"],
- listSshSigningKeysForUser: ["GET /users/{username}/ssh_signing_keys"],
- setPrimaryEmailVisibilityForAuthenticated: ["PATCH /user/email/visibility", {}, {
- renamed: ["users", "setPrimaryEmailVisibilityForAuthenticatedUser"]
- }],
- setPrimaryEmailVisibilityForAuthenticatedUser: ["PATCH /user/email/visibility"],
- unblock: ["DELETE /user/blocks/{username}"],
- unfollow: ["DELETE /user/following/{username}"],
- updateAuthenticated: ["PATCH /user"]
- }
-};
-
-const VERSION = "6.7.0";
-
-function endpointsToMethods(octokit, endpointsMap) {
- const newMethods = {};
- 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);
- if (!newMethods[scope]) {
- newMethods[scope] = {};
- }
- const scopeMethods = newMethods[scope];
- if (decorations) {
- scopeMethods[methodName] = decorate(octokit, scope, methodName, endpointDefaults, decorations);
- continue;
- }
- scopeMethods[methodName] = octokit.request.defaults(endpointDefaults);
- }
- }
- 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`
- 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];
- }
- delete options[name];
- }
- }
- return requestWithDefaults(options);
- }
- // @ts-ignore https://github.com/microsoft/TypeScript/issues/25488
- return requestWithDefaults(...args);
- }
- return Object.assign(withDecorations, requestWithDefaults);
-}
-
-function restEndpointMethods(octokit) {
- const api = endpointsToMethods(octokit, Endpoints);
- return {
- rest: api
- };
-}
-restEndpointMethods.VERSION = VERSION;
-function legacyRestEndpointMethods(octokit) {
- const api = endpointsToMethods(octokit, Endpoints);
- return {
- ...api,
- rest: api
- };
-}
-legacyRestEndpointMethods.VERSION = VERSION;
-
-exports.legacyRestEndpointMethods = legacyRestEndpointMethods;
-exports.restEndpointMethods = restEndpointMethods;
-//# sourceMappingURL=index.js.map
-
-
-/***/ }),
-
-/***/ 537:
+/***/ 6239:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
@@ -2916,7 +4055,7 @@ exports.RequestError = RequestError;
/***/ }),
-/***/ 6234:
+/***/ 6206:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
@@ -2926,13 +4065,13 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
-var endpoint = __nccwpck_require__(9440);
+var endpoint = __nccwpck_require__(6065);
var universalUserAgent = __nccwpck_require__(5030);
var isPlainObject = __nccwpck_require__(3287);
var nodeFetch = _interopDefault(__nccwpck_require__(467));
-var requestError = __nccwpck_require__(537);
+var requestError = __nccwpck_require__(6239);
-const VERSION = "6.2.2";
+const VERSION = "5.6.3";
function getBufferResponse(response) {
return response.arrayBuffer();
@@ -2948,9 +4087,7 @@ function fetchWrapper(requestOptions) {
let headers = {};
let status;
let url;
- const fetch = requestOptions.request && requestOptions.request.fetch || globalThis.fetch ||
- /* istanbul ignore next */
- nodeFetch;
+ const fetch = requestOptions.request && requestOptions.request.fetch || nodeFetch;
return fetch(requestOptions.url, Object.assign({
method: requestOptions.method,
body: requestOptions.body,
@@ -3028,7 +4165,7 @@ function fetchWrapper(requestOptions) {
data
};
}).catch(error => {
- if (error instanceof requestError.RequestError) throw error;else if (error.name === "AbortError") throw error;
+ if (error instanceof requestError.RequestError) throw error;
throw new requestError.RequestError(error.message, 500, {
request: requestOptions
});
@@ -3103,27 +4240,443 @@ exports.request = request;
/***/ }),
-/***/ 5375:
-/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
+/***/ 4812:
+/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
-"use strict";
+module.exports =
+{
+ parallel : __nccwpck_require__(8210),
+ serial : __nccwpck_require__(445),
+ serialOrdered : __nccwpck_require__(3578)
+};
-Object.defineProperty(exports, "__esModule", ({ value: true }));
+/***/ }),
-var core = __nccwpck_require__(6762);
-var pluginRequestLog = __nccwpck_require__(8883);
-var pluginPaginateRest = __nccwpck_require__(4193);
-var pluginRestEndpointMethods = __nccwpck_require__(3044);
+/***/ 1700:
+/***/ ((module) => {
-const VERSION = "19.0.5";
+// API
+module.exports = abort;
-const Octokit = core.Octokit.plugin(pluginRequestLog.requestLog, pluginRestEndpointMethods.legacyRestEndpointMethods, pluginPaginateRest.paginateRest).defaults({
- userAgent: `octokit-rest.js/${VERSION}`
-});
+/**
+ * Aborts leftover active jobs
+ *
+ * @param {object} state - current state object
+ */
+function abort(state)
+{
+ Object.keys(state.jobs).forEach(clean.bind(state));
-exports.Octokit = Octokit;
-//# sourceMappingURL=index.js.map
+ // reset leftover jobs
+ state.jobs = {};
+}
+
+/**
+ * Cleans up leftover job by invoking abort function for the provided job id
+ *
+ * @this state
+ * @param {string|number} key - job id to abort
+ */
+function clean(key)
+{
+ if (typeof this.jobs[key] == 'function')
+ {
+ this.jobs[key]();
+ }
+}
+
+
+/***/ }),
+
+/***/ 2794:
+/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
+
+var defer = __nccwpck_require__(5295);
+
+// API
+module.exports = async;
+
+/**
+ * Runs provided callback asynchronously
+ * even if callback itself is not
+ *
+ * @param {function} callback - callback to invoke
+ * @returns {function} - augmented callback
+ */
+function async(callback)
+{
+ var isAsync = false;
+
+ // check if async happened
+ defer(function() { isAsync = true; });
+
+ return function async_callback(err, result)
+ {
+ if (isAsync)
+ {
+ callback(err, result);
+ }
+ else
+ {
+ defer(function nextTick_callback()
+ {
+ callback(err, result);
+ });
+ }
+ };
+}
+
+
+/***/ }),
+
+/***/ 5295:
+/***/ ((module) => {
+
+module.exports = defer;
+
+/**
+ * Runs provided function on next iteration of the event loop
+ *
+ * @param {function} fn - function to run
+ */
+function defer(fn)
+{
+ var nextTick = typeof setImmediate == 'function'
+ ? setImmediate
+ : (
+ typeof process == 'object' && typeof process.nextTick == 'function'
+ ? process.nextTick
+ : null
+ );
+
+ if (nextTick)
+ {
+ nextTick(fn);
+ }
+ else
+ {
+ setTimeout(fn, 0);
+ }
+}
+
+
+/***/ }),
+
+/***/ 9023:
+/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
+
+var async = __nccwpck_require__(2794)
+ , abort = __nccwpck_require__(1700)
+ ;
+
+// API
+module.exports = iterate;
+
+/**
+ * Iterates over each job object
+ *
+ * @param {array|object} list - array or object (named list) to iterate over
+ * @param {function} iterator - iterator to run
+ * @param {object} state - current job status
+ * @param {function} callback - invoked when all elements processed
+ */
+function iterate(list, iterator, state, callback)
+{
+ // store current index
+ var key = state['keyedList'] ? state['keyedList'][state.index] : state.index;
+
+ state.jobs[key] = runJob(iterator, key, list[key], function(error, output)
+ {
+ // don't repeat yourself
+ // skip secondary callbacks
+ if (!(key in state.jobs))
+ {
+ return;
+ }
+
+ // clean up jobs
+ delete state.jobs[key];
+
+ if (error)
+ {
+ // don't process rest of the results
+ // stop still active jobs
+ // and reset the list
+ abort(state);
+ }
+ else
+ {
+ state.results[key] = output;
+ }
+
+ // return salvaged results
+ callback(error, state.results);
+ });
+}
+
+/**
+ * Runs iterator over provided job element
+ *
+ * @param {function} iterator - iterator to invoke
+ * @param {string|number} key - key/index of the element in the list of jobs
+ * @param {mixed} item - job description
+ * @param {function} callback - invoked after iterator is done with the job
+ * @returns {function|mixed} - job abort function or something else
+ */
+function runJob(iterator, key, item, callback)
+{
+ var aborter;
+
+ // allow shortcut if iterator expects only two arguments
+ if (iterator.length == 2)
+ {
+ aborter = iterator(item, async(callback));
+ }
+ // otherwise go with full three arguments
+ else
+ {
+ aborter = iterator(item, key, async(callback));
+ }
+
+ return aborter;
+}
+
+
+/***/ }),
+
+/***/ 2474:
+/***/ ((module) => {
+
+// API
+module.exports = state;
+
+/**
+ * Creates initial state object
+ * for iteration over list
+ *
+ * @param {array|object} list - list to iterate over
+ * @param {function|null} sortMethod - function to use for keys sort,
+ * or `null` to keep them as is
+ * @returns {object} - initial state object
+ */
+function state(list, sortMethod)
+{
+ var isNamedList = !Array.isArray(list)
+ , initState =
+ {
+ index : 0,
+ keyedList: isNamedList || sortMethod ? Object.keys(list) : null,
+ jobs : {},
+ results : isNamedList ? {} : [],
+ size : isNamedList ? Object.keys(list).length : list.length
+ }
+ ;
+
+ if (sortMethod)
+ {
+ // sort array keys based on it's values
+ // sort object's keys just on own merit
+ initState.keyedList.sort(isNamedList ? sortMethod : function(a, b)
+ {
+ return sortMethod(list[a], list[b]);
+ });
+ }
+
+ return initState;
+}
+
+
+/***/ }),
+
+/***/ 7942:
+/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
+
+var abort = __nccwpck_require__(1700)
+ , async = __nccwpck_require__(2794)
+ ;
+
+// API
+module.exports = terminator;
+
+/**
+ * Terminates jobs in the attached state context
+ *
+ * @this AsyncKitState#
+ * @param {function} callback - final callback to invoke after termination
+ */
+function terminator(callback)
+{
+ if (!Object.keys(this.jobs).length)
+ {
+ return;
+ }
+
+ // fast forward iteration index
+ this.index = this.size;
+
+ // abort jobs
+ abort(this);
+
+ // send back results we have so far
+ async(callback)(null, this.results);
+}
+
+
+/***/ }),
+
+/***/ 8210:
+/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
+
+var iterate = __nccwpck_require__(9023)
+ , initState = __nccwpck_require__(2474)
+ , terminator = __nccwpck_require__(7942)
+ ;
+
+// Public API
+module.exports = parallel;
+
+/**
+ * Runs iterator over provided array elements in parallel
+ *
+ * @param {array|object} list - array or object (named list) to iterate over
+ * @param {function} iterator - iterator to run
+ * @param {function} callback - invoked when all elements processed
+ * @returns {function} - jobs terminator
+ */
+function parallel(list, iterator, callback)
+{
+ var state = initState(list);
+
+ while (state.index < (state['keyedList'] || list).length)
+ {
+ iterate(list, iterator, state, function(error, result)
+ {
+ if (error)
+ {
+ callback(error, result);
+ return;
+ }
+
+ // looks like it's the last one
+ if (Object.keys(state.jobs).length === 0)
+ {
+ callback(null, state.results);
+ return;
+ }
+ });
+
+ state.index++;
+ }
+
+ return terminator.bind(state, callback);
+}
+
+
+/***/ }),
+
+/***/ 445:
+/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
+
+var serialOrdered = __nccwpck_require__(3578);
+
+// Public API
+module.exports = serial;
+
+/**
+ * Runs iterator over provided array elements in series
+ *
+ * @param {array|object} list - array or object (named list) to iterate over
+ * @param {function} iterator - iterator to run
+ * @param {function} callback - invoked when all elements processed
+ * @returns {function} - jobs terminator
+ */
+function serial(list, iterator, callback)
+{
+ return serialOrdered(list, iterator, null, callback);
+}
+
+
+/***/ }),
+
+/***/ 3578:
+/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
+
+var iterate = __nccwpck_require__(9023)
+ , initState = __nccwpck_require__(2474)
+ , terminator = __nccwpck_require__(7942)
+ ;
+
+// Public API
+module.exports = serialOrdered;
+// sorting helpers
+module.exports.ascending = ascending;
+module.exports.descending = descending;
+
+/**
+ * Runs iterator over provided sorted array elements in series
+ *
+ * @param {array|object} list - array or object (named list) to iterate over
+ * @param {function} iterator - iterator to run
+ * @param {function} sortMethod - custom sort function
+ * @param {function} callback - invoked when all elements processed
+ * @returns {function} - jobs terminator
+ */
+function serialOrdered(list, iterator, sortMethod, callback)
+{
+ var state = initState(list, sortMethod);
+
+ iterate(list, iterator, state, function iteratorHandler(error, result)
+ {
+ if (error)
+ {
+ callback(error, result);
+ return;
+ }
+
+ state.index++;
+
+ // are we there yet?
+ if (state.index < (state['keyedList'] || list).length)
+ {
+ iterate(list, iterator, state, iteratorHandler);
+ return;
+ }
+
+ // done here
+ callback(null, state.results);
+ });
+
+ return terminator.bind(state, callback);
+}
+
+/*
+ * -- Sort methods
+ */
+
+/**
+ * sort helper to sort array elements in ascending order
+ *
+ * @param {mixed} a - an item to compare
+ * @param {mixed} b - an item to compare
+ * @returns {number} - comparison result
+ */
+function ascending(a, b)
+{
+ return a < b ? -1 : a > b ? 1 : 0;
+}
+
+/**
+ * sort helper to sort array elements in descending order
+ *
+ * @param {mixed} a - an item to compare
+ * @param {mixed} b - an item to compare
+ * @returns {number} - comparison result
+ */
+function descending(a, b)
+{
+ return -1 * ascending(a, b);
+}
/***/ }),
@@ -3307,6 +4860,221 @@ function removeHook(state, name, method) {
}
+/***/ }),
+
+/***/ 5443:
+/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
+
+var util = __nccwpck_require__(3837);
+var Stream = (__nccwpck_require__(2781).Stream);
+var DelayedStream = __nccwpck_require__(8611);
+
+module.exports = CombinedStream;
+function CombinedStream() {
+ this.writable = false;
+ this.readable = true;
+ this.dataSize = 0;
+ this.maxDataSize = 2 * 1024 * 1024;
+ this.pauseStreams = true;
+
+ this._released = false;
+ this._streams = [];
+ this._currentStream = null;
+ this._insideLoop = false;
+ this._pendingNext = false;
+}
+util.inherits(CombinedStream, Stream);
+
+CombinedStream.create = function(options) {
+ var combinedStream = new this();
+
+ options = options || {};
+ for (var option in options) {
+ combinedStream[option] = options[option];
+ }
+
+ return combinedStream;
+};
+
+CombinedStream.isStreamLike = function(stream) {
+ return (typeof stream !== 'function')
+ && (typeof stream !== 'string')
+ && (typeof stream !== 'boolean')
+ && (typeof stream !== 'number')
+ && (!Buffer.isBuffer(stream));
+};
+
+CombinedStream.prototype.append = function(stream) {
+ var isStreamLike = CombinedStream.isStreamLike(stream);
+
+ if (isStreamLike) {
+ if (!(stream instanceof DelayedStream)) {
+ var newStream = DelayedStream.create(stream, {
+ maxDataSize: Infinity,
+ pauseStream: this.pauseStreams,
+ });
+ stream.on('data', this._checkDataSize.bind(this));
+ stream = newStream;
+ }
+
+ this._handleErrors(stream);
+
+ if (this.pauseStreams) {
+ stream.pause();
+ }
+ }
+
+ this._streams.push(stream);
+ return this;
+};
+
+CombinedStream.prototype.pipe = function(dest, options) {
+ Stream.prototype.pipe.call(this, dest, options);
+ this.resume();
+ return dest;
+};
+
+CombinedStream.prototype._getNext = function() {
+ this._currentStream = null;
+
+ if (this._insideLoop) {
+ this._pendingNext = true;
+ return; // defer call
+ }
+
+ this._insideLoop = true;
+ try {
+ do {
+ this._pendingNext = false;
+ this._realGetNext();
+ } while (this._pendingNext);
+ } finally {
+ this._insideLoop = false;
+ }
+};
+
+CombinedStream.prototype._realGetNext = function() {
+ var stream = this._streams.shift();
+
+
+ if (typeof stream == 'undefined') {
+ this.end();
+ return;
+ }
+
+ if (typeof stream !== 'function') {
+ this._pipeNext(stream);
+ return;
+ }
+
+ var getStream = stream;
+ getStream(function(stream) {
+ var isStreamLike = CombinedStream.isStreamLike(stream);
+ if (isStreamLike) {
+ stream.on('data', this._checkDataSize.bind(this));
+ this._handleErrors(stream);
+ }
+
+ this._pipeNext(stream);
+ }.bind(this));
+};
+
+CombinedStream.prototype._pipeNext = function(stream) {
+ this._currentStream = stream;
+
+ var isStreamLike = CombinedStream.isStreamLike(stream);
+ if (isStreamLike) {
+ stream.on('end', this._getNext.bind(this));
+ stream.pipe(this, {end: false});
+ return;
+ }
+
+ var value = stream;
+ this.write(value);
+ this._getNext();
+};
+
+CombinedStream.prototype._handleErrors = function(stream) {
+ var self = this;
+ stream.on('error', function(err) {
+ self._emitError(err);
+ });
+};
+
+CombinedStream.prototype.write = function(data) {
+ this.emit('data', data);
+};
+
+CombinedStream.prototype.pause = function() {
+ if (!this.pauseStreams) {
+ return;
+ }
+
+ if(this.pauseStreams && this._currentStream && typeof(this._currentStream.pause) == 'function') this._currentStream.pause();
+ this.emit('pause');
+};
+
+CombinedStream.prototype.resume = function() {
+ if (!this._released) {
+ this._released = true;
+ this.writable = true;
+ this._getNext();
+ }
+
+ if(this.pauseStreams && this._currentStream && typeof(this._currentStream.resume) == 'function') this._currentStream.resume();
+ this.emit('resume');
+};
+
+CombinedStream.prototype.end = function() {
+ this._reset();
+ this.emit('end');
+};
+
+CombinedStream.prototype.destroy = function() {
+ this._reset();
+ this.emit('close');
+};
+
+CombinedStream.prototype._reset = function() {
+ this.writable = false;
+ this._streams = [];
+ this._currentStream = null;
+};
+
+CombinedStream.prototype._checkDataSize = function() {
+ this._updateDataSize();
+ if (this.dataSize <= this.maxDataSize) {
+ return;
+ }
+
+ var message =
+ 'DelayedStream#maxDataSize of ' + this.maxDataSize + ' bytes exceeded.';
+ this._emitError(new Error(message));
+};
+
+CombinedStream.prototype._updateDataSize = function() {
+ this.dataSize = 0;
+
+ var self = this;
+ this._streams.forEach(function(stream) {
+ if (!stream.dataSize) {
+ return;
+ }
+
+ self.dataSize += stream.dataSize;
+ });
+
+ if (this._currentStream && this._currentStream.dataSize) {
+ this.dataSize += this._currentStream.dataSize;
+ }
+};
+
+CombinedStream.prototype._emitError = function(err) {
+ this._reset();
+ this.emit('error', err);
+};
+
+
/***/ }),
/***/ 8222:
@@ -4151,6 +5919,120 @@ formatters.O = function (v) {
};
+/***/ }),
+
+/***/ 8611:
+/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
+
+var Stream = (__nccwpck_require__(2781).Stream);
+var util = __nccwpck_require__(3837);
+
+module.exports = DelayedStream;
+function DelayedStream() {
+ this.source = null;
+ this.dataSize = 0;
+ this.maxDataSize = 1024 * 1024;
+ this.pauseStream = true;
+
+ this._maxDataSizeExceeded = false;
+ this._released = false;
+ this._bufferedEvents = [];
+}
+util.inherits(DelayedStream, Stream);
+
+DelayedStream.create = function(source, options) {
+ var delayedStream = new this();
+
+ options = options || {};
+ for (var option in options) {
+ delayedStream[option] = options[option];
+ }
+
+ delayedStream.source = source;
+
+ var realEmit = source.emit;
+ source.emit = function() {
+ delayedStream._handleEmit(arguments);
+ return realEmit.apply(source, arguments);
+ };
+
+ source.on('error', function() {});
+ if (delayedStream.pauseStream) {
+ source.pause();
+ }
+
+ return delayedStream;
+};
+
+Object.defineProperty(DelayedStream.prototype, 'readable', {
+ configurable: true,
+ enumerable: true,
+ get: function() {
+ return this.source.readable;
+ }
+});
+
+DelayedStream.prototype.setEncoding = function() {
+ return this.source.setEncoding.apply(this.source, arguments);
+};
+
+DelayedStream.prototype.resume = function() {
+ if (!this._released) {
+ this.release();
+ }
+
+ this.source.resume();
+};
+
+DelayedStream.prototype.pause = function() {
+ this.source.pause();
+};
+
+DelayedStream.prototype.release = function() {
+ this._released = true;
+
+ this._bufferedEvents.forEach(function(args) {
+ this.emit.apply(this, args);
+ }.bind(this));
+ this._bufferedEvents = [];
+};
+
+DelayedStream.prototype.pipe = function() {
+ var r = Stream.prototype.pipe.apply(this, arguments);
+ this.resume();
+ return r;
+};
+
+DelayedStream.prototype._handleEmit = function(args) {
+ if (this._released) {
+ this.emit.apply(this, args);
+ return;
+ }
+
+ if (args[0] === 'data') {
+ this.dataSize += args[1].length;
+ this._checkIfMaxDataSizeExceeded();
+ }
+
+ this._bufferedEvents.push(args);
+};
+
+DelayedStream.prototype._checkIfMaxDataSizeExceeded = function() {
+ if (this._maxDataSizeExceeded) {
+ return;
+ }
+
+ if (this.dataSize <= this.maxDataSize) {
+ return;
+ }
+
+ this._maxDataSizeExceeded = true;
+ var message =
+ 'DelayedStream#maxDataSize of ' + this.maxDataSize + ' bytes exceeded.'
+ this.emit('error', new Error(message));
+};
+
+
/***/ }),
/***/ 8932:
@@ -4179,6 +6061,1232 @@ class Deprecation extends Error {
exports.Deprecation = Deprecation;
+/***/ }),
+
+/***/ 1133:
+/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
+
+var debug;
+
+module.exports = function () {
+ if (!debug) {
+ try {
+ /* eslint global-require: off */
+ debug = __nccwpck_require__(8237)("follow-redirects");
+ }
+ catch (error) { /* */ }
+ if (typeof debug !== "function") {
+ debug = function () { /* */ };
+ }
+ }
+ debug.apply(null, arguments);
+};
+
+
+/***/ }),
+
+/***/ 7707:
+/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
+
+var url = __nccwpck_require__(7310);
+var URL = url.URL;
+var http = __nccwpck_require__(3685);
+var https = __nccwpck_require__(5687);
+var Writable = (__nccwpck_require__(2781).Writable);
+var assert = __nccwpck_require__(9491);
+var debug = __nccwpck_require__(1133);
+
+// Whether to use the native URL object or the legacy url module
+var useNativeURL = false;
+try {
+ assert(new URL());
+}
+catch (error) {
+ useNativeURL = error.code === "ERR_INVALID_URL";
+}
+
+// URL fields to preserve in copy operations
+var preservedUrlFields = [
+ "auth",
+ "host",
+ "hostname",
+ "href",
+ "path",
+ "pathname",
+ "port",
+ "protocol",
+ "query",
+ "search",
+ "hash",
+];
+
+// Create handlers that pass events from native requests
+var events = ["abort", "aborted", "connect", "error", "socket", "timeout"];
+var eventHandlers = Object.create(null);
+events.forEach(function (event) {
+ eventHandlers[event] = function (arg1, arg2, arg3) {
+ this._redirectable.emit(event, arg1, arg2, arg3);
+ };
+});
+
+// Error types with codes
+var InvalidUrlError = createErrorType(
+ "ERR_INVALID_URL",
+ "Invalid URL",
+ TypeError
+);
+var RedirectionError = createErrorType(
+ "ERR_FR_REDIRECTION_FAILURE",
+ "Redirected request failed"
+);
+var TooManyRedirectsError = createErrorType(
+ "ERR_FR_TOO_MANY_REDIRECTS",
+ "Maximum number of redirects exceeded",
+ RedirectionError
+);
+var MaxBodyLengthExceededError = createErrorType(
+ "ERR_FR_MAX_BODY_LENGTH_EXCEEDED",
+ "Request body larger than maxBodyLength limit"
+);
+var WriteAfterEndError = createErrorType(
+ "ERR_STREAM_WRITE_AFTER_END",
+ "write after end"
+);
+
+// istanbul ignore next
+var destroy = Writable.prototype.destroy || noop;
+
+// An HTTP(S) request that can be redirected
+function RedirectableRequest(options, responseCallback) {
+ // Initialize the request
+ Writable.call(this);
+ this._sanitizeOptions(options);
+ this._options = options;
+ this._ended = false;
+ this._ending = false;
+ this._redirectCount = 0;
+ this._redirects = [];
+ this._requestBodyLength = 0;
+ this._requestBodyBuffers = [];
+
+ // Attach a callback if passed
+ if (responseCallback) {
+ this.on("response", responseCallback);
+ }
+
+ // React to responses of native requests
+ var self = this;
+ this._onNativeResponse = function (response) {
+ try {
+ self._processResponse(response);
+ }
+ catch (cause) {
+ self.emit("error", cause instanceof RedirectionError ?
+ cause : new RedirectionError({ cause: cause }));
+ }
+ };
+
+ // Perform the first request
+ this._performRequest();
+}
+RedirectableRequest.prototype = Object.create(Writable.prototype);
+
+RedirectableRequest.prototype.abort = function () {
+ destroyRequest(this._currentRequest);
+ this._currentRequest.abort();
+ this.emit("abort");
+};
+
+RedirectableRequest.prototype.destroy = function (error) {
+ destroyRequest(this._currentRequest, error);
+ destroy.call(this, error);
+ return this;
+};
+
+// Writes buffered data to the current native request
+RedirectableRequest.prototype.write = function (data, encoding, callback) {
+ // Writing is not allowed if end has been called
+ if (this._ending) {
+ throw new WriteAfterEndError();
+ }
+
+ // Validate input and shift parameters if necessary
+ if (!isString(data) && !isBuffer(data)) {
+ throw new TypeError("data should be a string, Buffer or Uint8Array");
+ }
+ if (isFunction(encoding)) {
+ callback = encoding;
+ encoding = null;
+ }
+
+ // Ignore empty buffers, since writing them doesn't invoke the callback
+ // https://github.com/nodejs/node/issues/22066
+ if (data.length === 0) {
+ if (callback) {
+ callback();
+ }
+ return;
+ }
+ // Only write when we don't exceed the maximum body length
+ if (this._requestBodyLength + data.length <= this._options.maxBodyLength) {
+ this._requestBodyLength += data.length;
+ this._requestBodyBuffers.push({ data: data, encoding: encoding });
+ this._currentRequest.write(data, encoding, callback);
+ }
+ // Error when we exceed the maximum body length
+ else {
+ this.emit("error", new MaxBodyLengthExceededError());
+ this.abort();
+ }
+};
+
+// Ends the current native request
+RedirectableRequest.prototype.end = function (data, encoding, callback) {
+ // Shift parameters if necessary
+ if (isFunction(data)) {
+ callback = data;
+ data = encoding = null;
+ }
+ else if (isFunction(encoding)) {
+ callback = encoding;
+ encoding = null;
+ }
+
+ // Write data if needed and end
+ if (!data) {
+ this._ended = this._ending = true;
+ this._currentRequest.end(null, null, callback);
+ }
+ else {
+ var self = this;
+ var currentRequest = this._currentRequest;
+ this.write(data, encoding, function () {
+ self._ended = true;
+ currentRequest.end(null, null, callback);
+ });
+ this._ending = true;
+ }
+};
+
+// Sets a header value on the current native request
+RedirectableRequest.prototype.setHeader = function (name, value) {
+ this._options.headers[name] = value;
+ this._currentRequest.setHeader(name, value);
+};
+
+// Clears a header value on the current native request
+RedirectableRequest.prototype.removeHeader = function (name) {
+ delete this._options.headers[name];
+ this._currentRequest.removeHeader(name);
+};
+
+// Global timeout for all underlying requests
+RedirectableRequest.prototype.setTimeout = function (msecs, callback) {
+ var self = this;
+
+ // Destroys the socket on timeout
+ function destroyOnTimeout(socket) {
+ socket.setTimeout(msecs);
+ socket.removeListener("timeout", socket.destroy);
+ socket.addListener("timeout", socket.destroy);
+ }
+
+ // Sets up a timer to trigger a timeout event
+ function startTimer(socket) {
+ if (self._timeout) {
+ clearTimeout(self._timeout);
+ }
+ self._timeout = setTimeout(function () {
+ self.emit("timeout");
+ clearTimer();
+ }, msecs);
+ destroyOnTimeout(socket);
+ }
+
+ // Stops a timeout from triggering
+ function clearTimer() {
+ // Clear the timeout
+ if (self._timeout) {
+ clearTimeout(self._timeout);
+ self._timeout = null;
+ }
+
+ // Clean up all attached listeners
+ self.removeListener("abort", clearTimer);
+ self.removeListener("error", clearTimer);
+ self.removeListener("response", clearTimer);
+ self.removeListener("close", clearTimer);
+ if (callback) {
+ self.removeListener("timeout", callback);
+ }
+ if (!self.socket) {
+ self._currentRequest.removeListener("socket", startTimer);
+ }
+ }
+
+ // Attach callback if passed
+ if (callback) {
+ this.on("timeout", callback);
+ }
+
+ // Start the timer if or when the socket is opened
+ if (this.socket) {
+ startTimer(this.socket);
+ }
+ else {
+ this._currentRequest.once("socket", startTimer);
+ }
+
+ // Clean up on events
+ this.on("socket", destroyOnTimeout);
+ this.on("abort", clearTimer);
+ this.on("error", clearTimer);
+ this.on("response", clearTimer);
+ this.on("close", clearTimer);
+
+ return this;
+};
+
+// Proxy all other public ClientRequest methods
+[
+ "flushHeaders", "getHeader",
+ "setNoDelay", "setSocketKeepAlive",
+].forEach(function (method) {
+ RedirectableRequest.prototype[method] = function (a, b) {
+ return this._currentRequest[method](a, b);
+ };
+});
+
+// Proxy all public ClientRequest properties
+["aborted", "connection", "socket"].forEach(function (property) {
+ Object.defineProperty(RedirectableRequest.prototype, property, {
+ get: function () { return this._currentRequest[property]; },
+ });
+});
+
+RedirectableRequest.prototype._sanitizeOptions = function (options) {
+ // Ensure headers are always present
+ if (!options.headers) {
+ options.headers = {};
+ }
+
+ // Since http.request treats host as an alias of hostname,
+ // but the url module interprets host as hostname plus port,
+ // eliminate the host property to avoid confusion.
+ if (options.host) {
+ // Use hostname if set, because it has precedence
+ if (!options.hostname) {
+ options.hostname = options.host;
+ }
+ delete options.host;
+ }
+
+ // Complete the URL object when necessary
+ if (!options.pathname && options.path) {
+ var searchPos = options.path.indexOf("?");
+ if (searchPos < 0) {
+ options.pathname = options.path;
+ }
+ else {
+ options.pathname = options.path.substring(0, searchPos);
+ options.search = options.path.substring(searchPos);
+ }
+ }
+};
+
+
+// Executes the next native request (initial or redirect)
+RedirectableRequest.prototype._performRequest = function () {
+ // Load the native protocol
+ var protocol = this._options.protocol;
+ var nativeProtocol = this._options.nativeProtocols[protocol];
+ if (!nativeProtocol) {
+ throw new TypeError("Unsupported protocol " + protocol);
+ }
+
+ // If specified, use the agent corresponding to the protocol
+ // (HTTP and HTTPS use different types of agents)
+ if (this._options.agents) {
+ var scheme = protocol.slice(0, -1);
+ this._options.agent = this._options.agents[scheme];
+ }
+
+ // Create the native request and set up its event handlers
+ var request = this._currentRequest =
+ nativeProtocol.request(this._options, this._onNativeResponse);
+ request._redirectable = this;
+ for (var event of events) {
+ request.on(event, eventHandlers[event]);
+ }
+
+ // RFC7230§5.3.1: When making a request directly to an origin server, […]
+ // a client MUST send only the absolute path […] as the request-target.
+ this._currentUrl = /^\//.test(this._options.path) ?
+ url.format(this._options) :
+ // When making a request to a proxy, […]
+ // a client MUST send the target URI in absolute-form […].
+ this._options.path;
+
+ // End a redirected request
+ // (The first request must be ended explicitly with RedirectableRequest#end)
+ if (this._isRedirect) {
+ // Write the request entity and end
+ var i = 0;
+ var self = this;
+ var buffers = this._requestBodyBuffers;
+ (function writeNext(error) {
+ // Only write if this request has not been redirected yet
+ /* istanbul ignore else */
+ if (request === self._currentRequest) {
+ // Report any write errors
+ /* istanbul ignore if */
+ if (error) {
+ self.emit("error", error);
+ }
+ // Write the next buffer if there are still left
+ else if (i < buffers.length) {
+ var buffer = buffers[i++];
+ /* istanbul ignore else */
+ if (!request.finished) {
+ request.write(buffer.data, buffer.encoding, writeNext);
+ }
+ }
+ // End the request if `end` has been called on us
+ else if (self._ended) {
+ request.end();
+ }
+ }
+ }());
+ }
+};
+
+// Processes a response from the current native request
+RedirectableRequest.prototype._processResponse = function (response) {
+ // Store the redirected response
+ var statusCode = response.statusCode;
+ if (this._options.trackRedirects) {
+ this._redirects.push({
+ url: this._currentUrl,
+ headers: response.headers,
+ statusCode: statusCode,
+ });
+ }
+
+ // RFC7231§6.4: The 3xx (Redirection) class of status code indicates
+ // that further action needs to be taken by the user agent in order to
+ // fulfill the request. If a Location header field is provided,
+ // the user agent MAY automatically redirect its request to the URI
+ // referenced by the Location field value,
+ // even if the specific status code is not understood.
+
+ // If the response is not a redirect; return it as-is
+ var location = response.headers.location;
+ if (!location || this._options.followRedirects === false ||
+ statusCode < 300 || statusCode >= 400) {
+ response.responseUrl = this._currentUrl;
+ response.redirects = this._redirects;
+ this.emit("response", response);
+
+ // Clean up
+ this._requestBodyBuffers = [];
+ return;
+ }
+
+ // The response is a redirect, so abort the current request
+ destroyRequest(this._currentRequest);
+ // Discard the remainder of the response to avoid waiting for data
+ response.destroy();
+
+ // RFC7231§6.4: A client SHOULD detect and intervene
+ // in cyclical redirections (i.e., "infinite" redirection loops).
+ if (++this._redirectCount > this._options.maxRedirects) {
+ throw new TooManyRedirectsError();
+ }
+
+ // Store the request headers if applicable
+ var requestHeaders;
+ var beforeRedirect = this._options.beforeRedirect;
+ if (beforeRedirect) {
+ requestHeaders = Object.assign({
+ // The Host header was set by nativeProtocol.request
+ Host: response.req.getHeader("host"),
+ }, this._options.headers);
+ }
+
+ // RFC7231§6.4: Automatic redirection needs to done with
+ // care for methods not known to be safe, […]
+ // RFC7231§6.4.2–3: For historical reasons, a user agent MAY change
+ // the request method from POST to GET for the subsequent request.
+ var method = this._options.method;
+ if ((statusCode === 301 || statusCode === 302) && this._options.method === "POST" ||
+ // RFC7231§6.4.4: The 303 (See Other) status code indicates that
+ // the server is redirecting the user agent to a different resource […]
+ // A user agent can perform a retrieval request targeting that URI
+ // (a GET or HEAD request if using HTTP) […]
+ (statusCode === 303) && !/^(?:GET|HEAD)$/.test(this._options.method)) {
+ this._options.method = "GET";
+ // Drop a possible entity and headers related to it
+ this._requestBodyBuffers = [];
+ removeMatchingHeaders(/^content-/i, this._options.headers);
+ }
+
+ // Drop the Host header, as the redirect might lead to a different host
+ var currentHostHeader = removeMatchingHeaders(/^host$/i, this._options.headers);
+
+ // If the redirect is relative, carry over the host of the last request
+ var currentUrlParts = parseUrl(this._currentUrl);
+ var currentHost = currentHostHeader || currentUrlParts.host;
+ var currentUrl = /^\w+:/.test(location) ? this._currentUrl :
+ url.format(Object.assign(currentUrlParts, { host: currentHost }));
+
+ // Create the redirected request
+ var redirectUrl = resolveUrl(location, currentUrl);
+ debug("redirecting to", redirectUrl.href);
+ this._isRedirect = true;
+ spreadUrlObject(redirectUrl, this._options);
+
+ // Drop confidential headers when redirecting to a less secure protocol
+ // or to a different domain that is not a superdomain
+ if (redirectUrl.protocol !== currentUrlParts.protocol &&
+ redirectUrl.protocol !== "https:" ||
+ redirectUrl.host !== currentHost &&
+ !isSubdomain(redirectUrl.host, currentHost)) {
+ removeMatchingHeaders(/^(?:(?:proxy-)?authorization|cookie)$/i, this._options.headers);
+ }
+
+ // Evaluate the beforeRedirect callback
+ if (isFunction(beforeRedirect)) {
+ var responseDetails = {
+ headers: response.headers,
+ statusCode: statusCode,
+ };
+ var requestDetails = {
+ url: currentUrl,
+ method: method,
+ headers: requestHeaders,
+ };
+ beforeRedirect(this._options, responseDetails, requestDetails);
+ this._sanitizeOptions(this._options);
+ }
+
+ // Perform the redirected request
+ this._performRequest();
+};
+
+// Wraps the key/value object of protocols with redirect functionality
+function wrap(protocols) {
+ // Default settings
+ var exports = {
+ maxRedirects: 21,
+ maxBodyLength: 10 * 1024 * 1024,
+ };
+
+ // Wrap each protocol
+ var nativeProtocols = {};
+ Object.keys(protocols).forEach(function (scheme) {
+ var protocol = scheme + ":";
+ var nativeProtocol = nativeProtocols[protocol] = protocols[scheme];
+ var wrappedProtocol = exports[scheme] = Object.create(nativeProtocol);
+
+ // Executes a request, following redirects
+ function request(input, options, callback) {
+ // Parse parameters, ensuring that input is an object
+ if (isURL(input)) {
+ input = spreadUrlObject(input);
+ }
+ else if (isString(input)) {
+ input = spreadUrlObject(parseUrl(input));
+ }
+ else {
+ callback = options;
+ options = validateUrl(input);
+ input = { protocol: protocol };
+ }
+ if (isFunction(options)) {
+ callback = options;
+ options = null;
+ }
+
+ // Set defaults
+ options = Object.assign({
+ maxRedirects: exports.maxRedirects,
+ maxBodyLength: exports.maxBodyLength,
+ }, input, options);
+ options.nativeProtocols = nativeProtocols;
+ if (!isString(options.host) && !isString(options.hostname)) {
+ options.hostname = "::1";
+ }
+
+ assert.equal(options.protocol, protocol, "protocol mismatch");
+ debug("options", options);
+ return new RedirectableRequest(options, callback);
+ }
+
+ // Executes a GET request, following redirects
+ function get(input, options, callback) {
+ var wrappedRequest = wrappedProtocol.request(input, options, callback);
+ wrappedRequest.end();
+ return wrappedRequest;
+ }
+
+ // Expose the properties on the wrapped protocol
+ Object.defineProperties(wrappedProtocol, {
+ request: { value: request, configurable: true, enumerable: true, writable: true },
+ get: { value: get, configurable: true, enumerable: true, writable: true },
+ });
+ });
+ return exports;
+}
+
+function noop() { /* empty */ }
+
+function parseUrl(input) {
+ var parsed;
+ /* istanbul ignore else */
+ if (useNativeURL) {
+ parsed = new URL(input);
+ }
+ else {
+ // Ensure the URL is valid and absolute
+ parsed = validateUrl(url.parse(input));
+ if (!isString(parsed.protocol)) {
+ throw new InvalidUrlError({ input });
+ }
+ }
+ return parsed;
+}
+
+function resolveUrl(relative, base) {
+ /* istanbul ignore next */
+ return useNativeURL ? new URL(relative, base) : parseUrl(url.resolve(base, relative));
+}
+
+function validateUrl(input) {
+ if (/^\[/.test(input.hostname) && !/^\[[:0-9a-f]+\]$/i.test(input.hostname)) {
+ throw new InvalidUrlError({ input: input.href || input });
+ }
+ if (/^\[/.test(input.host) && !/^\[[:0-9a-f]+\](:\d+)?$/i.test(input.host)) {
+ throw new InvalidUrlError({ input: input.href || input });
+ }
+ return input;
+}
+
+function spreadUrlObject(urlObject, target) {
+ var spread = target || {};
+ for (var key of preservedUrlFields) {
+ spread[key] = urlObject[key];
+ }
+
+ // Fix IPv6 hostname
+ if (spread.hostname.startsWith("[")) {
+ spread.hostname = spread.hostname.slice(1, -1);
+ }
+ // Ensure port is a number
+ if (spread.port !== "") {
+ spread.port = Number(spread.port);
+ }
+ // Concatenate path
+ spread.path = spread.search ? spread.pathname + spread.search : spread.pathname;
+
+ return spread;
+}
+
+function removeMatchingHeaders(regex, headers) {
+ var lastValue;
+ for (var header in headers) {
+ if (regex.test(header)) {
+ lastValue = headers[header];
+ delete headers[header];
+ }
+ }
+ return (lastValue === null || typeof lastValue === "undefined") ?
+ undefined : String(lastValue).trim();
+}
+
+function createErrorType(code, message, baseClass) {
+ // Create constructor
+ function CustomError(properties) {
+ Error.captureStackTrace(this, this.constructor);
+ Object.assign(this, properties || {});
+ this.code = code;
+ this.message = this.cause ? message + ": " + this.cause.message : message;
+ }
+
+ // Attach constructor and set default properties
+ CustomError.prototype = new (baseClass || Error)();
+ Object.defineProperties(CustomError.prototype, {
+ constructor: {
+ value: CustomError,
+ enumerable: false,
+ },
+ name: {
+ value: "Error [" + code + "]",
+ enumerable: false,
+ },
+ });
+ return CustomError;
+}
+
+function destroyRequest(request, error) {
+ for (var event of events) {
+ request.removeListener(event, eventHandlers[event]);
+ }
+ request.on("error", noop);
+ request.destroy(error);
+}
+
+function isSubdomain(subdomain, domain) {
+ assert(isString(subdomain) && isString(domain));
+ var dot = subdomain.length - domain.length - 1;
+ return dot > 0 && subdomain[dot] === "." && subdomain.endsWith(domain);
+}
+
+function isString(value) {
+ return typeof value === "string" || value instanceof String;
+}
+
+function isFunction(value) {
+ return typeof value === "function";
+}
+
+function isBuffer(value) {
+ return typeof value === "object" && ("length" in value);
+}
+
+function isURL(value) {
+ return URL && value instanceof URL;
+}
+
+// Exports
+module.exports = wrap({ http: http, https: https });
+module.exports.wrap = wrap;
+
+
+/***/ }),
+
+/***/ 4334:
+/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
+
+var CombinedStream = __nccwpck_require__(5443);
+var util = __nccwpck_require__(3837);
+var path = __nccwpck_require__(1017);
+var http = __nccwpck_require__(3685);
+var https = __nccwpck_require__(5687);
+var parseUrl = (__nccwpck_require__(7310).parse);
+var fs = __nccwpck_require__(7147);
+var Stream = (__nccwpck_require__(2781).Stream);
+var mime = __nccwpck_require__(3583);
+var asynckit = __nccwpck_require__(4812);
+var populate = __nccwpck_require__(7142);
+
+// Public API
+module.exports = FormData;
+
+// make it a Stream
+util.inherits(FormData, CombinedStream);
+
+/**
+ * Create readable "multipart/form-data" streams.
+ * Can be used to submit forms
+ * and file uploads to other web applications.
+ *
+ * @constructor
+ * @param {Object} options - Properties to be added/overriden for FormData and CombinedStream
+ */
+function FormData(options) {
+ if (!(this instanceof FormData)) {
+ return new FormData(options);
+ }
+
+ this._overheadLength = 0;
+ this._valueLength = 0;
+ this._valuesToMeasure = [];
+
+ CombinedStream.call(this);
+
+ options = options || {};
+ for (var option in options) {
+ this[option] = options[option];
+ }
+}
+
+FormData.LINE_BREAK = '\r\n';
+FormData.DEFAULT_CONTENT_TYPE = 'application/octet-stream';
+
+FormData.prototype.append = function(field, value, options) {
+
+ options = options || {};
+
+ // allow filename as single option
+ if (typeof options == 'string') {
+ options = {filename: options};
+ }
+
+ var append = CombinedStream.prototype.append.bind(this);
+
+ // all that streamy business can't handle numbers
+ if (typeof value == 'number') {
+ value = '' + value;
+ }
+
+ // https://github.com/felixge/node-form-data/issues/38
+ if (util.isArray(value)) {
+ // Please convert your array into string
+ // the way web server expects it
+ this._error(new Error('Arrays are not supported.'));
+ return;
+ }
+
+ var header = this._multiPartHeader(field, value, options);
+ var footer = this._multiPartFooter();
+
+ append(header);
+ append(value);
+ append(footer);
+
+ // pass along options.knownLength
+ this._trackLength(header, value, options);
+};
+
+FormData.prototype._trackLength = function(header, value, options) {
+ var valueLength = 0;
+
+ // used w/ getLengthSync(), when length is known.
+ // e.g. for streaming directly from a remote server,
+ // w/ a known file a size, and not wanting to wait for
+ // incoming file to finish to get its size.
+ if (options.knownLength != null) {
+ valueLength += +options.knownLength;
+ } else if (Buffer.isBuffer(value)) {
+ valueLength = value.length;
+ } else if (typeof value === 'string') {
+ valueLength = Buffer.byteLength(value);
+ }
+
+ this._valueLength += valueLength;
+
+ // @check why add CRLF? does this account for custom/multiple CRLFs?
+ this._overheadLength +=
+ Buffer.byteLength(header) +
+ FormData.LINE_BREAK.length;
+
+ // empty or either doesn't have path or not an http response or not a stream
+ if (!value || ( !value.path && !(value.readable && value.hasOwnProperty('httpVersion')) && !(value instanceof Stream))) {
+ return;
+ }
+
+ // no need to bother with the length
+ if (!options.knownLength) {
+ this._valuesToMeasure.push(value);
+ }
+};
+
+FormData.prototype._lengthRetriever = function(value, callback) {
+
+ if (value.hasOwnProperty('fd')) {
+
+ // take read range into a account
+ // `end` = Infinity –> read file till the end
+ //
+ // TODO: Looks like there is bug in Node fs.createReadStream
+ // it doesn't respect `end` options without `start` options
+ // Fix it when node fixes it.
+ // https://github.com/joyent/node/issues/7819
+ if (value.end != undefined && value.end != Infinity && value.start != undefined) {
+
+ // when end specified
+ // no need to calculate range
+ // inclusive, starts with 0
+ callback(null, value.end + 1 - (value.start ? value.start : 0));
+
+ // not that fast snoopy
+ } else {
+ // still need to fetch file size from fs
+ fs.stat(value.path, function(err, stat) {
+
+ var fileSize;
+
+ if (err) {
+ callback(err);
+ return;
+ }
+
+ // update final size based on the range options
+ fileSize = stat.size - (value.start ? value.start : 0);
+ callback(null, fileSize);
+ });
+ }
+
+ // or http response
+ } else if (value.hasOwnProperty('httpVersion')) {
+ callback(null, +value.headers['content-length']);
+
+ // or request stream http://github.com/mikeal/request
+ } else if (value.hasOwnProperty('httpModule')) {
+ // wait till response come back
+ value.on('response', function(response) {
+ value.pause();
+ callback(null, +response.headers['content-length']);
+ });
+ value.resume();
+
+ // something else
+ } else {
+ callback('Unknown stream');
+ }
+};
+
+FormData.prototype._multiPartHeader = function(field, value, options) {
+ // custom header specified (as string)?
+ // it becomes responsible for boundary
+ // (e.g. to handle extra CRLFs on .NET servers)
+ if (typeof options.header == 'string') {
+ return options.header;
+ }
+
+ var contentDisposition = this._getContentDisposition(value, options);
+ var contentType = this._getContentType(value, options);
+
+ var contents = '';
+ var headers = {
+ // add custom disposition as third element or keep it two elements if not
+ 'Content-Disposition': ['form-data', 'name="' + field + '"'].concat(contentDisposition || []),
+ // if no content type. allow it to be empty array
+ 'Content-Type': [].concat(contentType || [])
+ };
+
+ // allow custom headers.
+ if (typeof options.header == 'object') {
+ populate(headers, options.header);
+ }
+
+ var header;
+ for (var prop in headers) {
+ if (!headers.hasOwnProperty(prop)) continue;
+ header = headers[prop];
+
+ // skip nullish headers.
+ if (header == null) {
+ continue;
+ }
+
+ // convert all headers to arrays.
+ if (!Array.isArray(header)) {
+ header = [header];
+ }
+
+ // add non-empty headers.
+ if (header.length) {
+ contents += prop + ': ' + header.join('; ') + FormData.LINE_BREAK;
+ }
+ }
+
+ return '--' + this.getBoundary() + FormData.LINE_BREAK + contents + FormData.LINE_BREAK;
+};
+
+FormData.prototype._getContentDisposition = function(value, options) {
+
+ var filename
+ , contentDisposition
+ ;
+
+ if (typeof options.filepath === 'string') {
+ // custom filepath for relative paths
+ filename = path.normalize(options.filepath).replace(/\\/g, '/');
+ } else if (options.filename || value.name || value.path) {
+ // custom filename take precedence
+ // formidable and the browser add a name property
+ // fs- and request- streams have path property
+ filename = path.basename(options.filename || value.name || value.path);
+ } else if (value.readable && value.hasOwnProperty('httpVersion')) {
+ // or try http response
+ filename = path.basename(value.client._httpMessage.path || '');
+ }
+
+ if (filename) {
+ contentDisposition = 'filename="' + filename + '"';
+ }
+
+ return contentDisposition;
+};
+
+FormData.prototype._getContentType = function(value, options) {
+
+ // use custom content-type above all
+ var contentType = options.contentType;
+
+ // or try `name` from formidable, browser
+ if (!contentType && value.name) {
+ contentType = mime.lookup(value.name);
+ }
+
+ // or try `path` from fs-, request- streams
+ if (!contentType && value.path) {
+ contentType = mime.lookup(value.path);
+ }
+
+ // or if it's http-reponse
+ if (!contentType && value.readable && value.hasOwnProperty('httpVersion')) {
+ contentType = value.headers['content-type'];
+ }
+
+ // or guess it from the filepath or filename
+ if (!contentType && (options.filepath || options.filename)) {
+ contentType = mime.lookup(options.filepath || options.filename);
+ }
+
+ // fallback to the default content type if `value` is not simple value
+ if (!contentType && typeof value == 'object') {
+ contentType = FormData.DEFAULT_CONTENT_TYPE;
+ }
+
+ return contentType;
+};
+
+FormData.prototype._multiPartFooter = function() {
+ return function(next) {
+ var footer = FormData.LINE_BREAK;
+
+ var lastPart = (this._streams.length === 0);
+ if (lastPart) {
+ footer += this._lastBoundary();
+ }
+
+ next(footer);
+ }.bind(this);
+};
+
+FormData.prototype._lastBoundary = function() {
+ return '--' + this.getBoundary() + '--' + FormData.LINE_BREAK;
+};
+
+FormData.prototype.getHeaders = function(userHeaders) {
+ var header;
+ var formHeaders = {
+ 'content-type': 'multipart/form-data; boundary=' + this.getBoundary()
+ };
+
+ for (header in userHeaders) {
+ if (userHeaders.hasOwnProperty(header)) {
+ formHeaders[header.toLowerCase()] = userHeaders[header];
+ }
+ }
+
+ return formHeaders;
+};
+
+FormData.prototype.setBoundary = function(boundary) {
+ this._boundary = boundary;
+};
+
+FormData.prototype.getBoundary = function() {
+ if (!this._boundary) {
+ this._generateBoundary();
+ }
+
+ return this._boundary;
+};
+
+FormData.prototype.getBuffer = function() {
+ var dataBuffer = new Buffer.alloc( 0 );
+ var boundary = this.getBoundary();
+
+ // Create the form content. Add Line breaks to the end of data.
+ for (var i = 0, len = this._streams.length; i < len; i++) {
+ if (typeof this._streams[i] !== 'function') {
+
+ // Add content to the buffer.
+ if(Buffer.isBuffer(this._streams[i])) {
+ dataBuffer = Buffer.concat( [dataBuffer, this._streams[i]]);
+ }else {
+ dataBuffer = Buffer.concat( [dataBuffer, Buffer.from(this._streams[i])]);
+ }
+
+ // Add break after content.
+ if (typeof this._streams[i] !== 'string' || this._streams[i].substring( 2, boundary.length + 2 ) !== boundary) {
+ dataBuffer = Buffer.concat( [dataBuffer, Buffer.from(FormData.LINE_BREAK)] );
+ }
+ }
+ }
+
+ // Add the footer and return the Buffer object.
+ return Buffer.concat( [dataBuffer, Buffer.from(this._lastBoundary())] );
+};
+
+FormData.prototype._generateBoundary = function() {
+ // This generates a 50 character boundary similar to those used by Firefox.
+ // They are optimized for boyer-moore parsing.
+ var boundary = '--------------------------';
+ for (var i = 0; i < 24; i++) {
+ boundary += Math.floor(Math.random() * 10).toString(16);
+ }
+
+ this._boundary = boundary;
+};
+
+// Note: getLengthSync DOESN'T calculate streams length
+// As workaround one can calculate file size manually
+// and add it as knownLength option
+FormData.prototype.getLengthSync = function() {
+ var knownLength = this._overheadLength + this._valueLength;
+
+ // Don't get confused, there are 3 "internal" streams for each keyval pair
+ // so it basically checks if there is any value added to the form
+ if (this._streams.length) {
+ knownLength += this._lastBoundary().length;
+ }
+
+ // https://github.com/form-data/form-data/issues/40
+ if (!this.hasKnownLength()) {
+ // Some async length retrievers are present
+ // therefore synchronous length calculation is false.
+ // Please use getLength(callback) to get proper length
+ this._error(new Error('Cannot calculate proper length in synchronous way.'));
+ }
+
+ return knownLength;
+};
+
+// Public API to check if length of added values is known
+// https://github.com/form-data/form-data/issues/196
+// https://github.com/form-data/form-data/issues/262
+FormData.prototype.hasKnownLength = function() {
+ var hasKnownLength = true;
+
+ if (this._valuesToMeasure.length) {
+ hasKnownLength = false;
+ }
+
+ return hasKnownLength;
+};
+
+FormData.prototype.getLength = function(cb) {
+ var knownLength = this._overheadLength + this._valueLength;
+
+ if (this._streams.length) {
+ knownLength += this._lastBoundary().length;
+ }
+
+ if (!this._valuesToMeasure.length) {
+ process.nextTick(cb.bind(this, null, knownLength));
+ return;
+ }
+
+ asynckit.parallel(this._valuesToMeasure, this._lengthRetriever, function(err, values) {
+ if (err) {
+ cb(err);
+ return;
+ }
+
+ values.forEach(function(length) {
+ knownLength += length;
+ });
+
+ cb(null, knownLength);
+ });
+};
+
+FormData.prototype.submit = function(params, cb) {
+ var request
+ , options
+ , defaults = {method: 'post'}
+ ;
+
+ // parse provided url if it's string
+ // or treat it as options object
+ if (typeof params == 'string') {
+
+ params = parseUrl(params);
+ options = populate({
+ port: params.port,
+ path: params.pathname,
+ host: params.hostname,
+ protocol: params.protocol
+ }, defaults);
+
+ // use custom params
+ } else {
+
+ options = populate(params, defaults);
+ // if no port provided use default one
+ if (!options.port) {
+ options.port = options.protocol == 'https:' ? 443 : 80;
+ }
+ }
+
+ // put that good code in getHeaders to some use
+ options.headers = this.getHeaders(params.headers);
+
+ // https if specified, fallback to http in any other case
+ if (options.protocol == 'https:') {
+ request = https.request(options);
+ } else {
+ request = http.request(options);
+ }
+
+ // get content length and fire away
+ this.getLength(function(err, length) {
+ if (err && err !== 'Unknown stream') {
+ this._error(err);
+ return;
+ }
+
+ // add content length
+ if (length) {
+ request.setHeader('Content-Length', length);
+ }
+
+ this.pipe(request);
+ if (cb) {
+ var onResponse;
+
+ var callback = function (error, responce) {
+ request.removeListener('error', callback);
+ request.removeListener('response', onResponse);
+
+ return cb.call(this, error, responce);
+ };
+
+ onResponse = callback.bind(this, null);
+
+ request.on('error', callback);
+ request.on('response', onResponse);
+ }
+ }.bind(this));
+
+ return request;
+};
+
+FormData.prototype._error = function(err) {
+ if (!this.error) {
+ this.error = err;
+ this.pause();
+ this.emit('error', err);
+ }
+};
+
+FormData.prototype.toString = function () {
+ return '[object FormData]';
+};
+
+
+/***/ }),
+
+/***/ 7142:
+/***/ ((module) => {
+
+// populates missing values
+module.exports = function(dst, src) {
+
+ Object.keys(src).forEach(function(prop)
+ {
+ dst[prop] = dst[prop] || src[prop];
+ });
+
+ return dst;
+};
+
+
/***/ }),
/***/ 1621:
@@ -4241,6 +7349,221 @@ function isPlainObject(o) {
exports.isPlainObject = isPlainObject;
+/***/ }),
+
+/***/ 7426:
+/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
+
+/*!
+ * mime-db
+ * Copyright(c) 2014 Jonathan Ong
+ * Copyright(c) 2015-2022 Douglas Christopher Wilson
+ * MIT Licensed
+ */
+
+/**
+ * Module exports.
+ */
+
+module.exports = __nccwpck_require__(3765)
+
+
+/***/ }),
+
+/***/ 3583:
+/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
+
+"use strict";
+/*!
+ * mime-types
+ * Copyright(c) 2014 Jonathan Ong
+ * Copyright(c) 2015 Douglas Christopher Wilson
+ * MIT Licensed
+ */
+
+
+
+/**
+ * Module dependencies.
+ * @private
+ */
+
+var db = __nccwpck_require__(7426)
+var extname = (__nccwpck_require__(1017).extname)
+
+/**
+ * Module variables.
+ * @private
+ */
+
+var EXTRACT_TYPE_REGEXP = /^\s*([^;\s]*)(?:;|\s|$)/
+var TEXT_TYPE_REGEXP = /^text\//i
+
+/**
+ * Module exports.
+ * @public
+ */
+
+exports.charset = charset
+exports.charsets = { lookup: charset }
+exports.contentType = contentType
+exports.extension = extension
+exports.extensions = Object.create(null)
+exports.lookup = lookup
+exports.types = Object.create(null)
+
+// Populate the extensions/types maps
+populateMaps(exports.extensions, exports.types)
+
+/**
+ * Get the default charset for a MIME type.
+ *
+ * @param {string} type
+ * @return {boolean|string}
+ */
+
+function charset (type) {
+ if (!type || typeof type !== 'string') {
+ return false
+ }
+
+ // TODO: use media-typer
+ var match = EXTRACT_TYPE_REGEXP.exec(type)
+ var mime = match && db[match[1].toLowerCase()]
+
+ if (mime && mime.charset) {
+ return mime.charset
+ }
+
+ // default text/* to utf-8
+ if (match && TEXT_TYPE_REGEXP.test(match[1])) {
+ return 'UTF-8'
+ }
+
+ return false
+}
+
+/**
+ * Create a full Content-Type header given a MIME type or extension.
+ *
+ * @param {string} str
+ * @return {boolean|string}
+ */
+
+function contentType (str) {
+ // TODO: should this even be in this module?
+ if (!str || typeof str !== 'string') {
+ return false
+ }
+
+ var mime = str.indexOf('/') === -1
+ ? exports.lookup(str)
+ : str
+
+ if (!mime) {
+ return false
+ }
+
+ // TODO: use content-type or other module
+ if (mime.indexOf('charset') === -1) {
+ var charset = exports.charset(mime)
+ if (charset) mime += '; charset=' + charset.toLowerCase()
+ }
+
+ return mime
+}
+
+/**
+ * Get the default extension for a MIME type.
+ *
+ * @param {string} type
+ * @return {boolean|string}
+ */
+
+function extension (type) {
+ if (!type || typeof type !== 'string') {
+ return false
+ }
+
+ // TODO: use media-typer
+ var match = EXTRACT_TYPE_REGEXP.exec(type)
+
+ // get extensions
+ var exts = match && exports.extensions[match[1].toLowerCase()]
+
+ if (!exts || !exts.length) {
+ return false
+ }
+
+ return exts[0]
+}
+
+/**
+ * Lookup the MIME type for a file path/extension.
+ *
+ * @param {string} path
+ * @return {boolean|string}
+ */
+
+function lookup (path) {
+ if (!path || typeof path !== 'string') {
+ return false
+ }
+
+ // get the extension ("ext" or ".ext" or full path)
+ var extension = extname('x.' + path)
+ .toLowerCase()
+ .substr(1)
+
+ if (!extension) {
+ return false
+ }
+
+ return exports.types[extension] || false
+}
+
+/**
+ * Populate the extensions and types maps.
+ * @private
+ */
+
+function populateMaps (extensions, types) {
+ // source preference (least -> most)
+ var preference = ['nginx', 'apache', undefined, 'iana']
+
+ Object.keys(db).forEach(function forEachMimeType (type) {
+ var mime = db[type]
+ var exts = mime.extensions
+
+ if (!exts || !exts.length) {
+ return
+ }
+
+ // mime -> extensions
+ extensions[type] = exts
+
+ // extension -> mime
+ for (var i = 0; i < exts.length; i++) {
+ var extension = exts[i]
+
+ if (types[extension]) {
+ var from = preference.indexOf(db[types[extension]].source)
+ var to = preference.indexOf(mime.source)
+
+ if (types[extension] !== 'application/octet-stream' &&
+ (from > to || (from === to && types[extension].substr(0, 12) === 'application/'))) {
+ // skip the remapping
+ continue
+ }
+ }
+
+ // set the extension -> mime
+ types[extension] = type
+ }
+ })
+}
+
+
/***/ }),
/***/ 900:
@@ -6164,6 +9487,122 @@ function onceStrict (fn) {
}
+/***/ }),
+
+/***/ 3329:
+/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
+
+"use strict";
+
+
+var parseUrl = (__nccwpck_require__(7310).parse);
+
+var DEFAULT_PORTS = {
+ ftp: 21,
+ gopher: 70,
+ http: 80,
+ https: 443,
+ ws: 80,
+ wss: 443,
+};
+
+var stringEndsWith = String.prototype.endsWith || function(s) {
+ return s.length <= this.length &&
+ this.indexOf(s, this.length - s.length) !== -1;
+};
+
+/**
+ * @param {string|object} url - The URL, or the result from url.parse.
+ * @return {string} The URL of the proxy that should handle the request to the
+ * given URL. If no proxy is set, this will be an empty string.
+ */
+function getProxyForUrl(url) {
+ var parsedUrl = typeof url === 'string' ? parseUrl(url) : url || {};
+ var proto = parsedUrl.protocol;
+ var hostname = parsedUrl.host;
+ var port = parsedUrl.port;
+ if (typeof hostname !== 'string' || !hostname || typeof proto !== 'string') {
+ return ''; // Don't proxy URLs without a valid scheme or host.
+ }
+
+ proto = proto.split(':', 1)[0];
+ // Stripping ports in this way instead of using parsedUrl.hostname to make
+ // sure that the brackets around IPv6 addresses are kept.
+ hostname = hostname.replace(/:\d*$/, '');
+ port = parseInt(port) || DEFAULT_PORTS[proto] || 0;
+ if (!shouldProxy(hostname, port)) {
+ return ''; // Don't proxy URLs that match NO_PROXY.
+ }
+
+ var proxy =
+ getEnv('npm_config_' + proto + '_proxy') ||
+ getEnv(proto + '_proxy') ||
+ getEnv('npm_config_proxy') ||
+ getEnv('all_proxy');
+ if (proxy && proxy.indexOf('://') === -1) {
+ // Missing scheme in proxy, default to the requested URL's scheme.
+ proxy = proto + '://' + proxy;
+ }
+ return proxy;
+}
+
+/**
+ * Determines whether a given URL should be proxied.
+ *
+ * @param {string} hostname - The host name of the URL.
+ * @param {number} port - The effective port of the URL.
+ * @returns {boolean} Whether the given URL should be proxied.
+ * @private
+ */
+function shouldProxy(hostname, port) {
+ var NO_PROXY =
+ (getEnv('npm_config_no_proxy') || getEnv('no_proxy')).toLowerCase();
+ if (!NO_PROXY) {
+ return true; // Always proxy if NO_PROXY is not set.
+ }
+ if (NO_PROXY === '*') {
+ return false; // Never proxy if wildcard is set.
+ }
+
+ return NO_PROXY.split(/[,\s]/).every(function(proxy) {
+ if (!proxy) {
+ return true; // Skip zero-length hosts.
+ }
+ var parsedProxy = proxy.match(/^(.+):(\d+)$/);
+ var parsedProxyHostname = parsedProxy ? parsedProxy[1] : proxy;
+ var parsedProxyPort = parsedProxy ? parseInt(parsedProxy[2]) : 0;
+ if (parsedProxyPort && parsedProxyPort !== port) {
+ return true; // Skip if ports don't match.
+ }
+
+ if (!/^[.*]/.test(parsedProxyHostname)) {
+ // No wildcards, so stop proxying if there is an exact match.
+ return hostname !== parsedProxyHostname;
+ }
+
+ if (parsedProxyHostname.charAt(0) === '*') {
+ // Remove leading wildcard.
+ parsedProxyHostname = parsedProxyHostname.slice(1);
+ }
+ // Stop proxying if the hostname ends with the no_proxy host.
+ return !stringEndsWith.call(hostname, parsedProxyHostname);
+ });
+}
+
+/**
+ * Get the value for an environment variable.
+ *
+ * @param {string} key - The name of the environment variable.
+ * @return {string} The value of the environment variable.
+ * @private
+ */
+function getEnv(key) {
+ return process.env[key.toLowerCase()] || process.env[key.toUpperCase()] || '';
+}
+
+exports.getProxyForUrl = getProxyForUrl;
+
+
/***/ }),
/***/ 9103:
@@ -6214,9 +9653,9 @@ var __reExport = (target, module2, copyDefault, desc) => {
var __toESM = (module2, isNodeMode) => {
return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", !isNodeMode && module2 && module2.__esModule ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
};
-var __toCommonJS = /* @__PURE__ */ ((cache) => {
+var __toCommonJS = /* @__PURE__ */ ((cache2) => {
return (module2, temp) => {
- return cache && cache.get(module2) || (temp = __reExport(__markAsModule({}), module2, 1), cache && cache.set(module2, temp), temp);
+ return cache2 && cache2.get(module2) || (temp = __reExport(__markAsModule({}), module2, 1), cache2 && cache2.set(module2, temp), temp);
};
})(typeof WeakMap !== "undefined" ? /* @__PURE__ */ new WeakMap() : 0);
var __async = (__this, __arguments, generator) => {
@@ -6268,6 +9707,25 @@ var init_git_response_error = __esm({
}
});
+// src/lib/args/pathspec.ts
+function pathspec(...paths) {
+ const key = new String(paths);
+ cache.set(key, paths);
+ return key;
+}
+function isPathSpec(path) {
+ return path instanceof String && cache.has(path);
+}
+function toPaths(pathSpec) {
+ return cache.get(pathSpec) || [];
+}
+var cache;
+var init_pathspec = __esm({
+ "src/lib/args/pathspec.ts"() {
+ cache = /* @__PURE__ */ new WeakMap();
+ }
+});
+
// src/lib/errors/git-construct-error.ts
var GitConstructError;
var init_git_construct_error = __esm({
@@ -6426,7 +9884,8 @@ function filterType(input, filter, def) {
return arguments.length > 2 ? def : void 0;
}
function filterPrimitives(input, omit) {
- return /number|string|boolean/.test(typeof input) && (!omit || !omit.includes(typeof input));
+ const type = isPathSpec(input) ? "string" : typeof input;
+ return /number|string|boolean/.test(type) && (!omit || !omit.includes(type));
}
function filterPlainObject(input) {
return !!input && objectToString(input) === "[object Object]";
@@ -6438,6 +9897,7 @@ var filterArray, filterString, filterStringArray, filterStringOrStringArray, fil
var init_argument_filters = __esm({
"src/lib/utils/argument-filters.ts"() {
init_util();
+ init_pathspec();
filterArray = (input) => {
return Array.isArray(input);
};
@@ -6568,7 +10028,9 @@ function appendTaskOptions(options, commands = []) {
}
return Object.keys(options).reduce((commands2, key) => {
const value = options[key];
- if (filterPrimitives(value, ["boolean"])) {
+ if (isPathSpec(value)) {
+ commands2.push(value);
+ } else if (filterPrimitives(value, ["boolean"])) {
commands2.push(key + "=" + value);
} else {
commands2.push(key);
@@ -6605,6 +10067,7 @@ var init_task_options = __esm({
"src/lib/utils/task-options.ts"() {
init_argument_filters();
init_util();
+ init_pathspec();
}
});
@@ -7232,10 +10695,12 @@ __export(api_exports, {
GitResponseError: () => GitResponseError,
ResetMode: () => ResetMode,
TaskConfigurationError: () => TaskConfigurationError,
- grepQueryBuilder: () => grepQueryBuilder
+ grepQueryBuilder: () => grepQueryBuilder,
+ pathspec: () => pathspec
});
var init_api = __esm({
"src/lib/api.ts"() {
+ init_pathspec();
init_git_construct_error();
init_git_error();
init_git_plugin_error();
@@ -7293,15 +10758,28 @@ function preventProtocolOverride(arg, next) {
}
throw new GitPluginError(void 0, "unsafe", "Configuring protocol.allow is not permitted without enabling allowUnsafeExtProtocol");
}
+function preventUploadPack(arg, method) {
+ if (/^\s*--(upload|receive)-pack/.test(arg)) {
+ throw new GitPluginError(void 0, "unsafe", `Use of --upload-pack or --receive-pack is not permitted without enabling allowUnsafePack`);
+ }
+ if (method === "clone" && /^\s*-u\b/.test(arg)) {
+ throw new GitPluginError(void 0, "unsafe", `Use of clone with option -u is not permitted without enabling allowUnsafePack`);
+ }
+ if (method === "push" && /^\s*--exec\b/.test(arg)) {
+ throw new GitPluginError(void 0, "unsafe", `Use of push with option --exec is not permitted without enabling allowUnsafePack`);
+ }
+}
function blockUnsafeOperationsPlugin({
- allowUnsafeProtocolOverride = false
+ allowUnsafeProtocolOverride = false,
+ allowUnsafePack = false
} = {}) {
return {
type: "spawn.args",
- action(args, _context) {
+ action(args, context) {
args.forEach((current, index) => {
const next = index < args.length ? args[index + 1] : "";
allowUnsafeProtocolOverride || preventProtocolOverride(current, next);
+ allowUnsafePack || preventUploadPack(current, context.method);
});
return args;
}
@@ -7543,7 +11021,9 @@ var init_spawn_options_plugin = __esm({
// src/lib/plugins/timout-plugin.ts
function timeoutPlugin({
- block
+ block,
+ stdErr = true,
+ stdOut = true
}) {
if (block > 0) {
return {
@@ -7567,8 +11047,8 @@ function timeoutPlugin({
stop();
context.kill(new GitPluginError(void 0, "timeout", `block timeout reached`));
}
- (_a2 = context.spawned.stdout) == null ? void 0 : _a2.on("data", wait);
- (_b = context.spawned.stderr) == null ? void 0 : _b.on("data", wait);
+ stdOut && ((_a2 = context.spawned.stdout) == null ? void 0 : _a2.on("data", wait));
+ stdErr && ((_b = context.spawned.stderr) == null ? void 0 : _b.on("data", wait));
context.spawned.on("exit", stop);
context.spawned.on("close", stop);
wait();
@@ -7598,6 +11078,35 @@ var init_plugins = __esm({
}
});
+// src/lib/plugins/suffix-paths.plugin.ts
+function suffixPathsPlugin() {
+ return {
+ type: "spawn.args",
+ action(data) {
+ const prefix = [];
+ const suffix = [];
+ for (let i = 0; i < data.length; i++) {
+ const param = data[i];
+ if (isPathSpec(param)) {
+ suffix.push(...toPaths(param));
+ continue;
+ }
+ if (param === "--") {
+ suffix.push(...data.slice(i + 1).flatMap((item) => isPathSpec(item) && toPaths(item) || item));
+ break;
+ }
+ prefix.push(param);
+ }
+ return !suffix.length ? prefix : [...prefix, "--", ...suffix.map(String)];
+ }
+ };
+}
+var init_suffix_paths_plugin = __esm({
+ "src/lib/plugins/suffix-paths.plugin.ts"() {
+ init_pathspec();
+ }
+});
+
// src/lib/git-logger.ts
function createLog() {
return (0, import_debug.default)("simple-git");
@@ -7998,6 +11507,34 @@ var init_change_working_directory = __esm({
}
});
+// src/lib/tasks/checkout.ts
+function checkoutTask(args) {
+ const commands = ["checkout", ...args];
+ if (commands[1] === "-b" && commands.includes("-B")) {
+ commands[1] = remove(commands, "-B");
+ }
+ return straightThroughStringTask(commands);
+}
+function checkout_default() {
+ return {
+ checkout() {
+ return this._runTask(checkoutTask(getTrailingOptions(arguments, 1)), trailingFunctionArgument(arguments));
+ },
+ checkoutBranch(branchName, startPoint) {
+ return this._runTask(checkoutTask(["-b", branchName, startPoint, ...getTrailingOptions(arguments)]), trailingFunctionArgument(arguments));
+ },
+ checkoutLocalBranch(branchName) {
+ return this._runTask(checkoutTask(["-b", branchName, ...getTrailingOptions(arguments)]), trailingFunctionArgument(arguments));
+ }
+ };
+}
+var init_checkout = __esm({
+ "src/lib/tasks/checkout.ts"() {
+ init_utils();
+ init_task();
+ }
+});
+
// src/lib/parsers/parse-commit.ts
function parseCommitResult(stdOut) {
const result = {
@@ -8053,11 +11590,6 @@ var init_parse_commit = __esm({
});
// src/lib/tasks/commit.ts
-var commit_exports = {};
-__export(commit_exports, {
- commitTask: () => commitTask,
- default: () => commit_default
-});
function commitTask(message, files, customArgs) {
const commands = [
"-c",
@@ -8778,7 +12310,7 @@ var init_parse_push = __esm({
local
});
}),
- new LineParser(/^[*-=]\s+([^:]+):(\S+)\s+\[(.+)]$/, (result, [local, remote, type]) => {
+ new LineParser(/^[=*-]\s+([^:]+):(\S+)\s+\[(.+)]$/, (result, [local, remote, type]) => {
result.pushed.push(pushResultPushedItem(local, remote, type));
}),
new LineParser(/^Branch '([^']+)' set up to track remote branch '([^']+)' from '([^']+)'/, (result, [local, remote, remoteName]) => {
@@ -8846,6 +12378,29 @@ var init_push = __esm({
}
});
+// src/lib/tasks/show.ts
+function show_default() {
+ return {
+ showBuffer() {
+ const commands = ["show", ...getTrailingOptions(arguments, 1)];
+ if (!commands.includes("--binary")) {
+ commands.splice(1, 0, "--binary");
+ }
+ return this._runTask(straightThroughBufferTask(commands), trailingFunctionArgument(arguments));
+ },
+ show() {
+ const commands = ["show", ...getTrailingOptions(arguments, 1)];
+ return this._runTask(straightThroughStringTask(commands), trailingFunctionArgument(arguments));
+ }
+ };
+}
+var init_show = __esm({
+ "src/lib/tasks/show.ts"() {
+ init_utils();
+ init_task();
+ }
+});
+
// src/lib/responses/FileStatusSummary.ts
var fromPathRegex, FileStatusSummary;
var init_FileStatusSummary = __esm({
@@ -9086,6 +12641,7 @@ var init_simple_git_api = __esm({
"src/lib/simple-git-api.ts"() {
init_task_callback();
init_change_working_directory();
+ init_checkout();
init_commit();
init_config();
init_grep();
@@ -9094,6 +12650,7 @@ var init_simple_git_api = __esm({
init_log();
init_merge();
init_push();
+ init_show();
init_status();
init_task();
init_version();
@@ -9160,7 +12717,7 @@ var init_simple_git_api = __esm({
return this._runTask(statusTask(getTrailingOptions(arguments)), trailingFunctionArgument(arguments));
}
};
- Object.assign(SimpleGitApi.prototype, commit_default(), config_default(), grep_default(), log_default(), version_default());
+ Object.assign(SimpleGitApi.prototype, checkout_default(), commit_default(), config_default(), grep_default(), log_default(), show_default(), version_default());
}
});
@@ -9886,7 +13443,6 @@ var require_git = __commonJS({
var { checkIsRepoTask: checkIsRepoTask2 } = (init_check_is_repo(), __toCommonJS(check_is_repo_exports));
var { cloneTask: cloneTask2, cloneMirrorTask: cloneMirrorTask2 } = (init_clone(), __toCommonJS(clone_exports));
var { cleanWithOptionsTask: cleanWithOptionsTask2, isCleanOptionsArray: isCleanOptionsArray2 } = (init_clean(), __toCommonJS(clean_exports));
- var { commitTask: commitTask2 } = (init_commit(), __toCommonJS(commit_exports));
var { diffSummaryTask: diffSummaryTask2 } = (init_diff(), __toCommonJS(diff_exports));
var { fetchTask: fetchTask2 } = (init_fetch(), __toCommonJS(fetch_exports));
var { moveTask: moveTask2 } = (init_move(), __toCommonJS(move_exports));
@@ -9985,16 +13541,6 @@ var require_git = __commonJS({
Git2.prototype.addAnnotatedTag = function(tagName, tagMessage) {
return this._runTask(addAnnotatedTagTask2(tagName, tagMessage), trailingFunctionArgument2(arguments));
};
- Git2.prototype.checkout = function() {
- const commands = ["checkout", ...getTrailingOptions2(arguments, true)];
- return this._runTask(straightThroughStringTask2(commands), trailingFunctionArgument2(arguments));
- };
- Git2.prototype.checkoutBranch = function(branchName, startPoint, then) {
- return this.checkout(["-b", branchName, startPoint], trailingFunctionArgument2(arguments));
- };
- Git2.prototype.checkoutLocalBranch = function(branchName, then) {
- return this.checkout(["-b", branchName], trailingFunctionArgument2(arguments));
- };
Git2.prototype.deleteLocalBranch = function(branchName, forceDelete, then) {
return this._runTask(deleteBranchTask2(branchName, typeof forceDelete === "boolean" ? forceDelete : false), trailingFunctionArgument2(arguments));
};
@@ -10104,9 +13650,6 @@ var require_git = __commonJS({
const commands = ["rev-parse", ...getTrailingOptions2(arguments, true)];
return this._runTask(straightThroughStringTask2(commands, true), trailingFunctionArgument2(arguments));
};
- Git2.prototype.show = function(options, then) {
- return this._runTask(straightThroughStringTask2(["show", ...getTrailingOptions2(arguments, 1)]), trailingFunctionArgument2(arguments));
- };
Git2.prototype.clean = function(mode, options, then) {
const usingCleanOptionsArray = isCleanOptionsArray2(mode);
const cleanMode = usingCleanOptionsArray && mode.join("") || filterType2(mode, filterString2) || "";
@@ -10164,6 +13707,7 @@ function gitInstanceFactory(baseDir, options) {
plugins.add(commandConfigPrefixingPlugin(config.config));
}
plugins.add(blockUnsafeOperationsPlugin(config.unsafe));
+ plugins.add(suffixPathsPlugin());
plugins.add(completionDetectionPlugin(config.completion));
config.abort && plugins.add(abortPlugin(config.abort));
config.progress && plugins.add(progressMonitorPlugin(config.progress));
@@ -10178,6 +13722,7 @@ var init_git_factory = __esm({
"src/lib/git-factory.ts"() {
init_api();
init_plugins();
+ init_suffix_paths_plugin();
init_utils();
Git = require_git();
}
@@ -12705,6 +16250,14 @@ function wrappy (fn, cb) {
module.exports = eval("require")("encoding");
+/***/ }),
+
+/***/ 9491:
+/***/ ((module) => {
+
+"use strict";
+module.exports = require("assert");
+
/***/ }),
/***/ 2081:
@@ -12715,6 +16268,14 @@ module.exports = require("child_process");
/***/ }),
+/***/ 6113:
+/***/ ((module) => {
+
+"use strict";
+module.exports = require("crypto");
+
+/***/ }),
+
/***/ 2361:
/***/ ((module) => {
@@ -16077,13 +19638,4794 @@ function suggestSimilar(word, candidates) {
exports.suggestSimilar = suggestSimilar;
+/***/ }),
+
+/***/ 8757:
+/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
+
+"use strict";
+/*! Axios v1.8.4 Copyright (c) 2025 Matt Zabriskie and contributors */
+
+
+const FormData$1 = __nccwpck_require__(4334);
+const crypto = __nccwpck_require__(6113);
+const url = __nccwpck_require__(7310);
+const proxyFromEnv = __nccwpck_require__(3329);
+const http = __nccwpck_require__(3685);
+const https = __nccwpck_require__(5687);
+const util = __nccwpck_require__(3837);
+const followRedirects = __nccwpck_require__(7707);
+const zlib = __nccwpck_require__(9796);
+const stream = __nccwpck_require__(2781);
+const events = __nccwpck_require__(2361);
+
+function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
+
+const FormData__default = /*#__PURE__*/_interopDefaultLegacy(FormData$1);
+const crypto__default = /*#__PURE__*/_interopDefaultLegacy(crypto);
+const url__default = /*#__PURE__*/_interopDefaultLegacy(url);
+const proxyFromEnv__default = /*#__PURE__*/_interopDefaultLegacy(proxyFromEnv);
+const http__default = /*#__PURE__*/_interopDefaultLegacy(http);
+const https__default = /*#__PURE__*/_interopDefaultLegacy(https);
+const util__default = /*#__PURE__*/_interopDefaultLegacy(util);
+const followRedirects__default = /*#__PURE__*/_interopDefaultLegacy(followRedirects);
+const zlib__default = /*#__PURE__*/_interopDefaultLegacy(zlib);
+const stream__default = /*#__PURE__*/_interopDefaultLegacy(stream);
+
+function bind(fn, thisArg) {
+ return function wrap() {
+ return fn.apply(thisArg, arguments);
+ };
+}
+
+// utils is a library of generic helper functions non-specific to axios
+
+const {toString} = Object.prototype;
+const {getPrototypeOf} = Object;
+
+const kindOf = (cache => thing => {
+ const str = toString.call(thing);
+ return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());
+})(Object.create(null));
+
+const kindOfTest = (type) => {
+ type = type.toLowerCase();
+ return (thing) => kindOf(thing) === type
+};
+
+const typeOfTest = type => thing => typeof thing === type;
+
+/**
+ * Determine if a value is an Array
+ *
+ * @param {Object} val The value to test
+ *
+ * @returns {boolean} True if value is an Array, otherwise false
+ */
+const {isArray} = Array;
+
+/**
+ * Determine if a value is undefined
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if the value is undefined, otherwise false
+ */
+const isUndefined = typeOfTest('undefined');
+
+/**
+ * Determine if a value is a Buffer
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a Buffer, otherwise false
+ */
+function isBuffer(val) {
+ return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)
+ && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);
+}
+
+/**
+ * Determine if a value is an ArrayBuffer
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is an ArrayBuffer, otherwise false
+ */
+const isArrayBuffer = kindOfTest('ArrayBuffer');
+
+
+/**
+ * Determine if a value is a view on an ArrayBuffer
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false
+ */
+function isArrayBufferView(val) {
+ let result;
+ if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {
+ result = ArrayBuffer.isView(val);
+ } else {
+ result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));
+ }
+ return result;
+}
+
+/**
+ * Determine if a value is a String
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a String, otherwise false
+ */
+const isString = typeOfTest('string');
+
+/**
+ * Determine if a value is a Function
+ *
+ * @param {*} val The value to test
+ * @returns {boolean} True if value is a Function, otherwise false
+ */
+const isFunction = typeOfTest('function');
+
+/**
+ * Determine if a value is a Number
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a Number, otherwise false
+ */
+const isNumber = typeOfTest('number');
+
+/**
+ * Determine if a value is an Object
+ *
+ * @param {*} thing The value to test
+ *
+ * @returns {boolean} True if value is an Object, otherwise false
+ */
+const isObject = (thing) => thing !== null && typeof thing === 'object';
+
+/**
+ * Determine if a value is a Boolean
+ *
+ * @param {*} thing The value to test
+ * @returns {boolean} True if value is a Boolean, otherwise false
+ */
+const isBoolean = thing => thing === true || thing === false;
+
+/**
+ * Determine if a value is a plain Object
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a plain Object, otherwise false
+ */
+const isPlainObject = (val) => {
+ if (kindOf(val) !== 'object') {
+ return false;
+ }
+
+ const prototype = getPrototypeOf(val);
+ return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in val) && !(Symbol.iterator in val);
+};
+
+/**
+ * Determine if a value is a Date
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a Date, otherwise false
+ */
+const isDate = kindOfTest('Date');
+
+/**
+ * Determine if a value is a File
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a File, otherwise false
+ */
+const isFile = kindOfTest('File');
+
+/**
+ * Determine if a value is a Blob
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a Blob, otherwise false
+ */
+const isBlob = kindOfTest('Blob');
+
+/**
+ * Determine if a value is a FileList
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a File, otherwise false
+ */
+const isFileList = kindOfTest('FileList');
+
+/**
+ * Determine if a value is a Stream
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a Stream, otherwise false
+ */
+const isStream = (val) => isObject(val) && isFunction(val.pipe);
+
+/**
+ * Determine if a value is a FormData
+ *
+ * @param {*} thing The value to test
+ *
+ * @returns {boolean} True if value is an FormData, otherwise false
+ */
+const isFormData = (thing) => {
+ let kind;
+ return thing && (
+ (typeof FormData === 'function' && thing instanceof FormData) || (
+ isFunction(thing.append) && (
+ (kind = kindOf(thing)) === 'formdata' ||
+ // detect form-data instance
+ (kind === 'object' && isFunction(thing.toString) && thing.toString() === '[object FormData]')
+ )
+ )
+ )
+};
+
+/**
+ * Determine if a value is a URLSearchParams object
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a URLSearchParams object, otherwise false
+ */
+const isURLSearchParams = kindOfTest('URLSearchParams');
+
+const [isReadableStream, isRequest, isResponse, isHeaders] = ['ReadableStream', 'Request', 'Response', 'Headers'].map(kindOfTest);
+
+/**
+ * Trim excess whitespace off the beginning and end of a string
+ *
+ * @param {String} str The String to trim
+ *
+ * @returns {String} The String freed of excess whitespace
+ */
+const trim = (str) => str.trim ?
+ str.trim() : str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
+
+/**
+ * Iterate over an Array or an Object invoking a function for each item.
+ *
+ * If `obj` is an Array callback will be called passing
+ * the value, index, and complete array for each item.
+ *
+ * If 'obj' is an Object callback will be called passing
+ * the value, key, and complete object for each property.
+ *
+ * @param {Object|Array} obj The object to iterate
+ * @param {Function} fn The callback to invoke for each item
+ *
+ * @param {Boolean} [allOwnKeys = false]
+ * @returns {any}
+ */
+function forEach(obj, fn, {allOwnKeys = false} = {}) {
+ // Don't bother if no value provided
+ if (obj === null || typeof obj === 'undefined') {
+ return;
+ }
+
+ let i;
+ let l;
+
+ // Force an array if not already something iterable
+ if (typeof obj !== 'object') {
+ /*eslint no-param-reassign:0*/
+ obj = [obj];
+ }
+
+ if (isArray(obj)) {
+ // Iterate over array values
+ for (i = 0, l = obj.length; i < l; i++) {
+ fn.call(null, obj[i], i, obj);
+ }
+ } else {
+ // Iterate over object keys
+ const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);
+ const len = keys.length;
+ let key;
+
+ for (i = 0; i < len; i++) {
+ key = keys[i];
+ fn.call(null, obj[key], key, obj);
+ }
+ }
+}
+
+function findKey(obj, key) {
+ key = key.toLowerCase();
+ const keys = Object.keys(obj);
+ let i = keys.length;
+ let _key;
+ while (i-- > 0) {
+ _key = keys[i];
+ if (key === _key.toLowerCase()) {
+ return _key;
+ }
+ }
+ return null;
+}
+
+const _global = (() => {
+ /*eslint no-undef:0*/
+ if (typeof globalThis !== "undefined") return globalThis;
+ return typeof self !== "undefined" ? self : (typeof window !== 'undefined' ? window : global)
+})();
+
+const isContextDefined = (context) => !isUndefined(context) && context !== _global;
+
+/**
+ * Accepts varargs expecting each argument to be an object, then
+ * immutably merges the properties of each object and returns result.
+ *
+ * When multiple objects contain the same key the later object in
+ * the arguments list will take precedence.
+ *
+ * Example:
+ *
+ * ```js
+ * var result = merge({foo: 123}, {foo: 456});
+ * console.log(result.foo); // outputs 456
+ * ```
+ *
+ * @param {Object} obj1 Object to merge
+ *
+ * @returns {Object} Result of all merge properties
+ */
+function merge(/* obj1, obj2, obj3, ... */) {
+ const {caseless} = isContextDefined(this) && this || {};
+ const result = {};
+ const assignValue = (val, key) => {
+ const targetKey = caseless && findKey(result, key) || key;
+ if (isPlainObject(result[targetKey]) && isPlainObject(val)) {
+ result[targetKey] = merge(result[targetKey], val);
+ } else if (isPlainObject(val)) {
+ result[targetKey] = merge({}, val);
+ } else if (isArray(val)) {
+ result[targetKey] = val.slice();
+ } else {
+ result[targetKey] = val;
+ }
+ };
+
+ for (let i = 0, l = arguments.length; i < l; i++) {
+ arguments[i] && forEach(arguments[i], assignValue);
+ }
+ return result;
+}
+
+/**
+ * Extends object a by mutably adding to it the properties of object b.
+ *
+ * @param {Object} a The object to be extended
+ * @param {Object} b The object to copy properties from
+ * @param {Object} thisArg The object to bind function to
+ *
+ * @param {Boolean} [allOwnKeys]
+ * @returns {Object} The resulting value of object a
+ */
+const extend = (a, b, thisArg, {allOwnKeys}= {}) => {
+ forEach(b, (val, key) => {
+ if (thisArg && isFunction(val)) {
+ a[key] = bind(val, thisArg);
+ } else {
+ a[key] = val;
+ }
+ }, {allOwnKeys});
+ return a;
+};
+
+/**
+ * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)
+ *
+ * @param {string} content with BOM
+ *
+ * @returns {string} content value without BOM
+ */
+const stripBOM = (content) => {
+ if (content.charCodeAt(0) === 0xFEFF) {
+ content = content.slice(1);
+ }
+ return content;
+};
+
+/**
+ * Inherit the prototype methods from one constructor into another
+ * @param {function} constructor
+ * @param {function} superConstructor
+ * @param {object} [props]
+ * @param {object} [descriptors]
+ *
+ * @returns {void}
+ */
+const inherits = (constructor, superConstructor, props, descriptors) => {
+ constructor.prototype = Object.create(superConstructor.prototype, descriptors);
+ constructor.prototype.constructor = constructor;
+ Object.defineProperty(constructor, 'super', {
+ value: superConstructor.prototype
+ });
+ props && Object.assign(constructor.prototype, props);
+};
+
+/**
+ * Resolve object with deep prototype chain to a flat object
+ * @param {Object} sourceObj source object
+ * @param {Object} [destObj]
+ * @param {Function|Boolean} [filter]
+ * @param {Function} [propFilter]
+ *
+ * @returns {Object}
+ */
+const toFlatObject = (sourceObj, destObj, filter, propFilter) => {
+ let props;
+ let i;
+ let prop;
+ const merged = {};
+
+ destObj = destObj || {};
+ // eslint-disable-next-line no-eq-null,eqeqeq
+ if (sourceObj == null) return destObj;
+
+ do {
+ props = Object.getOwnPropertyNames(sourceObj);
+ i = props.length;
+ while (i-- > 0) {
+ prop = props[i];
+ if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {
+ destObj[prop] = sourceObj[prop];
+ merged[prop] = true;
+ }
+ }
+ sourceObj = filter !== false && getPrototypeOf(sourceObj);
+ } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);
+
+ return destObj;
+};
+
+/**
+ * Determines whether a string ends with the characters of a specified string
+ *
+ * @param {String} str
+ * @param {String} searchString
+ * @param {Number} [position= 0]
+ *
+ * @returns {boolean}
+ */
+const endsWith = (str, searchString, position) => {
+ str = String(str);
+ if (position === undefined || position > str.length) {
+ position = str.length;
+ }
+ position -= searchString.length;
+ const lastIndex = str.indexOf(searchString, position);
+ return lastIndex !== -1 && lastIndex === position;
+};
+
+
+/**
+ * Returns new array from array like object or null if failed
+ *
+ * @param {*} [thing]
+ *
+ * @returns {?Array}
+ */
+const toArray = (thing) => {
+ if (!thing) return null;
+ if (isArray(thing)) return thing;
+ let i = thing.length;
+ if (!isNumber(i)) return null;
+ const arr = new Array(i);
+ while (i-- > 0) {
+ arr[i] = thing[i];
+ }
+ return arr;
+};
+
+/**
+ * Checking if the Uint8Array exists and if it does, it returns a function that checks if the
+ * thing passed in is an instance of Uint8Array
+ *
+ * @param {TypedArray}
+ *
+ * @returns {Array}
+ */
+// eslint-disable-next-line func-names
+const isTypedArray = (TypedArray => {
+ // eslint-disable-next-line func-names
+ return thing => {
+ return TypedArray && thing instanceof TypedArray;
+ };
+})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));
+
+/**
+ * For each entry in the object, call the function with the key and value.
+ *
+ * @param {Object} obj - The object to iterate over.
+ * @param {Function} fn - The function to call for each entry.
+ *
+ * @returns {void}
+ */
+const forEachEntry = (obj, fn) => {
+ const generator = obj && obj[Symbol.iterator];
+
+ const iterator = generator.call(obj);
+
+ let result;
+
+ while ((result = iterator.next()) && !result.done) {
+ const pair = result.value;
+ fn.call(obj, pair[0], pair[1]);
+ }
+};
+
+/**
+ * It takes a regular expression and a string, and returns an array of all the matches
+ *
+ * @param {string} regExp - The regular expression to match against.
+ * @param {string} str - The string to search.
+ *
+ * @returns {Array}
+ */
+const matchAll = (regExp, str) => {
+ let matches;
+ const arr = [];
+
+ while ((matches = regExp.exec(str)) !== null) {
+ arr.push(matches);
+ }
+
+ return arr;
+};
+
+/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */
+const isHTMLForm = kindOfTest('HTMLFormElement');
+
+const toCamelCase = str => {
+ return str.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,
+ function replacer(m, p1, p2) {
+ return p1.toUpperCase() + p2;
+ }
+ );
+};
+
+/* Creating a function that will check if an object has a property. */
+const hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype);
+
+/**
+ * Determine if a value is a RegExp object
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a RegExp object, otherwise false
+ */
+const isRegExp = kindOfTest('RegExp');
+
+const reduceDescriptors = (obj, reducer) => {
+ const descriptors = Object.getOwnPropertyDescriptors(obj);
+ const reducedDescriptors = {};
+
+ forEach(descriptors, (descriptor, name) => {
+ let ret;
+ if ((ret = reducer(descriptor, name, obj)) !== false) {
+ reducedDescriptors[name] = ret || descriptor;
+ }
+ });
+
+ Object.defineProperties(obj, reducedDescriptors);
+};
+
+/**
+ * Makes all methods read-only
+ * @param {Object} obj
+ */
+
+const freezeMethods = (obj) => {
+ reduceDescriptors(obj, (descriptor, name) => {
+ // skip restricted props in strict mode
+ if (isFunction(obj) && ['arguments', 'caller', 'callee'].indexOf(name) !== -1) {
+ return false;
+ }
+
+ const value = obj[name];
+
+ if (!isFunction(value)) return;
+
+ descriptor.enumerable = false;
+
+ if ('writable' in descriptor) {
+ descriptor.writable = false;
+ return;
+ }
+
+ if (!descriptor.set) {
+ descriptor.set = () => {
+ throw Error('Can not rewrite read-only method \'' + name + '\'');
+ };
+ }
+ });
+};
+
+const toObjectSet = (arrayOrString, delimiter) => {
+ const obj = {};
+
+ const define = (arr) => {
+ arr.forEach(value => {
+ obj[value] = true;
+ });
+ };
+
+ isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));
+
+ return obj;
+};
+
+const noop = () => {};
+
+const toFiniteNumber = (value, defaultValue) => {
+ return value != null && Number.isFinite(value = +value) ? value : defaultValue;
+};
+
+/**
+ * If the thing is a FormData object, return true, otherwise return false.
+ *
+ * @param {unknown} thing - The thing to check.
+ *
+ * @returns {boolean}
+ */
+function isSpecCompliantForm(thing) {
+ return !!(thing && isFunction(thing.append) && thing[Symbol.toStringTag] === 'FormData' && thing[Symbol.iterator]);
+}
+
+const toJSONObject = (obj) => {
+ const stack = new Array(10);
+
+ const visit = (source, i) => {
+
+ if (isObject(source)) {
+ if (stack.indexOf(source) >= 0) {
+ return;
+ }
+
+ if(!('toJSON' in source)) {
+ stack[i] = source;
+ const target = isArray(source) ? [] : {};
+
+ forEach(source, (value, key) => {
+ const reducedValue = visit(value, i + 1);
+ !isUndefined(reducedValue) && (target[key] = reducedValue);
+ });
+
+ stack[i] = undefined;
+
+ return target;
+ }
+ }
+
+ return source;
+ };
+
+ return visit(obj, 0);
+};
+
+const isAsyncFn = kindOfTest('AsyncFunction');
+
+const isThenable = (thing) =>
+ thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch);
+
+// original code
+// https://github.com/DigitalBrainJS/AxiosPromise/blob/16deab13710ec09779922131f3fa5954320f83ab/lib/utils.js#L11-L34
+
+const _setImmediate = ((setImmediateSupported, postMessageSupported) => {
+ if (setImmediateSupported) {
+ return setImmediate;
+ }
+
+ return postMessageSupported ? ((token, callbacks) => {
+ _global.addEventListener("message", ({source, data}) => {
+ if (source === _global && data === token) {
+ callbacks.length && callbacks.shift()();
+ }
+ }, false);
+
+ return (cb) => {
+ callbacks.push(cb);
+ _global.postMessage(token, "*");
+ }
+ })(`axios@${Math.random()}`, []) : (cb) => setTimeout(cb);
+})(
+ typeof setImmediate === 'function',
+ isFunction(_global.postMessage)
+);
+
+const asap = typeof queueMicrotask !== 'undefined' ?
+ queueMicrotask.bind(_global) : ( typeof process !== 'undefined' && process.nextTick || _setImmediate);
+
+// *********************
+
+const utils$1 = {
+ isArray,
+ isArrayBuffer,
+ isBuffer,
+ isFormData,
+ isArrayBufferView,
+ isString,
+ isNumber,
+ isBoolean,
+ isObject,
+ isPlainObject,
+ isReadableStream,
+ isRequest,
+ isResponse,
+ isHeaders,
+ isUndefined,
+ isDate,
+ isFile,
+ isBlob,
+ isRegExp,
+ isFunction,
+ isStream,
+ isURLSearchParams,
+ isTypedArray,
+ isFileList,
+ forEach,
+ merge,
+ extend,
+ trim,
+ stripBOM,
+ inherits,
+ toFlatObject,
+ kindOf,
+ kindOfTest,
+ endsWith,
+ toArray,
+ forEachEntry,
+ matchAll,
+ isHTMLForm,
+ hasOwnProperty,
+ hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection
+ reduceDescriptors,
+ freezeMethods,
+ toObjectSet,
+ toCamelCase,
+ noop,
+ toFiniteNumber,
+ findKey,
+ global: _global,
+ isContextDefined,
+ isSpecCompliantForm,
+ toJSONObject,
+ isAsyncFn,
+ isThenable,
+ setImmediate: _setImmediate,
+ asap
+};
+
+/**
+ * Create an Error with the specified message, config, error code, request and response.
+ *
+ * @param {string} message The error message.
+ * @param {string} [code] The error code (for example, 'ECONNABORTED').
+ * @param {Object} [config] The config.
+ * @param {Object} [request] The request.
+ * @param {Object} [response] The response.
+ *
+ * @returns {Error} The created error.
+ */
+function AxiosError(message, code, config, request, response) {
+ Error.call(this);
+
+ if (Error.captureStackTrace) {
+ Error.captureStackTrace(this, this.constructor);
+ } else {
+ this.stack = (new Error()).stack;
+ }
+
+ this.message = message;
+ this.name = 'AxiosError';
+ code && (this.code = code);
+ config && (this.config = config);
+ request && (this.request = request);
+ if (response) {
+ this.response = response;
+ this.status = response.status ? response.status : null;
+ }
+}
+
+utils$1.inherits(AxiosError, Error, {
+ toJSON: function toJSON() {
+ return {
+ // Standard
+ message: this.message,
+ name: this.name,
+ // Microsoft
+ description: this.description,
+ number: this.number,
+ // Mozilla
+ fileName: this.fileName,
+ lineNumber: this.lineNumber,
+ columnNumber: this.columnNumber,
+ stack: this.stack,
+ // Axios
+ config: utils$1.toJSONObject(this.config),
+ code: this.code,
+ status: this.status
+ };
+ }
+});
+
+const prototype$1 = AxiosError.prototype;
+const descriptors = {};
+
+[
+ 'ERR_BAD_OPTION_VALUE',
+ 'ERR_BAD_OPTION',
+ 'ECONNABORTED',
+ 'ETIMEDOUT',
+ 'ERR_NETWORK',
+ 'ERR_FR_TOO_MANY_REDIRECTS',
+ 'ERR_DEPRECATED',
+ 'ERR_BAD_RESPONSE',
+ 'ERR_BAD_REQUEST',
+ 'ERR_CANCELED',
+ 'ERR_NOT_SUPPORT',
+ 'ERR_INVALID_URL'
+// eslint-disable-next-line func-names
+].forEach(code => {
+ descriptors[code] = {value: code};
+});
+
+Object.defineProperties(AxiosError, descriptors);
+Object.defineProperty(prototype$1, 'isAxiosError', {value: true});
+
+// eslint-disable-next-line func-names
+AxiosError.from = (error, code, config, request, response, customProps) => {
+ const axiosError = Object.create(prototype$1);
+
+ utils$1.toFlatObject(error, axiosError, function filter(obj) {
+ return obj !== Error.prototype;
+ }, prop => {
+ return prop !== 'isAxiosError';
+ });
+
+ AxiosError.call(axiosError, error.message, code, config, request, response);
+
+ axiosError.cause = error;
+
+ axiosError.name = error.name;
+
+ customProps && Object.assign(axiosError, customProps);
+
+ return axiosError;
+};
+
+/**
+ * Determines if the given thing is a array or js object.
+ *
+ * @param {string} thing - The object or array to be visited.
+ *
+ * @returns {boolean}
+ */
+function isVisitable(thing) {
+ return utils$1.isPlainObject(thing) || utils$1.isArray(thing);
+}
+
+/**
+ * It removes the brackets from the end of a string
+ *
+ * @param {string} key - The key of the parameter.
+ *
+ * @returns {string} the key without the brackets.
+ */
+function removeBrackets(key) {
+ return utils$1.endsWith(key, '[]') ? key.slice(0, -2) : key;
+}
+
+/**
+ * It takes a path, a key, and a boolean, and returns a string
+ *
+ * @param {string} path - The path to the current key.
+ * @param {string} key - The key of the current object being iterated over.
+ * @param {string} dots - If true, the key will be rendered with dots instead of brackets.
+ *
+ * @returns {string} The path to the current key.
+ */
+function renderKey(path, key, dots) {
+ if (!path) return key;
+ return path.concat(key).map(function each(token, i) {
+ // eslint-disable-next-line no-param-reassign
+ token = removeBrackets(token);
+ return !dots && i ? '[' + token + ']' : token;
+ }).join(dots ? '.' : '');
+}
+
+/**
+ * If the array is an array and none of its elements are visitable, then it's a flat array.
+ *
+ * @param {Array} arr - The array to check
+ *
+ * @returns {boolean}
+ */
+function isFlatArray(arr) {
+ return utils$1.isArray(arr) && !arr.some(isVisitable);
+}
+
+const predicates = utils$1.toFlatObject(utils$1, {}, null, function filter(prop) {
+ return /^is[A-Z]/.test(prop);
+});
+
+/**
+ * Convert a data object to FormData
+ *
+ * @param {Object} obj
+ * @param {?Object} [formData]
+ * @param {?Object} [options]
+ * @param {Function} [options.visitor]
+ * @param {Boolean} [options.metaTokens = true]
+ * @param {Boolean} [options.dots = false]
+ * @param {?Boolean} [options.indexes = false]
+ *
+ * @returns {Object}
+ **/
+
+/**
+ * It converts an object into a FormData object
+ *
+ * @param {Object} obj - The object to convert to form data.
+ * @param {string} formData - The FormData object to append to.
+ * @param {Object} options
+ *
+ * @returns
+ */
+function toFormData(obj, formData, options) {
+ if (!utils$1.isObject(obj)) {
+ throw new TypeError('target must be an object');
+ }
+
+ // eslint-disable-next-line no-param-reassign
+ formData = formData || new (FormData__default["default"] || FormData)();
+
+ // eslint-disable-next-line no-param-reassign
+ options = utils$1.toFlatObject(options, {
+ metaTokens: true,
+ dots: false,
+ indexes: false
+ }, false, function defined(option, source) {
+ // eslint-disable-next-line no-eq-null,eqeqeq
+ return !utils$1.isUndefined(source[option]);
+ });
+
+ const metaTokens = options.metaTokens;
+ // eslint-disable-next-line no-use-before-define
+ const visitor = options.visitor || defaultVisitor;
+ const dots = options.dots;
+ const indexes = options.indexes;
+ const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;
+ const useBlob = _Blob && utils$1.isSpecCompliantForm(formData);
+
+ if (!utils$1.isFunction(visitor)) {
+ throw new TypeError('visitor must be a function');
+ }
+
+ function convertValue(value) {
+ if (value === null) return '';
+
+ if (utils$1.isDate(value)) {
+ return value.toISOString();
+ }
+
+ if (!useBlob && utils$1.isBlob(value)) {
+ throw new AxiosError('Blob is not supported. Use a Buffer instead.');
+ }
+
+ if (utils$1.isArrayBuffer(value) || utils$1.isTypedArray(value)) {
+ return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);
+ }
+
+ return value;
+ }
+
+ /**
+ * Default visitor.
+ *
+ * @param {*} value
+ * @param {String|Number} key
+ * @param {Array} path
+ * @this {FormData}
+ *
+ * @returns {boolean} return true to visit the each prop of the value recursively
+ */
+ function defaultVisitor(value, key, path) {
+ let arr = value;
+
+ if (value && !path && typeof value === 'object') {
+ if (utils$1.endsWith(key, '{}')) {
+ // eslint-disable-next-line no-param-reassign
+ key = metaTokens ? key : key.slice(0, -2);
+ // eslint-disable-next-line no-param-reassign
+ value = JSON.stringify(value);
+ } else if (
+ (utils$1.isArray(value) && isFlatArray(value)) ||
+ ((utils$1.isFileList(value) || utils$1.endsWith(key, '[]')) && (arr = utils$1.toArray(value))
+ )) {
+ // eslint-disable-next-line no-param-reassign
+ key = removeBrackets(key);
+
+ arr.forEach(function each(el, index) {
+ !(utils$1.isUndefined(el) || el === null) && formData.append(
+ // eslint-disable-next-line no-nested-ternary
+ indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'),
+ convertValue(el)
+ );
+ });
+ return false;
+ }
+ }
+
+ if (isVisitable(value)) {
+ return true;
+ }
+
+ formData.append(renderKey(path, key, dots), convertValue(value));
+
+ return false;
+ }
+
+ const stack = [];
+
+ const exposedHelpers = Object.assign(predicates, {
+ defaultVisitor,
+ convertValue,
+ isVisitable
+ });
+
+ function build(value, path) {
+ if (utils$1.isUndefined(value)) return;
+
+ if (stack.indexOf(value) !== -1) {
+ throw Error('Circular reference detected in ' + path.join('.'));
+ }
+
+ stack.push(value);
+
+ utils$1.forEach(value, function each(el, key) {
+ const result = !(utils$1.isUndefined(el) || el === null) && visitor.call(
+ formData, el, utils$1.isString(key) ? key.trim() : key, path, exposedHelpers
+ );
+
+ if (result === true) {
+ build(el, path ? path.concat(key) : [key]);
+ }
+ });
+
+ stack.pop();
+ }
+
+ if (!utils$1.isObject(obj)) {
+ throw new TypeError('data must be an object');
+ }
+
+ build(obj);
+
+ return formData;
+}
+
+/**
+ * It encodes a string by replacing all characters that are not in the unreserved set with
+ * their percent-encoded equivalents
+ *
+ * @param {string} str - The string to encode.
+ *
+ * @returns {string} The encoded string.
+ */
+function encode$1(str) {
+ const charMap = {
+ '!': '%21',
+ "'": '%27',
+ '(': '%28',
+ ')': '%29',
+ '~': '%7E',
+ '%20': '+',
+ '%00': '\x00'
+ };
+ return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {
+ return charMap[match];
+ });
+}
+
+/**
+ * It takes a params object and converts it to a FormData object
+ *
+ * @param {Object} params - The parameters to be converted to a FormData object.
+ * @param {Object} options - The options object passed to the Axios constructor.
+ *
+ * @returns {void}
+ */
+function AxiosURLSearchParams(params, options) {
+ this._pairs = [];
+
+ params && toFormData(params, this, options);
+}
+
+const prototype = AxiosURLSearchParams.prototype;
+
+prototype.append = function append(name, value) {
+ this._pairs.push([name, value]);
+};
+
+prototype.toString = function toString(encoder) {
+ const _encode = encoder ? function(value) {
+ return encoder.call(this, value, encode$1);
+ } : encode$1;
+
+ return this._pairs.map(function each(pair) {
+ return _encode(pair[0]) + '=' + _encode(pair[1]);
+ }, '').join('&');
+};
+
+/**
+ * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their
+ * URI encoded counterparts
+ *
+ * @param {string} val The value to be encoded.
+ *
+ * @returns {string} The encoded value.
+ */
+function encode(val) {
+ return encodeURIComponent(val).
+ replace(/%3A/gi, ':').
+ replace(/%24/g, '$').
+ replace(/%2C/gi, ',').
+ replace(/%20/g, '+').
+ replace(/%5B/gi, '[').
+ replace(/%5D/gi, ']');
+}
+
+/**
+ * Build a URL by appending params to the end
+ *
+ * @param {string} url The base of the url (e.g., http://www.google.com)
+ * @param {object} [params] The params to be appended
+ * @param {?(object|Function)} options
+ *
+ * @returns {string} The formatted url
+ */
+function buildURL(url, params, options) {
+ /*eslint no-param-reassign:0*/
+ if (!params) {
+ return url;
+ }
+
+ const _encode = options && options.encode || encode;
+
+ if (utils$1.isFunction(options)) {
+ options = {
+ serialize: options
+ };
+ }
+
+ const serializeFn = options && options.serialize;
+
+ let serializedParams;
+
+ if (serializeFn) {
+ serializedParams = serializeFn(params, options);
+ } else {
+ serializedParams = utils$1.isURLSearchParams(params) ?
+ params.toString() :
+ new AxiosURLSearchParams(params, options).toString(_encode);
+ }
+
+ if (serializedParams) {
+ const hashmarkIndex = url.indexOf("#");
+
+ if (hashmarkIndex !== -1) {
+ url = url.slice(0, hashmarkIndex);
+ }
+ url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;
+ }
+
+ return url;
+}
+
+class InterceptorManager {
+ constructor() {
+ this.handlers = [];
+ }
+
+ /**
+ * Add a new interceptor to the stack
+ *
+ * @param {Function} fulfilled The function to handle `then` for a `Promise`
+ * @param {Function} rejected The function to handle `reject` for a `Promise`
+ *
+ * @return {Number} An ID used to remove interceptor later
+ */
+ use(fulfilled, rejected, options) {
+ this.handlers.push({
+ fulfilled,
+ rejected,
+ synchronous: options ? options.synchronous : false,
+ runWhen: options ? options.runWhen : null
+ });
+ return this.handlers.length - 1;
+ }
+
+ /**
+ * Remove an interceptor from the stack
+ *
+ * @param {Number} id The ID that was returned by `use`
+ *
+ * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise
+ */
+ eject(id) {
+ if (this.handlers[id]) {
+ this.handlers[id] = null;
+ }
+ }
+
+ /**
+ * Clear all interceptors from the stack
+ *
+ * @returns {void}
+ */
+ clear() {
+ if (this.handlers) {
+ this.handlers = [];
+ }
+ }
+
+ /**
+ * Iterate over all the registered interceptors
+ *
+ * This method is particularly useful for skipping over any
+ * interceptors that may have become `null` calling `eject`.
+ *
+ * @param {Function} fn The function to call for each interceptor
+ *
+ * @returns {void}
+ */
+ forEach(fn) {
+ utils$1.forEach(this.handlers, function forEachHandler(h) {
+ if (h !== null) {
+ fn(h);
+ }
+ });
+ }
+}
+
+const InterceptorManager$1 = InterceptorManager;
+
+const transitionalDefaults = {
+ silentJSONParsing: true,
+ forcedJSONParsing: true,
+ clarifyTimeoutError: false
+};
+
+const URLSearchParams = url__default["default"].URLSearchParams;
+
+const ALPHA = 'abcdefghijklmnopqrstuvwxyz';
+
+const DIGIT = '0123456789';
+
+const ALPHABET = {
+ DIGIT,
+ ALPHA,
+ ALPHA_DIGIT: ALPHA + ALPHA.toUpperCase() + DIGIT
+};
+
+const generateString = (size = 16, alphabet = ALPHABET.ALPHA_DIGIT) => {
+ let str = '';
+ const {length} = alphabet;
+ const randomValues = new Uint32Array(size);
+ crypto__default["default"].randomFillSync(randomValues);
+ for (let i = 0; i < size; i++) {
+ str += alphabet[randomValues[i] % length];
+ }
+
+ return str;
+};
+
+
+const platform$1 = {
+ isNode: true,
+ classes: {
+ URLSearchParams,
+ FormData: FormData__default["default"],
+ Blob: typeof Blob !== 'undefined' && Blob || null
+ },
+ ALPHABET,
+ generateString,
+ protocols: [ 'http', 'https', 'file', 'data' ]
+};
+
+const hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined';
+
+const _navigator = typeof navigator === 'object' && navigator || undefined;
+
+/**
+ * Determine if we're running in a standard browser environment
+ *
+ * This allows axios to run in a web worker, and react-native.
+ * Both environments support XMLHttpRequest, but not fully standard globals.
+ *
+ * web workers:
+ * typeof window -> undefined
+ * typeof document -> undefined
+ *
+ * react-native:
+ * navigator.product -> 'ReactNative'
+ * nativescript
+ * navigator.product -> 'NativeScript' or 'NS'
+ *
+ * @returns {boolean}
+ */
+const hasStandardBrowserEnv = hasBrowserEnv &&
+ (!_navigator || ['ReactNative', 'NativeScript', 'NS'].indexOf(_navigator.product) < 0);
+
+/**
+ * Determine if we're running in a standard browser webWorker environment
+ *
+ * Although the `isStandardBrowserEnv` method indicates that
+ * `allows axios to run in a web worker`, the WebWorker will still be
+ * filtered out due to its judgment standard
+ * `typeof window !== 'undefined' && typeof document !== 'undefined'`.
+ * This leads to a problem when axios post `FormData` in webWorker
+ */
+const hasStandardBrowserWebWorkerEnv = (() => {
+ return (
+ typeof WorkerGlobalScope !== 'undefined' &&
+ // eslint-disable-next-line no-undef
+ self instanceof WorkerGlobalScope &&
+ typeof self.importScripts === 'function'
+ );
+})();
+
+const origin = hasBrowserEnv && window.location.href || 'http://localhost';
+
+const utils = /*#__PURE__*/Object.freeze({
+ __proto__: null,
+ hasBrowserEnv: hasBrowserEnv,
+ hasStandardBrowserWebWorkerEnv: hasStandardBrowserWebWorkerEnv,
+ hasStandardBrowserEnv: hasStandardBrowserEnv,
+ navigator: _navigator,
+ origin: origin
+});
+
+const platform = {
+ ...utils,
+ ...platform$1
+};
+
+function toURLEncodedForm(data, options) {
+ return toFormData(data, new platform.classes.URLSearchParams(), Object.assign({
+ visitor: function(value, key, path, helpers) {
+ if (platform.isNode && utils$1.isBuffer(value)) {
+ this.append(key, value.toString('base64'));
+ return false;
+ }
+
+ return helpers.defaultVisitor.apply(this, arguments);
+ }
+ }, options));
+}
+
+/**
+ * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']
+ *
+ * @param {string} name - The name of the property to get.
+ *
+ * @returns An array of strings.
+ */
+function parsePropPath(name) {
+ // foo[x][y][z]
+ // foo.x.y.z
+ // foo-x-y-z
+ // foo x y z
+ return utils$1.matchAll(/\w+|\[(\w*)]/g, name).map(match => {
+ return match[0] === '[]' ? '' : match[1] || match[0];
+ });
+}
+
+/**
+ * Convert an array to an object.
+ *
+ * @param {Array} arr - The array to convert to an object.
+ *
+ * @returns An object with the same keys and values as the array.
+ */
+function arrayToObject(arr) {
+ const obj = {};
+ const keys = Object.keys(arr);
+ let i;
+ const len = keys.length;
+ let key;
+ for (i = 0; i < len; i++) {
+ key = keys[i];
+ obj[key] = arr[key];
+ }
+ return obj;
+}
+
+/**
+ * It takes a FormData object and returns a JavaScript object
+ *
+ * @param {string} formData The FormData object to convert to JSON.
+ *
+ * @returns {Object | null} The converted object.
+ */
+function formDataToJSON(formData) {
+ function buildPath(path, value, target, index) {
+ let name = path[index++];
+
+ if (name === '__proto__') return true;
+
+ const isNumericKey = Number.isFinite(+name);
+ const isLast = index >= path.length;
+ name = !name && utils$1.isArray(target) ? target.length : name;
+
+ if (isLast) {
+ if (utils$1.hasOwnProp(target, name)) {
+ target[name] = [target[name], value];
+ } else {
+ target[name] = value;
+ }
+
+ return !isNumericKey;
+ }
+
+ if (!target[name] || !utils$1.isObject(target[name])) {
+ target[name] = [];
+ }
+
+ const result = buildPath(path, value, target[name], index);
+
+ if (result && utils$1.isArray(target[name])) {
+ target[name] = arrayToObject(target[name]);
+ }
+
+ return !isNumericKey;
+ }
+
+ if (utils$1.isFormData(formData) && utils$1.isFunction(formData.entries)) {
+ const obj = {};
+
+ utils$1.forEachEntry(formData, (name, value) => {
+ buildPath(parsePropPath(name), value, obj, 0);
+ });
+
+ return obj;
+ }
+
+ return null;
+}
+
+/**
+ * It takes a string, tries to parse it, and if it fails, it returns the stringified version
+ * of the input
+ *
+ * @param {any} rawValue - The value to be stringified.
+ * @param {Function} parser - A function that parses a string into a JavaScript object.
+ * @param {Function} encoder - A function that takes a value and returns a string.
+ *
+ * @returns {string} A stringified version of the rawValue.
+ */
+function stringifySafely(rawValue, parser, encoder) {
+ if (utils$1.isString(rawValue)) {
+ try {
+ (parser || JSON.parse)(rawValue);
+ return utils$1.trim(rawValue);
+ } catch (e) {
+ if (e.name !== 'SyntaxError') {
+ throw e;
+ }
+ }
+ }
+
+ return (encoder || JSON.stringify)(rawValue);
+}
+
+const defaults = {
+
+ transitional: transitionalDefaults,
+
+ adapter: ['xhr', 'http', 'fetch'],
+
+ transformRequest: [function transformRequest(data, headers) {
+ const contentType = headers.getContentType() || '';
+ const hasJSONContentType = contentType.indexOf('application/json') > -1;
+ const isObjectPayload = utils$1.isObject(data);
+
+ if (isObjectPayload && utils$1.isHTMLForm(data)) {
+ data = new FormData(data);
+ }
+
+ const isFormData = utils$1.isFormData(data);
+
+ if (isFormData) {
+ return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;
+ }
+
+ if (utils$1.isArrayBuffer(data) ||
+ utils$1.isBuffer(data) ||
+ utils$1.isStream(data) ||
+ utils$1.isFile(data) ||
+ utils$1.isBlob(data) ||
+ utils$1.isReadableStream(data)
+ ) {
+ return data;
+ }
+ if (utils$1.isArrayBufferView(data)) {
+ return data.buffer;
+ }
+ if (utils$1.isURLSearchParams(data)) {
+ headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);
+ return data.toString();
+ }
+
+ let isFileList;
+
+ if (isObjectPayload) {
+ if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {
+ return toURLEncodedForm(data, this.formSerializer).toString();
+ }
+
+ if ((isFileList = utils$1.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {
+ const _FormData = this.env && this.env.FormData;
+
+ return toFormData(
+ isFileList ? {'files[]': data} : data,
+ _FormData && new _FormData(),
+ this.formSerializer
+ );
+ }
+ }
+
+ if (isObjectPayload || hasJSONContentType ) {
+ headers.setContentType('application/json', false);
+ return stringifySafely(data);
+ }
+
+ return data;
+ }],
+
+ transformResponse: [function transformResponse(data) {
+ const transitional = this.transitional || defaults.transitional;
+ const forcedJSONParsing = transitional && transitional.forcedJSONParsing;
+ const JSONRequested = this.responseType === 'json';
+
+ if (utils$1.isResponse(data) || utils$1.isReadableStream(data)) {
+ return data;
+ }
+
+ if (data && utils$1.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {
+ const silentJSONParsing = transitional && transitional.silentJSONParsing;
+ const strictJSONParsing = !silentJSONParsing && JSONRequested;
+
+ try {
+ return JSON.parse(data);
+ } catch (e) {
+ if (strictJSONParsing) {
+ if (e.name === 'SyntaxError') {
+ throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);
+ }
+ throw e;
+ }
+ }
+ }
+
+ return data;
+ }],
+
+ /**
+ * A timeout in milliseconds to abort a request. If set to 0 (default) a
+ * timeout is not created.
+ */
+ timeout: 0,
+
+ xsrfCookieName: 'XSRF-TOKEN',
+ xsrfHeaderName: 'X-XSRF-TOKEN',
+
+ maxContentLength: -1,
+ maxBodyLength: -1,
+
+ env: {
+ FormData: platform.classes.FormData,
+ Blob: platform.classes.Blob
+ },
+
+ validateStatus: function validateStatus(status) {
+ return status >= 200 && status < 300;
+ },
+
+ headers: {
+ common: {
+ 'Accept': 'application/json, text/plain, */*',
+ 'Content-Type': undefined
+ }
+ }
+};
+
+utils$1.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], (method) => {
+ defaults.headers[method] = {};
+});
+
+const defaults$1 = defaults;
+
+// RawAxiosHeaders whose duplicates are ignored by node
+// c.f. https://nodejs.org/api/http.html#http_message_headers
+const ignoreDuplicateOf = utils$1.toObjectSet([
+ 'age', 'authorization', 'content-length', 'content-type', 'etag',
+ 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',
+ 'last-modified', 'location', 'max-forwards', 'proxy-authorization',
+ 'referer', 'retry-after', 'user-agent'
+]);
+
+/**
+ * Parse headers into an object
+ *
+ * ```
+ * Date: Wed, 27 Aug 2014 08:58:49 GMT
+ * Content-Type: application/json
+ * Connection: keep-alive
+ * Transfer-Encoding: chunked
+ * ```
+ *
+ * @param {String} rawHeaders Headers needing to be parsed
+ *
+ * @returns {Object} Headers parsed into an object
+ */
+const parseHeaders = rawHeaders => {
+ const parsed = {};
+ let key;
+ let val;
+ let i;
+
+ rawHeaders && rawHeaders.split('\n').forEach(function parser(line) {
+ i = line.indexOf(':');
+ key = line.substring(0, i).trim().toLowerCase();
+ val = line.substring(i + 1).trim();
+
+ if (!key || (parsed[key] && ignoreDuplicateOf[key])) {
+ return;
+ }
+
+ if (key === 'set-cookie') {
+ if (parsed[key]) {
+ parsed[key].push(val);
+ } else {
+ parsed[key] = [val];
+ }
+ } else {
+ parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;
+ }
+ });
+
+ return parsed;
+};
+
+const $internals = Symbol('internals');
+
+function normalizeHeader(header) {
+ return header && String(header).trim().toLowerCase();
+}
+
+function normalizeValue(value) {
+ if (value === false || value == null) {
+ return value;
+ }
+
+ return utils$1.isArray(value) ? value.map(normalizeValue) : String(value);
+}
+
+function parseTokens(str) {
+ const tokens = Object.create(null);
+ const tokensRE = /([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;
+ let match;
+
+ while ((match = tokensRE.exec(str))) {
+ tokens[match[1]] = match[2];
+ }
+
+ return tokens;
+}
+
+const isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim());
+
+function matchHeaderValue(context, value, header, filter, isHeaderNameFilter) {
+ if (utils$1.isFunction(filter)) {
+ return filter.call(this, value, header);
+ }
+
+ if (isHeaderNameFilter) {
+ value = header;
+ }
+
+ if (!utils$1.isString(value)) return;
+
+ if (utils$1.isString(filter)) {
+ return value.indexOf(filter) !== -1;
+ }
+
+ if (utils$1.isRegExp(filter)) {
+ return filter.test(value);
+ }
+}
+
+function formatHeader(header) {
+ return header.trim()
+ .toLowerCase().replace(/([a-z\d])(\w*)/g, (w, char, str) => {
+ return char.toUpperCase() + str;
+ });
+}
+
+function buildAccessors(obj, header) {
+ const accessorName = utils$1.toCamelCase(' ' + header);
+
+ ['get', 'set', 'has'].forEach(methodName => {
+ Object.defineProperty(obj, methodName + accessorName, {
+ value: function(arg1, arg2, arg3) {
+ return this[methodName].call(this, header, arg1, arg2, arg3);
+ },
+ configurable: true
+ });
+ });
+}
+
+class AxiosHeaders {
+ constructor(headers) {
+ headers && this.set(headers);
+ }
+
+ set(header, valueOrRewrite, rewrite) {
+ const self = this;
+
+ function setHeader(_value, _header, _rewrite) {
+ const lHeader = normalizeHeader(_header);
+
+ if (!lHeader) {
+ throw new Error('header name must be a non-empty string');
+ }
+
+ const key = utils$1.findKey(self, lHeader);
+
+ if(!key || self[key] === undefined || _rewrite === true || (_rewrite === undefined && self[key] !== false)) {
+ self[key || _header] = normalizeValue(_value);
+ }
+ }
+
+ const setHeaders = (headers, _rewrite) =>
+ utils$1.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));
+
+ if (utils$1.isPlainObject(header) || header instanceof this.constructor) {
+ setHeaders(header, valueOrRewrite);
+ } else if(utils$1.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {
+ setHeaders(parseHeaders(header), valueOrRewrite);
+ } else if (utils$1.isHeaders(header)) {
+ for (const [key, value] of header.entries()) {
+ setHeader(value, key, rewrite);
+ }
+ } else {
+ header != null && setHeader(valueOrRewrite, header, rewrite);
+ }
+
+ return this;
+ }
+
+ get(header, parser) {
+ header = normalizeHeader(header);
+
+ if (header) {
+ const key = utils$1.findKey(this, header);
+
+ if (key) {
+ const value = this[key];
+
+ if (!parser) {
+ return value;
+ }
+
+ if (parser === true) {
+ return parseTokens(value);
+ }
+
+ if (utils$1.isFunction(parser)) {
+ return parser.call(this, value, key);
+ }
+
+ if (utils$1.isRegExp(parser)) {
+ return parser.exec(value);
+ }
+
+ throw new TypeError('parser must be boolean|regexp|function');
+ }
+ }
+ }
+
+ has(header, matcher) {
+ header = normalizeHeader(header);
+
+ if (header) {
+ const key = utils$1.findKey(this, header);
+
+ return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher)));
+ }
+
+ return false;
+ }
+
+ delete(header, matcher) {
+ const self = this;
+ let deleted = false;
+
+ function deleteHeader(_header) {
+ _header = normalizeHeader(_header);
+
+ if (_header) {
+ const key = utils$1.findKey(self, _header);
+
+ if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {
+ delete self[key];
+
+ deleted = true;
+ }
+ }
+ }
+
+ if (utils$1.isArray(header)) {
+ header.forEach(deleteHeader);
+ } else {
+ deleteHeader(header);
+ }
+
+ return deleted;
+ }
+
+ clear(matcher) {
+ const keys = Object.keys(this);
+ let i = keys.length;
+ let deleted = false;
+
+ while (i--) {
+ const key = keys[i];
+ if(!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {
+ delete this[key];
+ deleted = true;
+ }
+ }
+
+ return deleted;
+ }
+
+ normalize(format) {
+ const self = this;
+ const headers = {};
+
+ utils$1.forEach(this, (value, header) => {
+ const key = utils$1.findKey(headers, header);
+
+ if (key) {
+ self[key] = normalizeValue(value);
+ delete self[header];
+ return;
+ }
+
+ const normalized = format ? formatHeader(header) : String(header).trim();
+
+ if (normalized !== header) {
+ delete self[header];
+ }
+
+ self[normalized] = normalizeValue(value);
+
+ headers[normalized] = true;
+ });
+
+ return this;
+ }
+
+ concat(...targets) {
+ return this.constructor.concat(this, ...targets);
+ }
+
+ toJSON(asStrings) {
+ const obj = Object.create(null);
+
+ utils$1.forEach(this, (value, header) => {
+ value != null && value !== false && (obj[header] = asStrings && utils$1.isArray(value) ? value.join(', ') : value);
+ });
+
+ return obj;
+ }
+
+ [Symbol.iterator]() {
+ return Object.entries(this.toJSON())[Symbol.iterator]();
+ }
+
+ toString() {
+ return Object.entries(this.toJSON()).map(([header, value]) => header + ': ' + value).join('\n');
+ }
+
+ get [Symbol.toStringTag]() {
+ return 'AxiosHeaders';
+ }
+
+ static from(thing) {
+ return thing instanceof this ? thing : new this(thing);
+ }
+
+ static concat(first, ...targets) {
+ const computed = new this(first);
+
+ targets.forEach((target) => computed.set(target));
+
+ return computed;
+ }
+
+ static accessor(header) {
+ const internals = this[$internals] = (this[$internals] = {
+ accessors: {}
+ });
+
+ const accessors = internals.accessors;
+ const prototype = this.prototype;
+
+ function defineAccessor(_header) {
+ const lHeader = normalizeHeader(_header);
+
+ if (!accessors[lHeader]) {
+ buildAccessors(prototype, _header);
+ accessors[lHeader] = true;
+ }
+ }
+
+ utils$1.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);
+
+ return this;
+ }
+}
+
+AxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']);
+
+// reserved names hotfix
+utils$1.reduceDescriptors(AxiosHeaders.prototype, ({value}, key) => {
+ let mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set`
+ return {
+ get: () => value,
+ set(headerValue) {
+ this[mapped] = headerValue;
+ }
+ }
+});
+
+utils$1.freezeMethods(AxiosHeaders);
+
+const AxiosHeaders$1 = AxiosHeaders;
+
+/**
+ * Transform the data for a request or a response
+ *
+ * @param {Array|Function} fns A single function or Array of functions
+ * @param {?Object} response The response object
+ *
+ * @returns {*} The resulting transformed data
+ */
+function transformData(fns, response) {
+ const config = this || defaults$1;
+ const context = response || config;
+ const headers = AxiosHeaders$1.from(context.headers);
+ let data = context.data;
+
+ utils$1.forEach(fns, function transform(fn) {
+ data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);
+ });
+
+ headers.normalize();
+
+ return data;
+}
+
+function isCancel(value) {
+ return !!(value && value.__CANCEL__);
+}
+
+/**
+ * A `CanceledError` is an object that is thrown when an operation is canceled.
+ *
+ * @param {string=} message The message.
+ * @param {Object=} config The config.
+ * @param {Object=} request The request.
+ *
+ * @returns {CanceledError} The created error.
+ */
+function CanceledError(message, config, request) {
+ // eslint-disable-next-line no-eq-null,eqeqeq
+ AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);
+ this.name = 'CanceledError';
+}
+
+utils$1.inherits(CanceledError, AxiosError, {
+ __CANCEL__: true
+});
+
+/**
+ * Resolve or reject a Promise based on response status.
+ *
+ * @param {Function} resolve A function that resolves the promise.
+ * @param {Function} reject A function that rejects the promise.
+ * @param {object} response The response.
+ *
+ * @returns {object} The response.
+ */
+function settle(resolve, reject, response) {
+ const validateStatus = response.config.validateStatus;
+ if (!response.status || !validateStatus || validateStatus(response.status)) {
+ resolve(response);
+ } else {
+ reject(new AxiosError(
+ 'Request failed with status code ' + response.status,
+ [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],
+ response.config,
+ response.request,
+ response
+ ));
+ }
+}
+
+/**
+ * Determines whether the specified URL is absolute
+ *
+ * @param {string} url The URL to test
+ *
+ * @returns {boolean} True if the specified URL is absolute, otherwise false
+ */
+function isAbsoluteURL(url) {
+ // A URL is considered absolute if it begins with "://" or "//" (protocol-relative URL).
+ // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed
+ // by any combination of letters, digits, plus, period, or hyphen.
+ return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url);
+}
+
+/**
+ * Creates a new URL by combining the specified URLs
+ *
+ * @param {string} baseURL The base URL
+ * @param {string} relativeURL The relative URL
+ *
+ * @returns {string} The combined URL
+ */
+function combineURLs(baseURL, relativeURL) {
+ return relativeURL
+ ? baseURL.replace(/\/?\/$/, '') + '/' + relativeURL.replace(/^\/+/, '')
+ : baseURL;
+}
+
+/**
+ * Creates a new URL by combining the baseURL with the requestedURL,
+ * only when the requestedURL is not already an absolute URL.
+ * If the requestURL is absolute, this function returns the requestedURL untouched.
+ *
+ * @param {string} baseURL The base URL
+ * @param {string} requestedURL Absolute or relative URL to combine
+ *
+ * @returns {string} The combined full path
+ */
+function buildFullPath(baseURL, requestedURL, allowAbsoluteUrls) {
+ let isRelativeUrl = !isAbsoluteURL(requestedURL);
+ if (baseURL && (isRelativeUrl || allowAbsoluteUrls == false)) {
+ return combineURLs(baseURL, requestedURL);
+ }
+ return requestedURL;
+}
+
+const VERSION = "1.8.4";
+
+function parseProtocol(url) {
+ const match = /^([-+\w]{1,25})(:?\/\/|:)/.exec(url);
+ return match && match[1] || '';
+}
+
+const DATA_URL_PATTERN = /^(?:([^;]+);)?(?:[^;]+;)?(base64|),([\s\S]*)$/;
+
+/**
+ * Parse data uri to a Buffer or Blob
+ *
+ * @param {String} uri
+ * @param {?Boolean} asBlob
+ * @param {?Object} options
+ * @param {?Function} options.Blob
+ *
+ * @returns {Buffer|Blob}
+ */
+function fromDataURI(uri, asBlob, options) {
+ const _Blob = options && options.Blob || platform.classes.Blob;
+ const protocol = parseProtocol(uri);
+
+ if (asBlob === undefined && _Blob) {
+ asBlob = true;
+ }
+
+ if (protocol === 'data') {
+ uri = protocol.length ? uri.slice(protocol.length + 1) : uri;
+
+ const match = DATA_URL_PATTERN.exec(uri);
+
+ if (!match) {
+ throw new AxiosError('Invalid URL', AxiosError.ERR_INVALID_URL);
+ }
+
+ const mime = match[1];
+ const isBase64 = match[2];
+ const body = match[3];
+ const buffer = Buffer.from(decodeURIComponent(body), isBase64 ? 'base64' : 'utf8');
+
+ if (asBlob) {
+ if (!_Blob) {
+ throw new AxiosError('Blob is not supported', AxiosError.ERR_NOT_SUPPORT);
+ }
+
+ return new _Blob([buffer], {type: mime});
+ }
+
+ return buffer;
+ }
+
+ throw new AxiosError('Unsupported protocol ' + protocol, AxiosError.ERR_NOT_SUPPORT);
+}
+
+const kInternals = Symbol('internals');
+
+class AxiosTransformStream extends stream__default["default"].Transform{
+ constructor(options) {
+ options = utils$1.toFlatObject(options, {
+ maxRate: 0,
+ chunkSize: 64 * 1024,
+ minChunkSize: 100,
+ timeWindow: 500,
+ ticksRate: 2,
+ samplesCount: 15
+ }, null, (prop, source) => {
+ return !utils$1.isUndefined(source[prop]);
+ });
+
+ super({
+ readableHighWaterMark: options.chunkSize
+ });
+
+ const internals = this[kInternals] = {
+ timeWindow: options.timeWindow,
+ chunkSize: options.chunkSize,
+ maxRate: options.maxRate,
+ minChunkSize: options.minChunkSize,
+ bytesSeen: 0,
+ isCaptured: false,
+ notifiedBytesLoaded: 0,
+ ts: Date.now(),
+ bytes: 0,
+ onReadCallback: null
+ };
+
+ this.on('newListener', event => {
+ if (event === 'progress') {
+ if (!internals.isCaptured) {
+ internals.isCaptured = true;
+ }
+ }
+ });
+ }
+
+ _read(size) {
+ const internals = this[kInternals];
+
+ if (internals.onReadCallback) {
+ internals.onReadCallback();
+ }
+
+ return super._read(size);
+ }
+
+ _transform(chunk, encoding, callback) {
+ const internals = this[kInternals];
+ const maxRate = internals.maxRate;
+
+ const readableHighWaterMark = this.readableHighWaterMark;
+
+ const timeWindow = internals.timeWindow;
+
+ const divider = 1000 / timeWindow;
+ const bytesThreshold = (maxRate / divider);
+ const minChunkSize = internals.minChunkSize !== false ? Math.max(internals.minChunkSize, bytesThreshold * 0.01) : 0;
+
+ const pushChunk = (_chunk, _callback) => {
+ const bytes = Buffer.byteLength(_chunk);
+ internals.bytesSeen += bytes;
+ internals.bytes += bytes;
+
+ internals.isCaptured && this.emit('progress', internals.bytesSeen);
+
+ if (this.push(_chunk)) {
+ process.nextTick(_callback);
+ } else {
+ internals.onReadCallback = () => {
+ internals.onReadCallback = null;
+ process.nextTick(_callback);
+ };
+ }
+ };
+
+ const transformChunk = (_chunk, _callback) => {
+ const chunkSize = Buffer.byteLength(_chunk);
+ let chunkRemainder = null;
+ let maxChunkSize = readableHighWaterMark;
+ let bytesLeft;
+ let passed = 0;
+
+ if (maxRate) {
+ const now = Date.now();
+
+ if (!internals.ts || (passed = (now - internals.ts)) >= timeWindow) {
+ internals.ts = now;
+ bytesLeft = bytesThreshold - internals.bytes;
+ internals.bytes = bytesLeft < 0 ? -bytesLeft : 0;
+ passed = 0;
+ }
+
+ bytesLeft = bytesThreshold - internals.bytes;
+ }
+
+ if (maxRate) {
+ if (bytesLeft <= 0) {
+ // next time window
+ return setTimeout(() => {
+ _callback(null, _chunk);
+ }, timeWindow - passed);
+ }
+
+ if (bytesLeft < maxChunkSize) {
+ maxChunkSize = bytesLeft;
+ }
+ }
+
+ if (maxChunkSize && chunkSize > maxChunkSize && (chunkSize - maxChunkSize) > minChunkSize) {
+ chunkRemainder = _chunk.subarray(maxChunkSize);
+ _chunk = _chunk.subarray(0, maxChunkSize);
+ }
+
+ pushChunk(_chunk, chunkRemainder ? () => {
+ process.nextTick(_callback, null, chunkRemainder);
+ } : _callback);
+ };
+
+ transformChunk(chunk, function transformNextChunk(err, _chunk) {
+ if (err) {
+ return callback(err);
+ }
+
+ if (_chunk) {
+ transformChunk(_chunk, transformNextChunk);
+ } else {
+ callback(null);
+ }
+ });
+ }
+}
+
+const AxiosTransformStream$1 = AxiosTransformStream;
+
+const {asyncIterator} = Symbol;
+
+const readBlob = async function* (blob) {
+ if (blob.stream) {
+ yield* blob.stream();
+ } else if (blob.arrayBuffer) {
+ yield await blob.arrayBuffer();
+ } else if (blob[asyncIterator]) {
+ yield* blob[asyncIterator]();
+ } else {
+ yield blob;
+ }
+};
+
+const readBlob$1 = readBlob;
+
+const BOUNDARY_ALPHABET = platform.ALPHABET.ALPHA_DIGIT + '-_';
+
+const textEncoder = typeof TextEncoder === 'function' ? new TextEncoder() : new util__default["default"].TextEncoder();
+
+const CRLF = '\r\n';
+const CRLF_BYTES = textEncoder.encode(CRLF);
+const CRLF_BYTES_COUNT = 2;
+
+class FormDataPart {
+ constructor(name, value) {
+ const {escapeName} = this.constructor;
+ const isStringValue = utils$1.isString(value);
+
+ let headers = `Content-Disposition: form-data; name="${escapeName(name)}"${
+ !isStringValue && value.name ? `; filename="${escapeName(value.name)}"` : ''
+ }${CRLF}`;
+
+ if (isStringValue) {
+ value = textEncoder.encode(String(value).replace(/\r?\n|\r\n?/g, CRLF));
+ } else {
+ headers += `Content-Type: ${value.type || "application/octet-stream"}${CRLF}`;
+ }
+
+ this.headers = textEncoder.encode(headers + CRLF);
+
+ this.contentLength = isStringValue ? value.byteLength : value.size;
+
+ this.size = this.headers.byteLength + this.contentLength + CRLF_BYTES_COUNT;
+
+ this.name = name;
+ this.value = value;
+ }
+
+ async *encode(){
+ yield this.headers;
+
+ const {value} = this;
+
+ if(utils$1.isTypedArray(value)) {
+ yield value;
+ } else {
+ yield* readBlob$1(value);
+ }
+
+ yield CRLF_BYTES;
+ }
+
+ static escapeName(name) {
+ return String(name).replace(/[\r\n"]/g, (match) => ({
+ '\r' : '%0D',
+ '\n' : '%0A',
+ '"' : '%22',
+ }[match]));
+ }
+}
+
+const formDataToStream = (form, headersHandler, options) => {
+ const {
+ tag = 'form-data-boundary',
+ size = 25,
+ boundary = tag + '-' + platform.generateString(size, BOUNDARY_ALPHABET)
+ } = options || {};
+
+ if(!utils$1.isFormData(form)) {
+ throw TypeError('FormData instance required');
+ }
+
+ if (boundary.length < 1 || boundary.length > 70) {
+ throw Error('boundary must be 10-70 characters long')
+ }
+
+ const boundaryBytes = textEncoder.encode('--' + boundary + CRLF);
+ const footerBytes = textEncoder.encode('--' + boundary + '--' + CRLF + CRLF);
+ let contentLength = footerBytes.byteLength;
+
+ const parts = Array.from(form.entries()).map(([name, value]) => {
+ const part = new FormDataPart(name, value);
+ contentLength += part.size;
+ return part;
+ });
+
+ contentLength += boundaryBytes.byteLength * parts.length;
+
+ contentLength = utils$1.toFiniteNumber(contentLength);
+
+ const computedHeaders = {
+ 'Content-Type': `multipart/form-data; boundary=${boundary}`
+ };
+
+ if (Number.isFinite(contentLength)) {
+ computedHeaders['Content-Length'] = contentLength;
+ }
+
+ headersHandler && headersHandler(computedHeaders);
+
+ return stream.Readable.from((async function *() {
+ for(const part of parts) {
+ yield boundaryBytes;
+ yield* part.encode();
+ }
+
+ yield footerBytes;
+ })());
+};
+
+const formDataToStream$1 = formDataToStream;
+
+class ZlibHeaderTransformStream extends stream__default["default"].Transform {
+ __transform(chunk, encoding, callback) {
+ this.push(chunk);
+ callback();
+ }
+
+ _transform(chunk, encoding, callback) {
+ if (chunk.length !== 0) {
+ this._transform = this.__transform;
+
+ // Add Default Compression headers if no zlib headers are present
+ if (chunk[0] !== 120) { // Hex: 78
+ const header = Buffer.alloc(2);
+ header[0] = 120; // Hex: 78
+ header[1] = 156; // Hex: 9C
+ this.push(header, encoding);
+ }
+ }
+
+ this.__transform(chunk, encoding, callback);
+ }
+}
+
+const ZlibHeaderTransformStream$1 = ZlibHeaderTransformStream;
+
+const callbackify = (fn, reducer) => {
+ return utils$1.isAsyncFn(fn) ? function (...args) {
+ const cb = args.pop();
+ fn.apply(this, args).then((value) => {
+ try {
+ reducer ? cb(null, ...reducer(value)) : cb(null, value);
+ } catch (err) {
+ cb(err);
+ }
+ }, cb);
+ } : fn;
+};
+
+const callbackify$1 = callbackify;
+
+/**
+ * Calculate data maxRate
+ * @param {Number} [samplesCount= 10]
+ * @param {Number} [min= 1000]
+ * @returns {Function}
+ */
+function speedometer(samplesCount, min) {
+ samplesCount = samplesCount || 10;
+ const bytes = new Array(samplesCount);
+ const timestamps = new Array(samplesCount);
+ let head = 0;
+ let tail = 0;
+ let firstSampleTS;
+
+ min = min !== undefined ? min : 1000;
+
+ return function push(chunkLength) {
+ const now = Date.now();
+
+ const startedAt = timestamps[tail];
+
+ if (!firstSampleTS) {
+ firstSampleTS = now;
+ }
+
+ bytes[head] = chunkLength;
+ timestamps[head] = now;
+
+ let i = tail;
+ let bytesCount = 0;
+
+ while (i !== head) {
+ bytesCount += bytes[i++];
+ i = i % samplesCount;
+ }
+
+ head = (head + 1) % samplesCount;
+
+ if (head === tail) {
+ tail = (tail + 1) % samplesCount;
+ }
+
+ if (now - firstSampleTS < min) {
+ return;
+ }
+
+ const passed = startedAt && now - startedAt;
+
+ return passed ? Math.round(bytesCount * 1000 / passed) : undefined;
+ };
+}
+
+/**
+ * Throttle decorator
+ * @param {Function} fn
+ * @param {Number} freq
+ * @return {Function}
+ */
+function throttle(fn, freq) {
+ let timestamp = 0;
+ let threshold = 1000 / freq;
+ let lastArgs;
+ let timer;
+
+ const invoke = (args, now = Date.now()) => {
+ timestamp = now;
+ lastArgs = null;
+ if (timer) {
+ clearTimeout(timer);
+ timer = null;
+ }
+ fn.apply(null, args);
+ };
+
+ const throttled = (...args) => {
+ const now = Date.now();
+ const passed = now - timestamp;
+ if ( passed >= threshold) {
+ invoke(args, now);
+ } else {
+ lastArgs = args;
+ if (!timer) {
+ timer = setTimeout(() => {
+ timer = null;
+ invoke(lastArgs);
+ }, threshold - passed);
+ }
+ }
+ };
+
+ const flush = () => lastArgs && invoke(lastArgs);
+
+ return [throttled, flush];
+}
+
+const progressEventReducer = (listener, isDownloadStream, freq = 3) => {
+ let bytesNotified = 0;
+ const _speedometer = speedometer(50, 250);
+
+ return throttle(e => {
+ const loaded = e.loaded;
+ const total = e.lengthComputable ? e.total : undefined;
+ const progressBytes = loaded - bytesNotified;
+ const rate = _speedometer(progressBytes);
+ const inRange = loaded <= total;
+
+ bytesNotified = loaded;
+
+ const data = {
+ loaded,
+ total,
+ progress: total ? (loaded / total) : undefined,
+ bytes: progressBytes,
+ rate: rate ? rate : undefined,
+ estimated: rate && total && inRange ? (total - loaded) / rate : undefined,
+ event: e,
+ lengthComputable: total != null,
+ [isDownloadStream ? 'download' : 'upload']: true
+ };
+
+ listener(data);
+ }, freq);
+};
+
+const progressEventDecorator = (total, throttled) => {
+ const lengthComputable = total != null;
+
+ return [(loaded) => throttled[0]({
+ lengthComputable,
+ total,
+ loaded
+ }), throttled[1]];
+};
+
+const asyncDecorator = (fn) => (...args) => utils$1.asap(() => fn(...args));
+
+const zlibOptions = {
+ flush: zlib__default["default"].constants.Z_SYNC_FLUSH,
+ finishFlush: zlib__default["default"].constants.Z_SYNC_FLUSH
+};
+
+const brotliOptions = {
+ flush: zlib__default["default"].constants.BROTLI_OPERATION_FLUSH,
+ finishFlush: zlib__default["default"].constants.BROTLI_OPERATION_FLUSH
+};
+
+const isBrotliSupported = utils$1.isFunction(zlib__default["default"].createBrotliDecompress);
+
+const {http: httpFollow, https: httpsFollow} = followRedirects__default["default"];
+
+const isHttps = /https:?/;
+
+const supportedProtocols = platform.protocols.map(protocol => {
+ return protocol + ':';
+});
+
+const flushOnFinish = (stream, [throttled, flush]) => {
+ stream
+ .on('end', flush)
+ .on('error', flush);
+
+ return throttled;
+};
+
+/**
+ * If the proxy or config beforeRedirects functions are defined, call them with the options
+ * object.
+ *
+ * @param {Object} options - The options object that was passed to the request.
+ *
+ * @returns {Object}
+ */
+function dispatchBeforeRedirect(options, responseDetails) {
+ if (options.beforeRedirects.proxy) {
+ options.beforeRedirects.proxy(options);
+ }
+ if (options.beforeRedirects.config) {
+ options.beforeRedirects.config(options, responseDetails);
+ }
+}
+
+/**
+ * If the proxy or config afterRedirects functions are defined, call them with the options
+ *
+ * @param {http.ClientRequestArgs} options
+ * @param {AxiosProxyConfig} configProxy configuration from Axios options object
+ * @param {string} location
+ *
+ * @returns {http.ClientRequestArgs}
+ */
+function setProxy(options, configProxy, location) {
+ let proxy = configProxy;
+ if (!proxy && proxy !== false) {
+ const proxyUrl = proxyFromEnv__default["default"].getProxyForUrl(location);
+ if (proxyUrl) {
+ proxy = new URL(proxyUrl);
+ }
+ }
+ if (proxy) {
+ // Basic proxy authorization
+ if (proxy.username) {
+ proxy.auth = (proxy.username || '') + ':' + (proxy.password || '');
+ }
+
+ if (proxy.auth) {
+ // Support proxy auth object form
+ if (proxy.auth.username || proxy.auth.password) {
+ proxy.auth = (proxy.auth.username || '') + ':' + (proxy.auth.password || '');
+ }
+ const base64 = Buffer
+ .from(proxy.auth, 'utf8')
+ .toString('base64');
+ options.headers['Proxy-Authorization'] = 'Basic ' + base64;
+ }
+
+ options.headers.host = options.hostname + (options.port ? ':' + options.port : '');
+ const proxyHost = proxy.hostname || proxy.host;
+ options.hostname = proxyHost;
+ // Replace 'host' since options is not a URL object
+ options.host = proxyHost;
+ options.port = proxy.port;
+ options.path = location;
+ if (proxy.protocol) {
+ options.protocol = proxy.protocol.includes(':') ? proxy.protocol : `${proxy.protocol}:`;
+ }
+ }
+
+ options.beforeRedirects.proxy = function beforeRedirect(redirectOptions) {
+ // Configure proxy for redirected request, passing the original config proxy to apply
+ // the exact same logic as if the redirected request was performed by axios directly.
+ setProxy(redirectOptions, configProxy, redirectOptions.href);
+ };
+}
+
+const isHttpAdapterSupported = typeof process !== 'undefined' && utils$1.kindOf(process) === 'process';
+
+// temporary hotfix
+
+const wrapAsync = (asyncExecutor) => {
+ return new Promise((resolve, reject) => {
+ let onDone;
+ let isDone;
+
+ const done = (value, isRejected) => {
+ if (isDone) return;
+ isDone = true;
+ onDone && onDone(value, isRejected);
+ };
+
+ const _resolve = (value) => {
+ done(value);
+ resolve(value);
+ };
+
+ const _reject = (reason) => {
+ done(reason, true);
+ reject(reason);
+ };
+
+ asyncExecutor(_resolve, _reject, (onDoneHandler) => (onDone = onDoneHandler)).catch(_reject);
+ })
+};
+
+const resolveFamily = ({address, family}) => {
+ if (!utils$1.isString(address)) {
+ throw TypeError('address must be a string');
+ }
+ return ({
+ address,
+ family: family || (address.indexOf('.') < 0 ? 6 : 4)
+ });
+};
+
+const buildAddressEntry = (address, family) => resolveFamily(utils$1.isObject(address) ? address : {address, family});
+
+/*eslint consistent-return:0*/
+const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) {
+ return wrapAsync(async function dispatchHttpRequest(resolve, reject, onDone) {
+ let {data, lookup, family} = config;
+ const {responseType, responseEncoding} = config;
+ const method = config.method.toUpperCase();
+ let isDone;
+ let rejected = false;
+ let req;
+
+ if (lookup) {
+ const _lookup = callbackify$1(lookup, (value) => utils$1.isArray(value) ? value : [value]);
+ // hotfix to support opt.all option which is required for node 20.x
+ lookup = (hostname, opt, cb) => {
+ _lookup(hostname, opt, (err, arg0, arg1) => {
+ if (err) {
+ return cb(err);
+ }
+
+ const addresses = utils$1.isArray(arg0) ? arg0.map(addr => buildAddressEntry(addr)) : [buildAddressEntry(arg0, arg1)];
+
+ opt.all ? cb(err, addresses) : cb(err, addresses[0].address, addresses[0].family);
+ });
+ };
+ }
+
+ // temporary internal emitter until the AxiosRequest class will be implemented
+ const emitter = new events.EventEmitter();
+
+ const onFinished = () => {
+ if (config.cancelToken) {
+ config.cancelToken.unsubscribe(abort);
+ }
+
+ if (config.signal) {
+ config.signal.removeEventListener('abort', abort);
+ }
+
+ emitter.removeAllListeners();
+ };
+
+ onDone((value, isRejected) => {
+ isDone = true;
+ if (isRejected) {
+ rejected = true;
+ onFinished();
+ }
+ });
+
+ function abort(reason) {
+ emitter.emit('abort', !reason || reason.type ? new CanceledError(null, config, req) : reason);
+ }
+
+ emitter.once('abort', reject);
+
+ if (config.cancelToken || config.signal) {
+ config.cancelToken && config.cancelToken.subscribe(abort);
+ if (config.signal) {
+ config.signal.aborted ? abort() : config.signal.addEventListener('abort', abort);
+ }
+ }
+
+ // Parse url
+ const fullPath = buildFullPath(config.baseURL, config.url, config.allowAbsoluteUrls);
+ const parsed = new URL(fullPath, platform.hasBrowserEnv ? platform.origin : undefined);
+ const protocol = parsed.protocol || supportedProtocols[0];
+
+ if (protocol === 'data:') {
+ let convertedData;
+
+ if (method !== 'GET') {
+ return settle(resolve, reject, {
+ status: 405,
+ statusText: 'method not allowed',
+ headers: {},
+ config
+ });
+ }
+
+ try {
+ convertedData = fromDataURI(config.url, responseType === 'blob', {
+ Blob: config.env && config.env.Blob
+ });
+ } catch (err) {
+ throw AxiosError.from(err, AxiosError.ERR_BAD_REQUEST, config);
+ }
+
+ if (responseType === 'text') {
+ convertedData = convertedData.toString(responseEncoding);
+
+ if (!responseEncoding || responseEncoding === 'utf8') {
+ convertedData = utils$1.stripBOM(convertedData);
+ }
+ } else if (responseType === 'stream') {
+ convertedData = stream__default["default"].Readable.from(convertedData);
+ }
+
+ return settle(resolve, reject, {
+ data: convertedData,
+ status: 200,
+ statusText: 'OK',
+ headers: new AxiosHeaders$1(),
+ config
+ });
+ }
+
+ if (supportedProtocols.indexOf(protocol) === -1) {
+ return reject(new AxiosError(
+ 'Unsupported protocol ' + protocol,
+ AxiosError.ERR_BAD_REQUEST,
+ config
+ ));
+ }
+
+ const headers = AxiosHeaders$1.from(config.headers).normalize();
+
+ // Set User-Agent (required by some servers)
+ // See https://github.com/axios/axios/issues/69
+ // User-Agent is specified; handle case where no UA header is desired
+ // Only set header if it hasn't been set in config
+ headers.set('User-Agent', 'axios/' + VERSION, false);
+
+ const {onUploadProgress, onDownloadProgress} = config;
+ const maxRate = config.maxRate;
+ let maxUploadRate = undefined;
+ let maxDownloadRate = undefined;
+
+ // support for spec compliant FormData objects
+ if (utils$1.isSpecCompliantForm(data)) {
+ const userBoundary = headers.getContentType(/boundary=([-_\w\d]{10,70})/i);
+
+ data = formDataToStream$1(data, (formHeaders) => {
+ headers.set(formHeaders);
+ }, {
+ tag: `axios-${VERSION}-boundary`,
+ boundary: userBoundary && userBoundary[1] || undefined
+ });
+ // support for https://www.npmjs.com/package/form-data api
+ } else if (utils$1.isFormData(data) && utils$1.isFunction(data.getHeaders)) {
+ headers.set(data.getHeaders());
+
+ if (!headers.hasContentLength()) {
+ try {
+ const knownLength = await util__default["default"].promisify(data.getLength).call(data);
+ Number.isFinite(knownLength) && knownLength >= 0 && headers.setContentLength(knownLength);
+ /*eslint no-empty:0*/
+ } catch (e) {
+ }
+ }
+ } else if (utils$1.isBlob(data) || utils$1.isFile(data)) {
+ data.size && headers.setContentType(data.type || 'application/octet-stream');
+ headers.setContentLength(data.size || 0);
+ data = stream__default["default"].Readable.from(readBlob$1(data));
+ } else if (data && !utils$1.isStream(data)) {
+ if (Buffer.isBuffer(data)) ; else if (utils$1.isArrayBuffer(data)) {
+ data = Buffer.from(new Uint8Array(data));
+ } else if (utils$1.isString(data)) {
+ data = Buffer.from(data, 'utf-8');
+ } else {
+ return reject(new AxiosError(
+ 'Data after transformation must be a string, an ArrayBuffer, a Buffer, or a Stream',
+ AxiosError.ERR_BAD_REQUEST,
+ config
+ ));
+ }
+
+ // Add Content-Length header if data exists
+ headers.setContentLength(data.length, false);
+
+ if (config.maxBodyLength > -1 && data.length > config.maxBodyLength) {
+ return reject(new AxiosError(
+ 'Request body larger than maxBodyLength limit',
+ AxiosError.ERR_BAD_REQUEST,
+ config
+ ));
+ }
+ }
+
+ const contentLength = utils$1.toFiniteNumber(headers.getContentLength());
+
+ if (utils$1.isArray(maxRate)) {
+ maxUploadRate = maxRate[0];
+ maxDownloadRate = maxRate[1];
+ } else {
+ maxUploadRate = maxDownloadRate = maxRate;
+ }
+
+ if (data && (onUploadProgress || maxUploadRate)) {
+ if (!utils$1.isStream(data)) {
+ data = stream__default["default"].Readable.from(data, {objectMode: false});
+ }
+
+ data = stream__default["default"].pipeline([data, new AxiosTransformStream$1({
+ maxRate: utils$1.toFiniteNumber(maxUploadRate)
+ })], utils$1.noop);
+
+ onUploadProgress && data.on('progress', flushOnFinish(
+ data,
+ progressEventDecorator(
+ contentLength,
+ progressEventReducer(asyncDecorator(onUploadProgress), false, 3)
+ )
+ ));
+ }
+
+ // HTTP basic authentication
+ let auth = undefined;
+ if (config.auth) {
+ const username = config.auth.username || '';
+ const password = config.auth.password || '';
+ auth = username + ':' + password;
+ }
+
+ if (!auth && parsed.username) {
+ const urlUsername = parsed.username;
+ const urlPassword = parsed.password;
+ auth = urlUsername + ':' + urlPassword;
+ }
+
+ auth && headers.delete('authorization');
+
+ let path;
+
+ try {
+ path = buildURL(
+ parsed.pathname + parsed.search,
+ config.params,
+ config.paramsSerializer
+ ).replace(/^\?/, '');
+ } catch (err) {
+ const customErr = new Error(err.message);
+ customErr.config = config;
+ customErr.url = config.url;
+ customErr.exists = true;
+ return reject(customErr);
+ }
+
+ headers.set(
+ 'Accept-Encoding',
+ 'gzip, compress, deflate' + (isBrotliSupported ? ', br' : ''), false
+ );
+
+ const options = {
+ path,
+ method: method,
+ headers: headers.toJSON(),
+ agents: { http: config.httpAgent, https: config.httpsAgent },
+ auth,
+ protocol,
+ family,
+ beforeRedirect: dispatchBeforeRedirect,
+ beforeRedirects: {}
+ };
+
+ // cacheable-lookup integration hotfix
+ !utils$1.isUndefined(lookup) && (options.lookup = lookup);
+
+ if (config.socketPath) {
+ options.socketPath = config.socketPath;
+ } else {
+ options.hostname = parsed.hostname.startsWith("[") ? parsed.hostname.slice(1, -1) : parsed.hostname;
+ options.port = parsed.port;
+ setProxy(options, config.proxy, protocol + '//' + parsed.hostname + (parsed.port ? ':' + parsed.port : '') + options.path);
+ }
+
+ let transport;
+ const isHttpsRequest = isHttps.test(options.protocol);
+ options.agent = isHttpsRequest ? config.httpsAgent : config.httpAgent;
+ if (config.transport) {
+ transport = config.transport;
+ } else if (config.maxRedirects === 0) {
+ transport = isHttpsRequest ? https__default["default"] : http__default["default"];
+ } else {
+ if (config.maxRedirects) {
+ options.maxRedirects = config.maxRedirects;
+ }
+ if (config.beforeRedirect) {
+ options.beforeRedirects.config = config.beforeRedirect;
+ }
+ transport = isHttpsRequest ? httpsFollow : httpFollow;
+ }
+
+ if (config.maxBodyLength > -1) {
+ options.maxBodyLength = config.maxBodyLength;
+ } else {
+ // follow-redirects does not skip comparison, so it should always succeed for axios -1 unlimited
+ options.maxBodyLength = Infinity;
+ }
+
+ if (config.insecureHTTPParser) {
+ options.insecureHTTPParser = config.insecureHTTPParser;
+ }
+
+ // Create the request
+ req = transport.request(options, function handleResponse(res) {
+ if (req.destroyed) return;
+
+ const streams = [res];
+
+ const responseLength = +res.headers['content-length'];
+
+ if (onDownloadProgress || maxDownloadRate) {
+ const transformStream = new AxiosTransformStream$1({
+ maxRate: utils$1.toFiniteNumber(maxDownloadRate)
+ });
+
+ onDownloadProgress && transformStream.on('progress', flushOnFinish(
+ transformStream,
+ progressEventDecorator(
+ responseLength,
+ progressEventReducer(asyncDecorator(onDownloadProgress), true, 3)
+ )
+ ));
+
+ streams.push(transformStream);
+ }
+
+ // decompress the response body transparently if required
+ let responseStream = res;
+
+ // return the last request in case of redirects
+ const lastRequest = res.req || req;
+
+ // if decompress disabled we should not decompress
+ if (config.decompress !== false && res.headers['content-encoding']) {
+ // if no content, but headers still say that it is encoded,
+ // remove the header not confuse downstream operations
+ if (method === 'HEAD' || res.statusCode === 204) {
+ delete res.headers['content-encoding'];
+ }
+
+ switch ((res.headers['content-encoding'] || '').toLowerCase()) {
+ /*eslint default-case:0*/
+ case 'gzip':
+ case 'x-gzip':
+ case 'compress':
+ case 'x-compress':
+ // add the unzipper to the body stream processing pipeline
+ streams.push(zlib__default["default"].createUnzip(zlibOptions));
+
+ // remove the content-encoding in order to not confuse downstream operations
+ delete res.headers['content-encoding'];
+ break;
+ case 'deflate':
+ streams.push(new ZlibHeaderTransformStream$1());
+
+ // add the unzipper to the body stream processing pipeline
+ streams.push(zlib__default["default"].createUnzip(zlibOptions));
+
+ // remove the content-encoding in order to not confuse downstream operations
+ delete res.headers['content-encoding'];
+ break;
+ case 'br':
+ if (isBrotliSupported) {
+ streams.push(zlib__default["default"].createBrotliDecompress(brotliOptions));
+ delete res.headers['content-encoding'];
+ }
+ }
+ }
+
+ responseStream = streams.length > 1 ? stream__default["default"].pipeline(streams, utils$1.noop) : streams[0];
+
+ const offListeners = stream__default["default"].finished(responseStream, () => {
+ offListeners();
+ onFinished();
+ });
+
+ const response = {
+ status: res.statusCode,
+ statusText: res.statusMessage,
+ headers: new AxiosHeaders$1(res.headers),
+ config,
+ request: lastRequest
+ };
+
+ if (responseType === 'stream') {
+ response.data = responseStream;
+ settle(resolve, reject, response);
+ } else {
+ const responseBuffer = [];
+ let totalResponseBytes = 0;
+
+ responseStream.on('data', function handleStreamData(chunk) {
+ responseBuffer.push(chunk);
+ totalResponseBytes += chunk.length;
+
+ // make sure the content length is not over the maxContentLength if specified
+ if (config.maxContentLength > -1 && totalResponseBytes > config.maxContentLength) {
+ // stream.destroy() emit aborted event before calling reject() on Node.js v16
+ rejected = true;
+ responseStream.destroy();
+ reject(new AxiosError('maxContentLength size of ' + config.maxContentLength + ' exceeded',
+ AxiosError.ERR_BAD_RESPONSE, config, lastRequest));
+ }
+ });
+
+ responseStream.on('aborted', function handlerStreamAborted() {
+ if (rejected) {
+ return;
+ }
+
+ const err = new AxiosError(
+ 'stream has been aborted',
+ AxiosError.ERR_BAD_RESPONSE,
+ config,
+ lastRequest
+ );
+ responseStream.destroy(err);
+ reject(err);
+ });
+
+ responseStream.on('error', function handleStreamError(err) {
+ if (req.destroyed) return;
+ reject(AxiosError.from(err, null, config, lastRequest));
+ });
+
+ responseStream.on('end', function handleStreamEnd() {
+ try {
+ let responseData = responseBuffer.length === 1 ? responseBuffer[0] : Buffer.concat(responseBuffer);
+ if (responseType !== 'arraybuffer') {
+ responseData = responseData.toString(responseEncoding);
+ if (!responseEncoding || responseEncoding === 'utf8') {
+ responseData = utils$1.stripBOM(responseData);
+ }
+ }
+ response.data = responseData;
+ } catch (err) {
+ return reject(AxiosError.from(err, null, config, response.request, response));
+ }
+ settle(resolve, reject, response);
+ });
+ }
+
+ emitter.once('abort', err => {
+ if (!responseStream.destroyed) {
+ responseStream.emit('error', err);
+ responseStream.destroy();
+ }
+ });
+ });
+
+ emitter.once('abort', err => {
+ reject(err);
+ req.destroy(err);
+ });
+
+ // Handle errors
+ req.on('error', function handleRequestError(err) {
+ // @todo remove
+ // if (req.aborted && err.code !== AxiosError.ERR_FR_TOO_MANY_REDIRECTS) return;
+ reject(AxiosError.from(err, null, config, req));
+ });
+
+ // set tcp keep alive to prevent drop connection by peer
+ req.on('socket', function handleRequestSocket(socket) {
+ // default interval of sending ack packet is 1 minute
+ socket.setKeepAlive(true, 1000 * 60);
+ });
+
+ // Handle request timeout
+ if (config.timeout) {
+ // This is forcing a int timeout to avoid problems if the `req` interface doesn't handle other types.
+ const timeout = parseInt(config.timeout, 10);
+
+ if (Number.isNaN(timeout)) {
+ reject(new AxiosError(
+ 'error trying to parse `config.timeout` to int',
+ AxiosError.ERR_BAD_OPTION_VALUE,
+ config,
+ req
+ ));
+
+ return;
+ }
+
+ // Sometime, the response will be very slow, and does not respond, the connect event will be block by event loop system.
+ // And timer callback will be fired, and abort() will be invoked before connection, then get "socket hang up" and code ECONNRESET.
+ // At this time, if we have a large number of request, nodejs will hang up some socket on background. and the number will up and up.
+ // And then these socket which be hang up will devouring CPU little by little.
+ // ClientRequest.setTimeout will be fired on the specify milliseconds, and can make sure that abort() will be fired after connect.
+ req.setTimeout(timeout, function handleRequestTimeout() {
+ if (isDone) return;
+ let timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded';
+ const transitional = config.transitional || transitionalDefaults;
+ if (config.timeoutErrorMessage) {
+ timeoutErrorMessage = config.timeoutErrorMessage;
+ }
+ reject(new AxiosError(
+ timeoutErrorMessage,
+ transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,
+ config,
+ req
+ ));
+ abort();
+ });
+ }
+
+
+ // Send the request
+ if (utils$1.isStream(data)) {
+ let ended = false;
+ let errored = false;
+
+ data.on('end', () => {
+ ended = true;
+ });
+
+ data.once('error', err => {
+ errored = true;
+ req.destroy(err);
+ });
+
+ data.on('close', () => {
+ if (!ended && !errored) {
+ abort(new CanceledError('Request stream has been aborted', config, req));
+ }
+ });
+
+ data.pipe(req);
+ } else {
+ req.end(data);
+ }
+ });
+};
+
+const isURLSameOrigin = platform.hasStandardBrowserEnv ? ((origin, isMSIE) => (url) => {
+ url = new URL(url, platform.origin);
+
+ return (
+ origin.protocol === url.protocol &&
+ origin.host === url.host &&
+ (isMSIE || origin.port === url.port)
+ );
+})(
+ new URL(platform.origin),
+ platform.navigator && /(msie|trident)/i.test(platform.navigator.userAgent)
+) : () => true;
+
+const cookies = platform.hasStandardBrowserEnv ?
+
+ // Standard browser envs support document.cookie
+ {
+ write(name, value, expires, path, domain, secure) {
+ const cookie = [name + '=' + encodeURIComponent(value)];
+
+ utils$1.isNumber(expires) && cookie.push('expires=' + new Date(expires).toGMTString());
+
+ utils$1.isString(path) && cookie.push('path=' + path);
+
+ utils$1.isString(domain) && cookie.push('domain=' + domain);
+
+ secure === true && cookie.push('secure');
+
+ document.cookie = cookie.join('; ');
+ },
+
+ read(name) {
+ const match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)'));
+ return (match ? decodeURIComponent(match[3]) : null);
+ },
+
+ remove(name) {
+ this.write(name, '', Date.now() - 86400000);
+ }
+ }
+
+ :
+
+ // Non-standard browser env (web workers, react-native) lack needed support.
+ {
+ write() {},
+ read() {
+ return null;
+ },
+ remove() {}
+ };
+
+const headersToObject = (thing) => thing instanceof AxiosHeaders$1 ? { ...thing } : thing;
+
+/**
+ * Config-specific merge-function which creates a new config-object
+ * by merging two configuration objects together.
+ *
+ * @param {Object} config1
+ * @param {Object} config2
+ *
+ * @returns {Object} New object resulting from merging config2 to config1
+ */
+function mergeConfig(config1, config2) {
+ // eslint-disable-next-line no-param-reassign
+ config2 = config2 || {};
+ const config = {};
+
+ function getMergedValue(target, source, prop, caseless) {
+ if (utils$1.isPlainObject(target) && utils$1.isPlainObject(source)) {
+ return utils$1.merge.call({caseless}, target, source);
+ } else if (utils$1.isPlainObject(source)) {
+ return utils$1.merge({}, source);
+ } else if (utils$1.isArray(source)) {
+ return source.slice();
+ }
+ return source;
+ }
+
+ // eslint-disable-next-line consistent-return
+ function mergeDeepProperties(a, b, prop , caseless) {
+ if (!utils$1.isUndefined(b)) {
+ return getMergedValue(a, b, prop , caseless);
+ } else if (!utils$1.isUndefined(a)) {
+ return getMergedValue(undefined, a, prop , caseless);
+ }
+ }
+
+ // eslint-disable-next-line consistent-return
+ function valueFromConfig2(a, b) {
+ if (!utils$1.isUndefined(b)) {
+ return getMergedValue(undefined, b);
+ }
+ }
+
+ // eslint-disable-next-line consistent-return
+ function defaultToConfig2(a, b) {
+ if (!utils$1.isUndefined(b)) {
+ return getMergedValue(undefined, b);
+ } else if (!utils$1.isUndefined(a)) {
+ return getMergedValue(undefined, a);
+ }
+ }
+
+ // eslint-disable-next-line consistent-return
+ function mergeDirectKeys(a, b, prop) {
+ if (prop in config2) {
+ return getMergedValue(a, b);
+ } else if (prop in config1) {
+ return getMergedValue(undefined, a);
+ }
+ }
+
+ const mergeMap = {
+ url: valueFromConfig2,
+ method: valueFromConfig2,
+ data: valueFromConfig2,
+ baseURL: defaultToConfig2,
+ transformRequest: defaultToConfig2,
+ transformResponse: defaultToConfig2,
+ paramsSerializer: defaultToConfig2,
+ timeout: defaultToConfig2,
+ timeoutMessage: defaultToConfig2,
+ withCredentials: defaultToConfig2,
+ withXSRFToken: defaultToConfig2,
+ adapter: defaultToConfig2,
+ responseType: defaultToConfig2,
+ xsrfCookieName: defaultToConfig2,
+ xsrfHeaderName: defaultToConfig2,
+ onUploadProgress: defaultToConfig2,
+ onDownloadProgress: defaultToConfig2,
+ decompress: defaultToConfig2,
+ maxContentLength: defaultToConfig2,
+ maxBodyLength: defaultToConfig2,
+ beforeRedirect: defaultToConfig2,
+ transport: defaultToConfig2,
+ httpAgent: defaultToConfig2,
+ httpsAgent: defaultToConfig2,
+ cancelToken: defaultToConfig2,
+ socketPath: defaultToConfig2,
+ responseEncoding: defaultToConfig2,
+ validateStatus: mergeDirectKeys,
+ headers: (a, b , prop) => mergeDeepProperties(headersToObject(a), headersToObject(b),prop, true)
+ };
+
+ utils$1.forEach(Object.keys(Object.assign({}, config1, config2)), function computeConfigValue(prop) {
+ const merge = mergeMap[prop] || mergeDeepProperties;
+ const configValue = merge(config1[prop], config2[prop], prop);
+ (utils$1.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);
+ });
+
+ return config;
+}
+
+const resolveConfig = (config) => {
+ const newConfig = mergeConfig({}, config);
+
+ let {data, withXSRFToken, xsrfHeaderName, xsrfCookieName, headers, auth} = newConfig;
+
+ newConfig.headers = headers = AxiosHeaders$1.from(headers);
+
+ newConfig.url = buildURL(buildFullPath(newConfig.baseURL, newConfig.url, newConfig.allowAbsoluteUrls), config.params, config.paramsSerializer);
+
+ // HTTP basic authentication
+ if (auth) {
+ headers.set('Authorization', 'Basic ' +
+ btoa((auth.username || '') + ':' + (auth.password ? unescape(encodeURIComponent(auth.password)) : ''))
+ );
+ }
+
+ let contentType;
+
+ if (utils$1.isFormData(data)) {
+ if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) {
+ headers.setContentType(undefined); // Let the browser set it
+ } else if ((contentType = headers.getContentType()) !== false) {
+ // fix semicolon duplication issue for ReactNative FormData implementation
+ const [type, ...tokens] = contentType ? contentType.split(';').map(token => token.trim()).filter(Boolean) : [];
+ headers.setContentType([type || 'multipart/form-data', ...tokens].join('; '));
+ }
+ }
+
+ // Add xsrf header
+ // This is only done if running in a standard browser environment.
+ // Specifically not if we're in a web worker, or react-native.
+
+ if (platform.hasStandardBrowserEnv) {
+ withXSRFToken && utils$1.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(newConfig));
+
+ if (withXSRFToken || (withXSRFToken !== false && isURLSameOrigin(newConfig.url))) {
+ // Add xsrf header
+ const xsrfValue = xsrfHeaderName && xsrfCookieName && cookies.read(xsrfCookieName);
+
+ if (xsrfValue) {
+ headers.set(xsrfHeaderName, xsrfValue);
+ }
+ }
+ }
+
+ return newConfig;
+};
+
+const isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';
+
+const xhrAdapter = isXHRAdapterSupported && function (config) {
+ return new Promise(function dispatchXhrRequest(resolve, reject) {
+ const _config = resolveConfig(config);
+ let requestData = _config.data;
+ const requestHeaders = AxiosHeaders$1.from(_config.headers).normalize();
+ let {responseType, onUploadProgress, onDownloadProgress} = _config;
+ let onCanceled;
+ let uploadThrottled, downloadThrottled;
+ let flushUpload, flushDownload;
+
+ function done() {
+ flushUpload && flushUpload(); // flush events
+ flushDownload && flushDownload(); // flush events
+
+ _config.cancelToken && _config.cancelToken.unsubscribe(onCanceled);
+
+ _config.signal && _config.signal.removeEventListener('abort', onCanceled);
+ }
+
+ let request = new XMLHttpRequest();
+
+ request.open(_config.method.toUpperCase(), _config.url, true);
+
+ // Set the request timeout in MS
+ request.timeout = _config.timeout;
+
+ function onloadend() {
+ if (!request) {
+ return;
+ }
+ // Prepare the response
+ const responseHeaders = AxiosHeaders$1.from(
+ 'getAllResponseHeaders' in request && request.getAllResponseHeaders()
+ );
+ const responseData = !responseType || responseType === 'text' || responseType === 'json' ?
+ request.responseText : request.response;
+ const response = {
+ data: responseData,
+ status: request.status,
+ statusText: request.statusText,
+ headers: responseHeaders,
+ config,
+ request
+ };
+
+ settle(function _resolve(value) {
+ resolve(value);
+ done();
+ }, function _reject(err) {
+ reject(err);
+ done();
+ }, response);
+
+ // Clean up request
+ request = null;
+ }
+
+ if ('onloadend' in request) {
+ // Use onloadend if available
+ request.onloadend = onloadend;
+ } else {
+ // Listen for ready state to emulate onloadend
+ request.onreadystatechange = function handleLoad() {
+ if (!request || request.readyState !== 4) {
+ return;
+ }
+
+ // The request errored out and we didn't get a response, this will be
+ // handled by onerror instead
+ // With one exception: request that using file: protocol, most browsers
+ // will return status as 0 even though it's a successful request
+ if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {
+ return;
+ }
+ // readystate handler is calling before onerror or ontimeout handlers,
+ // so we should call onloadend on the next 'tick'
+ setTimeout(onloadend);
+ };
+ }
+
+ // Handle browser request cancellation (as opposed to a manual cancellation)
+ request.onabort = function handleAbort() {
+ if (!request) {
+ return;
+ }
+
+ reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));
+
+ // Clean up request
+ request = null;
+ };
+
+ // Handle low level network errors
+ request.onerror = function handleError() {
+ // Real errors are hidden from us by the browser
+ // onerror should only fire if it's a network error
+ reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request));
+
+ // Clean up request
+ request = null;
+ };
+
+ // Handle timeout
+ request.ontimeout = function handleTimeout() {
+ let timeoutErrorMessage = _config.timeout ? 'timeout of ' + _config.timeout + 'ms exceeded' : 'timeout exceeded';
+ const transitional = _config.transitional || transitionalDefaults;
+ if (_config.timeoutErrorMessage) {
+ timeoutErrorMessage = _config.timeoutErrorMessage;
+ }
+ reject(new AxiosError(
+ timeoutErrorMessage,
+ transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,
+ config,
+ request));
+
+ // Clean up request
+ request = null;
+ };
+
+ // Remove Content-Type if data is undefined
+ requestData === undefined && requestHeaders.setContentType(null);
+
+ // Add headers to the request
+ if ('setRequestHeader' in request) {
+ utils$1.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {
+ request.setRequestHeader(key, val);
+ });
+ }
+
+ // Add withCredentials to request if needed
+ if (!utils$1.isUndefined(_config.withCredentials)) {
+ request.withCredentials = !!_config.withCredentials;
+ }
+
+ // Add responseType to request if needed
+ if (responseType && responseType !== 'json') {
+ request.responseType = _config.responseType;
+ }
+
+ // Handle progress if needed
+ if (onDownloadProgress) {
+ ([downloadThrottled, flushDownload] = progressEventReducer(onDownloadProgress, true));
+ request.addEventListener('progress', downloadThrottled);
+ }
+
+ // Not all browsers support upload events
+ if (onUploadProgress && request.upload) {
+ ([uploadThrottled, flushUpload] = progressEventReducer(onUploadProgress));
+
+ request.upload.addEventListener('progress', uploadThrottled);
+
+ request.upload.addEventListener('loadend', flushUpload);
+ }
+
+ if (_config.cancelToken || _config.signal) {
+ // Handle cancellation
+ // eslint-disable-next-line func-names
+ onCanceled = cancel => {
+ if (!request) {
+ return;
+ }
+ reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);
+ request.abort();
+ request = null;
+ };
+
+ _config.cancelToken && _config.cancelToken.subscribe(onCanceled);
+ if (_config.signal) {
+ _config.signal.aborted ? onCanceled() : _config.signal.addEventListener('abort', onCanceled);
+ }
+ }
+
+ const protocol = parseProtocol(_config.url);
+
+ if (protocol && platform.protocols.indexOf(protocol) === -1) {
+ reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));
+ return;
+ }
+
+
+ // Send the request
+ request.send(requestData || null);
+ });
+};
+
+const composeSignals = (signals, timeout) => {
+ const {length} = (signals = signals ? signals.filter(Boolean) : []);
+
+ if (timeout || length) {
+ let controller = new AbortController();
+
+ let aborted;
+
+ const onabort = function (reason) {
+ if (!aborted) {
+ aborted = true;
+ unsubscribe();
+ const err = reason instanceof Error ? reason : this.reason;
+ controller.abort(err instanceof AxiosError ? err : new CanceledError(err instanceof Error ? err.message : err));
+ }
+ };
+
+ let timer = timeout && setTimeout(() => {
+ timer = null;
+ onabort(new AxiosError(`timeout ${timeout} of ms exceeded`, AxiosError.ETIMEDOUT));
+ }, timeout);
+
+ const unsubscribe = () => {
+ if (signals) {
+ timer && clearTimeout(timer);
+ timer = null;
+ signals.forEach(signal => {
+ signal.unsubscribe ? signal.unsubscribe(onabort) : signal.removeEventListener('abort', onabort);
+ });
+ signals = null;
+ }
+ };
+
+ signals.forEach((signal) => signal.addEventListener('abort', onabort));
+
+ const {signal} = controller;
+
+ signal.unsubscribe = () => utils$1.asap(unsubscribe);
+
+ return signal;
+ }
+};
+
+const composeSignals$1 = composeSignals;
+
+const streamChunk = function* (chunk, chunkSize) {
+ let len = chunk.byteLength;
+
+ if (!chunkSize || len < chunkSize) {
+ yield chunk;
+ return;
+ }
+
+ let pos = 0;
+ let end;
+
+ while (pos < len) {
+ end = pos + chunkSize;
+ yield chunk.slice(pos, end);
+ pos = end;
+ }
+};
+
+const readBytes = async function* (iterable, chunkSize) {
+ for await (const chunk of readStream(iterable)) {
+ yield* streamChunk(chunk, chunkSize);
+ }
+};
+
+const readStream = async function* (stream) {
+ if (stream[Symbol.asyncIterator]) {
+ yield* stream;
+ return;
+ }
+
+ const reader = stream.getReader();
+ try {
+ for (;;) {
+ const {done, value} = await reader.read();
+ if (done) {
+ break;
+ }
+ yield value;
+ }
+ } finally {
+ await reader.cancel();
+ }
+};
+
+const trackStream = (stream, chunkSize, onProgress, onFinish) => {
+ const iterator = readBytes(stream, chunkSize);
+
+ let bytes = 0;
+ let done;
+ let _onFinish = (e) => {
+ if (!done) {
+ done = true;
+ onFinish && onFinish(e);
+ }
+ };
+
+ return new ReadableStream({
+ async pull(controller) {
+ try {
+ const {done, value} = await iterator.next();
+
+ if (done) {
+ _onFinish();
+ controller.close();
+ return;
+ }
+
+ let len = value.byteLength;
+ if (onProgress) {
+ let loadedBytes = bytes += len;
+ onProgress(loadedBytes);
+ }
+ controller.enqueue(new Uint8Array(value));
+ } catch (err) {
+ _onFinish(err);
+ throw err;
+ }
+ },
+ cancel(reason) {
+ _onFinish(reason);
+ return iterator.return();
+ }
+ }, {
+ highWaterMark: 2
+ })
+};
+
+const isFetchSupported = typeof fetch === 'function' && typeof Request === 'function' && typeof Response === 'function';
+const isReadableStreamSupported = isFetchSupported && typeof ReadableStream === 'function';
+
+// used only inside the fetch adapter
+const encodeText = isFetchSupported && (typeof TextEncoder === 'function' ?
+ ((encoder) => (str) => encoder.encode(str))(new TextEncoder()) :
+ async (str) => new Uint8Array(await new Response(str).arrayBuffer())
+);
+
+const test = (fn, ...args) => {
+ try {
+ return !!fn(...args);
+ } catch (e) {
+ return false
+ }
+};
+
+const supportsRequestStream = isReadableStreamSupported && test(() => {
+ let duplexAccessed = false;
+
+ const hasContentType = new Request(platform.origin, {
+ body: new ReadableStream(),
+ method: 'POST',
+ get duplex() {
+ duplexAccessed = true;
+ return 'half';
+ },
+ }).headers.has('Content-Type');
+
+ return duplexAccessed && !hasContentType;
+});
+
+const DEFAULT_CHUNK_SIZE = 64 * 1024;
+
+const supportsResponseStream = isReadableStreamSupported &&
+ test(() => utils$1.isReadableStream(new Response('').body));
+
+
+const resolvers = {
+ stream: supportsResponseStream && ((res) => res.body)
+};
+
+isFetchSupported && (((res) => {
+ ['text', 'arrayBuffer', 'blob', 'formData', 'stream'].forEach(type => {
+ !resolvers[type] && (resolvers[type] = utils$1.isFunction(res[type]) ? (res) => res[type]() :
+ (_, config) => {
+ throw new AxiosError(`Response type '${type}' is not supported`, AxiosError.ERR_NOT_SUPPORT, config);
+ });
+ });
+})(new Response));
+
+const getBodyLength = async (body) => {
+ if (body == null) {
+ return 0;
+ }
+
+ if(utils$1.isBlob(body)) {
+ return body.size;
+ }
+
+ if(utils$1.isSpecCompliantForm(body)) {
+ const _request = new Request(platform.origin, {
+ method: 'POST',
+ body,
+ });
+ return (await _request.arrayBuffer()).byteLength;
+ }
+
+ if(utils$1.isArrayBufferView(body) || utils$1.isArrayBuffer(body)) {
+ return body.byteLength;
+ }
+
+ if(utils$1.isURLSearchParams(body)) {
+ body = body + '';
+ }
+
+ if(utils$1.isString(body)) {
+ return (await encodeText(body)).byteLength;
+ }
+};
+
+const resolveBodyLength = async (headers, body) => {
+ const length = utils$1.toFiniteNumber(headers.getContentLength());
+
+ return length == null ? getBodyLength(body) : length;
+};
+
+const fetchAdapter = isFetchSupported && (async (config) => {
+ let {
+ url,
+ method,
+ data,
+ signal,
+ cancelToken,
+ timeout,
+ onDownloadProgress,
+ onUploadProgress,
+ responseType,
+ headers,
+ withCredentials = 'same-origin',
+ fetchOptions
+ } = resolveConfig(config);
+
+ responseType = responseType ? (responseType + '').toLowerCase() : 'text';
+
+ let composedSignal = composeSignals$1([signal, cancelToken && cancelToken.toAbortSignal()], timeout);
+
+ let request;
+
+ const unsubscribe = composedSignal && composedSignal.unsubscribe && (() => {
+ composedSignal.unsubscribe();
+ });
+
+ let requestContentLength;
+
+ try {
+ if (
+ onUploadProgress && supportsRequestStream && method !== 'get' && method !== 'head' &&
+ (requestContentLength = await resolveBodyLength(headers, data)) !== 0
+ ) {
+ let _request = new Request(url, {
+ method: 'POST',
+ body: data,
+ duplex: "half"
+ });
+
+ let contentTypeHeader;
+
+ if (utils$1.isFormData(data) && (contentTypeHeader = _request.headers.get('content-type'))) {
+ headers.setContentType(contentTypeHeader);
+ }
+
+ if (_request.body) {
+ const [onProgress, flush] = progressEventDecorator(
+ requestContentLength,
+ progressEventReducer(asyncDecorator(onUploadProgress))
+ );
+
+ data = trackStream(_request.body, DEFAULT_CHUNK_SIZE, onProgress, flush);
+ }
+ }
+
+ if (!utils$1.isString(withCredentials)) {
+ withCredentials = withCredentials ? 'include' : 'omit';
+ }
+
+ // Cloudflare Workers throws when credentials are defined
+ // see https://github.com/cloudflare/workerd/issues/902
+ const isCredentialsSupported = "credentials" in Request.prototype;
+ request = new Request(url, {
+ ...fetchOptions,
+ signal: composedSignal,
+ method: method.toUpperCase(),
+ headers: headers.normalize().toJSON(),
+ body: data,
+ duplex: "half",
+ credentials: isCredentialsSupported ? withCredentials : undefined
+ });
+
+ let response = await fetch(request);
+
+ const isStreamResponse = supportsResponseStream && (responseType === 'stream' || responseType === 'response');
+
+ if (supportsResponseStream && (onDownloadProgress || (isStreamResponse && unsubscribe))) {
+ const options = {};
+
+ ['status', 'statusText', 'headers'].forEach(prop => {
+ options[prop] = response[prop];
+ });
+
+ const responseContentLength = utils$1.toFiniteNumber(response.headers.get('content-length'));
+
+ const [onProgress, flush] = onDownloadProgress && progressEventDecorator(
+ responseContentLength,
+ progressEventReducer(asyncDecorator(onDownloadProgress), true)
+ ) || [];
+
+ response = new Response(
+ trackStream(response.body, DEFAULT_CHUNK_SIZE, onProgress, () => {
+ flush && flush();
+ unsubscribe && unsubscribe();
+ }),
+ options
+ );
+ }
+
+ responseType = responseType || 'text';
+
+ let responseData = await resolvers[utils$1.findKey(resolvers, responseType) || 'text'](response, config);
+
+ !isStreamResponse && unsubscribe && unsubscribe();
+
+ return await new Promise((resolve, reject) => {
+ settle(resolve, reject, {
+ data: responseData,
+ headers: AxiosHeaders$1.from(response.headers),
+ status: response.status,
+ statusText: response.statusText,
+ config,
+ request
+ });
+ })
+ } catch (err) {
+ unsubscribe && unsubscribe();
+
+ if (err && err.name === 'TypeError' && /fetch/i.test(err.message)) {
+ throw Object.assign(
+ new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request),
+ {
+ cause: err.cause || err
+ }
+ )
+ }
+
+ throw AxiosError.from(err, err && err.code, config, request);
+ }
+});
+
+const knownAdapters = {
+ http: httpAdapter,
+ xhr: xhrAdapter,
+ fetch: fetchAdapter
+};
+
+utils$1.forEach(knownAdapters, (fn, value) => {
+ if (fn) {
+ try {
+ Object.defineProperty(fn, 'name', {value});
+ } catch (e) {
+ // eslint-disable-next-line no-empty
+ }
+ Object.defineProperty(fn, 'adapterName', {value});
+ }
+});
+
+const renderReason = (reason) => `- ${reason}`;
+
+const isResolvedHandle = (adapter) => utils$1.isFunction(adapter) || adapter === null || adapter === false;
+
+const adapters = {
+ getAdapter: (adapters) => {
+ adapters = utils$1.isArray(adapters) ? adapters : [adapters];
+
+ const {length} = adapters;
+ let nameOrAdapter;
+ let adapter;
+
+ const rejectedReasons = {};
+
+ for (let i = 0; i < length; i++) {
+ nameOrAdapter = adapters[i];
+ let id;
+
+ adapter = nameOrAdapter;
+
+ if (!isResolvedHandle(nameOrAdapter)) {
+ adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()];
+
+ if (adapter === undefined) {
+ throw new AxiosError(`Unknown adapter '${id}'`);
+ }
+ }
+
+ if (adapter) {
+ break;
+ }
+
+ rejectedReasons[id || '#' + i] = adapter;
+ }
+
+ if (!adapter) {
+
+ const reasons = Object.entries(rejectedReasons)
+ .map(([id, state]) => `adapter ${id} ` +
+ (state === false ? 'is not supported by the environment' : 'is not available in the build')
+ );
+
+ let s = length ?
+ (reasons.length > 1 ? 'since :\n' + reasons.map(renderReason).join('\n') : ' ' + renderReason(reasons[0])) :
+ 'as no adapter specified';
+
+ throw new AxiosError(
+ `There is no suitable adapter to dispatch the request ` + s,
+ 'ERR_NOT_SUPPORT'
+ );
+ }
+
+ return adapter;
+ },
+ adapters: knownAdapters
+};
+
+/**
+ * Throws a `CanceledError` if cancellation has been requested.
+ *
+ * @param {Object} config The config that is to be used for the request
+ *
+ * @returns {void}
+ */
+function throwIfCancellationRequested(config) {
+ if (config.cancelToken) {
+ config.cancelToken.throwIfRequested();
+ }
+
+ if (config.signal && config.signal.aborted) {
+ throw new CanceledError(null, config);
+ }
+}
+
+/**
+ * Dispatch a request to the server using the configured adapter.
+ *
+ * @param {object} config The config that is to be used for the request
+ *
+ * @returns {Promise} The Promise to be fulfilled
+ */
+function dispatchRequest(config) {
+ throwIfCancellationRequested(config);
+
+ config.headers = AxiosHeaders$1.from(config.headers);
+
+ // Transform request data
+ config.data = transformData.call(
+ config,
+ config.transformRequest
+ );
+
+ if (['post', 'put', 'patch'].indexOf(config.method) !== -1) {
+ config.headers.setContentType('application/x-www-form-urlencoded', false);
+ }
+
+ const adapter = adapters.getAdapter(config.adapter || defaults$1.adapter);
+
+ return adapter(config).then(function onAdapterResolution(response) {
+ throwIfCancellationRequested(config);
+
+ // Transform response data
+ response.data = transformData.call(
+ config,
+ config.transformResponse,
+ response
+ );
+
+ response.headers = AxiosHeaders$1.from(response.headers);
+
+ return response;
+ }, function onAdapterRejection(reason) {
+ if (!isCancel(reason)) {
+ throwIfCancellationRequested(config);
+
+ // Transform response data
+ if (reason && reason.response) {
+ reason.response.data = transformData.call(
+ config,
+ config.transformResponse,
+ reason.response
+ );
+ reason.response.headers = AxiosHeaders$1.from(reason.response.headers);
+ }
+ }
+
+ return Promise.reject(reason);
+ });
+}
+
+const validators$1 = {};
+
+// eslint-disable-next-line func-names
+['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {
+ validators$1[type] = function validator(thing) {
+ return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;
+ };
+});
+
+const deprecatedWarnings = {};
+
+/**
+ * Transitional option validator
+ *
+ * @param {function|boolean?} validator - set to false if the transitional option has been removed
+ * @param {string?} version - deprecated version / removed since version
+ * @param {string?} message - some message with additional info
+ *
+ * @returns {function}
+ */
+validators$1.transitional = function transitional(validator, version, message) {
+ function formatMessage(opt, desc) {
+ return '[Axios v' + VERSION + '] Transitional option \'' + opt + '\'' + desc + (message ? '. ' + message : '');
+ }
+
+ // eslint-disable-next-line func-names
+ return (value, opt, opts) => {
+ if (validator === false) {
+ throw new AxiosError(
+ formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),
+ AxiosError.ERR_DEPRECATED
+ );
+ }
+
+ if (version && !deprecatedWarnings[opt]) {
+ deprecatedWarnings[opt] = true;
+ // eslint-disable-next-line no-console
+ console.warn(
+ formatMessage(
+ opt,
+ ' has been deprecated since v' + version + ' and will be removed in the near future'
+ )
+ );
+ }
+
+ return validator ? validator(value, opt, opts) : true;
+ };
+};
+
+validators$1.spelling = function spelling(correctSpelling) {
+ return (value, opt) => {
+ // eslint-disable-next-line no-console
+ console.warn(`${opt} is likely a misspelling of ${correctSpelling}`);
+ return true;
+ }
+};
+
+/**
+ * Assert object's properties type
+ *
+ * @param {object} options
+ * @param {object} schema
+ * @param {boolean?} allowUnknown
+ *
+ * @returns {object}
+ */
+
+function assertOptions(options, schema, allowUnknown) {
+ if (typeof options !== 'object') {
+ throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);
+ }
+ const keys = Object.keys(options);
+ let i = keys.length;
+ while (i-- > 0) {
+ const opt = keys[i];
+ const validator = schema[opt];
+ if (validator) {
+ const value = options[opt];
+ const result = value === undefined || validator(value, opt, options);
+ if (result !== true) {
+ throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);
+ }
+ continue;
+ }
+ if (allowUnknown !== true) {
+ throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);
+ }
+ }
+}
+
+const validator = {
+ assertOptions,
+ validators: validators$1
+};
+
+const validators = validator.validators;
+
+/**
+ * Create a new instance of Axios
+ *
+ * @param {Object} instanceConfig The default config for the instance
+ *
+ * @return {Axios} A new instance of Axios
+ */
+class Axios {
+ constructor(instanceConfig) {
+ this.defaults = instanceConfig;
+ this.interceptors = {
+ request: new InterceptorManager$1(),
+ response: new InterceptorManager$1()
+ };
+ }
+
+ /**
+ * Dispatch a request
+ *
+ * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)
+ * @param {?Object} config
+ *
+ * @returns {Promise} The Promise to be fulfilled
+ */
+ async request(configOrUrl, config) {
+ try {
+ return await this._request(configOrUrl, config);
+ } catch (err) {
+ if (err instanceof Error) {
+ let dummy = {};
+
+ Error.captureStackTrace ? Error.captureStackTrace(dummy) : (dummy = new Error());
+
+ // slice off the Error: ... line
+ const stack = dummy.stack ? dummy.stack.replace(/^.+\n/, '') : '';
+ try {
+ if (!err.stack) {
+ err.stack = stack;
+ // match without the 2 top stack lines
+ } else if (stack && !String(err.stack).endsWith(stack.replace(/^.+\n.+\n/, ''))) {
+ err.stack += '\n' + stack;
+ }
+ } catch (e) {
+ // ignore the case where "stack" is an un-writable property
+ }
+ }
+
+ throw err;
+ }
+ }
+
+ _request(configOrUrl, config) {
+ /*eslint no-param-reassign:0*/
+ // Allow for axios('example/url'[, config]) a la fetch API
+ if (typeof configOrUrl === 'string') {
+ config = config || {};
+ config.url = configOrUrl;
+ } else {
+ config = configOrUrl || {};
+ }
+
+ config = mergeConfig(this.defaults, config);
+
+ const {transitional, paramsSerializer, headers} = config;
+
+ if (transitional !== undefined) {
+ validator.assertOptions(transitional, {
+ silentJSONParsing: validators.transitional(validators.boolean),
+ forcedJSONParsing: validators.transitional(validators.boolean),
+ clarifyTimeoutError: validators.transitional(validators.boolean)
+ }, false);
+ }
+
+ if (paramsSerializer != null) {
+ if (utils$1.isFunction(paramsSerializer)) {
+ config.paramsSerializer = {
+ serialize: paramsSerializer
+ };
+ } else {
+ validator.assertOptions(paramsSerializer, {
+ encode: validators.function,
+ serialize: validators.function
+ }, true);
+ }
+ }
+
+ // Set config.allowAbsoluteUrls
+ if (config.allowAbsoluteUrls !== undefined) ; else if (this.defaults.allowAbsoluteUrls !== undefined) {
+ config.allowAbsoluteUrls = this.defaults.allowAbsoluteUrls;
+ } else {
+ config.allowAbsoluteUrls = true;
+ }
+
+ validator.assertOptions(config, {
+ baseUrl: validators.spelling('baseURL'),
+ withXsrfToken: validators.spelling('withXSRFToken')
+ }, true);
+
+ // Set config.method
+ config.method = (config.method || this.defaults.method || 'get').toLowerCase();
+
+ // Flatten headers
+ let contextHeaders = headers && utils$1.merge(
+ headers.common,
+ headers[config.method]
+ );
+
+ headers && utils$1.forEach(
+ ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],
+ (method) => {
+ delete headers[method];
+ }
+ );
+
+ config.headers = AxiosHeaders$1.concat(contextHeaders, headers);
+
+ // filter out skipped interceptors
+ const requestInterceptorChain = [];
+ let synchronousRequestInterceptors = true;
+ this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {
+ if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {
+ return;
+ }
+
+ synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;
+
+ requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);
+ });
+
+ const responseInterceptorChain = [];
+ this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {
+ responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);
+ });
+
+ let promise;
+ let i = 0;
+ let len;
+
+ if (!synchronousRequestInterceptors) {
+ const chain = [dispatchRequest.bind(this), undefined];
+ chain.unshift.apply(chain, requestInterceptorChain);
+ chain.push.apply(chain, responseInterceptorChain);
+ len = chain.length;
+
+ promise = Promise.resolve(config);
+
+ while (i < len) {
+ promise = promise.then(chain[i++], chain[i++]);
+ }
+
+ return promise;
+ }
+
+ len = requestInterceptorChain.length;
+
+ let newConfig = config;
+
+ i = 0;
+
+ while (i < len) {
+ const onFulfilled = requestInterceptorChain[i++];
+ const onRejected = requestInterceptorChain[i++];
+ try {
+ newConfig = onFulfilled(newConfig);
+ } catch (error) {
+ onRejected.call(this, error);
+ break;
+ }
+ }
+
+ try {
+ promise = dispatchRequest.call(this, newConfig);
+ } catch (error) {
+ return Promise.reject(error);
+ }
+
+ i = 0;
+ len = responseInterceptorChain.length;
+
+ while (i < len) {
+ promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);
+ }
+
+ return promise;
+ }
+
+ getUri(config) {
+ config = mergeConfig(this.defaults, config);
+ const fullPath = buildFullPath(config.baseURL, config.url, config.allowAbsoluteUrls);
+ return buildURL(fullPath, config.params, config.paramsSerializer);
+ }
+}
+
+// Provide aliases for supported request methods
+utils$1.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {
+ /*eslint func-names:0*/
+ Axios.prototype[method] = function(url, config) {
+ return this.request(mergeConfig(config || {}, {
+ method,
+ url,
+ data: (config || {}).data
+ }));
+ };
+});
+
+utils$1.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
+ /*eslint func-names:0*/
+
+ function generateHTTPMethod(isForm) {
+ return function httpMethod(url, data, config) {
+ return this.request(mergeConfig(config || {}, {
+ method,
+ headers: isForm ? {
+ 'Content-Type': 'multipart/form-data'
+ } : {},
+ url,
+ data
+ }));
+ };
+ }
+
+ Axios.prototype[method] = generateHTTPMethod();
+
+ Axios.prototype[method + 'Form'] = generateHTTPMethod(true);
+});
+
+const Axios$1 = Axios;
+
+/**
+ * A `CancelToken` is an object that can be used to request cancellation of an operation.
+ *
+ * @param {Function} executor The executor function.
+ *
+ * @returns {CancelToken}
+ */
+class CancelToken {
+ constructor(executor) {
+ if (typeof executor !== 'function') {
+ throw new TypeError('executor must be a function.');
+ }
+
+ let resolvePromise;
+
+ this.promise = new Promise(function promiseExecutor(resolve) {
+ resolvePromise = resolve;
+ });
+
+ const token = this;
+
+ // eslint-disable-next-line func-names
+ this.promise.then(cancel => {
+ if (!token._listeners) return;
+
+ let i = token._listeners.length;
+
+ while (i-- > 0) {
+ token._listeners[i](cancel);
+ }
+ token._listeners = null;
+ });
+
+ // eslint-disable-next-line func-names
+ this.promise.then = onfulfilled => {
+ let _resolve;
+ // eslint-disable-next-line func-names
+ const promise = new Promise(resolve => {
+ token.subscribe(resolve);
+ _resolve = resolve;
+ }).then(onfulfilled);
+
+ promise.cancel = function reject() {
+ token.unsubscribe(_resolve);
+ };
+
+ return promise;
+ };
+
+ executor(function cancel(message, config, request) {
+ if (token.reason) {
+ // Cancellation has already been requested
+ return;
+ }
+
+ token.reason = new CanceledError(message, config, request);
+ resolvePromise(token.reason);
+ });
+ }
+
+ /**
+ * Throws a `CanceledError` if cancellation has been requested.
+ */
+ throwIfRequested() {
+ if (this.reason) {
+ throw this.reason;
+ }
+ }
+
+ /**
+ * Subscribe to the cancel signal
+ */
+
+ subscribe(listener) {
+ if (this.reason) {
+ listener(this.reason);
+ return;
+ }
+
+ if (this._listeners) {
+ this._listeners.push(listener);
+ } else {
+ this._listeners = [listener];
+ }
+ }
+
+ /**
+ * Unsubscribe from the cancel signal
+ */
+
+ unsubscribe(listener) {
+ if (!this._listeners) {
+ return;
+ }
+ const index = this._listeners.indexOf(listener);
+ if (index !== -1) {
+ this._listeners.splice(index, 1);
+ }
+ }
+
+ toAbortSignal() {
+ const controller = new AbortController();
+
+ const abort = (err) => {
+ controller.abort(err);
+ };
+
+ this.subscribe(abort);
+
+ controller.signal.unsubscribe = () => this.unsubscribe(abort);
+
+ return controller.signal;
+ }
+
+ /**
+ * Returns an object that contains a new `CancelToken` and a function that, when called,
+ * cancels the `CancelToken`.
+ */
+ static source() {
+ let cancel;
+ const token = new CancelToken(function executor(c) {
+ cancel = c;
+ });
+ return {
+ token,
+ cancel
+ };
+ }
+}
+
+const CancelToken$1 = CancelToken;
+
+/**
+ * Syntactic sugar for invoking a function and expanding an array for arguments.
+ *
+ * Common use case would be to use `Function.prototype.apply`.
+ *
+ * ```js
+ * function f(x, y, z) {}
+ * var args = [1, 2, 3];
+ * f.apply(null, args);
+ * ```
+ *
+ * With `spread` this example can be re-written.
+ *
+ * ```js
+ * spread(function(x, y, z) {})([1, 2, 3]);
+ * ```
+ *
+ * @param {Function} callback
+ *
+ * @returns {Function}
+ */
+function spread(callback) {
+ return function wrap(arr) {
+ return callback.apply(null, arr);
+ };
+}
+
+/**
+ * Determines whether the payload is an error thrown by Axios
+ *
+ * @param {*} payload The value to test
+ *
+ * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false
+ */
+function isAxiosError(payload) {
+ return utils$1.isObject(payload) && (payload.isAxiosError === true);
+}
+
+const HttpStatusCode = {
+ Continue: 100,
+ SwitchingProtocols: 101,
+ Processing: 102,
+ EarlyHints: 103,
+ Ok: 200,
+ Created: 201,
+ Accepted: 202,
+ NonAuthoritativeInformation: 203,
+ NoContent: 204,
+ ResetContent: 205,
+ PartialContent: 206,
+ MultiStatus: 207,
+ AlreadyReported: 208,
+ ImUsed: 226,
+ MultipleChoices: 300,
+ MovedPermanently: 301,
+ Found: 302,
+ SeeOther: 303,
+ NotModified: 304,
+ UseProxy: 305,
+ Unused: 306,
+ TemporaryRedirect: 307,
+ PermanentRedirect: 308,
+ BadRequest: 400,
+ Unauthorized: 401,
+ PaymentRequired: 402,
+ Forbidden: 403,
+ NotFound: 404,
+ MethodNotAllowed: 405,
+ NotAcceptable: 406,
+ ProxyAuthenticationRequired: 407,
+ RequestTimeout: 408,
+ Conflict: 409,
+ Gone: 410,
+ LengthRequired: 411,
+ PreconditionFailed: 412,
+ PayloadTooLarge: 413,
+ UriTooLong: 414,
+ UnsupportedMediaType: 415,
+ RangeNotSatisfiable: 416,
+ ExpectationFailed: 417,
+ ImATeapot: 418,
+ MisdirectedRequest: 421,
+ UnprocessableEntity: 422,
+ Locked: 423,
+ FailedDependency: 424,
+ TooEarly: 425,
+ UpgradeRequired: 426,
+ PreconditionRequired: 428,
+ TooManyRequests: 429,
+ RequestHeaderFieldsTooLarge: 431,
+ UnavailableForLegalReasons: 451,
+ InternalServerError: 500,
+ NotImplemented: 501,
+ BadGateway: 502,
+ ServiceUnavailable: 503,
+ GatewayTimeout: 504,
+ HttpVersionNotSupported: 505,
+ VariantAlsoNegotiates: 506,
+ InsufficientStorage: 507,
+ LoopDetected: 508,
+ NotExtended: 510,
+ NetworkAuthenticationRequired: 511,
+};
+
+Object.entries(HttpStatusCode).forEach(([key, value]) => {
+ HttpStatusCode[value] = key;
+});
+
+const HttpStatusCode$1 = HttpStatusCode;
+
+/**
+ * Create an instance of Axios
+ *
+ * @param {Object} defaultConfig The default config for the instance
+ *
+ * @returns {Axios} A new instance of Axios
+ */
+function createInstance(defaultConfig) {
+ const context = new Axios$1(defaultConfig);
+ const instance = bind(Axios$1.prototype.request, context);
+
+ // Copy axios.prototype to instance
+ utils$1.extend(instance, Axios$1.prototype, context, {allOwnKeys: true});
+
+ // Copy context to instance
+ utils$1.extend(instance, context, null, {allOwnKeys: true});
+
+ // Factory for creating new instances
+ instance.create = function create(instanceConfig) {
+ return createInstance(mergeConfig(defaultConfig, instanceConfig));
+ };
+
+ return instance;
+}
+
+// Create the default instance to be exported
+const axios = createInstance(defaults$1);
+
+// Expose Axios class to allow class inheritance
+axios.Axios = Axios$1;
+
+// Expose Cancel & CancelToken
+axios.CanceledError = CanceledError;
+axios.CancelToken = CancelToken$1;
+axios.isCancel = isCancel;
+axios.VERSION = VERSION;
+axios.toFormData = toFormData;
+
+// Expose AxiosError class
+axios.AxiosError = AxiosError;
+
+// alias for CanceledError for backward compatibility
+axios.Cancel = axios.CanceledError;
+
+// Expose all/spread
+axios.all = function all(promises) {
+ return Promise.all(promises);
+};
+
+axios.spread = spread;
+
+// Expose isAxiosError
+axios.isAxiosError = isAxiosError;
+
+// Expose mergeConfig
+axios.mergeConfig = mergeConfig;
+
+axios.AxiosHeaders = AxiosHeaders$1;
+
+axios.formToJSON = thing => formDataToJSON(utils$1.isHTMLForm(thing) ? new FormData(thing) : thing);
+
+axios.getAdapter = adapters.getAdapter;
+
+axios.HttpStatusCode = HttpStatusCode$1;
+
+axios.default = axios;
+
+module.exports = axios;
+//# sourceMappingURL=axios.cjs.map
+
+
/***/ }),
/***/ 6625:
/***/ ((module) => {
"use strict";
-module.exports = JSON.parse('{"name":"@lampajr/bper","version":"2.1.0","description":"BPer is a tool to execute automatic git backporting.","author":"","license":"MIT","private":false,"main":"./dist/gha/index.js","bin":{"bper":"./dist/cli/index.js"},"files":["dist/cli/index.js"],"scripts":{"prepare":"husky install","clean":"rm -rf ./build ./dist","compile":"tsc -p tsconfig.json && tsc-alias -p tsconfig.json","package":"npm run package:cli && npm run package:gha","package:cli":"ncc build ./build/src/bin/cli.js -o dist/cli","package:gha":"ncc build ./build/src/bin/gha.js -o dist/gha","build":"npm run clean && npm run compile && npm run package","test":"jest","test:report":"npm test -- --coverage --testResultsProcessor=jest-sonar-reporter","lint":"eslint . --ext .ts","lint:fix":"npm run lint -- --fix","ts-node":"ts-node","postversion":"npm run build && git add dist && rm -rf build","release":"release-it"},"repository":{"type":"git","url":"git+https://github.com/lampajr/backporting.git"},"keywords":["backporting","pull-requests","github-action","cherry-pick"],"bugs":{"url":"https://github.com/lampajr/backporting/issues"},"homepage":"https://github.com/lampajr/backporting#readme","devDependencies":{"@commitlint/cli":"^17.4.0","@commitlint/config-conventional":"^17.4.0","@kie/mock-github":"^0.1.2","@release-it/conventional-changelog":"^5.1.1","@types/fs-extra":"^9.0.13","@types/jest":"^29.2.4","@types/node":"^18.11.17","@typescript-eslint/eslint-plugin":"^5.47.0","@typescript-eslint/parser":"^5.47.0","@vercel/ncc":"^0.36.0","eslint":"^8.30.0","husky":"^8.0.2","jest":"^29.3.1","jest-sonar-reporter":"^2.0.0","release-it":"^15.6.0","semver":"^7.3.8","ts-jest":"^29.0.3","ts-node":"^10.8.1","tsc-alias":"^1.8.2","tsconfig-paths":"^4.1.0","typescript":"^4.9.3"},"dependencies":{"@actions/core":"^1.10.0","@octokit/rest":"^19.0.5","@octokit/types":"^8.0.0","@octokit/webhooks-types":"^6.8.0","commander":"^9.3.0","fs-extra":"^11.1.0","simple-git":"^3.15.1"}}');
+module.exports = JSON.parse('{"name":"@kie/git-backporting","version":"4.8.5","description":"Git backporting is a tool to execute automatic pull request git backporting.","author":"","license":"MIT","private":false,"main":"./dist/gha/index.js","bin":{"git-backporting":"./dist/cli/index.js"},"files":["dist/cli/index.js"],"publishConfig":{"access":"public"},"scripts":{"prepare":"husky install","clean":"rm -rf ./build ./dist","compile":"tsc -p tsconfig.json && tsc-alias -p tsconfig.json","package":"npm run package:cli && npm run package:gha","package:cli":"ncc build ./build/src/bin/cli.js -o dist/cli","package:gha":"ncc build ./build/src/bin/gha.js -o dist/gha","build":"npm run clean && npm run compile && npm run package","test":"jest --silent","test:report":"npm test -- --coverage --testResultsProcessor=jest-sonar-reporter","lint":"eslint . --ext .ts","lint:fix":"npm run lint -- --fix","ts-node":"ts-node","postversion":"npm run build && git add dist && rm -rf build","release":"release-it","release:branch":"git checkout -b release/$(release-it --release-version) main","release:prepare":"release-it --no-npm.publish --no-github.release --no-git.push --no-git.tag --no-git.requireUpstream","release:prepare:all":"npm run release:branch && npm run release:prepare"},"repository":{"type":"git","url":"git+https://github.com/kiegroup/git-backporting.git"},"keywords":["backporting","pull-requests","merge-requests","github-action","cherry-pick"],"bugs":{"url":"https://github.com/kiegroup/git-backporting/issues"},"homepage":"https://github.com/kiegroup/git-backporting#readme","devDependencies":{"@commitlint/cli":"^17.4.0","@commitlint/config-conventional":"^17.4.0","@gitbeaker/rest":"^39.1.0","@kie/mock-github":"^1.1.0","@octokit/webhooks-types":"^6.8.0","@release-it/conventional-changelog":"^10.0.0","@types/fs-extra":"^9.0.13","@types/jest":"^29.2.4","@types/node":"^18.11.17","@typescript-eslint/eslint-plugin":"^5.47.0","@typescript-eslint/parser":"^5.47.0","@vercel/ncc":"^0.36.0","eslint":"^8.30.0","husky":"^8.0.2","jest":"^29.0.0","jest-sonar-reporter":"^2.0.0","release-it":"^18.1.2","semver":"^7.3.8","ts-jest":"^29.0.0","ts-node":"^10.8.1","tsc-alias":"^1.8.2","tsconfig-paths":"^4.1.0","typescript":"^4.9.3"},"dependencies":{"@actions/core":"^1.10.0","@octokit/rest":"^18.12.0","axios":"^1.4.0","commander":"^9.3.0","fs-extra":"^11.1.0","https":"^1.0.0","simple-git":"^3.15.1"}}');
+
+/***/ }),
+
+/***/ 3765:
+/***/ ((module) => {
+
+"use strict";
+module.exports = JSON.parse('{"application/1d-interleaved-parityfec":{"source":"iana"},"application/3gpdash-qoe-report+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/3gpp-ims+xml":{"source":"iana","compressible":true},"application/3gpphal+json":{"source":"iana","compressible":true},"application/3gpphalforms+json":{"source":"iana","compressible":true},"application/a2l":{"source":"iana"},"application/ace+cbor":{"source":"iana"},"application/activemessage":{"source":"iana"},"application/activity+json":{"source":"iana","compressible":true},"application/alto-costmap+json":{"source":"iana","compressible":true},"application/alto-costmapfilter+json":{"source":"iana","compressible":true},"application/alto-directory+json":{"source":"iana","compressible":true},"application/alto-endpointcost+json":{"source":"iana","compressible":true},"application/alto-endpointcostparams+json":{"source":"iana","compressible":true},"application/alto-endpointprop+json":{"source":"iana","compressible":true},"application/alto-endpointpropparams+json":{"source":"iana","compressible":true},"application/alto-error+json":{"source":"iana","compressible":true},"application/alto-networkmap+json":{"source":"iana","compressible":true},"application/alto-networkmapfilter+json":{"source":"iana","compressible":true},"application/alto-updatestreamcontrol+json":{"source":"iana","compressible":true},"application/alto-updatestreamparams+json":{"source":"iana","compressible":true},"application/aml":{"source":"iana"},"application/andrew-inset":{"source":"iana","extensions":["ez"]},"application/applefile":{"source":"iana"},"application/applixware":{"source":"apache","extensions":["aw"]},"application/at+jwt":{"source":"iana"},"application/atf":{"source":"iana"},"application/atfx":{"source":"iana"},"application/atom+xml":{"source":"iana","compressible":true,"extensions":["atom"]},"application/atomcat+xml":{"source":"iana","compressible":true,"extensions":["atomcat"]},"application/atomdeleted+xml":{"source":"iana","compressible":true,"extensions":["atomdeleted"]},"application/atomicmail":{"source":"iana"},"application/atomsvc+xml":{"source":"iana","compressible":true,"extensions":["atomsvc"]},"application/atsc-dwd+xml":{"source":"iana","compressible":true,"extensions":["dwd"]},"application/atsc-dynamic-event-message":{"source":"iana"},"application/atsc-held+xml":{"source":"iana","compressible":true,"extensions":["held"]},"application/atsc-rdt+json":{"source":"iana","compressible":true},"application/atsc-rsat+xml":{"source":"iana","compressible":true,"extensions":["rsat"]},"application/atxml":{"source":"iana"},"application/auth-policy+xml":{"source":"iana","compressible":true},"application/bacnet-xdd+zip":{"source":"iana","compressible":false},"application/batch-smtp":{"source":"iana"},"application/bdoc":{"compressible":false,"extensions":["bdoc"]},"application/beep+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/calendar+json":{"source":"iana","compressible":true},"application/calendar+xml":{"source":"iana","compressible":true,"extensions":["xcs"]},"application/call-completion":{"source":"iana"},"application/cals-1840":{"source":"iana"},"application/captive+json":{"source":"iana","compressible":true},"application/cbor":{"source":"iana"},"application/cbor-seq":{"source":"iana"},"application/cccex":{"source":"iana"},"application/ccmp+xml":{"source":"iana","compressible":true},"application/ccxml+xml":{"source":"iana","compressible":true,"extensions":["ccxml"]},"application/cdfx+xml":{"source":"iana","compressible":true,"extensions":["cdfx"]},"application/cdmi-capability":{"source":"iana","extensions":["cdmia"]},"application/cdmi-container":{"source":"iana","extensions":["cdmic"]},"application/cdmi-domain":{"source":"iana","extensions":["cdmid"]},"application/cdmi-object":{"source":"iana","extensions":["cdmio"]},"application/cdmi-queue":{"source":"iana","extensions":["cdmiq"]},"application/cdni":{"source":"iana"},"application/cea":{"source":"iana"},"application/cea-2018+xml":{"source":"iana","compressible":true},"application/cellml+xml":{"source":"iana","compressible":true},"application/cfw":{"source":"iana"},"application/city+json":{"source":"iana","compressible":true},"application/clr":{"source":"iana"},"application/clue+xml":{"source":"iana","compressible":true},"application/clue_info+xml":{"source":"iana","compressible":true},"application/cms":{"source":"iana"},"application/cnrp+xml":{"source":"iana","compressible":true},"application/coap-group+json":{"source":"iana","compressible":true},"application/coap-payload":{"source":"iana"},"application/commonground":{"source":"iana"},"application/conference-info+xml":{"source":"iana","compressible":true},"application/cose":{"source":"iana"},"application/cose-key":{"source":"iana"},"application/cose-key-set":{"source":"iana"},"application/cpl+xml":{"source":"iana","compressible":true,"extensions":["cpl"]},"application/csrattrs":{"source":"iana"},"application/csta+xml":{"source":"iana","compressible":true},"application/cstadata+xml":{"source":"iana","compressible":true},"application/csvm+json":{"source":"iana","compressible":true},"application/cu-seeme":{"source":"apache","extensions":["cu"]},"application/cwt":{"source":"iana"},"application/cybercash":{"source":"iana"},"application/dart":{"compressible":true},"application/dash+xml":{"source":"iana","compressible":true,"extensions":["mpd"]},"application/dash-patch+xml":{"source":"iana","compressible":true,"extensions":["mpp"]},"application/dashdelta":{"source":"iana"},"application/davmount+xml":{"source":"iana","compressible":true,"extensions":["davmount"]},"application/dca-rft":{"source":"iana"},"application/dcd":{"source":"iana"},"application/dec-dx":{"source":"iana"},"application/dialog-info+xml":{"source":"iana","compressible":true},"application/dicom":{"source":"iana"},"application/dicom+json":{"source":"iana","compressible":true},"application/dicom+xml":{"source":"iana","compressible":true},"application/dii":{"source":"iana"},"application/dit":{"source":"iana"},"application/dns":{"source":"iana"},"application/dns+json":{"source":"iana","compressible":true},"application/dns-message":{"source":"iana"},"application/docbook+xml":{"source":"apache","compressible":true,"extensions":["dbk"]},"application/dots+cbor":{"source":"iana"},"application/dskpp+xml":{"source":"iana","compressible":true},"application/dssc+der":{"source":"iana","extensions":["dssc"]},"application/dssc+xml":{"source":"iana","compressible":true,"extensions":["xdssc"]},"application/dvcs":{"source":"iana"},"application/ecmascript":{"source":"iana","compressible":true,"extensions":["es","ecma"]},"application/edi-consent":{"source":"iana"},"application/edi-x12":{"source":"iana","compressible":false},"application/edifact":{"source":"iana","compressible":false},"application/efi":{"source":"iana"},"application/elm+json":{"source":"iana","charset":"UTF-8","compressible":true},"application/elm+xml":{"source":"iana","compressible":true},"application/emergencycalldata.cap+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/emergencycalldata.comment+xml":{"source":"iana","compressible":true},"application/emergencycalldata.control+xml":{"source":"iana","compressible":true},"application/emergencycalldata.deviceinfo+xml":{"source":"iana","compressible":true},"application/emergencycalldata.ecall.msd":{"source":"iana"},"application/emergencycalldata.providerinfo+xml":{"source":"iana","compressible":true},"application/emergencycalldata.serviceinfo+xml":{"source":"iana","compressible":true},"application/emergencycalldata.subscriberinfo+xml":{"source":"iana","compressible":true},"application/emergencycalldata.veds+xml":{"source":"iana","compressible":true},"application/emma+xml":{"source":"iana","compressible":true,"extensions":["emma"]},"application/emotionml+xml":{"source":"iana","compressible":true,"extensions":["emotionml"]},"application/encaprtp":{"source":"iana"},"application/epp+xml":{"source":"iana","compressible":true},"application/epub+zip":{"source":"iana","compressible":false,"extensions":["epub"]},"application/eshop":{"source":"iana"},"application/exi":{"source":"iana","extensions":["exi"]},"application/expect-ct-report+json":{"source":"iana","compressible":true},"application/express":{"source":"iana","extensions":["exp"]},"application/fastinfoset":{"source":"iana"},"application/fastsoap":{"source":"iana"},"application/fdt+xml":{"source":"iana","compressible":true,"extensions":["fdt"]},"application/fhir+json":{"source":"iana","charset":"UTF-8","compressible":true},"application/fhir+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/fido.trusted-apps+json":{"compressible":true},"application/fits":{"source":"iana"},"application/flexfec":{"source":"iana"},"application/font-sfnt":{"source":"iana"},"application/font-tdpfr":{"source":"iana","extensions":["pfr"]},"application/font-woff":{"source":"iana","compressible":false},"application/framework-attributes+xml":{"source":"iana","compressible":true},"application/geo+json":{"source":"iana","compressible":true,"extensions":["geojson"]},"application/geo+json-seq":{"source":"iana"},"application/geopackage+sqlite3":{"source":"iana"},"application/geoxacml+xml":{"source":"iana","compressible":true},"application/gltf-buffer":{"source":"iana"},"application/gml+xml":{"source":"iana","compressible":true,"extensions":["gml"]},"application/gpx+xml":{"source":"apache","compressible":true,"extensions":["gpx"]},"application/gxf":{"source":"apache","extensions":["gxf"]},"application/gzip":{"source":"iana","compressible":false,"extensions":["gz"]},"application/h224":{"source":"iana"},"application/held+xml":{"source":"iana","compressible":true},"application/hjson":{"extensions":["hjson"]},"application/http":{"source":"iana"},"application/hyperstudio":{"source":"iana","extensions":["stk"]},"application/ibe-key-request+xml":{"source":"iana","compressible":true},"application/ibe-pkg-reply+xml":{"source":"iana","compressible":true},"application/ibe-pp-data":{"source":"iana"},"application/iges":{"source":"iana"},"application/im-iscomposing+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/index":{"source":"iana"},"application/index.cmd":{"source":"iana"},"application/index.obj":{"source":"iana"},"application/index.response":{"source":"iana"},"application/index.vnd":{"source":"iana"},"application/inkml+xml":{"source":"iana","compressible":true,"extensions":["ink","inkml"]},"application/iotp":{"source":"iana"},"application/ipfix":{"source":"iana","extensions":["ipfix"]},"application/ipp":{"source":"iana"},"application/isup":{"source":"iana"},"application/its+xml":{"source":"iana","compressible":true,"extensions":["its"]},"application/java-archive":{"source":"apache","compressible":false,"extensions":["jar","war","ear"]},"application/java-serialized-object":{"source":"apache","compressible":false,"extensions":["ser"]},"application/java-vm":{"source":"apache","compressible":false,"extensions":["class"]},"application/javascript":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["js","mjs"]},"application/jf2feed+json":{"source":"iana","compressible":true},"application/jose":{"source":"iana"},"application/jose+json":{"source":"iana","compressible":true},"application/jrd+json":{"source":"iana","compressible":true},"application/jscalendar+json":{"source":"iana","compressible":true},"application/json":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["json","map"]},"application/json-patch+json":{"source":"iana","compressible":true},"application/json-seq":{"source":"iana"},"application/json5":{"extensions":["json5"]},"application/jsonml+json":{"source":"apache","compressible":true,"extensions":["jsonml"]},"application/jwk+json":{"source":"iana","compressible":true},"application/jwk-set+json":{"source":"iana","compressible":true},"application/jwt":{"source":"iana"},"application/kpml-request+xml":{"source":"iana","compressible":true},"application/kpml-response+xml":{"source":"iana","compressible":true},"application/ld+json":{"source":"iana","compressible":true,"extensions":["jsonld"]},"application/lgr+xml":{"source":"iana","compressible":true,"extensions":["lgr"]},"application/link-format":{"source":"iana"},"application/load-control+xml":{"source":"iana","compressible":true},"application/lost+xml":{"source":"iana","compressible":true,"extensions":["lostxml"]},"application/lostsync+xml":{"source":"iana","compressible":true},"application/lpf+zip":{"source":"iana","compressible":false},"application/lxf":{"source":"iana"},"application/mac-binhex40":{"source":"iana","extensions":["hqx"]},"application/mac-compactpro":{"source":"apache","extensions":["cpt"]},"application/macwriteii":{"source":"iana"},"application/mads+xml":{"source":"iana","compressible":true,"extensions":["mads"]},"application/manifest+json":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["webmanifest"]},"application/marc":{"source":"iana","extensions":["mrc"]},"application/marcxml+xml":{"source":"iana","compressible":true,"extensions":["mrcx"]},"application/mathematica":{"source":"iana","extensions":["ma","nb","mb"]},"application/mathml+xml":{"source":"iana","compressible":true,"extensions":["mathml"]},"application/mathml-content+xml":{"source":"iana","compressible":true},"application/mathml-presentation+xml":{"source":"iana","compressible":true},"application/mbms-associated-procedure-description+xml":{"source":"iana","compressible":true},"application/mbms-deregister+xml":{"source":"iana","compressible":true},"application/mbms-envelope+xml":{"source":"iana","compressible":true},"application/mbms-msk+xml":{"source":"iana","compressible":true},"application/mbms-msk-response+xml":{"source":"iana","compressible":true},"application/mbms-protection-description+xml":{"source":"iana","compressible":true},"application/mbms-reception-report+xml":{"source":"iana","compressible":true},"application/mbms-register+xml":{"source":"iana","compressible":true},"application/mbms-register-response+xml":{"source":"iana","compressible":true},"application/mbms-schedule+xml":{"source":"iana","compressible":true},"application/mbms-user-service-description+xml":{"source":"iana","compressible":true},"application/mbox":{"source":"iana","extensions":["mbox"]},"application/media-policy-dataset+xml":{"source":"iana","compressible":true,"extensions":["mpf"]},"application/media_control+xml":{"source":"iana","compressible":true},"application/mediaservercontrol+xml":{"source":"iana","compressible":true,"extensions":["mscml"]},"application/merge-patch+json":{"source":"iana","compressible":true},"application/metalink+xml":{"source":"apache","compressible":true,"extensions":["metalink"]},"application/metalink4+xml":{"source":"iana","compressible":true,"extensions":["meta4"]},"application/mets+xml":{"source":"iana","compressible":true,"extensions":["mets"]},"application/mf4":{"source":"iana"},"application/mikey":{"source":"iana"},"application/mipc":{"source":"iana"},"application/missing-blocks+cbor-seq":{"source":"iana"},"application/mmt-aei+xml":{"source":"iana","compressible":true,"extensions":["maei"]},"application/mmt-usd+xml":{"source":"iana","compressible":true,"extensions":["musd"]},"application/mods+xml":{"source":"iana","compressible":true,"extensions":["mods"]},"application/moss-keys":{"source":"iana"},"application/moss-signature":{"source":"iana"},"application/mosskey-data":{"source":"iana"},"application/mosskey-request":{"source":"iana"},"application/mp21":{"source":"iana","extensions":["m21","mp21"]},"application/mp4":{"source":"iana","extensions":["mp4s","m4p"]},"application/mpeg4-generic":{"source":"iana"},"application/mpeg4-iod":{"source":"iana"},"application/mpeg4-iod-xmt":{"source":"iana"},"application/mrb-consumer+xml":{"source":"iana","compressible":true},"application/mrb-publish+xml":{"source":"iana","compressible":true},"application/msc-ivr+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/msc-mixer+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/msword":{"source":"iana","compressible":false,"extensions":["doc","dot"]},"application/mud+json":{"source":"iana","compressible":true},"application/multipart-core":{"source":"iana"},"application/mxf":{"source":"iana","extensions":["mxf"]},"application/n-quads":{"source":"iana","extensions":["nq"]},"application/n-triples":{"source":"iana","extensions":["nt"]},"application/nasdata":{"source":"iana"},"application/news-checkgroups":{"source":"iana","charset":"US-ASCII"},"application/news-groupinfo":{"source":"iana","charset":"US-ASCII"},"application/news-transmission":{"source":"iana"},"application/nlsml+xml":{"source":"iana","compressible":true},"application/node":{"source":"iana","extensions":["cjs"]},"application/nss":{"source":"iana"},"application/oauth-authz-req+jwt":{"source":"iana"},"application/oblivious-dns-message":{"source":"iana"},"application/ocsp-request":{"source":"iana"},"application/ocsp-response":{"source":"iana"},"application/octet-stream":{"source":"iana","compressible":false,"extensions":["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"]},"application/oda":{"source":"iana","extensions":["oda"]},"application/odm+xml":{"source":"iana","compressible":true},"application/odx":{"source":"iana"},"application/oebps-package+xml":{"source":"iana","compressible":true,"extensions":["opf"]},"application/ogg":{"source":"iana","compressible":false,"extensions":["ogx"]},"application/omdoc+xml":{"source":"apache","compressible":true,"extensions":["omdoc"]},"application/onenote":{"source":"apache","extensions":["onetoc","onetoc2","onetmp","onepkg"]},"application/opc-nodeset+xml":{"source":"iana","compressible":true},"application/oscore":{"source":"iana"},"application/oxps":{"source":"iana","extensions":["oxps"]},"application/p21":{"source":"iana"},"application/p21+zip":{"source":"iana","compressible":false},"application/p2p-overlay+xml":{"source":"iana","compressible":true,"extensions":["relo"]},"application/parityfec":{"source":"iana"},"application/passport":{"source":"iana"},"application/patch-ops-error+xml":{"source":"iana","compressible":true,"extensions":["xer"]},"application/pdf":{"source":"iana","compressible":false,"extensions":["pdf"]},"application/pdx":{"source":"iana"},"application/pem-certificate-chain":{"source":"iana"},"application/pgp-encrypted":{"source":"iana","compressible":false,"extensions":["pgp"]},"application/pgp-keys":{"source":"iana","extensions":["asc"]},"application/pgp-signature":{"source":"iana","extensions":["asc","sig"]},"application/pics-rules":{"source":"apache","extensions":["prf"]},"application/pidf+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/pidf-diff+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/pkcs10":{"source":"iana","extensions":["p10"]},"application/pkcs12":{"source":"iana"},"application/pkcs7-mime":{"source":"iana","extensions":["p7m","p7c"]},"application/pkcs7-signature":{"source":"iana","extensions":["p7s"]},"application/pkcs8":{"source":"iana","extensions":["p8"]},"application/pkcs8-encrypted":{"source":"iana"},"application/pkix-attr-cert":{"source":"iana","extensions":["ac"]},"application/pkix-cert":{"source":"iana","extensions":["cer"]},"application/pkix-crl":{"source":"iana","extensions":["crl"]},"application/pkix-pkipath":{"source":"iana","extensions":["pkipath"]},"application/pkixcmp":{"source":"iana","extensions":["pki"]},"application/pls+xml":{"source":"iana","compressible":true,"extensions":["pls"]},"application/poc-settings+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/postscript":{"source":"iana","compressible":true,"extensions":["ai","eps","ps"]},"application/ppsp-tracker+json":{"source":"iana","compressible":true},"application/problem+json":{"source":"iana","compressible":true},"application/problem+xml":{"source":"iana","compressible":true},"application/provenance+xml":{"source":"iana","compressible":true,"extensions":["provx"]},"application/prs.alvestrand.titrax-sheet":{"source":"iana"},"application/prs.cww":{"source":"iana","extensions":["cww"]},"application/prs.cyn":{"source":"iana","charset":"7-BIT"},"application/prs.hpub+zip":{"source":"iana","compressible":false},"application/prs.nprend":{"source":"iana"},"application/prs.plucker":{"source":"iana"},"application/prs.rdf-xml-crypt":{"source":"iana"},"application/prs.xsf+xml":{"source":"iana","compressible":true},"application/pskc+xml":{"source":"iana","compressible":true,"extensions":["pskcxml"]},"application/pvd+json":{"source":"iana","compressible":true},"application/qsig":{"source":"iana"},"application/raml+yaml":{"compressible":true,"extensions":["raml"]},"application/raptorfec":{"source":"iana"},"application/rdap+json":{"source":"iana","compressible":true},"application/rdf+xml":{"source":"iana","compressible":true,"extensions":["rdf","owl"]},"application/reginfo+xml":{"source":"iana","compressible":true,"extensions":["rif"]},"application/relax-ng-compact-syntax":{"source":"iana","extensions":["rnc"]},"application/remote-printing":{"source":"iana"},"application/reputon+json":{"source":"iana","compressible":true},"application/resource-lists+xml":{"source":"iana","compressible":true,"extensions":["rl"]},"application/resource-lists-diff+xml":{"source":"iana","compressible":true,"extensions":["rld"]},"application/rfc+xml":{"source":"iana","compressible":true},"application/riscos":{"source":"iana"},"application/rlmi+xml":{"source":"iana","compressible":true},"application/rls-services+xml":{"source":"iana","compressible":true,"extensions":["rs"]},"application/route-apd+xml":{"source":"iana","compressible":true,"extensions":["rapd"]},"application/route-s-tsid+xml":{"source":"iana","compressible":true,"extensions":["sls"]},"application/route-usd+xml":{"source":"iana","compressible":true,"extensions":["rusd"]},"application/rpki-ghostbusters":{"source":"iana","extensions":["gbr"]},"application/rpki-manifest":{"source":"iana","extensions":["mft"]},"application/rpki-publication":{"source":"iana"},"application/rpki-roa":{"source":"iana","extensions":["roa"]},"application/rpki-updown":{"source":"iana"},"application/rsd+xml":{"source":"apache","compressible":true,"extensions":["rsd"]},"application/rss+xml":{"source":"apache","compressible":true,"extensions":["rss"]},"application/rtf":{"source":"iana","compressible":true,"extensions":["rtf"]},"application/rtploopback":{"source":"iana"},"application/rtx":{"source":"iana"},"application/samlassertion+xml":{"source":"iana","compressible":true},"application/samlmetadata+xml":{"source":"iana","compressible":true},"application/sarif+json":{"source":"iana","compressible":true},"application/sarif-external-properties+json":{"source":"iana","compressible":true},"application/sbe":{"source":"iana"},"application/sbml+xml":{"source":"iana","compressible":true,"extensions":["sbml"]},"application/scaip+xml":{"source":"iana","compressible":true},"application/scim+json":{"source":"iana","compressible":true},"application/scvp-cv-request":{"source":"iana","extensions":["scq"]},"application/scvp-cv-response":{"source":"iana","extensions":["scs"]},"application/scvp-vp-request":{"source":"iana","extensions":["spq"]},"application/scvp-vp-response":{"source":"iana","extensions":["spp"]},"application/sdp":{"source":"iana","extensions":["sdp"]},"application/secevent+jwt":{"source":"iana"},"application/senml+cbor":{"source":"iana"},"application/senml+json":{"source":"iana","compressible":true},"application/senml+xml":{"source":"iana","compressible":true,"extensions":["senmlx"]},"application/senml-etch+cbor":{"source":"iana"},"application/senml-etch+json":{"source":"iana","compressible":true},"application/senml-exi":{"source":"iana"},"application/sensml+cbor":{"source":"iana"},"application/sensml+json":{"source":"iana","compressible":true},"application/sensml+xml":{"source":"iana","compressible":true,"extensions":["sensmlx"]},"application/sensml-exi":{"source":"iana"},"application/sep+xml":{"source":"iana","compressible":true},"application/sep-exi":{"source":"iana"},"application/session-info":{"source":"iana"},"application/set-payment":{"source":"iana"},"application/set-payment-initiation":{"source":"iana","extensions":["setpay"]},"application/set-registration":{"source":"iana"},"application/set-registration-initiation":{"source":"iana","extensions":["setreg"]},"application/sgml":{"source":"iana"},"application/sgml-open-catalog":{"source":"iana"},"application/shf+xml":{"source":"iana","compressible":true,"extensions":["shf"]},"application/sieve":{"source":"iana","extensions":["siv","sieve"]},"application/simple-filter+xml":{"source":"iana","compressible":true},"application/simple-message-summary":{"source":"iana"},"application/simplesymbolcontainer":{"source":"iana"},"application/sipc":{"source":"iana"},"application/slate":{"source":"iana"},"application/smil":{"source":"iana"},"application/smil+xml":{"source":"iana","compressible":true,"extensions":["smi","smil"]},"application/smpte336m":{"source":"iana"},"application/soap+fastinfoset":{"source":"iana"},"application/soap+xml":{"source":"iana","compressible":true},"application/sparql-query":{"source":"iana","extensions":["rq"]},"application/sparql-results+xml":{"source":"iana","compressible":true,"extensions":["srx"]},"application/spdx+json":{"source":"iana","compressible":true},"application/spirits-event+xml":{"source":"iana","compressible":true},"application/sql":{"source":"iana"},"application/srgs":{"source":"iana","extensions":["gram"]},"application/srgs+xml":{"source":"iana","compressible":true,"extensions":["grxml"]},"application/sru+xml":{"source":"iana","compressible":true,"extensions":["sru"]},"application/ssdl+xml":{"source":"apache","compressible":true,"extensions":["ssdl"]},"application/ssml+xml":{"source":"iana","compressible":true,"extensions":["ssml"]},"application/stix+json":{"source":"iana","compressible":true},"application/swid+xml":{"source":"iana","compressible":true,"extensions":["swidtag"]},"application/tamp-apex-update":{"source":"iana"},"application/tamp-apex-update-confirm":{"source":"iana"},"application/tamp-community-update":{"source":"iana"},"application/tamp-community-update-confirm":{"source":"iana"},"application/tamp-error":{"source":"iana"},"application/tamp-sequence-adjust":{"source":"iana"},"application/tamp-sequence-adjust-confirm":{"source":"iana"},"application/tamp-status-query":{"source":"iana"},"application/tamp-status-response":{"source":"iana"},"application/tamp-update":{"source":"iana"},"application/tamp-update-confirm":{"source":"iana"},"application/tar":{"compressible":true},"application/taxii+json":{"source":"iana","compressible":true},"application/td+json":{"source":"iana","compressible":true},"application/tei+xml":{"source":"iana","compressible":true,"extensions":["tei","teicorpus"]},"application/tetra_isi":{"source":"iana"},"application/thraud+xml":{"source":"iana","compressible":true,"extensions":["tfi"]},"application/timestamp-query":{"source":"iana"},"application/timestamp-reply":{"source":"iana"},"application/timestamped-data":{"source":"iana","extensions":["tsd"]},"application/tlsrpt+gzip":{"source":"iana"},"application/tlsrpt+json":{"source":"iana","compressible":true},"application/tnauthlist":{"source":"iana"},"application/token-introspection+jwt":{"source":"iana"},"application/toml":{"compressible":true,"extensions":["toml"]},"application/trickle-ice-sdpfrag":{"source":"iana"},"application/trig":{"source":"iana","extensions":["trig"]},"application/ttml+xml":{"source":"iana","compressible":true,"extensions":["ttml"]},"application/tve-trigger":{"source":"iana"},"application/tzif":{"source":"iana"},"application/tzif-leap":{"source":"iana"},"application/ubjson":{"compressible":false,"extensions":["ubj"]},"application/ulpfec":{"source":"iana"},"application/urc-grpsheet+xml":{"source":"iana","compressible":true},"application/urc-ressheet+xml":{"source":"iana","compressible":true,"extensions":["rsheet"]},"application/urc-targetdesc+xml":{"source":"iana","compressible":true,"extensions":["td"]},"application/urc-uisocketdesc+xml":{"source":"iana","compressible":true},"application/vcard+json":{"source":"iana","compressible":true},"application/vcard+xml":{"source":"iana","compressible":true},"application/vemmi":{"source":"iana"},"application/vividence.scriptfile":{"source":"apache"},"application/vnd.1000minds.decision-model+xml":{"source":"iana","compressible":true,"extensions":["1km"]},"application/vnd.3gpp-prose+xml":{"source":"iana","compressible":true},"application/vnd.3gpp-prose-pc3ch+xml":{"source":"iana","compressible":true},"application/vnd.3gpp-v2x-local-service-information":{"source":"iana"},"application/vnd.3gpp.5gnas":{"source":"iana"},"application/vnd.3gpp.access-transfer-events+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.bsf+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.gmop+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.gtpc":{"source":"iana"},"application/vnd.3gpp.interworking-data":{"source":"iana"},"application/vnd.3gpp.lpp":{"source":"iana"},"application/vnd.3gpp.mc-signalling-ear":{"source":"iana"},"application/vnd.3gpp.mcdata-affiliation-command+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcdata-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcdata-payload":{"source":"iana"},"application/vnd.3gpp.mcdata-service-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcdata-signalling":{"source":"iana"},"application/vnd.3gpp.mcdata-ue-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcdata-user-profile+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-affiliation-command+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-floor-request+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-location-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-mbms-usage-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-service-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-signed+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-ue-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-ue-init-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-user-profile+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-affiliation-command+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-affiliation-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-location-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-mbms-usage-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-service-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-transmission-request+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-ue-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-user-profile+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mid-call+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.ngap":{"source":"iana"},"application/vnd.3gpp.pfcp":{"source":"iana"},"application/vnd.3gpp.pic-bw-large":{"source":"iana","extensions":["plb"]},"application/vnd.3gpp.pic-bw-small":{"source":"iana","extensions":["psb"]},"application/vnd.3gpp.pic-bw-var":{"source":"iana","extensions":["pvb"]},"application/vnd.3gpp.s1ap":{"source":"iana"},"application/vnd.3gpp.sms":{"source":"iana"},"application/vnd.3gpp.sms+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.srvcc-ext+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.srvcc-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.state-and-event-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.ussd+xml":{"source":"iana","compressible":true},"application/vnd.3gpp2.bcmcsinfo+xml":{"source":"iana","compressible":true},"application/vnd.3gpp2.sms":{"source":"iana"},"application/vnd.3gpp2.tcap":{"source":"iana","extensions":["tcap"]},"application/vnd.3lightssoftware.imagescal":{"source":"iana"},"application/vnd.3m.post-it-notes":{"source":"iana","extensions":["pwn"]},"application/vnd.accpac.simply.aso":{"source":"iana","extensions":["aso"]},"application/vnd.accpac.simply.imp":{"source":"iana","extensions":["imp"]},"application/vnd.acucobol":{"source":"iana","extensions":["acu"]},"application/vnd.acucorp":{"source":"iana","extensions":["atc","acutc"]},"application/vnd.adobe.air-application-installer-package+zip":{"source":"apache","compressible":false,"extensions":["air"]},"application/vnd.adobe.flash.movie":{"source":"iana"},"application/vnd.adobe.formscentral.fcdt":{"source":"iana","extensions":["fcdt"]},"application/vnd.adobe.fxp":{"source":"iana","extensions":["fxp","fxpl"]},"application/vnd.adobe.partial-upload":{"source":"iana"},"application/vnd.adobe.xdp+xml":{"source":"iana","compressible":true,"extensions":["xdp"]},"application/vnd.adobe.xfdf":{"source":"iana","extensions":["xfdf"]},"application/vnd.aether.imp":{"source":"iana"},"application/vnd.afpc.afplinedata":{"source":"iana"},"application/vnd.afpc.afplinedata-pagedef":{"source":"iana"},"application/vnd.afpc.cmoca-cmresource":{"source":"iana"},"application/vnd.afpc.foca-charset":{"source":"iana"},"application/vnd.afpc.foca-codedfont":{"source":"iana"},"application/vnd.afpc.foca-codepage":{"source":"iana"},"application/vnd.afpc.modca":{"source":"iana"},"application/vnd.afpc.modca-cmtable":{"source":"iana"},"application/vnd.afpc.modca-formdef":{"source":"iana"},"application/vnd.afpc.modca-mediummap":{"source":"iana"},"application/vnd.afpc.modca-objectcontainer":{"source":"iana"},"application/vnd.afpc.modca-overlay":{"source":"iana"},"application/vnd.afpc.modca-pagesegment":{"source":"iana"},"application/vnd.age":{"source":"iana","extensions":["age"]},"application/vnd.ah-barcode":{"source":"iana"},"application/vnd.ahead.space":{"source":"iana","extensions":["ahead"]},"application/vnd.airzip.filesecure.azf":{"source":"iana","extensions":["azf"]},"application/vnd.airzip.filesecure.azs":{"source":"iana","extensions":["azs"]},"application/vnd.amadeus+json":{"source":"iana","compressible":true},"application/vnd.amazon.ebook":{"source":"apache","extensions":["azw"]},"application/vnd.amazon.mobi8-ebook":{"source":"iana"},"application/vnd.americandynamics.acc":{"source":"iana","extensions":["acc"]},"application/vnd.amiga.ami":{"source":"iana","extensions":["ami"]},"application/vnd.amundsen.maze+xml":{"source":"iana","compressible":true},"application/vnd.android.ota":{"source":"iana"},"application/vnd.android.package-archive":{"source":"apache","compressible":false,"extensions":["apk"]},"application/vnd.anki":{"source":"iana"},"application/vnd.anser-web-certificate-issue-initiation":{"source":"iana","extensions":["cii"]},"application/vnd.anser-web-funds-transfer-initiation":{"source":"apache","extensions":["fti"]},"application/vnd.antix.game-component":{"source":"iana","extensions":["atx"]},"application/vnd.apache.arrow.file":{"source":"iana"},"application/vnd.apache.arrow.stream":{"source":"iana"},"application/vnd.apache.thrift.binary":{"source":"iana"},"application/vnd.apache.thrift.compact":{"source":"iana"},"application/vnd.apache.thrift.json":{"source":"iana"},"application/vnd.api+json":{"source":"iana","compressible":true},"application/vnd.aplextor.warrp+json":{"source":"iana","compressible":true},"application/vnd.apothekende.reservation+json":{"source":"iana","compressible":true},"application/vnd.apple.installer+xml":{"source":"iana","compressible":true,"extensions":["mpkg"]},"application/vnd.apple.keynote":{"source":"iana","extensions":["key"]},"application/vnd.apple.mpegurl":{"source":"iana","extensions":["m3u8"]},"application/vnd.apple.numbers":{"source":"iana","extensions":["numbers"]},"application/vnd.apple.pages":{"source":"iana","extensions":["pages"]},"application/vnd.apple.pkpass":{"compressible":false,"extensions":["pkpass"]},"application/vnd.arastra.swi":{"source":"iana"},"application/vnd.aristanetworks.swi":{"source":"iana","extensions":["swi"]},"application/vnd.artisan+json":{"source":"iana","compressible":true},"application/vnd.artsquare":{"source":"iana"},"application/vnd.astraea-software.iota":{"source":"iana","extensions":["iota"]},"application/vnd.audiograph":{"source":"iana","extensions":["aep"]},"application/vnd.autopackage":{"source":"iana"},"application/vnd.avalon+json":{"source":"iana","compressible":true},"application/vnd.avistar+xml":{"source":"iana","compressible":true},"application/vnd.balsamiq.bmml+xml":{"source":"iana","compressible":true,"extensions":["bmml"]},"application/vnd.balsamiq.bmpr":{"source":"iana"},"application/vnd.banana-accounting":{"source":"iana"},"application/vnd.bbf.usp.error":{"source":"iana"},"application/vnd.bbf.usp.msg":{"source":"iana"},"application/vnd.bbf.usp.msg+json":{"source":"iana","compressible":true},"application/vnd.bekitzur-stech+json":{"source":"iana","compressible":true},"application/vnd.bint.med-content":{"source":"iana"},"application/vnd.biopax.rdf+xml":{"source":"iana","compressible":true},"application/vnd.blink-idb-value-wrapper":{"source":"iana"},"application/vnd.blueice.multipass":{"source":"iana","extensions":["mpm"]},"application/vnd.bluetooth.ep.oob":{"source":"iana"},"application/vnd.bluetooth.le.oob":{"source":"iana"},"application/vnd.bmi":{"source":"iana","extensions":["bmi"]},"application/vnd.bpf":{"source":"iana"},"application/vnd.bpf3":{"source":"iana"},"application/vnd.businessobjects":{"source":"iana","extensions":["rep"]},"application/vnd.byu.uapi+json":{"source":"iana","compressible":true},"application/vnd.cab-jscript":{"source":"iana"},"application/vnd.canon-cpdl":{"source":"iana"},"application/vnd.canon-lips":{"source":"iana"},"application/vnd.capasystems-pg+json":{"source":"iana","compressible":true},"application/vnd.cendio.thinlinc.clientconf":{"source":"iana"},"application/vnd.century-systems.tcp_stream":{"source":"iana"},"application/vnd.chemdraw+xml":{"source":"iana","compressible":true,"extensions":["cdxml"]},"application/vnd.chess-pgn":{"source":"iana"},"application/vnd.chipnuts.karaoke-mmd":{"source":"iana","extensions":["mmd"]},"application/vnd.ciedi":{"source":"iana"},"application/vnd.cinderella":{"source":"iana","extensions":["cdy"]},"application/vnd.cirpack.isdn-ext":{"source":"iana"},"application/vnd.citationstyles.style+xml":{"source":"iana","compressible":true,"extensions":["csl"]},"application/vnd.claymore":{"source":"iana","extensions":["cla"]},"application/vnd.cloanto.rp9":{"source":"iana","extensions":["rp9"]},"application/vnd.clonk.c4group":{"source":"iana","extensions":["c4g","c4d","c4f","c4p","c4u"]},"application/vnd.cluetrust.cartomobile-config":{"source":"iana","extensions":["c11amc"]},"application/vnd.cluetrust.cartomobile-config-pkg":{"source":"iana","extensions":["c11amz"]},"application/vnd.coffeescript":{"source":"iana"},"application/vnd.collabio.xodocuments.document":{"source":"iana"},"application/vnd.collabio.xodocuments.document-template":{"source":"iana"},"application/vnd.collabio.xodocuments.presentation":{"source":"iana"},"application/vnd.collabio.xodocuments.presentation-template":{"source":"iana"},"application/vnd.collabio.xodocuments.spreadsheet":{"source":"iana"},"application/vnd.collabio.xodocuments.spreadsheet-template":{"source":"iana"},"application/vnd.collection+json":{"source":"iana","compressible":true},"application/vnd.collection.doc+json":{"source":"iana","compressible":true},"application/vnd.collection.next+json":{"source":"iana","compressible":true},"application/vnd.comicbook+zip":{"source":"iana","compressible":false},"application/vnd.comicbook-rar":{"source":"iana"},"application/vnd.commerce-battelle":{"source":"iana"},"application/vnd.commonspace":{"source":"iana","extensions":["csp"]},"application/vnd.contact.cmsg":{"source":"iana","extensions":["cdbcmsg"]},"application/vnd.coreos.ignition+json":{"source":"iana","compressible":true},"application/vnd.cosmocaller":{"source":"iana","extensions":["cmc"]},"application/vnd.crick.clicker":{"source":"iana","extensions":["clkx"]},"application/vnd.crick.clicker.keyboard":{"source":"iana","extensions":["clkk"]},"application/vnd.crick.clicker.palette":{"source":"iana","extensions":["clkp"]},"application/vnd.crick.clicker.template":{"source":"iana","extensions":["clkt"]},"application/vnd.crick.clicker.wordbank":{"source":"iana","extensions":["clkw"]},"application/vnd.criticaltools.wbs+xml":{"source":"iana","compressible":true,"extensions":["wbs"]},"application/vnd.cryptii.pipe+json":{"source":"iana","compressible":true},"application/vnd.crypto-shade-file":{"source":"iana"},"application/vnd.cryptomator.encrypted":{"source":"iana"},"application/vnd.cryptomator.vault":{"source":"iana"},"application/vnd.ctc-posml":{"source":"iana","extensions":["pml"]},"application/vnd.ctct.ws+xml":{"source":"iana","compressible":true},"application/vnd.cups-pdf":{"source":"iana"},"application/vnd.cups-postscript":{"source":"iana"},"application/vnd.cups-ppd":{"source":"iana","extensions":["ppd"]},"application/vnd.cups-raster":{"source":"iana"},"application/vnd.cups-raw":{"source":"iana"},"application/vnd.curl":{"source":"iana"},"application/vnd.curl.car":{"source":"apache","extensions":["car"]},"application/vnd.curl.pcurl":{"source":"apache","extensions":["pcurl"]},"application/vnd.cyan.dean.root+xml":{"source":"iana","compressible":true},"application/vnd.cybank":{"source":"iana"},"application/vnd.cyclonedx+json":{"source":"iana","compressible":true},"application/vnd.cyclonedx+xml":{"source":"iana","compressible":true},"application/vnd.d2l.coursepackage1p0+zip":{"source":"iana","compressible":false},"application/vnd.d3m-dataset":{"source":"iana"},"application/vnd.d3m-problem":{"source":"iana"},"application/vnd.dart":{"source":"iana","compressible":true,"extensions":["dart"]},"application/vnd.data-vision.rdz":{"source":"iana","extensions":["rdz"]},"application/vnd.datapackage+json":{"source":"iana","compressible":true},"application/vnd.dataresource+json":{"source":"iana","compressible":true},"application/vnd.dbf":{"source":"iana","extensions":["dbf"]},"application/vnd.debian.binary-package":{"source":"iana"},"application/vnd.dece.data":{"source":"iana","extensions":["uvf","uvvf","uvd","uvvd"]},"application/vnd.dece.ttml+xml":{"source":"iana","compressible":true,"extensions":["uvt","uvvt"]},"application/vnd.dece.unspecified":{"source":"iana","extensions":["uvx","uvvx"]},"application/vnd.dece.zip":{"source":"iana","extensions":["uvz","uvvz"]},"application/vnd.denovo.fcselayout-link":{"source":"iana","extensions":["fe_launch"]},"application/vnd.desmume.movie":{"source":"iana"},"application/vnd.dir-bi.plate-dl-nosuffix":{"source":"iana"},"application/vnd.dm.delegation+xml":{"source":"iana","compressible":true},"application/vnd.dna":{"source":"iana","extensions":["dna"]},"application/vnd.document+json":{"source":"iana","compressible":true},"application/vnd.dolby.mlp":{"source":"apache","extensions":["mlp"]},"application/vnd.dolby.mobile.1":{"source":"iana"},"application/vnd.dolby.mobile.2":{"source":"iana"},"application/vnd.doremir.scorecloud-binary-document":{"source":"iana"},"application/vnd.dpgraph":{"source":"iana","extensions":["dpg"]},"application/vnd.dreamfactory":{"source":"iana","extensions":["dfac"]},"application/vnd.drive+json":{"source":"iana","compressible":true},"application/vnd.ds-keypoint":{"source":"apache","extensions":["kpxx"]},"application/vnd.dtg.local":{"source":"iana"},"application/vnd.dtg.local.flash":{"source":"iana"},"application/vnd.dtg.local.html":{"source":"iana"},"application/vnd.dvb.ait":{"source":"iana","extensions":["ait"]},"application/vnd.dvb.dvbisl+xml":{"source":"iana","compressible":true},"application/vnd.dvb.dvbj":{"source":"iana"},"application/vnd.dvb.esgcontainer":{"source":"iana"},"application/vnd.dvb.ipdcdftnotifaccess":{"source":"iana"},"application/vnd.dvb.ipdcesgaccess":{"source":"iana"},"application/vnd.dvb.ipdcesgaccess2":{"source":"iana"},"application/vnd.dvb.ipdcesgpdd":{"source":"iana"},"application/vnd.dvb.ipdcroaming":{"source":"iana"},"application/vnd.dvb.iptv.alfec-base":{"source":"iana"},"application/vnd.dvb.iptv.alfec-enhancement":{"source":"iana"},"application/vnd.dvb.notif-aggregate-root+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-container+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-generic+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-ia-msglist+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-ia-registration-request+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-ia-registration-response+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-init+xml":{"source":"iana","compressible":true},"application/vnd.dvb.pfr":{"source":"iana"},"application/vnd.dvb.service":{"source":"iana","extensions":["svc"]},"application/vnd.dxr":{"source":"iana"},"application/vnd.dynageo":{"source":"iana","extensions":["geo"]},"application/vnd.dzr":{"source":"iana"},"application/vnd.easykaraoke.cdgdownload":{"source":"iana"},"application/vnd.ecdis-update":{"source":"iana"},"application/vnd.ecip.rlp":{"source":"iana"},"application/vnd.eclipse.ditto+json":{"source":"iana","compressible":true},"application/vnd.ecowin.chart":{"source":"iana","extensions":["mag"]},"application/vnd.ecowin.filerequest":{"source":"iana"},"application/vnd.ecowin.fileupdate":{"source":"iana"},"application/vnd.ecowin.series":{"source":"iana"},"application/vnd.ecowin.seriesrequest":{"source":"iana"},"application/vnd.ecowin.seriesupdate":{"source":"iana"},"application/vnd.efi.img":{"source":"iana"},"application/vnd.efi.iso":{"source":"iana"},"application/vnd.emclient.accessrequest+xml":{"source":"iana","compressible":true},"application/vnd.enliven":{"source":"iana","extensions":["nml"]},"application/vnd.enphase.envoy":{"source":"iana"},"application/vnd.eprints.data+xml":{"source":"iana","compressible":true},"application/vnd.epson.esf":{"source":"iana","extensions":["esf"]},"application/vnd.epson.msf":{"source":"iana","extensions":["msf"]},"application/vnd.epson.quickanime":{"source":"iana","extensions":["qam"]},"application/vnd.epson.salt":{"source":"iana","extensions":["slt"]},"application/vnd.epson.ssf":{"source":"iana","extensions":["ssf"]},"application/vnd.ericsson.quickcall":{"source":"iana"},"application/vnd.espass-espass+zip":{"source":"iana","compressible":false},"application/vnd.eszigno3+xml":{"source":"iana","compressible":true,"extensions":["es3","et3"]},"application/vnd.etsi.aoc+xml":{"source":"iana","compressible":true},"application/vnd.etsi.asic-e+zip":{"source":"iana","compressible":false},"application/vnd.etsi.asic-s+zip":{"source":"iana","compressible":false},"application/vnd.etsi.cug+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvcommand+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvdiscovery+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvprofile+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvsad-bc+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvsad-cod+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvsad-npvr+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvservice+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvsync+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvueprofile+xml":{"source":"iana","compressible":true},"application/vnd.etsi.mcid+xml":{"source":"iana","compressible":true},"application/vnd.etsi.mheg5":{"source":"iana"},"application/vnd.etsi.overload-control-policy-dataset+xml":{"source":"iana","compressible":true},"application/vnd.etsi.pstn+xml":{"source":"iana","compressible":true},"application/vnd.etsi.sci+xml":{"source":"iana","compressible":true},"application/vnd.etsi.simservs+xml":{"source":"iana","compressible":true},"application/vnd.etsi.timestamp-token":{"source":"iana"},"application/vnd.etsi.tsl+xml":{"source":"iana","compressible":true},"application/vnd.etsi.tsl.der":{"source":"iana"},"application/vnd.eu.kasparian.car+json":{"source":"iana","compressible":true},"application/vnd.eudora.data":{"source":"iana"},"application/vnd.evolv.ecig.profile":{"source":"iana"},"application/vnd.evolv.ecig.settings":{"source":"iana"},"application/vnd.evolv.ecig.theme":{"source":"iana"},"application/vnd.exstream-empower+zip":{"source":"iana","compressible":false},"application/vnd.exstream-package":{"source":"iana"},"application/vnd.ezpix-album":{"source":"iana","extensions":["ez2"]},"application/vnd.ezpix-package":{"source":"iana","extensions":["ez3"]},"application/vnd.f-secure.mobile":{"source":"iana"},"application/vnd.familysearch.gedcom+zip":{"source":"iana","compressible":false},"application/vnd.fastcopy-disk-image":{"source":"iana"},"application/vnd.fdf":{"source":"iana","extensions":["fdf"]},"application/vnd.fdsn.mseed":{"source":"iana","extensions":["mseed"]},"application/vnd.fdsn.seed":{"source":"iana","extensions":["seed","dataless"]},"application/vnd.ffsns":{"source":"iana"},"application/vnd.ficlab.flb+zip":{"source":"iana","compressible":false},"application/vnd.filmit.zfc":{"source":"iana"},"application/vnd.fints":{"source":"iana"},"application/vnd.firemonkeys.cloudcell":{"source":"iana"},"application/vnd.flographit":{"source":"iana","extensions":["gph"]},"application/vnd.fluxtime.clip":{"source":"iana","extensions":["ftc"]},"application/vnd.font-fontforge-sfd":{"source":"iana"},"application/vnd.framemaker":{"source":"iana","extensions":["fm","frame","maker","book"]},"application/vnd.frogans.fnc":{"source":"iana","extensions":["fnc"]},"application/vnd.frogans.ltf":{"source":"iana","extensions":["ltf"]},"application/vnd.fsc.weblaunch":{"source":"iana","extensions":["fsc"]},"application/vnd.fujifilm.fb.docuworks":{"source":"iana"},"application/vnd.fujifilm.fb.docuworks.binder":{"source":"iana"},"application/vnd.fujifilm.fb.docuworks.container":{"source":"iana"},"application/vnd.fujifilm.fb.jfi+xml":{"source":"iana","compressible":true},"application/vnd.fujitsu.oasys":{"source":"iana","extensions":["oas"]},"application/vnd.fujitsu.oasys2":{"source":"iana","extensions":["oa2"]},"application/vnd.fujitsu.oasys3":{"source":"iana","extensions":["oa3"]},"application/vnd.fujitsu.oasysgp":{"source":"iana","extensions":["fg5"]},"application/vnd.fujitsu.oasysprs":{"source":"iana","extensions":["bh2"]},"application/vnd.fujixerox.art-ex":{"source":"iana"},"application/vnd.fujixerox.art4":{"source":"iana"},"application/vnd.fujixerox.ddd":{"source":"iana","extensions":["ddd"]},"application/vnd.fujixerox.docuworks":{"source":"iana","extensions":["xdw"]},"application/vnd.fujixerox.docuworks.binder":{"source":"iana","extensions":["xbd"]},"application/vnd.fujixerox.docuworks.container":{"source":"iana"},"application/vnd.fujixerox.hbpl":{"source":"iana"},"application/vnd.fut-misnet":{"source":"iana"},"application/vnd.futoin+cbor":{"source":"iana"},"application/vnd.futoin+json":{"source":"iana","compressible":true},"application/vnd.fuzzysheet":{"source":"iana","extensions":["fzs"]},"application/vnd.genomatix.tuxedo":{"source":"iana","extensions":["txd"]},"application/vnd.gentics.grd+json":{"source":"iana","compressible":true},"application/vnd.geo+json":{"source":"iana","compressible":true},"application/vnd.geocube+xml":{"source":"iana","compressible":true},"application/vnd.geogebra.file":{"source":"iana","extensions":["ggb"]},"application/vnd.geogebra.slides":{"source":"iana"},"application/vnd.geogebra.tool":{"source":"iana","extensions":["ggt"]},"application/vnd.geometry-explorer":{"source":"iana","extensions":["gex","gre"]},"application/vnd.geonext":{"source":"iana","extensions":["gxt"]},"application/vnd.geoplan":{"source":"iana","extensions":["g2w"]},"application/vnd.geospace":{"source":"iana","extensions":["g3w"]},"application/vnd.gerber":{"source":"iana"},"application/vnd.globalplatform.card-content-mgt":{"source":"iana"},"application/vnd.globalplatform.card-content-mgt-response":{"source":"iana"},"application/vnd.gmx":{"source":"iana","extensions":["gmx"]},"application/vnd.google-apps.document":{"compressible":false,"extensions":["gdoc"]},"application/vnd.google-apps.presentation":{"compressible":false,"extensions":["gslides"]},"application/vnd.google-apps.spreadsheet":{"compressible":false,"extensions":["gsheet"]},"application/vnd.google-earth.kml+xml":{"source":"iana","compressible":true,"extensions":["kml"]},"application/vnd.google-earth.kmz":{"source":"iana","compressible":false,"extensions":["kmz"]},"application/vnd.gov.sk.e-form+xml":{"source":"iana","compressible":true},"application/vnd.gov.sk.e-form+zip":{"source":"iana","compressible":false},"application/vnd.gov.sk.xmldatacontainer+xml":{"source":"iana","compressible":true},"application/vnd.grafeq":{"source":"iana","extensions":["gqf","gqs"]},"application/vnd.gridmp":{"source":"iana"},"application/vnd.groove-account":{"source":"iana","extensions":["gac"]},"application/vnd.groove-help":{"source":"iana","extensions":["ghf"]},"application/vnd.groove-identity-message":{"source":"iana","extensions":["gim"]},"application/vnd.groove-injector":{"source":"iana","extensions":["grv"]},"application/vnd.groove-tool-message":{"source":"iana","extensions":["gtm"]},"application/vnd.groove-tool-template":{"source":"iana","extensions":["tpl"]},"application/vnd.groove-vcard":{"source":"iana","extensions":["vcg"]},"application/vnd.hal+json":{"source":"iana","compressible":true},"application/vnd.hal+xml":{"source":"iana","compressible":true,"extensions":["hal"]},"application/vnd.handheld-entertainment+xml":{"source":"iana","compressible":true,"extensions":["zmm"]},"application/vnd.hbci":{"source":"iana","extensions":["hbci"]},"application/vnd.hc+json":{"source":"iana","compressible":true},"application/vnd.hcl-bireports":{"source":"iana"},"application/vnd.hdt":{"source":"iana"},"application/vnd.heroku+json":{"source":"iana","compressible":true},"application/vnd.hhe.lesson-player":{"source":"iana","extensions":["les"]},"application/vnd.hl7cda+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/vnd.hl7v2+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/vnd.hp-hpgl":{"source":"iana","extensions":["hpgl"]},"application/vnd.hp-hpid":{"source":"iana","extensions":["hpid"]},"application/vnd.hp-hps":{"source":"iana","extensions":["hps"]},"application/vnd.hp-jlyt":{"source":"iana","extensions":["jlt"]},"application/vnd.hp-pcl":{"source":"iana","extensions":["pcl"]},"application/vnd.hp-pclxl":{"source":"iana","extensions":["pclxl"]},"application/vnd.httphone":{"source":"iana"},"application/vnd.hydrostatix.sof-data":{"source":"iana","extensions":["sfd-hdstx"]},"application/vnd.hyper+json":{"source":"iana","compressible":true},"application/vnd.hyper-item+json":{"source":"iana","compressible":true},"application/vnd.hyperdrive+json":{"source":"iana","compressible":true},"application/vnd.hzn-3d-crossword":{"source":"iana"},"application/vnd.ibm.afplinedata":{"source":"iana"},"application/vnd.ibm.electronic-media":{"source":"iana"},"application/vnd.ibm.minipay":{"source":"iana","extensions":["mpy"]},"application/vnd.ibm.modcap":{"source":"iana","extensions":["afp","listafp","list3820"]},"application/vnd.ibm.rights-management":{"source":"iana","extensions":["irm"]},"application/vnd.ibm.secure-container":{"source":"iana","extensions":["sc"]},"application/vnd.iccprofile":{"source":"iana","extensions":["icc","icm"]},"application/vnd.ieee.1905":{"source":"iana"},"application/vnd.igloader":{"source":"iana","extensions":["igl"]},"application/vnd.imagemeter.folder+zip":{"source":"iana","compressible":false},"application/vnd.imagemeter.image+zip":{"source":"iana","compressible":false},"application/vnd.immervision-ivp":{"source":"iana","extensions":["ivp"]},"application/vnd.immervision-ivu":{"source":"iana","extensions":["ivu"]},"application/vnd.ims.imsccv1p1":{"source":"iana"},"application/vnd.ims.imsccv1p2":{"source":"iana"},"application/vnd.ims.imsccv1p3":{"source":"iana"},"application/vnd.ims.lis.v2.result+json":{"source":"iana","compressible":true},"application/vnd.ims.lti.v2.toolconsumerprofile+json":{"source":"iana","compressible":true},"application/vnd.ims.lti.v2.toolproxy+json":{"source":"iana","compressible":true},"application/vnd.ims.lti.v2.toolproxy.id+json":{"source":"iana","compressible":true},"application/vnd.ims.lti.v2.toolsettings+json":{"source":"iana","compressible":true},"application/vnd.ims.lti.v2.toolsettings.simple+json":{"source":"iana","compressible":true},"application/vnd.informedcontrol.rms+xml":{"source":"iana","compressible":true},"application/vnd.informix-visionary":{"source":"iana"},"application/vnd.infotech.project":{"source":"iana"},"application/vnd.infotech.project+xml":{"source":"iana","compressible":true},"application/vnd.innopath.wamp.notification":{"source":"iana"},"application/vnd.insors.igm":{"source":"iana","extensions":["igm"]},"application/vnd.intercon.formnet":{"source":"iana","extensions":["xpw","xpx"]},"application/vnd.intergeo":{"source":"iana","extensions":["i2g"]},"application/vnd.intertrust.digibox":{"source":"iana"},"application/vnd.intertrust.nncp":{"source":"iana"},"application/vnd.intu.qbo":{"source":"iana","extensions":["qbo"]},"application/vnd.intu.qfx":{"source":"iana","extensions":["qfx"]},"application/vnd.iptc.g2.catalogitem+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.conceptitem+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.knowledgeitem+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.newsitem+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.newsmessage+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.packageitem+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.planningitem+xml":{"source":"iana","compressible":true},"application/vnd.ipunplugged.rcprofile":{"source":"iana","extensions":["rcprofile"]},"application/vnd.irepository.package+xml":{"source":"iana","compressible":true,"extensions":["irp"]},"application/vnd.is-xpr":{"source":"iana","extensions":["xpr"]},"application/vnd.isac.fcs":{"source":"iana","extensions":["fcs"]},"application/vnd.iso11783-10+zip":{"source":"iana","compressible":false},"application/vnd.jam":{"source":"iana","extensions":["jam"]},"application/vnd.japannet-directory-service":{"source":"iana"},"application/vnd.japannet-jpnstore-wakeup":{"source":"iana"},"application/vnd.japannet-payment-wakeup":{"source":"iana"},"application/vnd.japannet-registration":{"source":"iana"},"application/vnd.japannet-registration-wakeup":{"source":"iana"},"application/vnd.japannet-setstore-wakeup":{"source":"iana"},"application/vnd.japannet-verification":{"source":"iana"},"application/vnd.japannet-verification-wakeup":{"source":"iana"},"application/vnd.jcp.javame.midlet-rms":{"source":"iana","extensions":["rms"]},"application/vnd.jisp":{"source":"iana","extensions":["jisp"]},"application/vnd.joost.joda-archive":{"source":"iana","extensions":["joda"]},"application/vnd.jsk.isdn-ngn":{"source":"iana"},"application/vnd.kahootz":{"source":"iana","extensions":["ktz","ktr"]},"application/vnd.kde.karbon":{"source":"iana","extensions":["karbon"]},"application/vnd.kde.kchart":{"source":"iana","extensions":["chrt"]},"application/vnd.kde.kformula":{"source":"iana","extensions":["kfo"]},"application/vnd.kde.kivio":{"source":"iana","extensions":["flw"]},"application/vnd.kde.kontour":{"source":"iana","extensions":["kon"]},"application/vnd.kde.kpresenter":{"source":"iana","extensions":["kpr","kpt"]},"application/vnd.kde.kspread":{"source":"iana","extensions":["ksp"]},"application/vnd.kde.kword":{"source":"iana","extensions":["kwd","kwt"]},"application/vnd.kenameaapp":{"source":"iana","extensions":["htke"]},"application/vnd.kidspiration":{"source":"iana","extensions":["kia"]},"application/vnd.kinar":{"source":"iana","extensions":["kne","knp"]},"application/vnd.koan":{"source":"iana","extensions":["skp","skd","skt","skm"]},"application/vnd.kodak-descriptor":{"source":"iana","extensions":["sse"]},"application/vnd.las":{"source":"iana"},"application/vnd.las.las+json":{"source":"iana","compressible":true},"application/vnd.las.las+xml":{"source":"iana","compressible":true,"extensions":["lasxml"]},"application/vnd.laszip":{"source":"iana"},"application/vnd.leap+json":{"source":"iana","compressible":true},"application/vnd.liberty-request+xml":{"source":"iana","compressible":true},"application/vnd.llamagraphics.life-balance.desktop":{"source":"iana","extensions":["lbd"]},"application/vnd.llamagraphics.life-balance.exchange+xml":{"source":"iana","compressible":true,"extensions":["lbe"]},"application/vnd.logipipe.circuit+zip":{"source":"iana","compressible":false},"application/vnd.loom":{"source":"iana"},"application/vnd.lotus-1-2-3":{"source":"iana","extensions":["123"]},"application/vnd.lotus-approach":{"source":"iana","extensions":["apr"]},"application/vnd.lotus-freelance":{"source":"iana","extensions":["pre"]},"application/vnd.lotus-notes":{"source":"iana","extensions":["nsf"]},"application/vnd.lotus-organizer":{"source":"iana","extensions":["org"]},"application/vnd.lotus-screencam":{"source":"iana","extensions":["scm"]},"application/vnd.lotus-wordpro":{"source":"iana","extensions":["lwp"]},"application/vnd.macports.portpkg":{"source":"iana","extensions":["portpkg"]},"application/vnd.mapbox-vector-tile":{"source":"iana","extensions":["mvt"]},"application/vnd.marlin.drm.actiontoken+xml":{"source":"iana","compressible":true},"application/vnd.marlin.drm.conftoken+xml":{"source":"iana","compressible":true},"application/vnd.marlin.drm.license+xml":{"source":"iana","compressible":true},"application/vnd.marlin.drm.mdcf":{"source":"iana"},"application/vnd.mason+json":{"source":"iana","compressible":true},"application/vnd.maxar.archive.3tz+zip":{"source":"iana","compressible":false},"application/vnd.maxmind.maxmind-db":{"source":"iana"},"application/vnd.mcd":{"source":"iana","extensions":["mcd"]},"application/vnd.medcalcdata":{"source":"iana","extensions":["mc1"]},"application/vnd.mediastation.cdkey":{"source":"iana","extensions":["cdkey"]},"application/vnd.meridian-slingshot":{"source":"iana"},"application/vnd.mfer":{"source":"iana","extensions":["mwf"]},"application/vnd.mfmp":{"source":"iana","extensions":["mfm"]},"application/vnd.micro+json":{"source":"iana","compressible":true},"application/vnd.micrografx.flo":{"source":"iana","extensions":["flo"]},"application/vnd.micrografx.igx":{"source":"iana","extensions":["igx"]},"application/vnd.microsoft.portable-executable":{"source":"iana"},"application/vnd.microsoft.windows.thumbnail-cache":{"source":"iana"},"application/vnd.miele+json":{"source":"iana","compressible":true},"application/vnd.mif":{"source":"iana","extensions":["mif"]},"application/vnd.minisoft-hp3000-save":{"source":"iana"},"application/vnd.mitsubishi.misty-guard.trustweb":{"source":"iana"},"application/vnd.mobius.daf":{"source":"iana","extensions":["daf"]},"application/vnd.mobius.dis":{"source":"iana","extensions":["dis"]},"application/vnd.mobius.mbk":{"source":"iana","extensions":["mbk"]},"application/vnd.mobius.mqy":{"source":"iana","extensions":["mqy"]},"application/vnd.mobius.msl":{"source":"iana","extensions":["msl"]},"application/vnd.mobius.plc":{"source":"iana","extensions":["plc"]},"application/vnd.mobius.txf":{"source":"iana","extensions":["txf"]},"application/vnd.mophun.application":{"source":"iana","extensions":["mpn"]},"application/vnd.mophun.certificate":{"source":"iana","extensions":["mpc"]},"application/vnd.motorola.flexsuite":{"source":"iana"},"application/vnd.motorola.flexsuite.adsi":{"source":"iana"},"application/vnd.motorola.flexsuite.fis":{"source":"iana"},"application/vnd.motorola.flexsuite.gotap":{"source":"iana"},"application/vnd.motorola.flexsuite.kmr":{"source":"iana"},"application/vnd.motorola.flexsuite.ttc":{"source":"iana"},"application/vnd.motorola.flexsuite.wem":{"source":"iana"},"application/vnd.motorola.iprm":{"source":"iana"},"application/vnd.mozilla.xul+xml":{"source":"iana","compressible":true,"extensions":["xul"]},"application/vnd.ms-3mfdocument":{"source":"iana"},"application/vnd.ms-artgalry":{"source":"iana","extensions":["cil"]},"application/vnd.ms-asf":{"source":"iana"},"application/vnd.ms-cab-compressed":{"source":"iana","extensions":["cab"]},"application/vnd.ms-color.iccprofile":{"source":"apache"},"application/vnd.ms-excel":{"source":"iana","compressible":false,"extensions":["xls","xlm","xla","xlc","xlt","xlw"]},"application/vnd.ms-excel.addin.macroenabled.12":{"source":"iana","extensions":["xlam"]},"application/vnd.ms-excel.sheet.binary.macroenabled.12":{"source":"iana","extensions":["xlsb"]},"application/vnd.ms-excel.sheet.macroenabled.12":{"source":"iana","extensions":["xlsm"]},"application/vnd.ms-excel.template.macroenabled.12":{"source":"iana","extensions":["xltm"]},"application/vnd.ms-fontobject":{"source":"iana","compressible":true,"extensions":["eot"]},"application/vnd.ms-htmlhelp":{"source":"iana","extensions":["chm"]},"application/vnd.ms-ims":{"source":"iana","extensions":["ims"]},"application/vnd.ms-lrm":{"source":"iana","extensions":["lrm"]},"application/vnd.ms-office.activex+xml":{"source":"iana","compressible":true},"application/vnd.ms-officetheme":{"source":"iana","extensions":["thmx"]},"application/vnd.ms-opentype":{"source":"apache","compressible":true},"application/vnd.ms-outlook":{"compressible":false,"extensions":["msg"]},"application/vnd.ms-package.obfuscated-opentype":{"source":"apache"},"application/vnd.ms-pki.seccat":{"source":"apache","extensions":["cat"]},"application/vnd.ms-pki.stl":{"source":"apache","extensions":["stl"]},"application/vnd.ms-playready.initiator+xml":{"source":"iana","compressible":true},"application/vnd.ms-powerpoint":{"source":"iana","compressible":false,"extensions":["ppt","pps","pot"]},"application/vnd.ms-powerpoint.addin.macroenabled.12":{"source":"iana","extensions":["ppam"]},"application/vnd.ms-powerpoint.presentation.macroenabled.12":{"source":"iana","extensions":["pptm"]},"application/vnd.ms-powerpoint.slide.macroenabled.12":{"source":"iana","extensions":["sldm"]},"application/vnd.ms-powerpoint.slideshow.macroenabled.12":{"source":"iana","extensions":["ppsm"]},"application/vnd.ms-powerpoint.template.macroenabled.12":{"source":"iana","extensions":["potm"]},"application/vnd.ms-printdevicecapabilities+xml":{"source":"iana","compressible":true},"application/vnd.ms-printing.printticket+xml":{"source":"apache","compressible":true},"application/vnd.ms-printschematicket+xml":{"source":"iana","compressible":true},"application/vnd.ms-project":{"source":"iana","extensions":["mpp","mpt"]},"application/vnd.ms-tnef":{"source":"iana"},"application/vnd.ms-windows.devicepairing":{"source":"iana"},"application/vnd.ms-windows.nwprinting.oob":{"source":"iana"},"application/vnd.ms-windows.printerpairing":{"source":"iana"},"application/vnd.ms-windows.wsd.oob":{"source":"iana"},"application/vnd.ms-wmdrm.lic-chlg-req":{"source":"iana"},"application/vnd.ms-wmdrm.lic-resp":{"source":"iana"},"application/vnd.ms-wmdrm.meter-chlg-req":{"source":"iana"},"application/vnd.ms-wmdrm.meter-resp":{"source":"iana"},"application/vnd.ms-word.document.macroenabled.12":{"source":"iana","extensions":["docm"]},"application/vnd.ms-word.template.macroenabled.12":{"source":"iana","extensions":["dotm"]},"application/vnd.ms-works":{"source":"iana","extensions":["wps","wks","wcm","wdb"]},"application/vnd.ms-wpl":{"source":"iana","extensions":["wpl"]},"application/vnd.ms-xpsdocument":{"source":"iana","compressible":false,"extensions":["xps"]},"application/vnd.msa-disk-image":{"source":"iana"},"application/vnd.mseq":{"source":"iana","extensions":["mseq"]},"application/vnd.msign":{"source":"iana"},"application/vnd.multiad.creator":{"source":"iana"},"application/vnd.multiad.creator.cif":{"source":"iana"},"application/vnd.music-niff":{"source":"iana"},"application/vnd.musician":{"source":"iana","extensions":["mus"]},"application/vnd.muvee.style":{"source":"iana","extensions":["msty"]},"application/vnd.mynfc":{"source":"iana","extensions":["taglet"]},"application/vnd.nacamar.ybrid+json":{"source":"iana","compressible":true},"application/vnd.ncd.control":{"source":"iana"},"application/vnd.ncd.reference":{"source":"iana"},"application/vnd.nearst.inv+json":{"source":"iana","compressible":true},"application/vnd.nebumind.line":{"source":"iana"},"application/vnd.nervana":{"source":"iana"},"application/vnd.netfpx":{"source":"iana"},"application/vnd.neurolanguage.nlu":{"source":"iana","extensions":["nlu"]},"application/vnd.nimn":{"source":"iana"},"application/vnd.nintendo.nitro.rom":{"source":"iana"},"application/vnd.nintendo.snes.rom":{"source":"iana"},"application/vnd.nitf":{"source":"iana","extensions":["ntf","nitf"]},"application/vnd.noblenet-directory":{"source":"iana","extensions":["nnd"]},"application/vnd.noblenet-sealer":{"source":"iana","extensions":["nns"]},"application/vnd.noblenet-web":{"source":"iana","extensions":["nnw"]},"application/vnd.nokia.catalogs":{"source":"iana"},"application/vnd.nokia.conml+wbxml":{"source":"iana"},"application/vnd.nokia.conml+xml":{"source":"iana","compressible":true},"application/vnd.nokia.iptv.config+xml":{"source":"iana","compressible":true},"application/vnd.nokia.isds-radio-presets":{"source":"iana"},"application/vnd.nokia.landmark+wbxml":{"source":"iana"},"application/vnd.nokia.landmark+xml":{"source":"iana","compressible":true},"application/vnd.nokia.landmarkcollection+xml":{"source":"iana","compressible":true},"application/vnd.nokia.n-gage.ac+xml":{"source":"iana","compressible":true,"extensions":["ac"]},"application/vnd.nokia.n-gage.data":{"source":"iana","extensions":["ngdat"]},"application/vnd.nokia.n-gage.symbian.install":{"source":"iana","extensions":["n-gage"]},"application/vnd.nokia.ncd":{"source":"iana"},"application/vnd.nokia.pcd+wbxml":{"source":"iana"},"application/vnd.nokia.pcd+xml":{"source":"iana","compressible":true},"application/vnd.nokia.radio-preset":{"source":"iana","extensions":["rpst"]},"application/vnd.nokia.radio-presets":{"source":"iana","extensions":["rpss"]},"application/vnd.novadigm.edm":{"source":"iana","extensions":["edm"]},"application/vnd.novadigm.edx":{"source":"iana","extensions":["edx"]},"application/vnd.novadigm.ext":{"source":"iana","extensions":["ext"]},"application/vnd.ntt-local.content-share":{"source":"iana"},"application/vnd.ntt-local.file-transfer":{"source":"iana"},"application/vnd.ntt-local.ogw_remote-access":{"source":"iana"},"application/vnd.ntt-local.sip-ta_remote":{"source":"iana"},"application/vnd.ntt-local.sip-ta_tcp_stream":{"source":"iana"},"application/vnd.oasis.opendocument.chart":{"source":"iana","extensions":["odc"]},"application/vnd.oasis.opendocument.chart-template":{"source":"iana","extensions":["otc"]},"application/vnd.oasis.opendocument.database":{"source":"iana","extensions":["odb"]},"application/vnd.oasis.opendocument.formula":{"source":"iana","extensions":["odf"]},"application/vnd.oasis.opendocument.formula-template":{"source":"iana","extensions":["odft"]},"application/vnd.oasis.opendocument.graphics":{"source":"iana","compressible":false,"extensions":["odg"]},"application/vnd.oasis.opendocument.graphics-template":{"source":"iana","extensions":["otg"]},"application/vnd.oasis.opendocument.image":{"source":"iana","extensions":["odi"]},"application/vnd.oasis.opendocument.image-template":{"source":"iana","extensions":["oti"]},"application/vnd.oasis.opendocument.presentation":{"source":"iana","compressible":false,"extensions":["odp"]},"application/vnd.oasis.opendocument.presentation-template":{"source":"iana","extensions":["otp"]},"application/vnd.oasis.opendocument.spreadsheet":{"source":"iana","compressible":false,"extensions":["ods"]},"application/vnd.oasis.opendocument.spreadsheet-template":{"source":"iana","extensions":["ots"]},"application/vnd.oasis.opendocument.text":{"source":"iana","compressible":false,"extensions":["odt"]},"application/vnd.oasis.opendocument.text-master":{"source":"iana","extensions":["odm"]},"application/vnd.oasis.opendocument.text-template":{"source":"iana","extensions":["ott"]},"application/vnd.oasis.opendocument.text-web":{"source":"iana","extensions":["oth"]},"application/vnd.obn":{"source":"iana"},"application/vnd.ocf+cbor":{"source":"iana"},"application/vnd.oci.image.manifest.v1+json":{"source":"iana","compressible":true},"application/vnd.oftn.l10n+json":{"source":"iana","compressible":true},"application/vnd.oipf.contentaccessdownload+xml":{"source":"iana","compressible":true},"application/vnd.oipf.contentaccessstreaming+xml":{"source":"iana","compressible":true},"application/vnd.oipf.cspg-hexbinary":{"source":"iana"},"application/vnd.oipf.dae.svg+xml":{"source":"iana","compressible":true},"application/vnd.oipf.dae.xhtml+xml":{"source":"iana","compressible":true},"application/vnd.oipf.mippvcontrolmessage+xml":{"source":"iana","compressible":true},"application/vnd.oipf.pae.gem":{"source":"iana"},"application/vnd.oipf.spdiscovery+xml":{"source":"iana","compressible":true},"application/vnd.oipf.spdlist+xml":{"source":"iana","compressible":true},"application/vnd.oipf.ueprofile+xml":{"source":"iana","compressible":true},"application/vnd.oipf.userprofile+xml":{"source":"iana","compressible":true},"application/vnd.olpc-sugar":{"source":"iana","extensions":["xo"]},"application/vnd.oma-scws-config":{"source":"iana"},"application/vnd.oma-scws-http-request":{"source":"iana"},"application/vnd.oma-scws-http-response":{"source":"iana"},"application/vnd.oma.bcast.associated-procedure-parameter+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.drm-trigger+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.imd+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.ltkm":{"source":"iana"},"application/vnd.oma.bcast.notification+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.provisioningtrigger":{"source":"iana"},"application/vnd.oma.bcast.sgboot":{"source":"iana"},"application/vnd.oma.bcast.sgdd+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.sgdu":{"source":"iana"},"application/vnd.oma.bcast.simple-symbol-container":{"source":"iana"},"application/vnd.oma.bcast.smartcard-trigger+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.sprov+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.stkm":{"source":"iana"},"application/vnd.oma.cab-address-book+xml":{"source":"iana","compressible":true},"application/vnd.oma.cab-feature-handler+xml":{"source":"iana","compressible":true},"application/vnd.oma.cab-pcc+xml":{"source":"iana","compressible":true},"application/vnd.oma.cab-subs-invite+xml":{"source":"iana","compressible":true},"application/vnd.oma.cab-user-prefs+xml":{"source":"iana","compressible":true},"application/vnd.oma.dcd":{"source":"iana"},"application/vnd.oma.dcdc":{"source":"iana"},"application/vnd.oma.dd2+xml":{"source":"iana","compressible":true,"extensions":["dd2"]},"application/vnd.oma.drm.risd+xml":{"source":"iana","compressible":true},"application/vnd.oma.group-usage-list+xml":{"source":"iana","compressible":true},"application/vnd.oma.lwm2m+cbor":{"source":"iana"},"application/vnd.oma.lwm2m+json":{"source":"iana","compressible":true},"application/vnd.oma.lwm2m+tlv":{"source":"iana"},"application/vnd.oma.pal+xml":{"source":"iana","compressible":true},"application/vnd.oma.poc.detailed-progress-report+xml":{"source":"iana","compressible":true},"application/vnd.oma.poc.final-report+xml":{"source":"iana","compressible":true},"application/vnd.oma.poc.groups+xml":{"source":"iana","compressible":true},"application/vnd.oma.poc.invocation-descriptor+xml":{"source":"iana","compressible":true},"application/vnd.oma.poc.optimized-progress-report+xml":{"source":"iana","compressible":true},"application/vnd.oma.push":{"source":"iana"},"application/vnd.oma.scidm.messages+xml":{"source":"iana","compressible":true},"application/vnd.oma.xcap-directory+xml":{"source":"iana","compressible":true},"application/vnd.omads-email+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/vnd.omads-file+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/vnd.omads-folder+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/vnd.omaloc-supl-init":{"source":"iana"},"application/vnd.onepager":{"source":"iana"},"application/vnd.onepagertamp":{"source":"iana"},"application/vnd.onepagertamx":{"source":"iana"},"application/vnd.onepagertat":{"source":"iana"},"application/vnd.onepagertatp":{"source":"iana"},"application/vnd.onepagertatx":{"source":"iana"},"application/vnd.openblox.game+xml":{"source":"iana","compressible":true,"extensions":["obgx"]},"application/vnd.openblox.game-binary":{"source":"iana"},"application/vnd.openeye.oeb":{"source":"iana"},"application/vnd.openofficeorg.extension":{"source":"apache","extensions":["oxt"]},"application/vnd.openstreetmap.data+xml":{"source":"iana","compressible":true,"extensions":["osm"]},"application/vnd.opentimestamps.ots":{"source":"iana"},"application/vnd.openxmlformats-officedocument.custom-properties+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.customxmlproperties+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawing+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.chart+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.extended-properties+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.comments+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.presentation":{"source":"iana","compressible":false,"extensions":["pptx"]},"application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.presprops+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.slide":{"source":"iana","extensions":["sldx"]},"application/vnd.openxmlformats-officedocument.presentationml.slide+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.slideshow":{"source":"iana","extensions":["ppsx"]},"application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.tags+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.template":{"source":"iana","extensions":["potx"]},"application/vnd.openxmlformats-officedocument.presentationml.template.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{"source":"iana","compressible":false,"extensions":["xlsx"]},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.template":{"source":"iana","extensions":["xltx"]},"application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.theme+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.themeoverride+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.vmldrawing":{"source":"iana"},"application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.document":{"source":"iana","compressible":false,"extensions":["docx"]},"application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.template":{"source":"iana","extensions":["dotx"]},"application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-package.core-properties+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-package.relationships+xml":{"source":"iana","compressible":true},"application/vnd.oracle.resource+json":{"source":"iana","compressible":true},"application/vnd.orange.indata":{"source":"iana"},"application/vnd.osa.netdeploy":{"source":"iana"},"application/vnd.osgeo.mapguide.package":{"source":"iana","extensions":["mgp"]},"application/vnd.osgi.bundle":{"source":"iana"},"application/vnd.osgi.dp":{"source":"iana","extensions":["dp"]},"application/vnd.osgi.subsystem":{"source":"iana","extensions":["esa"]},"application/vnd.otps.ct-kip+xml":{"source":"iana","compressible":true},"application/vnd.oxli.countgraph":{"source":"iana"},"application/vnd.pagerduty+json":{"source":"iana","compressible":true},"application/vnd.palm":{"source":"iana","extensions":["pdb","pqa","oprc"]},"application/vnd.panoply":{"source":"iana"},"application/vnd.paos.xml":{"source":"iana"},"application/vnd.patentdive":{"source":"iana"},"application/vnd.patientecommsdoc":{"source":"iana"},"application/vnd.pawaafile":{"source":"iana","extensions":["paw"]},"application/vnd.pcos":{"source":"iana"},"application/vnd.pg.format":{"source":"iana","extensions":["str"]},"application/vnd.pg.osasli":{"source":"iana","extensions":["ei6"]},"application/vnd.piaccess.application-licence":{"source":"iana"},"application/vnd.picsel":{"source":"iana","extensions":["efif"]},"application/vnd.pmi.widget":{"source":"iana","extensions":["wg"]},"application/vnd.poc.group-advertisement+xml":{"source":"iana","compressible":true},"application/vnd.pocketlearn":{"source":"iana","extensions":["plf"]},"application/vnd.powerbuilder6":{"source":"iana","extensions":["pbd"]},"application/vnd.powerbuilder6-s":{"source":"iana"},"application/vnd.powerbuilder7":{"source":"iana"},"application/vnd.powerbuilder7-s":{"source":"iana"},"application/vnd.powerbuilder75":{"source":"iana"},"application/vnd.powerbuilder75-s":{"source":"iana"},"application/vnd.preminet":{"source":"iana"},"application/vnd.previewsystems.box":{"source":"iana","extensions":["box"]},"application/vnd.proteus.magazine":{"source":"iana","extensions":["mgz"]},"application/vnd.psfs":{"source":"iana"},"application/vnd.publishare-delta-tree":{"source":"iana","extensions":["qps"]},"application/vnd.pvi.ptid1":{"source":"iana","extensions":["ptid"]},"application/vnd.pwg-multiplexed":{"source":"iana"},"application/vnd.pwg-xhtml-print+xml":{"source":"iana","compressible":true},"application/vnd.qualcomm.brew-app-res":{"source":"iana"},"application/vnd.quarantainenet":{"source":"iana"},"application/vnd.quark.quarkxpress":{"source":"iana","extensions":["qxd","qxt","qwd","qwt","qxl","qxb"]},"application/vnd.quobject-quoxdocument":{"source":"iana"},"application/vnd.radisys.moml+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-audit+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-audit-conf+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-audit-conn+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-audit-dialog+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-audit-stream+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-conf+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-base+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-fax-detect+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-fax-sendrecv+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-group+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-speech+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-transform+xml":{"source":"iana","compressible":true},"application/vnd.rainstor.data":{"source":"iana"},"application/vnd.rapid":{"source":"iana"},"application/vnd.rar":{"source":"iana","extensions":["rar"]},"application/vnd.realvnc.bed":{"source":"iana","extensions":["bed"]},"application/vnd.recordare.musicxml":{"source":"iana","extensions":["mxl"]},"application/vnd.recordare.musicxml+xml":{"source":"iana","compressible":true,"extensions":["musicxml"]},"application/vnd.renlearn.rlprint":{"source":"iana"},"application/vnd.resilient.logic":{"source":"iana"},"application/vnd.restful+json":{"source":"iana","compressible":true},"application/vnd.rig.cryptonote":{"source":"iana","extensions":["cryptonote"]},"application/vnd.rim.cod":{"source":"apache","extensions":["cod"]},"application/vnd.rn-realmedia":{"source":"apache","extensions":["rm"]},"application/vnd.rn-realmedia-vbr":{"source":"apache","extensions":["rmvb"]},"application/vnd.route66.link66+xml":{"source":"iana","compressible":true,"extensions":["link66"]},"application/vnd.rs-274x":{"source":"iana"},"application/vnd.ruckus.download":{"source":"iana"},"application/vnd.s3sms":{"source":"iana"},"application/vnd.sailingtracker.track":{"source":"iana","extensions":["st"]},"application/vnd.sar":{"source":"iana"},"application/vnd.sbm.cid":{"source":"iana"},"application/vnd.sbm.mid2":{"source":"iana"},"application/vnd.scribus":{"source":"iana"},"application/vnd.sealed.3df":{"source":"iana"},"application/vnd.sealed.csf":{"source":"iana"},"application/vnd.sealed.doc":{"source":"iana"},"application/vnd.sealed.eml":{"source":"iana"},"application/vnd.sealed.mht":{"source":"iana"},"application/vnd.sealed.net":{"source":"iana"},"application/vnd.sealed.ppt":{"source":"iana"},"application/vnd.sealed.tiff":{"source":"iana"},"application/vnd.sealed.xls":{"source":"iana"},"application/vnd.sealedmedia.softseal.html":{"source":"iana"},"application/vnd.sealedmedia.softseal.pdf":{"source":"iana"},"application/vnd.seemail":{"source":"iana","extensions":["see"]},"application/vnd.seis+json":{"source":"iana","compressible":true},"application/vnd.sema":{"source":"iana","extensions":["sema"]},"application/vnd.semd":{"source":"iana","extensions":["semd"]},"application/vnd.semf":{"source":"iana","extensions":["semf"]},"application/vnd.shade-save-file":{"source":"iana"},"application/vnd.shana.informed.formdata":{"source":"iana","extensions":["ifm"]},"application/vnd.shana.informed.formtemplate":{"source":"iana","extensions":["itp"]},"application/vnd.shana.informed.interchange":{"source":"iana","extensions":["iif"]},"application/vnd.shana.informed.package":{"source":"iana","extensions":["ipk"]},"application/vnd.shootproof+json":{"source":"iana","compressible":true},"application/vnd.shopkick+json":{"source":"iana","compressible":true},"application/vnd.shp":{"source":"iana"},"application/vnd.shx":{"source":"iana"},"application/vnd.sigrok.session":{"source":"iana"},"application/vnd.simtech-mindmapper":{"source":"iana","extensions":["twd","twds"]},"application/vnd.siren+json":{"source":"iana","compressible":true},"application/vnd.smaf":{"source":"iana","extensions":["mmf"]},"application/vnd.smart.notebook":{"source":"iana"},"application/vnd.smart.teacher":{"source":"iana","extensions":["teacher"]},"application/vnd.snesdev-page-table":{"source":"iana"},"application/vnd.software602.filler.form+xml":{"source":"iana","compressible":true,"extensions":["fo"]},"application/vnd.software602.filler.form-xml-zip":{"source":"iana"},"application/vnd.solent.sdkm+xml":{"source":"iana","compressible":true,"extensions":["sdkm","sdkd"]},"application/vnd.spotfire.dxp":{"source":"iana","extensions":["dxp"]},"application/vnd.spotfire.sfs":{"source":"iana","extensions":["sfs"]},"application/vnd.sqlite3":{"source":"iana"},"application/vnd.sss-cod":{"source":"iana"},"application/vnd.sss-dtf":{"source":"iana"},"application/vnd.sss-ntf":{"source":"iana"},"application/vnd.stardivision.calc":{"source":"apache","extensions":["sdc"]},"application/vnd.stardivision.draw":{"source":"apache","extensions":["sda"]},"application/vnd.stardivision.impress":{"source":"apache","extensions":["sdd"]},"application/vnd.stardivision.math":{"source":"apache","extensions":["smf"]},"application/vnd.stardivision.writer":{"source":"apache","extensions":["sdw","vor"]},"application/vnd.stardivision.writer-global":{"source":"apache","extensions":["sgl"]},"application/vnd.stepmania.package":{"source":"iana","extensions":["smzip"]},"application/vnd.stepmania.stepchart":{"source":"iana","extensions":["sm"]},"application/vnd.street-stream":{"source":"iana"},"application/vnd.sun.wadl+xml":{"source":"iana","compressible":true,"extensions":["wadl"]},"application/vnd.sun.xml.calc":{"source":"apache","extensions":["sxc"]},"application/vnd.sun.xml.calc.template":{"source":"apache","extensions":["stc"]},"application/vnd.sun.xml.draw":{"source":"apache","extensions":["sxd"]},"application/vnd.sun.xml.draw.template":{"source":"apache","extensions":["std"]},"application/vnd.sun.xml.impress":{"source":"apache","extensions":["sxi"]},"application/vnd.sun.xml.impress.template":{"source":"apache","extensions":["sti"]},"application/vnd.sun.xml.math":{"source":"apache","extensions":["sxm"]},"application/vnd.sun.xml.writer":{"source":"apache","extensions":["sxw"]},"application/vnd.sun.xml.writer.global":{"source":"apache","extensions":["sxg"]},"application/vnd.sun.xml.writer.template":{"source":"apache","extensions":["stw"]},"application/vnd.sus-calendar":{"source":"iana","extensions":["sus","susp"]},"application/vnd.svd":{"source":"iana","extensions":["svd"]},"application/vnd.swiftview-ics":{"source":"iana"},"application/vnd.sycle+xml":{"source":"iana","compressible":true},"application/vnd.syft+json":{"source":"iana","compressible":true},"application/vnd.symbian.install":{"source":"apache","extensions":["sis","sisx"]},"application/vnd.syncml+xml":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["xsm"]},"application/vnd.syncml.dm+wbxml":{"source":"iana","charset":"UTF-8","extensions":["bdm"]},"application/vnd.syncml.dm+xml":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["xdm"]},"application/vnd.syncml.dm.notification":{"source":"iana"},"application/vnd.syncml.dmddf+wbxml":{"source":"iana"},"application/vnd.syncml.dmddf+xml":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["ddf"]},"application/vnd.syncml.dmtnds+wbxml":{"source":"iana"},"application/vnd.syncml.dmtnds+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/vnd.syncml.ds.notification":{"source":"iana"},"application/vnd.tableschema+json":{"source":"iana","compressible":true},"application/vnd.tao.intent-module-archive":{"source":"iana","extensions":["tao"]},"application/vnd.tcpdump.pcap":{"source":"iana","extensions":["pcap","cap","dmp"]},"application/vnd.think-cell.ppttc+json":{"source":"iana","compressible":true},"application/vnd.tmd.mediaflex.api+xml":{"source":"iana","compressible":true},"application/vnd.tml":{"source":"iana"},"application/vnd.tmobile-livetv":{"source":"iana","extensions":["tmo"]},"application/vnd.tri.onesource":{"source":"iana"},"application/vnd.trid.tpt":{"source":"iana","extensions":["tpt"]},"application/vnd.triscape.mxs":{"source":"iana","extensions":["mxs"]},"application/vnd.trueapp":{"source":"iana","extensions":["tra"]},"application/vnd.truedoc":{"source":"iana"},"application/vnd.ubisoft.webplayer":{"source":"iana"},"application/vnd.ufdl":{"source":"iana","extensions":["ufd","ufdl"]},"application/vnd.uiq.theme":{"source":"iana","extensions":["utz"]},"application/vnd.umajin":{"source":"iana","extensions":["umj"]},"application/vnd.unity":{"source":"iana","extensions":["unityweb"]},"application/vnd.uoml+xml":{"source":"iana","compressible":true,"extensions":["uoml"]},"application/vnd.uplanet.alert":{"source":"iana"},"application/vnd.uplanet.alert-wbxml":{"source":"iana"},"application/vnd.uplanet.bearer-choice":{"source":"iana"},"application/vnd.uplanet.bearer-choice-wbxml":{"source":"iana"},"application/vnd.uplanet.cacheop":{"source":"iana"},"application/vnd.uplanet.cacheop-wbxml":{"source":"iana"},"application/vnd.uplanet.channel":{"source":"iana"},"application/vnd.uplanet.channel-wbxml":{"source":"iana"},"application/vnd.uplanet.list":{"source":"iana"},"application/vnd.uplanet.list-wbxml":{"source":"iana"},"application/vnd.uplanet.listcmd":{"source":"iana"},"application/vnd.uplanet.listcmd-wbxml":{"source":"iana"},"application/vnd.uplanet.signal":{"source":"iana"},"application/vnd.uri-map":{"source":"iana"},"application/vnd.valve.source.material":{"source":"iana"},"application/vnd.vcx":{"source":"iana","extensions":["vcx"]},"application/vnd.vd-study":{"source":"iana"},"application/vnd.vectorworks":{"source":"iana"},"application/vnd.vel+json":{"source":"iana","compressible":true},"application/vnd.verimatrix.vcas":{"source":"iana"},"application/vnd.veritone.aion+json":{"source":"iana","compressible":true},"application/vnd.veryant.thin":{"source":"iana"},"application/vnd.ves.encrypted":{"source":"iana"},"application/vnd.vidsoft.vidconference":{"source":"iana"},"application/vnd.visio":{"source":"iana","extensions":["vsd","vst","vss","vsw"]},"application/vnd.visionary":{"source":"iana","extensions":["vis"]},"application/vnd.vividence.scriptfile":{"source":"iana"},"application/vnd.vsf":{"source":"iana","extensions":["vsf"]},"application/vnd.wap.sic":{"source":"iana"},"application/vnd.wap.slc":{"source":"iana"},"application/vnd.wap.wbxml":{"source":"iana","charset":"UTF-8","extensions":["wbxml"]},"application/vnd.wap.wmlc":{"source":"iana","extensions":["wmlc"]},"application/vnd.wap.wmlscriptc":{"source":"iana","extensions":["wmlsc"]},"application/vnd.webturbo":{"source":"iana","extensions":["wtb"]},"application/vnd.wfa.dpp":{"source":"iana"},"application/vnd.wfa.p2p":{"source":"iana"},"application/vnd.wfa.wsc":{"source":"iana"},"application/vnd.windows.devicepairing":{"source":"iana"},"application/vnd.wmc":{"source":"iana"},"application/vnd.wmf.bootstrap":{"source":"iana"},"application/vnd.wolfram.mathematica":{"source":"iana"},"application/vnd.wolfram.mathematica.package":{"source":"iana"},"application/vnd.wolfram.player":{"source":"iana","extensions":["nbp"]},"application/vnd.wordperfect":{"source":"iana","extensions":["wpd"]},"application/vnd.wqd":{"source":"iana","extensions":["wqd"]},"application/vnd.wrq-hp3000-labelled":{"source":"iana"},"application/vnd.wt.stf":{"source":"iana","extensions":["stf"]},"application/vnd.wv.csp+wbxml":{"source":"iana"},"application/vnd.wv.csp+xml":{"source":"iana","compressible":true},"application/vnd.wv.ssp+xml":{"source":"iana","compressible":true},"application/vnd.xacml+json":{"source":"iana","compressible":true},"application/vnd.xara":{"source":"iana","extensions":["xar"]},"application/vnd.xfdl":{"source":"iana","extensions":["xfdl"]},"application/vnd.xfdl.webform":{"source":"iana"},"application/vnd.xmi+xml":{"source":"iana","compressible":true},"application/vnd.xmpie.cpkg":{"source":"iana"},"application/vnd.xmpie.dpkg":{"source":"iana"},"application/vnd.xmpie.plan":{"source":"iana"},"application/vnd.xmpie.ppkg":{"source":"iana"},"application/vnd.xmpie.xlim":{"source":"iana"},"application/vnd.yamaha.hv-dic":{"source":"iana","extensions":["hvd"]},"application/vnd.yamaha.hv-script":{"source":"iana","extensions":["hvs"]},"application/vnd.yamaha.hv-voice":{"source":"iana","extensions":["hvp"]},"application/vnd.yamaha.openscoreformat":{"source":"iana","extensions":["osf"]},"application/vnd.yamaha.openscoreformat.osfpvg+xml":{"source":"iana","compressible":true,"extensions":["osfpvg"]},"application/vnd.yamaha.remote-setup":{"source":"iana"},"application/vnd.yamaha.smaf-audio":{"source":"iana","extensions":["saf"]},"application/vnd.yamaha.smaf-phrase":{"source":"iana","extensions":["spf"]},"application/vnd.yamaha.through-ngn":{"source":"iana"},"application/vnd.yamaha.tunnel-udpencap":{"source":"iana"},"application/vnd.yaoweme":{"source":"iana"},"application/vnd.yellowriver-custom-menu":{"source":"iana","extensions":["cmp"]},"application/vnd.youtube.yt":{"source":"iana"},"application/vnd.zul":{"source":"iana","extensions":["zir","zirz"]},"application/vnd.zzazz.deck+xml":{"source":"iana","compressible":true,"extensions":["zaz"]},"application/voicexml+xml":{"source":"iana","compressible":true,"extensions":["vxml"]},"application/voucher-cms+json":{"source":"iana","compressible":true},"application/vq-rtcpxr":{"source":"iana"},"application/wasm":{"source":"iana","compressible":true,"extensions":["wasm"]},"application/watcherinfo+xml":{"source":"iana","compressible":true,"extensions":["wif"]},"application/webpush-options+json":{"source":"iana","compressible":true},"application/whoispp-query":{"source":"iana"},"application/whoispp-response":{"source":"iana"},"application/widget":{"source":"iana","extensions":["wgt"]},"application/winhlp":{"source":"apache","extensions":["hlp"]},"application/wita":{"source":"iana"},"application/wordperfect5.1":{"source":"iana"},"application/wsdl+xml":{"source":"iana","compressible":true,"extensions":["wsdl"]},"application/wspolicy+xml":{"source":"iana","compressible":true,"extensions":["wspolicy"]},"application/x-7z-compressed":{"source":"apache","compressible":false,"extensions":["7z"]},"application/x-abiword":{"source":"apache","extensions":["abw"]},"application/x-ace-compressed":{"source":"apache","extensions":["ace"]},"application/x-amf":{"source":"apache"},"application/x-apple-diskimage":{"source":"apache","extensions":["dmg"]},"application/x-arj":{"compressible":false,"extensions":["arj"]},"application/x-authorware-bin":{"source":"apache","extensions":["aab","x32","u32","vox"]},"application/x-authorware-map":{"source":"apache","extensions":["aam"]},"application/x-authorware-seg":{"source":"apache","extensions":["aas"]},"application/x-bcpio":{"source":"apache","extensions":["bcpio"]},"application/x-bdoc":{"compressible":false,"extensions":["bdoc"]},"application/x-bittorrent":{"source":"apache","extensions":["torrent"]},"application/x-blorb":{"source":"apache","extensions":["blb","blorb"]},"application/x-bzip":{"source":"apache","compressible":false,"extensions":["bz"]},"application/x-bzip2":{"source":"apache","compressible":false,"extensions":["bz2","boz"]},"application/x-cbr":{"source":"apache","extensions":["cbr","cba","cbt","cbz","cb7"]},"application/x-cdlink":{"source":"apache","extensions":["vcd"]},"application/x-cfs-compressed":{"source":"apache","extensions":["cfs"]},"application/x-chat":{"source":"apache","extensions":["chat"]},"application/x-chess-pgn":{"source":"apache","extensions":["pgn"]},"application/x-chrome-extension":{"extensions":["crx"]},"application/x-cocoa":{"source":"nginx","extensions":["cco"]},"application/x-compress":{"source":"apache"},"application/x-conference":{"source":"apache","extensions":["nsc"]},"application/x-cpio":{"source":"apache","extensions":["cpio"]},"application/x-csh":{"source":"apache","extensions":["csh"]},"application/x-deb":{"compressible":false},"application/x-debian-package":{"source":"apache","extensions":["deb","udeb"]},"application/x-dgc-compressed":{"source":"apache","extensions":["dgc"]},"application/x-director":{"source":"apache","extensions":["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"]},"application/x-doom":{"source":"apache","extensions":["wad"]},"application/x-dtbncx+xml":{"source":"apache","compressible":true,"extensions":["ncx"]},"application/x-dtbook+xml":{"source":"apache","compressible":true,"extensions":["dtb"]},"application/x-dtbresource+xml":{"source":"apache","compressible":true,"extensions":["res"]},"application/x-dvi":{"source":"apache","compressible":false,"extensions":["dvi"]},"application/x-envoy":{"source":"apache","extensions":["evy"]},"application/x-eva":{"source":"apache","extensions":["eva"]},"application/x-font-bdf":{"source":"apache","extensions":["bdf"]},"application/x-font-dos":{"source":"apache"},"application/x-font-framemaker":{"source":"apache"},"application/x-font-ghostscript":{"source":"apache","extensions":["gsf"]},"application/x-font-libgrx":{"source":"apache"},"application/x-font-linux-psf":{"source":"apache","extensions":["psf"]},"application/x-font-pcf":{"source":"apache","extensions":["pcf"]},"application/x-font-snf":{"source":"apache","extensions":["snf"]},"application/x-font-speedo":{"source":"apache"},"application/x-font-sunos-news":{"source":"apache"},"application/x-font-type1":{"source":"apache","extensions":["pfa","pfb","pfm","afm"]},"application/x-font-vfont":{"source":"apache"},"application/x-freearc":{"source":"apache","extensions":["arc"]},"application/x-futuresplash":{"source":"apache","extensions":["spl"]},"application/x-gca-compressed":{"source":"apache","extensions":["gca"]},"application/x-glulx":{"source":"apache","extensions":["ulx"]},"application/x-gnumeric":{"source":"apache","extensions":["gnumeric"]},"application/x-gramps-xml":{"source":"apache","extensions":["gramps"]},"application/x-gtar":{"source":"apache","extensions":["gtar"]},"application/x-gzip":{"source":"apache"},"application/x-hdf":{"source":"apache","extensions":["hdf"]},"application/x-httpd-php":{"compressible":true,"extensions":["php"]},"application/x-install-instructions":{"source":"apache","extensions":["install"]},"application/x-iso9660-image":{"source":"apache","extensions":["iso"]},"application/x-iwork-keynote-sffkey":{"extensions":["key"]},"application/x-iwork-numbers-sffnumbers":{"extensions":["numbers"]},"application/x-iwork-pages-sffpages":{"extensions":["pages"]},"application/x-java-archive-diff":{"source":"nginx","extensions":["jardiff"]},"application/x-java-jnlp-file":{"source":"apache","compressible":false,"extensions":["jnlp"]},"application/x-javascript":{"compressible":true},"application/x-keepass2":{"extensions":["kdbx"]},"application/x-latex":{"source":"apache","compressible":false,"extensions":["latex"]},"application/x-lua-bytecode":{"extensions":["luac"]},"application/x-lzh-compressed":{"source":"apache","extensions":["lzh","lha"]},"application/x-makeself":{"source":"nginx","extensions":["run"]},"application/x-mie":{"source":"apache","extensions":["mie"]},"application/x-mobipocket-ebook":{"source":"apache","extensions":["prc","mobi"]},"application/x-mpegurl":{"compressible":false},"application/x-ms-application":{"source":"apache","extensions":["application"]},"application/x-ms-shortcut":{"source":"apache","extensions":["lnk"]},"application/x-ms-wmd":{"source":"apache","extensions":["wmd"]},"application/x-ms-wmz":{"source":"apache","extensions":["wmz"]},"application/x-ms-xbap":{"source":"apache","extensions":["xbap"]},"application/x-msaccess":{"source":"apache","extensions":["mdb"]},"application/x-msbinder":{"source":"apache","extensions":["obd"]},"application/x-mscardfile":{"source":"apache","extensions":["crd"]},"application/x-msclip":{"source":"apache","extensions":["clp"]},"application/x-msdos-program":{"extensions":["exe"]},"application/x-msdownload":{"source":"apache","extensions":["exe","dll","com","bat","msi"]},"application/x-msmediaview":{"source":"apache","extensions":["mvb","m13","m14"]},"application/x-msmetafile":{"source":"apache","extensions":["wmf","wmz","emf","emz"]},"application/x-msmoney":{"source":"apache","extensions":["mny"]},"application/x-mspublisher":{"source":"apache","extensions":["pub"]},"application/x-msschedule":{"source":"apache","extensions":["scd"]},"application/x-msterminal":{"source":"apache","extensions":["trm"]},"application/x-mswrite":{"source":"apache","extensions":["wri"]},"application/x-netcdf":{"source":"apache","extensions":["nc","cdf"]},"application/x-ns-proxy-autoconfig":{"compressible":true,"extensions":["pac"]},"application/x-nzb":{"source":"apache","extensions":["nzb"]},"application/x-perl":{"source":"nginx","extensions":["pl","pm"]},"application/x-pilot":{"source":"nginx","extensions":["prc","pdb"]},"application/x-pkcs12":{"source":"apache","compressible":false,"extensions":["p12","pfx"]},"application/x-pkcs7-certificates":{"source":"apache","extensions":["p7b","spc"]},"application/x-pkcs7-certreqresp":{"source":"apache","extensions":["p7r"]},"application/x-pki-message":{"source":"iana"},"application/x-rar-compressed":{"source":"apache","compressible":false,"extensions":["rar"]},"application/x-redhat-package-manager":{"source":"nginx","extensions":["rpm"]},"application/x-research-info-systems":{"source":"apache","extensions":["ris"]},"application/x-sea":{"source":"nginx","extensions":["sea"]},"application/x-sh":{"source":"apache","compressible":true,"extensions":["sh"]},"application/x-shar":{"source":"apache","extensions":["shar"]},"application/x-shockwave-flash":{"source":"apache","compressible":false,"extensions":["swf"]},"application/x-silverlight-app":{"source":"apache","extensions":["xap"]},"application/x-sql":{"source":"apache","extensions":["sql"]},"application/x-stuffit":{"source":"apache","compressible":false,"extensions":["sit"]},"application/x-stuffitx":{"source":"apache","extensions":["sitx"]},"application/x-subrip":{"source":"apache","extensions":["srt"]},"application/x-sv4cpio":{"source":"apache","extensions":["sv4cpio"]},"application/x-sv4crc":{"source":"apache","extensions":["sv4crc"]},"application/x-t3vm-image":{"source":"apache","extensions":["t3"]},"application/x-tads":{"source":"apache","extensions":["gam"]},"application/x-tar":{"source":"apache","compressible":true,"extensions":["tar"]},"application/x-tcl":{"source":"apache","extensions":["tcl","tk"]},"application/x-tex":{"source":"apache","extensions":["tex"]},"application/x-tex-tfm":{"source":"apache","extensions":["tfm"]},"application/x-texinfo":{"source":"apache","extensions":["texinfo","texi"]},"application/x-tgif":{"source":"apache","extensions":["obj"]},"application/x-ustar":{"source":"apache","extensions":["ustar"]},"application/x-virtualbox-hdd":{"compressible":true,"extensions":["hdd"]},"application/x-virtualbox-ova":{"compressible":true,"extensions":["ova"]},"application/x-virtualbox-ovf":{"compressible":true,"extensions":["ovf"]},"application/x-virtualbox-vbox":{"compressible":true,"extensions":["vbox"]},"application/x-virtualbox-vbox-extpack":{"compressible":false,"extensions":["vbox-extpack"]},"application/x-virtualbox-vdi":{"compressible":true,"extensions":["vdi"]},"application/x-virtualbox-vhd":{"compressible":true,"extensions":["vhd"]},"application/x-virtualbox-vmdk":{"compressible":true,"extensions":["vmdk"]},"application/x-wais-source":{"source":"apache","extensions":["src"]},"application/x-web-app-manifest+json":{"compressible":true,"extensions":["webapp"]},"application/x-www-form-urlencoded":{"source":"iana","compressible":true},"application/x-x509-ca-cert":{"source":"iana","extensions":["der","crt","pem"]},"application/x-x509-ca-ra-cert":{"source":"iana"},"application/x-x509-next-ca-cert":{"source":"iana"},"application/x-xfig":{"source":"apache","extensions":["fig"]},"application/x-xliff+xml":{"source":"apache","compressible":true,"extensions":["xlf"]},"application/x-xpinstall":{"source":"apache","compressible":false,"extensions":["xpi"]},"application/x-xz":{"source":"apache","extensions":["xz"]},"application/x-zmachine":{"source":"apache","extensions":["z1","z2","z3","z4","z5","z6","z7","z8"]},"application/x400-bp":{"source":"iana"},"application/xacml+xml":{"source":"iana","compressible":true},"application/xaml+xml":{"source":"apache","compressible":true,"extensions":["xaml"]},"application/xcap-att+xml":{"source":"iana","compressible":true,"extensions":["xav"]},"application/xcap-caps+xml":{"source":"iana","compressible":true,"extensions":["xca"]},"application/xcap-diff+xml":{"source":"iana","compressible":true,"extensions":["xdf"]},"application/xcap-el+xml":{"source":"iana","compressible":true,"extensions":["xel"]},"application/xcap-error+xml":{"source":"iana","compressible":true},"application/xcap-ns+xml":{"source":"iana","compressible":true,"extensions":["xns"]},"application/xcon-conference-info+xml":{"source":"iana","compressible":true},"application/xcon-conference-info-diff+xml":{"source":"iana","compressible":true},"application/xenc+xml":{"source":"iana","compressible":true,"extensions":["xenc"]},"application/xhtml+xml":{"source":"iana","compressible":true,"extensions":["xhtml","xht"]},"application/xhtml-voice+xml":{"source":"apache","compressible":true},"application/xliff+xml":{"source":"iana","compressible":true,"extensions":["xlf"]},"application/xml":{"source":"iana","compressible":true,"extensions":["xml","xsl","xsd","rng"]},"application/xml-dtd":{"source":"iana","compressible":true,"extensions":["dtd"]},"application/xml-external-parsed-entity":{"source":"iana"},"application/xml-patch+xml":{"source":"iana","compressible":true},"application/xmpp+xml":{"source":"iana","compressible":true},"application/xop+xml":{"source":"iana","compressible":true,"extensions":["xop"]},"application/xproc+xml":{"source":"apache","compressible":true,"extensions":["xpl"]},"application/xslt+xml":{"source":"iana","compressible":true,"extensions":["xsl","xslt"]},"application/xspf+xml":{"source":"apache","compressible":true,"extensions":["xspf"]},"application/xv+xml":{"source":"iana","compressible":true,"extensions":["mxml","xhvml","xvml","xvm"]},"application/yang":{"source":"iana","extensions":["yang"]},"application/yang-data+json":{"source":"iana","compressible":true},"application/yang-data+xml":{"source":"iana","compressible":true},"application/yang-patch+json":{"source":"iana","compressible":true},"application/yang-patch+xml":{"source":"iana","compressible":true},"application/yin+xml":{"source":"iana","compressible":true,"extensions":["yin"]},"application/zip":{"source":"iana","compressible":false,"extensions":["zip"]},"application/zlib":{"source":"iana"},"application/zstd":{"source":"iana"},"audio/1d-interleaved-parityfec":{"source":"iana"},"audio/32kadpcm":{"source":"iana"},"audio/3gpp":{"source":"iana","compressible":false,"extensions":["3gpp"]},"audio/3gpp2":{"source":"iana"},"audio/aac":{"source":"iana"},"audio/ac3":{"source":"iana"},"audio/adpcm":{"source":"apache","extensions":["adp"]},"audio/amr":{"source":"iana","extensions":["amr"]},"audio/amr-wb":{"source":"iana"},"audio/amr-wb+":{"source":"iana"},"audio/aptx":{"source":"iana"},"audio/asc":{"source":"iana"},"audio/atrac-advanced-lossless":{"source":"iana"},"audio/atrac-x":{"source":"iana"},"audio/atrac3":{"source":"iana"},"audio/basic":{"source":"iana","compressible":false,"extensions":["au","snd"]},"audio/bv16":{"source":"iana"},"audio/bv32":{"source":"iana"},"audio/clearmode":{"source":"iana"},"audio/cn":{"source":"iana"},"audio/dat12":{"source":"iana"},"audio/dls":{"source":"iana"},"audio/dsr-es201108":{"source":"iana"},"audio/dsr-es202050":{"source":"iana"},"audio/dsr-es202211":{"source":"iana"},"audio/dsr-es202212":{"source":"iana"},"audio/dv":{"source":"iana"},"audio/dvi4":{"source":"iana"},"audio/eac3":{"source":"iana"},"audio/encaprtp":{"source":"iana"},"audio/evrc":{"source":"iana"},"audio/evrc-qcp":{"source":"iana"},"audio/evrc0":{"source":"iana"},"audio/evrc1":{"source":"iana"},"audio/evrcb":{"source":"iana"},"audio/evrcb0":{"source":"iana"},"audio/evrcb1":{"source":"iana"},"audio/evrcnw":{"source":"iana"},"audio/evrcnw0":{"source":"iana"},"audio/evrcnw1":{"source":"iana"},"audio/evrcwb":{"source":"iana"},"audio/evrcwb0":{"source":"iana"},"audio/evrcwb1":{"source":"iana"},"audio/evs":{"source":"iana"},"audio/flexfec":{"source":"iana"},"audio/fwdred":{"source":"iana"},"audio/g711-0":{"source":"iana"},"audio/g719":{"source":"iana"},"audio/g722":{"source":"iana"},"audio/g7221":{"source":"iana"},"audio/g723":{"source":"iana"},"audio/g726-16":{"source":"iana"},"audio/g726-24":{"source":"iana"},"audio/g726-32":{"source":"iana"},"audio/g726-40":{"source":"iana"},"audio/g728":{"source":"iana"},"audio/g729":{"source":"iana"},"audio/g7291":{"source":"iana"},"audio/g729d":{"source":"iana"},"audio/g729e":{"source":"iana"},"audio/gsm":{"source":"iana"},"audio/gsm-efr":{"source":"iana"},"audio/gsm-hr-08":{"source":"iana"},"audio/ilbc":{"source":"iana"},"audio/ip-mr_v2.5":{"source":"iana"},"audio/isac":{"source":"apache"},"audio/l16":{"source":"iana"},"audio/l20":{"source":"iana"},"audio/l24":{"source":"iana","compressible":false},"audio/l8":{"source":"iana"},"audio/lpc":{"source":"iana"},"audio/melp":{"source":"iana"},"audio/melp1200":{"source":"iana"},"audio/melp2400":{"source":"iana"},"audio/melp600":{"source":"iana"},"audio/mhas":{"source":"iana"},"audio/midi":{"source":"apache","extensions":["mid","midi","kar","rmi"]},"audio/mobile-xmf":{"source":"iana","extensions":["mxmf"]},"audio/mp3":{"compressible":false,"extensions":["mp3"]},"audio/mp4":{"source":"iana","compressible":false,"extensions":["m4a","mp4a"]},"audio/mp4a-latm":{"source":"iana"},"audio/mpa":{"source":"iana"},"audio/mpa-robust":{"source":"iana"},"audio/mpeg":{"source":"iana","compressible":false,"extensions":["mpga","mp2","mp2a","mp3","m2a","m3a"]},"audio/mpeg4-generic":{"source":"iana"},"audio/musepack":{"source":"apache"},"audio/ogg":{"source":"iana","compressible":false,"extensions":["oga","ogg","spx","opus"]},"audio/opus":{"source":"iana"},"audio/parityfec":{"source":"iana"},"audio/pcma":{"source":"iana"},"audio/pcma-wb":{"source":"iana"},"audio/pcmu":{"source":"iana"},"audio/pcmu-wb":{"source":"iana"},"audio/prs.sid":{"source":"iana"},"audio/qcelp":{"source":"iana"},"audio/raptorfec":{"source":"iana"},"audio/red":{"source":"iana"},"audio/rtp-enc-aescm128":{"source":"iana"},"audio/rtp-midi":{"source":"iana"},"audio/rtploopback":{"source":"iana"},"audio/rtx":{"source":"iana"},"audio/s3m":{"source":"apache","extensions":["s3m"]},"audio/scip":{"source":"iana"},"audio/silk":{"source":"apache","extensions":["sil"]},"audio/smv":{"source":"iana"},"audio/smv-qcp":{"source":"iana"},"audio/smv0":{"source":"iana"},"audio/sofa":{"source":"iana"},"audio/sp-midi":{"source":"iana"},"audio/speex":{"source":"iana"},"audio/t140c":{"source":"iana"},"audio/t38":{"source":"iana"},"audio/telephone-event":{"source":"iana"},"audio/tetra_acelp":{"source":"iana"},"audio/tetra_acelp_bb":{"source":"iana"},"audio/tone":{"source":"iana"},"audio/tsvcis":{"source":"iana"},"audio/uemclip":{"source":"iana"},"audio/ulpfec":{"source":"iana"},"audio/usac":{"source":"iana"},"audio/vdvi":{"source":"iana"},"audio/vmr-wb":{"source":"iana"},"audio/vnd.3gpp.iufp":{"source":"iana"},"audio/vnd.4sb":{"source":"iana"},"audio/vnd.audiokoz":{"source":"iana"},"audio/vnd.celp":{"source":"iana"},"audio/vnd.cisco.nse":{"source":"iana"},"audio/vnd.cmles.radio-events":{"source":"iana"},"audio/vnd.cns.anp1":{"source":"iana"},"audio/vnd.cns.inf1":{"source":"iana"},"audio/vnd.dece.audio":{"source":"iana","extensions":["uva","uvva"]},"audio/vnd.digital-winds":{"source":"iana","extensions":["eol"]},"audio/vnd.dlna.adts":{"source":"iana"},"audio/vnd.dolby.heaac.1":{"source":"iana"},"audio/vnd.dolby.heaac.2":{"source":"iana"},"audio/vnd.dolby.mlp":{"source":"iana"},"audio/vnd.dolby.mps":{"source":"iana"},"audio/vnd.dolby.pl2":{"source":"iana"},"audio/vnd.dolby.pl2x":{"source":"iana"},"audio/vnd.dolby.pl2z":{"source":"iana"},"audio/vnd.dolby.pulse.1":{"source":"iana"},"audio/vnd.dra":{"source":"iana","extensions":["dra"]},"audio/vnd.dts":{"source":"iana","extensions":["dts"]},"audio/vnd.dts.hd":{"source":"iana","extensions":["dtshd"]},"audio/vnd.dts.uhd":{"source":"iana"},"audio/vnd.dvb.file":{"source":"iana"},"audio/vnd.everad.plj":{"source":"iana"},"audio/vnd.hns.audio":{"source":"iana"},"audio/vnd.lucent.voice":{"source":"iana","extensions":["lvp"]},"audio/vnd.ms-playready.media.pya":{"source":"iana","extensions":["pya"]},"audio/vnd.nokia.mobile-xmf":{"source":"iana"},"audio/vnd.nortel.vbk":{"source":"iana"},"audio/vnd.nuera.ecelp4800":{"source":"iana","extensions":["ecelp4800"]},"audio/vnd.nuera.ecelp7470":{"source":"iana","extensions":["ecelp7470"]},"audio/vnd.nuera.ecelp9600":{"source":"iana","extensions":["ecelp9600"]},"audio/vnd.octel.sbc":{"source":"iana"},"audio/vnd.presonus.multitrack":{"source":"iana"},"audio/vnd.qcelp":{"source":"iana"},"audio/vnd.rhetorex.32kadpcm":{"source":"iana"},"audio/vnd.rip":{"source":"iana","extensions":["rip"]},"audio/vnd.rn-realaudio":{"compressible":false},"audio/vnd.sealedmedia.softseal.mpeg":{"source":"iana"},"audio/vnd.vmx.cvsd":{"source":"iana"},"audio/vnd.wave":{"compressible":false},"audio/vorbis":{"source":"iana","compressible":false},"audio/vorbis-config":{"source":"iana"},"audio/wav":{"compressible":false,"extensions":["wav"]},"audio/wave":{"compressible":false,"extensions":["wav"]},"audio/webm":{"source":"apache","compressible":false,"extensions":["weba"]},"audio/x-aac":{"source":"apache","compressible":false,"extensions":["aac"]},"audio/x-aiff":{"source":"apache","extensions":["aif","aiff","aifc"]},"audio/x-caf":{"source":"apache","compressible":false,"extensions":["caf"]},"audio/x-flac":{"source":"apache","extensions":["flac"]},"audio/x-m4a":{"source":"nginx","extensions":["m4a"]},"audio/x-matroska":{"source":"apache","extensions":["mka"]},"audio/x-mpegurl":{"source":"apache","extensions":["m3u"]},"audio/x-ms-wax":{"source":"apache","extensions":["wax"]},"audio/x-ms-wma":{"source":"apache","extensions":["wma"]},"audio/x-pn-realaudio":{"source":"apache","extensions":["ram","ra"]},"audio/x-pn-realaudio-plugin":{"source":"apache","extensions":["rmp"]},"audio/x-realaudio":{"source":"nginx","extensions":["ra"]},"audio/x-tta":{"source":"apache"},"audio/x-wav":{"source":"apache","extensions":["wav"]},"audio/xm":{"source":"apache","extensions":["xm"]},"chemical/x-cdx":{"source":"apache","extensions":["cdx"]},"chemical/x-cif":{"source":"apache","extensions":["cif"]},"chemical/x-cmdf":{"source":"apache","extensions":["cmdf"]},"chemical/x-cml":{"source":"apache","extensions":["cml"]},"chemical/x-csml":{"source":"apache","extensions":["csml"]},"chemical/x-pdb":{"source":"apache"},"chemical/x-xyz":{"source":"apache","extensions":["xyz"]},"font/collection":{"source":"iana","extensions":["ttc"]},"font/otf":{"source":"iana","compressible":true,"extensions":["otf"]},"font/sfnt":{"source":"iana"},"font/ttf":{"source":"iana","compressible":true,"extensions":["ttf"]},"font/woff":{"source":"iana","extensions":["woff"]},"font/woff2":{"source":"iana","extensions":["woff2"]},"image/aces":{"source":"iana","extensions":["exr"]},"image/apng":{"compressible":false,"extensions":["apng"]},"image/avci":{"source":"iana","extensions":["avci"]},"image/avcs":{"source":"iana","extensions":["avcs"]},"image/avif":{"source":"iana","compressible":false,"extensions":["avif"]},"image/bmp":{"source":"iana","compressible":true,"extensions":["bmp"]},"image/cgm":{"source":"iana","extensions":["cgm"]},"image/dicom-rle":{"source":"iana","extensions":["drle"]},"image/emf":{"source":"iana","extensions":["emf"]},"image/fits":{"source":"iana","extensions":["fits"]},"image/g3fax":{"source":"iana","extensions":["g3"]},"image/gif":{"source":"iana","compressible":false,"extensions":["gif"]},"image/heic":{"source":"iana","extensions":["heic"]},"image/heic-sequence":{"source":"iana","extensions":["heics"]},"image/heif":{"source":"iana","extensions":["heif"]},"image/heif-sequence":{"source":"iana","extensions":["heifs"]},"image/hej2k":{"source":"iana","extensions":["hej2"]},"image/hsj2":{"source":"iana","extensions":["hsj2"]},"image/ief":{"source":"iana","extensions":["ief"]},"image/jls":{"source":"iana","extensions":["jls"]},"image/jp2":{"source":"iana","compressible":false,"extensions":["jp2","jpg2"]},"image/jpeg":{"source":"iana","compressible":false,"extensions":["jpeg","jpg","jpe"]},"image/jph":{"source":"iana","extensions":["jph"]},"image/jphc":{"source":"iana","extensions":["jhc"]},"image/jpm":{"source":"iana","compressible":false,"extensions":["jpm"]},"image/jpx":{"source":"iana","compressible":false,"extensions":["jpx","jpf"]},"image/jxr":{"source":"iana","extensions":["jxr"]},"image/jxra":{"source":"iana","extensions":["jxra"]},"image/jxrs":{"source":"iana","extensions":["jxrs"]},"image/jxs":{"source":"iana","extensions":["jxs"]},"image/jxsc":{"source":"iana","extensions":["jxsc"]},"image/jxsi":{"source":"iana","extensions":["jxsi"]},"image/jxss":{"source":"iana","extensions":["jxss"]},"image/ktx":{"source":"iana","extensions":["ktx"]},"image/ktx2":{"source":"iana","extensions":["ktx2"]},"image/naplps":{"source":"iana"},"image/pjpeg":{"compressible":false},"image/png":{"source":"iana","compressible":false,"extensions":["png"]},"image/prs.btif":{"source":"iana","extensions":["btif"]},"image/prs.pti":{"source":"iana","extensions":["pti"]},"image/pwg-raster":{"source":"iana"},"image/sgi":{"source":"apache","extensions":["sgi"]},"image/svg+xml":{"source":"iana","compressible":true,"extensions":["svg","svgz"]},"image/t38":{"source":"iana","extensions":["t38"]},"image/tiff":{"source":"iana","compressible":false,"extensions":["tif","tiff"]},"image/tiff-fx":{"source":"iana","extensions":["tfx"]},"image/vnd.adobe.photoshop":{"source":"iana","compressible":true,"extensions":["psd"]},"image/vnd.airzip.accelerator.azv":{"source":"iana","extensions":["azv"]},"image/vnd.cns.inf2":{"source":"iana"},"image/vnd.dece.graphic":{"source":"iana","extensions":["uvi","uvvi","uvg","uvvg"]},"image/vnd.djvu":{"source":"iana","extensions":["djvu","djv"]},"image/vnd.dvb.subtitle":{"source":"iana","extensions":["sub"]},"image/vnd.dwg":{"source":"iana","extensions":["dwg"]},"image/vnd.dxf":{"source":"iana","extensions":["dxf"]},"image/vnd.fastbidsheet":{"source":"iana","extensions":["fbs"]},"image/vnd.fpx":{"source":"iana","extensions":["fpx"]},"image/vnd.fst":{"source":"iana","extensions":["fst"]},"image/vnd.fujixerox.edmics-mmr":{"source":"iana","extensions":["mmr"]},"image/vnd.fujixerox.edmics-rlc":{"source":"iana","extensions":["rlc"]},"image/vnd.globalgraphics.pgb":{"source":"iana"},"image/vnd.microsoft.icon":{"source":"iana","compressible":true,"extensions":["ico"]},"image/vnd.mix":{"source":"iana"},"image/vnd.mozilla.apng":{"source":"iana"},"image/vnd.ms-dds":{"compressible":true,"extensions":["dds"]},"image/vnd.ms-modi":{"source":"iana","extensions":["mdi"]},"image/vnd.ms-photo":{"source":"apache","extensions":["wdp"]},"image/vnd.net-fpx":{"source":"iana","extensions":["npx"]},"image/vnd.pco.b16":{"source":"iana","extensions":["b16"]},"image/vnd.radiance":{"source":"iana"},"image/vnd.sealed.png":{"source":"iana"},"image/vnd.sealedmedia.softseal.gif":{"source":"iana"},"image/vnd.sealedmedia.softseal.jpg":{"source":"iana"},"image/vnd.svf":{"source":"iana"},"image/vnd.tencent.tap":{"source":"iana","extensions":["tap"]},"image/vnd.valve.source.texture":{"source":"iana","extensions":["vtf"]},"image/vnd.wap.wbmp":{"source":"iana","extensions":["wbmp"]},"image/vnd.xiff":{"source":"iana","extensions":["xif"]},"image/vnd.zbrush.pcx":{"source":"iana","extensions":["pcx"]},"image/webp":{"source":"apache","extensions":["webp"]},"image/wmf":{"source":"iana","extensions":["wmf"]},"image/x-3ds":{"source":"apache","extensions":["3ds"]},"image/x-cmu-raster":{"source":"apache","extensions":["ras"]},"image/x-cmx":{"source":"apache","extensions":["cmx"]},"image/x-freehand":{"source":"apache","extensions":["fh","fhc","fh4","fh5","fh7"]},"image/x-icon":{"source":"apache","compressible":true,"extensions":["ico"]},"image/x-jng":{"source":"nginx","extensions":["jng"]},"image/x-mrsid-image":{"source":"apache","extensions":["sid"]},"image/x-ms-bmp":{"source":"nginx","compressible":true,"extensions":["bmp"]},"image/x-pcx":{"source":"apache","extensions":["pcx"]},"image/x-pict":{"source":"apache","extensions":["pic","pct"]},"image/x-portable-anymap":{"source":"apache","extensions":["pnm"]},"image/x-portable-bitmap":{"source":"apache","extensions":["pbm"]},"image/x-portable-graymap":{"source":"apache","extensions":["pgm"]},"image/x-portable-pixmap":{"source":"apache","extensions":["ppm"]},"image/x-rgb":{"source":"apache","extensions":["rgb"]},"image/x-tga":{"source":"apache","extensions":["tga"]},"image/x-xbitmap":{"source":"apache","extensions":["xbm"]},"image/x-xcf":{"compressible":false},"image/x-xpixmap":{"source":"apache","extensions":["xpm"]},"image/x-xwindowdump":{"source":"apache","extensions":["xwd"]},"message/cpim":{"source":"iana"},"message/delivery-status":{"source":"iana"},"message/disposition-notification":{"source":"iana","extensions":["disposition-notification"]},"message/external-body":{"source":"iana"},"message/feedback-report":{"source":"iana"},"message/global":{"source":"iana","extensions":["u8msg"]},"message/global-delivery-status":{"source":"iana","extensions":["u8dsn"]},"message/global-disposition-notification":{"source":"iana","extensions":["u8mdn"]},"message/global-headers":{"source":"iana","extensions":["u8hdr"]},"message/http":{"source":"iana","compressible":false},"message/imdn+xml":{"source":"iana","compressible":true},"message/news":{"source":"iana"},"message/partial":{"source":"iana","compressible":false},"message/rfc822":{"source":"iana","compressible":true,"extensions":["eml","mime"]},"message/s-http":{"source":"iana"},"message/sip":{"source":"iana"},"message/sipfrag":{"source":"iana"},"message/tracking-status":{"source":"iana"},"message/vnd.si.simp":{"source":"iana"},"message/vnd.wfa.wsc":{"source":"iana","extensions":["wsc"]},"model/3mf":{"source":"iana","extensions":["3mf"]},"model/e57":{"source":"iana"},"model/gltf+json":{"source":"iana","compressible":true,"extensions":["gltf"]},"model/gltf-binary":{"source":"iana","compressible":true,"extensions":["glb"]},"model/iges":{"source":"iana","compressible":false,"extensions":["igs","iges"]},"model/mesh":{"source":"iana","compressible":false,"extensions":["msh","mesh","silo"]},"model/mtl":{"source":"iana","extensions":["mtl"]},"model/obj":{"source":"iana","extensions":["obj"]},"model/step":{"source":"iana"},"model/step+xml":{"source":"iana","compressible":true,"extensions":["stpx"]},"model/step+zip":{"source":"iana","compressible":false,"extensions":["stpz"]},"model/step-xml+zip":{"source":"iana","compressible":false,"extensions":["stpxz"]},"model/stl":{"source":"iana","extensions":["stl"]},"model/vnd.collada+xml":{"source":"iana","compressible":true,"extensions":["dae"]},"model/vnd.dwf":{"source":"iana","extensions":["dwf"]},"model/vnd.flatland.3dml":{"source":"iana"},"model/vnd.gdl":{"source":"iana","extensions":["gdl"]},"model/vnd.gs-gdl":{"source":"apache"},"model/vnd.gs.gdl":{"source":"iana"},"model/vnd.gtw":{"source":"iana","extensions":["gtw"]},"model/vnd.moml+xml":{"source":"iana","compressible":true},"model/vnd.mts":{"source":"iana","extensions":["mts"]},"model/vnd.opengex":{"source":"iana","extensions":["ogex"]},"model/vnd.parasolid.transmit.binary":{"source":"iana","extensions":["x_b"]},"model/vnd.parasolid.transmit.text":{"source":"iana","extensions":["x_t"]},"model/vnd.pytha.pyox":{"source":"iana"},"model/vnd.rosette.annotated-data-model":{"source":"iana"},"model/vnd.sap.vds":{"source":"iana","extensions":["vds"]},"model/vnd.usdz+zip":{"source":"iana","compressible":false,"extensions":["usdz"]},"model/vnd.valve.source.compiled-map":{"source":"iana","extensions":["bsp"]},"model/vnd.vtu":{"source":"iana","extensions":["vtu"]},"model/vrml":{"source":"iana","compressible":false,"extensions":["wrl","vrml"]},"model/x3d+binary":{"source":"apache","compressible":false,"extensions":["x3db","x3dbz"]},"model/x3d+fastinfoset":{"source":"iana","extensions":["x3db"]},"model/x3d+vrml":{"source":"apache","compressible":false,"extensions":["x3dv","x3dvz"]},"model/x3d+xml":{"source":"iana","compressible":true,"extensions":["x3d","x3dz"]},"model/x3d-vrml":{"source":"iana","extensions":["x3dv"]},"multipart/alternative":{"source":"iana","compressible":false},"multipart/appledouble":{"source":"iana"},"multipart/byteranges":{"source":"iana"},"multipart/digest":{"source":"iana"},"multipart/encrypted":{"source":"iana","compressible":false},"multipart/form-data":{"source":"iana","compressible":false},"multipart/header-set":{"source":"iana"},"multipart/mixed":{"source":"iana"},"multipart/multilingual":{"source":"iana"},"multipart/parallel":{"source":"iana"},"multipart/related":{"source":"iana","compressible":false},"multipart/report":{"source":"iana"},"multipart/signed":{"source":"iana","compressible":false},"multipart/vnd.bint.med-plus":{"source":"iana"},"multipart/voice-message":{"source":"iana"},"multipart/x-mixed-replace":{"source":"iana"},"text/1d-interleaved-parityfec":{"source":"iana"},"text/cache-manifest":{"source":"iana","compressible":true,"extensions":["appcache","manifest"]},"text/calendar":{"source":"iana","extensions":["ics","ifb"]},"text/calender":{"compressible":true},"text/cmd":{"compressible":true},"text/coffeescript":{"extensions":["coffee","litcoffee"]},"text/cql":{"source":"iana"},"text/cql-expression":{"source":"iana"},"text/cql-identifier":{"source":"iana"},"text/css":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["css"]},"text/csv":{"source":"iana","compressible":true,"extensions":["csv"]},"text/csv-schema":{"source":"iana"},"text/directory":{"source":"iana"},"text/dns":{"source":"iana"},"text/ecmascript":{"source":"iana"},"text/encaprtp":{"source":"iana"},"text/enriched":{"source":"iana"},"text/fhirpath":{"source":"iana"},"text/flexfec":{"source":"iana"},"text/fwdred":{"source":"iana"},"text/gff3":{"source":"iana"},"text/grammar-ref-list":{"source":"iana"},"text/html":{"source":"iana","compressible":true,"extensions":["html","htm","shtml"]},"text/jade":{"extensions":["jade"]},"text/javascript":{"source":"iana","compressible":true},"text/jcr-cnd":{"source":"iana"},"text/jsx":{"compressible":true,"extensions":["jsx"]},"text/less":{"compressible":true,"extensions":["less"]},"text/markdown":{"source":"iana","compressible":true,"extensions":["markdown","md"]},"text/mathml":{"source":"nginx","extensions":["mml"]},"text/mdx":{"compressible":true,"extensions":["mdx"]},"text/mizar":{"source":"iana"},"text/n3":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["n3"]},"text/parameters":{"source":"iana","charset":"UTF-8"},"text/parityfec":{"source":"iana"},"text/plain":{"source":"iana","compressible":true,"extensions":["txt","text","conf","def","list","log","in","ini"]},"text/provenance-notation":{"source":"iana","charset":"UTF-8"},"text/prs.fallenstein.rst":{"source":"iana"},"text/prs.lines.tag":{"source":"iana","extensions":["dsc"]},"text/prs.prop.logic":{"source":"iana"},"text/raptorfec":{"source":"iana"},"text/red":{"source":"iana"},"text/rfc822-headers":{"source":"iana"},"text/richtext":{"source":"iana","compressible":true,"extensions":["rtx"]},"text/rtf":{"source":"iana","compressible":true,"extensions":["rtf"]},"text/rtp-enc-aescm128":{"source":"iana"},"text/rtploopback":{"source":"iana"},"text/rtx":{"source":"iana"},"text/sgml":{"source":"iana","extensions":["sgml","sgm"]},"text/shaclc":{"source":"iana"},"text/shex":{"source":"iana","extensions":["shex"]},"text/slim":{"extensions":["slim","slm"]},"text/spdx":{"source":"iana","extensions":["spdx"]},"text/strings":{"source":"iana"},"text/stylus":{"extensions":["stylus","styl"]},"text/t140":{"source":"iana"},"text/tab-separated-values":{"source":"iana","compressible":true,"extensions":["tsv"]},"text/troff":{"source":"iana","extensions":["t","tr","roff","man","me","ms"]},"text/turtle":{"source":"iana","charset":"UTF-8","extensions":["ttl"]},"text/ulpfec":{"source":"iana"},"text/uri-list":{"source":"iana","compressible":true,"extensions":["uri","uris","urls"]},"text/vcard":{"source":"iana","compressible":true,"extensions":["vcard"]},"text/vnd.a":{"source":"iana"},"text/vnd.abc":{"source":"iana"},"text/vnd.ascii-art":{"source":"iana"},"text/vnd.curl":{"source":"iana","extensions":["curl"]},"text/vnd.curl.dcurl":{"source":"apache","extensions":["dcurl"]},"text/vnd.curl.mcurl":{"source":"apache","extensions":["mcurl"]},"text/vnd.curl.scurl":{"source":"apache","extensions":["scurl"]},"text/vnd.debian.copyright":{"source":"iana","charset":"UTF-8"},"text/vnd.dmclientscript":{"source":"iana"},"text/vnd.dvb.subtitle":{"source":"iana","extensions":["sub"]},"text/vnd.esmertec.theme-descriptor":{"source":"iana","charset":"UTF-8"},"text/vnd.familysearch.gedcom":{"source":"iana","extensions":["ged"]},"text/vnd.ficlab.flt":{"source":"iana"},"text/vnd.fly":{"source":"iana","extensions":["fly"]},"text/vnd.fmi.flexstor":{"source":"iana","extensions":["flx"]},"text/vnd.gml":{"source":"iana"},"text/vnd.graphviz":{"source":"iana","extensions":["gv"]},"text/vnd.hans":{"source":"iana"},"text/vnd.hgl":{"source":"iana"},"text/vnd.in3d.3dml":{"source":"iana","extensions":["3dml"]},"text/vnd.in3d.spot":{"source":"iana","extensions":["spot"]},"text/vnd.iptc.newsml":{"source":"iana"},"text/vnd.iptc.nitf":{"source":"iana"},"text/vnd.latex-z":{"source":"iana"},"text/vnd.motorola.reflex":{"source":"iana"},"text/vnd.ms-mediapackage":{"source":"iana"},"text/vnd.net2phone.commcenter.command":{"source":"iana"},"text/vnd.radisys.msml-basic-layout":{"source":"iana"},"text/vnd.senx.warpscript":{"source":"iana"},"text/vnd.si.uricatalogue":{"source":"iana"},"text/vnd.sosi":{"source":"iana"},"text/vnd.sun.j2me.app-descriptor":{"source":"iana","charset":"UTF-8","extensions":["jad"]},"text/vnd.trolltech.linguist":{"source":"iana","charset":"UTF-8"},"text/vnd.wap.si":{"source":"iana"},"text/vnd.wap.sl":{"source":"iana"},"text/vnd.wap.wml":{"source":"iana","extensions":["wml"]},"text/vnd.wap.wmlscript":{"source":"iana","extensions":["wmls"]},"text/vtt":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["vtt"]},"text/x-asm":{"source":"apache","extensions":["s","asm"]},"text/x-c":{"source":"apache","extensions":["c","cc","cxx","cpp","h","hh","dic"]},"text/x-component":{"source":"nginx","extensions":["htc"]},"text/x-fortran":{"source":"apache","extensions":["f","for","f77","f90"]},"text/x-gwt-rpc":{"compressible":true},"text/x-handlebars-template":{"extensions":["hbs"]},"text/x-java-source":{"source":"apache","extensions":["java"]},"text/x-jquery-tmpl":{"compressible":true},"text/x-lua":{"extensions":["lua"]},"text/x-markdown":{"compressible":true,"extensions":["mkd"]},"text/x-nfo":{"source":"apache","extensions":["nfo"]},"text/x-opml":{"source":"apache","extensions":["opml"]},"text/x-org":{"compressible":true,"extensions":["org"]},"text/x-pascal":{"source":"apache","extensions":["p","pas"]},"text/x-processing":{"compressible":true,"extensions":["pde"]},"text/x-sass":{"extensions":["sass"]},"text/x-scss":{"extensions":["scss"]},"text/x-setext":{"source":"apache","extensions":["etx"]},"text/x-sfv":{"source":"apache","extensions":["sfv"]},"text/x-suse-ymp":{"compressible":true,"extensions":["ymp"]},"text/x-uuencode":{"source":"apache","extensions":["uu"]},"text/x-vcalendar":{"source":"apache","extensions":["vcs"]},"text/x-vcard":{"source":"apache","extensions":["vcf"]},"text/xml":{"source":"iana","compressible":true,"extensions":["xml"]},"text/xml-external-parsed-entity":{"source":"iana"},"text/yaml":{"compressible":true,"extensions":["yaml","yml"]},"video/1d-interleaved-parityfec":{"source":"iana"},"video/3gpp":{"source":"iana","extensions":["3gp","3gpp"]},"video/3gpp-tt":{"source":"iana"},"video/3gpp2":{"source":"iana","extensions":["3g2"]},"video/av1":{"source":"iana"},"video/bmpeg":{"source":"iana"},"video/bt656":{"source":"iana"},"video/celb":{"source":"iana"},"video/dv":{"source":"iana"},"video/encaprtp":{"source":"iana"},"video/ffv1":{"source":"iana"},"video/flexfec":{"source":"iana"},"video/h261":{"source":"iana","extensions":["h261"]},"video/h263":{"source":"iana","extensions":["h263"]},"video/h263-1998":{"source":"iana"},"video/h263-2000":{"source":"iana"},"video/h264":{"source":"iana","extensions":["h264"]},"video/h264-rcdo":{"source":"iana"},"video/h264-svc":{"source":"iana"},"video/h265":{"source":"iana"},"video/iso.segment":{"source":"iana","extensions":["m4s"]},"video/jpeg":{"source":"iana","extensions":["jpgv"]},"video/jpeg2000":{"source":"iana"},"video/jpm":{"source":"apache","extensions":["jpm","jpgm"]},"video/jxsv":{"source":"iana"},"video/mj2":{"source":"iana","extensions":["mj2","mjp2"]},"video/mp1s":{"source":"iana"},"video/mp2p":{"source":"iana"},"video/mp2t":{"source":"iana","extensions":["ts"]},"video/mp4":{"source":"iana","compressible":false,"extensions":["mp4","mp4v","mpg4"]},"video/mp4v-es":{"source":"iana"},"video/mpeg":{"source":"iana","compressible":false,"extensions":["mpeg","mpg","mpe","m1v","m2v"]},"video/mpeg4-generic":{"source":"iana"},"video/mpv":{"source":"iana"},"video/nv":{"source":"iana"},"video/ogg":{"source":"iana","compressible":false,"extensions":["ogv"]},"video/parityfec":{"source":"iana"},"video/pointer":{"source":"iana"},"video/quicktime":{"source":"iana","compressible":false,"extensions":["qt","mov"]},"video/raptorfec":{"source":"iana"},"video/raw":{"source":"iana"},"video/rtp-enc-aescm128":{"source":"iana"},"video/rtploopback":{"source":"iana"},"video/rtx":{"source":"iana"},"video/scip":{"source":"iana"},"video/smpte291":{"source":"iana"},"video/smpte292m":{"source":"iana"},"video/ulpfec":{"source":"iana"},"video/vc1":{"source":"iana"},"video/vc2":{"source":"iana"},"video/vnd.cctv":{"source":"iana"},"video/vnd.dece.hd":{"source":"iana","extensions":["uvh","uvvh"]},"video/vnd.dece.mobile":{"source":"iana","extensions":["uvm","uvvm"]},"video/vnd.dece.mp4":{"source":"iana"},"video/vnd.dece.pd":{"source":"iana","extensions":["uvp","uvvp"]},"video/vnd.dece.sd":{"source":"iana","extensions":["uvs","uvvs"]},"video/vnd.dece.video":{"source":"iana","extensions":["uvv","uvvv"]},"video/vnd.directv.mpeg":{"source":"iana"},"video/vnd.directv.mpeg-tts":{"source":"iana"},"video/vnd.dlna.mpeg-tts":{"source":"iana"},"video/vnd.dvb.file":{"source":"iana","extensions":["dvb"]},"video/vnd.fvt":{"source":"iana","extensions":["fvt"]},"video/vnd.hns.video":{"source":"iana"},"video/vnd.iptvforum.1dparityfec-1010":{"source":"iana"},"video/vnd.iptvforum.1dparityfec-2005":{"source":"iana"},"video/vnd.iptvforum.2dparityfec-1010":{"source":"iana"},"video/vnd.iptvforum.2dparityfec-2005":{"source":"iana"},"video/vnd.iptvforum.ttsavc":{"source":"iana"},"video/vnd.iptvforum.ttsmpeg2":{"source":"iana"},"video/vnd.motorola.video":{"source":"iana"},"video/vnd.motorola.videop":{"source":"iana"},"video/vnd.mpegurl":{"source":"iana","extensions":["mxu","m4u"]},"video/vnd.ms-playready.media.pyv":{"source":"iana","extensions":["pyv"]},"video/vnd.nokia.interleaved-multimedia":{"source":"iana"},"video/vnd.nokia.mp4vr":{"source":"iana"},"video/vnd.nokia.videovoip":{"source":"iana"},"video/vnd.objectvideo":{"source":"iana"},"video/vnd.radgamettools.bink":{"source":"iana"},"video/vnd.radgamettools.smacker":{"source":"iana"},"video/vnd.sealed.mpeg1":{"source":"iana"},"video/vnd.sealed.mpeg4":{"source":"iana"},"video/vnd.sealed.swf":{"source":"iana"},"video/vnd.sealedmedia.softseal.mov":{"source":"iana"},"video/vnd.uvvu.mp4":{"source":"iana","extensions":["uvu","uvvu"]},"video/vnd.vivo":{"source":"iana","extensions":["viv"]},"video/vnd.youtube.yt":{"source":"iana"},"video/vp8":{"source":"iana"},"video/vp9":{"source":"iana"},"video/webm":{"source":"apache","compressible":false,"extensions":["webm"]},"video/x-f4v":{"source":"apache","extensions":["f4v"]},"video/x-fli":{"source":"apache","extensions":["fli"]},"video/x-flv":{"source":"apache","compressible":false,"extensions":["flv"]},"video/x-m4v":{"source":"apache","extensions":["m4v"]},"video/x-matroska":{"source":"apache","compressible":false,"extensions":["mkv","mk3d","mks"]},"video/x-mng":{"source":"apache","extensions":["mng"]},"video/x-ms-asf":{"source":"apache","extensions":["asf","asx"]},"video/x-ms-vob":{"source":"apache","extensions":["vob"]},"video/x-ms-wm":{"source":"apache","extensions":["wm"]},"video/x-ms-wmv":{"source":"apache","compressible":false,"extensions":["wmv"]},"video/x-ms-wmx":{"source":"apache","extensions":["wmx"]},"video/x-ms-wvx":{"source":"apache","extensions":["wvx"]},"video/x-msvideo":{"source":"apache","extensions":["avi"]},"video/x-sgi-movie":{"source":"apache","extensions":["movie"]},"video/x-smv":{"source":"apache","extensions":["smv"]},"x-conference/x-cooltalk":{"source":"apache","extensions":["ice"]},"x-shader/x-fragment":{"compressible":true},"x-shader/x-vertex":{"compressible":true}}');
/***/ }),
diff --git a/dist/gha/index.js b/dist/gha/index.js
index 1cc3bde..b477378 100755
--- a/dist/gha/index.js
+++ b/dist/gha/index.js
@@ -22,37 +22,204 @@ runner.run();
/***/ }),
-/***/ 7283:
-/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
+/***/ 3025:
+/***/ ((__unused_webpack_module, exports) => {
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
-const core_1 = __nccwpck_require__(2186);
-class GHAArgsParser {
- /**
- * Return the input only if it is not a blank or null string, otherwise returns undefined
- * @param key input key
- * @returns the value or undefined
- */
- _getOrUndefined(key) {
- const value = (0, core_1.getInput)(key);
- return value !== "" ? value : undefined;
+/**
+ * Abstract arguments parser interface in charge to parse inputs and
+ * produce a common Args object
+ */
+class ArgsParser {
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ getOrDefault(parsedValue, defaultValue) {
+ return parsedValue === undefined ? defaultValue : parsedValue;
}
parse() {
+ const args = this.readArgs();
+ if (!args.pullRequest) {
+ throw new Error("Missing option: pull request must be provided");
+ }
+ // validate and fill with defaults
+ if ((!args.targetBranch || args.targetBranch.trim().length == 0) && !args.targetBranchPattern) {
+ throw new Error("Missing option: target branch(es) or target regular expression must be provided");
+ }
return {
- dryRun: (0, core_1.getInput)("dry-run") === "true",
- auth: (0, core_1.getInput)("auth") ? (0, core_1.getInput)("auth") : "",
- pullRequest: (0, core_1.getInput)("pull-request"),
- targetBranch: (0, core_1.getInput)("target-branch"),
- folder: this._getOrUndefined("folder"),
- title: this._getOrUndefined("title"),
- body: this._getOrUndefined("body"),
- bodyPrefix: this._getOrUndefined("body-prefix"),
- bpBranchName: this._getOrUndefined("bp-branch-name"),
+ pullRequest: args.pullRequest,
+ targetBranch: args.targetBranch,
+ targetBranchPattern: args.targetBranchPattern,
+ dryRun: this.getOrDefault(args.dryRun, false),
+ auth: this.getOrDefault(args.auth),
+ folder: this.getOrDefault(args.folder),
+ gitClient: this.getOrDefault(args.gitClient),
+ gitUser: this.getOrDefault(args.gitUser),
+ gitEmail: this.getOrDefault(args.gitEmail),
+ title: this.getOrDefault(args.title),
+ body: this.getOrDefault(args.body),
+ bodyPrefix: this.getOrDefault(args.bodyPrefix),
+ bpBranchName: this.getOrDefault(args.bpBranchName),
+ reviewers: this.getOrDefault(args.reviewers, []),
+ assignees: this.getOrDefault(args.assignees, []),
+ inheritReviewers: this.getOrDefault(args.inheritReviewers, true),
+ labels: this.getOrDefault(args.labels, []),
+ inheritLabels: this.getOrDefault(args.inheritLabels, false),
+ squash: this.getOrDefault(args.squash, true),
+ autoNoSquash: this.getOrDefault(args.autoNoSquash, false),
+ strategy: this.getOrDefault(args.strategy),
+ strategyOption: this.getOrDefault(args.strategyOption),
+ cherryPickOptions: this.getOrDefault(args.cherryPickOptions),
+ comments: this.getOrDefault(args.comments),
+ enableErrorNotification: this.getOrDefault(args.enableErrorNotification, false),
};
}
}
+exports["default"] = ArgsParser;
+
+
+/***/ }),
+
+/***/ 8048:
+/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
+
+"use strict";
+
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
+ if (k2 === undefined) k2 = k;
+ var desc = Object.getOwnPropertyDescriptor(m, k);
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
+ desc = { enumerable: true, get: function() { return m[k]; } };
+ }
+ Object.defineProperty(o, k2, desc);
+}) : (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.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
+ __setModuleDefault(result, mod);
+ return result;
+};
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.getAsBooleanOrUndefined = exports.getAsSemicolonSeparatedList = exports.getAsCommaSeparatedList = exports.getAsCleanedCommaSeparatedList = exports.getOrUndefined = exports.readConfigFile = exports.parseArgs = void 0;
+const fs = __importStar(__nccwpck_require__(7147));
+/**
+ * Parse the input configuation string as json object and
+ * return it as Args
+ * @param configFileContent
+ * @returns {Args}
+ */
+function parseArgs(configFileContent) {
+ return JSON.parse(configFileContent);
+}
+exports.parseArgs = parseArgs;
+/**
+ * Read a configuration file in json format anf parse it as {Args}
+ * @param pathToFile Full path name of the config file, e.g., /tmp/dir/config-file.json
+ * @returns {Args}
+ */
+function readConfigFile(pathToFile) {
+ const asString = fs.readFileSync(pathToFile, "utf-8");
+ return parseArgs(asString);
+}
+exports.readConfigFile = readConfigFile;
+/**
+ * Return the input only if it is not a blank or null string, otherwise returns undefined
+ * @param key input key
+ * @returns the value or undefined
+ */
+function getOrUndefined(value) {
+ return value !== "" ? value : undefined;
+}
+exports.getOrUndefined = getOrUndefined;
+// get rid of inner spaces too
+function getAsCleanedCommaSeparatedList(value) {
+ // trim the value
+ const trimmed = value.trim();
+ return trimmed !== "" ? trimmed.replace(/\s/g, "").split(",") : undefined;
+}
+exports.getAsCleanedCommaSeparatedList = getAsCleanedCommaSeparatedList;
+// preserve inner spaces
+function getAsCommaSeparatedList(value) {
+ // trim the value
+ const trimmed = value.trim();
+ return trimmed !== "" ? trimmed.split(",").map(v => v.trim()) : undefined;
+}
+exports.getAsCommaSeparatedList = getAsCommaSeparatedList;
+function getAsSemicolonSeparatedList(value) {
+ // trim the value
+ const trimmed = value.trim();
+ return trimmed !== "" ? trimmed.split(";").map(v => v.trim()) : undefined;
+}
+exports.getAsSemicolonSeparatedList = getAsSemicolonSeparatedList;
+function getAsBooleanOrUndefined(value) {
+ const trimmed = value.trim();
+ return trimmed !== "" ? trimmed.toLowerCase() === "true" : undefined;
+}
+exports.getAsBooleanOrUndefined = getAsBooleanOrUndefined;
+
+
+/***/ }),
+
+/***/ 7283:
+/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
+
+"use strict";
+
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+const args_parser_1 = __importDefault(__nccwpck_require__(3025));
+const core_1 = __nccwpck_require__(2186);
+const args_utils_1 = __nccwpck_require__(8048);
+class GHAArgsParser extends args_parser_1.default {
+ readArgs() {
+ const configFile = (0, args_utils_1.getOrUndefined)((0, core_1.getInput)("config-file"));
+ let args;
+ if (configFile) {
+ args = (0, args_utils_1.readConfigFile)(configFile);
+ }
+ else {
+ args = {
+ dryRun: (0, args_utils_1.getAsBooleanOrUndefined)((0, core_1.getInput)("dry-run")),
+ auth: (0, args_utils_1.getOrUndefined)((0, core_1.getInput)("auth")),
+ pullRequest: (0, core_1.getInput)("pull-request"),
+ targetBranch: (0, args_utils_1.getOrUndefined)((0, core_1.getInput)("target-branch")),
+ targetBranchPattern: (0, args_utils_1.getOrUndefined)((0, core_1.getInput)("target-branch-pattern")),
+ folder: (0, args_utils_1.getOrUndefined)((0, core_1.getInput)("folder")),
+ gitClient: (0, args_utils_1.getOrUndefined)((0, core_1.getInput)("git-client")),
+ gitUser: (0, args_utils_1.getOrUndefined)((0, core_1.getInput)("git-user")),
+ gitEmail: (0, args_utils_1.getOrUndefined)((0, core_1.getInput)("git-email")),
+ title: (0, args_utils_1.getOrUndefined)((0, core_1.getInput)("title")),
+ body: (0, args_utils_1.getOrUndefined)((0, core_1.getInput)("body", { trimWhitespace: false })),
+ bodyPrefix: (0, args_utils_1.getOrUndefined)((0, core_1.getInput)("body-prefix", { trimWhitespace: false })),
+ bpBranchName: (0, args_utils_1.getOrUndefined)((0, core_1.getInput)("bp-branch-name")),
+ reviewers: (0, args_utils_1.getAsCleanedCommaSeparatedList)((0, core_1.getInput)("reviewers")),
+ assignees: (0, args_utils_1.getAsCleanedCommaSeparatedList)((0, core_1.getInput)("assignees")),
+ inheritReviewers: !(0, args_utils_1.getAsBooleanOrUndefined)((0, core_1.getInput)("no-inherit-reviewers")),
+ labels: (0, args_utils_1.getAsCommaSeparatedList)((0, core_1.getInput)("labels")),
+ inheritLabels: (0, args_utils_1.getAsBooleanOrUndefined)((0, core_1.getInput)("inherit-labels")),
+ squash: !(0, args_utils_1.getAsBooleanOrUndefined)((0, core_1.getInput)("no-squash")),
+ autoNoSquash: (0, args_utils_1.getAsBooleanOrUndefined)((0, core_1.getInput)("auto-no-squash")),
+ strategy: (0, args_utils_1.getOrUndefined)((0, core_1.getInput)("strategy")),
+ strategyOption: (0, args_utils_1.getOrUndefined)((0, core_1.getInput)("strategy-option")),
+ cherryPickOptions: (0, args_utils_1.getOrUndefined)((0, core_1.getInput)("cherry-pick-options")),
+ comments: (0, args_utils_1.getAsSemicolonSeparatedList)((0, core_1.getInput)("comments")),
+ enableErrorNotification: (0, args_utils_1.getAsBooleanOrUndefined)((0, core_1.getInput)("enable-err-notification")),
+ };
+ }
+ return args;
+ }
+}
exports["default"] = GHAArgsParser;
@@ -81,11 +248,11 @@ class ConfigsParser {
// apply validation, throw errors if something is wrong
// if pr is opened check if the there exists one single commit
if (configs.originalPullRequest.state == "open") {
- this.logger.warn("Trying to backport an open pull request!");
+ this.logger.warn("Trying to backport an open pull request");
}
- // if PR is closed and not merged log a warning
+ // if PR is closed and not merged throw an error
if (configs.originalPullRequest.state == "closed" && !configs.originalPullRequest.merged) {
- throw new Error("Provided pull request is closed and not merged!");
+ throw new Error("Provided pull request is closed and not merged");
}
return Promise.resolve(configs);
}
@@ -93,6 +260,30 @@ class ConfigsParser {
exports["default"] = ConfigsParser;
+/***/ }),
+
+/***/ 4753:
+/***/ ((__unused_webpack_module, exports) => {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.AuthTokenId = exports.MESSAGE_TARGET_BRANCH_PLACEHOLDER = exports.MESSAGE_ERROR_PLACEHOLDER = void 0;
+exports.MESSAGE_ERROR_PLACEHOLDER = "{{error}}";
+exports.MESSAGE_TARGET_BRANCH_PLACEHOLDER = "{{target-branch}}";
+var AuthTokenId;
+(function (AuthTokenId) {
+ // github specific token
+ AuthTokenId["GITHUB_TOKEN"] = "GITHUB_TOKEN";
+ // gitlab specific token
+ AuthTokenId["GITLAB_TOKEN"] = "GITLAB_TOKEN";
+ // codeberg specific token
+ AuthTokenId["CODEBERG_TOKEN"] = "CODEBERG_TOKEN";
+ // generic git token
+ AuthTokenId["GIT_TOKEN"] = "GIT_TOKEN";
+})(AuthTokenId = exports.AuthTokenId || (exports.AuthTokenId = {}));
+
+
/***/ }),
/***/ 6618:
@@ -104,29 +295,92 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
+const args_utils_1 = __nccwpck_require__(8048);
const configs_parser_1 = __importDefault(__nccwpck_require__(5799));
-const git_service_factory_1 = __importDefault(__nccwpck_require__(5107));
+const configs_types_1 = __nccwpck_require__(4753);
+const git_client_factory_1 = __importDefault(__nccwpck_require__(8550));
class PullRequestConfigsParser extends configs_parser_1.default {
constructor() {
super();
- this.gitService = git_service_factory_1.default.getService();
+ this.gitClient = git_client_factory_1.default.getClient();
}
async parse(args) {
- const pr = await this.gitService.getPullRequestFromUrl(args.pullRequest);
+ let pr;
+ if (args.autoNoSquash) {
+ args.squash = undefined;
+ }
+ try {
+ pr = await this.gitClient.getPullRequestFromUrl(args.pullRequest, args.squash);
+ }
+ catch (error) {
+ this.logger.error("Something went wrong retrieving pull request");
+ throw error;
+ }
const folder = args.folder ?? this.getDefaultFolder();
+ let targetBranches = [];
+ if (args.targetBranchPattern) {
+ // parse labels to extract target branch(es)
+ targetBranches = this.getTargetBranchesFromLabels(args.targetBranchPattern, pr.labels);
+ if (targetBranches.length === 0) {
+ throw new Error(`Unable to extract target branches with regular expression "${args.targetBranchPattern}"`);
+ }
+ }
+ else {
+ // target branch must be provided if targetRegExp is missing
+ targetBranches = [...new Set((0, args_utils_1.getAsCommaSeparatedList)(args.targetBranch))];
+ }
+ const bpBranchNames = [...new Set(args.bpBranchName ? ((0, args_utils_1.getAsCleanedCommaSeparatedList)(args.bpBranchName) ?? []) : [])];
+ if (bpBranchNames.length > 1 && bpBranchNames.length != targetBranches.length) {
+ throw new Error(`The number of backport branch names, if provided, must match the number of target branches or just one, provided ${bpBranchNames.length} branch names instead`);
+ }
return {
dryRun: args.dryRun,
auth: args.auth,
- author: args.author ?? pr.author,
folder: `${folder.startsWith("/") ? "" : process.cwd() + "/"}${args.folder ?? this.getDefaultFolder()}`,
- targetBranch: args.targetBranch,
+ mergeStrategy: args.strategy,
+ mergeStrategyOption: args.strategyOption,
+ cherryPickOptions: args.cherryPickOptions,
originalPullRequest: pr,
- backportPullRequest: this.getDefaultBackportPullRequest(pr, args)
+ backportPullRequests: this.generateBackportPullRequestsData(pr, args, targetBranches, bpBranchNames),
+ git: {
+ user: args.gitUser ?? this.gitClient.getDefaultGitUser(),
+ email: args.gitEmail ?? this.gitClient.getDefaultGitEmail(),
+ },
+ errorNotification: {
+ enabled: args.enableErrorNotification ?? false,
+ message: this.getDefaultErrorComment(),
+ },
};
}
getDefaultFolder() {
return "bp";
}
+ getDefaultErrorComment() {
+ // TODO: fetch from arg or set default with placeholder {{error}}
+ return `The backport to \`${configs_types_1.MESSAGE_TARGET_BRANCH_PLACEHOLDER}\` failed. Check the latest run for more details.`;
+ }
+ /**
+ * Parse the provided labels and return a list of target branches
+ * obtained by applying the provided pattern as regular expression extractor
+ * @param pattern reg exp pattern to extract target branch from label name
+ * @param labels list of labels to check
+ * @returns list of target branches
+ */
+ getTargetBranchesFromLabels(pattern, labels) {
+ this.logger.debug(`Extracting branches from [${labels}] using ${pattern}`);
+ const regExp = new RegExp(pattern);
+ const branches = [];
+ for (const l of labels) {
+ const result = regExp.exec(l);
+ if (result?.groups) {
+ const { target } = result.groups;
+ if (target) {
+ branches.push(target);
+ }
+ }
+ }
+ return [...new Set(branches)];
+ }
/**
* Create a backport pull request starting from the target branch and
* the original pr to be backported
@@ -134,25 +388,52 @@ class PullRequestConfigsParser extends configs_parser_1.default {
* @param targetBranch target branch where the backport should be applied
* @returns {GitPullRequest}
*/
- getDefaultBackportPullRequest(originalPullRequest, args) {
- const reviewers = [];
- reviewers.push(originalPullRequest.author);
- if (originalPullRequest.mergedBy) {
- reviewers.push(originalPullRequest.mergedBy);
+ generateBackportPullRequestsData(originalPullRequest, args, targetBranches, bpBranchNames) {
+ const reviewers = args.reviewers ?? [];
+ if (reviewers.length == 0 && args.inheritReviewers) {
+ // inherit only if args.reviewers is empty and args.inheritReviewers set to true
+ reviewers.push(originalPullRequest.author);
+ if (originalPullRequest.mergedBy) {
+ reviewers.push(originalPullRequest.mergedBy);
+ }
}
const bodyPrefix = args.bodyPrefix ?? `**Backport:** ${originalPullRequest.htmlUrl}\r\n\r\n`;
- const body = args.body ?? `${originalPullRequest.body}\r\n\r\nPowered by [BPer](https://github.com/lampajr/backporting).`;
- return {
- author: originalPullRequest.author,
- title: args.title ?? `[${args.targetBranch}] ${originalPullRequest.title}`,
- body: `${bodyPrefix}${body}`,
- reviewers: [...new Set(reviewers)],
- targetRepo: originalPullRequest.targetRepo,
- sourceRepo: originalPullRequest.targetRepo,
- branchName: args.bpBranchName,
- nCommits: 0,
- commits: [] // TODO needed?
- };
+ const body = bodyPrefix + (args.body ?? `${originalPullRequest.body}`);
+ const labels = args.labels ?? [];
+ if (args.inheritLabels) {
+ labels.push(...originalPullRequest.labels);
+ }
+ return targetBranches.map((tb, idx) => {
+ // if there multiple branch names take the corresponding one, otherwise get the the first one if it exists
+ let backportBranch = bpBranchNames.length > 1 ? bpBranchNames[idx] : bpBranchNames[0];
+ if (backportBranch === undefined || backportBranch.trim() === "") {
+ // for each commit takes the first 7 chars that are enough to uniquely identify them in most of the projects
+ const concatenatedCommits = originalPullRequest.commits.map(c => c.slice(0, 7)).join("-");
+ backportBranch = `bp-${tb}-${concatenatedCommits}`;
+ }
+ else if (bpBranchNames.length == 1 && targetBranches.length > 1) {
+ // multiple targets and single custom backport branch name we need to differentiate branch names
+ // so append "-${tb}" to the provided name
+ backportBranch = backportBranch + `-${tb}`;
+ }
+ if (backportBranch.length > 250) {
+ this.logger.warn(`Backport branch (length=${backportBranch.length}) exceeded the max length of 250 chars, branch name truncated!`);
+ backportBranch = backportBranch.slice(0, 250);
+ }
+ return {
+ owner: originalPullRequest.targetRepo.owner,
+ repo: originalPullRequest.targetRepo.project,
+ head: backportBranch,
+ base: tb,
+ title: args.title ?? `[${tb}] ${originalPullRequest.title}`,
+ // preserve new line chars
+ body: body.replace(/\\n/g, "\n").replace(/\\r/g, "\r"),
+ reviewers: [...new Set(reviewers)],
+ assignees: [...new Set(args.assignees)],
+ labels: [...new Set(labels)],
+ comments: args.comments?.map(c => c.replace(/\\n/g, "\n").replace(/\\r/g, "\r")) ?? [],
+ };
+ });
}
}
exports["default"] = PullRequestConfigsParser;
@@ -176,10 +457,10 @@ const fs_1 = __importDefault(__nccwpck_require__(7147));
* Command line git commands executor service
*/
class GitCLIService {
- constructor(auth, author) {
+ constructor(auth, gitData) {
this.logger = logger_service_factory_1.default.getLogger();
this.auth = auth;
- this.author = author;
+ this.gitData = gitData;
}
/**
* Return a pre-configured SimpleGit instance able to execute commands from current
@@ -189,15 +470,16 @@ class GitCLIService {
*/
git(cwd) {
const gitConfig = { ...(cwd ? { baseDir: cwd } : {}) };
- return (0, simple_git_1.default)(gitConfig).addConfig("user.name", this.author).addConfig("user.email", "noreply@github.com");
+ return (0, simple_git_1.default)(gitConfig).addConfig("user.name", this.gitData.user).addConfig("user.email", this.gitData.email);
}
/**
* Update the provided remote URL by adding the auth token if not empty
- * @param remoteURL remote link, e.g., https://github.com/lampajr/backporting-example.git
+ * @param remoteURL remote link, e.g., https://github.com/kiegroup/git-backporting-example.git
*/
remoteWithAuth(remoteURL) {
- if (this.auth && this.author) {
- return remoteURL.replace("://", `://${this.author}:${this.auth}@`);
+ if (this.auth) {
+ // Anything will work as a username.
+ return remoteURL.replace("://", `://token:${this.auth}@`);
}
// return remote as it is
return remoteURL;
@@ -218,13 +500,22 @@ class GitCLIService {
* @param branch branch which should be cloned
*/
async clone(from, to, branch) {
- this.logger.info(`Cloning repository ${from} to ${to}.`);
+ this.logger.info(`Cloning repository ${from} to ${to}`);
if (!fs_1.default.existsSync(to)) {
await (0, simple_git_1.default)().clone(this.remoteWithAuth(from), to, ["--quiet", "--shallow-submodules", "--no-tags", "--branch", branch]);
+ return;
}
- else {
- this.logger.warn(`Folder ${to} already exist. Won't clone`);
+ this.logger.info(`Folder ${to} already exist. Won't clone`);
+ // ensure the working tree is properly reset - no stale changes
+ // from previous (failed) backport
+ const ongoingCherryPick = await this.anyConflict(to);
+ if (ongoingCherryPick) {
+ this.logger.warn("Found previously failed cherry-pick, aborting it");
+ await this.git(to).raw(["cherry-pick", "--abort"]);
}
+ // checkout to the proper branch
+ this.logger.info(`Checking out branch ${branch}`);
+ await this.git(to).checkout(branch);
}
/**
* Create a new branch starting from the current one and checkout in it
@@ -232,7 +523,7 @@ class GitCLIService {
* @param newBranch new branch name
*/
async createLocalBranch(cwd, newBranch) {
- this.logger.info(`Creating branch ${newBranch}.`);
+ this.logger.info(`Creating branch ${newBranch}`);
await this.git(cwd).checkoutLocalBranch(newBranch);
}
/**
@@ -242,7 +533,7 @@ class GitCLIService {
* @param remoteName [optional] name of the remote, by default 'fork' is used
*/
async addRemote(cwd, remote, remoteName = "fork") {
- this.logger.info(`Adding new remote ${remote}.`);
+ this.logger.info(`Adding new remote ${remote}`);
await this.git(cwd).addRemote(remoteName, this.remoteWithAuth(remote));
}
/**
@@ -252,7 +543,7 @@ class GitCLIService {
* @param remote [optional] the remote to fetch, by default origin
*/
async fetch(cwd, branch, remote = "origin") {
- this.logger.info(`Fetching ${remote} ${branch}.`);
+ this.logger.info(`Fetching ${remote} ${branch}`);
await this.git(cwd).fetch(remote, branch, ["--quiet"]);
}
/**
@@ -260,9 +551,38 @@ class GitCLIService {
* @param cwd repository in which the sha should be cherry picked to
* @param sha commit sha
*/
- async cherryPick(cwd, sha) {
- this.logger.info(`Cherry picking ${sha}.`);
- await this.git(cwd).raw(["cherry-pick", "-m", "1", "--strategy=recursive", "--strategy-option=theirs", sha]);
+ async cherryPick(cwd, sha, strategy = "recursive", strategyOption = "theirs", cherryPickOptions) {
+ this.logger.info(`Cherry picking ${sha}`);
+ let options = ["cherry-pick", "-m", "1", `--strategy=${strategy}`, `--strategy-option=${strategyOption}`];
+ if (cherryPickOptions !== undefined) {
+ options = options.concat(cherryPickOptions.split(" "));
+ }
+ options.push(sha);
+ this.logger.debug(`Cherry picking command git ${options}`);
+ try {
+ await this.git(cwd).raw(options);
+ }
+ catch (error) {
+ const diff = await this.git(cwd).diff();
+ if (diff) {
+ throw new Error(`${error}\r\nShowing git diff:\r\n` + diff);
+ }
+ throw error;
+ }
+ }
+ /**
+ * Check whether there are some conflicts in the current working directory
+ * which means there is an ongoing cherry-pick that did not complete successfully
+ * @param cwd repository in which the check should be performed
+ * @return true if there is some conflict, false otherwise
+ */
+ async anyConflict(cwd) {
+ const status = await this.git(cwd).status();
+ if (status.conflicted.length > 0) {
+ this.logger.debug(`Found conflicts in branch ${status.current}`);
+ return true;
+ }
+ return false;
}
/**
* Push a branch to a remote
@@ -271,7 +591,7 @@ class GitCLIService {
* @param remote [optional] remote to which the branch should be pushed to, by default 'origin'
*/
async push(cwd, branch, remote = "origin", force = false) {
- this.logger.info(`Pushing ${branch} to ${remote}.`);
+ this.logger.info(`Pushing ${branch} to ${remote}`);
const options = ["--quiet"];
if (force) {
options.push("--force-with-lease");
@@ -284,7 +604,7 @@ exports["default"] = GitCLIService;
/***/ }),
-/***/ 5107:
+/***/ 8550:
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
"use strict";
@@ -294,39 +614,170 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
const git_types_1 = __nccwpck_require__(750);
-const github_service_1 = __importDefault(__nccwpck_require__(944));
+const github_client_1 = __importDefault(__nccwpck_require__(4628));
const logger_service_factory_1 = __importDefault(__nccwpck_require__(8936));
+const gitlab_client_1 = __importDefault(__nccwpck_require__(4077));
/**
* Singleton git service factory class
*/
-class GitServiceFactory {
- static getService() {
- if (!GitServiceFactory.instance) {
- throw new Error("You must call `init` method first!");
+class GitClientFactory {
+ // this method assumes there already exists a singleton client instance, otherwise it will fail
+ static getClient() {
+ if (!GitClientFactory.instance) {
+ throw new Error("You must call `getOrCreate` method first");
}
- return GitServiceFactory.instance;
+ return GitClientFactory.instance;
}
/**
* Initialize the singleton git management service
* @param type git management service type
- * @param auth authentication, like github token
+ * @param authToken authentication token, like github/gitlab token
*/
- static init(type, auth) {
- if (GitServiceFactory.instance) {
- GitServiceFactory.logger.warn("Git service already initialized!");
- return;
+ static getOrCreate(type, authToken, apiUrl) {
+ if (GitClientFactory.instance) {
+ GitClientFactory.logger.warn("Git service already initialized");
+ return GitClientFactory.instance;
}
+ this.logger.debug(`Setting up ${type} client: apiUrl=${apiUrl}, token=****`);
switch (type) {
- case git_types_1.GitServiceType.GITHUB:
- GitServiceFactory.instance = new github_service_1.default(auth);
+ case git_types_1.GitClientType.GITHUB:
+ GitClientFactory.instance = new github_client_1.default(authToken, apiUrl);
+ break;
+ case git_types_1.GitClientType.GITLAB:
+ GitClientFactory.instance = new gitlab_client_1.default(authToken, apiUrl);
+ break;
+ case git_types_1.GitClientType.CODEBERG:
+ GitClientFactory.instance = new github_client_1.default(authToken, apiUrl, true);
break;
default:
throw new Error(`Invalid git service type received: ${type}`);
}
+ return GitClientFactory.instance;
+ }
+ // this is used for testing purposes
+ static reset() {
+ GitClientFactory.logger.warn("Resetting git service");
+ GitClientFactory.instance = undefined;
}
}
-exports["default"] = GitServiceFactory;
-GitServiceFactory.logger = logger_service_factory_1.default.getLogger();
+exports["default"] = GitClientFactory;
+GitClientFactory.logger = logger_service_factory_1.default.getLogger();
+
+
+/***/ }),
+
+/***/ 9080:
+/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
+
+"use strict";
+
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.getEnv = exports.getGitTokenFromEnv = exports.inferSquash = exports.inferGitApiUrl = exports.inferGitClient = void 0;
+const logger_service_factory_1 = __importDefault(__nccwpck_require__(8936));
+const git_types_1 = __nccwpck_require__(750);
+const configs_types_1 = __nccwpck_require__(4753);
+const PUBLIC_GITHUB_URL = "https://github.com";
+const PUBLIC_GITHUB_API = "https://api.github.com";
+/**
+ * Infer the remote GIT service to interact with based on the provided
+ * pull request URL
+ * @param prUrl provided pull request URL
+ * @returns {GitClientType}
+ */
+const inferGitClient = (prUrl) => {
+ const stdPrUrl = prUrl.toLowerCase().trim();
+ if (stdPrUrl.includes(git_types_1.GitClientType.GITHUB.toString())) {
+ return git_types_1.GitClientType.GITHUB;
+ }
+ else if (stdPrUrl.includes(git_types_1.GitClientType.GITLAB.toString())) {
+ return git_types_1.GitClientType.GITLAB;
+ }
+ else if (stdPrUrl.includes(git_types_1.GitClientType.CODEBERG.toString())) {
+ return git_types_1.GitClientType.CODEBERG;
+ }
+ throw new Error(`Remote git service not recognized from pr url: ${prUrl}`);
+};
+exports.inferGitClient = inferGitClient;
+/**
+ * Infer the host git service from the pull request url
+ * @param prUrl pull/merge request url
+ * @param apiVersion the api version, ignored in case of public github
+ * @returns api URL like https://api.github.com or https://gitlab.com/api/v4
+ */
+const inferGitApiUrl = (prUrl, apiVersion = "v4") => {
+ const url = new URL(prUrl);
+ const baseUrl = `${url.protocol}//${url.host}`;
+ if (baseUrl.includes(PUBLIC_GITHUB_URL) || baseUrl.includes(PUBLIC_GITHUB_API)) {
+ return PUBLIC_GITHUB_API;
+ }
+ return `${baseUrl}/api/${apiVersion}`;
+};
+exports.inferGitApiUrl = inferGitApiUrl;
+/**
+ * Infer the value of the squash option
+ * @param open true if the pull/merge request is still open
+ * @param squash_commit undefined or null if the pull/merge request was merged, the sha of the squashed commit if it was squashed
+ * @returns true if a single commit must be cherry-picked, false if all merged commits must be cherry-picked
+ */
+const inferSquash = (open, squash_commit) => {
+ const logger = logger_service_factory_1.default.getLogger();
+ if (open) {
+ logger.debug("cherry-pick all commits because they have not been merged (or squashed) in the base branch yet");
+ return false;
+ }
+ else {
+ if (squash_commit) {
+ logger.debug(`cherry-pick the squashed commit ${squash_commit}`);
+ return true;
+ }
+ else {
+ logger.debug("cherry-pick the merged commit(s)");
+ return false;
+ }
+ }
+};
+exports.inferSquash = inferSquash;
+/**
+ * Retrieve the git token from env variable, the default is taken from GIT_TOKEN env.
+ * All specific git env variable have precedence and override the default one.
+ * @param gitType
+ * @returns tuple where
+ * - the first element is the corresponding env value
+ * - the second element is true if the value is not undefined nor empty
+ */
+const getGitTokenFromEnv = (gitType) => {
+ let [token] = (0, exports.getEnv)(configs_types_1.AuthTokenId.GIT_TOKEN);
+ let [specToken, specOk] = [undefined, false];
+ if (git_types_1.GitClientType.GITHUB == gitType) {
+ [specToken, specOk] = (0, exports.getEnv)(configs_types_1.AuthTokenId.GITHUB_TOKEN);
+ }
+ else if (git_types_1.GitClientType.GITLAB == gitType) {
+ [specToken, specOk] = (0, exports.getEnv)(configs_types_1.AuthTokenId.GITLAB_TOKEN);
+ }
+ else if (git_types_1.GitClientType.CODEBERG == gitType) {
+ [specToken, specOk] = (0, exports.getEnv)(configs_types_1.AuthTokenId.CODEBERG_TOKEN);
+ }
+ if (specOk) {
+ token = specToken;
+ }
+ return token;
+};
+exports.getGitTokenFromEnv = getGitTokenFromEnv;
+/**
+ * Get process env variable given the input key string
+ * @param key
+ * @returns tuple where
+ * - the first element is the corresponding env value
+ * - the second element is true if the value is not undefined nor empty
+ */
+const getEnv = (key) => {
+ const val = process.env[key];
+ return [val, val !== undefined && val !== ""];
+};
+exports.getEnv = getEnv;
/***/ }),
@@ -337,56 +788,25 @@ GitServiceFactory.logger = logger_service_factory_1.default.getLogger();
"use strict";
Object.defineProperty(exports, "__esModule", ({ value: true }));
-exports.GitServiceType = void 0;
-var GitServiceType;
-(function (GitServiceType) {
- GitServiceType["GITHUB"] = "github";
-})(GitServiceType = exports.GitServiceType || (exports.GitServiceType = {}));
+exports.GitRepoState = exports.GitClientType = void 0;
+var GitClientType;
+(function (GitClientType) {
+ GitClientType["GITHUB"] = "github";
+ GitClientType["GITLAB"] = "gitlab";
+ GitClientType["CODEBERG"] = "codeberg";
+})(GitClientType = exports.GitClientType || (exports.GitClientType = {}));
+var GitRepoState;
+(function (GitRepoState) {
+ GitRepoState["OPEN"] = "open";
+ GitRepoState["CLOSED"] = "closed";
+ GitRepoState["LOCKED"] = "locked";
+ GitRepoState["MERGED"] = "merged";
+})(GitRepoState = exports.GitRepoState || (exports.GitRepoState = {}));
/***/ }),
-/***/ 5764:
-/***/ ((__unused_webpack_module, exports) => {
-
-"use strict";
-
-Object.defineProperty(exports, "__esModule", ({ value: true }));
-class GitHubMapper {
- mapPullRequest(pr) {
- return {
- number: pr.number,
- author: pr.user.login,
- url: pr.url,
- htmlUrl: pr.html_url,
- title: pr.title,
- body: pr.body ?? "",
- state: pr.state,
- merged: pr.merged ?? false,
- mergedBy: pr.merged_by?.login,
- reviewers: pr.requested_reviewers.filter(r => "login" in r).map((r => r?.login)),
- sourceRepo: {
- owner: pr.head.repo.full_name.split("/")[0],
- project: pr.head.repo.full_name.split("/")[1],
- cloneUrl: pr.head.repo.clone_url
- },
- targetRepo: {
- owner: pr.base.repo.full_name.split("/")[0],
- project: pr.base.repo.full_name.split("/")[1],
- cloneUrl: pr.base.repo.clone_url
- },
- nCommits: pr.commits,
- // if pr is open use latest commit sha otherwise use merge_commit_sha
- commits: pr.state === "open" ? [pr.head.sha] : [pr.merge_commit_sha]
- };
- }
-}
-exports["default"] = GitHubMapper;
-
-
-/***/ }),
-
-/***/ 944:
+/***/ 4628:
/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
"use strict";
@@ -395,32 +815,80 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
+const git_util_1 = __nccwpck_require__(9080);
+const git_types_1 = __nccwpck_require__(750);
const github_mapper_1 = __importDefault(__nccwpck_require__(5764));
const octokit_factory_1 = __importDefault(__nccwpck_require__(4257));
const logger_service_factory_1 = __importDefault(__nccwpck_require__(8936));
-class GitHubService {
- constructor(token) {
+class GitHubClient {
+ constructor(token, apiUrl, isForCodeberg = false) {
+ this.apiUrl = apiUrl;
+ this.isForCodeberg = isForCodeberg;
this.logger = logger_service_factory_1.default.getLogger();
- this.octokit = octokit_factory_1.default.getOctokit(token);
+ this.octokit = octokit_factory_1.default.getOctokit(token, this.apiUrl);
this.mapper = new github_mapper_1.default();
}
+ getClientType() {
+ return this.isForCodeberg ? git_types_1.GitClientType.CODEBERG : git_types_1.GitClientType.GITHUB;
+ }
// READ
- async getPullRequest(owner, repo, prNumber) {
- this.logger.info(`Getting pull request ${owner}/${repo}/${prNumber}.`);
+ getDefaultGitUser() {
+ return this.apiUrl.includes(git_types_1.GitClientType.CODEBERG.toString()) ? "Codeberg" : "GitHub";
+ }
+ getDefaultGitEmail() {
+ return "noreply@github.com";
+ }
+ async getPullRequest(owner, repo, prNumber, squash) {
+ this.logger.debug(`Fetching pull request ${owner}/${repo}/${prNumber}`);
const { data } = await this.octokit.rest.pulls.get({
owner: owner,
repo: repo,
- pull_number: prNumber
+ pull_number: prNumber,
});
- return this.mapper.mapPullRequest(data);
+ if (squash === undefined) {
+ let commit_sha = undefined;
+ const open = data.state == "open";
+ if (!open) {
+ const commit = await this.octokit.rest.git.getCommit({
+ owner: owner,
+ repo: repo,
+ commit_sha: data.merge_commit_sha,
+ });
+ if (commit.data.parents.length === 1) {
+ commit_sha = data.merge_commit_sha;
+ }
+ }
+ squash = (0, git_util_1.inferSquash)(open, commit_sha);
+ }
+ const commits = [];
+ if (!squash) {
+ // fetch all commits
+ try {
+ const { data } = await this.octokit.rest.pulls.listCommits({
+ owner: owner,
+ repo: repo,
+ pull_number: prNumber,
+ });
+ commits.push(...data.map(c => c.sha));
+ if (this.isForCodeberg) {
+ // For some reason, even though Codeberg advertises API compatibility
+ // with GitHub, it returns commits in reversed order.
+ commits.reverse();
+ }
+ }
+ catch (error) {
+ throw new Error(`Failed to retrieve commits for pull request n. ${prNumber}`);
+ }
+ }
+ return this.mapper.mapPullRequest(data, commits);
}
- async getPullRequestFromUrl(prUrl) {
- const { owner, project } = this.getRepositoryFromPrUrl(prUrl);
- return this.getPullRequest(owner, project, parseInt(prUrl.substring(prUrl.lastIndexOf("/") + 1, prUrl.length)));
+ async getPullRequestFromUrl(prUrl, squash) {
+ const { owner, project, id } = this.extractPullRequestData(prUrl);
+ return this.getPullRequest(owner, project, id, squash);
}
// WRITE
async createPullRequest(backport) {
- this.logger.info(`Creating pull request ${backport.head} -> ${backport.base}.`);
+ this.logger.info(`Creating pull request ${backport.head} -> ${backport.base}`);
this.logger.info(`${JSON.stringify(backport, null, 2)}`);
const { data } = await this.octokit.pulls.create({
owner: backport.owner,
@@ -428,21 +896,68 @@ class GitHubService {
head: backport.head,
base: backport.base,
title: backport.title,
- body: backport.body
+ body: backport.body,
});
+ if (!data) {
+ throw new Error("Pull request creation failed");
+ }
+ const promises = [];
+ if (backport.labels.length > 0) {
+ promises.push(this.octokit.issues.addLabels({
+ owner: backport.owner,
+ repo: backport.repo,
+ issue_number: data.number,
+ labels: backport.labels,
+ }).catch(error => this.logger.error(`Error setting labels: ${error}`)));
+ }
if (backport.reviewers.length > 0) {
- try {
- await this.octokit.pulls.requestReviewers({
+ promises.push(this.octokit.pulls.requestReviewers({
+ owner: backport.owner,
+ repo: backport.repo,
+ pull_number: data.number,
+ reviewers: backport.reviewers,
+ }).catch(error => this.logger.error(`Error requesting reviewers: ${error}`)));
+ }
+ if (backport.assignees.length > 0) {
+ promises.push(this.octokit.issues.addAssignees({
+ owner: backport.owner,
+ repo: backport.repo,
+ issue_number: data.number,
+ assignees: backport.assignees,
+ }).catch(error => this.logger.error(`Error setting assignees: ${error}`)));
+ }
+ if (backport.comments.length > 0) {
+ backport.comments.forEach(c => {
+ promises.push(this.octokit.issues.createComment({
owner: backport.owner,
repo: backport.repo,
- pull_number: data.number,
- reviewers: backport.reviewers
- });
- }
- catch (error) {
- this.logger.error(`Error requesting reviewers: ${error}`);
- }
+ issue_number: data.number,
+ body: c,
+ }).catch(error => this.logger.error(`Error posting comment: ${error}`)));
+ });
}
+ await Promise.all(promises);
+ return data.html_url;
+ }
+ async createPullRequestComment(prUrl, comment) {
+ let commentUrl = undefined;
+ try {
+ const { owner, project, id } = this.extractPullRequestData(prUrl);
+ const { data } = await this.octokit.issues.createComment({
+ owner: owner,
+ repo: project,
+ issue_number: id,
+ body: comment
+ });
+ if (!data) {
+ throw new Error("Pull request comment creation failed");
+ }
+ commentUrl = data.url;
+ }
+ catch (error) {
+ this.logger.error(`Error creating comment on pull request ${prUrl}: ${error}`);
+ }
+ return commentUrl;
}
// UTILS
/**
@@ -450,15 +965,77 @@ class GitHubService {
* @param prUrl pull request url
* @returns {{owner: string, project: string}}
*/
- getRepositoryFromPrUrl(prUrl) {
+ extractPullRequestData(prUrl) {
const elems = prUrl.split("/");
return {
owner: elems[elems.length - 4],
- project: elems[elems.length - 3]
+ project: elems[elems.length - 3],
+ id: parseInt(prUrl.substring(prUrl.lastIndexOf("/") + 1, prUrl.length)),
};
}
}
-exports["default"] = GitHubService;
+exports["default"] = GitHubClient;
+
+
+/***/ }),
+
+/***/ 5764:
+/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+const git_types_1 = __nccwpck_require__(750);
+class GitHubMapper {
+ mapGitState(state) {
+ switch (state) {
+ case "open":
+ return git_types_1.GitRepoState.OPEN;
+ default:
+ return git_types_1.GitRepoState.CLOSED;
+ }
+ }
+ async mapPullRequest(pr, commits) {
+ return {
+ number: pr.number,
+ author: pr.user.login,
+ url: pr.url,
+ htmlUrl: pr.html_url,
+ title: pr.title,
+ body: pr.body ?? "",
+ state: this.mapGitState(pr.state),
+ merged: pr.merged ?? false,
+ mergedBy: pr.merged_by?.login,
+ reviewers: pr.requested_reviewers?.filter(r => r && "login" in r).map((r => r?.login)) ?? [],
+ assignees: pr.assignees?.filter(r => r && "login" in r).map(r => r.login) ?? [],
+ labels: pr.labels?.map(l => l.name) ?? [],
+ sourceRepo: await this.mapSourceRepo(pr),
+ targetRepo: await this.mapTargetRepo(pr),
+ nCommits: pr.commits,
+ // if commits is provided use them, otherwise fetch the single sha representing the whole pr
+ commits: (commits && commits.length > 0) ? commits : this.getSha(pr),
+ };
+ }
+ getSha(pr) {
+ // if pr is open use latest commit sha otherwise use merge_commit_sha
+ return pr.state === "open" ? [pr.head.sha] : [pr.merge_commit_sha];
+ }
+ async mapSourceRepo(pr) {
+ return Promise.resolve({
+ owner: pr.head.repo.full_name.split("/")[0],
+ project: pr.head.repo.full_name.split("/")[1],
+ cloneUrl: pr.head.repo.clone_url
+ });
+ }
+ async mapTargetRepo(pr) {
+ return Promise.resolve({
+ owner: pr.base.repo.full_name.split("/")[0],
+ project: pr.base.repo.full_name.split("/")[1],
+ cloneUrl: pr.base.repo.clone_url
+ });
+ }
+}
+exports["default"] = GitHubMapper;
/***/ }),
@@ -478,12 +1055,12 @@ const rest_1 = __nccwpck_require__(5375);
* Singleton factory class for {Octokit} instance
*/
class OctokitFactory {
- static getOctokit(token) {
+ static getOctokit(token, apiUrl) {
if (!OctokitFactory.octokit) {
- OctokitFactory.logger.info("Creating octokit instance.");
OctokitFactory.octokit = new rest_1.Octokit({
auth: token,
- userAgent: "lampajr/backporting"
+ userAgent: "kiegroup/git-backporting",
+ baseUrl: apiUrl
});
}
return OctokitFactory.octokit;
@@ -493,6 +1070,284 @@ exports["default"] = OctokitFactory;
OctokitFactory.logger = logger_service_factory_1.default.getLogger();
+/***/ }),
+
+/***/ 4077:
+/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) {
+
+"use strict";
+
+var __importDefault = (this && this.__importDefault) || function (mod) {
+ return (mod && mod.__esModule) ? mod : { "default": mod };
+};
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+const git_util_1 = __nccwpck_require__(9080);
+const git_types_1 = __nccwpck_require__(750);
+const logger_service_factory_1 = __importDefault(__nccwpck_require__(8936));
+const gitlab_mapper_1 = __importDefault(__nccwpck_require__(2675));
+const axios_1 = __importDefault(__nccwpck_require__(8757));
+const https_1 = __importDefault(__nccwpck_require__(5687));
+class GitLabClient {
+ constructor(token, apiUrl, rejectUnauthorized = false) {
+ this.logger = logger_service_factory_1.default.getLogger();
+ this.apiUrl = apiUrl;
+ this.client = axios_1.default.create({
+ baseURL: this.apiUrl,
+ headers: {
+ Authorization: token ? `Bearer ${token}` : "",
+ "User-Agent": "kiegroup/git-backporting",
+ },
+ httpsAgent: new https_1.default.Agent({
+ rejectUnauthorized
+ })
+ });
+ this.mapper = new gitlab_mapper_1.default(this.client);
+ }
+ getClientType() {
+ return git_types_1.GitClientType.GITLAB;
+ }
+ getDefaultGitUser() {
+ return "Gitlab";
+ }
+ getDefaultGitEmail() {
+ return "noreply@gitlab.com";
+ }
+ // READ
+ // example: /api/v4/projects/%2Fbackporting-example/merge_requests/1
+ async getPullRequest(namespace, repo, mrNumber, squash) {
+ const projectId = this.getProjectId(namespace, repo);
+ const url = `/projects/${projectId}/merge_requests/${mrNumber}`;
+ this.logger.debug(`Fetching pull request ${url}`);
+ const { data } = await this.client.get(`${url}`);
+ if (squash === undefined) {
+ squash = (0, git_util_1.inferSquash)(data.state === "opened", data.squash_commit_sha);
+ }
+ const commits = [];
+ if (!squash) {
+ // fetch all commits
+ try {
+ const { data } = await this.client.get(`/projects/${projectId}/merge_requests/${mrNumber}/commits`);
+ // gitlab returns them in reverse order
+ commits.push(...data.map(c => c.id).reverse());
+ }
+ catch (error) {
+ throw new Error(`Failed to retrieve commits for merge request n. ${mrNumber}`);
+ }
+ }
+ return this.mapper.mapPullRequest(data, commits);
+ }
+ getPullRequestFromUrl(mrUrl, squash) {
+ const { namespace, project, id } = this.extractMergeRequestData(mrUrl);
+ return this.getPullRequest(namespace, project, id, squash);
+ }
+ // WRITE
+ async createPullRequest(backport) {
+ this.logger.info(`Creating pull request ${backport.head} -> ${backport.base}`);
+ this.logger.info(`${JSON.stringify(backport, null, 2)}`);
+ const projectId = this.getProjectId(backport.owner, backport.repo);
+ const { data } = await this.client.post(`/projects/${projectId}/merge_requests`, {
+ source_branch: backport.head,
+ target_branch: backport.base,
+ title: backport.title,
+ description: backport.body,
+ reviewer_ids: [],
+ assignee_ids: [],
+ });
+ const mr = data;
+ const promises = [];
+ // labels
+ if (backport.labels.length > 0) {
+ this.logger.info("Setting labels: " + backport.labels);
+ promises.push(this.client.put(`/projects/${projectId}/merge_requests/${mr.iid}`, {
+ labels: backport.labels.join(","),
+ }).catch(error => this.logger.warn("Failure trying to update labels. " + error)));
+ }
+ // comments
+ if (backport.comments.length > 0) {
+ this.logger.info("Posting comments: " + backport.comments);
+ backport.comments.forEach(c => {
+ promises.push(this.client.post(`/projects/${projectId}/merge_requests/${mr.iid}/notes`, {
+ body: c,
+ }).catch(error => this.logger.warn("Failure trying to post comment. " + error)));
+ });
+ }
+ // reviewers
+ const reviewerIds = await Promise.all(backport.reviewers.map(async (r) => {
+ this.logger.debug("Retrieving user: " + r);
+ return this.getUser(r).then(user => user.id).catch(() => {
+ this.logger.warn(`Failed to retrieve reviewer ${r}`);
+ return undefined;
+ });
+ }));
+ if (reviewerIds.length > 0) {
+ this.logger.info("Setting reviewers: " + reviewerIds);
+ promises.push(this.client.put(`/projects/${projectId}/merge_requests/${mr.iid}`, {
+ reviewer_ids: reviewerIds.filter(r => r !== undefined),
+ }).catch(error => this.logger.warn("Failure trying to update reviewers. " + error)));
+ }
+ // assignees
+ const assigneeIds = await Promise.all(backport.assignees.map(async (a) => {
+ this.logger.debug("Retrieving user: " + a);
+ return this.getUser(a).then(user => user.id).catch(() => {
+ this.logger.warn(`Failed to retrieve assignee ${a}`);
+ return undefined;
+ });
+ }));
+ if (assigneeIds.length > 0) {
+ this.logger.info("Setting assignees: " + assigneeIds);
+ promises.push(this.client.put(`/projects/${projectId}/merge_requests/${mr.iid}`, {
+ assignee_ids: assigneeIds.filter(a => a !== undefined),
+ }).catch(error => this.logger.warn("Failure trying to update assignees. " + error)));
+ }
+ await Promise.all(promises);
+ return mr.web_url;
+ }
+ // https://docs.gitlab.com/ee/api/notes.html#create-new-issue-note
+ async createPullRequestComment(mrUrl, comment) {
+ const commentUrl = undefined;
+ try {
+ const { namespace, project, id } = this.extractMergeRequestData(mrUrl);
+ const projectId = this.getProjectId(namespace, project);
+ const { data } = await this.client.post(`/projects/${projectId}/merge_requests/${id}/notes`, {
+ body: comment,
+ });
+ if (!data) {
+ throw new Error("Merge request comment creation failed");
+ }
+ }
+ catch (error) {
+ this.logger.error(`Error creating comment on merge request ${mrUrl}: ${error}`);
+ }
+ return commentUrl;
+ }
+ // UTILS
+ /**
+ * Retrieve a gitlab user given its username
+ * @param username
+ * @returns UserSchema
+ */
+ async getUser(username) {
+ const { data } = await this.client.get(`/users?username=${username}`);
+ const users = data;
+ if (users.length > 1) {
+ throw new Error("Too many users found with username=" + username);
+ }
+ if (users.length == 0) {
+ throw new Error("User " + username + " not found");
+ }
+ return users[0];
+ }
+ /**
+ * Extract repository namespace, project and mr number from the merge request url
+ * example: //backporting-example/-/merge_requests/1
+ * note: "-/" could be omitted
+ * @param mrUrl merge request url
+ * @returns {{owner: string, project: string}}
+ */
+ extractMergeRequestData(mrUrl) {
+ const { pathname } = new URL(mrUrl);
+ const elems = pathname.substring(1).replace("/-/", "/").split("/");
+ let namespace = "";
+ for (let i = 0; i < elems.length - 3; i++) {
+ namespace += elems[i] + "/";
+ }
+ namespace = namespace.substring(0, namespace.length - 1);
+ return {
+ namespace: namespace,
+ project: elems[elems.length - 3],
+ id: parseInt(mrUrl.substring(mrUrl.lastIndexOf("/") + 1, mrUrl.length)),
+ };
+ }
+ getProjectId(namespace, repo) {
+ // e.g., %2F
+ return encodeURIComponent(`${namespace}/${repo}`);
+ }
+}
+exports["default"] = GitLabClient;
+
+
+/***/ }),
+
+/***/ 2675:
+/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+const git_types_1 = __nccwpck_require__(750);
+class GitLabMapper {
+ // needs client to perform additional requests
+ constructor(client) {
+ this.client = client;
+ }
+ mapGitState(state) {
+ switch (state) {
+ case "opened":
+ return git_types_1.GitRepoState.OPEN;
+ case "closed":
+ return git_types_1.GitRepoState.CLOSED;
+ case "merged":
+ return git_types_1.GitRepoState.MERGED;
+ default:
+ return git_types_1.GitRepoState.LOCKED;
+ }
+ }
+ async mapPullRequest(mr, commits) {
+ return {
+ number: mr.iid,
+ author: mr.author.username,
+ url: mr.web_url,
+ htmlUrl: mr.web_url,
+ title: mr.title,
+ body: mr.description,
+ state: this.mapGitState(mr.state),
+ merged: this.isMerged(mr),
+ mergedBy: mr.merged_by?.username,
+ reviewers: mr.reviewers?.map((r => r.username)) ?? [],
+ assignees: mr.assignees?.map((r => r.username)) ?? [],
+ labels: mr.labels ?? [],
+ sourceRepo: await this.mapSourceRepo(mr),
+ targetRepo: await this.mapTargetRepo(mr),
+ // if commits list is provided use that as source
+ nCommits: (commits && commits.length > 0) ? commits.length : 1,
+ commits: (commits && commits.length > 0) ? commits : this.getSha(mr)
+ };
+ }
+ getSha(mr) {
+ // if mr is merged, use merge_commit_sha otherwise use sha
+ // what is the difference between sha and diff_refs.head_sha?
+ return this.isMerged(mr) ? [mr.squash_commit_sha ? mr.squash_commit_sha : mr.merge_commit_sha] : [mr.sha];
+ }
+ async mapSourceRepo(mr) {
+ const project = await this.getProject(mr.source_project_id);
+ return {
+ owner: project.namespace.full_path,
+ project: project.path,
+ cloneUrl: project.http_url_to_repo,
+ };
+ }
+ async mapTargetRepo(mr) {
+ const project = await this.getProject(mr.target_project_id);
+ return {
+ owner: project.namespace.full_path,
+ project: project.path,
+ cloneUrl: project.http_url_to_repo,
+ };
+ }
+ isMerged(mr) {
+ return this.mapGitState(mr.state) === git_types_1.GitRepoState.MERGED;
+ }
+ async getProject(projectId) {
+ const { data } = await this.client.get(`/projects/${projectId}`);
+ if (!data) {
+ throw new Error(`Project ${projectId} not found`);
+ }
+ return data;
+ }
+}
+exports["default"] = GitLabMapper;
+
+
/***/ }),
/***/ 8679:
@@ -506,23 +1361,38 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
Object.defineProperty(exports, "__esModule", ({ value: true }));
const logger_1 = __importDefault(__nccwpck_require__(1855));
class ConsoleLoggerService {
- constructor() {
+ constructor(verbose = true) {
this.logger = new logger_1.default();
+ this.verbose = verbose;
+ }
+ setContext(newContext) {
+ this.context = newContext;
+ }
+ getContext() {
+ return this.context;
+ }
+ clearContext() {
+ this.context = undefined;
}
trace(message) {
- this.logger.log("[TRACE]", message);
+ this.logger.log("TRACE", this.fromContext(message));
}
debug(message) {
- this.logger.log("[DEBUG]", message);
+ if (this.verbose) {
+ this.logger.log("DEBUG", this.fromContext(message));
+ }
}
info(message) {
- this.logger.log("[INFO]", message);
+ this.logger.log("INFO", this.fromContext(message));
}
warn(message) {
- this.logger.log("[WARN]", message);
+ this.logger.log("WARN", this.fromContext(message));
}
error(message) {
- this.logger.log("[ERROR]", message);
+ this.logger.log("ERROR", this.fromContext(message));
+ }
+ fromContext(msg) {
+ return this.context ? `[${this.context}] ${msg}` : msg;
}
}
exports["default"] = ConsoleLoggerService;
@@ -568,7 +1438,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
class Logger {
log(prefix, ...str) {
// eslint-disable-next-line no-console
- console.log.apply(console, [prefix, ...str]);
+ console.log.apply(console, [`[${prefix.padEnd(5)}]`, ...str]);
}
emptyLine() {
this.log("", "");
@@ -577,6 +1447,39 @@ class Logger {
exports["default"] = Logger;
+/***/ }),
+
+/***/ 9632:
+/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
+
+"use strict";
+
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+exports.injectTargetBranch = exports.injectError = void 0;
+const configs_types_1 = __nccwpck_require__(4753);
+/**
+ * Inject the error message in the provided `message`.
+ * This is injected in place of the MESSAGE_ERROR_PLACEHOLDER placeholder
+ * @param message string that needs to be updated
+ * @param errMsg the error message that needs to be injected
+ */
+const injectError = (message, errMsg) => {
+ return message.replace(configs_types_1.MESSAGE_ERROR_PLACEHOLDER, errMsg);
+};
+exports.injectError = injectError;
+/**
+ * Inject the target branch into the provided `message`.
+ * This is injected in place of the MESSAGE_TARGET_BRANCH_PLACEHOLDER placeholder
+ * @param message string that needs to be updated
+ * @param targetBranch the target branch to inject
+ * @returns
+ */
+const injectTargetBranch = (message, targetBranch) => {
+ return message.replace(configs_types_1.MESSAGE_TARGET_BRANCH_PLACEHOLDER, targetBranch);
+};
+exports.injectTargetBranch = injectTargetBranch;
+
+
/***/ }),
/***/ 8810:
@@ -590,9 +1493,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
Object.defineProperty(exports, "__esModule", ({ value: true }));
const pr_configs_parser_1 = __importDefault(__nccwpck_require__(6618));
const git_cli_1 = __importDefault(__nccwpck_require__(7538));
-const git_service_factory_1 = __importDefault(__nccwpck_require__(5107));
+const git_client_factory_1 = __importDefault(__nccwpck_require__(8550));
const git_types_1 = __nccwpck_require__(750);
const logger_service_factory_1 = __importDefault(__nccwpck_require__(8936));
+const git_util_1 = __nccwpck_require__(9080);
+const runner_util_1 = __nccwpck_require__(9632);
/**
* Main runner implementation, it implements the core logic flow
*/
@@ -601,32 +1506,18 @@ class Runner {
this.logger = logger_service_factory_1.default.getLogger();
this.argsParser = parser;
}
- /**
- * Infer the remote GIT service to interact with based on the provided
- * pull request URL
- * @param prUrl provided pull request URL
- * @returns {GitServiceType}
- */
- inferRemoteGitService(prUrl) {
- const stdPrUrl = prUrl.toLowerCase().trim();
- if (stdPrUrl.includes(git_types_1.GitServiceType.GITHUB.toString())) {
- return git_types_1.GitServiceType.GITHUB;
- }
- throw new Error(`Remote GIT service not recognixed from PR url: ${prUrl}`);
- }
/**
* Entry point invoked by the command line or gha
*/
async run() {
- this.logger.info("Starting process.");
try {
await this.execute();
- this.logger.info("Process succeeded!");
+ this.logger.info("Process succeeded");
process.exit(0);
}
catch (error) {
this.logger.error(`${error}`);
- this.logger.info("Process failed!");
+ this.logger.info("Process failed");
process.exit(1);
}
}
@@ -637,50 +1528,105 @@ class Runner {
// 1. parse args
const args = this.argsParser.parse();
if (args.dryRun) {
- this.logger.warn("Dry run enabled!");
+ this.logger.warn("Dry run enabled");
}
// 2. init git service
- git_service_factory_1.default.init(this.inferRemoteGitService(args.pullRequest), args.auth);
- const gitApi = git_service_factory_1.default.getService();
+ let gitClientType;
+ if (args.gitClient === undefined) {
+ gitClientType = (0, git_util_1.inferGitClient)(args.pullRequest);
+ }
+ else {
+ gitClientType = args.gitClient;
+ }
+ // the api version is ignored in case of github
+ const apiUrl = (0, git_util_1.inferGitApiUrl)(args.pullRequest, gitClientType === git_types_1.GitClientType.CODEBERG ? "v1" : undefined);
+ const token = this.fetchToken(args, gitClientType);
+ const gitApi = git_client_factory_1.default.getOrCreate(gitClientType, token, apiUrl);
// 3. parse configs
+ this.logger.debug("Parsing configs..");
+ args.auth = token; // override auth
const configs = await new pr_configs_parser_1.default().parseAndValidate(args);
- const originalPR = configs.originalPullRequest;
- const backportPR = configs.backportPullRequest;
+ const backportPRs = configs.backportPullRequests;
// start local git operations
- const git = new git_cli_1.default(configs.auth, configs.author);
+ const git = new git_cli_1.default(configs.auth, configs.git);
+ const failures = [];
+ // we need sequential backporting as they will operate on the same folder
+ // avoid cloning the same repo multiple times
+ for (const pr of backportPRs) {
+ try {
+ await this.executeBackport(configs, pr, {
+ gitClientType: gitClientType,
+ gitClientApi: gitApi,
+ gitCli: git,
+ });
+ }
+ catch (error) {
+ this.logger.error(`Something went wrong backporting to ${pr.base}: ${error}`);
+ if (!configs.dryRun && configs.errorNotification.enabled && configs.errorNotification.message.length > 0) {
+ // notify the failure as comment in the original pull request
+ let comment = (0, runner_util_1.injectError)(configs.errorNotification.message, error);
+ comment = (0, runner_util_1.injectTargetBranch)(comment, pr.base);
+ await gitApi.createPullRequestComment(configs.originalPullRequest.url, comment);
+ }
+ failures.push(error);
+ }
+ }
+ if (failures.length > 0) {
+ throw new Error(`Failure occurred during one of the backports: [${failures.join(" ; ")}]`);
+ }
+ }
+ /**
+ * Fetch the GIT token from the provided Args obj, if not empty, otherwise fallback
+ * to the environment variables.
+ * @param args input arguments
+ * @param gitType git client type
+ * @returns the provided or fetched token, or undefined if not set anywhere
+ */
+ fetchToken(args, gitType) {
+ let token = args.auth;
+ if (token === undefined) {
+ // try to fetch the auth from env variable
+ this.logger.info("Auth argument not provided, checking available tokens from env..");
+ token = (0, git_util_1.getGitTokenFromEnv)(gitType);
+ if (!token) {
+ this.logger.info("Git token not found in the environment");
+ }
+ }
+ return token;
+ }
+ async executeBackport(configs, backportPR, git) {
+ this.logger.setContext(backportPR.base);
+ const originalPR = configs.originalPullRequest;
// 4. clone the repository
- await git.clone(configs.originalPullRequest.targetRepo.cloneUrl, configs.folder, configs.targetBranch);
+ this.logger.debug("Cloning repo..");
+ await git.gitCli.clone(configs.originalPullRequest.targetRepo.cloneUrl, configs.folder, backportPR.base);
// 5. create new branch from target one and checkout
- const backportBranch = backportPR.branchName ?? `bp-${configs.targetBranch}-${originalPR.commits.join("-")}`;
- await git.createLocalBranch(configs.folder, backportBranch);
+ this.logger.debug("Creating local branch..");
+ await git.gitCli.createLocalBranch(configs.folder, backportPR.head);
// 6. fetch pull request remote if source owner != target owner or pull request still open
if (configs.originalPullRequest.sourceRepo.owner !== configs.originalPullRequest.targetRepo.owner ||
configs.originalPullRequest.state === "open") {
- await git.fetch(configs.folder, `pull/${configs.originalPullRequest.number}/head:pr/${configs.originalPullRequest.number}`);
+ this.logger.debug("Fetching pull request remote..");
+ const prefix = git.gitClientType === git_types_1.GitClientType.GITLAB ? "merge-requests" : "pull"; // default is for gitlab
+ await git.gitCli.fetch(configs.folder, `${prefix}/${configs.originalPullRequest.number}/head:pr/${configs.originalPullRequest.number}`);
}
// 7. apply all changes to the new branch
+ this.logger.debug("Cherry picking commits..");
for (const sha of originalPR.commits) {
- await git.cherryPick(configs.folder, sha);
+ await git.gitCli.cherryPick(configs.folder, sha, configs.mergeStrategy, configs.mergeStrategyOption, configs.cherryPickOptions);
}
- const backport = {
- owner: originalPR.targetRepo.owner,
- repo: originalPR.targetRepo.project,
- head: backportBranch,
- base: configs.targetBranch,
- title: backportPR.title,
- body: backportPR.body,
- reviewers: backportPR.reviewers
- };
if (!configs.dryRun) {
// 8. push the new branch to origin
- await git.push(configs.folder, backportBranch);
+ await git.gitCli.push(configs.folder, backportPR.head);
// 9. create pull request new branch -> target branch (using octokit)
- await gitApi.createPullRequest(backport);
+ const prUrl = await git.gitClientApi.createPullRequest(backportPR);
+ this.logger.info(`Pull request created: ${prUrl}`);
}
else {
- this.logger.warn("Pull request creation and remote push skipped!");
- this.logger.info(`${JSON.stringify(backport, null, 2)}`);
+ this.logger.warn("Pull request creation and remote push skipped");
+ this.logger.info(`${JSON.stringify(backportPR, null, 2)}`);
}
+ this.logger.clearContext();
}
}
exports["default"] = Runner;
@@ -2591,7 +3537,1398 @@ exports["default"] = deferred;
/***/ }),
-/***/ 334:
+/***/ 4193:
+/***/ ((__unused_webpack_module, exports) => {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+
+const VERSION = "2.21.3";
+
+function ownKeys(object, enumerableOnly) {
+ var keys = Object.keys(object);
+
+ if (Object.getOwnPropertySymbols) {
+ var symbols = Object.getOwnPropertySymbols(object);
+ enumerableOnly && (symbols = symbols.filter(function (sym) {
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
+ })), keys.push.apply(keys, symbols);
+ }
+
+ return keys;
+}
+
+function _objectSpread2(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = null != arguments[i] ? arguments[i] : {};
+ i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {
+ _defineProperty(target, key, source[key]);
+ }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
+ });
+ }
+
+ return target;
+}
+
+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;
+}
+
+/**
+ * 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) {
+ // endpoints can respond with 204 if repository is empty
+ if (!response.data) {
+ return _objectSpread2(_objectSpread2({}, response), {}, {
+ data: []
+ });
+ }
+
+ 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.
+
+ 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 (typeof incompleteResults !== "undefined") {
+ response.data.incomplete_results = incompleteResults;
+ }
+
+ if (typeof repositorySelection !== "undefined") {
+ response.data.repository_selection = repositorySelection;
+ }
+
+ response.data.total_count = totalCount;
+ return response;
+}
+
+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
+ };
+
+ try {
+ 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
+ };
+ } catch (error) {
+ if (error.status !== 409) throw error;
+ url = "";
+ return {
+ value: {
+ status: 200,
+ headers: {},
+ data: []
+ }
+ };
+ }
+ }
+
+ })
+ };
+}
+
+function paginate(octokit, route, parameters, mapFn) {
+ if (typeof parameters === "function") {
+ mapFn = parameters;
+ parameters = undefined;
+ }
+
+ 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;
+ }
+
+ let earlyExit = false;
+
+ function done() {
+ earlyExit = true;
+ }
+
+ results = results.concat(mapFn ? mapFn(result.value, done) : result.value.data);
+
+ if (earlyExit) {
+ return results;
+ }
+
+ return gather(octokit, results, iterator, mapFn);
+ });
+}
+
+const composePaginateRest = Object.assign(paginate, {
+ iterator
+});
+
+const paginatingEndpoints = ["GET /app/hook/deliveries", "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}/audit-log", "GET /enterprises/{enterprise}/secret-scanning/alerts", "GET /enterprises/{enterprise}/settings/billing/advanced-security", "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 /licenses", "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/cache/usage-by-repository", "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/secrets", "GET /orgs/{org}/actions/secrets/{secret_name}/repositories", "GET /orgs/{org}/audit-log", "GET /orgs/{org}/blocks", "GET /orgs/{org}/code-scanning/alerts", "GET /orgs/{org}/codespaces", "GET /orgs/{org}/credential-authorizations", "GET /orgs/{org}/dependabot/secrets", "GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories", "GET /orgs/{org}/events", "GET /orgs/{org}/external-groups", "GET /orgs/{org}/failed_invitations", "GET /orgs/{org}/hooks", "GET /orgs/{org}/hooks/{hook_id}/deliveries", "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}/packages", "GET /orgs/{org}/packages/{package_type}/{package_name}/versions", "GET /orgs/{org}/projects", "GET /orgs/{org}/public_members", "GET /orgs/{org}/repos", "GET /orgs/{org}/secret-scanning/alerts", "GET /orgs/{org}/settings/billing/advanced-security", "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}/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/caches", "GET /repos/{owner}/{repo}/actions/runners", "GET /repos/{owner}/{repo}/actions/runs", "GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts", "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs", "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}/codespaces", "GET /repos/{owner}/{repo}/codespaces/devcontainers", "GET /repos/{owner}/{repo}/codespaces/secrets", "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}/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}/status", "GET /repos/{owner}/{repo}/commits/{ref}/statuses", "GET /repos/{owner}/{repo}/contributors", "GET /repos/{owner}/{repo}/dependabot/secrets", "GET /repos/{owner}/{repo}/deployments", "GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses", "GET /repos/{owner}/{repo}/environments", "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}/hooks/{hook_id}/deliveries", "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}/releases/{release_id}/reactions", "GET /repos/{owner}/{repo}/secret-scanning/alerts", "GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations", "GET /repos/{owner}/{repo}/stargazers", "GET /repos/{owner}/{repo}/subscribers", "GET /repos/{owner}/{repo}/tags", "GET /repos/{owner}/{repo}/teams", "GET /repos/{owner}/{repo}/topics", "GET /repositories", "GET /repositories/{repository_id}/environments/{environment_name}/secrets", "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}/teams", "GET /user/blocks", "GET /user/codespaces", "GET /user/codespaces/secrets", "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/packages", "GET /user/packages/{package_type}/{package_name}/versions", "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}/packages", "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"];
+
+function isPaginatingEndpoint(arg) {
+ if (typeof arg === "string") {
+ return paginatingEndpoints.includes(arg);
+ } else {
+ return false;
+ }
+}
+
+/**
+ * @param octokit Octokit instance
+ * @param options Options passed to Octokit constructor
+ */
+
+function paginateRest(octokit) {
+ return {
+ paginate: Object.assign(paginate.bind(null, octokit), {
+ iterator: iterator.bind(null, octokit)
+ })
+ };
+}
+paginateRest.VERSION = VERSION;
+
+exports.composePaginateRest = composePaginateRest;
+exports.isPaginatingEndpoint = isPaginatingEndpoint;
+exports.paginateRest = paginateRest;
+exports.paginatingEndpoints = paginatingEndpoints;
+//# sourceMappingURL=index.js.map
+
+
+/***/ }),
+
+/***/ 8883:
+/***/ ((__unused_webpack_module, exports) => {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+
+const VERSION = "1.0.4";
+
+/**
+ * @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;
+
+exports.requestLog = requestLog;
+//# sourceMappingURL=index.js.map
+
+
+/***/ }),
+
+/***/ 3044:
+/***/ ((__unused_webpack_module, exports) => {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+
+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;
+ });
+ }
+
+ keys.push.apply(keys, symbols);
+ }
+
+ return keys;
+}
+
+function _objectSpread2(target) {
+ for (var i = 1; i < arguments.length; i++) {
+ var source = arguments[i] != null ? arguments[i] : {};
+
+ 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));
+ });
+ }
+ }
+
+ return target;
+}
+
+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: {
+ addCustomLabelsToSelfHostedRunnerForOrg: ["POST /orgs/{org}/actions/runners/{runner_id}/labels"],
+ addCustomLabelsToSelfHostedRunnerForRepo: ["POST /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"],
+ 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"],
+ deleteActionsCacheById: ["DELETE /repos/{owner}/{repo}/actions/caches/{cache_id}"],
+ deleteActionsCacheByKey: ["DELETE /repos/{owner}/{repo}/actions/caches{?key,ref}"],
+ 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"],
+ downloadWorkflowRunAttemptLogs: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/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"],
+ getActionsCacheList: ["GET /repos/{owner}/{repo}/actions/caches"],
+ getActionsCacheUsage: ["GET /repos/{owner}/{repo}/actions/cache/usage"],
+ getActionsCacheUsageByRepoForOrg: ["GET /orgs/{org}/actions/cache/usage-by-repository"],
+ getActionsCacheUsageForEnterprise: ["GET /enterprises/{enterprise}/actions/cache/usage"],
+ getActionsCacheUsageForOrg: ["GET /orgs/{org}/actions/cache/usage"],
+ 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}"],
+ getGithubActionsDefaultWorkflowPermissionsEnterprise: ["GET /enterprises/{enterprise}/actions/permissions/workflow"],
+ getGithubActionsDefaultWorkflowPermissionsOrganization: ["GET /orgs/{org}/actions/permissions/workflow"],
+ getGithubActionsDefaultWorkflowPermissionsRepository: ["GET /repos/{owner}/{repo}/actions/permissions/workflow"],
+ 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}"],
+ getWorkflowAccessToRepository: ["GET /repos/{owner}/{repo}/actions/permissions/access"],
+ getWorkflowRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}"],
+ getWorkflowRunAttempt: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}"],
+ 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"],
+ listJobsForWorkflowRunAttempt: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs"],
+ listLabelsForSelfHostedRunnerForOrg: ["GET /orgs/{org}/actions/runners/{runner_id}/labels"],
+ listLabelsForSelfHostedRunnerForRepo: ["GET /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"],
+ 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"],
+ reRunJobForWorkflowRun: ["POST /repos/{owner}/{repo}/actions/jobs/{job_id}/rerun"],
+ reRunWorkflow: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun"],
+ reRunWorkflowFailedJobs: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun-failed-jobs"],
+ removeAllCustomLabelsFromSelfHostedRunnerForOrg: ["DELETE /orgs/{org}/actions/runners/{runner_id}/labels"],
+ removeAllCustomLabelsFromSelfHostedRunnerForRepo: ["DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"],
+ removeCustomLabelFromSelfHostedRunnerForOrg: ["DELETE /orgs/{org}/actions/runners/{runner_id}/labels/{name}"],
+ removeCustomLabelFromSelfHostedRunnerForRepo: ["DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels/{name}"],
+ 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"],
+ setCustomLabelsForSelfHostedRunnerForOrg: ["PUT /orgs/{org}/actions/runners/{runner_id}/labels"],
+ setCustomLabelsForSelfHostedRunnerForRepo: ["PUT /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"],
+ setGithubActionsDefaultWorkflowPermissionsEnterprise: ["PUT /enterprises/{enterprise}/actions/permissions/workflow"],
+ setGithubActionsDefaultWorkflowPermissionsOrganization: ["PUT /orgs/{org}/actions/permissions/workflow"],
+ setGithubActionsDefaultWorkflowPermissionsRepository: ["PUT /repos/{owner}/{repo}/actions/permissions/workflow"],
+ 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"],
+ setWorkflowAccessToRepository: ["PUT /repos/{owner}/{repo}/actions/permissions/access"]
+ },
+ 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}", {}, {
+ renamed: ["apps", "addRepoToInstallationForAuthenticatedUser"]
+ }],
+ addRepoToInstallationForAuthenticatedUser: ["PUT /user/installations/{installation_id}/repositories/{repository_id}"],
+ checkToken: ["POST /applications/{client_id}/token"],
+ 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"],
+ getWebhookDelivery: ["GET /app/hook/deliveries/{delivery_id}"],
+ 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"],
+ listWebhookDeliveries: ["GET /app/hook/deliveries"],
+ redeliverWebhookDelivery: ["POST /app/hook/deliveries/{delivery_id}/attempts"],
+ removeRepoFromInstallation: ["DELETE /user/installations/{installation_id}/repositories/{repository_id}", {}, {
+ renamed: ["apps", "removeRepoFromInstallationForAuthenticatedUser"]
+ }],
+ removeRepoFromInstallationForAuthenticatedUser: ["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"],
+ getGithubAdvancedSecurityBillingGhe: ["GET /enterprises/{enterprise}/settings/billing/advanced-security"],
+ getGithubAdvancedSecurityBillingOrg: ["GET /orgs/{org}/settings/billing/advanced-security"],
+ 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"],
+ rerequestRun: ["POST /repos/{owner}/{repo}/check-runs/{check_run_id}/rerequest"],
+ 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"],
+ listAlertsForOrg: ["GET /orgs/{org}/code-scanning/alerts"],
+ 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"],
+ getConductCode: ["GET /codes_of_conduct/{key}"]
+ },
+ codespaces: {
+ addRepositoryForSecretForAuthenticatedUser: ["PUT /user/codespaces/secrets/{secret_name}/repositories/{repository_id}"],
+ codespaceMachinesForAuthenticatedUser: ["GET /user/codespaces/{codespace_name}/machines"],
+ createForAuthenticatedUser: ["POST /user/codespaces"],
+ createOrUpdateRepoSecret: ["PUT /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"],
+ createOrUpdateSecretForAuthenticatedUser: ["PUT /user/codespaces/secrets/{secret_name}"],
+ createWithPrForAuthenticatedUser: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/codespaces"],
+ createWithRepoForAuthenticatedUser: ["POST /repos/{owner}/{repo}/codespaces"],
+ deleteForAuthenticatedUser: ["DELETE /user/codespaces/{codespace_name}"],
+ deleteFromOrganization: ["DELETE /orgs/{org}/members/{username}/codespaces/{codespace_name}"],
+ deleteRepoSecret: ["DELETE /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"],
+ deleteSecretForAuthenticatedUser: ["DELETE /user/codespaces/secrets/{secret_name}"],
+ exportForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/exports"],
+ getExportDetailsForAuthenticatedUser: ["GET /user/codespaces/{codespace_name}/exports/{export_id}"],
+ getForAuthenticatedUser: ["GET /user/codespaces/{codespace_name}"],
+ getPublicKeyForAuthenticatedUser: ["GET /user/codespaces/secrets/public-key"],
+ getRepoPublicKey: ["GET /repos/{owner}/{repo}/codespaces/secrets/public-key"],
+ getRepoSecret: ["GET /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"],
+ getSecretForAuthenticatedUser: ["GET /user/codespaces/secrets/{secret_name}"],
+ listDevcontainersInRepositoryForAuthenticatedUser: ["GET /repos/{owner}/{repo}/codespaces/devcontainers"],
+ listForAuthenticatedUser: ["GET /user/codespaces"],
+ listInOrganization: ["GET /orgs/{org}/codespaces", {}, {
+ renamedParameters: {
+ org_id: "org"
+ }
+ }],
+ listInRepositoryForAuthenticatedUser: ["GET /repos/{owner}/{repo}/codespaces"],
+ listRepoSecrets: ["GET /repos/{owner}/{repo}/codespaces/secrets"],
+ listRepositoriesForSecretForAuthenticatedUser: ["GET /user/codespaces/secrets/{secret_name}/repositories"],
+ listSecretsForAuthenticatedUser: ["GET /user/codespaces/secrets"],
+ removeRepositoryForSecretForAuthenticatedUser: ["DELETE /user/codespaces/secrets/{secret_name}/repositories/{repository_id}"],
+ repoMachinesForAuthenticatedUser: ["GET /repos/{owner}/{repo}/codespaces/machines"],
+ setRepositoriesForSecretForAuthenticatedUser: ["PUT /user/codespaces/secrets/{secret_name}/repositories"],
+ startForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/start"],
+ stopForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/stop"],
+ stopInOrganization: ["POST /orgs/{org}/members/{username}/codespaces/{codespace_name}/stop"],
+ updateForAuthenticatedUser: ["PATCH /user/codespaces/{codespace_name}"]
+ },
+ dependabot: {
+ addSelectedRepoToOrgSecret: ["PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}"],
+ createOrUpdateOrgSecret: ["PUT /orgs/{org}/dependabot/secrets/{secret_name}"],
+ createOrUpdateRepoSecret: ["PUT /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"],
+ deleteOrgSecret: ["DELETE /orgs/{org}/dependabot/secrets/{secret_name}"],
+ deleteRepoSecret: ["DELETE /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"],
+ getOrgPublicKey: ["GET /orgs/{org}/dependabot/secrets/public-key"],
+ getOrgSecret: ["GET /orgs/{org}/dependabot/secrets/{secret_name}"],
+ getRepoPublicKey: ["GET /repos/{owner}/{repo}/dependabot/secrets/public-key"],
+ getRepoSecret: ["GET /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"],
+ listOrgSecrets: ["GET /orgs/{org}/dependabot/secrets"],
+ listRepoSecrets: ["GET /repos/{owner}/{repo}/dependabot/secrets"],
+ listSelectedReposForOrgSecret: ["GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories"],
+ removeSelectedRepoFromOrgSecret: ["DELETE /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}"],
+ setSelectedReposForOrgSecret: ["PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories"]
+ },
+ dependencyGraph: {
+ createRepositorySnapshot: ["POST /repos/{owner}/{repo}/dependency-graph/snapshots"],
+ diffRange: ["GET /repos/{owner}/{repo}/dependency-graph/compare/{basehead}"]
+ },
+ emojis: {
+ get: ["GET /emojis"]
+ },
+ enterpriseAdmin: {
+ addCustomLabelsToSelfHostedRunnerForEnterprise: ["POST /enterprises/{enterprise}/actions/runners/{runner_id}/labels"],
+ 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"],
+ getServerStatistics: ["GET /enterprise-installation/{enterprise_or_org}/server-statistics"],
+ listLabelsForSelfHostedRunnerForEnterprise: ["GET /enterprises/{enterprise}/actions/runners/{runner_id}/labels"],
+ listSelectedOrganizationsEnabledGithubActionsEnterprise: ["GET /enterprises/{enterprise}/actions/permissions/organizations"],
+ removeAllCustomLabelsFromSelfHostedRunnerForEnterprise: ["DELETE /enterprises/{enterprise}/actions/runners/{runner_id}/labels"],
+ removeCustomLabelFromSelfHostedRunnerForEnterprise: ["DELETE /enterprises/{enterprise}/actions/runners/{runner_id}/labels/{name}"],
+ setAllowedActionsEnterprise: ["PUT /enterprises/{enterprise}/actions/permissions/selected-actions"],
+ setCustomLabelsForSelfHostedRunnerForEnterprise: ["PUT /enterprises/{enterprise}/actions/runners/{runner_id}/labels"],
+ 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"],
+ 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"],
+ deleteArchiveForOrg: ["DELETE /orgs/{org}/migrations/{migration_id}/archive"],
+ downloadArchiveForOrg: ["GET /orgs/{org}/migrations/{migration_id}/archive"],
+ getArchiveForAuthenticatedUser: ["GET /user/migrations/{migration_id}/archive"],
+ 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}"],
+ getStatusForOrg: ["GET /orgs/{org}/migrations/{migration_id}"],
+ listForAuthenticatedUser: ["GET /user/migrations"],
+ listForOrg: ["GET /orgs/{org}/migrations"],
+ listReposForAuthenticatedUser: ["GET /user/migrations/{migration_id}/repositories"],
+ listReposForOrg: ["GET /orgs/{org}/migrations/{migration_id}/repositories"],
+ listReposForUser: ["GET /user/migrations/{migration_id}/repositories", {}, {
+ renamed: ["migrations", "listReposForAuthenticatedUser"]
+ }],
+ 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"],
+ unlockRepoForOrg: ["DELETE /orgs/{org}/migrations/{migration_id}/repos/{repo_name}/lock"],
+ 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"],
+ getWebhookDelivery: ["GET /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}"],
+ list: ["GET /organizations"],
+ listAppInstallations: ["GET /orgs/{org}/installations"],
+ listBlockedUsers: ["GET /orgs/{org}/blocks"],
+ listCustomRoles: ["GET /organizations/{organization_id}/custom_roles"],
+ 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"],
+ listWebhookDeliveries: ["GET /orgs/{org}/hooks/{hook_id}/deliveries"],
+ listWebhooks: ["GET /orgs/{org}/hooks"],
+ pingWebhook: ["POST /orgs/{org}/hooks/{hook_id}/pings"],
+ redeliverWebhookDelivery: ["POST /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}/attempts"],
+ 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}"],
+ deletePackageForUser: ["DELETE /users/{username}/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}"],
+ deletePackageVersionForUser: ["DELETE /users/{username}/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}"],
+ listPackagesForAuthenticatedUser: ["GET /user/packages"],
+ listPackagesForOrganization: ["GET /orgs/{org}/packages"],
+ listPackagesForUser: ["GET /users/{username}/packages"],
+ restorePackageForAuthenticatedUser: ["POST /user/packages/{package_type}/{package_name}/restore{?token}"],
+ restorePackageForOrg: ["POST /orgs/{org}/packages/{package_type}/{package_name}/restore{?token}"],
+ restorePackageForUser: ["POST /users/{username}/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"],
+ restorePackageVersionForUser: ["POST /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore"]
+ },
+ projects: {
+ addCollaborator: ["PUT /projects/{project_id}/collaborators/{username}"],
+ createCard: ["POST /projects/columns/{column_id}/cards"],
+ createColumn: ["POST /projects/{project_id}/columns"],
+ createForAuthenticatedUser: ["POST /user/projects"],
+ createForOrg: ["POST /orgs/{org}/projects"],
+ createForRepo: ["POST /repos/{owner}/{repo}/projects"],
+ delete: ["DELETE /projects/{project_id}"],
+ deleteCard: ["DELETE /projects/columns/cards/{card_id}"],
+ deleteColumn: ["DELETE /projects/columns/{column_id}"],
+ get: ["GET /projects/{project_id}"],
+ getCard: ["GET /projects/columns/cards/{card_id}"],
+ getColumn: ["GET /projects/columns/{column_id}"],
+ getPermissionForUser: ["GET /projects/{project_id}/collaborators/{username}/permission"],
+ listCards: ["GET /projects/columns/{column_id}/cards"],
+ listCollaborators: ["GET /projects/{project_id}/collaborators"],
+ listColumns: ["GET /projects/{project_id}/columns"],
+ listForOrg: ["GET /orgs/{org}/projects"],
+ listForRepo: ["GET /repos/{owner}/{repo}/projects"],
+ listForUser: ["GET /users/{username}/projects"],
+ moveCard: ["POST /projects/columns/cards/{card_id}/moves"],
+ moveColumn: ["POST /projects/columns/{column_id}/moves"],
+ removeCollaborator: ["DELETE /projects/{project_id}/collaborators/{username}"],
+ update: ["PATCH /projects/{project_id}"],
+ updateCard: ["PATCH /projects/columns/cards/{card_id}"],
+ updateColumn: ["PATCH /projects/columns/{column_id}"]
+ },
+ 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"],
+ 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"],
+ createForIssue: ["POST /repos/{owner}/{repo}/issues/{issue_number}/reactions"],
+ createForIssueComment: ["POST /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions"],
+ createForPullRequestReviewComment: ["POST /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions"],
+ createForRelease: ["POST /repos/{owner}/{repo}/releases/{release_id}/reactions"],
+ createForTeamDiscussionCommentInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions"],
+ createForTeamDiscussionInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions"],
+ deleteForCommitComment: ["DELETE /repos/{owner}/{repo}/comments/{comment_id}/reactions/{reaction_id}"],
+ deleteForIssue: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/reactions/{reaction_id}"],
+ deleteForIssueComment: ["DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions/{reaction_id}"],
+ deleteForPullRequestComment: ["DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions/{reaction_id}"],
+ deleteForRelease: ["DELETE /repos/{owner}/{repo}/releases/{release_id}/reactions/{reaction_id}"],
+ deleteForTeamDiscussion: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions/{reaction_id}"],
+ deleteForTeamDiscussionComment: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions/{reaction_id}"],
+ listForCommitComment: ["GET /repos/{owner}/{repo}/comments/{comment_id}/reactions"],
+ listForIssue: ["GET /repos/{owner}/{repo}/issues/{issue_number}/reactions"],
+ listForIssueComment: ["GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions"],
+ listForPullRequestReviewComment: ["GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions"],
+ listForRelease: ["GET /repos/{owner}/{repo}/releases/{release_id}/reactions"],
+ listForTeamDiscussionCommentInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions"],
+ listForTeamDiscussionInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions"]
+ },
+ repos: {
+ acceptInvitation: ["PATCH /user/repository_invitations/{invitation_id}", {}, {
+ renamed: ["repos", "acceptInvitationForAuthenticatedUser"]
+ }],
+ acceptInvitationForAuthenticatedUser: ["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"],
+ codeownersErrors: ["GET /repos/{owner}/{repo}/codeowners/errors"],
+ compareCommits: ["GET /repos/{owner}/{repo}/compare/{base}...{head}"],
+ compareCommitsWithBasehead: ["GET /repos/{owner}/{repo}/compare/{basehead}"],
+ createAutolink: ["POST /repos/{owner}/{repo}/autolinks"],
+ createCommitComment: ["POST /repos/{owner}/{repo}/commits/{commit_sha}/comments"],
+ createCommitSignatureProtection: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures"],
+ 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"],
+ createRelease: ["POST /repos/{owner}/{repo}/releases"],
+ createTagProtection: ["POST /repos/{owner}/{repo}/tags/protection"],
+ createUsingTemplate: ["POST /repos/{template_owner}/{template_repo}/generate"],
+ createWebhook: ["POST /repos/{owner}/{repo}/hooks"],
+ declineInvitation: ["DELETE /user/repository_invitations/{invitation_id}", {}, {
+ renamed: ["repos", "declineInvitationForAuthenticatedUser"]
+ }],
+ declineInvitationForAuthenticatedUser: ["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}"],
+ deleteAutolink: ["DELETE /repos/{owner}/{repo}/autolinks/{autolink_id}"],
+ 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"],
+ 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"],
+ 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}"],
+ deleteTagProtection: ["DELETE /repos/{owner}/{repo}/tags/protection/{tag_protection_id}"],
+ deleteWebhook: ["DELETE /repos/{owner}/{repo}/hooks/{hook_id}"],
+ disableAutomatedSecurityFixes: ["DELETE /repos/{owner}/{repo}/automated-security-fixes"],
+ disableLfsForRepo: ["DELETE /repos/{owner}/{repo}/lfs"],
+ disableVulnerabilityAlerts: ["DELETE /repos/{owner}/{repo}/vulnerability-alerts"],
+ 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"],
+ enableLfsForRepo: ["PUT /repos/{owner}/{repo}/lfs"],
+ enableVulnerabilityAlerts: ["PUT /repos/{owner}/{repo}/vulnerability-alerts"],
+ generateReleaseNotes: ["POST /repos/{owner}/{repo}/releases/generate-notes"],
+ 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"],
+ getAppsWithAccessToProtectedBranch: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps"],
+ getAutolink: ["GET /repos/{owner}/{repo}/autolinks/{autolink_id}"],
+ 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"],
+ 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"],
+ getWebhookDelivery: ["GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}"],
+ listAutolinks: ["GET /repos/{owner}/{repo}/autolinks"],
+ listBranches: ["GET /repos/{owner}/{repo}/branches"],
+ listBranchesForHeadCommit: ["GET /repos/{owner}/{repo}/commits/{commit_sha}/branches-where-head"],
+ 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"],
+ listReleaseAssets: ["GET /repos/{owner}/{repo}/releases/{release_id}/assets"],
+ listReleases: ["GET /repos/{owner}/{repo}/releases"],
+ listTagProtection: ["GET /repos/{owner}/{repo}/tags/protection"],
+ listTags: ["GET /repos/{owner}/{repo}/tags"],
+ listTeams: ["GET /repos/{owner}/{repo}/teams"],
+ listWebhookDeliveries: ["GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries"],
+ listWebhooks: ["GET /repos/{owner}/{repo}/hooks"],
+ merge: ["POST /repos/{owner}/{repo}/merges"],
+ mergeUpstream: ["POST /repos/{owner}/{repo}/merge-upstream"],
+ pingWebhook: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/pings"],
+ redeliverWebhookDelivery: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}/attempts"],
+ 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"],
+ 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"],
+ issuesAndPullRequests: ["GET /search/issues"],
+ labels: ["GET /search/labels"],
+ repos: ["GET /search/repositories"],
+ topics: ["GET /search/topics"],
+ users: ["GET /search/users"]
+ },
+ secretScanning: {
+ getAlert: ["GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}"],
+ listAlertsForEnterprise: ["GET /enterprises/{enterprise}/secret-scanning/alerts"],
+ listAlertsForOrg: ["GET /orgs/{org}/secret-scanning/alerts"],
+ listAlertsForRepo: ["GET /repos/{owner}/{repo}/secret-scanning/alerts"],
+ listLocationsForAlert: ["GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations"],
+ 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}"],
+ addOrUpdateRepoPermissionsInOrg: ["PUT /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"],
+ checkPermissionsForProjectInOrg: ["GET /orgs/{org}/teams/{team_slug}/projects/{project_id}"],
+ 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"],
+ 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", {}, {
+ renamed: ["users", "addEmailForAuthenticatedUser"]
+ }],
+ addEmailForAuthenticatedUser: ["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", {}, {
+ renamed: ["users", "createGpgKeyForAuthenticatedUser"]
+ }],
+ createGpgKeyForAuthenticatedUser: ["POST /user/gpg_keys"],
+ createPublicSshKeyForAuthenticated: ["POST /user/keys", {}, {
+ renamed: ["users", "createPublicSshKeyForAuthenticatedUser"]
+ }],
+ createPublicSshKeyForAuthenticatedUser: ["POST /user/keys"],
+ deleteEmailForAuthenticated: ["DELETE /user/emails", {}, {
+ renamed: ["users", "deleteEmailForAuthenticatedUser"]
+ }],
+ deleteEmailForAuthenticatedUser: ["DELETE /user/emails"],
+ deleteGpgKeyForAuthenticated: ["DELETE /user/gpg_keys/{gpg_key_id}", {}, {
+ renamed: ["users", "deleteGpgKeyForAuthenticatedUser"]
+ }],
+ deleteGpgKeyForAuthenticatedUser: ["DELETE /user/gpg_keys/{gpg_key_id}"],
+ deletePublicSshKeyForAuthenticated: ["DELETE /user/keys/{key_id}", {}, {
+ renamed: ["users", "deletePublicSshKeyForAuthenticatedUser"]
+ }],
+ deletePublicSshKeyForAuthenticatedUser: ["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}", {}, {
+ renamed: ["users", "getGpgKeyForAuthenticatedUser"]
+ }],
+ getGpgKeyForAuthenticatedUser: ["GET /user/gpg_keys/{gpg_key_id}"],
+ getPublicSshKeyForAuthenticated: ["GET /user/keys/{key_id}", {}, {
+ renamed: ["users", "getPublicSshKeyForAuthenticatedUser"]
+ }],
+ getPublicSshKeyForAuthenticatedUser: ["GET /user/keys/{key_id}"],
+ list: ["GET /users"],
+ listBlockedByAuthenticated: ["GET /user/blocks", {}, {
+ renamed: ["users", "listBlockedByAuthenticatedUser"]
+ }],
+ listBlockedByAuthenticatedUser: ["GET /user/blocks"],
+ listEmailsForAuthenticated: ["GET /user/emails", {}, {
+ renamed: ["users", "listEmailsForAuthenticatedUser"]
+ }],
+ listEmailsForAuthenticatedUser: ["GET /user/emails"],
+ listFollowedByAuthenticated: ["GET /user/following", {}, {
+ renamed: ["users", "listFollowedByAuthenticatedUser"]
+ }],
+ listFollowedByAuthenticatedUser: ["GET /user/following"],
+ listFollowersForAuthenticatedUser: ["GET /user/followers"],
+ listFollowersForUser: ["GET /users/{username}/followers"],
+ listFollowingForUser: ["GET /users/{username}/following"],
+ listGpgKeysForAuthenticated: ["GET /user/gpg_keys", {}, {
+ renamed: ["users", "listGpgKeysForAuthenticatedUser"]
+ }],
+ listGpgKeysForAuthenticatedUser: ["GET /user/gpg_keys"],
+ listGpgKeysForUser: ["GET /users/{username}/gpg_keys"],
+ listPublicEmailsForAuthenticated: ["GET /user/public_emails", {}, {
+ renamed: ["users", "listPublicEmailsForAuthenticatedUser"]
+ }],
+ listPublicEmailsForAuthenticatedUser: ["GET /user/public_emails"],
+ listPublicKeysForUser: ["GET /users/{username}/keys"],
+ listPublicSshKeysForAuthenticated: ["GET /user/keys", {}, {
+ renamed: ["users", "listPublicSshKeysForAuthenticatedUser"]
+ }],
+ listPublicSshKeysForAuthenticatedUser: ["GET /user/keys"],
+ setPrimaryEmailVisibilityForAuthenticated: ["PATCH /user/email/visibility", {}, {
+ renamed: ["users", "setPrimaryEmailVisibilityForAuthenticatedUser"]
+ }],
+ setPrimaryEmailVisibilityForAuthenticatedUser: ["PATCH /user/email/visibility"],
+ unblock: ["DELETE /user/blocks/{username}"],
+ unfollow: ["DELETE /user/following/{username}"],
+ updateAuthenticated: ["PATCH /user"]
+ }
+};
+
+const VERSION = "5.16.2";
+
+function endpointsToMethods(octokit, endpointsMap) {
+ const newMethods = {};
+
+ 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);
+
+ if (!newMethods[scope]) {
+ newMethods[scope] = {};
+ }
+
+ const scopeMethods = newMethods[scope];
+
+ if (decorations) {
+ scopeMethods[methodName] = decorate(octokit, scope, methodName, endpointDefaults, decorations);
+ continue;
+ }
+
+ scopeMethods[methodName] = octokit.request.defaults(endpointDefaults);
+ }
+ }
+
+ 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`
+
+ 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];
+ }
+
+ delete options[name];
+ }
+ }
+
+ return requestWithDefaults(options);
+ } // @ts-ignore https://github.com/microsoft/TypeScript/issues/25488
+
+
+ return requestWithDefaults(...args);
+ }
+
+ return Object.assign(withDecorations, requestWithDefaults);
+}
+
+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
+ });
+}
+legacyRestEndpointMethods.VERSION = VERSION;
+
+exports.legacyRestEndpointMethods = legacyRestEndpointMethods;
+exports.restEndpointMethods = restEndpointMethods;
+//# sourceMappingURL=index.js.map
+
+
+/***/ }),
+
+/***/ 5375:
+/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", ({ value: true }));
+
+var core = __nccwpck_require__(4952);
+var pluginRequestLog = __nccwpck_require__(8883);
+var pluginPaginateRest = __nccwpck_require__(4193);
+var pluginRestEndpointMethods = __nccwpck_require__(3044);
+
+const VERSION = "18.12.0";
+
+const Octokit = core.Octokit.plugin(pluginRequestLog.requestLog, pluginRestEndpointMethods.legacyRestEndpointMethods, pluginPaginateRest.paginateRest).defaults({
+ userAgent: `octokit-rest.js/${VERSION}`
+});
+
+exports.Octokit = Octokit;
+//# sourceMappingURL=index.js.map
+
+
+/***/ }),
+
+/***/ 7633:
/***/ ((__unused_webpack_module, exports) => {
"use strict";
@@ -2654,7 +4991,7 @@ exports.createTokenAuth = createTokenAuth;
/***/ }),
-/***/ 6762:
+/***/ 4952:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
@@ -2664,12 +5001,49 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
var universalUserAgent = __nccwpck_require__(5030);
var beforeAfterHook = __nccwpck_require__(3682);
-var request = __nccwpck_require__(6234);
-var graphql = __nccwpck_require__(8467);
-var authToken = __nccwpck_require__(334);
+var request = __nccwpck_require__(6206);
+var graphql = __nccwpck_require__(7461);
+var authToken = __nccwpck_require__(7633);
-const VERSION = "4.1.0";
+function _objectWithoutPropertiesLoose(source, excluded) {
+ if (source == null) return {};
+ var target = {};
+ var sourceKeys = Object.keys(source);
+ var key, i;
+ for (i = 0; i < sourceKeys.length; i++) {
+ key = sourceKeys[i];
+ if (excluded.indexOf(key) >= 0) continue;
+ target[key] = source[key];
+ }
+
+ return target;
+}
+
+function _objectWithoutProperties(source, excluded) {
+ if (source == null) return {};
+
+ var target = _objectWithoutPropertiesLoose(source, excluded);
+
+ var key, i;
+
+ 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];
+ }
+ }
+
+ return target;
+}
+
+const VERSION = "3.6.0";
+
+const _excluded = ["authStrategy"];
class Octokit {
constructor(options = {}) {
const hook = new beforeAfterHook.Collection();
@@ -2729,9 +5103,10 @@ class Octokit {
}
} else {
const {
- authStrategy,
- ...otherOptions
- } = options;
+ authStrategy
+ } = options,
+ otherOptions = _objectWithoutProperties(options, _excluded);
+
const auth = authStrategy(Object.assign({
request: this.request,
log: this.log,
@@ -2800,7 +5175,7 @@ exports.Octokit = Octokit;
/***/ }),
-/***/ 9440:
+/***/ 6065:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
@@ -3128,6 +5503,8 @@ function parse(options) {
} else {
if (Object.keys(remainingParameters).length) {
body = remainingParameters;
+ } else {
+ headers["content-length"] = 0;
}
}
} // default content-type for JSON if body is set
@@ -3170,7 +5547,7 @@ function withDefaults(oldDefaults, newDefaults) {
});
}
-const VERSION = "7.0.3";
+const VERSION = "6.0.12";
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.
@@ -3196,7 +5573,7 @@ exports.endpoint = endpoint;
/***/ }),
-/***/ 8467:
+/***/ 7461:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
@@ -3204,30 +5581,33 @@ exports.endpoint = endpoint;
Object.defineProperty(exports, "__esModule", ({ value: true }));
-var request = __nccwpck_require__(6234);
+var request = __nccwpck_require__(6206);
var universalUserAgent = __nccwpck_require__(5030);
-const VERSION = "5.0.4";
+const VERSION = "4.8.0";
function _buildMessageForResponseErrors(data) {
return `Request failed due to following response errors:\n` + data.errors.map(e => ` - ${e.message}`).join("\n");
}
+
class GraphqlResponseError extends Error {
constructor(request, headers, response) {
super(_buildMessageForResponseErrors(response));
this.request = request;
this.headers = headers;
this.response = response;
- this.name = "GraphqlResponseError";
- // Expose the errors and response data in their shorthand properties.
+ this.name = "GraphqlResponseError"; // Expose the errors and response data in their shorthand properties.
+
this.errors = response.errors;
- this.data = response.data;
- // Maintains proper stack trace (only available on V8)
+ this.data = response.data; // Maintains proper stack trace (only available on V8)
+
/* istanbul ignore next */
+
if (Error.captureStackTrace) {
Error.captureStackTrace(this, this.constructor);
}
}
+
}
const NON_VARIABLE_OPTIONS = ["method", "baseUrl", "url", "headers", "request", "query", "mediaType"];
@@ -3238,11 +5618,13 @@ function graphql(request, query, options) {
if (typeof query === "string" && "query" in options) {
return Promise.reject(new Error(`[@octokit/graphql] "query" cannot be used as variable name`));
}
+
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;
@@ -3251,38 +5633,47 @@ function graphql(request, query, options) {
result[key] = parsedOptions[key];
return result;
}
+
if (!result.variables) {
result.variables = {};
}
+
result.variables[key] = parsedOptions[key];
return result;
- }, {});
- // workaround for GitHub Enterprise baseUrl set with /api/v3 suffix
+ }, {}); // workaround for GitHub Enterprise baseUrl set with /api/v3 suffix
// https://github.com/octokit/auth-app.js/issues/111#issuecomment-657610451
+
const baseUrl = parsedOptions.baseUrl || request.endpoint.DEFAULTS.baseUrl;
+
if (GHES_V3_SUFFIX_REGEX.test(baseUrl)) {
requestOptions.url = baseUrl.replace(GHES_V3_SUFFIX_REGEX, "/api/graphql");
}
+
return request(requestOptions).then(response => {
if (response.data.errors) {
const headers = {};
+
for (const key of Object.keys(response.headers)) {
headers[key] = response.headers[key];
}
+
throw new GraphqlResponseError(requestOptions, headers, response.data);
}
+
return response.data.data;
});
}
-function withDefaults(request, newDefaults) {
- const newRequest = request.defaults(newDefaults);
+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: newRequest.endpoint
+ endpoint: request.request.endpoint
});
}
@@ -3308,1285 +5699,7 @@ exports.withCustomRequest = withCustomRequest;
/***/ }),
-/***/ 4193:
-/***/ ((__unused_webpack_module, exports) => {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", ({ value: true }));
-
-const VERSION = "5.0.1";
-
-/**
- * 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) {
- // endpoints can respond with 204 if repository is empty
- if (!response.data) {
- return {
- ...response,
- data: []
- };
- }
- 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.
- 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 (typeof incompleteResults !== "undefined") {
- response.data.incomplete_results = incompleteResults;
- }
- if (typeof repositorySelection !== "undefined") {
- response.data.repository_selection = repositorySelection;
- }
- response.data.total_count = totalCount;
- return response;
-}
-
-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
- };
- try {
- 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
- };
- } catch (error) {
- if (error.status !== 409) throw error;
- url = "";
- return {
- value: {
- status: 200,
- headers: {},
- data: []
- }
- };
- }
- }
- })
- };
-}
-
-function paginate(octokit, route, parameters, mapFn) {
- if (typeof parameters === "function") {
- mapFn = parameters;
- parameters = undefined;
- }
- 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;
- }
- let earlyExit = false;
- function done() {
- earlyExit = true;
- }
- results = results.concat(mapFn ? mapFn(result.value, done) : result.value.data);
- if (earlyExit) {
- return results;
- }
- return gather(octokit, results, iterator, mapFn);
- });
-}
-
-const composePaginateRest = Object.assign(paginate, {
- iterator
-});
-
-const paginatingEndpoints = ["GET /app/hook/deliveries", "GET /app/installations", "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}/code-scanning/alerts", "GET /enterprises/{enterprise}/secret-scanning/alerts", "GET /enterprises/{enterprise}/settings/billing/advanced-security", "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 /licenses", "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 /organizations/{org}/codespaces/secrets", "GET /organizations/{org}/codespaces/secrets/{secret_name}/repositories", "GET /orgs/{org}/actions/cache/usage-by-repository", "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/secrets", "GET /orgs/{org}/actions/secrets/{secret_name}/repositories", "GET /orgs/{org}/blocks", "GET /orgs/{org}/code-scanning/alerts", "GET /orgs/{org}/codespaces", "GET /orgs/{org}/dependabot/secrets", "GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories", "GET /orgs/{org}/events", "GET /orgs/{org}/failed_invitations", "GET /orgs/{org}/hooks", "GET /orgs/{org}/hooks/{hook_id}/deliveries", "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}/packages", "GET /orgs/{org}/packages/{package_type}/{package_name}/versions", "GET /orgs/{org}/projects", "GET /orgs/{org}/public_members", "GET /orgs/{org}/repos", "GET /orgs/{org}/secret-scanning/alerts", "GET /orgs/{org}/settings/billing/advanced-security", "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}/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/caches", "GET /repos/{owner}/{repo}/actions/runners", "GET /repos/{owner}/{repo}/actions/runs", "GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts", "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs", "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}/codespaces", "GET /repos/{owner}/{repo}/codespaces/devcontainers", "GET /repos/{owner}/{repo}/codespaces/secrets", "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}/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}/status", "GET /repos/{owner}/{repo}/commits/{ref}/statuses", "GET /repos/{owner}/{repo}/contributors", "GET /repos/{owner}/{repo}/dependabot/alerts", "GET /repos/{owner}/{repo}/dependabot/secrets", "GET /repos/{owner}/{repo}/deployments", "GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses", "GET /repos/{owner}/{repo}/environments", "GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies", "GET /repos/{owner}/{repo}/events", "GET /repos/{owner}/{repo}/forks", "GET /repos/{owner}/{repo}/hooks", "GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries", "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}/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}/releases/{release_id}/reactions", "GET /repos/{owner}/{repo}/secret-scanning/alerts", "GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations", "GET /repos/{owner}/{repo}/stargazers", "GET /repos/{owner}/{repo}/subscribers", "GET /repos/{owner}/{repo}/tags", "GET /repos/{owner}/{repo}/teams", "GET /repos/{owner}/{repo}/topics", "GET /repositories", "GET /repositories/{repository_id}/environments/{environment_name}/secrets", "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}/teams", "GET /user/blocks", "GET /user/codespaces", "GET /user/codespaces/secrets", "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/packages", "GET /user/packages/{package_type}/{package_name}/versions", "GET /user/public_emails", "GET /user/repos", "GET /user/repository_invitations", "GET /user/ssh_signing_keys", "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}/packages", "GET /users/{username}/projects", "GET /users/{username}/received_events", "GET /users/{username}/received_events/public", "GET /users/{username}/repos", "GET /users/{username}/ssh_signing_keys", "GET /users/{username}/starred", "GET /users/{username}/subscriptions"];
-
-function isPaginatingEndpoint(arg) {
- if (typeof arg === "string") {
- return paginatingEndpoints.includes(arg);
- } else {
- return false;
- }
-}
-
-/**
- * @param octokit Octokit instance
- * @param options Options passed to Octokit constructor
- */
-function paginateRest(octokit) {
- return {
- paginate: Object.assign(paginate.bind(null, octokit), {
- iterator: iterator.bind(null, octokit)
- })
- };
-}
-paginateRest.VERSION = VERSION;
-
-exports.composePaginateRest = composePaginateRest;
-exports.isPaginatingEndpoint = isPaginatingEndpoint;
-exports.paginateRest = paginateRest;
-exports.paginatingEndpoints = paginatingEndpoints;
-//# sourceMappingURL=index.js.map
-
-
-/***/ }),
-
-/***/ 8883:
-/***/ ((__unused_webpack_module, exports) => {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", ({ value: true }));
-
-const VERSION = "1.0.4";
-
-/**
- * @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;
-
-exports.requestLog = requestLog;
-//# sourceMappingURL=index.js.map
-
-
-/***/ }),
-
-/***/ 3044:
-/***/ ((__unused_webpack_module, exports) => {
-
-"use strict";
-
-
-Object.defineProperty(exports, "__esModule", ({ value: true }));
-
-const Endpoints = {
- actions: {
- addCustomLabelsToSelfHostedRunnerForOrg: ["POST /orgs/{org}/actions/runners/{runner_id}/labels"],
- addCustomLabelsToSelfHostedRunnerForRepo: ["POST /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"],
- 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"],
- deleteActionsCacheById: ["DELETE /repos/{owner}/{repo}/actions/caches/{cache_id}"],
- deleteActionsCacheByKey: ["DELETE /repos/{owner}/{repo}/actions/caches{?key,ref}"],
- 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"],
- downloadWorkflowRunAttemptLogs: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/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"],
- getActionsCacheList: ["GET /repos/{owner}/{repo}/actions/caches"],
- getActionsCacheUsage: ["GET /repos/{owner}/{repo}/actions/cache/usage"],
- getActionsCacheUsageByRepoForOrg: ["GET /orgs/{org}/actions/cache/usage-by-repository"],
- getActionsCacheUsageForEnterprise: ["GET /enterprises/{enterprise}/actions/cache/usage"],
- getActionsCacheUsageForOrg: ["GET /orgs/{org}/actions/cache/usage"],
- 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}"],
- getGithubActionsDefaultWorkflowPermissionsEnterprise: ["GET /enterprises/{enterprise}/actions/permissions/workflow"],
- getGithubActionsDefaultWorkflowPermissionsOrganization: ["GET /orgs/{org}/actions/permissions/workflow"],
- getGithubActionsDefaultWorkflowPermissionsRepository: ["GET /repos/{owner}/{repo}/actions/permissions/workflow"],
- 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}"],
- getWorkflowAccessToRepository: ["GET /repos/{owner}/{repo}/actions/permissions/access"],
- getWorkflowRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}"],
- getWorkflowRunAttempt: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}"],
- 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"],
- listJobsForWorkflowRunAttempt: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs"],
- listLabelsForSelfHostedRunnerForOrg: ["GET /orgs/{org}/actions/runners/{runner_id}/labels"],
- listLabelsForSelfHostedRunnerForRepo: ["GET /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"],
- 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"],
- reRunJobForWorkflowRun: ["POST /repos/{owner}/{repo}/actions/jobs/{job_id}/rerun"],
- reRunWorkflow: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun"],
- reRunWorkflowFailedJobs: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun-failed-jobs"],
- removeAllCustomLabelsFromSelfHostedRunnerForOrg: ["DELETE /orgs/{org}/actions/runners/{runner_id}/labels"],
- removeAllCustomLabelsFromSelfHostedRunnerForRepo: ["DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"],
- removeCustomLabelFromSelfHostedRunnerForOrg: ["DELETE /orgs/{org}/actions/runners/{runner_id}/labels/{name}"],
- removeCustomLabelFromSelfHostedRunnerForRepo: ["DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels/{name}"],
- 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"],
- setCustomLabelsForSelfHostedRunnerForOrg: ["PUT /orgs/{org}/actions/runners/{runner_id}/labels"],
- setCustomLabelsForSelfHostedRunnerForRepo: ["PUT /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"],
- setGithubActionsDefaultWorkflowPermissionsEnterprise: ["PUT /enterprises/{enterprise}/actions/permissions/workflow"],
- setGithubActionsDefaultWorkflowPermissionsOrganization: ["PUT /orgs/{org}/actions/permissions/workflow"],
- setGithubActionsDefaultWorkflowPermissionsRepository: ["PUT /repos/{owner}/{repo}/actions/permissions/workflow"],
- 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"],
- setWorkflowAccessToRepository: ["PUT /repos/{owner}/{repo}/actions/permissions/access"]
- },
- 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}", {}, {
- renamed: ["apps", "addRepoToInstallationForAuthenticatedUser"]
- }],
- addRepoToInstallationForAuthenticatedUser: ["PUT /user/installations/{installation_id}/repositories/{repository_id}"],
- checkToken: ["POST /applications/{client_id}/token"],
- 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"],
- getWebhookDelivery: ["GET /app/hook/deliveries/{delivery_id}"],
- 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"],
- listWebhookDeliveries: ["GET /app/hook/deliveries"],
- redeliverWebhookDelivery: ["POST /app/hook/deliveries/{delivery_id}/attempts"],
- removeRepoFromInstallation: ["DELETE /user/installations/{installation_id}/repositories/{repository_id}", {}, {
- renamed: ["apps", "removeRepoFromInstallationForAuthenticatedUser"]
- }],
- removeRepoFromInstallationForAuthenticatedUser: ["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"],
- getGithubAdvancedSecurityBillingGhe: ["GET /enterprises/{enterprise}/settings/billing/advanced-security"],
- getGithubAdvancedSecurityBillingOrg: ["GET /orgs/{org}/settings/billing/advanced-security"],
- 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"],
- rerequestRun: ["POST /repos/{owner}/{repo}/check-runs/{check_run_id}/rerequest"],
- 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}"],
- getCodeqlDatabase: ["GET /repos/{owner}/{repo}/code-scanning/codeql/databases/{language}"],
- getSarif: ["GET /repos/{owner}/{repo}/code-scanning/sarifs/{sarif_id}"],
- listAlertInstances: ["GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances"],
- listAlertsForEnterprise: ["GET /enterprises/{enterprise}/code-scanning/alerts"],
- listAlertsForOrg: ["GET /orgs/{org}/code-scanning/alerts"],
- listAlertsForRepo: ["GET /repos/{owner}/{repo}/code-scanning/alerts"],
- listAlertsInstances: ["GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances", {}, {
- renamed: ["codeScanning", "listAlertInstances"]
- }],
- listCodeqlDatabases: ["GET /repos/{owner}/{repo}/code-scanning/codeql/databases"],
- 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"],
- getConductCode: ["GET /codes_of_conduct/{key}"]
- },
- codespaces: {
- addRepositoryForSecretForAuthenticatedUser: ["PUT /user/codespaces/secrets/{secret_name}/repositories/{repository_id}"],
- addSelectedRepoToOrgSecret: ["PUT /organizations/{org}/codespaces/secrets/{secret_name}/repositories/{repository_id}"],
- codespaceMachinesForAuthenticatedUser: ["GET /user/codespaces/{codespace_name}/machines"],
- createForAuthenticatedUser: ["POST /user/codespaces"],
- createOrUpdateOrgSecret: ["PUT /organizations/{org}/codespaces/secrets/{secret_name}"],
- createOrUpdateRepoSecret: ["PUT /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"],
- createOrUpdateSecretForAuthenticatedUser: ["PUT /user/codespaces/secrets/{secret_name}"],
- createWithPrForAuthenticatedUser: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/codespaces"],
- createWithRepoForAuthenticatedUser: ["POST /repos/{owner}/{repo}/codespaces"],
- deleteForAuthenticatedUser: ["DELETE /user/codespaces/{codespace_name}"],
- deleteFromOrganization: ["DELETE /orgs/{org}/members/{username}/codespaces/{codespace_name}"],
- deleteOrgSecret: ["DELETE /organizations/{org}/codespaces/secrets/{secret_name}"],
- deleteRepoSecret: ["DELETE /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"],
- deleteSecretForAuthenticatedUser: ["DELETE /user/codespaces/secrets/{secret_name}"],
- exportForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/exports"],
- getExportDetailsForAuthenticatedUser: ["GET /user/codespaces/{codespace_name}/exports/{export_id}"],
- getForAuthenticatedUser: ["GET /user/codespaces/{codespace_name}"],
- getOrgPublicKey: ["GET /organizations/{org}/codespaces/secrets/public-key"],
- getOrgSecret: ["GET /organizations/{org}/codespaces/secrets/{secret_name}"],
- getPublicKeyForAuthenticatedUser: ["GET /user/codespaces/secrets/public-key"],
- getRepoPublicKey: ["GET /repos/{owner}/{repo}/codespaces/secrets/public-key"],
- getRepoSecret: ["GET /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"],
- getSecretForAuthenticatedUser: ["GET /user/codespaces/secrets/{secret_name}"],
- listDevcontainersInRepositoryForAuthenticatedUser: ["GET /repos/{owner}/{repo}/codespaces/devcontainers"],
- listForAuthenticatedUser: ["GET /user/codespaces"],
- listInOrganization: ["GET /orgs/{org}/codespaces", {}, {
- renamedParameters: {
- org_id: "org"
- }
- }],
- listInRepositoryForAuthenticatedUser: ["GET /repos/{owner}/{repo}/codespaces"],
- listOrgSecrets: ["GET /organizations/{org}/codespaces/secrets"],
- listRepoSecrets: ["GET /repos/{owner}/{repo}/codespaces/secrets"],
- listRepositoriesForSecretForAuthenticatedUser: ["GET /user/codespaces/secrets/{secret_name}/repositories"],
- listSecretsForAuthenticatedUser: ["GET /user/codespaces/secrets"],
- listSelectedReposForOrgSecret: ["GET /organizations/{org}/codespaces/secrets/{secret_name}/repositories"],
- preFlightWithRepoForAuthenticatedUser: ["GET /repos/{owner}/{repo}/codespaces/new"],
- removeRepositoryForSecretForAuthenticatedUser: ["DELETE /user/codespaces/secrets/{secret_name}/repositories/{repository_id}"],
- removeSelectedRepoFromOrgSecret: ["DELETE /organizations/{org}/codespaces/secrets/{secret_name}/repositories/{repository_id}"],
- repoMachinesForAuthenticatedUser: ["GET /repos/{owner}/{repo}/codespaces/machines"],
- setRepositoriesForSecretForAuthenticatedUser: ["PUT /user/codespaces/secrets/{secret_name}/repositories"],
- setSelectedReposForOrgSecret: ["PUT /organizations/{org}/codespaces/secrets/{secret_name}/repositories"],
- startForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/start"],
- stopForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/stop"],
- stopInOrganization: ["POST /orgs/{org}/members/{username}/codespaces/{codespace_name}/stop"],
- updateForAuthenticatedUser: ["PATCH /user/codespaces/{codespace_name}"]
- },
- dependabot: {
- addSelectedRepoToOrgSecret: ["PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}"],
- createOrUpdateOrgSecret: ["PUT /orgs/{org}/dependabot/secrets/{secret_name}"],
- createOrUpdateRepoSecret: ["PUT /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"],
- deleteOrgSecret: ["DELETE /orgs/{org}/dependabot/secrets/{secret_name}"],
- deleteRepoSecret: ["DELETE /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"],
- getAlert: ["GET /repos/{owner}/{repo}/dependabot/alerts/{alert_number}"],
- getOrgPublicKey: ["GET /orgs/{org}/dependabot/secrets/public-key"],
- getOrgSecret: ["GET /orgs/{org}/dependabot/secrets/{secret_name}"],
- getRepoPublicKey: ["GET /repos/{owner}/{repo}/dependabot/secrets/public-key"],
- getRepoSecret: ["GET /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"],
- listAlertsForRepo: ["GET /repos/{owner}/{repo}/dependabot/alerts"],
- listOrgSecrets: ["GET /orgs/{org}/dependabot/secrets"],
- listRepoSecrets: ["GET /repos/{owner}/{repo}/dependabot/secrets"],
- listSelectedReposForOrgSecret: ["GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories"],
- removeSelectedRepoFromOrgSecret: ["DELETE /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}"],
- setSelectedReposForOrgSecret: ["PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories"],
- updateAlert: ["PATCH /repos/{owner}/{repo}/dependabot/alerts/{alert_number}"]
- },
- dependencyGraph: {
- createRepositorySnapshot: ["POST /repos/{owner}/{repo}/dependency-graph/snapshots"],
- diffRange: ["GET /repos/{owner}/{repo}/dependency-graph/compare/{basehead}"]
- },
- emojis: {
- get: ["GET /emojis"]
- },
- enterpriseAdmin: {
- addCustomLabelsToSelfHostedRunnerForEnterprise: ["POST /enterprises/{enterprise}/actions/runners/{runner_id}/labels"],
- 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"],
- getServerStatistics: ["GET /enterprise-installation/{enterprise_or_org}/server-statistics"],
- listLabelsForSelfHostedRunnerForEnterprise: ["GET /enterprises/{enterprise}/actions/runners/{runner_id}/labels"],
- listSelectedOrganizationsEnabledGithubActionsEnterprise: ["GET /enterprises/{enterprise}/actions/permissions/organizations"],
- removeAllCustomLabelsFromSelfHostedRunnerForEnterprise: ["DELETE /enterprises/{enterprise}/actions/runners/{runner_id}/labels"],
- removeCustomLabelFromSelfHostedRunnerForEnterprise: ["DELETE /enterprises/{enterprise}/actions/runners/{runner_id}/labels/{name}"],
- setAllowedActionsEnterprise: ["PUT /enterprises/{enterprise}/actions/permissions/selected-actions"],
- setCustomLabelsForSelfHostedRunnerForEnterprise: ["PUT /enterprises/{enterprise}/actions/runners/{runner_id}/labels"],
- 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"],
- 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"],
- deleteArchiveForOrg: ["DELETE /orgs/{org}/migrations/{migration_id}/archive"],
- downloadArchiveForOrg: ["GET /orgs/{org}/migrations/{migration_id}/archive"],
- getArchiveForAuthenticatedUser: ["GET /user/migrations/{migration_id}/archive"],
- 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}"],
- getStatusForOrg: ["GET /orgs/{org}/migrations/{migration_id}"],
- listForAuthenticatedUser: ["GET /user/migrations"],
- listForOrg: ["GET /orgs/{org}/migrations"],
- listReposForAuthenticatedUser: ["GET /user/migrations/{migration_id}/repositories"],
- listReposForOrg: ["GET /orgs/{org}/migrations/{migration_id}/repositories"],
- listReposForUser: ["GET /user/migrations/{migration_id}/repositories", {}, {
- renamed: ["migrations", "listReposForAuthenticatedUser"]
- }],
- 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"],
- unlockRepoForOrg: ["DELETE /orgs/{org}/migrations/{migration_id}/repos/{repo_name}/lock"],
- updateImport: ["PATCH /repos/{owner}/{repo}/import"]
- },
- orgs: {
- addSecurityManagerTeam: ["PUT /orgs/{org}/security-managers/teams/{team_slug}"],
- 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}"],
- createCustomRole: ["POST /orgs/{org}/custom_roles"],
- createInvitation: ["POST /orgs/{org}/invitations"],
- createWebhook: ["POST /orgs/{org}/hooks"],
- deleteCustomRole: ["DELETE /orgs/{org}/custom_roles/{role_id}"],
- deleteWebhook: ["DELETE /orgs/{org}/hooks/{hook_id}"],
- enableOrDisableSecurityProductOnAllOrgRepos: ["POST /orgs/{org}/{security_product}/{enablement}"],
- 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"],
- getWebhookDelivery: ["GET /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}"],
- list: ["GET /organizations"],
- listAppInstallations: ["GET /orgs/{org}/installations"],
- listBlockedUsers: ["GET /orgs/{org}/blocks"],
- listCustomRoles: ["GET /organizations/{organization_id}/custom_roles"],
- listFailedInvitations: ["GET /orgs/{org}/failed_invitations"],
- listFineGrainedPermissions: ["GET /orgs/{org}/fine_grained_permissions"],
- 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"],
- listSecurityManagerTeams: ["GET /orgs/{org}/security-managers"],
- listWebhookDeliveries: ["GET /orgs/{org}/hooks/{hook_id}/deliveries"],
- listWebhooks: ["GET /orgs/{org}/hooks"],
- pingWebhook: ["POST /orgs/{org}/hooks/{hook_id}/pings"],
- redeliverWebhookDelivery: ["POST /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}/attempts"],
- 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}"],
- removeSecurityManagerTeam: ["DELETE /orgs/{org}/security-managers/teams/{team_slug}"],
- setMembershipForUser: ["PUT /orgs/{org}/memberships/{username}"],
- setPublicMembershipForAuthenticatedUser: ["PUT /orgs/{org}/public_members/{username}"],
- unblockUser: ["DELETE /orgs/{org}/blocks/{username}"],
- update: ["PATCH /orgs/{org}"],
- updateCustomRole: ["PATCH /orgs/{org}/custom_roles/{role_id}"],
- 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}"],
- deletePackageForUser: ["DELETE /users/{username}/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}"],
- deletePackageVersionForUser: ["DELETE /users/{username}/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}"],
- listPackagesForAuthenticatedUser: ["GET /user/packages"],
- listPackagesForOrganization: ["GET /orgs/{org}/packages"],
- listPackagesForUser: ["GET /users/{username}/packages"],
- restorePackageForAuthenticatedUser: ["POST /user/packages/{package_type}/{package_name}/restore{?token}"],
- restorePackageForOrg: ["POST /orgs/{org}/packages/{package_type}/{package_name}/restore{?token}"],
- restorePackageForUser: ["POST /users/{username}/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"],
- restorePackageVersionForUser: ["POST /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore"]
- },
- projects: {
- addCollaborator: ["PUT /projects/{project_id}/collaborators/{username}"],
- createCard: ["POST /projects/columns/{column_id}/cards"],
- createColumn: ["POST /projects/{project_id}/columns"],
- createForAuthenticatedUser: ["POST /user/projects"],
- createForOrg: ["POST /orgs/{org}/projects"],
- createForRepo: ["POST /repos/{owner}/{repo}/projects"],
- delete: ["DELETE /projects/{project_id}"],
- deleteCard: ["DELETE /projects/columns/cards/{card_id}"],
- deleteColumn: ["DELETE /projects/columns/{column_id}"],
- get: ["GET /projects/{project_id}"],
- getCard: ["GET /projects/columns/cards/{card_id}"],
- getColumn: ["GET /projects/columns/{column_id}"],
- getPermissionForUser: ["GET /projects/{project_id}/collaborators/{username}/permission"],
- listCards: ["GET /projects/columns/{column_id}/cards"],
- listCollaborators: ["GET /projects/{project_id}/collaborators"],
- listColumns: ["GET /projects/{project_id}/columns"],
- listForOrg: ["GET /orgs/{org}/projects"],
- listForRepo: ["GET /repos/{owner}/{repo}/projects"],
- listForUser: ["GET /users/{username}/projects"],
- moveCard: ["POST /projects/columns/cards/{card_id}/moves"],
- moveColumn: ["POST /projects/columns/{column_id}/moves"],
- removeCollaborator: ["DELETE /projects/{project_id}/collaborators/{username}"],
- update: ["PATCH /projects/{project_id}"],
- updateCard: ["PATCH /projects/columns/cards/{card_id}"],
- updateColumn: ["PATCH /projects/columns/{column_id}"]
- },
- 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"],
- 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"],
- createForIssue: ["POST /repos/{owner}/{repo}/issues/{issue_number}/reactions"],
- createForIssueComment: ["POST /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions"],
- createForPullRequestReviewComment: ["POST /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions"],
- createForRelease: ["POST /repos/{owner}/{repo}/releases/{release_id}/reactions"],
- createForTeamDiscussionCommentInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions"],
- createForTeamDiscussionInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions"],
- deleteForCommitComment: ["DELETE /repos/{owner}/{repo}/comments/{comment_id}/reactions/{reaction_id}"],
- deleteForIssue: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/reactions/{reaction_id}"],
- deleteForIssueComment: ["DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions/{reaction_id}"],
- deleteForPullRequestComment: ["DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions/{reaction_id}"],
- deleteForRelease: ["DELETE /repos/{owner}/{repo}/releases/{release_id}/reactions/{reaction_id}"],
- deleteForTeamDiscussion: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions/{reaction_id}"],
- deleteForTeamDiscussionComment: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions/{reaction_id}"],
- listForCommitComment: ["GET /repos/{owner}/{repo}/comments/{comment_id}/reactions"],
- listForIssue: ["GET /repos/{owner}/{repo}/issues/{issue_number}/reactions"],
- listForIssueComment: ["GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions"],
- listForPullRequestReviewComment: ["GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions"],
- listForRelease: ["GET /repos/{owner}/{repo}/releases/{release_id}/reactions"],
- listForTeamDiscussionCommentInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions"],
- listForTeamDiscussionInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions"]
- },
- repos: {
- acceptInvitation: ["PATCH /user/repository_invitations/{invitation_id}", {}, {
- renamed: ["repos", "acceptInvitationForAuthenticatedUser"]
- }],
- acceptInvitationForAuthenticatedUser: ["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"],
- codeownersErrors: ["GET /repos/{owner}/{repo}/codeowners/errors"],
- compareCommits: ["GET /repos/{owner}/{repo}/compare/{base}...{head}"],
- compareCommitsWithBasehead: ["GET /repos/{owner}/{repo}/compare/{basehead}"],
- createAutolink: ["POST /repos/{owner}/{repo}/autolinks"],
- createCommitComment: ["POST /repos/{owner}/{repo}/commits/{commit_sha}/comments"],
- createCommitSignatureProtection: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures"],
- createCommitStatus: ["POST /repos/{owner}/{repo}/statuses/{sha}"],
- createDeployKey: ["POST /repos/{owner}/{repo}/keys"],
- createDeployment: ["POST /repos/{owner}/{repo}/deployments"],
- createDeploymentBranchPolicy: ["POST /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies"],
- 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}"],
- createPagesDeployment: ["POST /repos/{owner}/{repo}/pages/deployment"],
- createPagesSite: ["POST /repos/{owner}/{repo}/pages"],
- createRelease: ["POST /repos/{owner}/{repo}/releases"],
- createTagProtection: ["POST /repos/{owner}/{repo}/tags/protection"],
- createUsingTemplate: ["POST /repos/{template_owner}/{template_repo}/generate"],
- createWebhook: ["POST /repos/{owner}/{repo}/hooks"],
- declineInvitation: ["DELETE /user/repository_invitations/{invitation_id}", {}, {
- renamed: ["repos", "declineInvitationForAuthenticatedUser"]
- }],
- declineInvitationForAuthenticatedUser: ["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}"],
- deleteAutolink: ["DELETE /repos/{owner}/{repo}/autolinks/{autolink_id}"],
- 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"],
- deleteDeployKey: ["DELETE /repos/{owner}/{repo}/keys/{key_id}"],
- deleteDeployment: ["DELETE /repos/{owner}/{repo}/deployments/{deployment_id}"],
- deleteDeploymentBranchPolicy: ["DELETE /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_id}"],
- deleteFile: ["DELETE /repos/{owner}/{repo}/contents/{path}"],
- deleteInvitation: ["DELETE /repos/{owner}/{repo}/invitations/{invitation_id}"],
- deletePagesSite: ["DELETE /repos/{owner}/{repo}/pages"],
- 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}"],
- deleteTagProtection: ["DELETE /repos/{owner}/{repo}/tags/protection/{tag_protection_id}"],
- deleteWebhook: ["DELETE /repos/{owner}/{repo}/hooks/{hook_id}"],
- disableAutomatedSecurityFixes: ["DELETE /repos/{owner}/{repo}/automated-security-fixes"],
- disableLfsForRepo: ["DELETE /repos/{owner}/{repo}/lfs"],
- disableVulnerabilityAlerts: ["DELETE /repos/{owner}/{repo}/vulnerability-alerts"],
- 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"],
- enableLfsForRepo: ["PUT /repos/{owner}/{repo}/lfs"],
- enableVulnerabilityAlerts: ["PUT /repos/{owner}/{repo}/vulnerability-alerts"],
- generateReleaseNotes: ["POST /repos/{owner}/{repo}/releases/generate-notes"],
- 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"],
- getAppsWithAccessToProtectedBranch: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps"],
- getAutolink: ["GET /repos/{owner}/{repo}/autolinks/{autolink_id}"],
- 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"],
- 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}"],
- getDeploymentBranchPolicy: ["GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_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"],
- getWebhookDelivery: ["GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}"],
- listAutolinks: ["GET /repos/{owner}/{repo}/autolinks"],
- listBranches: ["GET /repos/{owner}/{repo}/branches"],
- listBranchesForHeadCommit: ["GET /repos/{owner}/{repo}/commits/{commit_sha}/branches-where-head"],
- 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"],
- listDeploymentBranchPolicies: ["GET /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies"],
- 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"],
- listReleaseAssets: ["GET /repos/{owner}/{repo}/releases/{release_id}/assets"],
- listReleases: ["GET /repos/{owner}/{repo}/releases"],
- listTagProtection: ["GET /repos/{owner}/{repo}/tags/protection"],
- listTags: ["GET /repos/{owner}/{repo}/tags"],
- listTeams: ["GET /repos/{owner}/{repo}/teams"],
- listWebhookDeliveries: ["GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries"],
- listWebhooks: ["GET /repos/{owner}/{repo}/hooks"],
- merge: ["POST /repos/{owner}/{repo}/merges"],
- mergeUpstream: ["POST /repos/{owner}/{repo}/merge-upstream"],
- pingWebhook: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/pings"],
- redeliverWebhookDelivery: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}/attempts"],
- 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"],
- 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}"],
- updateDeploymentBranchPolicy: ["PUT /repos/{owner}/{repo}/environments/{environment_name}/deployment-branch-policies/{branch_policy_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"],
- issuesAndPullRequests: ["GET /search/issues"],
- labels: ["GET /search/labels"],
- repos: ["GET /search/repositories"],
- topics: ["GET /search/topics"],
- users: ["GET /search/users"]
- },
- secretScanning: {
- getAlert: ["GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}"],
- listAlertsForEnterprise: ["GET /enterprises/{enterprise}/secret-scanning/alerts"],
- listAlertsForOrg: ["GET /orgs/{org}/secret-scanning/alerts"],
- listAlertsForRepo: ["GET /repos/{owner}/{repo}/secret-scanning/alerts"],
- listLocationsForAlert: ["GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations"],
- 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}"],
- addOrUpdateRepoPermissionsInOrg: ["PUT /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"],
- checkPermissionsForProjectInOrg: ["GET /orgs/{org}/teams/{team_slug}/projects/{project_id}"],
- 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"],
- 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", {}, {
- renamed: ["users", "addEmailForAuthenticatedUser"]
- }],
- addEmailForAuthenticatedUser: ["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", {}, {
- renamed: ["users", "createGpgKeyForAuthenticatedUser"]
- }],
- createGpgKeyForAuthenticatedUser: ["POST /user/gpg_keys"],
- createPublicSshKeyForAuthenticated: ["POST /user/keys", {}, {
- renamed: ["users", "createPublicSshKeyForAuthenticatedUser"]
- }],
- createPublicSshKeyForAuthenticatedUser: ["POST /user/keys"],
- createSshSigningKeyForAuthenticatedUser: ["POST /user/ssh_signing_keys"],
- deleteEmailForAuthenticated: ["DELETE /user/emails", {}, {
- renamed: ["users", "deleteEmailForAuthenticatedUser"]
- }],
- deleteEmailForAuthenticatedUser: ["DELETE /user/emails"],
- deleteGpgKeyForAuthenticated: ["DELETE /user/gpg_keys/{gpg_key_id}", {}, {
- renamed: ["users", "deleteGpgKeyForAuthenticatedUser"]
- }],
- deleteGpgKeyForAuthenticatedUser: ["DELETE /user/gpg_keys/{gpg_key_id}"],
- deletePublicSshKeyForAuthenticated: ["DELETE /user/keys/{key_id}", {}, {
- renamed: ["users", "deletePublicSshKeyForAuthenticatedUser"]
- }],
- deletePublicSshKeyForAuthenticatedUser: ["DELETE /user/keys/{key_id}"],
- deleteSshSigningKeyForAuthenticatedUser: ["DELETE /user/ssh_signing_keys/{ssh_signing_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}", {}, {
- renamed: ["users", "getGpgKeyForAuthenticatedUser"]
- }],
- getGpgKeyForAuthenticatedUser: ["GET /user/gpg_keys/{gpg_key_id}"],
- getPublicSshKeyForAuthenticated: ["GET /user/keys/{key_id}", {}, {
- renamed: ["users", "getPublicSshKeyForAuthenticatedUser"]
- }],
- getPublicSshKeyForAuthenticatedUser: ["GET /user/keys/{key_id}"],
- getSshSigningKeyForAuthenticatedUser: ["GET /user/ssh_signing_keys/{ssh_signing_key_id}"],
- list: ["GET /users"],
- listBlockedByAuthenticated: ["GET /user/blocks", {}, {
- renamed: ["users", "listBlockedByAuthenticatedUser"]
- }],
- listBlockedByAuthenticatedUser: ["GET /user/blocks"],
- listEmailsForAuthenticated: ["GET /user/emails", {}, {
- renamed: ["users", "listEmailsForAuthenticatedUser"]
- }],
- listEmailsForAuthenticatedUser: ["GET /user/emails"],
- listFollowedByAuthenticated: ["GET /user/following", {}, {
- renamed: ["users", "listFollowedByAuthenticatedUser"]
- }],
- listFollowedByAuthenticatedUser: ["GET /user/following"],
- listFollowersForAuthenticatedUser: ["GET /user/followers"],
- listFollowersForUser: ["GET /users/{username}/followers"],
- listFollowingForUser: ["GET /users/{username}/following"],
- listGpgKeysForAuthenticated: ["GET /user/gpg_keys", {}, {
- renamed: ["users", "listGpgKeysForAuthenticatedUser"]
- }],
- listGpgKeysForAuthenticatedUser: ["GET /user/gpg_keys"],
- listGpgKeysForUser: ["GET /users/{username}/gpg_keys"],
- listPublicEmailsForAuthenticated: ["GET /user/public_emails", {}, {
- renamed: ["users", "listPublicEmailsForAuthenticatedUser"]
- }],
- listPublicEmailsForAuthenticatedUser: ["GET /user/public_emails"],
- listPublicKeysForUser: ["GET /users/{username}/keys"],
- listPublicSshKeysForAuthenticated: ["GET /user/keys", {}, {
- renamed: ["users", "listPublicSshKeysForAuthenticatedUser"]
- }],
- listPublicSshKeysForAuthenticatedUser: ["GET /user/keys"],
- listSshSigningKeysForAuthenticatedUser: ["GET /user/ssh_signing_keys"],
- listSshSigningKeysForUser: ["GET /users/{username}/ssh_signing_keys"],
- setPrimaryEmailVisibilityForAuthenticated: ["PATCH /user/email/visibility", {}, {
- renamed: ["users", "setPrimaryEmailVisibilityForAuthenticatedUser"]
- }],
- setPrimaryEmailVisibilityForAuthenticatedUser: ["PATCH /user/email/visibility"],
- unblock: ["DELETE /user/blocks/{username}"],
- unfollow: ["DELETE /user/following/{username}"],
- updateAuthenticated: ["PATCH /user"]
- }
-};
-
-const VERSION = "6.7.0";
-
-function endpointsToMethods(octokit, endpointsMap) {
- const newMethods = {};
- 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);
- if (!newMethods[scope]) {
- newMethods[scope] = {};
- }
- const scopeMethods = newMethods[scope];
- if (decorations) {
- scopeMethods[methodName] = decorate(octokit, scope, methodName, endpointDefaults, decorations);
- continue;
- }
- scopeMethods[methodName] = octokit.request.defaults(endpointDefaults);
- }
- }
- 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`
- 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];
- }
- delete options[name];
- }
- }
- return requestWithDefaults(options);
- }
- // @ts-ignore https://github.com/microsoft/TypeScript/issues/25488
- return requestWithDefaults(...args);
- }
- return Object.assign(withDecorations, requestWithDefaults);
-}
-
-function restEndpointMethods(octokit) {
- const api = endpointsToMethods(octokit, Endpoints);
- return {
- rest: api
- };
-}
-restEndpointMethods.VERSION = VERSION;
-function legacyRestEndpointMethods(octokit) {
- const api = endpointsToMethods(octokit, Endpoints);
- return {
- ...api,
- rest: api
- };
-}
-legacyRestEndpointMethods.VERSION = VERSION;
-
-exports.legacyRestEndpointMethods = legacyRestEndpointMethods;
-exports.restEndpointMethods = restEndpointMethods;
-//# sourceMappingURL=index.js.map
-
-
-/***/ }),
-
-/***/ 537:
+/***/ 6239:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
@@ -4668,7 +5781,7 @@ exports.RequestError = RequestError;
/***/ }),
-/***/ 6234:
+/***/ 6206:
/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
"use strict";
@@ -4678,13 +5791,13 @@ Object.defineProperty(exports, "__esModule", ({ value: true }));
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
-var endpoint = __nccwpck_require__(9440);
+var endpoint = __nccwpck_require__(6065);
var universalUserAgent = __nccwpck_require__(5030);
var isPlainObject = __nccwpck_require__(3287);
var nodeFetch = _interopDefault(__nccwpck_require__(467));
-var requestError = __nccwpck_require__(537);
+var requestError = __nccwpck_require__(6239);
-const VERSION = "6.2.2";
+const VERSION = "5.6.3";
function getBufferResponse(response) {
return response.arrayBuffer();
@@ -4700,9 +5813,7 @@ function fetchWrapper(requestOptions) {
let headers = {};
let status;
let url;
- const fetch = requestOptions.request && requestOptions.request.fetch || globalThis.fetch ||
- /* istanbul ignore next */
- nodeFetch;
+ const fetch = requestOptions.request && requestOptions.request.fetch || nodeFetch;
return fetch(requestOptions.url, Object.assign({
method: requestOptions.method,
body: requestOptions.body,
@@ -4780,7 +5891,7 @@ function fetchWrapper(requestOptions) {
data
};
}).catch(error => {
- if (error instanceof requestError.RequestError) throw error;else if (error.name === "AbortError") throw error;
+ if (error instanceof requestError.RequestError) throw error;
throw new requestError.RequestError(error.message, 500, {
request: requestOptions
});
@@ -4855,27 +5966,443 @@ exports.request = request;
/***/ }),
-/***/ 5375:
-/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
+/***/ 4812:
+/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
-"use strict";
+module.exports =
+{
+ parallel : __nccwpck_require__(8210),
+ serial : __nccwpck_require__(445),
+ serialOrdered : __nccwpck_require__(3578)
+};
-Object.defineProperty(exports, "__esModule", ({ value: true }));
+/***/ }),
-var core = __nccwpck_require__(6762);
-var pluginRequestLog = __nccwpck_require__(8883);
-var pluginPaginateRest = __nccwpck_require__(4193);
-var pluginRestEndpointMethods = __nccwpck_require__(3044);
+/***/ 1700:
+/***/ ((module) => {
-const VERSION = "19.0.5";
+// API
+module.exports = abort;
-const Octokit = core.Octokit.plugin(pluginRequestLog.requestLog, pluginRestEndpointMethods.legacyRestEndpointMethods, pluginPaginateRest.paginateRest).defaults({
- userAgent: `octokit-rest.js/${VERSION}`
-});
+/**
+ * Aborts leftover active jobs
+ *
+ * @param {object} state - current state object
+ */
+function abort(state)
+{
+ Object.keys(state.jobs).forEach(clean.bind(state));
-exports.Octokit = Octokit;
-//# sourceMappingURL=index.js.map
+ // reset leftover jobs
+ state.jobs = {};
+}
+
+/**
+ * Cleans up leftover job by invoking abort function for the provided job id
+ *
+ * @this state
+ * @param {string|number} key - job id to abort
+ */
+function clean(key)
+{
+ if (typeof this.jobs[key] == 'function')
+ {
+ this.jobs[key]();
+ }
+}
+
+
+/***/ }),
+
+/***/ 2794:
+/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
+
+var defer = __nccwpck_require__(5295);
+
+// API
+module.exports = async;
+
+/**
+ * Runs provided callback asynchronously
+ * even if callback itself is not
+ *
+ * @param {function} callback - callback to invoke
+ * @returns {function} - augmented callback
+ */
+function async(callback)
+{
+ var isAsync = false;
+
+ // check if async happened
+ defer(function() { isAsync = true; });
+
+ return function async_callback(err, result)
+ {
+ if (isAsync)
+ {
+ callback(err, result);
+ }
+ else
+ {
+ defer(function nextTick_callback()
+ {
+ callback(err, result);
+ });
+ }
+ };
+}
+
+
+/***/ }),
+
+/***/ 5295:
+/***/ ((module) => {
+
+module.exports = defer;
+
+/**
+ * Runs provided function on next iteration of the event loop
+ *
+ * @param {function} fn - function to run
+ */
+function defer(fn)
+{
+ var nextTick = typeof setImmediate == 'function'
+ ? setImmediate
+ : (
+ typeof process == 'object' && typeof process.nextTick == 'function'
+ ? process.nextTick
+ : null
+ );
+
+ if (nextTick)
+ {
+ nextTick(fn);
+ }
+ else
+ {
+ setTimeout(fn, 0);
+ }
+}
+
+
+/***/ }),
+
+/***/ 9023:
+/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
+
+var async = __nccwpck_require__(2794)
+ , abort = __nccwpck_require__(1700)
+ ;
+
+// API
+module.exports = iterate;
+
+/**
+ * Iterates over each job object
+ *
+ * @param {array|object} list - array or object (named list) to iterate over
+ * @param {function} iterator - iterator to run
+ * @param {object} state - current job status
+ * @param {function} callback - invoked when all elements processed
+ */
+function iterate(list, iterator, state, callback)
+{
+ // store current index
+ var key = state['keyedList'] ? state['keyedList'][state.index] : state.index;
+
+ state.jobs[key] = runJob(iterator, key, list[key], function(error, output)
+ {
+ // don't repeat yourself
+ // skip secondary callbacks
+ if (!(key in state.jobs))
+ {
+ return;
+ }
+
+ // clean up jobs
+ delete state.jobs[key];
+
+ if (error)
+ {
+ // don't process rest of the results
+ // stop still active jobs
+ // and reset the list
+ abort(state);
+ }
+ else
+ {
+ state.results[key] = output;
+ }
+
+ // return salvaged results
+ callback(error, state.results);
+ });
+}
+
+/**
+ * Runs iterator over provided job element
+ *
+ * @param {function} iterator - iterator to invoke
+ * @param {string|number} key - key/index of the element in the list of jobs
+ * @param {mixed} item - job description
+ * @param {function} callback - invoked after iterator is done with the job
+ * @returns {function|mixed} - job abort function or something else
+ */
+function runJob(iterator, key, item, callback)
+{
+ var aborter;
+
+ // allow shortcut if iterator expects only two arguments
+ if (iterator.length == 2)
+ {
+ aborter = iterator(item, async(callback));
+ }
+ // otherwise go with full three arguments
+ else
+ {
+ aborter = iterator(item, key, async(callback));
+ }
+
+ return aborter;
+}
+
+
+/***/ }),
+
+/***/ 2474:
+/***/ ((module) => {
+
+// API
+module.exports = state;
+
+/**
+ * Creates initial state object
+ * for iteration over list
+ *
+ * @param {array|object} list - list to iterate over
+ * @param {function|null} sortMethod - function to use for keys sort,
+ * or `null` to keep them as is
+ * @returns {object} - initial state object
+ */
+function state(list, sortMethod)
+{
+ var isNamedList = !Array.isArray(list)
+ , initState =
+ {
+ index : 0,
+ keyedList: isNamedList || sortMethod ? Object.keys(list) : null,
+ jobs : {},
+ results : isNamedList ? {} : [],
+ size : isNamedList ? Object.keys(list).length : list.length
+ }
+ ;
+
+ if (sortMethod)
+ {
+ // sort array keys based on it's values
+ // sort object's keys just on own merit
+ initState.keyedList.sort(isNamedList ? sortMethod : function(a, b)
+ {
+ return sortMethod(list[a], list[b]);
+ });
+ }
+
+ return initState;
+}
+
+
+/***/ }),
+
+/***/ 7942:
+/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
+
+var abort = __nccwpck_require__(1700)
+ , async = __nccwpck_require__(2794)
+ ;
+
+// API
+module.exports = terminator;
+
+/**
+ * Terminates jobs in the attached state context
+ *
+ * @this AsyncKitState#
+ * @param {function} callback - final callback to invoke after termination
+ */
+function terminator(callback)
+{
+ if (!Object.keys(this.jobs).length)
+ {
+ return;
+ }
+
+ // fast forward iteration index
+ this.index = this.size;
+
+ // abort jobs
+ abort(this);
+
+ // send back results we have so far
+ async(callback)(null, this.results);
+}
+
+
+/***/ }),
+
+/***/ 8210:
+/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
+
+var iterate = __nccwpck_require__(9023)
+ , initState = __nccwpck_require__(2474)
+ , terminator = __nccwpck_require__(7942)
+ ;
+
+// Public API
+module.exports = parallel;
+
+/**
+ * Runs iterator over provided array elements in parallel
+ *
+ * @param {array|object} list - array or object (named list) to iterate over
+ * @param {function} iterator - iterator to run
+ * @param {function} callback - invoked when all elements processed
+ * @returns {function} - jobs terminator
+ */
+function parallel(list, iterator, callback)
+{
+ var state = initState(list);
+
+ while (state.index < (state['keyedList'] || list).length)
+ {
+ iterate(list, iterator, state, function(error, result)
+ {
+ if (error)
+ {
+ callback(error, result);
+ return;
+ }
+
+ // looks like it's the last one
+ if (Object.keys(state.jobs).length === 0)
+ {
+ callback(null, state.results);
+ return;
+ }
+ });
+
+ state.index++;
+ }
+
+ return terminator.bind(state, callback);
+}
+
+
+/***/ }),
+
+/***/ 445:
+/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
+
+var serialOrdered = __nccwpck_require__(3578);
+
+// Public API
+module.exports = serial;
+
+/**
+ * Runs iterator over provided array elements in series
+ *
+ * @param {array|object} list - array or object (named list) to iterate over
+ * @param {function} iterator - iterator to run
+ * @param {function} callback - invoked when all elements processed
+ * @returns {function} - jobs terminator
+ */
+function serial(list, iterator, callback)
+{
+ return serialOrdered(list, iterator, null, callback);
+}
+
+
+/***/ }),
+
+/***/ 3578:
+/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
+
+var iterate = __nccwpck_require__(9023)
+ , initState = __nccwpck_require__(2474)
+ , terminator = __nccwpck_require__(7942)
+ ;
+
+// Public API
+module.exports = serialOrdered;
+// sorting helpers
+module.exports.ascending = ascending;
+module.exports.descending = descending;
+
+/**
+ * Runs iterator over provided sorted array elements in series
+ *
+ * @param {array|object} list - array or object (named list) to iterate over
+ * @param {function} iterator - iterator to run
+ * @param {function} sortMethod - custom sort function
+ * @param {function} callback - invoked when all elements processed
+ * @returns {function} - jobs terminator
+ */
+function serialOrdered(list, iterator, sortMethod, callback)
+{
+ var state = initState(list, sortMethod);
+
+ iterate(list, iterator, state, function iteratorHandler(error, result)
+ {
+ if (error)
+ {
+ callback(error, result);
+ return;
+ }
+
+ state.index++;
+
+ // are we there yet?
+ if (state.index < (state['keyedList'] || list).length)
+ {
+ iterate(list, iterator, state, iteratorHandler);
+ return;
+ }
+
+ // done here
+ callback(null, state.results);
+ });
+
+ return terminator.bind(state, callback);
+}
+
+/*
+ * -- Sort methods
+ */
+
+/**
+ * sort helper to sort array elements in ascending order
+ *
+ * @param {mixed} a - an item to compare
+ * @param {mixed} b - an item to compare
+ * @returns {number} - comparison result
+ */
+function ascending(a, b)
+{
+ return a < b ? -1 : a > b ? 1 : 0;
+}
+
+/**
+ * sort helper to sort array elements in descending order
+ *
+ * @param {mixed} a - an item to compare
+ * @param {mixed} b - an item to compare
+ * @returns {number} - comparison result
+ */
+function descending(a, b)
+{
+ return -1 * ascending(a, b);
+}
/***/ }),
@@ -5059,6 +6586,221 @@ function removeHook(state, name, method) {
}
+/***/ }),
+
+/***/ 5443:
+/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
+
+var util = __nccwpck_require__(3837);
+var Stream = (__nccwpck_require__(2781).Stream);
+var DelayedStream = __nccwpck_require__(8611);
+
+module.exports = CombinedStream;
+function CombinedStream() {
+ this.writable = false;
+ this.readable = true;
+ this.dataSize = 0;
+ this.maxDataSize = 2 * 1024 * 1024;
+ this.pauseStreams = true;
+
+ this._released = false;
+ this._streams = [];
+ this._currentStream = null;
+ this._insideLoop = false;
+ this._pendingNext = false;
+}
+util.inherits(CombinedStream, Stream);
+
+CombinedStream.create = function(options) {
+ var combinedStream = new this();
+
+ options = options || {};
+ for (var option in options) {
+ combinedStream[option] = options[option];
+ }
+
+ return combinedStream;
+};
+
+CombinedStream.isStreamLike = function(stream) {
+ return (typeof stream !== 'function')
+ && (typeof stream !== 'string')
+ && (typeof stream !== 'boolean')
+ && (typeof stream !== 'number')
+ && (!Buffer.isBuffer(stream));
+};
+
+CombinedStream.prototype.append = function(stream) {
+ var isStreamLike = CombinedStream.isStreamLike(stream);
+
+ if (isStreamLike) {
+ if (!(stream instanceof DelayedStream)) {
+ var newStream = DelayedStream.create(stream, {
+ maxDataSize: Infinity,
+ pauseStream: this.pauseStreams,
+ });
+ stream.on('data', this._checkDataSize.bind(this));
+ stream = newStream;
+ }
+
+ this._handleErrors(stream);
+
+ if (this.pauseStreams) {
+ stream.pause();
+ }
+ }
+
+ this._streams.push(stream);
+ return this;
+};
+
+CombinedStream.prototype.pipe = function(dest, options) {
+ Stream.prototype.pipe.call(this, dest, options);
+ this.resume();
+ return dest;
+};
+
+CombinedStream.prototype._getNext = function() {
+ this._currentStream = null;
+
+ if (this._insideLoop) {
+ this._pendingNext = true;
+ return; // defer call
+ }
+
+ this._insideLoop = true;
+ try {
+ do {
+ this._pendingNext = false;
+ this._realGetNext();
+ } while (this._pendingNext);
+ } finally {
+ this._insideLoop = false;
+ }
+};
+
+CombinedStream.prototype._realGetNext = function() {
+ var stream = this._streams.shift();
+
+
+ if (typeof stream == 'undefined') {
+ this.end();
+ return;
+ }
+
+ if (typeof stream !== 'function') {
+ this._pipeNext(stream);
+ return;
+ }
+
+ var getStream = stream;
+ getStream(function(stream) {
+ var isStreamLike = CombinedStream.isStreamLike(stream);
+ if (isStreamLike) {
+ stream.on('data', this._checkDataSize.bind(this));
+ this._handleErrors(stream);
+ }
+
+ this._pipeNext(stream);
+ }.bind(this));
+};
+
+CombinedStream.prototype._pipeNext = function(stream) {
+ this._currentStream = stream;
+
+ var isStreamLike = CombinedStream.isStreamLike(stream);
+ if (isStreamLike) {
+ stream.on('end', this._getNext.bind(this));
+ stream.pipe(this, {end: false});
+ return;
+ }
+
+ var value = stream;
+ this.write(value);
+ this._getNext();
+};
+
+CombinedStream.prototype._handleErrors = function(stream) {
+ var self = this;
+ stream.on('error', function(err) {
+ self._emitError(err);
+ });
+};
+
+CombinedStream.prototype.write = function(data) {
+ this.emit('data', data);
+};
+
+CombinedStream.prototype.pause = function() {
+ if (!this.pauseStreams) {
+ return;
+ }
+
+ if(this.pauseStreams && this._currentStream && typeof(this._currentStream.pause) == 'function') this._currentStream.pause();
+ this.emit('pause');
+};
+
+CombinedStream.prototype.resume = function() {
+ if (!this._released) {
+ this._released = true;
+ this.writable = true;
+ this._getNext();
+ }
+
+ if(this.pauseStreams && this._currentStream && typeof(this._currentStream.resume) == 'function') this._currentStream.resume();
+ this.emit('resume');
+};
+
+CombinedStream.prototype.end = function() {
+ this._reset();
+ this.emit('end');
+};
+
+CombinedStream.prototype.destroy = function() {
+ this._reset();
+ this.emit('close');
+};
+
+CombinedStream.prototype._reset = function() {
+ this.writable = false;
+ this._streams = [];
+ this._currentStream = null;
+};
+
+CombinedStream.prototype._checkDataSize = function() {
+ this._updateDataSize();
+ if (this.dataSize <= this.maxDataSize) {
+ return;
+ }
+
+ var message =
+ 'DelayedStream#maxDataSize of ' + this.maxDataSize + ' bytes exceeded.';
+ this._emitError(new Error(message));
+};
+
+CombinedStream.prototype._updateDataSize = function() {
+ this.dataSize = 0;
+
+ var self = this;
+ this._streams.forEach(function(stream) {
+ if (!stream.dataSize) {
+ return;
+ }
+
+ self.dataSize += stream.dataSize;
+ });
+
+ if (this._currentStream && this._currentStream.dataSize) {
+ this.dataSize += this._currentStream.dataSize;
+ }
+};
+
+CombinedStream.prototype._emitError = function(err) {
+ this._reset();
+ this.emit('error', err);
+};
+
+
/***/ }),
/***/ 8222:
@@ -5903,6 +7645,120 @@ formatters.O = function (v) {
};
+/***/ }),
+
+/***/ 8611:
+/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
+
+var Stream = (__nccwpck_require__(2781).Stream);
+var util = __nccwpck_require__(3837);
+
+module.exports = DelayedStream;
+function DelayedStream() {
+ this.source = null;
+ this.dataSize = 0;
+ this.maxDataSize = 1024 * 1024;
+ this.pauseStream = true;
+
+ this._maxDataSizeExceeded = false;
+ this._released = false;
+ this._bufferedEvents = [];
+}
+util.inherits(DelayedStream, Stream);
+
+DelayedStream.create = function(source, options) {
+ var delayedStream = new this();
+
+ options = options || {};
+ for (var option in options) {
+ delayedStream[option] = options[option];
+ }
+
+ delayedStream.source = source;
+
+ var realEmit = source.emit;
+ source.emit = function() {
+ delayedStream._handleEmit(arguments);
+ return realEmit.apply(source, arguments);
+ };
+
+ source.on('error', function() {});
+ if (delayedStream.pauseStream) {
+ source.pause();
+ }
+
+ return delayedStream;
+};
+
+Object.defineProperty(DelayedStream.prototype, 'readable', {
+ configurable: true,
+ enumerable: true,
+ get: function() {
+ return this.source.readable;
+ }
+});
+
+DelayedStream.prototype.setEncoding = function() {
+ return this.source.setEncoding.apply(this.source, arguments);
+};
+
+DelayedStream.prototype.resume = function() {
+ if (!this._released) {
+ this.release();
+ }
+
+ this.source.resume();
+};
+
+DelayedStream.prototype.pause = function() {
+ this.source.pause();
+};
+
+DelayedStream.prototype.release = function() {
+ this._released = true;
+
+ this._bufferedEvents.forEach(function(args) {
+ this.emit.apply(this, args);
+ }.bind(this));
+ this._bufferedEvents = [];
+};
+
+DelayedStream.prototype.pipe = function() {
+ var r = Stream.prototype.pipe.apply(this, arguments);
+ this.resume();
+ return r;
+};
+
+DelayedStream.prototype._handleEmit = function(args) {
+ if (this._released) {
+ this.emit.apply(this, args);
+ return;
+ }
+
+ if (args[0] === 'data') {
+ this.dataSize += args[1].length;
+ this._checkIfMaxDataSizeExceeded();
+ }
+
+ this._bufferedEvents.push(args);
+};
+
+DelayedStream.prototype._checkIfMaxDataSizeExceeded = function() {
+ if (this._maxDataSizeExceeded) {
+ return;
+ }
+
+ if (this.dataSize <= this.maxDataSize) {
+ return;
+ }
+
+ this._maxDataSizeExceeded = true;
+ var message =
+ 'DelayedStream#maxDataSize of ' + this.maxDataSize + ' bytes exceeded.'
+ this.emit('error', new Error(message));
+};
+
+
/***/ }),
/***/ 8932:
@@ -5931,6 +7787,1232 @@ class Deprecation extends Error {
exports.Deprecation = Deprecation;
+/***/ }),
+
+/***/ 1133:
+/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
+
+var debug;
+
+module.exports = function () {
+ if (!debug) {
+ try {
+ /* eslint global-require: off */
+ debug = __nccwpck_require__(8237)("follow-redirects");
+ }
+ catch (error) { /* */ }
+ if (typeof debug !== "function") {
+ debug = function () { /* */ };
+ }
+ }
+ debug.apply(null, arguments);
+};
+
+
+/***/ }),
+
+/***/ 7707:
+/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
+
+var url = __nccwpck_require__(7310);
+var URL = url.URL;
+var http = __nccwpck_require__(3685);
+var https = __nccwpck_require__(5687);
+var Writable = (__nccwpck_require__(2781).Writable);
+var assert = __nccwpck_require__(9491);
+var debug = __nccwpck_require__(1133);
+
+// Whether to use the native URL object or the legacy url module
+var useNativeURL = false;
+try {
+ assert(new URL());
+}
+catch (error) {
+ useNativeURL = error.code === "ERR_INVALID_URL";
+}
+
+// URL fields to preserve in copy operations
+var preservedUrlFields = [
+ "auth",
+ "host",
+ "hostname",
+ "href",
+ "path",
+ "pathname",
+ "port",
+ "protocol",
+ "query",
+ "search",
+ "hash",
+];
+
+// Create handlers that pass events from native requests
+var events = ["abort", "aborted", "connect", "error", "socket", "timeout"];
+var eventHandlers = Object.create(null);
+events.forEach(function (event) {
+ eventHandlers[event] = function (arg1, arg2, arg3) {
+ this._redirectable.emit(event, arg1, arg2, arg3);
+ };
+});
+
+// Error types with codes
+var InvalidUrlError = createErrorType(
+ "ERR_INVALID_URL",
+ "Invalid URL",
+ TypeError
+);
+var RedirectionError = createErrorType(
+ "ERR_FR_REDIRECTION_FAILURE",
+ "Redirected request failed"
+);
+var TooManyRedirectsError = createErrorType(
+ "ERR_FR_TOO_MANY_REDIRECTS",
+ "Maximum number of redirects exceeded",
+ RedirectionError
+);
+var MaxBodyLengthExceededError = createErrorType(
+ "ERR_FR_MAX_BODY_LENGTH_EXCEEDED",
+ "Request body larger than maxBodyLength limit"
+);
+var WriteAfterEndError = createErrorType(
+ "ERR_STREAM_WRITE_AFTER_END",
+ "write after end"
+);
+
+// istanbul ignore next
+var destroy = Writable.prototype.destroy || noop;
+
+// An HTTP(S) request that can be redirected
+function RedirectableRequest(options, responseCallback) {
+ // Initialize the request
+ Writable.call(this);
+ this._sanitizeOptions(options);
+ this._options = options;
+ this._ended = false;
+ this._ending = false;
+ this._redirectCount = 0;
+ this._redirects = [];
+ this._requestBodyLength = 0;
+ this._requestBodyBuffers = [];
+
+ // Attach a callback if passed
+ if (responseCallback) {
+ this.on("response", responseCallback);
+ }
+
+ // React to responses of native requests
+ var self = this;
+ this._onNativeResponse = function (response) {
+ try {
+ self._processResponse(response);
+ }
+ catch (cause) {
+ self.emit("error", cause instanceof RedirectionError ?
+ cause : new RedirectionError({ cause: cause }));
+ }
+ };
+
+ // Perform the first request
+ this._performRequest();
+}
+RedirectableRequest.prototype = Object.create(Writable.prototype);
+
+RedirectableRequest.prototype.abort = function () {
+ destroyRequest(this._currentRequest);
+ this._currentRequest.abort();
+ this.emit("abort");
+};
+
+RedirectableRequest.prototype.destroy = function (error) {
+ destroyRequest(this._currentRequest, error);
+ destroy.call(this, error);
+ return this;
+};
+
+// Writes buffered data to the current native request
+RedirectableRequest.prototype.write = function (data, encoding, callback) {
+ // Writing is not allowed if end has been called
+ if (this._ending) {
+ throw new WriteAfterEndError();
+ }
+
+ // Validate input and shift parameters if necessary
+ if (!isString(data) && !isBuffer(data)) {
+ throw new TypeError("data should be a string, Buffer or Uint8Array");
+ }
+ if (isFunction(encoding)) {
+ callback = encoding;
+ encoding = null;
+ }
+
+ // Ignore empty buffers, since writing them doesn't invoke the callback
+ // https://github.com/nodejs/node/issues/22066
+ if (data.length === 0) {
+ if (callback) {
+ callback();
+ }
+ return;
+ }
+ // Only write when we don't exceed the maximum body length
+ if (this._requestBodyLength + data.length <= this._options.maxBodyLength) {
+ this._requestBodyLength += data.length;
+ this._requestBodyBuffers.push({ data: data, encoding: encoding });
+ this._currentRequest.write(data, encoding, callback);
+ }
+ // Error when we exceed the maximum body length
+ else {
+ this.emit("error", new MaxBodyLengthExceededError());
+ this.abort();
+ }
+};
+
+// Ends the current native request
+RedirectableRequest.prototype.end = function (data, encoding, callback) {
+ // Shift parameters if necessary
+ if (isFunction(data)) {
+ callback = data;
+ data = encoding = null;
+ }
+ else if (isFunction(encoding)) {
+ callback = encoding;
+ encoding = null;
+ }
+
+ // Write data if needed and end
+ if (!data) {
+ this._ended = this._ending = true;
+ this._currentRequest.end(null, null, callback);
+ }
+ else {
+ var self = this;
+ var currentRequest = this._currentRequest;
+ this.write(data, encoding, function () {
+ self._ended = true;
+ currentRequest.end(null, null, callback);
+ });
+ this._ending = true;
+ }
+};
+
+// Sets a header value on the current native request
+RedirectableRequest.prototype.setHeader = function (name, value) {
+ this._options.headers[name] = value;
+ this._currentRequest.setHeader(name, value);
+};
+
+// Clears a header value on the current native request
+RedirectableRequest.prototype.removeHeader = function (name) {
+ delete this._options.headers[name];
+ this._currentRequest.removeHeader(name);
+};
+
+// Global timeout for all underlying requests
+RedirectableRequest.prototype.setTimeout = function (msecs, callback) {
+ var self = this;
+
+ // Destroys the socket on timeout
+ function destroyOnTimeout(socket) {
+ socket.setTimeout(msecs);
+ socket.removeListener("timeout", socket.destroy);
+ socket.addListener("timeout", socket.destroy);
+ }
+
+ // Sets up a timer to trigger a timeout event
+ function startTimer(socket) {
+ if (self._timeout) {
+ clearTimeout(self._timeout);
+ }
+ self._timeout = setTimeout(function () {
+ self.emit("timeout");
+ clearTimer();
+ }, msecs);
+ destroyOnTimeout(socket);
+ }
+
+ // Stops a timeout from triggering
+ function clearTimer() {
+ // Clear the timeout
+ if (self._timeout) {
+ clearTimeout(self._timeout);
+ self._timeout = null;
+ }
+
+ // Clean up all attached listeners
+ self.removeListener("abort", clearTimer);
+ self.removeListener("error", clearTimer);
+ self.removeListener("response", clearTimer);
+ self.removeListener("close", clearTimer);
+ if (callback) {
+ self.removeListener("timeout", callback);
+ }
+ if (!self.socket) {
+ self._currentRequest.removeListener("socket", startTimer);
+ }
+ }
+
+ // Attach callback if passed
+ if (callback) {
+ this.on("timeout", callback);
+ }
+
+ // Start the timer if or when the socket is opened
+ if (this.socket) {
+ startTimer(this.socket);
+ }
+ else {
+ this._currentRequest.once("socket", startTimer);
+ }
+
+ // Clean up on events
+ this.on("socket", destroyOnTimeout);
+ this.on("abort", clearTimer);
+ this.on("error", clearTimer);
+ this.on("response", clearTimer);
+ this.on("close", clearTimer);
+
+ return this;
+};
+
+// Proxy all other public ClientRequest methods
+[
+ "flushHeaders", "getHeader",
+ "setNoDelay", "setSocketKeepAlive",
+].forEach(function (method) {
+ RedirectableRequest.prototype[method] = function (a, b) {
+ return this._currentRequest[method](a, b);
+ };
+});
+
+// Proxy all public ClientRequest properties
+["aborted", "connection", "socket"].forEach(function (property) {
+ Object.defineProperty(RedirectableRequest.prototype, property, {
+ get: function () { return this._currentRequest[property]; },
+ });
+});
+
+RedirectableRequest.prototype._sanitizeOptions = function (options) {
+ // Ensure headers are always present
+ if (!options.headers) {
+ options.headers = {};
+ }
+
+ // Since http.request treats host as an alias of hostname,
+ // but the url module interprets host as hostname plus port,
+ // eliminate the host property to avoid confusion.
+ if (options.host) {
+ // Use hostname if set, because it has precedence
+ if (!options.hostname) {
+ options.hostname = options.host;
+ }
+ delete options.host;
+ }
+
+ // Complete the URL object when necessary
+ if (!options.pathname && options.path) {
+ var searchPos = options.path.indexOf("?");
+ if (searchPos < 0) {
+ options.pathname = options.path;
+ }
+ else {
+ options.pathname = options.path.substring(0, searchPos);
+ options.search = options.path.substring(searchPos);
+ }
+ }
+};
+
+
+// Executes the next native request (initial or redirect)
+RedirectableRequest.prototype._performRequest = function () {
+ // Load the native protocol
+ var protocol = this._options.protocol;
+ var nativeProtocol = this._options.nativeProtocols[protocol];
+ if (!nativeProtocol) {
+ throw new TypeError("Unsupported protocol " + protocol);
+ }
+
+ // If specified, use the agent corresponding to the protocol
+ // (HTTP and HTTPS use different types of agents)
+ if (this._options.agents) {
+ var scheme = protocol.slice(0, -1);
+ this._options.agent = this._options.agents[scheme];
+ }
+
+ // Create the native request and set up its event handlers
+ var request = this._currentRequest =
+ nativeProtocol.request(this._options, this._onNativeResponse);
+ request._redirectable = this;
+ for (var event of events) {
+ request.on(event, eventHandlers[event]);
+ }
+
+ // RFC7230§5.3.1: When making a request directly to an origin server, […]
+ // a client MUST send only the absolute path […] as the request-target.
+ this._currentUrl = /^\//.test(this._options.path) ?
+ url.format(this._options) :
+ // When making a request to a proxy, […]
+ // a client MUST send the target URI in absolute-form […].
+ this._options.path;
+
+ // End a redirected request
+ // (The first request must be ended explicitly with RedirectableRequest#end)
+ if (this._isRedirect) {
+ // Write the request entity and end
+ var i = 0;
+ var self = this;
+ var buffers = this._requestBodyBuffers;
+ (function writeNext(error) {
+ // Only write if this request has not been redirected yet
+ /* istanbul ignore else */
+ if (request === self._currentRequest) {
+ // Report any write errors
+ /* istanbul ignore if */
+ if (error) {
+ self.emit("error", error);
+ }
+ // Write the next buffer if there are still left
+ else if (i < buffers.length) {
+ var buffer = buffers[i++];
+ /* istanbul ignore else */
+ if (!request.finished) {
+ request.write(buffer.data, buffer.encoding, writeNext);
+ }
+ }
+ // End the request if `end` has been called on us
+ else if (self._ended) {
+ request.end();
+ }
+ }
+ }());
+ }
+};
+
+// Processes a response from the current native request
+RedirectableRequest.prototype._processResponse = function (response) {
+ // Store the redirected response
+ var statusCode = response.statusCode;
+ if (this._options.trackRedirects) {
+ this._redirects.push({
+ url: this._currentUrl,
+ headers: response.headers,
+ statusCode: statusCode,
+ });
+ }
+
+ // RFC7231§6.4: The 3xx (Redirection) class of status code indicates
+ // that further action needs to be taken by the user agent in order to
+ // fulfill the request. If a Location header field is provided,
+ // the user agent MAY automatically redirect its request to the URI
+ // referenced by the Location field value,
+ // even if the specific status code is not understood.
+
+ // If the response is not a redirect; return it as-is
+ var location = response.headers.location;
+ if (!location || this._options.followRedirects === false ||
+ statusCode < 300 || statusCode >= 400) {
+ response.responseUrl = this._currentUrl;
+ response.redirects = this._redirects;
+ this.emit("response", response);
+
+ // Clean up
+ this._requestBodyBuffers = [];
+ return;
+ }
+
+ // The response is a redirect, so abort the current request
+ destroyRequest(this._currentRequest);
+ // Discard the remainder of the response to avoid waiting for data
+ response.destroy();
+
+ // RFC7231§6.4: A client SHOULD detect and intervene
+ // in cyclical redirections (i.e., "infinite" redirection loops).
+ if (++this._redirectCount > this._options.maxRedirects) {
+ throw new TooManyRedirectsError();
+ }
+
+ // Store the request headers if applicable
+ var requestHeaders;
+ var beforeRedirect = this._options.beforeRedirect;
+ if (beforeRedirect) {
+ requestHeaders = Object.assign({
+ // The Host header was set by nativeProtocol.request
+ Host: response.req.getHeader("host"),
+ }, this._options.headers);
+ }
+
+ // RFC7231§6.4: Automatic redirection needs to done with
+ // care for methods not known to be safe, […]
+ // RFC7231§6.4.2–3: For historical reasons, a user agent MAY change
+ // the request method from POST to GET for the subsequent request.
+ var method = this._options.method;
+ if ((statusCode === 301 || statusCode === 302) && this._options.method === "POST" ||
+ // RFC7231§6.4.4: The 303 (See Other) status code indicates that
+ // the server is redirecting the user agent to a different resource […]
+ // A user agent can perform a retrieval request targeting that URI
+ // (a GET or HEAD request if using HTTP) […]
+ (statusCode === 303) && !/^(?:GET|HEAD)$/.test(this._options.method)) {
+ this._options.method = "GET";
+ // Drop a possible entity and headers related to it
+ this._requestBodyBuffers = [];
+ removeMatchingHeaders(/^content-/i, this._options.headers);
+ }
+
+ // Drop the Host header, as the redirect might lead to a different host
+ var currentHostHeader = removeMatchingHeaders(/^host$/i, this._options.headers);
+
+ // If the redirect is relative, carry over the host of the last request
+ var currentUrlParts = parseUrl(this._currentUrl);
+ var currentHost = currentHostHeader || currentUrlParts.host;
+ var currentUrl = /^\w+:/.test(location) ? this._currentUrl :
+ url.format(Object.assign(currentUrlParts, { host: currentHost }));
+
+ // Create the redirected request
+ var redirectUrl = resolveUrl(location, currentUrl);
+ debug("redirecting to", redirectUrl.href);
+ this._isRedirect = true;
+ spreadUrlObject(redirectUrl, this._options);
+
+ // Drop confidential headers when redirecting to a less secure protocol
+ // or to a different domain that is not a superdomain
+ if (redirectUrl.protocol !== currentUrlParts.protocol &&
+ redirectUrl.protocol !== "https:" ||
+ redirectUrl.host !== currentHost &&
+ !isSubdomain(redirectUrl.host, currentHost)) {
+ removeMatchingHeaders(/^(?:(?:proxy-)?authorization|cookie)$/i, this._options.headers);
+ }
+
+ // Evaluate the beforeRedirect callback
+ if (isFunction(beforeRedirect)) {
+ var responseDetails = {
+ headers: response.headers,
+ statusCode: statusCode,
+ };
+ var requestDetails = {
+ url: currentUrl,
+ method: method,
+ headers: requestHeaders,
+ };
+ beforeRedirect(this._options, responseDetails, requestDetails);
+ this._sanitizeOptions(this._options);
+ }
+
+ // Perform the redirected request
+ this._performRequest();
+};
+
+// Wraps the key/value object of protocols with redirect functionality
+function wrap(protocols) {
+ // Default settings
+ var exports = {
+ maxRedirects: 21,
+ maxBodyLength: 10 * 1024 * 1024,
+ };
+
+ // Wrap each protocol
+ var nativeProtocols = {};
+ Object.keys(protocols).forEach(function (scheme) {
+ var protocol = scheme + ":";
+ var nativeProtocol = nativeProtocols[protocol] = protocols[scheme];
+ var wrappedProtocol = exports[scheme] = Object.create(nativeProtocol);
+
+ // Executes a request, following redirects
+ function request(input, options, callback) {
+ // Parse parameters, ensuring that input is an object
+ if (isURL(input)) {
+ input = spreadUrlObject(input);
+ }
+ else if (isString(input)) {
+ input = spreadUrlObject(parseUrl(input));
+ }
+ else {
+ callback = options;
+ options = validateUrl(input);
+ input = { protocol: protocol };
+ }
+ if (isFunction(options)) {
+ callback = options;
+ options = null;
+ }
+
+ // Set defaults
+ options = Object.assign({
+ maxRedirects: exports.maxRedirects,
+ maxBodyLength: exports.maxBodyLength,
+ }, input, options);
+ options.nativeProtocols = nativeProtocols;
+ if (!isString(options.host) && !isString(options.hostname)) {
+ options.hostname = "::1";
+ }
+
+ assert.equal(options.protocol, protocol, "protocol mismatch");
+ debug("options", options);
+ return new RedirectableRequest(options, callback);
+ }
+
+ // Executes a GET request, following redirects
+ function get(input, options, callback) {
+ var wrappedRequest = wrappedProtocol.request(input, options, callback);
+ wrappedRequest.end();
+ return wrappedRequest;
+ }
+
+ // Expose the properties on the wrapped protocol
+ Object.defineProperties(wrappedProtocol, {
+ request: { value: request, configurable: true, enumerable: true, writable: true },
+ get: { value: get, configurable: true, enumerable: true, writable: true },
+ });
+ });
+ return exports;
+}
+
+function noop() { /* empty */ }
+
+function parseUrl(input) {
+ var parsed;
+ /* istanbul ignore else */
+ if (useNativeURL) {
+ parsed = new URL(input);
+ }
+ else {
+ // Ensure the URL is valid and absolute
+ parsed = validateUrl(url.parse(input));
+ if (!isString(parsed.protocol)) {
+ throw new InvalidUrlError({ input });
+ }
+ }
+ return parsed;
+}
+
+function resolveUrl(relative, base) {
+ /* istanbul ignore next */
+ return useNativeURL ? new URL(relative, base) : parseUrl(url.resolve(base, relative));
+}
+
+function validateUrl(input) {
+ if (/^\[/.test(input.hostname) && !/^\[[:0-9a-f]+\]$/i.test(input.hostname)) {
+ throw new InvalidUrlError({ input: input.href || input });
+ }
+ if (/^\[/.test(input.host) && !/^\[[:0-9a-f]+\](:\d+)?$/i.test(input.host)) {
+ throw new InvalidUrlError({ input: input.href || input });
+ }
+ return input;
+}
+
+function spreadUrlObject(urlObject, target) {
+ var spread = target || {};
+ for (var key of preservedUrlFields) {
+ spread[key] = urlObject[key];
+ }
+
+ // Fix IPv6 hostname
+ if (spread.hostname.startsWith("[")) {
+ spread.hostname = spread.hostname.slice(1, -1);
+ }
+ // Ensure port is a number
+ if (spread.port !== "") {
+ spread.port = Number(spread.port);
+ }
+ // Concatenate path
+ spread.path = spread.search ? spread.pathname + spread.search : spread.pathname;
+
+ return spread;
+}
+
+function removeMatchingHeaders(regex, headers) {
+ var lastValue;
+ for (var header in headers) {
+ if (regex.test(header)) {
+ lastValue = headers[header];
+ delete headers[header];
+ }
+ }
+ return (lastValue === null || typeof lastValue === "undefined") ?
+ undefined : String(lastValue).trim();
+}
+
+function createErrorType(code, message, baseClass) {
+ // Create constructor
+ function CustomError(properties) {
+ Error.captureStackTrace(this, this.constructor);
+ Object.assign(this, properties || {});
+ this.code = code;
+ this.message = this.cause ? message + ": " + this.cause.message : message;
+ }
+
+ // Attach constructor and set default properties
+ CustomError.prototype = new (baseClass || Error)();
+ Object.defineProperties(CustomError.prototype, {
+ constructor: {
+ value: CustomError,
+ enumerable: false,
+ },
+ name: {
+ value: "Error [" + code + "]",
+ enumerable: false,
+ },
+ });
+ return CustomError;
+}
+
+function destroyRequest(request, error) {
+ for (var event of events) {
+ request.removeListener(event, eventHandlers[event]);
+ }
+ request.on("error", noop);
+ request.destroy(error);
+}
+
+function isSubdomain(subdomain, domain) {
+ assert(isString(subdomain) && isString(domain));
+ var dot = subdomain.length - domain.length - 1;
+ return dot > 0 && subdomain[dot] === "." && subdomain.endsWith(domain);
+}
+
+function isString(value) {
+ return typeof value === "string" || value instanceof String;
+}
+
+function isFunction(value) {
+ return typeof value === "function";
+}
+
+function isBuffer(value) {
+ return typeof value === "object" && ("length" in value);
+}
+
+function isURL(value) {
+ return URL && value instanceof URL;
+}
+
+// Exports
+module.exports = wrap({ http: http, https: https });
+module.exports.wrap = wrap;
+
+
+/***/ }),
+
+/***/ 4334:
+/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
+
+var CombinedStream = __nccwpck_require__(5443);
+var util = __nccwpck_require__(3837);
+var path = __nccwpck_require__(1017);
+var http = __nccwpck_require__(3685);
+var https = __nccwpck_require__(5687);
+var parseUrl = (__nccwpck_require__(7310).parse);
+var fs = __nccwpck_require__(7147);
+var Stream = (__nccwpck_require__(2781).Stream);
+var mime = __nccwpck_require__(3583);
+var asynckit = __nccwpck_require__(4812);
+var populate = __nccwpck_require__(7142);
+
+// Public API
+module.exports = FormData;
+
+// make it a Stream
+util.inherits(FormData, CombinedStream);
+
+/**
+ * Create readable "multipart/form-data" streams.
+ * Can be used to submit forms
+ * and file uploads to other web applications.
+ *
+ * @constructor
+ * @param {Object} options - Properties to be added/overriden for FormData and CombinedStream
+ */
+function FormData(options) {
+ if (!(this instanceof FormData)) {
+ return new FormData(options);
+ }
+
+ this._overheadLength = 0;
+ this._valueLength = 0;
+ this._valuesToMeasure = [];
+
+ CombinedStream.call(this);
+
+ options = options || {};
+ for (var option in options) {
+ this[option] = options[option];
+ }
+}
+
+FormData.LINE_BREAK = '\r\n';
+FormData.DEFAULT_CONTENT_TYPE = 'application/octet-stream';
+
+FormData.prototype.append = function(field, value, options) {
+
+ options = options || {};
+
+ // allow filename as single option
+ if (typeof options == 'string') {
+ options = {filename: options};
+ }
+
+ var append = CombinedStream.prototype.append.bind(this);
+
+ // all that streamy business can't handle numbers
+ if (typeof value == 'number') {
+ value = '' + value;
+ }
+
+ // https://github.com/felixge/node-form-data/issues/38
+ if (util.isArray(value)) {
+ // Please convert your array into string
+ // the way web server expects it
+ this._error(new Error('Arrays are not supported.'));
+ return;
+ }
+
+ var header = this._multiPartHeader(field, value, options);
+ var footer = this._multiPartFooter();
+
+ append(header);
+ append(value);
+ append(footer);
+
+ // pass along options.knownLength
+ this._trackLength(header, value, options);
+};
+
+FormData.prototype._trackLength = function(header, value, options) {
+ var valueLength = 0;
+
+ // used w/ getLengthSync(), when length is known.
+ // e.g. for streaming directly from a remote server,
+ // w/ a known file a size, and not wanting to wait for
+ // incoming file to finish to get its size.
+ if (options.knownLength != null) {
+ valueLength += +options.knownLength;
+ } else if (Buffer.isBuffer(value)) {
+ valueLength = value.length;
+ } else if (typeof value === 'string') {
+ valueLength = Buffer.byteLength(value);
+ }
+
+ this._valueLength += valueLength;
+
+ // @check why add CRLF? does this account for custom/multiple CRLFs?
+ this._overheadLength +=
+ Buffer.byteLength(header) +
+ FormData.LINE_BREAK.length;
+
+ // empty or either doesn't have path or not an http response or not a stream
+ if (!value || ( !value.path && !(value.readable && value.hasOwnProperty('httpVersion')) && !(value instanceof Stream))) {
+ return;
+ }
+
+ // no need to bother with the length
+ if (!options.knownLength) {
+ this._valuesToMeasure.push(value);
+ }
+};
+
+FormData.prototype._lengthRetriever = function(value, callback) {
+
+ if (value.hasOwnProperty('fd')) {
+
+ // take read range into a account
+ // `end` = Infinity –> read file till the end
+ //
+ // TODO: Looks like there is bug in Node fs.createReadStream
+ // it doesn't respect `end` options without `start` options
+ // Fix it when node fixes it.
+ // https://github.com/joyent/node/issues/7819
+ if (value.end != undefined && value.end != Infinity && value.start != undefined) {
+
+ // when end specified
+ // no need to calculate range
+ // inclusive, starts with 0
+ callback(null, value.end + 1 - (value.start ? value.start : 0));
+
+ // not that fast snoopy
+ } else {
+ // still need to fetch file size from fs
+ fs.stat(value.path, function(err, stat) {
+
+ var fileSize;
+
+ if (err) {
+ callback(err);
+ return;
+ }
+
+ // update final size based on the range options
+ fileSize = stat.size - (value.start ? value.start : 0);
+ callback(null, fileSize);
+ });
+ }
+
+ // or http response
+ } else if (value.hasOwnProperty('httpVersion')) {
+ callback(null, +value.headers['content-length']);
+
+ // or request stream http://github.com/mikeal/request
+ } else if (value.hasOwnProperty('httpModule')) {
+ // wait till response come back
+ value.on('response', function(response) {
+ value.pause();
+ callback(null, +response.headers['content-length']);
+ });
+ value.resume();
+
+ // something else
+ } else {
+ callback('Unknown stream');
+ }
+};
+
+FormData.prototype._multiPartHeader = function(field, value, options) {
+ // custom header specified (as string)?
+ // it becomes responsible for boundary
+ // (e.g. to handle extra CRLFs on .NET servers)
+ if (typeof options.header == 'string') {
+ return options.header;
+ }
+
+ var contentDisposition = this._getContentDisposition(value, options);
+ var contentType = this._getContentType(value, options);
+
+ var contents = '';
+ var headers = {
+ // add custom disposition as third element or keep it two elements if not
+ 'Content-Disposition': ['form-data', 'name="' + field + '"'].concat(contentDisposition || []),
+ // if no content type. allow it to be empty array
+ 'Content-Type': [].concat(contentType || [])
+ };
+
+ // allow custom headers.
+ if (typeof options.header == 'object') {
+ populate(headers, options.header);
+ }
+
+ var header;
+ for (var prop in headers) {
+ if (!headers.hasOwnProperty(prop)) continue;
+ header = headers[prop];
+
+ // skip nullish headers.
+ if (header == null) {
+ continue;
+ }
+
+ // convert all headers to arrays.
+ if (!Array.isArray(header)) {
+ header = [header];
+ }
+
+ // add non-empty headers.
+ if (header.length) {
+ contents += prop + ': ' + header.join('; ') + FormData.LINE_BREAK;
+ }
+ }
+
+ return '--' + this.getBoundary() + FormData.LINE_BREAK + contents + FormData.LINE_BREAK;
+};
+
+FormData.prototype._getContentDisposition = function(value, options) {
+
+ var filename
+ , contentDisposition
+ ;
+
+ if (typeof options.filepath === 'string') {
+ // custom filepath for relative paths
+ filename = path.normalize(options.filepath).replace(/\\/g, '/');
+ } else if (options.filename || value.name || value.path) {
+ // custom filename take precedence
+ // formidable and the browser add a name property
+ // fs- and request- streams have path property
+ filename = path.basename(options.filename || value.name || value.path);
+ } else if (value.readable && value.hasOwnProperty('httpVersion')) {
+ // or try http response
+ filename = path.basename(value.client._httpMessage.path || '');
+ }
+
+ if (filename) {
+ contentDisposition = 'filename="' + filename + '"';
+ }
+
+ return contentDisposition;
+};
+
+FormData.prototype._getContentType = function(value, options) {
+
+ // use custom content-type above all
+ var contentType = options.contentType;
+
+ // or try `name` from formidable, browser
+ if (!contentType && value.name) {
+ contentType = mime.lookup(value.name);
+ }
+
+ // or try `path` from fs-, request- streams
+ if (!contentType && value.path) {
+ contentType = mime.lookup(value.path);
+ }
+
+ // or if it's http-reponse
+ if (!contentType && value.readable && value.hasOwnProperty('httpVersion')) {
+ contentType = value.headers['content-type'];
+ }
+
+ // or guess it from the filepath or filename
+ if (!contentType && (options.filepath || options.filename)) {
+ contentType = mime.lookup(options.filepath || options.filename);
+ }
+
+ // fallback to the default content type if `value` is not simple value
+ if (!contentType && typeof value == 'object') {
+ contentType = FormData.DEFAULT_CONTENT_TYPE;
+ }
+
+ return contentType;
+};
+
+FormData.prototype._multiPartFooter = function() {
+ return function(next) {
+ var footer = FormData.LINE_BREAK;
+
+ var lastPart = (this._streams.length === 0);
+ if (lastPart) {
+ footer += this._lastBoundary();
+ }
+
+ next(footer);
+ }.bind(this);
+};
+
+FormData.prototype._lastBoundary = function() {
+ return '--' + this.getBoundary() + '--' + FormData.LINE_BREAK;
+};
+
+FormData.prototype.getHeaders = function(userHeaders) {
+ var header;
+ var formHeaders = {
+ 'content-type': 'multipart/form-data; boundary=' + this.getBoundary()
+ };
+
+ for (header in userHeaders) {
+ if (userHeaders.hasOwnProperty(header)) {
+ formHeaders[header.toLowerCase()] = userHeaders[header];
+ }
+ }
+
+ return formHeaders;
+};
+
+FormData.prototype.setBoundary = function(boundary) {
+ this._boundary = boundary;
+};
+
+FormData.prototype.getBoundary = function() {
+ if (!this._boundary) {
+ this._generateBoundary();
+ }
+
+ return this._boundary;
+};
+
+FormData.prototype.getBuffer = function() {
+ var dataBuffer = new Buffer.alloc( 0 );
+ var boundary = this.getBoundary();
+
+ // Create the form content. Add Line breaks to the end of data.
+ for (var i = 0, len = this._streams.length; i < len; i++) {
+ if (typeof this._streams[i] !== 'function') {
+
+ // Add content to the buffer.
+ if(Buffer.isBuffer(this._streams[i])) {
+ dataBuffer = Buffer.concat( [dataBuffer, this._streams[i]]);
+ }else {
+ dataBuffer = Buffer.concat( [dataBuffer, Buffer.from(this._streams[i])]);
+ }
+
+ // Add break after content.
+ if (typeof this._streams[i] !== 'string' || this._streams[i].substring( 2, boundary.length + 2 ) !== boundary) {
+ dataBuffer = Buffer.concat( [dataBuffer, Buffer.from(FormData.LINE_BREAK)] );
+ }
+ }
+ }
+
+ // Add the footer and return the Buffer object.
+ return Buffer.concat( [dataBuffer, Buffer.from(this._lastBoundary())] );
+};
+
+FormData.prototype._generateBoundary = function() {
+ // This generates a 50 character boundary similar to those used by Firefox.
+ // They are optimized for boyer-moore parsing.
+ var boundary = '--------------------------';
+ for (var i = 0; i < 24; i++) {
+ boundary += Math.floor(Math.random() * 10).toString(16);
+ }
+
+ this._boundary = boundary;
+};
+
+// Note: getLengthSync DOESN'T calculate streams length
+// As workaround one can calculate file size manually
+// and add it as knownLength option
+FormData.prototype.getLengthSync = function() {
+ var knownLength = this._overheadLength + this._valueLength;
+
+ // Don't get confused, there are 3 "internal" streams for each keyval pair
+ // so it basically checks if there is any value added to the form
+ if (this._streams.length) {
+ knownLength += this._lastBoundary().length;
+ }
+
+ // https://github.com/form-data/form-data/issues/40
+ if (!this.hasKnownLength()) {
+ // Some async length retrievers are present
+ // therefore synchronous length calculation is false.
+ // Please use getLength(callback) to get proper length
+ this._error(new Error('Cannot calculate proper length in synchronous way.'));
+ }
+
+ return knownLength;
+};
+
+// Public API to check if length of added values is known
+// https://github.com/form-data/form-data/issues/196
+// https://github.com/form-data/form-data/issues/262
+FormData.prototype.hasKnownLength = function() {
+ var hasKnownLength = true;
+
+ if (this._valuesToMeasure.length) {
+ hasKnownLength = false;
+ }
+
+ return hasKnownLength;
+};
+
+FormData.prototype.getLength = function(cb) {
+ var knownLength = this._overheadLength + this._valueLength;
+
+ if (this._streams.length) {
+ knownLength += this._lastBoundary().length;
+ }
+
+ if (!this._valuesToMeasure.length) {
+ process.nextTick(cb.bind(this, null, knownLength));
+ return;
+ }
+
+ asynckit.parallel(this._valuesToMeasure, this._lengthRetriever, function(err, values) {
+ if (err) {
+ cb(err);
+ return;
+ }
+
+ values.forEach(function(length) {
+ knownLength += length;
+ });
+
+ cb(null, knownLength);
+ });
+};
+
+FormData.prototype.submit = function(params, cb) {
+ var request
+ , options
+ , defaults = {method: 'post'}
+ ;
+
+ // parse provided url if it's string
+ // or treat it as options object
+ if (typeof params == 'string') {
+
+ params = parseUrl(params);
+ options = populate({
+ port: params.port,
+ path: params.pathname,
+ host: params.hostname,
+ protocol: params.protocol
+ }, defaults);
+
+ // use custom params
+ } else {
+
+ options = populate(params, defaults);
+ // if no port provided use default one
+ if (!options.port) {
+ options.port = options.protocol == 'https:' ? 443 : 80;
+ }
+ }
+
+ // put that good code in getHeaders to some use
+ options.headers = this.getHeaders(params.headers);
+
+ // https if specified, fallback to http in any other case
+ if (options.protocol == 'https:') {
+ request = https.request(options);
+ } else {
+ request = http.request(options);
+ }
+
+ // get content length and fire away
+ this.getLength(function(err, length) {
+ if (err && err !== 'Unknown stream') {
+ this._error(err);
+ return;
+ }
+
+ // add content length
+ if (length) {
+ request.setHeader('Content-Length', length);
+ }
+
+ this.pipe(request);
+ if (cb) {
+ var onResponse;
+
+ var callback = function (error, responce) {
+ request.removeListener('error', callback);
+ request.removeListener('response', onResponse);
+
+ return cb.call(this, error, responce);
+ };
+
+ onResponse = callback.bind(this, null);
+
+ request.on('error', callback);
+ request.on('response', onResponse);
+ }
+ }.bind(this));
+
+ return request;
+};
+
+FormData.prototype._error = function(err) {
+ if (!this.error) {
+ this.error = err;
+ this.pause();
+ this.emit('error', err);
+ }
+};
+
+FormData.prototype.toString = function () {
+ return '[object FormData]';
+};
+
+
+/***/ }),
+
+/***/ 7142:
+/***/ ((module) => {
+
+// populates missing values
+module.exports = function(dst, src) {
+
+ Object.keys(src).forEach(function(prop)
+ {
+ dst[prop] = dst[prop] || src[prop];
+ });
+
+ return dst;
+};
+
+
/***/ }),
/***/ 1621:
@@ -5993,6 +9075,221 @@ function isPlainObject(o) {
exports.isPlainObject = isPlainObject;
+/***/ }),
+
+/***/ 7426:
+/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
+
+/*!
+ * mime-db
+ * Copyright(c) 2014 Jonathan Ong
+ * Copyright(c) 2015-2022 Douglas Christopher Wilson
+ * MIT Licensed
+ */
+
+/**
+ * Module exports.
+ */
+
+module.exports = __nccwpck_require__(3765)
+
+
+/***/ }),
+
+/***/ 3583:
+/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
+
+"use strict";
+/*!
+ * mime-types
+ * Copyright(c) 2014 Jonathan Ong
+ * Copyright(c) 2015 Douglas Christopher Wilson
+ * MIT Licensed
+ */
+
+
+
+/**
+ * Module dependencies.
+ * @private
+ */
+
+var db = __nccwpck_require__(7426)
+var extname = (__nccwpck_require__(1017).extname)
+
+/**
+ * Module variables.
+ * @private
+ */
+
+var EXTRACT_TYPE_REGEXP = /^\s*([^;\s]*)(?:;|\s|$)/
+var TEXT_TYPE_REGEXP = /^text\//i
+
+/**
+ * Module exports.
+ * @public
+ */
+
+exports.charset = charset
+exports.charsets = { lookup: charset }
+exports.contentType = contentType
+exports.extension = extension
+exports.extensions = Object.create(null)
+exports.lookup = lookup
+exports.types = Object.create(null)
+
+// Populate the extensions/types maps
+populateMaps(exports.extensions, exports.types)
+
+/**
+ * Get the default charset for a MIME type.
+ *
+ * @param {string} type
+ * @return {boolean|string}
+ */
+
+function charset (type) {
+ if (!type || typeof type !== 'string') {
+ return false
+ }
+
+ // TODO: use media-typer
+ var match = EXTRACT_TYPE_REGEXP.exec(type)
+ var mime = match && db[match[1].toLowerCase()]
+
+ if (mime && mime.charset) {
+ return mime.charset
+ }
+
+ // default text/* to utf-8
+ if (match && TEXT_TYPE_REGEXP.test(match[1])) {
+ return 'UTF-8'
+ }
+
+ return false
+}
+
+/**
+ * Create a full Content-Type header given a MIME type or extension.
+ *
+ * @param {string} str
+ * @return {boolean|string}
+ */
+
+function contentType (str) {
+ // TODO: should this even be in this module?
+ if (!str || typeof str !== 'string') {
+ return false
+ }
+
+ var mime = str.indexOf('/') === -1
+ ? exports.lookup(str)
+ : str
+
+ if (!mime) {
+ return false
+ }
+
+ // TODO: use content-type or other module
+ if (mime.indexOf('charset') === -1) {
+ var charset = exports.charset(mime)
+ if (charset) mime += '; charset=' + charset.toLowerCase()
+ }
+
+ return mime
+}
+
+/**
+ * Get the default extension for a MIME type.
+ *
+ * @param {string} type
+ * @return {boolean|string}
+ */
+
+function extension (type) {
+ if (!type || typeof type !== 'string') {
+ return false
+ }
+
+ // TODO: use media-typer
+ var match = EXTRACT_TYPE_REGEXP.exec(type)
+
+ // get extensions
+ var exts = match && exports.extensions[match[1].toLowerCase()]
+
+ if (!exts || !exts.length) {
+ return false
+ }
+
+ return exts[0]
+}
+
+/**
+ * Lookup the MIME type for a file path/extension.
+ *
+ * @param {string} path
+ * @return {boolean|string}
+ */
+
+function lookup (path) {
+ if (!path || typeof path !== 'string') {
+ return false
+ }
+
+ // get the extension ("ext" or ".ext" or full path)
+ var extension = extname('x.' + path)
+ .toLowerCase()
+ .substr(1)
+
+ if (!extension) {
+ return false
+ }
+
+ return exports.types[extension] || false
+}
+
+/**
+ * Populate the extensions and types maps.
+ * @private
+ */
+
+function populateMaps (extensions, types) {
+ // source preference (least -> most)
+ var preference = ['nginx', 'apache', undefined, 'iana']
+
+ Object.keys(db).forEach(function forEachMimeType (type) {
+ var mime = db[type]
+ var exts = mime.extensions
+
+ if (!exts || !exts.length) {
+ return
+ }
+
+ // mime -> extensions
+ extensions[type] = exts
+
+ // extension -> mime
+ for (var i = 0; i < exts.length; i++) {
+ var extension = exts[i]
+
+ if (types[extension]) {
+ var from = preference.indexOf(db[types[extension]].source)
+ var to = preference.indexOf(mime.source)
+
+ if (types[extension] !== 'application/octet-stream' &&
+ (from > to || (from === to && types[extension].substr(0, 12) === 'application/'))) {
+ // skip the remapping
+ continue
+ }
+ }
+
+ // set the extension -> mime
+ types[extension] = type
+ }
+ })
+}
+
+
/***/ }),
/***/ 900:
@@ -7916,6 +11213,122 @@ function onceStrict (fn) {
}
+/***/ }),
+
+/***/ 3329:
+/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => {
+
+"use strict";
+
+
+var parseUrl = (__nccwpck_require__(7310).parse);
+
+var DEFAULT_PORTS = {
+ ftp: 21,
+ gopher: 70,
+ http: 80,
+ https: 443,
+ ws: 80,
+ wss: 443,
+};
+
+var stringEndsWith = String.prototype.endsWith || function(s) {
+ return s.length <= this.length &&
+ this.indexOf(s, this.length - s.length) !== -1;
+};
+
+/**
+ * @param {string|object} url - The URL, or the result from url.parse.
+ * @return {string} The URL of the proxy that should handle the request to the
+ * given URL. If no proxy is set, this will be an empty string.
+ */
+function getProxyForUrl(url) {
+ var parsedUrl = typeof url === 'string' ? parseUrl(url) : url || {};
+ var proto = parsedUrl.protocol;
+ var hostname = parsedUrl.host;
+ var port = parsedUrl.port;
+ if (typeof hostname !== 'string' || !hostname || typeof proto !== 'string') {
+ return ''; // Don't proxy URLs without a valid scheme or host.
+ }
+
+ proto = proto.split(':', 1)[0];
+ // Stripping ports in this way instead of using parsedUrl.hostname to make
+ // sure that the brackets around IPv6 addresses are kept.
+ hostname = hostname.replace(/:\d*$/, '');
+ port = parseInt(port) || DEFAULT_PORTS[proto] || 0;
+ if (!shouldProxy(hostname, port)) {
+ return ''; // Don't proxy URLs that match NO_PROXY.
+ }
+
+ var proxy =
+ getEnv('npm_config_' + proto + '_proxy') ||
+ getEnv(proto + '_proxy') ||
+ getEnv('npm_config_proxy') ||
+ getEnv('all_proxy');
+ if (proxy && proxy.indexOf('://') === -1) {
+ // Missing scheme in proxy, default to the requested URL's scheme.
+ proxy = proto + '://' + proxy;
+ }
+ return proxy;
+}
+
+/**
+ * Determines whether a given URL should be proxied.
+ *
+ * @param {string} hostname - The host name of the URL.
+ * @param {number} port - The effective port of the URL.
+ * @returns {boolean} Whether the given URL should be proxied.
+ * @private
+ */
+function shouldProxy(hostname, port) {
+ var NO_PROXY =
+ (getEnv('npm_config_no_proxy') || getEnv('no_proxy')).toLowerCase();
+ if (!NO_PROXY) {
+ return true; // Always proxy if NO_PROXY is not set.
+ }
+ if (NO_PROXY === '*') {
+ return false; // Never proxy if wildcard is set.
+ }
+
+ return NO_PROXY.split(/[,\s]/).every(function(proxy) {
+ if (!proxy) {
+ return true; // Skip zero-length hosts.
+ }
+ var parsedProxy = proxy.match(/^(.+):(\d+)$/);
+ var parsedProxyHostname = parsedProxy ? parsedProxy[1] : proxy;
+ var parsedProxyPort = parsedProxy ? parseInt(parsedProxy[2]) : 0;
+ if (parsedProxyPort && parsedProxyPort !== port) {
+ return true; // Skip if ports don't match.
+ }
+
+ if (!/^[.*]/.test(parsedProxyHostname)) {
+ // No wildcards, so stop proxying if there is an exact match.
+ return hostname !== parsedProxyHostname;
+ }
+
+ if (parsedProxyHostname.charAt(0) === '*') {
+ // Remove leading wildcard.
+ parsedProxyHostname = parsedProxyHostname.slice(1);
+ }
+ // Stop proxying if the hostname ends with the no_proxy host.
+ return !stringEndsWith.call(hostname, parsedProxyHostname);
+ });
+}
+
+/**
+ * Get the value for an environment variable.
+ *
+ * @param {string} key - The name of the environment variable.
+ * @return {string} The value of the environment variable.
+ * @private
+ */
+function getEnv(key) {
+ return process.env[key.toLowerCase()] || process.env[key.toUpperCase()] || '';
+}
+
+exports.getProxyForUrl = getProxyForUrl;
+
+
/***/ }),
/***/ 9103:
@@ -7966,9 +11379,9 @@ var __reExport = (target, module2, copyDefault, desc) => {
var __toESM = (module2, isNodeMode) => {
return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", !isNodeMode && module2 && module2.__esModule ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
};
-var __toCommonJS = /* @__PURE__ */ ((cache) => {
+var __toCommonJS = /* @__PURE__ */ ((cache2) => {
return (module2, temp) => {
- return cache && cache.get(module2) || (temp = __reExport(__markAsModule({}), module2, 1), cache && cache.set(module2, temp), temp);
+ return cache2 && cache2.get(module2) || (temp = __reExport(__markAsModule({}), module2, 1), cache2 && cache2.set(module2, temp), temp);
};
})(typeof WeakMap !== "undefined" ? /* @__PURE__ */ new WeakMap() : 0);
var __async = (__this, __arguments, generator) => {
@@ -8020,6 +11433,25 @@ var init_git_response_error = __esm({
}
});
+// src/lib/args/pathspec.ts
+function pathspec(...paths) {
+ const key = new String(paths);
+ cache.set(key, paths);
+ return key;
+}
+function isPathSpec(path) {
+ return path instanceof String && cache.has(path);
+}
+function toPaths(pathSpec) {
+ return cache.get(pathSpec) || [];
+}
+var cache;
+var init_pathspec = __esm({
+ "src/lib/args/pathspec.ts"() {
+ cache = /* @__PURE__ */ new WeakMap();
+ }
+});
+
// src/lib/errors/git-construct-error.ts
var GitConstructError;
var init_git_construct_error = __esm({
@@ -8178,7 +11610,8 @@ function filterType(input, filter, def) {
return arguments.length > 2 ? def : void 0;
}
function filterPrimitives(input, omit) {
- return /number|string|boolean/.test(typeof input) && (!omit || !omit.includes(typeof input));
+ const type = isPathSpec(input) ? "string" : typeof input;
+ return /number|string|boolean/.test(type) && (!omit || !omit.includes(type));
}
function filterPlainObject(input) {
return !!input && objectToString(input) === "[object Object]";
@@ -8190,6 +11623,7 @@ var filterArray, filterString, filterStringArray, filterStringOrStringArray, fil
var init_argument_filters = __esm({
"src/lib/utils/argument-filters.ts"() {
init_util();
+ init_pathspec();
filterArray = (input) => {
return Array.isArray(input);
};
@@ -8320,7 +11754,9 @@ function appendTaskOptions(options, commands = []) {
}
return Object.keys(options).reduce((commands2, key) => {
const value = options[key];
- if (filterPrimitives(value, ["boolean"])) {
+ if (isPathSpec(value)) {
+ commands2.push(value);
+ } else if (filterPrimitives(value, ["boolean"])) {
commands2.push(key + "=" + value);
} else {
commands2.push(key);
@@ -8357,6 +11793,7 @@ var init_task_options = __esm({
"src/lib/utils/task-options.ts"() {
init_argument_filters();
init_util();
+ init_pathspec();
}
});
@@ -8984,10 +12421,12 @@ __export(api_exports, {
GitResponseError: () => GitResponseError,
ResetMode: () => ResetMode,
TaskConfigurationError: () => TaskConfigurationError,
- grepQueryBuilder: () => grepQueryBuilder
+ grepQueryBuilder: () => grepQueryBuilder,
+ pathspec: () => pathspec
});
var init_api = __esm({
"src/lib/api.ts"() {
+ init_pathspec();
init_git_construct_error();
init_git_error();
init_git_plugin_error();
@@ -9045,15 +12484,28 @@ function preventProtocolOverride(arg, next) {
}
throw new GitPluginError(void 0, "unsafe", "Configuring protocol.allow is not permitted without enabling allowUnsafeExtProtocol");
}
+function preventUploadPack(arg, method) {
+ if (/^\s*--(upload|receive)-pack/.test(arg)) {
+ throw new GitPluginError(void 0, "unsafe", `Use of --upload-pack or --receive-pack is not permitted without enabling allowUnsafePack`);
+ }
+ if (method === "clone" && /^\s*-u\b/.test(arg)) {
+ throw new GitPluginError(void 0, "unsafe", `Use of clone with option -u is not permitted without enabling allowUnsafePack`);
+ }
+ if (method === "push" && /^\s*--exec\b/.test(arg)) {
+ throw new GitPluginError(void 0, "unsafe", `Use of push with option --exec is not permitted without enabling allowUnsafePack`);
+ }
+}
function blockUnsafeOperationsPlugin({
- allowUnsafeProtocolOverride = false
+ allowUnsafeProtocolOverride = false,
+ allowUnsafePack = false
} = {}) {
return {
type: "spawn.args",
- action(args, _context) {
+ action(args, context) {
args.forEach((current, index) => {
const next = index < args.length ? args[index + 1] : "";
allowUnsafeProtocolOverride || preventProtocolOverride(current, next);
+ allowUnsafePack || preventUploadPack(current, context.method);
});
return args;
}
@@ -9295,7 +12747,9 @@ var init_spawn_options_plugin = __esm({
// src/lib/plugins/timout-plugin.ts
function timeoutPlugin({
- block
+ block,
+ stdErr = true,
+ stdOut = true
}) {
if (block > 0) {
return {
@@ -9319,8 +12773,8 @@ function timeoutPlugin({
stop();
context.kill(new GitPluginError(void 0, "timeout", `block timeout reached`));
}
- (_a2 = context.spawned.stdout) == null ? void 0 : _a2.on("data", wait);
- (_b = context.spawned.stderr) == null ? void 0 : _b.on("data", wait);
+ stdOut && ((_a2 = context.spawned.stdout) == null ? void 0 : _a2.on("data", wait));
+ stdErr && ((_b = context.spawned.stderr) == null ? void 0 : _b.on("data", wait));
context.spawned.on("exit", stop);
context.spawned.on("close", stop);
wait();
@@ -9350,6 +12804,35 @@ var init_plugins = __esm({
}
});
+// src/lib/plugins/suffix-paths.plugin.ts
+function suffixPathsPlugin() {
+ return {
+ type: "spawn.args",
+ action(data) {
+ const prefix = [];
+ const suffix = [];
+ for (let i = 0; i < data.length; i++) {
+ const param = data[i];
+ if (isPathSpec(param)) {
+ suffix.push(...toPaths(param));
+ continue;
+ }
+ if (param === "--") {
+ suffix.push(...data.slice(i + 1).flatMap((item) => isPathSpec(item) && toPaths(item) || item));
+ break;
+ }
+ prefix.push(param);
+ }
+ return !suffix.length ? prefix : [...prefix, "--", ...suffix.map(String)];
+ }
+ };
+}
+var init_suffix_paths_plugin = __esm({
+ "src/lib/plugins/suffix-paths.plugin.ts"() {
+ init_pathspec();
+ }
+});
+
// src/lib/git-logger.ts
function createLog() {
return (0, import_debug.default)("simple-git");
@@ -9750,6 +13233,34 @@ var init_change_working_directory = __esm({
}
});
+// src/lib/tasks/checkout.ts
+function checkoutTask(args) {
+ const commands = ["checkout", ...args];
+ if (commands[1] === "-b" && commands.includes("-B")) {
+ commands[1] = remove(commands, "-B");
+ }
+ return straightThroughStringTask(commands);
+}
+function checkout_default() {
+ return {
+ checkout() {
+ return this._runTask(checkoutTask(getTrailingOptions(arguments, 1)), trailingFunctionArgument(arguments));
+ },
+ checkoutBranch(branchName, startPoint) {
+ return this._runTask(checkoutTask(["-b", branchName, startPoint, ...getTrailingOptions(arguments)]), trailingFunctionArgument(arguments));
+ },
+ checkoutLocalBranch(branchName) {
+ return this._runTask(checkoutTask(["-b", branchName, ...getTrailingOptions(arguments)]), trailingFunctionArgument(arguments));
+ }
+ };
+}
+var init_checkout = __esm({
+ "src/lib/tasks/checkout.ts"() {
+ init_utils();
+ init_task();
+ }
+});
+
// src/lib/parsers/parse-commit.ts
function parseCommitResult(stdOut) {
const result = {
@@ -9805,11 +13316,6 @@ var init_parse_commit = __esm({
});
// src/lib/tasks/commit.ts
-var commit_exports = {};
-__export(commit_exports, {
- commitTask: () => commitTask,
- default: () => commit_default
-});
function commitTask(message, files, customArgs) {
const commands = [
"-c",
@@ -10530,7 +14036,7 @@ var init_parse_push = __esm({
local
});
}),
- new LineParser(/^[*-=]\s+([^:]+):(\S+)\s+\[(.+)]$/, (result, [local, remote, type]) => {
+ new LineParser(/^[=*-]\s+([^:]+):(\S+)\s+\[(.+)]$/, (result, [local, remote, type]) => {
result.pushed.push(pushResultPushedItem(local, remote, type));
}),
new LineParser(/^Branch '([^']+)' set up to track remote branch '([^']+)' from '([^']+)'/, (result, [local, remote, remoteName]) => {
@@ -10598,6 +14104,29 @@ var init_push = __esm({
}
});
+// src/lib/tasks/show.ts
+function show_default() {
+ return {
+ showBuffer() {
+ const commands = ["show", ...getTrailingOptions(arguments, 1)];
+ if (!commands.includes("--binary")) {
+ commands.splice(1, 0, "--binary");
+ }
+ return this._runTask(straightThroughBufferTask(commands), trailingFunctionArgument(arguments));
+ },
+ show() {
+ const commands = ["show", ...getTrailingOptions(arguments, 1)];
+ return this._runTask(straightThroughStringTask(commands), trailingFunctionArgument(arguments));
+ }
+ };
+}
+var init_show = __esm({
+ "src/lib/tasks/show.ts"() {
+ init_utils();
+ init_task();
+ }
+});
+
// src/lib/responses/FileStatusSummary.ts
var fromPathRegex, FileStatusSummary;
var init_FileStatusSummary = __esm({
@@ -10838,6 +14367,7 @@ var init_simple_git_api = __esm({
"src/lib/simple-git-api.ts"() {
init_task_callback();
init_change_working_directory();
+ init_checkout();
init_commit();
init_config();
init_grep();
@@ -10846,6 +14376,7 @@ var init_simple_git_api = __esm({
init_log();
init_merge();
init_push();
+ init_show();
init_status();
init_task();
init_version();
@@ -10912,7 +14443,7 @@ var init_simple_git_api = __esm({
return this._runTask(statusTask(getTrailingOptions(arguments)), trailingFunctionArgument(arguments));
}
};
- Object.assign(SimpleGitApi.prototype, commit_default(), config_default(), grep_default(), log_default(), version_default());
+ Object.assign(SimpleGitApi.prototype, checkout_default(), commit_default(), config_default(), grep_default(), log_default(), show_default(), version_default());
}
});
@@ -11638,7 +15169,6 @@ var require_git = __commonJS({
var { checkIsRepoTask: checkIsRepoTask2 } = (init_check_is_repo(), __toCommonJS(check_is_repo_exports));
var { cloneTask: cloneTask2, cloneMirrorTask: cloneMirrorTask2 } = (init_clone(), __toCommonJS(clone_exports));
var { cleanWithOptionsTask: cleanWithOptionsTask2, isCleanOptionsArray: isCleanOptionsArray2 } = (init_clean(), __toCommonJS(clean_exports));
- var { commitTask: commitTask2 } = (init_commit(), __toCommonJS(commit_exports));
var { diffSummaryTask: diffSummaryTask2 } = (init_diff(), __toCommonJS(diff_exports));
var { fetchTask: fetchTask2 } = (init_fetch(), __toCommonJS(fetch_exports));
var { moveTask: moveTask2 } = (init_move(), __toCommonJS(move_exports));
@@ -11737,16 +15267,6 @@ var require_git = __commonJS({
Git2.prototype.addAnnotatedTag = function(tagName, tagMessage) {
return this._runTask(addAnnotatedTagTask2(tagName, tagMessage), trailingFunctionArgument2(arguments));
};
- Git2.prototype.checkout = function() {
- const commands = ["checkout", ...getTrailingOptions2(arguments, true)];
- return this._runTask(straightThroughStringTask2(commands), trailingFunctionArgument2(arguments));
- };
- Git2.prototype.checkoutBranch = function(branchName, startPoint, then) {
- return this.checkout(["-b", branchName, startPoint], trailingFunctionArgument2(arguments));
- };
- Git2.prototype.checkoutLocalBranch = function(branchName, then) {
- return this.checkout(["-b", branchName], trailingFunctionArgument2(arguments));
- };
Git2.prototype.deleteLocalBranch = function(branchName, forceDelete, then) {
return this._runTask(deleteBranchTask2(branchName, typeof forceDelete === "boolean" ? forceDelete : false), trailingFunctionArgument2(arguments));
};
@@ -11856,9 +15376,6 @@ var require_git = __commonJS({
const commands = ["rev-parse", ...getTrailingOptions2(arguments, true)];
return this._runTask(straightThroughStringTask2(commands, true), trailingFunctionArgument2(arguments));
};
- Git2.prototype.show = function(options, then) {
- return this._runTask(straightThroughStringTask2(["show", ...getTrailingOptions2(arguments, 1)]), trailingFunctionArgument2(arguments));
- };
Git2.prototype.clean = function(mode, options, then) {
const usingCleanOptionsArray = isCleanOptionsArray2(mode);
const cleanMode = usingCleanOptionsArray && mode.join("") || filterType2(mode, filterString2) || "";
@@ -11916,6 +15433,7 @@ function gitInstanceFactory(baseDir, options) {
plugins.add(commandConfigPrefixingPlugin(config.config));
}
plugins.add(blockUnsafeOperationsPlugin(config.unsafe));
+ plugins.add(suffixPathsPlugin());
plugins.add(completionDetectionPlugin(config.completion));
config.abort && plugins.add(abortPlugin(config.abort));
config.progress && plugins.add(progressMonitorPlugin(config.progress));
@@ -11930,6 +15448,7 @@ var init_git_factory = __esm({
"src/lib/git-factory.ts"() {
init_api();
init_plugins();
+ init_suffix_paths_plugin();
init_utils();
Git = require_git();
}
@@ -15521,6 +19040,4787 @@ module.exports = require("zlib");
/***/ }),
+/***/ 8757:
+/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
+
+"use strict";
+/*! Axios v1.8.4 Copyright (c) 2025 Matt Zabriskie and contributors */
+
+
+const FormData$1 = __nccwpck_require__(4334);
+const crypto = __nccwpck_require__(6113);
+const url = __nccwpck_require__(7310);
+const proxyFromEnv = __nccwpck_require__(3329);
+const http = __nccwpck_require__(3685);
+const https = __nccwpck_require__(5687);
+const util = __nccwpck_require__(3837);
+const followRedirects = __nccwpck_require__(7707);
+const zlib = __nccwpck_require__(9796);
+const stream = __nccwpck_require__(2781);
+const events = __nccwpck_require__(2361);
+
+function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
+
+const FormData__default = /*#__PURE__*/_interopDefaultLegacy(FormData$1);
+const crypto__default = /*#__PURE__*/_interopDefaultLegacy(crypto);
+const url__default = /*#__PURE__*/_interopDefaultLegacy(url);
+const proxyFromEnv__default = /*#__PURE__*/_interopDefaultLegacy(proxyFromEnv);
+const http__default = /*#__PURE__*/_interopDefaultLegacy(http);
+const https__default = /*#__PURE__*/_interopDefaultLegacy(https);
+const util__default = /*#__PURE__*/_interopDefaultLegacy(util);
+const followRedirects__default = /*#__PURE__*/_interopDefaultLegacy(followRedirects);
+const zlib__default = /*#__PURE__*/_interopDefaultLegacy(zlib);
+const stream__default = /*#__PURE__*/_interopDefaultLegacy(stream);
+
+function bind(fn, thisArg) {
+ return function wrap() {
+ return fn.apply(thisArg, arguments);
+ };
+}
+
+// utils is a library of generic helper functions non-specific to axios
+
+const {toString} = Object.prototype;
+const {getPrototypeOf} = Object;
+
+const kindOf = (cache => thing => {
+ const str = toString.call(thing);
+ return cache[str] || (cache[str] = str.slice(8, -1).toLowerCase());
+})(Object.create(null));
+
+const kindOfTest = (type) => {
+ type = type.toLowerCase();
+ return (thing) => kindOf(thing) === type
+};
+
+const typeOfTest = type => thing => typeof thing === type;
+
+/**
+ * Determine if a value is an Array
+ *
+ * @param {Object} val The value to test
+ *
+ * @returns {boolean} True if value is an Array, otherwise false
+ */
+const {isArray} = Array;
+
+/**
+ * Determine if a value is undefined
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if the value is undefined, otherwise false
+ */
+const isUndefined = typeOfTest('undefined');
+
+/**
+ * Determine if a value is a Buffer
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a Buffer, otherwise false
+ */
+function isBuffer(val) {
+ return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)
+ && isFunction(val.constructor.isBuffer) && val.constructor.isBuffer(val);
+}
+
+/**
+ * Determine if a value is an ArrayBuffer
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is an ArrayBuffer, otherwise false
+ */
+const isArrayBuffer = kindOfTest('ArrayBuffer');
+
+
+/**
+ * Determine if a value is a view on an ArrayBuffer
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false
+ */
+function isArrayBufferView(val) {
+ let result;
+ if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {
+ result = ArrayBuffer.isView(val);
+ } else {
+ result = (val) && (val.buffer) && (isArrayBuffer(val.buffer));
+ }
+ return result;
+}
+
+/**
+ * Determine if a value is a String
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a String, otherwise false
+ */
+const isString = typeOfTest('string');
+
+/**
+ * Determine if a value is a Function
+ *
+ * @param {*} val The value to test
+ * @returns {boolean} True if value is a Function, otherwise false
+ */
+const isFunction = typeOfTest('function');
+
+/**
+ * Determine if a value is a Number
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a Number, otherwise false
+ */
+const isNumber = typeOfTest('number');
+
+/**
+ * Determine if a value is an Object
+ *
+ * @param {*} thing The value to test
+ *
+ * @returns {boolean} True if value is an Object, otherwise false
+ */
+const isObject = (thing) => thing !== null && typeof thing === 'object';
+
+/**
+ * Determine if a value is a Boolean
+ *
+ * @param {*} thing The value to test
+ * @returns {boolean} True if value is a Boolean, otherwise false
+ */
+const isBoolean = thing => thing === true || thing === false;
+
+/**
+ * Determine if a value is a plain Object
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a plain Object, otherwise false
+ */
+const isPlainObject = (val) => {
+ if (kindOf(val) !== 'object') {
+ return false;
+ }
+
+ const prototype = getPrototypeOf(val);
+ return (prototype === null || prototype === Object.prototype || Object.getPrototypeOf(prototype) === null) && !(Symbol.toStringTag in val) && !(Symbol.iterator in val);
+};
+
+/**
+ * Determine if a value is a Date
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a Date, otherwise false
+ */
+const isDate = kindOfTest('Date');
+
+/**
+ * Determine if a value is a File
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a File, otherwise false
+ */
+const isFile = kindOfTest('File');
+
+/**
+ * Determine if a value is a Blob
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a Blob, otherwise false
+ */
+const isBlob = kindOfTest('Blob');
+
+/**
+ * Determine if a value is a FileList
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a File, otherwise false
+ */
+const isFileList = kindOfTest('FileList');
+
+/**
+ * Determine if a value is a Stream
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a Stream, otherwise false
+ */
+const isStream = (val) => isObject(val) && isFunction(val.pipe);
+
+/**
+ * Determine if a value is a FormData
+ *
+ * @param {*} thing The value to test
+ *
+ * @returns {boolean} True if value is an FormData, otherwise false
+ */
+const isFormData = (thing) => {
+ let kind;
+ return thing && (
+ (typeof FormData === 'function' && thing instanceof FormData) || (
+ isFunction(thing.append) && (
+ (kind = kindOf(thing)) === 'formdata' ||
+ // detect form-data instance
+ (kind === 'object' && isFunction(thing.toString) && thing.toString() === '[object FormData]')
+ )
+ )
+ )
+};
+
+/**
+ * Determine if a value is a URLSearchParams object
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a URLSearchParams object, otherwise false
+ */
+const isURLSearchParams = kindOfTest('URLSearchParams');
+
+const [isReadableStream, isRequest, isResponse, isHeaders] = ['ReadableStream', 'Request', 'Response', 'Headers'].map(kindOfTest);
+
+/**
+ * Trim excess whitespace off the beginning and end of a string
+ *
+ * @param {String} str The String to trim
+ *
+ * @returns {String} The String freed of excess whitespace
+ */
+const trim = (str) => str.trim ?
+ str.trim() : str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
+
+/**
+ * Iterate over an Array or an Object invoking a function for each item.
+ *
+ * If `obj` is an Array callback will be called passing
+ * the value, index, and complete array for each item.
+ *
+ * If 'obj' is an Object callback will be called passing
+ * the value, key, and complete object for each property.
+ *
+ * @param {Object|Array} obj The object to iterate
+ * @param {Function} fn The callback to invoke for each item
+ *
+ * @param {Boolean} [allOwnKeys = false]
+ * @returns {any}
+ */
+function forEach(obj, fn, {allOwnKeys = false} = {}) {
+ // Don't bother if no value provided
+ if (obj === null || typeof obj === 'undefined') {
+ return;
+ }
+
+ let i;
+ let l;
+
+ // Force an array if not already something iterable
+ if (typeof obj !== 'object') {
+ /*eslint no-param-reassign:0*/
+ obj = [obj];
+ }
+
+ if (isArray(obj)) {
+ // Iterate over array values
+ for (i = 0, l = obj.length; i < l; i++) {
+ fn.call(null, obj[i], i, obj);
+ }
+ } else {
+ // Iterate over object keys
+ const keys = allOwnKeys ? Object.getOwnPropertyNames(obj) : Object.keys(obj);
+ const len = keys.length;
+ let key;
+
+ for (i = 0; i < len; i++) {
+ key = keys[i];
+ fn.call(null, obj[key], key, obj);
+ }
+ }
+}
+
+function findKey(obj, key) {
+ key = key.toLowerCase();
+ const keys = Object.keys(obj);
+ let i = keys.length;
+ let _key;
+ while (i-- > 0) {
+ _key = keys[i];
+ if (key === _key.toLowerCase()) {
+ return _key;
+ }
+ }
+ return null;
+}
+
+const _global = (() => {
+ /*eslint no-undef:0*/
+ if (typeof globalThis !== "undefined") return globalThis;
+ return typeof self !== "undefined" ? self : (typeof window !== 'undefined' ? window : global)
+})();
+
+const isContextDefined = (context) => !isUndefined(context) && context !== _global;
+
+/**
+ * Accepts varargs expecting each argument to be an object, then
+ * immutably merges the properties of each object and returns result.
+ *
+ * When multiple objects contain the same key the later object in
+ * the arguments list will take precedence.
+ *
+ * Example:
+ *
+ * ```js
+ * var result = merge({foo: 123}, {foo: 456});
+ * console.log(result.foo); // outputs 456
+ * ```
+ *
+ * @param {Object} obj1 Object to merge
+ *
+ * @returns {Object} Result of all merge properties
+ */
+function merge(/* obj1, obj2, obj3, ... */) {
+ const {caseless} = isContextDefined(this) && this || {};
+ const result = {};
+ const assignValue = (val, key) => {
+ const targetKey = caseless && findKey(result, key) || key;
+ if (isPlainObject(result[targetKey]) && isPlainObject(val)) {
+ result[targetKey] = merge(result[targetKey], val);
+ } else if (isPlainObject(val)) {
+ result[targetKey] = merge({}, val);
+ } else if (isArray(val)) {
+ result[targetKey] = val.slice();
+ } else {
+ result[targetKey] = val;
+ }
+ };
+
+ for (let i = 0, l = arguments.length; i < l; i++) {
+ arguments[i] && forEach(arguments[i], assignValue);
+ }
+ return result;
+}
+
+/**
+ * Extends object a by mutably adding to it the properties of object b.
+ *
+ * @param {Object} a The object to be extended
+ * @param {Object} b The object to copy properties from
+ * @param {Object} thisArg The object to bind function to
+ *
+ * @param {Boolean} [allOwnKeys]
+ * @returns {Object} The resulting value of object a
+ */
+const extend = (a, b, thisArg, {allOwnKeys}= {}) => {
+ forEach(b, (val, key) => {
+ if (thisArg && isFunction(val)) {
+ a[key] = bind(val, thisArg);
+ } else {
+ a[key] = val;
+ }
+ }, {allOwnKeys});
+ return a;
+};
+
+/**
+ * Remove byte order marker. This catches EF BB BF (the UTF-8 BOM)
+ *
+ * @param {string} content with BOM
+ *
+ * @returns {string} content value without BOM
+ */
+const stripBOM = (content) => {
+ if (content.charCodeAt(0) === 0xFEFF) {
+ content = content.slice(1);
+ }
+ return content;
+};
+
+/**
+ * Inherit the prototype methods from one constructor into another
+ * @param {function} constructor
+ * @param {function} superConstructor
+ * @param {object} [props]
+ * @param {object} [descriptors]
+ *
+ * @returns {void}
+ */
+const inherits = (constructor, superConstructor, props, descriptors) => {
+ constructor.prototype = Object.create(superConstructor.prototype, descriptors);
+ constructor.prototype.constructor = constructor;
+ Object.defineProperty(constructor, 'super', {
+ value: superConstructor.prototype
+ });
+ props && Object.assign(constructor.prototype, props);
+};
+
+/**
+ * Resolve object with deep prototype chain to a flat object
+ * @param {Object} sourceObj source object
+ * @param {Object} [destObj]
+ * @param {Function|Boolean} [filter]
+ * @param {Function} [propFilter]
+ *
+ * @returns {Object}
+ */
+const toFlatObject = (sourceObj, destObj, filter, propFilter) => {
+ let props;
+ let i;
+ let prop;
+ const merged = {};
+
+ destObj = destObj || {};
+ // eslint-disable-next-line no-eq-null,eqeqeq
+ if (sourceObj == null) return destObj;
+
+ do {
+ props = Object.getOwnPropertyNames(sourceObj);
+ i = props.length;
+ while (i-- > 0) {
+ prop = props[i];
+ if ((!propFilter || propFilter(prop, sourceObj, destObj)) && !merged[prop]) {
+ destObj[prop] = sourceObj[prop];
+ merged[prop] = true;
+ }
+ }
+ sourceObj = filter !== false && getPrototypeOf(sourceObj);
+ } while (sourceObj && (!filter || filter(sourceObj, destObj)) && sourceObj !== Object.prototype);
+
+ return destObj;
+};
+
+/**
+ * Determines whether a string ends with the characters of a specified string
+ *
+ * @param {String} str
+ * @param {String} searchString
+ * @param {Number} [position= 0]
+ *
+ * @returns {boolean}
+ */
+const endsWith = (str, searchString, position) => {
+ str = String(str);
+ if (position === undefined || position > str.length) {
+ position = str.length;
+ }
+ position -= searchString.length;
+ const lastIndex = str.indexOf(searchString, position);
+ return lastIndex !== -1 && lastIndex === position;
+};
+
+
+/**
+ * Returns new array from array like object or null if failed
+ *
+ * @param {*} [thing]
+ *
+ * @returns {?Array}
+ */
+const toArray = (thing) => {
+ if (!thing) return null;
+ if (isArray(thing)) return thing;
+ let i = thing.length;
+ if (!isNumber(i)) return null;
+ const arr = new Array(i);
+ while (i-- > 0) {
+ arr[i] = thing[i];
+ }
+ return arr;
+};
+
+/**
+ * Checking if the Uint8Array exists and if it does, it returns a function that checks if the
+ * thing passed in is an instance of Uint8Array
+ *
+ * @param {TypedArray}
+ *
+ * @returns {Array}
+ */
+// eslint-disable-next-line func-names
+const isTypedArray = (TypedArray => {
+ // eslint-disable-next-line func-names
+ return thing => {
+ return TypedArray && thing instanceof TypedArray;
+ };
+})(typeof Uint8Array !== 'undefined' && getPrototypeOf(Uint8Array));
+
+/**
+ * For each entry in the object, call the function with the key and value.
+ *
+ * @param {Object} obj - The object to iterate over.
+ * @param {Function} fn - The function to call for each entry.
+ *
+ * @returns {void}
+ */
+const forEachEntry = (obj, fn) => {
+ const generator = obj && obj[Symbol.iterator];
+
+ const iterator = generator.call(obj);
+
+ let result;
+
+ while ((result = iterator.next()) && !result.done) {
+ const pair = result.value;
+ fn.call(obj, pair[0], pair[1]);
+ }
+};
+
+/**
+ * It takes a regular expression and a string, and returns an array of all the matches
+ *
+ * @param {string} regExp - The regular expression to match against.
+ * @param {string} str - The string to search.
+ *
+ * @returns {Array}
+ */
+const matchAll = (regExp, str) => {
+ let matches;
+ const arr = [];
+
+ while ((matches = regExp.exec(str)) !== null) {
+ arr.push(matches);
+ }
+
+ return arr;
+};
+
+/* Checking if the kindOfTest function returns true when passed an HTMLFormElement. */
+const isHTMLForm = kindOfTest('HTMLFormElement');
+
+const toCamelCase = str => {
+ return str.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,
+ function replacer(m, p1, p2) {
+ return p1.toUpperCase() + p2;
+ }
+ );
+};
+
+/* Creating a function that will check if an object has a property. */
+const hasOwnProperty = (({hasOwnProperty}) => (obj, prop) => hasOwnProperty.call(obj, prop))(Object.prototype);
+
+/**
+ * Determine if a value is a RegExp object
+ *
+ * @param {*} val The value to test
+ *
+ * @returns {boolean} True if value is a RegExp object, otherwise false
+ */
+const isRegExp = kindOfTest('RegExp');
+
+const reduceDescriptors = (obj, reducer) => {
+ const descriptors = Object.getOwnPropertyDescriptors(obj);
+ const reducedDescriptors = {};
+
+ forEach(descriptors, (descriptor, name) => {
+ let ret;
+ if ((ret = reducer(descriptor, name, obj)) !== false) {
+ reducedDescriptors[name] = ret || descriptor;
+ }
+ });
+
+ Object.defineProperties(obj, reducedDescriptors);
+};
+
+/**
+ * Makes all methods read-only
+ * @param {Object} obj
+ */
+
+const freezeMethods = (obj) => {
+ reduceDescriptors(obj, (descriptor, name) => {
+ // skip restricted props in strict mode
+ if (isFunction(obj) && ['arguments', 'caller', 'callee'].indexOf(name) !== -1) {
+ return false;
+ }
+
+ const value = obj[name];
+
+ if (!isFunction(value)) return;
+
+ descriptor.enumerable = false;
+
+ if ('writable' in descriptor) {
+ descriptor.writable = false;
+ return;
+ }
+
+ if (!descriptor.set) {
+ descriptor.set = () => {
+ throw Error('Can not rewrite read-only method \'' + name + '\'');
+ };
+ }
+ });
+};
+
+const toObjectSet = (arrayOrString, delimiter) => {
+ const obj = {};
+
+ const define = (arr) => {
+ arr.forEach(value => {
+ obj[value] = true;
+ });
+ };
+
+ isArray(arrayOrString) ? define(arrayOrString) : define(String(arrayOrString).split(delimiter));
+
+ return obj;
+};
+
+const noop = () => {};
+
+const toFiniteNumber = (value, defaultValue) => {
+ return value != null && Number.isFinite(value = +value) ? value : defaultValue;
+};
+
+/**
+ * If the thing is a FormData object, return true, otherwise return false.
+ *
+ * @param {unknown} thing - The thing to check.
+ *
+ * @returns {boolean}
+ */
+function isSpecCompliantForm(thing) {
+ return !!(thing && isFunction(thing.append) && thing[Symbol.toStringTag] === 'FormData' && thing[Symbol.iterator]);
+}
+
+const toJSONObject = (obj) => {
+ const stack = new Array(10);
+
+ const visit = (source, i) => {
+
+ if (isObject(source)) {
+ if (stack.indexOf(source) >= 0) {
+ return;
+ }
+
+ if(!('toJSON' in source)) {
+ stack[i] = source;
+ const target = isArray(source) ? [] : {};
+
+ forEach(source, (value, key) => {
+ const reducedValue = visit(value, i + 1);
+ !isUndefined(reducedValue) && (target[key] = reducedValue);
+ });
+
+ stack[i] = undefined;
+
+ return target;
+ }
+ }
+
+ return source;
+ };
+
+ return visit(obj, 0);
+};
+
+const isAsyncFn = kindOfTest('AsyncFunction');
+
+const isThenable = (thing) =>
+ thing && (isObject(thing) || isFunction(thing)) && isFunction(thing.then) && isFunction(thing.catch);
+
+// original code
+// https://github.com/DigitalBrainJS/AxiosPromise/blob/16deab13710ec09779922131f3fa5954320f83ab/lib/utils.js#L11-L34
+
+const _setImmediate = ((setImmediateSupported, postMessageSupported) => {
+ if (setImmediateSupported) {
+ return setImmediate;
+ }
+
+ return postMessageSupported ? ((token, callbacks) => {
+ _global.addEventListener("message", ({source, data}) => {
+ if (source === _global && data === token) {
+ callbacks.length && callbacks.shift()();
+ }
+ }, false);
+
+ return (cb) => {
+ callbacks.push(cb);
+ _global.postMessage(token, "*");
+ }
+ })(`axios@${Math.random()}`, []) : (cb) => setTimeout(cb);
+})(
+ typeof setImmediate === 'function',
+ isFunction(_global.postMessage)
+);
+
+const asap = typeof queueMicrotask !== 'undefined' ?
+ queueMicrotask.bind(_global) : ( typeof process !== 'undefined' && process.nextTick || _setImmediate);
+
+// *********************
+
+const utils$1 = {
+ isArray,
+ isArrayBuffer,
+ isBuffer,
+ isFormData,
+ isArrayBufferView,
+ isString,
+ isNumber,
+ isBoolean,
+ isObject,
+ isPlainObject,
+ isReadableStream,
+ isRequest,
+ isResponse,
+ isHeaders,
+ isUndefined,
+ isDate,
+ isFile,
+ isBlob,
+ isRegExp,
+ isFunction,
+ isStream,
+ isURLSearchParams,
+ isTypedArray,
+ isFileList,
+ forEach,
+ merge,
+ extend,
+ trim,
+ stripBOM,
+ inherits,
+ toFlatObject,
+ kindOf,
+ kindOfTest,
+ endsWith,
+ toArray,
+ forEachEntry,
+ matchAll,
+ isHTMLForm,
+ hasOwnProperty,
+ hasOwnProp: hasOwnProperty, // an alias to avoid ESLint no-prototype-builtins detection
+ reduceDescriptors,
+ freezeMethods,
+ toObjectSet,
+ toCamelCase,
+ noop,
+ toFiniteNumber,
+ findKey,
+ global: _global,
+ isContextDefined,
+ isSpecCompliantForm,
+ toJSONObject,
+ isAsyncFn,
+ isThenable,
+ setImmediate: _setImmediate,
+ asap
+};
+
+/**
+ * Create an Error with the specified message, config, error code, request and response.
+ *
+ * @param {string} message The error message.
+ * @param {string} [code] The error code (for example, 'ECONNABORTED').
+ * @param {Object} [config] The config.
+ * @param {Object} [request] The request.
+ * @param {Object} [response] The response.
+ *
+ * @returns {Error} The created error.
+ */
+function AxiosError(message, code, config, request, response) {
+ Error.call(this);
+
+ if (Error.captureStackTrace) {
+ Error.captureStackTrace(this, this.constructor);
+ } else {
+ this.stack = (new Error()).stack;
+ }
+
+ this.message = message;
+ this.name = 'AxiosError';
+ code && (this.code = code);
+ config && (this.config = config);
+ request && (this.request = request);
+ if (response) {
+ this.response = response;
+ this.status = response.status ? response.status : null;
+ }
+}
+
+utils$1.inherits(AxiosError, Error, {
+ toJSON: function toJSON() {
+ return {
+ // Standard
+ message: this.message,
+ name: this.name,
+ // Microsoft
+ description: this.description,
+ number: this.number,
+ // Mozilla
+ fileName: this.fileName,
+ lineNumber: this.lineNumber,
+ columnNumber: this.columnNumber,
+ stack: this.stack,
+ // Axios
+ config: utils$1.toJSONObject(this.config),
+ code: this.code,
+ status: this.status
+ };
+ }
+});
+
+const prototype$1 = AxiosError.prototype;
+const descriptors = {};
+
+[
+ 'ERR_BAD_OPTION_VALUE',
+ 'ERR_BAD_OPTION',
+ 'ECONNABORTED',
+ 'ETIMEDOUT',
+ 'ERR_NETWORK',
+ 'ERR_FR_TOO_MANY_REDIRECTS',
+ 'ERR_DEPRECATED',
+ 'ERR_BAD_RESPONSE',
+ 'ERR_BAD_REQUEST',
+ 'ERR_CANCELED',
+ 'ERR_NOT_SUPPORT',
+ 'ERR_INVALID_URL'
+// eslint-disable-next-line func-names
+].forEach(code => {
+ descriptors[code] = {value: code};
+});
+
+Object.defineProperties(AxiosError, descriptors);
+Object.defineProperty(prototype$1, 'isAxiosError', {value: true});
+
+// eslint-disable-next-line func-names
+AxiosError.from = (error, code, config, request, response, customProps) => {
+ const axiosError = Object.create(prototype$1);
+
+ utils$1.toFlatObject(error, axiosError, function filter(obj) {
+ return obj !== Error.prototype;
+ }, prop => {
+ return prop !== 'isAxiosError';
+ });
+
+ AxiosError.call(axiosError, error.message, code, config, request, response);
+
+ axiosError.cause = error;
+
+ axiosError.name = error.name;
+
+ customProps && Object.assign(axiosError, customProps);
+
+ return axiosError;
+};
+
+/**
+ * Determines if the given thing is a array or js object.
+ *
+ * @param {string} thing - The object or array to be visited.
+ *
+ * @returns {boolean}
+ */
+function isVisitable(thing) {
+ return utils$1.isPlainObject(thing) || utils$1.isArray(thing);
+}
+
+/**
+ * It removes the brackets from the end of a string
+ *
+ * @param {string} key - The key of the parameter.
+ *
+ * @returns {string} the key without the brackets.
+ */
+function removeBrackets(key) {
+ return utils$1.endsWith(key, '[]') ? key.slice(0, -2) : key;
+}
+
+/**
+ * It takes a path, a key, and a boolean, and returns a string
+ *
+ * @param {string} path - The path to the current key.
+ * @param {string} key - The key of the current object being iterated over.
+ * @param {string} dots - If true, the key will be rendered with dots instead of brackets.
+ *
+ * @returns {string} The path to the current key.
+ */
+function renderKey(path, key, dots) {
+ if (!path) return key;
+ return path.concat(key).map(function each(token, i) {
+ // eslint-disable-next-line no-param-reassign
+ token = removeBrackets(token);
+ return !dots && i ? '[' + token + ']' : token;
+ }).join(dots ? '.' : '');
+}
+
+/**
+ * If the array is an array and none of its elements are visitable, then it's a flat array.
+ *
+ * @param {Array} arr - The array to check
+ *
+ * @returns {boolean}
+ */
+function isFlatArray(arr) {
+ return utils$1.isArray(arr) && !arr.some(isVisitable);
+}
+
+const predicates = utils$1.toFlatObject(utils$1, {}, null, function filter(prop) {
+ return /^is[A-Z]/.test(prop);
+});
+
+/**
+ * Convert a data object to FormData
+ *
+ * @param {Object} obj
+ * @param {?Object} [formData]
+ * @param {?Object} [options]
+ * @param {Function} [options.visitor]
+ * @param {Boolean} [options.metaTokens = true]
+ * @param {Boolean} [options.dots = false]
+ * @param {?Boolean} [options.indexes = false]
+ *
+ * @returns {Object}
+ **/
+
+/**
+ * It converts an object into a FormData object
+ *
+ * @param {Object} obj - The object to convert to form data.
+ * @param {string} formData - The FormData object to append to.
+ * @param {Object} options
+ *
+ * @returns
+ */
+function toFormData(obj, formData, options) {
+ if (!utils$1.isObject(obj)) {
+ throw new TypeError('target must be an object');
+ }
+
+ // eslint-disable-next-line no-param-reassign
+ formData = formData || new (FormData__default["default"] || FormData)();
+
+ // eslint-disable-next-line no-param-reassign
+ options = utils$1.toFlatObject(options, {
+ metaTokens: true,
+ dots: false,
+ indexes: false
+ }, false, function defined(option, source) {
+ // eslint-disable-next-line no-eq-null,eqeqeq
+ return !utils$1.isUndefined(source[option]);
+ });
+
+ const metaTokens = options.metaTokens;
+ // eslint-disable-next-line no-use-before-define
+ const visitor = options.visitor || defaultVisitor;
+ const dots = options.dots;
+ const indexes = options.indexes;
+ const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob;
+ const useBlob = _Blob && utils$1.isSpecCompliantForm(formData);
+
+ if (!utils$1.isFunction(visitor)) {
+ throw new TypeError('visitor must be a function');
+ }
+
+ function convertValue(value) {
+ if (value === null) return '';
+
+ if (utils$1.isDate(value)) {
+ return value.toISOString();
+ }
+
+ if (!useBlob && utils$1.isBlob(value)) {
+ throw new AxiosError('Blob is not supported. Use a Buffer instead.');
+ }
+
+ if (utils$1.isArrayBuffer(value) || utils$1.isTypedArray(value)) {
+ return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value);
+ }
+
+ return value;
+ }
+
+ /**
+ * Default visitor.
+ *
+ * @param {*} value
+ * @param {String|Number} key
+ * @param {Array} path
+ * @this {FormData}
+ *
+ * @returns {boolean} return true to visit the each prop of the value recursively
+ */
+ function defaultVisitor(value, key, path) {
+ let arr = value;
+
+ if (value && !path && typeof value === 'object') {
+ if (utils$1.endsWith(key, '{}')) {
+ // eslint-disable-next-line no-param-reassign
+ key = metaTokens ? key : key.slice(0, -2);
+ // eslint-disable-next-line no-param-reassign
+ value = JSON.stringify(value);
+ } else if (
+ (utils$1.isArray(value) && isFlatArray(value)) ||
+ ((utils$1.isFileList(value) || utils$1.endsWith(key, '[]')) && (arr = utils$1.toArray(value))
+ )) {
+ // eslint-disable-next-line no-param-reassign
+ key = removeBrackets(key);
+
+ arr.forEach(function each(el, index) {
+ !(utils$1.isUndefined(el) || el === null) && formData.append(
+ // eslint-disable-next-line no-nested-ternary
+ indexes === true ? renderKey([key], index, dots) : (indexes === null ? key : key + '[]'),
+ convertValue(el)
+ );
+ });
+ return false;
+ }
+ }
+
+ if (isVisitable(value)) {
+ return true;
+ }
+
+ formData.append(renderKey(path, key, dots), convertValue(value));
+
+ return false;
+ }
+
+ const stack = [];
+
+ const exposedHelpers = Object.assign(predicates, {
+ defaultVisitor,
+ convertValue,
+ isVisitable
+ });
+
+ function build(value, path) {
+ if (utils$1.isUndefined(value)) return;
+
+ if (stack.indexOf(value) !== -1) {
+ throw Error('Circular reference detected in ' + path.join('.'));
+ }
+
+ stack.push(value);
+
+ utils$1.forEach(value, function each(el, key) {
+ const result = !(utils$1.isUndefined(el) || el === null) && visitor.call(
+ formData, el, utils$1.isString(key) ? key.trim() : key, path, exposedHelpers
+ );
+
+ if (result === true) {
+ build(el, path ? path.concat(key) : [key]);
+ }
+ });
+
+ stack.pop();
+ }
+
+ if (!utils$1.isObject(obj)) {
+ throw new TypeError('data must be an object');
+ }
+
+ build(obj);
+
+ return formData;
+}
+
+/**
+ * It encodes a string by replacing all characters that are not in the unreserved set with
+ * their percent-encoded equivalents
+ *
+ * @param {string} str - The string to encode.
+ *
+ * @returns {string} The encoded string.
+ */
+function encode$1(str) {
+ const charMap = {
+ '!': '%21',
+ "'": '%27',
+ '(': '%28',
+ ')': '%29',
+ '~': '%7E',
+ '%20': '+',
+ '%00': '\x00'
+ };
+ return encodeURIComponent(str).replace(/[!'()~]|%20|%00/g, function replacer(match) {
+ return charMap[match];
+ });
+}
+
+/**
+ * It takes a params object and converts it to a FormData object
+ *
+ * @param {Object} params - The parameters to be converted to a FormData object.
+ * @param {Object} options - The options object passed to the Axios constructor.
+ *
+ * @returns {void}
+ */
+function AxiosURLSearchParams(params, options) {
+ this._pairs = [];
+
+ params && toFormData(params, this, options);
+}
+
+const prototype = AxiosURLSearchParams.prototype;
+
+prototype.append = function append(name, value) {
+ this._pairs.push([name, value]);
+};
+
+prototype.toString = function toString(encoder) {
+ const _encode = encoder ? function(value) {
+ return encoder.call(this, value, encode$1);
+ } : encode$1;
+
+ return this._pairs.map(function each(pair) {
+ return _encode(pair[0]) + '=' + _encode(pair[1]);
+ }, '').join('&');
+};
+
+/**
+ * It replaces all instances of the characters `:`, `$`, `,`, `+`, `[`, and `]` with their
+ * URI encoded counterparts
+ *
+ * @param {string} val The value to be encoded.
+ *
+ * @returns {string} The encoded value.
+ */
+function encode(val) {
+ return encodeURIComponent(val).
+ replace(/%3A/gi, ':').
+ replace(/%24/g, '$').
+ replace(/%2C/gi, ',').
+ replace(/%20/g, '+').
+ replace(/%5B/gi, '[').
+ replace(/%5D/gi, ']');
+}
+
+/**
+ * Build a URL by appending params to the end
+ *
+ * @param {string} url The base of the url (e.g., http://www.google.com)
+ * @param {object} [params] The params to be appended
+ * @param {?(object|Function)} options
+ *
+ * @returns {string} The formatted url
+ */
+function buildURL(url, params, options) {
+ /*eslint no-param-reassign:0*/
+ if (!params) {
+ return url;
+ }
+
+ const _encode = options && options.encode || encode;
+
+ if (utils$1.isFunction(options)) {
+ options = {
+ serialize: options
+ };
+ }
+
+ const serializeFn = options && options.serialize;
+
+ let serializedParams;
+
+ if (serializeFn) {
+ serializedParams = serializeFn(params, options);
+ } else {
+ serializedParams = utils$1.isURLSearchParams(params) ?
+ params.toString() :
+ new AxiosURLSearchParams(params, options).toString(_encode);
+ }
+
+ if (serializedParams) {
+ const hashmarkIndex = url.indexOf("#");
+
+ if (hashmarkIndex !== -1) {
+ url = url.slice(0, hashmarkIndex);
+ }
+ url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;
+ }
+
+ return url;
+}
+
+class InterceptorManager {
+ constructor() {
+ this.handlers = [];
+ }
+
+ /**
+ * Add a new interceptor to the stack
+ *
+ * @param {Function} fulfilled The function to handle `then` for a `Promise`
+ * @param {Function} rejected The function to handle `reject` for a `Promise`
+ *
+ * @return {Number} An ID used to remove interceptor later
+ */
+ use(fulfilled, rejected, options) {
+ this.handlers.push({
+ fulfilled,
+ rejected,
+ synchronous: options ? options.synchronous : false,
+ runWhen: options ? options.runWhen : null
+ });
+ return this.handlers.length - 1;
+ }
+
+ /**
+ * Remove an interceptor from the stack
+ *
+ * @param {Number} id The ID that was returned by `use`
+ *
+ * @returns {Boolean} `true` if the interceptor was removed, `false` otherwise
+ */
+ eject(id) {
+ if (this.handlers[id]) {
+ this.handlers[id] = null;
+ }
+ }
+
+ /**
+ * Clear all interceptors from the stack
+ *
+ * @returns {void}
+ */
+ clear() {
+ if (this.handlers) {
+ this.handlers = [];
+ }
+ }
+
+ /**
+ * Iterate over all the registered interceptors
+ *
+ * This method is particularly useful for skipping over any
+ * interceptors that may have become `null` calling `eject`.
+ *
+ * @param {Function} fn The function to call for each interceptor
+ *
+ * @returns {void}
+ */
+ forEach(fn) {
+ utils$1.forEach(this.handlers, function forEachHandler(h) {
+ if (h !== null) {
+ fn(h);
+ }
+ });
+ }
+}
+
+const InterceptorManager$1 = InterceptorManager;
+
+const transitionalDefaults = {
+ silentJSONParsing: true,
+ forcedJSONParsing: true,
+ clarifyTimeoutError: false
+};
+
+const URLSearchParams = url__default["default"].URLSearchParams;
+
+const ALPHA = 'abcdefghijklmnopqrstuvwxyz';
+
+const DIGIT = '0123456789';
+
+const ALPHABET = {
+ DIGIT,
+ ALPHA,
+ ALPHA_DIGIT: ALPHA + ALPHA.toUpperCase() + DIGIT
+};
+
+const generateString = (size = 16, alphabet = ALPHABET.ALPHA_DIGIT) => {
+ let str = '';
+ const {length} = alphabet;
+ const randomValues = new Uint32Array(size);
+ crypto__default["default"].randomFillSync(randomValues);
+ for (let i = 0; i < size; i++) {
+ str += alphabet[randomValues[i] % length];
+ }
+
+ return str;
+};
+
+
+const platform$1 = {
+ isNode: true,
+ classes: {
+ URLSearchParams,
+ FormData: FormData__default["default"],
+ Blob: typeof Blob !== 'undefined' && Blob || null
+ },
+ ALPHABET,
+ generateString,
+ protocols: [ 'http', 'https', 'file', 'data' ]
+};
+
+const hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined';
+
+const _navigator = typeof navigator === 'object' && navigator || undefined;
+
+/**
+ * Determine if we're running in a standard browser environment
+ *
+ * This allows axios to run in a web worker, and react-native.
+ * Both environments support XMLHttpRequest, but not fully standard globals.
+ *
+ * web workers:
+ * typeof window -> undefined
+ * typeof document -> undefined
+ *
+ * react-native:
+ * navigator.product -> 'ReactNative'
+ * nativescript
+ * navigator.product -> 'NativeScript' or 'NS'
+ *
+ * @returns {boolean}
+ */
+const hasStandardBrowserEnv = hasBrowserEnv &&
+ (!_navigator || ['ReactNative', 'NativeScript', 'NS'].indexOf(_navigator.product) < 0);
+
+/**
+ * Determine if we're running in a standard browser webWorker environment
+ *
+ * Although the `isStandardBrowserEnv` method indicates that
+ * `allows axios to run in a web worker`, the WebWorker will still be
+ * filtered out due to its judgment standard
+ * `typeof window !== 'undefined' && typeof document !== 'undefined'`.
+ * This leads to a problem when axios post `FormData` in webWorker
+ */
+const hasStandardBrowserWebWorkerEnv = (() => {
+ return (
+ typeof WorkerGlobalScope !== 'undefined' &&
+ // eslint-disable-next-line no-undef
+ self instanceof WorkerGlobalScope &&
+ typeof self.importScripts === 'function'
+ );
+})();
+
+const origin = hasBrowserEnv && window.location.href || 'http://localhost';
+
+const utils = /*#__PURE__*/Object.freeze({
+ __proto__: null,
+ hasBrowserEnv: hasBrowserEnv,
+ hasStandardBrowserWebWorkerEnv: hasStandardBrowserWebWorkerEnv,
+ hasStandardBrowserEnv: hasStandardBrowserEnv,
+ navigator: _navigator,
+ origin: origin
+});
+
+const platform = {
+ ...utils,
+ ...platform$1
+};
+
+function toURLEncodedForm(data, options) {
+ return toFormData(data, new platform.classes.URLSearchParams(), Object.assign({
+ visitor: function(value, key, path, helpers) {
+ if (platform.isNode && utils$1.isBuffer(value)) {
+ this.append(key, value.toString('base64'));
+ return false;
+ }
+
+ return helpers.defaultVisitor.apply(this, arguments);
+ }
+ }, options));
+}
+
+/**
+ * It takes a string like `foo[x][y][z]` and returns an array like `['foo', 'x', 'y', 'z']
+ *
+ * @param {string} name - The name of the property to get.
+ *
+ * @returns An array of strings.
+ */
+function parsePropPath(name) {
+ // foo[x][y][z]
+ // foo.x.y.z
+ // foo-x-y-z
+ // foo x y z
+ return utils$1.matchAll(/\w+|\[(\w*)]/g, name).map(match => {
+ return match[0] === '[]' ? '' : match[1] || match[0];
+ });
+}
+
+/**
+ * Convert an array to an object.
+ *
+ * @param {Array} arr - The array to convert to an object.
+ *
+ * @returns An object with the same keys and values as the array.
+ */
+function arrayToObject(arr) {
+ const obj = {};
+ const keys = Object.keys(arr);
+ let i;
+ const len = keys.length;
+ let key;
+ for (i = 0; i < len; i++) {
+ key = keys[i];
+ obj[key] = arr[key];
+ }
+ return obj;
+}
+
+/**
+ * It takes a FormData object and returns a JavaScript object
+ *
+ * @param {string} formData The FormData object to convert to JSON.
+ *
+ * @returns {Object | null} The converted object.
+ */
+function formDataToJSON(formData) {
+ function buildPath(path, value, target, index) {
+ let name = path[index++];
+
+ if (name === '__proto__') return true;
+
+ const isNumericKey = Number.isFinite(+name);
+ const isLast = index >= path.length;
+ name = !name && utils$1.isArray(target) ? target.length : name;
+
+ if (isLast) {
+ if (utils$1.hasOwnProp(target, name)) {
+ target[name] = [target[name], value];
+ } else {
+ target[name] = value;
+ }
+
+ return !isNumericKey;
+ }
+
+ if (!target[name] || !utils$1.isObject(target[name])) {
+ target[name] = [];
+ }
+
+ const result = buildPath(path, value, target[name], index);
+
+ if (result && utils$1.isArray(target[name])) {
+ target[name] = arrayToObject(target[name]);
+ }
+
+ return !isNumericKey;
+ }
+
+ if (utils$1.isFormData(formData) && utils$1.isFunction(formData.entries)) {
+ const obj = {};
+
+ utils$1.forEachEntry(formData, (name, value) => {
+ buildPath(parsePropPath(name), value, obj, 0);
+ });
+
+ return obj;
+ }
+
+ return null;
+}
+
+/**
+ * It takes a string, tries to parse it, and if it fails, it returns the stringified version
+ * of the input
+ *
+ * @param {any} rawValue - The value to be stringified.
+ * @param {Function} parser - A function that parses a string into a JavaScript object.
+ * @param {Function} encoder - A function that takes a value and returns a string.
+ *
+ * @returns {string} A stringified version of the rawValue.
+ */
+function stringifySafely(rawValue, parser, encoder) {
+ if (utils$1.isString(rawValue)) {
+ try {
+ (parser || JSON.parse)(rawValue);
+ return utils$1.trim(rawValue);
+ } catch (e) {
+ if (e.name !== 'SyntaxError') {
+ throw e;
+ }
+ }
+ }
+
+ return (encoder || JSON.stringify)(rawValue);
+}
+
+const defaults = {
+
+ transitional: transitionalDefaults,
+
+ adapter: ['xhr', 'http', 'fetch'],
+
+ transformRequest: [function transformRequest(data, headers) {
+ const contentType = headers.getContentType() || '';
+ const hasJSONContentType = contentType.indexOf('application/json') > -1;
+ const isObjectPayload = utils$1.isObject(data);
+
+ if (isObjectPayload && utils$1.isHTMLForm(data)) {
+ data = new FormData(data);
+ }
+
+ const isFormData = utils$1.isFormData(data);
+
+ if (isFormData) {
+ return hasJSONContentType ? JSON.stringify(formDataToJSON(data)) : data;
+ }
+
+ if (utils$1.isArrayBuffer(data) ||
+ utils$1.isBuffer(data) ||
+ utils$1.isStream(data) ||
+ utils$1.isFile(data) ||
+ utils$1.isBlob(data) ||
+ utils$1.isReadableStream(data)
+ ) {
+ return data;
+ }
+ if (utils$1.isArrayBufferView(data)) {
+ return data.buffer;
+ }
+ if (utils$1.isURLSearchParams(data)) {
+ headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false);
+ return data.toString();
+ }
+
+ let isFileList;
+
+ if (isObjectPayload) {
+ if (contentType.indexOf('application/x-www-form-urlencoded') > -1) {
+ return toURLEncodedForm(data, this.formSerializer).toString();
+ }
+
+ if ((isFileList = utils$1.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) {
+ const _FormData = this.env && this.env.FormData;
+
+ return toFormData(
+ isFileList ? {'files[]': data} : data,
+ _FormData && new _FormData(),
+ this.formSerializer
+ );
+ }
+ }
+
+ if (isObjectPayload || hasJSONContentType ) {
+ headers.setContentType('application/json', false);
+ return stringifySafely(data);
+ }
+
+ return data;
+ }],
+
+ transformResponse: [function transformResponse(data) {
+ const transitional = this.transitional || defaults.transitional;
+ const forcedJSONParsing = transitional && transitional.forcedJSONParsing;
+ const JSONRequested = this.responseType === 'json';
+
+ if (utils$1.isResponse(data) || utils$1.isReadableStream(data)) {
+ return data;
+ }
+
+ if (data && utils$1.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) {
+ const silentJSONParsing = transitional && transitional.silentJSONParsing;
+ const strictJSONParsing = !silentJSONParsing && JSONRequested;
+
+ try {
+ return JSON.parse(data);
+ } catch (e) {
+ if (strictJSONParsing) {
+ if (e.name === 'SyntaxError') {
+ throw AxiosError.from(e, AxiosError.ERR_BAD_RESPONSE, this, null, this.response);
+ }
+ throw e;
+ }
+ }
+ }
+
+ return data;
+ }],
+
+ /**
+ * A timeout in milliseconds to abort a request. If set to 0 (default) a
+ * timeout is not created.
+ */
+ timeout: 0,
+
+ xsrfCookieName: 'XSRF-TOKEN',
+ xsrfHeaderName: 'X-XSRF-TOKEN',
+
+ maxContentLength: -1,
+ maxBodyLength: -1,
+
+ env: {
+ FormData: platform.classes.FormData,
+ Blob: platform.classes.Blob
+ },
+
+ validateStatus: function validateStatus(status) {
+ return status >= 200 && status < 300;
+ },
+
+ headers: {
+ common: {
+ 'Accept': 'application/json, text/plain, */*',
+ 'Content-Type': undefined
+ }
+ }
+};
+
+utils$1.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], (method) => {
+ defaults.headers[method] = {};
+});
+
+const defaults$1 = defaults;
+
+// RawAxiosHeaders whose duplicates are ignored by node
+// c.f. https://nodejs.org/api/http.html#http_message_headers
+const ignoreDuplicateOf = utils$1.toObjectSet([
+ 'age', 'authorization', 'content-length', 'content-type', 'etag',
+ 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',
+ 'last-modified', 'location', 'max-forwards', 'proxy-authorization',
+ 'referer', 'retry-after', 'user-agent'
+]);
+
+/**
+ * Parse headers into an object
+ *
+ * ```
+ * Date: Wed, 27 Aug 2014 08:58:49 GMT
+ * Content-Type: application/json
+ * Connection: keep-alive
+ * Transfer-Encoding: chunked
+ * ```
+ *
+ * @param {String} rawHeaders Headers needing to be parsed
+ *
+ * @returns {Object} Headers parsed into an object
+ */
+const parseHeaders = rawHeaders => {
+ const parsed = {};
+ let key;
+ let val;
+ let i;
+
+ rawHeaders && rawHeaders.split('\n').forEach(function parser(line) {
+ i = line.indexOf(':');
+ key = line.substring(0, i).trim().toLowerCase();
+ val = line.substring(i + 1).trim();
+
+ if (!key || (parsed[key] && ignoreDuplicateOf[key])) {
+ return;
+ }
+
+ if (key === 'set-cookie') {
+ if (parsed[key]) {
+ parsed[key].push(val);
+ } else {
+ parsed[key] = [val];
+ }
+ } else {
+ parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;
+ }
+ });
+
+ return parsed;
+};
+
+const $internals = Symbol('internals');
+
+function normalizeHeader(header) {
+ return header && String(header).trim().toLowerCase();
+}
+
+function normalizeValue(value) {
+ if (value === false || value == null) {
+ return value;
+ }
+
+ return utils$1.isArray(value) ? value.map(normalizeValue) : String(value);
+}
+
+function parseTokens(str) {
+ const tokens = Object.create(null);
+ const tokensRE = /([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;
+ let match;
+
+ while ((match = tokensRE.exec(str))) {
+ tokens[match[1]] = match[2];
+ }
+
+ return tokens;
+}
+
+const isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim());
+
+function matchHeaderValue(context, value, header, filter, isHeaderNameFilter) {
+ if (utils$1.isFunction(filter)) {
+ return filter.call(this, value, header);
+ }
+
+ if (isHeaderNameFilter) {
+ value = header;
+ }
+
+ if (!utils$1.isString(value)) return;
+
+ if (utils$1.isString(filter)) {
+ return value.indexOf(filter) !== -1;
+ }
+
+ if (utils$1.isRegExp(filter)) {
+ return filter.test(value);
+ }
+}
+
+function formatHeader(header) {
+ return header.trim()
+ .toLowerCase().replace(/([a-z\d])(\w*)/g, (w, char, str) => {
+ return char.toUpperCase() + str;
+ });
+}
+
+function buildAccessors(obj, header) {
+ const accessorName = utils$1.toCamelCase(' ' + header);
+
+ ['get', 'set', 'has'].forEach(methodName => {
+ Object.defineProperty(obj, methodName + accessorName, {
+ value: function(arg1, arg2, arg3) {
+ return this[methodName].call(this, header, arg1, arg2, arg3);
+ },
+ configurable: true
+ });
+ });
+}
+
+class AxiosHeaders {
+ constructor(headers) {
+ headers && this.set(headers);
+ }
+
+ set(header, valueOrRewrite, rewrite) {
+ const self = this;
+
+ function setHeader(_value, _header, _rewrite) {
+ const lHeader = normalizeHeader(_header);
+
+ if (!lHeader) {
+ throw new Error('header name must be a non-empty string');
+ }
+
+ const key = utils$1.findKey(self, lHeader);
+
+ if(!key || self[key] === undefined || _rewrite === true || (_rewrite === undefined && self[key] !== false)) {
+ self[key || _header] = normalizeValue(_value);
+ }
+ }
+
+ const setHeaders = (headers, _rewrite) =>
+ utils$1.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite));
+
+ if (utils$1.isPlainObject(header) || header instanceof this.constructor) {
+ setHeaders(header, valueOrRewrite);
+ } else if(utils$1.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) {
+ setHeaders(parseHeaders(header), valueOrRewrite);
+ } else if (utils$1.isHeaders(header)) {
+ for (const [key, value] of header.entries()) {
+ setHeader(value, key, rewrite);
+ }
+ } else {
+ header != null && setHeader(valueOrRewrite, header, rewrite);
+ }
+
+ return this;
+ }
+
+ get(header, parser) {
+ header = normalizeHeader(header);
+
+ if (header) {
+ const key = utils$1.findKey(this, header);
+
+ if (key) {
+ const value = this[key];
+
+ if (!parser) {
+ return value;
+ }
+
+ if (parser === true) {
+ return parseTokens(value);
+ }
+
+ if (utils$1.isFunction(parser)) {
+ return parser.call(this, value, key);
+ }
+
+ if (utils$1.isRegExp(parser)) {
+ return parser.exec(value);
+ }
+
+ throw new TypeError('parser must be boolean|regexp|function');
+ }
+ }
+ }
+
+ has(header, matcher) {
+ header = normalizeHeader(header);
+
+ if (header) {
+ const key = utils$1.findKey(this, header);
+
+ return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher)));
+ }
+
+ return false;
+ }
+
+ delete(header, matcher) {
+ const self = this;
+ let deleted = false;
+
+ function deleteHeader(_header) {
+ _header = normalizeHeader(_header);
+
+ if (_header) {
+ const key = utils$1.findKey(self, _header);
+
+ if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) {
+ delete self[key];
+
+ deleted = true;
+ }
+ }
+ }
+
+ if (utils$1.isArray(header)) {
+ header.forEach(deleteHeader);
+ } else {
+ deleteHeader(header);
+ }
+
+ return deleted;
+ }
+
+ clear(matcher) {
+ const keys = Object.keys(this);
+ let i = keys.length;
+ let deleted = false;
+
+ while (i--) {
+ const key = keys[i];
+ if(!matcher || matchHeaderValue(this, this[key], key, matcher, true)) {
+ delete this[key];
+ deleted = true;
+ }
+ }
+
+ return deleted;
+ }
+
+ normalize(format) {
+ const self = this;
+ const headers = {};
+
+ utils$1.forEach(this, (value, header) => {
+ const key = utils$1.findKey(headers, header);
+
+ if (key) {
+ self[key] = normalizeValue(value);
+ delete self[header];
+ return;
+ }
+
+ const normalized = format ? formatHeader(header) : String(header).trim();
+
+ if (normalized !== header) {
+ delete self[header];
+ }
+
+ self[normalized] = normalizeValue(value);
+
+ headers[normalized] = true;
+ });
+
+ return this;
+ }
+
+ concat(...targets) {
+ return this.constructor.concat(this, ...targets);
+ }
+
+ toJSON(asStrings) {
+ const obj = Object.create(null);
+
+ utils$1.forEach(this, (value, header) => {
+ value != null && value !== false && (obj[header] = asStrings && utils$1.isArray(value) ? value.join(', ') : value);
+ });
+
+ return obj;
+ }
+
+ [Symbol.iterator]() {
+ return Object.entries(this.toJSON())[Symbol.iterator]();
+ }
+
+ toString() {
+ return Object.entries(this.toJSON()).map(([header, value]) => header + ': ' + value).join('\n');
+ }
+
+ get [Symbol.toStringTag]() {
+ return 'AxiosHeaders';
+ }
+
+ static from(thing) {
+ return thing instanceof this ? thing : new this(thing);
+ }
+
+ static concat(first, ...targets) {
+ const computed = new this(first);
+
+ targets.forEach((target) => computed.set(target));
+
+ return computed;
+ }
+
+ static accessor(header) {
+ const internals = this[$internals] = (this[$internals] = {
+ accessors: {}
+ });
+
+ const accessors = internals.accessors;
+ const prototype = this.prototype;
+
+ function defineAccessor(_header) {
+ const lHeader = normalizeHeader(_header);
+
+ if (!accessors[lHeader]) {
+ buildAccessors(prototype, _header);
+ accessors[lHeader] = true;
+ }
+ }
+
+ utils$1.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header);
+
+ return this;
+ }
+}
+
+AxiosHeaders.accessor(['Content-Type', 'Content-Length', 'Accept', 'Accept-Encoding', 'User-Agent', 'Authorization']);
+
+// reserved names hotfix
+utils$1.reduceDescriptors(AxiosHeaders.prototype, ({value}, key) => {
+ let mapped = key[0].toUpperCase() + key.slice(1); // map `set` => `Set`
+ return {
+ get: () => value,
+ set(headerValue) {
+ this[mapped] = headerValue;
+ }
+ }
+});
+
+utils$1.freezeMethods(AxiosHeaders);
+
+const AxiosHeaders$1 = AxiosHeaders;
+
+/**
+ * Transform the data for a request or a response
+ *
+ * @param {Array|Function} fns A single function or Array of functions
+ * @param {?Object} response The response object
+ *
+ * @returns {*} The resulting transformed data
+ */
+function transformData(fns, response) {
+ const config = this || defaults$1;
+ const context = response || config;
+ const headers = AxiosHeaders$1.from(context.headers);
+ let data = context.data;
+
+ utils$1.forEach(fns, function transform(fn) {
+ data = fn.call(config, data, headers.normalize(), response ? response.status : undefined);
+ });
+
+ headers.normalize();
+
+ return data;
+}
+
+function isCancel(value) {
+ return !!(value && value.__CANCEL__);
+}
+
+/**
+ * A `CanceledError` is an object that is thrown when an operation is canceled.
+ *
+ * @param {string=} message The message.
+ * @param {Object=} config The config.
+ * @param {Object=} request The request.
+ *
+ * @returns {CanceledError} The created error.
+ */
+function CanceledError(message, config, request) {
+ // eslint-disable-next-line no-eq-null,eqeqeq
+ AxiosError.call(this, message == null ? 'canceled' : message, AxiosError.ERR_CANCELED, config, request);
+ this.name = 'CanceledError';
+}
+
+utils$1.inherits(CanceledError, AxiosError, {
+ __CANCEL__: true
+});
+
+/**
+ * Resolve or reject a Promise based on response status.
+ *
+ * @param {Function} resolve A function that resolves the promise.
+ * @param {Function} reject A function that rejects the promise.
+ * @param {object} response The response.
+ *
+ * @returns {object} The response.
+ */
+function settle(resolve, reject, response) {
+ const validateStatus = response.config.validateStatus;
+ if (!response.status || !validateStatus || validateStatus(response.status)) {
+ resolve(response);
+ } else {
+ reject(new AxiosError(
+ 'Request failed with status code ' + response.status,
+ [AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],
+ response.config,
+ response.request,
+ response
+ ));
+ }
+}
+
+/**
+ * Determines whether the specified URL is absolute
+ *
+ * @param {string} url The URL to test
+ *
+ * @returns {boolean} True if the specified URL is absolute, otherwise false
+ */
+function isAbsoluteURL(url) {
+ // A URL is considered absolute if it begins with "://" or "//" (protocol-relative URL).
+ // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed
+ // by any combination of letters, digits, plus, period, or hyphen.
+ return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url);
+}
+
+/**
+ * Creates a new URL by combining the specified URLs
+ *
+ * @param {string} baseURL The base URL
+ * @param {string} relativeURL The relative URL
+ *
+ * @returns {string} The combined URL
+ */
+function combineURLs(baseURL, relativeURL) {
+ return relativeURL
+ ? baseURL.replace(/\/?\/$/, '') + '/' + relativeURL.replace(/^\/+/, '')
+ : baseURL;
+}
+
+/**
+ * Creates a new URL by combining the baseURL with the requestedURL,
+ * only when the requestedURL is not already an absolute URL.
+ * If the requestURL is absolute, this function returns the requestedURL untouched.
+ *
+ * @param {string} baseURL The base URL
+ * @param {string} requestedURL Absolute or relative URL to combine
+ *
+ * @returns {string} The combined full path
+ */
+function buildFullPath(baseURL, requestedURL, allowAbsoluteUrls) {
+ let isRelativeUrl = !isAbsoluteURL(requestedURL);
+ if (baseURL && (isRelativeUrl || allowAbsoluteUrls == false)) {
+ return combineURLs(baseURL, requestedURL);
+ }
+ return requestedURL;
+}
+
+const VERSION = "1.8.4";
+
+function parseProtocol(url) {
+ const match = /^([-+\w]{1,25})(:?\/\/|:)/.exec(url);
+ return match && match[1] || '';
+}
+
+const DATA_URL_PATTERN = /^(?:([^;]+);)?(?:[^;]+;)?(base64|),([\s\S]*)$/;
+
+/**
+ * Parse data uri to a Buffer or Blob
+ *
+ * @param {String} uri
+ * @param {?Boolean} asBlob
+ * @param {?Object} options
+ * @param {?Function} options.Blob
+ *
+ * @returns {Buffer|Blob}
+ */
+function fromDataURI(uri, asBlob, options) {
+ const _Blob = options && options.Blob || platform.classes.Blob;
+ const protocol = parseProtocol(uri);
+
+ if (asBlob === undefined && _Blob) {
+ asBlob = true;
+ }
+
+ if (protocol === 'data') {
+ uri = protocol.length ? uri.slice(protocol.length + 1) : uri;
+
+ const match = DATA_URL_PATTERN.exec(uri);
+
+ if (!match) {
+ throw new AxiosError('Invalid URL', AxiosError.ERR_INVALID_URL);
+ }
+
+ const mime = match[1];
+ const isBase64 = match[2];
+ const body = match[3];
+ const buffer = Buffer.from(decodeURIComponent(body), isBase64 ? 'base64' : 'utf8');
+
+ if (asBlob) {
+ if (!_Blob) {
+ throw new AxiosError('Blob is not supported', AxiosError.ERR_NOT_SUPPORT);
+ }
+
+ return new _Blob([buffer], {type: mime});
+ }
+
+ return buffer;
+ }
+
+ throw new AxiosError('Unsupported protocol ' + protocol, AxiosError.ERR_NOT_SUPPORT);
+}
+
+const kInternals = Symbol('internals');
+
+class AxiosTransformStream extends stream__default["default"].Transform{
+ constructor(options) {
+ options = utils$1.toFlatObject(options, {
+ maxRate: 0,
+ chunkSize: 64 * 1024,
+ minChunkSize: 100,
+ timeWindow: 500,
+ ticksRate: 2,
+ samplesCount: 15
+ }, null, (prop, source) => {
+ return !utils$1.isUndefined(source[prop]);
+ });
+
+ super({
+ readableHighWaterMark: options.chunkSize
+ });
+
+ const internals = this[kInternals] = {
+ timeWindow: options.timeWindow,
+ chunkSize: options.chunkSize,
+ maxRate: options.maxRate,
+ minChunkSize: options.minChunkSize,
+ bytesSeen: 0,
+ isCaptured: false,
+ notifiedBytesLoaded: 0,
+ ts: Date.now(),
+ bytes: 0,
+ onReadCallback: null
+ };
+
+ this.on('newListener', event => {
+ if (event === 'progress') {
+ if (!internals.isCaptured) {
+ internals.isCaptured = true;
+ }
+ }
+ });
+ }
+
+ _read(size) {
+ const internals = this[kInternals];
+
+ if (internals.onReadCallback) {
+ internals.onReadCallback();
+ }
+
+ return super._read(size);
+ }
+
+ _transform(chunk, encoding, callback) {
+ const internals = this[kInternals];
+ const maxRate = internals.maxRate;
+
+ const readableHighWaterMark = this.readableHighWaterMark;
+
+ const timeWindow = internals.timeWindow;
+
+ const divider = 1000 / timeWindow;
+ const bytesThreshold = (maxRate / divider);
+ const minChunkSize = internals.minChunkSize !== false ? Math.max(internals.minChunkSize, bytesThreshold * 0.01) : 0;
+
+ const pushChunk = (_chunk, _callback) => {
+ const bytes = Buffer.byteLength(_chunk);
+ internals.bytesSeen += bytes;
+ internals.bytes += bytes;
+
+ internals.isCaptured && this.emit('progress', internals.bytesSeen);
+
+ if (this.push(_chunk)) {
+ process.nextTick(_callback);
+ } else {
+ internals.onReadCallback = () => {
+ internals.onReadCallback = null;
+ process.nextTick(_callback);
+ };
+ }
+ };
+
+ const transformChunk = (_chunk, _callback) => {
+ const chunkSize = Buffer.byteLength(_chunk);
+ let chunkRemainder = null;
+ let maxChunkSize = readableHighWaterMark;
+ let bytesLeft;
+ let passed = 0;
+
+ if (maxRate) {
+ const now = Date.now();
+
+ if (!internals.ts || (passed = (now - internals.ts)) >= timeWindow) {
+ internals.ts = now;
+ bytesLeft = bytesThreshold - internals.bytes;
+ internals.bytes = bytesLeft < 0 ? -bytesLeft : 0;
+ passed = 0;
+ }
+
+ bytesLeft = bytesThreshold - internals.bytes;
+ }
+
+ if (maxRate) {
+ if (bytesLeft <= 0) {
+ // next time window
+ return setTimeout(() => {
+ _callback(null, _chunk);
+ }, timeWindow - passed);
+ }
+
+ if (bytesLeft < maxChunkSize) {
+ maxChunkSize = bytesLeft;
+ }
+ }
+
+ if (maxChunkSize && chunkSize > maxChunkSize && (chunkSize - maxChunkSize) > minChunkSize) {
+ chunkRemainder = _chunk.subarray(maxChunkSize);
+ _chunk = _chunk.subarray(0, maxChunkSize);
+ }
+
+ pushChunk(_chunk, chunkRemainder ? () => {
+ process.nextTick(_callback, null, chunkRemainder);
+ } : _callback);
+ };
+
+ transformChunk(chunk, function transformNextChunk(err, _chunk) {
+ if (err) {
+ return callback(err);
+ }
+
+ if (_chunk) {
+ transformChunk(_chunk, transformNextChunk);
+ } else {
+ callback(null);
+ }
+ });
+ }
+}
+
+const AxiosTransformStream$1 = AxiosTransformStream;
+
+const {asyncIterator} = Symbol;
+
+const readBlob = async function* (blob) {
+ if (blob.stream) {
+ yield* blob.stream();
+ } else if (blob.arrayBuffer) {
+ yield await blob.arrayBuffer();
+ } else if (blob[asyncIterator]) {
+ yield* blob[asyncIterator]();
+ } else {
+ yield blob;
+ }
+};
+
+const readBlob$1 = readBlob;
+
+const BOUNDARY_ALPHABET = platform.ALPHABET.ALPHA_DIGIT + '-_';
+
+const textEncoder = typeof TextEncoder === 'function' ? new TextEncoder() : new util__default["default"].TextEncoder();
+
+const CRLF = '\r\n';
+const CRLF_BYTES = textEncoder.encode(CRLF);
+const CRLF_BYTES_COUNT = 2;
+
+class FormDataPart {
+ constructor(name, value) {
+ const {escapeName} = this.constructor;
+ const isStringValue = utils$1.isString(value);
+
+ let headers = `Content-Disposition: form-data; name="${escapeName(name)}"${
+ !isStringValue && value.name ? `; filename="${escapeName(value.name)}"` : ''
+ }${CRLF}`;
+
+ if (isStringValue) {
+ value = textEncoder.encode(String(value).replace(/\r?\n|\r\n?/g, CRLF));
+ } else {
+ headers += `Content-Type: ${value.type || "application/octet-stream"}${CRLF}`;
+ }
+
+ this.headers = textEncoder.encode(headers + CRLF);
+
+ this.contentLength = isStringValue ? value.byteLength : value.size;
+
+ this.size = this.headers.byteLength + this.contentLength + CRLF_BYTES_COUNT;
+
+ this.name = name;
+ this.value = value;
+ }
+
+ async *encode(){
+ yield this.headers;
+
+ const {value} = this;
+
+ if(utils$1.isTypedArray(value)) {
+ yield value;
+ } else {
+ yield* readBlob$1(value);
+ }
+
+ yield CRLF_BYTES;
+ }
+
+ static escapeName(name) {
+ return String(name).replace(/[\r\n"]/g, (match) => ({
+ '\r' : '%0D',
+ '\n' : '%0A',
+ '"' : '%22',
+ }[match]));
+ }
+}
+
+const formDataToStream = (form, headersHandler, options) => {
+ const {
+ tag = 'form-data-boundary',
+ size = 25,
+ boundary = tag + '-' + platform.generateString(size, BOUNDARY_ALPHABET)
+ } = options || {};
+
+ if(!utils$1.isFormData(form)) {
+ throw TypeError('FormData instance required');
+ }
+
+ if (boundary.length < 1 || boundary.length > 70) {
+ throw Error('boundary must be 10-70 characters long')
+ }
+
+ const boundaryBytes = textEncoder.encode('--' + boundary + CRLF);
+ const footerBytes = textEncoder.encode('--' + boundary + '--' + CRLF + CRLF);
+ let contentLength = footerBytes.byteLength;
+
+ const parts = Array.from(form.entries()).map(([name, value]) => {
+ const part = new FormDataPart(name, value);
+ contentLength += part.size;
+ return part;
+ });
+
+ contentLength += boundaryBytes.byteLength * parts.length;
+
+ contentLength = utils$1.toFiniteNumber(contentLength);
+
+ const computedHeaders = {
+ 'Content-Type': `multipart/form-data; boundary=${boundary}`
+ };
+
+ if (Number.isFinite(contentLength)) {
+ computedHeaders['Content-Length'] = contentLength;
+ }
+
+ headersHandler && headersHandler(computedHeaders);
+
+ return stream.Readable.from((async function *() {
+ for(const part of parts) {
+ yield boundaryBytes;
+ yield* part.encode();
+ }
+
+ yield footerBytes;
+ })());
+};
+
+const formDataToStream$1 = formDataToStream;
+
+class ZlibHeaderTransformStream extends stream__default["default"].Transform {
+ __transform(chunk, encoding, callback) {
+ this.push(chunk);
+ callback();
+ }
+
+ _transform(chunk, encoding, callback) {
+ if (chunk.length !== 0) {
+ this._transform = this.__transform;
+
+ // Add Default Compression headers if no zlib headers are present
+ if (chunk[0] !== 120) { // Hex: 78
+ const header = Buffer.alloc(2);
+ header[0] = 120; // Hex: 78
+ header[1] = 156; // Hex: 9C
+ this.push(header, encoding);
+ }
+ }
+
+ this.__transform(chunk, encoding, callback);
+ }
+}
+
+const ZlibHeaderTransformStream$1 = ZlibHeaderTransformStream;
+
+const callbackify = (fn, reducer) => {
+ return utils$1.isAsyncFn(fn) ? function (...args) {
+ const cb = args.pop();
+ fn.apply(this, args).then((value) => {
+ try {
+ reducer ? cb(null, ...reducer(value)) : cb(null, value);
+ } catch (err) {
+ cb(err);
+ }
+ }, cb);
+ } : fn;
+};
+
+const callbackify$1 = callbackify;
+
+/**
+ * Calculate data maxRate
+ * @param {Number} [samplesCount= 10]
+ * @param {Number} [min= 1000]
+ * @returns {Function}
+ */
+function speedometer(samplesCount, min) {
+ samplesCount = samplesCount || 10;
+ const bytes = new Array(samplesCount);
+ const timestamps = new Array(samplesCount);
+ let head = 0;
+ let tail = 0;
+ let firstSampleTS;
+
+ min = min !== undefined ? min : 1000;
+
+ return function push(chunkLength) {
+ const now = Date.now();
+
+ const startedAt = timestamps[tail];
+
+ if (!firstSampleTS) {
+ firstSampleTS = now;
+ }
+
+ bytes[head] = chunkLength;
+ timestamps[head] = now;
+
+ let i = tail;
+ let bytesCount = 0;
+
+ while (i !== head) {
+ bytesCount += bytes[i++];
+ i = i % samplesCount;
+ }
+
+ head = (head + 1) % samplesCount;
+
+ if (head === tail) {
+ tail = (tail + 1) % samplesCount;
+ }
+
+ if (now - firstSampleTS < min) {
+ return;
+ }
+
+ const passed = startedAt && now - startedAt;
+
+ return passed ? Math.round(bytesCount * 1000 / passed) : undefined;
+ };
+}
+
+/**
+ * Throttle decorator
+ * @param {Function} fn
+ * @param {Number} freq
+ * @return {Function}
+ */
+function throttle(fn, freq) {
+ let timestamp = 0;
+ let threshold = 1000 / freq;
+ let lastArgs;
+ let timer;
+
+ const invoke = (args, now = Date.now()) => {
+ timestamp = now;
+ lastArgs = null;
+ if (timer) {
+ clearTimeout(timer);
+ timer = null;
+ }
+ fn.apply(null, args);
+ };
+
+ const throttled = (...args) => {
+ const now = Date.now();
+ const passed = now - timestamp;
+ if ( passed >= threshold) {
+ invoke(args, now);
+ } else {
+ lastArgs = args;
+ if (!timer) {
+ timer = setTimeout(() => {
+ timer = null;
+ invoke(lastArgs);
+ }, threshold - passed);
+ }
+ }
+ };
+
+ const flush = () => lastArgs && invoke(lastArgs);
+
+ return [throttled, flush];
+}
+
+const progressEventReducer = (listener, isDownloadStream, freq = 3) => {
+ let bytesNotified = 0;
+ const _speedometer = speedometer(50, 250);
+
+ return throttle(e => {
+ const loaded = e.loaded;
+ const total = e.lengthComputable ? e.total : undefined;
+ const progressBytes = loaded - bytesNotified;
+ const rate = _speedometer(progressBytes);
+ const inRange = loaded <= total;
+
+ bytesNotified = loaded;
+
+ const data = {
+ loaded,
+ total,
+ progress: total ? (loaded / total) : undefined,
+ bytes: progressBytes,
+ rate: rate ? rate : undefined,
+ estimated: rate && total && inRange ? (total - loaded) / rate : undefined,
+ event: e,
+ lengthComputable: total != null,
+ [isDownloadStream ? 'download' : 'upload']: true
+ };
+
+ listener(data);
+ }, freq);
+};
+
+const progressEventDecorator = (total, throttled) => {
+ const lengthComputable = total != null;
+
+ return [(loaded) => throttled[0]({
+ lengthComputable,
+ total,
+ loaded
+ }), throttled[1]];
+};
+
+const asyncDecorator = (fn) => (...args) => utils$1.asap(() => fn(...args));
+
+const zlibOptions = {
+ flush: zlib__default["default"].constants.Z_SYNC_FLUSH,
+ finishFlush: zlib__default["default"].constants.Z_SYNC_FLUSH
+};
+
+const brotliOptions = {
+ flush: zlib__default["default"].constants.BROTLI_OPERATION_FLUSH,
+ finishFlush: zlib__default["default"].constants.BROTLI_OPERATION_FLUSH
+};
+
+const isBrotliSupported = utils$1.isFunction(zlib__default["default"].createBrotliDecompress);
+
+const {http: httpFollow, https: httpsFollow} = followRedirects__default["default"];
+
+const isHttps = /https:?/;
+
+const supportedProtocols = platform.protocols.map(protocol => {
+ return protocol + ':';
+});
+
+const flushOnFinish = (stream, [throttled, flush]) => {
+ stream
+ .on('end', flush)
+ .on('error', flush);
+
+ return throttled;
+};
+
+/**
+ * If the proxy or config beforeRedirects functions are defined, call them with the options
+ * object.
+ *
+ * @param {Object} options - The options object that was passed to the request.
+ *
+ * @returns {Object}
+ */
+function dispatchBeforeRedirect(options, responseDetails) {
+ if (options.beforeRedirects.proxy) {
+ options.beforeRedirects.proxy(options);
+ }
+ if (options.beforeRedirects.config) {
+ options.beforeRedirects.config(options, responseDetails);
+ }
+}
+
+/**
+ * If the proxy or config afterRedirects functions are defined, call them with the options
+ *
+ * @param {http.ClientRequestArgs} options
+ * @param {AxiosProxyConfig} configProxy configuration from Axios options object
+ * @param {string} location
+ *
+ * @returns {http.ClientRequestArgs}
+ */
+function setProxy(options, configProxy, location) {
+ let proxy = configProxy;
+ if (!proxy && proxy !== false) {
+ const proxyUrl = proxyFromEnv__default["default"].getProxyForUrl(location);
+ if (proxyUrl) {
+ proxy = new URL(proxyUrl);
+ }
+ }
+ if (proxy) {
+ // Basic proxy authorization
+ if (proxy.username) {
+ proxy.auth = (proxy.username || '') + ':' + (proxy.password || '');
+ }
+
+ if (proxy.auth) {
+ // Support proxy auth object form
+ if (proxy.auth.username || proxy.auth.password) {
+ proxy.auth = (proxy.auth.username || '') + ':' + (proxy.auth.password || '');
+ }
+ const base64 = Buffer
+ .from(proxy.auth, 'utf8')
+ .toString('base64');
+ options.headers['Proxy-Authorization'] = 'Basic ' + base64;
+ }
+
+ options.headers.host = options.hostname + (options.port ? ':' + options.port : '');
+ const proxyHost = proxy.hostname || proxy.host;
+ options.hostname = proxyHost;
+ // Replace 'host' since options is not a URL object
+ options.host = proxyHost;
+ options.port = proxy.port;
+ options.path = location;
+ if (proxy.protocol) {
+ options.protocol = proxy.protocol.includes(':') ? proxy.protocol : `${proxy.protocol}:`;
+ }
+ }
+
+ options.beforeRedirects.proxy = function beforeRedirect(redirectOptions) {
+ // Configure proxy for redirected request, passing the original config proxy to apply
+ // the exact same logic as if the redirected request was performed by axios directly.
+ setProxy(redirectOptions, configProxy, redirectOptions.href);
+ };
+}
+
+const isHttpAdapterSupported = typeof process !== 'undefined' && utils$1.kindOf(process) === 'process';
+
+// temporary hotfix
+
+const wrapAsync = (asyncExecutor) => {
+ return new Promise((resolve, reject) => {
+ let onDone;
+ let isDone;
+
+ const done = (value, isRejected) => {
+ if (isDone) return;
+ isDone = true;
+ onDone && onDone(value, isRejected);
+ };
+
+ const _resolve = (value) => {
+ done(value);
+ resolve(value);
+ };
+
+ const _reject = (reason) => {
+ done(reason, true);
+ reject(reason);
+ };
+
+ asyncExecutor(_resolve, _reject, (onDoneHandler) => (onDone = onDoneHandler)).catch(_reject);
+ })
+};
+
+const resolveFamily = ({address, family}) => {
+ if (!utils$1.isString(address)) {
+ throw TypeError('address must be a string');
+ }
+ return ({
+ address,
+ family: family || (address.indexOf('.') < 0 ? 6 : 4)
+ });
+};
+
+const buildAddressEntry = (address, family) => resolveFamily(utils$1.isObject(address) ? address : {address, family});
+
+/*eslint consistent-return:0*/
+const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) {
+ return wrapAsync(async function dispatchHttpRequest(resolve, reject, onDone) {
+ let {data, lookup, family} = config;
+ const {responseType, responseEncoding} = config;
+ const method = config.method.toUpperCase();
+ let isDone;
+ let rejected = false;
+ let req;
+
+ if (lookup) {
+ const _lookup = callbackify$1(lookup, (value) => utils$1.isArray(value) ? value : [value]);
+ // hotfix to support opt.all option which is required for node 20.x
+ lookup = (hostname, opt, cb) => {
+ _lookup(hostname, opt, (err, arg0, arg1) => {
+ if (err) {
+ return cb(err);
+ }
+
+ const addresses = utils$1.isArray(arg0) ? arg0.map(addr => buildAddressEntry(addr)) : [buildAddressEntry(arg0, arg1)];
+
+ opt.all ? cb(err, addresses) : cb(err, addresses[0].address, addresses[0].family);
+ });
+ };
+ }
+
+ // temporary internal emitter until the AxiosRequest class will be implemented
+ const emitter = new events.EventEmitter();
+
+ const onFinished = () => {
+ if (config.cancelToken) {
+ config.cancelToken.unsubscribe(abort);
+ }
+
+ if (config.signal) {
+ config.signal.removeEventListener('abort', abort);
+ }
+
+ emitter.removeAllListeners();
+ };
+
+ onDone((value, isRejected) => {
+ isDone = true;
+ if (isRejected) {
+ rejected = true;
+ onFinished();
+ }
+ });
+
+ function abort(reason) {
+ emitter.emit('abort', !reason || reason.type ? new CanceledError(null, config, req) : reason);
+ }
+
+ emitter.once('abort', reject);
+
+ if (config.cancelToken || config.signal) {
+ config.cancelToken && config.cancelToken.subscribe(abort);
+ if (config.signal) {
+ config.signal.aborted ? abort() : config.signal.addEventListener('abort', abort);
+ }
+ }
+
+ // Parse url
+ const fullPath = buildFullPath(config.baseURL, config.url, config.allowAbsoluteUrls);
+ const parsed = new URL(fullPath, platform.hasBrowserEnv ? platform.origin : undefined);
+ const protocol = parsed.protocol || supportedProtocols[0];
+
+ if (protocol === 'data:') {
+ let convertedData;
+
+ if (method !== 'GET') {
+ return settle(resolve, reject, {
+ status: 405,
+ statusText: 'method not allowed',
+ headers: {},
+ config
+ });
+ }
+
+ try {
+ convertedData = fromDataURI(config.url, responseType === 'blob', {
+ Blob: config.env && config.env.Blob
+ });
+ } catch (err) {
+ throw AxiosError.from(err, AxiosError.ERR_BAD_REQUEST, config);
+ }
+
+ if (responseType === 'text') {
+ convertedData = convertedData.toString(responseEncoding);
+
+ if (!responseEncoding || responseEncoding === 'utf8') {
+ convertedData = utils$1.stripBOM(convertedData);
+ }
+ } else if (responseType === 'stream') {
+ convertedData = stream__default["default"].Readable.from(convertedData);
+ }
+
+ return settle(resolve, reject, {
+ data: convertedData,
+ status: 200,
+ statusText: 'OK',
+ headers: new AxiosHeaders$1(),
+ config
+ });
+ }
+
+ if (supportedProtocols.indexOf(protocol) === -1) {
+ return reject(new AxiosError(
+ 'Unsupported protocol ' + protocol,
+ AxiosError.ERR_BAD_REQUEST,
+ config
+ ));
+ }
+
+ const headers = AxiosHeaders$1.from(config.headers).normalize();
+
+ // Set User-Agent (required by some servers)
+ // See https://github.com/axios/axios/issues/69
+ // User-Agent is specified; handle case where no UA header is desired
+ // Only set header if it hasn't been set in config
+ headers.set('User-Agent', 'axios/' + VERSION, false);
+
+ const {onUploadProgress, onDownloadProgress} = config;
+ const maxRate = config.maxRate;
+ let maxUploadRate = undefined;
+ let maxDownloadRate = undefined;
+
+ // support for spec compliant FormData objects
+ if (utils$1.isSpecCompliantForm(data)) {
+ const userBoundary = headers.getContentType(/boundary=([-_\w\d]{10,70})/i);
+
+ data = formDataToStream$1(data, (formHeaders) => {
+ headers.set(formHeaders);
+ }, {
+ tag: `axios-${VERSION}-boundary`,
+ boundary: userBoundary && userBoundary[1] || undefined
+ });
+ // support for https://www.npmjs.com/package/form-data api
+ } else if (utils$1.isFormData(data) && utils$1.isFunction(data.getHeaders)) {
+ headers.set(data.getHeaders());
+
+ if (!headers.hasContentLength()) {
+ try {
+ const knownLength = await util__default["default"].promisify(data.getLength).call(data);
+ Number.isFinite(knownLength) && knownLength >= 0 && headers.setContentLength(knownLength);
+ /*eslint no-empty:0*/
+ } catch (e) {
+ }
+ }
+ } else if (utils$1.isBlob(data) || utils$1.isFile(data)) {
+ data.size && headers.setContentType(data.type || 'application/octet-stream');
+ headers.setContentLength(data.size || 0);
+ data = stream__default["default"].Readable.from(readBlob$1(data));
+ } else if (data && !utils$1.isStream(data)) {
+ if (Buffer.isBuffer(data)) ; else if (utils$1.isArrayBuffer(data)) {
+ data = Buffer.from(new Uint8Array(data));
+ } else if (utils$1.isString(data)) {
+ data = Buffer.from(data, 'utf-8');
+ } else {
+ return reject(new AxiosError(
+ 'Data after transformation must be a string, an ArrayBuffer, a Buffer, or a Stream',
+ AxiosError.ERR_BAD_REQUEST,
+ config
+ ));
+ }
+
+ // Add Content-Length header if data exists
+ headers.setContentLength(data.length, false);
+
+ if (config.maxBodyLength > -1 && data.length > config.maxBodyLength) {
+ return reject(new AxiosError(
+ 'Request body larger than maxBodyLength limit',
+ AxiosError.ERR_BAD_REQUEST,
+ config
+ ));
+ }
+ }
+
+ const contentLength = utils$1.toFiniteNumber(headers.getContentLength());
+
+ if (utils$1.isArray(maxRate)) {
+ maxUploadRate = maxRate[0];
+ maxDownloadRate = maxRate[1];
+ } else {
+ maxUploadRate = maxDownloadRate = maxRate;
+ }
+
+ if (data && (onUploadProgress || maxUploadRate)) {
+ if (!utils$1.isStream(data)) {
+ data = stream__default["default"].Readable.from(data, {objectMode: false});
+ }
+
+ data = stream__default["default"].pipeline([data, new AxiosTransformStream$1({
+ maxRate: utils$1.toFiniteNumber(maxUploadRate)
+ })], utils$1.noop);
+
+ onUploadProgress && data.on('progress', flushOnFinish(
+ data,
+ progressEventDecorator(
+ contentLength,
+ progressEventReducer(asyncDecorator(onUploadProgress), false, 3)
+ )
+ ));
+ }
+
+ // HTTP basic authentication
+ let auth = undefined;
+ if (config.auth) {
+ const username = config.auth.username || '';
+ const password = config.auth.password || '';
+ auth = username + ':' + password;
+ }
+
+ if (!auth && parsed.username) {
+ const urlUsername = parsed.username;
+ const urlPassword = parsed.password;
+ auth = urlUsername + ':' + urlPassword;
+ }
+
+ auth && headers.delete('authorization');
+
+ let path;
+
+ try {
+ path = buildURL(
+ parsed.pathname + parsed.search,
+ config.params,
+ config.paramsSerializer
+ ).replace(/^\?/, '');
+ } catch (err) {
+ const customErr = new Error(err.message);
+ customErr.config = config;
+ customErr.url = config.url;
+ customErr.exists = true;
+ return reject(customErr);
+ }
+
+ headers.set(
+ 'Accept-Encoding',
+ 'gzip, compress, deflate' + (isBrotliSupported ? ', br' : ''), false
+ );
+
+ const options = {
+ path,
+ method: method,
+ headers: headers.toJSON(),
+ agents: { http: config.httpAgent, https: config.httpsAgent },
+ auth,
+ protocol,
+ family,
+ beforeRedirect: dispatchBeforeRedirect,
+ beforeRedirects: {}
+ };
+
+ // cacheable-lookup integration hotfix
+ !utils$1.isUndefined(lookup) && (options.lookup = lookup);
+
+ if (config.socketPath) {
+ options.socketPath = config.socketPath;
+ } else {
+ options.hostname = parsed.hostname.startsWith("[") ? parsed.hostname.slice(1, -1) : parsed.hostname;
+ options.port = parsed.port;
+ setProxy(options, config.proxy, protocol + '//' + parsed.hostname + (parsed.port ? ':' + parsed.port : '') + options.path);
+ }
+
+ let transport;
+ const isHttpsRequest = isHttps.test(options.protocol);
+ options.agent = isHttpsRequest ? config.httpsAgent : config.httpAgent;
+ if (config.transport) {
+ transport = config.transport;
+ } else if (config.maxRedirects === 0) {
+ transport = isHttpsRequest ? https__default["default"] : http__default["default"];
+ } else {
+ if (config.maxRedirects) {
+ options.maxRedirects = config.maxRedirects;
+ }
+ if (config.beforeRedirect) {
+ options.beforeRedirects.config = config.beforeRedirect;
+ }
+ transport = isHttpsRequest ? httpsFollow : httpFollow;
+ }
+
+ if (config.maxBodyLength > -1) {
+ options.maxBodyLength = config.maxBodyLength;
+ } else {
+ // follow-redirects does not skip comparison, so it should always succeed for axios -1 unlimited
+ options.maxBodyLength = Infinity;
+ }
+
+ if (config.insecureHTTPParser) {
+ options.insecureHTTPParser = config.insecureHTTPParser;
+ }
+
+ // Create the request
+ req = transport.request(options, function handleResponse(res) {
+ if (req.destroyed) return;
+
+ const streams = [res];
+
+ const responseLength = +res.headers['content-length'];
+
+ if (onDownloadProgress || maxDownloadRate) {
+ const transformStream = new AxiosTransformStream$1({
+ maxRate: utils$1.toFiniteNumber(maxDownloadRate)
+ });
+
+ onDownloadProgress && transformStream.on('progress', flushOnFinish(
+ transformStream,
+ progressEventDecorator(
+ responseLength,
+ progressEventReducer(asyncDecorator(onDownloadProgress), true, 3)
+ )
+ ));
+
+ streams.push(transformStream);
+ }
+
+ // decompress the response body transparently if required
+ let responseStream = res;
+
+ // return the last request in case of redirects
+ const lastRequest = res.req || req;
+
+ // if decompress disabled we should not decompress
+ if (config.decompress !== false && res.headers['content-encoding']) {
+ // if no content, but headers still say that it is encoded,
+ // remove the header not confuse downstream operations
+ if (method === 'HEAD' || res.statusCode === 204) {
+ delete res.headers['content-encoding'];
+ }
+
+ switch ((res.headers['content-encoding'] || '').toLowerCase()) {
+ /*eslint default-case:0*/
+ case 'gzip':
+ case 'x-gzip':
+ case 'compress':
+ case 'x-compress':
+ // add the unzipper to the body stream processing pipeline
+ streams.push(zlib__default["default"].createUnzip(zlibOptions));
+
+ // remove the content-encoding in order to not confuse downstream operations
+ delete res.headers['content-encoding'];
+ break;
+ case 'deflate':
+ streams.push(new ZlibHeaderTransformStream$1());
+
+ // add the unzipper to the body stream processing pipeline
+ streams.push(zlib__default["default"].createUnzip(zlibOptions));
+
+ // remove the content-encoding in order to not confuse downstream operations
+ delete res.headers['content-encoding'];
+ break;
+ case 'br':
+ if (isBrotliSupported) {
+ streams.push(zlib__default["default"].createBrotliDecompress(brotliOptions));
+ delete res.headers['content-encoding'];
+ }
+ }
+ }
+
+ responseStream = streams.length > 1 ? stream__default["default"].pipeline(streams, utils$1.noop) : streams[0];
+
+ const offListeners = stream__default["default"].finished(responseStream, () => {
+ offListeners();
+ onFinished();
+ });
+
+ const response = {
+ status: res.statusCode,
+ statusText: res.statusMessage,
+ headers: new AxiosHeaders$1(res.headers),
+ config,
+ request: lastRequest
+ };
+
+ if (responseType === 'stream') {
+ response.data = responseStream;
+ settle(resolve, reject, response);
+ } else {
+ const responseBuffer = [];
+ let totalResponseBytes = 0;
+
+ responseStream.on('data', function handleStreamData(chunk) {
+ responseBuffer.push(chunk);
+ totalResponseBytes += chunk.length;
+
+ // make sure the content length is not over the maxContentLength if specified
+ if (config.maxContentLength > -1 && totalResponseBytes > config.maxContentLength) {
+ // stream.destroy() emit aborted event before calling reject() on Node.js v16
+ rejected = true;
+ responseStream.destroy();
+ reject(new AxiosError('maxContentLength size of ' + config.maxContentLength + ' exceeded',
+ AxiosError.ERR_BAD_RESPONSE, config, lastRequest));
+ }
+ });
+
+ responseStream.on('aborted', function handlerStreamAborted() {
+ if (rejected) {
+ return;
+ }
+
+ const err = new AxiosError(
+ 'stream has been aborted',
+ AxiosError.ERR_BAD_RESPONSE,
+ config,
+ lastRequest
+ );
+ responseStream.destroy(err);
+ reject(err);
+ });
+
+ responseStream.on('error', function handleStreamError(err) {
+ if (req.destroyed) return;
+ reject(AxiosError.from(err, null, config, lastRequest));
+ });
+
+ responseStream.on('end', function handleStreamEnd() {
+ try {
+ let responseData = responseBuffer.length === 1 ? responseBuffer[0] : Buffer.concat(responseBuffer);
+ if (responseType !== 'arraybuffer') {
+ responseData = responseData.toString(responseEncoding);
+ if (!responseEncoding || responseEncoding === 'utf8') {
+ responseData = utils$1.stripBOM(responseData);
+ }
+ }
+ response.data = responseData;
+ } catch (err) {
+ return reject(AxiosError.from(err, null, config, response.request, response));
+ }
+ settle(resolve, reject, response);
+ });
+ }
+
+ emitter.once('abort', err => {
+ if (!responseStream.destroyed) {
+ responseStream.emit('error', err);
+ responseStream.destroy();
+ }
+ });
+ });
+
+ emitter.once('abort', err => {
+ reject(err);
+ req.destroy(err);
+ });
+
+ // Handle errors
+ req.on('error', function handleRequestError(err) {
+ // @todo remove
+ // if (req.aborted && err.code !== AxiosError.ERR_FR_TOO_MANY_REDIRECTS) return;
+ reject(AxiosError.from(err, null, config, req));
+ });
+
+ // set tcp keep alive to prevent drop connection by peer
+ req.on('socket', function handleRequestSocket(socket) {
+ // default interval of sending ack packet is 1 minute
+ socket.setKeepAlive(true, 1000 * 60);
+ });
+
+ // Handle request timeout
+ if (config.timeout) {
+ // This is forcing a int timeout to avoid problems if the `req` interface doesn't handle other types.
+ const timeout = parseInt(config.timeout, 10);
+
+ if (Number.isNaN(timeout)) {
+ reject(new AxiosError(
+ 'error trying to parse `config.timeout` to int',
+ AxiosError.ERR_BAD_OPTION_VALUE,
+ config,
+ req
+ ));
+
+ return;
+ }
+
+ // Sometime, the response will be very slow, and does not respond, the connect event will be block by event loop system.
+ // And timer callback will be fired, and abort() will be invoked before connection, then get "socket hang up" and code ECONNRESET.
+ // At this time, if we have a large number of request, nodejs will hang up some socket on background. and the number will up and up.
+ // And then these socket which be hang up will devouring CPU little by little.
+ // ClientRequest.setTimeout will be fired on the specify milliseconds, and can make sure that abort() will be fired after connect.
+ req.setTimeout(timeout, function handleRequestTimeout() {
+ if (isDone) return;
+ let timeoutErrorMessage = config.timeout ? 'timeout of ' + config.timeout + 'ms exceeded' : 'timeout exceeded';
+ const transitional = config.transitional || transitionalDefaults;
+ if (config.timeoutErrorMessage) {
+ timeoutErrorMessage = config.timeoutErrorMessage;
+ }
+ reject(new AxiosError(
+ timeoutErrorMessage,
+ transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,
+ config,
+ req
+ ));
+ abort();
+ });
+ }
+
+
+ // Send the request
+ if (utils$1.isStream(data)) {
+ let ended = false;
+ let errored = false;
+
+ data.on('end', () => {
+ ended = true;
+ });
+
+ data.once('error', err => {
+ errored = true;
+ req.destroy(err);
+ });
+
+ data.on('close', () => {
+ if (!ended && !errored) {
+ abort(new CanceledError('Request stream has been aborted', config, req));
+ }
+ });
+
+ data.pipe(req);
+ } else {
+ req.end(data);
+ }
+ });
+};
+
+const isURLSameOrigin = platform.hasStandardBrowserEnv ? ((origin, isMSIE) => (url) => {
+ url = new URL(url, platform.origin);
+
+ return (
+ origin.protocol === url.protocol &&
+ origin.host === url.host &&
+ (isMSIE || origin.port === url.port)
+ );
+})(
+ new URL(platform.origin),
+ platform.navigator && /(msie|trident)/i.test(platform.navigator.userAgent)
+) : () => true;
+
+const cookies = platform.hasStandardBrowserEnv ?
+
+ // Standard browser envs support document.cookie
+ {
+ write(name, value, expires, path, domain, secure) {
+ const cookie = [name + '=' + encodeURIComponent(value)];
+
+ utils$1.isNumber(expires) && cookie.push('expires=' + new Date(expires).toGMTString());
+
+ utils$1.isString(path) && cookie.push('path=' + path);
+
+ utils$1.isString(domain) && cookie.push('domain=' + domain);
+
+ secure === true && cookie.push('secure');
+
+ document.cookie = cookie.join('; ');
+ },
+
+ read(name) {
+ const match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)'));
+ return (match ? decodeURIComponent(match[3]) : null);
+ },
+
+ remove(name) {
+ this.write(name, '', Date.now() - 86400000);
+ }
+ }
+
+ :
+
+ // Non-standard browser env (web workers, react-native) lack needed support.
+ {
+ write() {},
+ read() {
+ return null;
+ },
+ remove() {}
+ };
+
+const headersToObject = (thing) => thing instanceof AxiosHeaders$1 ? { ...thing } : thing;
+
+/**
+ * Config-specific merge-function which creates a new config-object
+ * by merging two configuration objects together.
+ *
+ * @param {Object} config1
+ * @param {Object} config2
+ *
+ * @returns {Object} New object resulting from merging config2 to config1
+ */
+function mergeConfig(config1, config2) {
+ // eslint-disable-next-line no-param-reassign
+ config2 = config2 || {};
+ const config = {};
+
+ function getMergedValue(target, source, prop, caseless) {
+ if (utils$1.isPlainObject(target) && utils$1.isPlainObject(source)) {
+ return utils$1.merge.call({caseless}, target, source);
+ } else if (utils$1.isPlainObject(source)) {
+ return utils$1.merge({}, source);
+ } else if (utils$1.isArray(source)) {
+ return source.slice();
+ }
+ return source;
+ }
+
+ // eslint-disable-next-line consistent-return
+ function mergeDeepProperties(a, b, prop , caseless) {
+ if (!utils$1.isUndefined(b)) {
+ return getMergedValue(a, b, prop , caseless);
+ } else if (!utils$1.isUndefined(a)) {
+ return getMergedValue(undefined, a, prop , caseless);
+ }
+ }
+
+ // eslint-disable-next-line consistent-return
+ function valueFromConfig2(a, b) {
+ if (!utils$1.isUndefined(b)) {
+ return getMergedValue(undefined, b);
+ }
+ }
+
+ // eslint-disable-next-line consistent-return
+ function defaultToConfig2(a, b) {
+ if (!utils$1.isUndefined(b)) {
+ return getMergedValue(undefined, b);
+ } else if (!utils$1.isUndefined(a)) {
+ return getMergedValue(undefined, a);
+ }
+ }
+
+ // eslint-disable-next-line consistent-return
+ function mergeDirectKeys(a, b, prop) {
+ if (prop in config2) {
+ return getMergedValue(a, b);
+ } else if (prop in config1) {
+ return getMergedValue(undefined, a);
+ }
+ }
+
+ const mergeMap = {
+ url: valueFromConfig2,
+ method: valueFromConfig2,
+ data: valueFromConfig2,
+ baseURL: defaultToConfig2,
+ transformRequest: defaultToConfig2,
+ transformResponse: defaultToConfig2,
+ paramsSerializer: defaultToConfig2,
+ timeout: defaultToConfig2,
+ timeoutMessage: defaultToConfig2,
+ withCredentials: defaultToConfig2,
+ withXSRFToken: defaultToConfig2,
+ adapter: defaultToConfig2,
+ responseType: defaultToConfig2,
+ xsrfCookieName: defaultToConfig2,
+ xsrfHeaderName: defaultToConfig2,
+ onUploadProgress: defaultToConfig2,
+ onDownloadProgress: defaultToConfig2,
+ decompress: defaultToConfig2,
+ maxContentLength: defaultToConfig2,
+ maxBodyLength: defaultToConfig2,
+ beforeRedirect: defaultToConfig2,
+ transport: defaultToConfig2,
+ httpAgent: defaultToConfig2,
+ httpsAgent: defaultToConfig2,
+ cancelToken: defaultToConfig2,
+ socketPath: defaultToConfig2,
+ responseEncoding: defaultToConfig2,
+ validateStatus: mergeDirectKeys,
+ headers: (a, b , prop) => mergeDeepProperties(headersToObject(a), headersToObject(b),prop, true)
+ };
+
+ utils$1.forEach(Object.keys(Object.assign({}, config1, config2)), function computeConfigValue(prop) {
+ const merge = mergeMap[prop] || mergeDeepProperties;
+ const configValue = merge(config1[prop], config2[prop], prop);
+ (utils$1.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue);
+ });
+
+ return config;
+}
+
+const resolveConfig = (config) => {
+ const newConfig = mergeConfig({}, config);
+
+ let {data, withXSRFToken, xsrfHeaderName, xsrfCookieName, headers, auth} = newConfig;
+
+ newConfig.headers = headers = AxiosHeaders$1.from(headers);
+
+ newConfig.url = buildURL(buildFullPath(newConfig.baseURL, newConfig.url, newConfig.allowAbsoluteUrls), config.params, config.paramsSerializer);
+
+ // HTTP basic authentication
+ if (auth) {
+ headers.set('Authorization', 'Basic ' +
+ btoa((auth.username || '') + ':' + (auth.password ? unescape(encodeURIComponent(auth.password)) : ''))
+ );
+ }
+
+ let contentType;
+
+ if (utils$1.isFormData(data)) {
+ if (platform.hasStandardBrowserEnv || platform.hasStandardBrowserWebWorkerEnv) {
+ headers.setContentType(undefined); // Let the browser set it
+ } else if ((contentType = headers.getContentType()) !== false) {
+ // fix semicolon duplication issue for ReactNative FormData implementation
+ const [type, ...tokens] = contentType ? contentType.split(';').map(token => token.trim()).filter(Boolean) : [];
+ headers.setContentType([type || 'multipart/form-data', ...tokens].join('; '));
+ }
+ }
+
+ // Add xsrf header
+ // This is only done if running in a standard browser environment.
+ // Specifically not if we're in a web worker, or react-native.
+
+ if (platform.hasStandardBrowserEnv) {
+ withXSRFToken && utils$1.isFunction(withXSRFToken) && (withXSRFToken = withXSRFToken(newConfig));
+
+ if (withXSRFToken || (withXSRFToken !== false && isURLSameOrigin(newConfig.url))) {
+ // Add xsrf header
+ const xsrfValue = xsrfHeaderName && xsrfCookieName && cookies.read(xsrfCookieName);
+
+ if (xsrfValue) {
+ headers.set(xsrfHeaderName, xsrfValue);
+ }
+ }
+ }
+
+ return newConfig;
+};
+
+const isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';
+
+const xhrAdapter = isXHRAdapterSupported && function (config) {
+ return new Promise(function dispatchXhrRequest(resolve, reject) {
+ const _config = resolveConfig(config);
+ let requestData = _config.data;
+ const requestHeaders = AxiosHeaders$1.from(_config.headers).normalize();
+ let {responseType, onUploadProgress, onDownloadProgress} = _config;
+ let onCanceled;
+ let uploadThrottled, downloadThrottled;
+ let flushUpload, flushDownload;
+
+ function done() {
+ flushUpload && flushUpload(); // flush events
+ flushDownload && flushDownload(); // flush events
+
+ _config.cancelToken && _config.cancelToken.unsubscribe(onCanceled);
+
+ _config.signal && _config.signal.removeEventListener('abort', onCanceled);
+ }
+
+ let request = new XMLHttpRequest();
+
+ request.open(_config.method.toUpperCase(), _config.url, true);
+
+ // Set the request timeout in MS
+ request.timeout = _config.timeout;
+
+ function onloadend() {
+ if (!request) {
+ return;
+ }
+ // Prepare the response
+ const responseHeaders = AxiosHeaders$1.from(
+ 'getAllResponseHeaders' in request && request.getAllResponseHeaders()
+ );
+ const responseData = !responseType || responseType === 'text' || responseType === 'json' ?
+ request.responseText : request.response;
+ const response = {
+ data: responseData,
+ status: request.status,
+ statusText: request.statusText,
+ headers: responseHeaders,
+ config,
+ request
+ };
+
+ settle(function _resolve(value) {
+ resolve(value);
+ done();
+ }, function _reject(err) {
+ reject(err);
+ done();
+ }, response);
+
+ // Clean up request
+ request = null;
+ }
+
+ if ('onloadend' in request) {
+ // Use onloadend if available
+ request.onloadend = onloadend;
+ } else {
+ // Listen for ready state to emulate onloadend
+ request.onreadystatechange = function handleLoad() {
+ if (!request || request.readyState !== 4) {
+ return;
+ }
+
+ // The request errored out and we didn't get a response, this will be
+ // handled by onerror instead
+ // With one exception: request that using file: protocol, most browsers
+ // will return status as 0 even though it's a successful request
+ if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {
+ return;
+ }
+ // readystate handler is calling before onerror or ontimeout handlers,
+ // so we should call onloadend on the next 'tick'
+ setTimeout(onloadend);
+ };
+ }
+
+ // Handle browser request cancellation (as opposed to a manual cancellation)
+ request.onabort = function handleAbort() {
+ if (!request) {
+ return;
+ }
+
+ reject(new AxiosError('Request aborted', AxiosError.ECONNABORTED, config, request));
+
+ // Clean up request
+ request = null;
+ };
+
+ // Handle low level network errors
+ request.onerror = function handleError() {
+ // Real errors are hidden from us by the browser
+ // onerror should only fire if it's a network error
+ reject(new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request));
+
+ // Clean up request
+ request = null;
+ };
+
+ // Handle timeout
+ request.ontimeout = function handleTimeout() {
+ let timeoutErrorMessage = _config.timeout ? 'timeout of ' + _config.timeout + 'ms exceeded' : 'timeout exceeded';
+ const transitional = _config.transitional || transitionalDefaults;
+ if (_config.timeoutErrorMessage) {
+ timeoutErrorMessage = _config.timeoutErrorMessage;
+ }
+ reject(new AxiosError(
+ timeoutErrorMessage,
+ transitional.clarifyTimeoutError ? AxiosError.ETIMEDOUT : AxiosError.ECONNABORTED,
+ config,
+ request));
+
+ // Clean up request
+ request = null;
+ };
+
+ // Remove Content-Type if data is undefined
+ requestData === undefined && requestHeaders.setContentType(null);
+
+ // Add headers to the request
+ if ('setRequestHeader' in request) {
+ utils$1.forEach(requestHeaders.toJSON(), function setRequestHeader(val, key) {
+ request.setRequestHeader(key, val);
+ });
+ }
+
+ // Add withCredentials to request if needed
+ if (!utils$1.isUndefined(_config.withCredentials)) {
+ request.withCredentials = !!_config.withCredentials;
+ }
+
+ // Add responseType to request if needed
+ if (responseType && responseType !== 'json') {
+ request.responseType = _config.responseType;
+ }
+
+ // Handle progress if needed
+ if (onDownloadProgress) {
+ ([downloadThrottled, flushDownload] = progressEventReducer(onDownloadProgress, true));
+ request.addEventListener('progress', downloadThrottled);
+ }
+
+ // Not all browsers support upload events
+ if (onUploadProgress && request.upload) {
+ ([uploadThrottled, flushUpload] = progressEventReducer(onUploadProgress));
+
+ request.upload.addEventListener('progress', uploadThrottled);
+
+ request.upload.addEventListener('loadend', flushUpload);
+ }
+
+ if (_config.cancelToken || _config.signal) {
+ // Handle cancellation
+ // eslint-disable-next-line func-names
+ onCanceled = cancel => {
+ if (!request) {
+ return;
+ }
+ reject(!cancel || cancel.type ? new CanceledError(null, config, request) : cancel);
+ request.abort();
+ request = null;
+ };
+
+ _config.cancelToken && _config.cancelToken.subscribe(onCanceled);
+ if (_config.signal) {
+ _config.signal.aborted ? onCanceled() : _config.signal.addEventListener('abort', onCanceled);
+ }
+ }
+
+ const protocol = parseProtocol(_config.url);
+
+ if (protocol && platform.protocols.indexOf(protocol) === -1) {
+ reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config));
+ return;
+ }
+
+
+ // Send the request
+ request.send(requestData || null);
+ });
+};
+
+const composeSignals = (signals, timeout) => {
+ const {length} = (signals = signals ? signals.filter(Boolean) : []);
+
+ if (timeout || length) {
+ let controller = new AbortController();
+
+ let aborted;
+
+ const onabort = function (reason) {
+ if (!aborted) {
+ aborted = true;
+ unsubscribe();
+ const err = reason instanceof Error ? reason : this.reason;
+ controller.abort(err instanceof AxiosError ? err : new CanceledError(err instanceof Error ? err.message : err));
+ }
+ };
+
+ let timer = timeout && setTimeout(() => {
+ timer = null;
+ onabort(new AxiosError(`timeout ${timeout} of ms exceeded`, AxiosError.ETIMEDOUT));
+ }, timeout);
+
+ const unsubscribe = () => {
+ if (signals) {
+ timer && clearTimeout(timer);
+ timer = null;
+ signals.forEach(signal => {
+ signal.unsubscribe ? signal.unsubscribe(onabort) : signal.removeEventListener('abort', onabort);
+ });
+ signals = null;
+ }
+ };
+
+ signals.forEach((signal) => signal.addEventListener('abort', onabort));
+
+ const {signal} = controller;
+
+ signal.unsubscribe = () => utils$1.asap(unsubscribe);
+
+ return signal;
+ }
+};
+
+const composeSignals$1 = composeSignals;
+
+const streamChunk = function* (chunk, chunkSize) {
+ let len = chunk.byteLength;
+
+ if (!chunkSize || len < chunkSize) {
+ yield chunk;
+ return;
+ }
+
+ let pos = 0;
+ let end;
+
+ while (pos < len) {
+ end = pos + chunkSize;
+ yield chunk.slice(pos, end);
+ pos = end;
+ }
+};
+
+const readBytes = async function* (iterable, chunkSize) {
+ for await (const chunk of readStream(iterable)) {
+ yield* streamChunk(chunk, chunkSize);
+ }
+};
+
+const readStream = async function* (stream) {
+ if (stream[Symbol.asyncIterator]) {
+ yield* stream;
+ return;
+ }
+
+ const reader = stream.getReader();
+ try {
+ for (;;) {
+ const {done, value} = await reader.read();
+ if (done) {
+ break;
+ }
+ yield value;
+ }
+ } finally {
+ await reader.cancel();
+ }
+};
+
+const trackStream = (stream, chunkSize, onProgress, onFinish) => {
+ const iterator = readBytes(stream, chunkSize);
+
+ let bytes = 0;
+ let done;
+ let _onFinish = (e) => {
+ if (!done) {
+ done = true;
+ onFinish && onFinish(e);
+ }
+ };
+
+ return new ReadableStream({
+ async pull(controller) {
+ try {
+ const {done, value} = await iterator.next();
+
+ if (done) {
+ _onFinish();
+ controller.close();
+ return;
+ }
+
+ let len = value.byteLength;
+ if (onProgress) {
+ let loadedBytes = bytes += len;
+ onProgress(loadedBytes);
+ }
+ controller.enqueue(new Uint8Array(value));
+ } catch (err) {
+ _onFinish(err);
+ throw err;
+ }
+ },
+ cancel(reason) {
+ _onFinish(reason);
+ return iterator.return();
+ }
+ }, {
+ highWaterMark: 2
+ })
+};
+
+const isFetchSupported = typeof fetch === 'function' && typeof Request === 'function' && typeof Response === 'function';
+const isReadableStreamSupported = isFetchSupported && typeof ReadableStream === 'function';
+
+// used only inside the fetch adapter
+const encodeText = isFetchSupported && (typeof TextEncoder === 'function' ?
+ ((encoder) => (str) => encoder.encode(str))(new TextEncoder()) :
+ async (str) => new Uint8Array(await new Response(str).arrayBuffer())
+);
+
+const test = (fn, ...args) => {
+ try {
+ return !!fn(...args);
+ } catch (e) {
+ return false
+ }
+};
+
+const supportsRequestStream = isReadableStreamSupported && test(() => {
+ let duplexAccessed = false;
+
+ const hasContentType = new Request(platform.origin, {
+ body: new ReadableStream(),
+ method: 'POST',
+ get duplex() {
+ duplexAccessed = true;
+ return 'half';
+ },
+ }).headers.has('Content-Type');
+
+ return duplexAccessed && !hasContentType;
+});
+
+const DEFAULT_CHUNK_SIZE = 64 * 1024;
+
+const supportsResponseStream = isReadableStreamSupported &&
+ test(() => utils$1.isReadableStream(new Response('').body));
+
+
+const resolvers = {
+ stream: supportsResponseStream && ((res) => res.body)
+};
+
+isFetchSupported && (((res) => {
+ ['text', 'arrayBuffer', 'blob', 'formData', 'stream'].forEach(type => {
+ !resolvers[type] && (resolvers[type] = utils$1.isFunction(res[type]) ? (res) => res[type]() :
+ (_, config) => {
+ throw new AxiosError(`Response type '${type}' is not supported`, AxiosError.ERR_NOT_SUPPORT, config);
+ });
+ });
+})(new Response));
+
+const getBodyLength = async (body) => {
+ if (body == null) {
+ return 0;
+ }
+
+ if(utils$1.isBlob(body)) {
+ return body.size;
+ }
+
+ if(utils$1.isSpecCompliantForm(body)) {
+ const _request = new Request(platform.origin, {
+ method: 'POST',
+ body,
+ });
+ return (await _request.arrayBuffer()).byteLength;
+ }
+
+ if(utils$1.isArrayBufferView(body) || utils$1.isArrayBuffer(body)) {
+ return body.byteLength;
+ }
+
+ if(utils$1.isURLSearchParams(body)) {
+ body = body + '';
+ }
+
+ if(utils$1.isString(body)) {
+ return (await encodeText(body)).byteLength;
+ }
+};
+
+const resolveBodyLength = async (headers, body) => {
+ const length = utils$1.toFiniteNumber(headers.getContentLength());
+
+ return length == null ? getBodyLength(body) : length;
+};
+
+const fetchAdapter = isFetchSupported && (async (config) => {
+ let {
+ url,
+ method,
+ data,
+ signal,
+ cancelToken,
+ timeout,
+ onDownloadProgress,
+ onUploadProgress,
+ responseType,
+ headers,
+ withCredentials = 'same-origin',
+ fetchOptions
+ } = resolveConfig(config);
+
+ responseType = responseType ? (responseType + '').toLowerCase() : 'text';
+
+ let composedSignal = composeSignals$1([signal, cancelToken && cancelToken.toAbortSignal()], timeout);
+
+ let request;
+
+ const unsubscribe = composedSignal && composedSignal.unsubscribe && (() => {
+ composedSignal.unsubscribe();
+ });
+
+ let requestContentLength;
+
+ try {
+ if (
+ onUploadProgress && supportsRequestStream && method !== 'get' && method !== 'head' &&
+ (requestContentLength = await resolveBodyLength(headers, data)) !== 0
+ ) {
+ let _request = new Request(url, {
+ method: 'POST',
+ body: data,
+ duplex: "half"
+ });
+
+ let contentTypeHeader;
+
+ if (utils$1.isFormData(data) && (contentTypeHeader = _request.headers.get('content-type'))) {
+ headers.setContentType(contentTypeHeader);
+ }
+
+ if (_request.body) {
+ const [onProgress, flush] = progressEventDecorator(
+ requestContentLength,
+ progressEventReducer(asyncDecorator(onUploadProgress))
+ );
+
+ data = trackStream(_request.body, DEFAULT_CHUNK_SIZE, onProgress, flush);
+ }
+ }
+
+ if (!utils$1.isString(withCredentials)) {
+ withCredentials = withCredentials ? 'include' : 'omit';
+ }
+
+ // Cloudflare Workers throws when credentials are defined
+ // see https://github.com/cloudflare/workerd/issues/902
+ const isCredentialsSupported = "credentials" in Request.prototype;
+ request = new Request(url, {
+ ...fetchOptions,
+ signal: composedSignal,
+ method: method.toUpperCase(),
+ headers: headers.normalize().toJSON(),
+ body: data,
+ duplex: "half",
+ credentials: isCredentialsSupported ? withCredentials : undefined
+ });
+
+ let response = await fetch(request);
+
+ const isStreamResponse = supportsResponseStream && (responseType === 'stream' || responseType === 'response');
+
+ if (supportsResponseStream && (onDownloadProgress || (isStreamResponse && unsubscribe))) {
+ const options = {};
+
+ ['status', 'statusText', 'headers'].forEach(prop => {
+ options[prop] = response[prop];
+ });
+
+ const responseContentLength = utils$1.toFiniteNumber(response.headers.get('content-length'));
+
+ const [onProgress, flush] = onDownloadProgress && progressEventDecorator(
+ responseContentLength,
+ progressEventReducer(asyncDecorator(onDownloadProgress), true)
+ ) || [];
+
+ response = new Response(
+ trackStream(response.body, DEFAULT_CHUNK_SIZE, onProgress, () => {
+ flush && flush();
+ unsubscribe && unsubscribe();
+ }),
+ options
+ );
+ }
+
+ responseType = responseType || 'text';
+
+ let responseData = await resolvers[utils$1.findKey(resolvers, responseType) || 'text'](response, config);
+
+ !isStreamResponse && unsubscribe && unsubscribe();
+
+ return await new Promise((resolve, reject) => {
+ settle(resolve, reject, {
+ data: responseData,
+ headers: AxiosHeaders$1.from(response.headers),
+ status: response.status,
+ statusText: response.statusText,
+ config,
+ request
+ });
+ })
+ } catch (err) {
+ unsubscribe && unsubscribe();
+
+ if (err && err.name === 'TypeError' && /fetch/i.test(err.message)) {
+ throw Object.assign(
+ new AxiosError('Network Error', AxiosError.ERR_NETWORK, config, request),
+ {
+ cause: err.cause || err
+ }
+ )
+ }
+
+ throw AxiosError.from(err, err && err.code, config, request);
+ }
+});
+
+const knownAdapters = {
+ http: httpAdapter,
+ xhr: xhrAdapter,
+ fetch: fetchAdapter
+};
+
+utils$1.forEach(knownAdapters, (fn, value) => {
+ if (fn) {
+ try {
+ Object.defineProperty(fn, 'name', {value});
+ } catch (e) {
+ // eslint-disable-next-line no-empty
+ }
+ Object.defineProperty(fn, 'adapterName', {value});
+ }
+});
+
+const renderReason = (reason) => `- ${reason}`;
+
+const isResolvedHandle = (adapter) => utils$1.isFunction(adapter) || adapter === null || adapter === false;
+
+const adapters = {
+ getAdapter: (adapters) => {
+ adapters = utils$1.isArray(adapters) ? adapters : [adapters];
+
+ const {length} = adapters;
+ let nameOrAdapter;
+ let adapter;
+
+ const rejectedReasons = {};
+
+ for (let i = 0; i < length; i++) {
+ nameOrAdapter = adapters[i];
+ let id;
+
+ adapter = nameOrAdapter;
+
+ if (!isResolvedHandle(nameOrAdapter)) {
+ adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()];
+
+ if (adapter === undefined) {
+ throw new AxiosError(`Unknown adapter '${id}'`);
+ }
+ }
+
+ if (adapter) {
+ break;
+ }
+
+ rejectedReasons[id || '#' + i] = adapter;
+ }
+
+ if (!adapter) {
+
+ const reasons = Object.entries(rejectedReasons)
+ .map(([id, state]) => `adapter ${id} ` +
+ (state === false ? 'is not supported by the environment' : 'is not available in the build')
+ );
+
+ let s = length ?
+ (reasons.length > 1 ? 'since :\n' + reasons.map(renderReason).join('\n') : ' ' + renderReason(reasons[0])) :
+ 'as no adapter specified';
+
+ throw new AxiosError(
+ `There is no suitable adapter to dispatch the request ` + s,
+ 'ERR_NOT_SUPPORT'
+ );
+ }
+
+ return adapter;
+ },
+ adapters: knownAdapters
+};
+
+/**
+ * Throws a `CanceledError` if cancellation has been requested.
+ *
+ * @param {Object} config The config that is to be used for the request
+ *
+ * @returns {void}
+ */
+function throwIfCancellationRequested(config) {
+ if (config.cancelToken) {
+ config.cancelToken.throwIfRequested();
+ }
+
+ if (config.signal && config.signal.aborted) {
+ throw new CanceledError(null, config);
+ }
+}
+
+/**
+ * Dispatch a request to the server using the configured adapter.
+ *
+ * @param {object} config The config that is to be used for the request
+ *
+ * @returns {Promise} The Promise to be fulfilled
+ */
+function dispatchRequest(config) {
+ throwIfCancellationRequested(config);
+
+ config.headers = AxiosHeaders$1.from(config.headers);
+
+ // Transform request data
+ config.data = transformData.call(
+ config,
+ config.transformRequest
+ );
+
+ if (['post', 'put', 'patch'].indexOf(config.method) !== -1) {
+ config.headers.setContentType('application/x-www-form-urlencoded', false);
+ }
+
+ const adapter = adapters.getAdapter(config.adapter || defaults$1.adapter);
+
+ return adapter(config).then(function onAdapterResolution(response) {
+ throwIfCancellationRequested(config);
+
+ // Transform response data
+ response.data = transformData.call(
+ config,
+ config.transformResponse,
+ response
+ );
+
+ response.headers = AxiosHeaders$1.from(response.headers);
+
+ return response;
+ }, function onAdapterRejection(reason) {
+ if (!isCancel(reason)) {
+ throwIfCancellationRequested(config);
+
+ // Transform response data
+ if (reason && reason.response) {
+ reason.response.data = transformData.call(
+ config,
+ config.transformResponse,
+ reason.response
+ );
+ reason.response.headers = AxiosHeaders$1.from(reason.response.headers);
+ }
+ }
+
+ return Promise.reject(reason);
+ });
+}
+
+const validators$1 = {};
+
+// eslint-disable-next-line func-names
+['object', 'boolean', 'number', 'function', 'string', 'symbol'].forEach((type, i) => {
+ validators$1[type] = function validator(thing) {
+ return typeof thing === type || 'a' + (i < 1 ? 'n ' : ' ') + type;
+ };
+});
+
+const deprecatedWarnings = {};
+
+/**
+ * Transitional option validator
+ *
+ * @param {function|boolean?} validator - set to false if the transitional option has been removed
+ * @param {string?} version - deprecated version / removed since version
+ * @param {string?} message - some message with additional info
+ *
+ * @returns {function}
+ */
+validators$1.transitional = function transitional(validator, version, message) {
+ function formatMessage(opt, desc) {
+ return '[Axios v' + VERSION + '] Transitional option \'' + opt + '\'' + desc + (message ? '. ' + message : '');
+ }
+
+ // eslint-disable-next-line func-names
+ return (value, opt, opts) => {
+ if (validator === false) {
+ throw new AxiosError(
+ formatMessage(opt, ' has been removed' + (version ? ' in ' + version : '')),
+ AxiosError.ERR_DEPRECATED
+ );
+ }
+
+ if (version && !deprecatedWarnings[opt]) {
+ deprecatedWarnings[opt] = true;
+ // eslint-disable-next-line no-console
+ console.warn(
+ formatMessage(
+ opt,
+ ' has been deprecated since v' + version + ' and will be removed in the near future'
+ )
+ );
+ }
+
+ return validator ? validator(value, opt, opts) : true;
+ };
+};
+
+validators$1.spelling = function spelling(correctSpelling) {
+ return (value, opt) => {
+ // eslint-disable-next-line no-console
+ console.warn(`${opt} is likely a misspelling of ${correctSpelling}`);
+ return true;
+ }
+};
+
+/**
+ * Assert object's properties type
+ *
+ * @param {object} options
+ * @param {object} schema
+ * @param {boolean?} allowUnknown
+ *
+ * @returns {object}
+ */
+
+function assertOptions(options, schema, allowUnknown) {
+ if (typeof options !== 'object') {
+ throw new AxiosError('options must be an object', AxiosError.ERR_BAD_OPTION_VALUE);
+ }
+ const keys = Object.keys(options);
+ let i = keys.length;
+ while (i-- > 0) {
+ const opt = keys[i];
+ const validator = schema[opt];
+ if (validator) {
+ const value = options[opt];
+ const result = value === undefined || validator(value, opt, options);
+ if (result !== true) {
+ throw new AxiosError('option ' + opt + ' must be ' + result, AxiosError.ERR_BAD_OPTION_VALUE);
+ }
+ continue;
+ }
+ if (allowUnknown !== true) {
+ throw new AxiosError('Unknown option ' + opt, AxiosError.ERR_BAD_OPTION);
+ }
+ }
+}
+
+const validator = {
+ assertOptions,
+ validators: validators$1
+};
+
+const validators = validator.validators;
+
+/**
+ * Create a new instance of Axios
+ *
+ * @param {Object} instanceConfig The default config for the instance
+ *
+ * @return {Axios} A new instance of Axios
+ */
+class Axios {
+ constructor(instanceConfig) {
+ this.defaults = instanceConfig;
+ this.interceptors = {
+ request: new InterceptorManager$1(),
+ response: new InterceptorManager$1()
+ };
+ }
+
+ /**
+ * Dispatch a request
+ *
+ * @param {String|Object} configOrUrl The config specific for this request (merged with this.defaults)
+ * @param {?Object} config
+ *
+ * @returns {Promise} The Promise to be fulfilled
+ */
+ async request(configOrUrl, config) {
+ try {
+ return await this._request(configOrUrl, config);
+ } catch (err) {
+ if (err instanceof Error) {
+ let dummy = {};
+
+ Error.captureStackTrace ? Error.captureStackTrace(dummy) : (dummy = new Error());
+
+ // slice off the Error: ... line
+ const stack = dummy.stack ? dummy.stack.replace(/^.+\n/, '') : '';
+ try {
+ if (!err.stack) {
+ err.stack = stack;
+ // match without the 2 top stack lines
+ } else if (stack && !String(err.stack).endsWith(stack.replace(/^.+\n.+\n/, ''))) {
+ err.stack += '\n' + stack;
+ }
+ } catch (e) {
+ // ignore the case where "stack" is an un-writable property
+ }
+ }
+
+ throw err;
+ }
+ }
+
+ _request(configOrUrl, config) {
+ /*eslint no-param-reassign:0*/
+ // Allow for axios('example/url'[, config]) a la fetch API
+ if (typeof configOrUrl === 'string') {
+ config = config || {};
+ config.url = configOrUrl;
+ } else {
+ config = configOrUrl || {};
+ }
+
+ config = mergeConfig(this.defaults, config);
+
+ const {transitional, paramsSerializer, headers} = config;
+
+ if (transitional !== undefined) {
+ validator.assertOptions(transitional, {
+ silentJSONParsing: validators.transitional(validators.boolean),
+ forcedJSONParsing: validators.transitional(validators.boolean),
+ clarifyTimeoutError: validators.transitional(validators.boolean)
+ }, false);
+ }
+
+ if (paramsSerializer != null) {
+ if (utils$1.isFunction(paramsSerializer)) {
+ config.paramsSerializer = {
+ serialize: paramsSerializer
+ };
+ } else {
+ validator.assertOptions(paramsSerializer, {
+ encode: validators.function,
+ serialize: validators.function
+ }, true);
+ }
+ }
+
+ // Set config.allowAbsoluteUrls
+ if (config.allowAbsoluteUrls !== undefined) ; else if (this.defaults.allowAbsoluteUrls !== undefined) {
+ config.allowAbsoluteUrls = this.defaults.allowAbsoluteUrls;
+ } else {
+ config.allowAbsoluteUrls = true;
+ }
+
+ validator.assertOptions(config, {
+ baseUrl: validators.spelling('baseURL'),
+ withXsrfToken: validators.spelling('withXSRFToken')
+ }, true);
+
+ // Set config.method
+ config.method = (config.method || this.defaults.method || 'get').toLowerCase();
+
+ // Flatten headers
+ let contextHeaders = headers && utils$1.merge(
+ headers.common,
+ headers[config.method]
+ );
+
+ headers && utils$1.forEach(
+ ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],
+ (method) => {
+ delete headers[method];
+ }
+ );
+
+ config.headers = AxiosHeaders$1.concat(contextHeaders, headers);
+
+ // filter out skipped interceptors
+ const requestInterceptorChain = [];
+ let synchronousRequestInterceptors = true;
+ this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {
+ if (typeof interceptor.runWhen === 'function' && interceptor.runWhen(config) === false) {
+ return;
+ }
+
+ synchronousRequestInterceptors = synchronousRequestInterceptors && interceptor.synchronous;
+
+ requestInterceptorChain.unshift(interceptor.fulfilled, interceptor.rejected);
+ });
+
+ const responseInterceptorChain = [];
+ this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {
+ responseInterceptorChain.push(interceptor.fulfilled, interceptor.rejected);
+ });
+
+ let promise;
+ let i = 0;
+ let len;
+
+ if (!synchronousRequestInterceptors) {
+ const chain = [dispatchRequest.bind(this), undefined];
+ chain.unshift.apply(chain, requestInterceptorChain);
+ chain.push.apply(chain, responseInterceptorChain);
+ len = chain.length;
+
+ promise = Promise.resolve(config);
+
+ while (i < len) {
+ promise = promise.then(chain[i++], chain[i++]);
+ }
+
+ return promise;
+ }
+
+ len = requestInterceptorChain.length;
+
+ let newConfig = config;
+
+ i = 0;
+
+ while (i < len) {
+ const onFulfilled = requestInterceptorChain[i++];
+ const onRejected = requestInterceptorChain[i++];
+ try {
+ newConfig = onFulfilled(newConfig);
+ } catch (error) {
+ onRejected.call(this, error);
+ break;
+ }
+ }
+
+ try {
+ promise = dispatchRequest.call(this, newConfig);
+ } catch (error) {
+ return Promise.reject(error);
+ }
+
+ i = 0;
+ len = responseInterceptorChain.length;
+
+ while (i < len) {
+ promise = promise.then(responseInterceptorChain[i++], responseInterceptorChain[i++]);
+ }
+
+ return promise;
+ }
+
+ getUri(config) {
+ config = mergeConfig(this.defaults, config);
+ const fullPath = buildFullPath(config.baseURL, config.url, config.allowAbsoluteUrls);
+ return buildURL(fullPath, config.params, config.paramsSerializer);
+ }
+}
+
+// Provide aliases for supported request methods
+utils$1.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {
+ /*eslint func-names:0*/
+ Axios.prototype[method] = function(url, config) {
+ return this.request(mergeConfig(config || {}, {
+ method,
+ url,
+ data: (config || {}).data
+ }));
+ };
+});
+
+utils$1.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
+ /*eslint func-names:0*/
+
+ function generateHTTPMethod(isForm) {
+ return function httpMethod(url, data, config) {
+ return this.request(mergeConfig(config || {}, {
+ method,
+ headers: isForm ? {
+ 'Content-Type': 'multipart/form-data'
+ } : {},
+ url,
+ data
+ }));
+ };
+ }
+
+ Axios.prototype[method] = generateHTTPMethod();
+
+ Axios.prototype[method + 'Form'] = generateHTTPMethod(true);
+});
+
+const Axios$1 = Axios;
+
+/**
+ * A `CancelToken` is an object that can be used to request cancellation of an operation.
+ *
+ * @param {Function} executor The executor function.
+ *
+ * @returns {CancelToken}
+ */
+class CancelToken {
+ constructor(executor) {
+ if (typeof executor !== 'function') {
+ throw new TypeError('executor must be a function.');
+ }
+
+ let resolvePromise;
+
+ this.promise = new Promise(function promiseExecutor(resolve) {
+ resolvePromise = resolve;
+ });
+
+ const token = this;
+
+ // eslint-disable-next-line func-names
+ this.promise.then(cancel => {
+ if (!token._listeners) return;
+
+ let i = token._listeners.length;
+
+ while (i-- > 0) {
+ token._listeners[i](cancel);
+ }
+ token._listeners = null;
+ });
+
+ // eslint-disable-next-line func-names
+ this.promise.then = onfulfilled => {
+ let _resolve;
+ // eslint-disable-next-line func-names
+ const promise = new Promise(resolve => {
+ token.subscribe(resolve);
+ _resolve = resolve;
+ }).then(onfulfilled);
+
+ promise.cancel = function reject() {
+ token.unsubscribe(_resolve);
+ };
+
+ return promise;
+ };
+
+ executor(function cancel(message, config, request) {
+ if (token.reason) {
+ // Cancellation has already been requested
+ return;
+ }
+
+ token.reason = new CanceledError(message, config, request);
+ resolvePromise(token.reason);
+ });
+ }
+
+ /**
+ * Throws a `CanceledError` if cancellation has been requested.
+ */
+ throwIfRequested() {
+ if (this.reason) {
+ throw this.reason;
+ }
+ }
+
+ /**
+ * Subscribe to the cancel signal
+ */
+
+ subscribe(listener) {
+ if (this.reason) {
+ listener(this.reason);
+ return;
+ }
+
+ if (this._listeners) {
+ this._listeners.push(listener);
+ } else {
+ this._listeners = [listener];
+ }
+ }
+
+ /**
+ * Unsubscribe from the cancel signal
+ */
+
+ unsubscribe(listener) {
+ if (!this._listeners) {
+ return;
+ }
+ const index = this._listeners.indexOf(listener);
+ if (index !== -1) {
+ this._listeners.splice(index, 1);
+ }
+ }
+
+ toAbortSignal() {
+ const controller = new AbortController();
+
+ const abort = (err) => {
+ controller.abort(err);
+ };
+
+ this.subscribe(abort);
+
+ controller.signal.unsubscribe = () => this.unsubscribe(abort);
+
+ return controller.signal;
+ }
+
+ /**
+ * Returns an object that contains a new `CancelToken` and a function that, when called,
+ * cancels the `CancelToken`.
+ */
+ static source() {
+ let cancel;
+ const token = new CancelToken(function executor(c) {
+ cancel = c;
+ });
+ return {
+ token,
+ cancel
+ };
+ }
+}
+
+const CancelToken$1 = CancelToken;
+
+/**
+ * Syntactic sugar for invoking a function and expanding an array for arguments.
+ *
+ * Common use case would be to use `Function.prototype.apply`.
+ *
+ * ```js
+ * function f(x, y, z) {}
+ * var args = [1, 2, 3];
+ * f.apply(null, args);
+ * ```
+ *
+ * With `spread` this example can be re-written.
+ *
+ * ```js
+ * spread(function(x, y, z) {})([1, 2, 3]);
+ * ```
+ *
+ * @param {Function} callback
+ *
+ * @returns {Function}
+ */
+function spread(callback) {
+ return function wrap(arr) {
+ return callback.apply(null, arr);
+ };
+}
+
+/**
+ * Determines whether the payload is an error thrown by Axios
+ *
+ * @param {*} payload The value to test
+ *
+ * @returns {boolean} True if the payload is an error thrown by Axios, otherwise false
+ */
+function isAxiosError(payload) {
+ return utils$1.isObject(payload) && (payload.isAxiosError === true);
+}
+
+const HttpStatusCode = {
+ Continue: 100,
+ SwitchingProtocols: 101,
+ Processing: 102,
+ EarlyHints: 103,
+ Ok: 200,
+ Created: 201,
+ Accepted: 202,
+ NonAuthoritativeInformation: 203,
+ NoContent: 204,
+ ResetContent: 205,
+ PartialContent: 206,
+ MultiStatus: 207,
+ AlreadyReported: 208,
+ ImUsed: 226,
+ MultipleChoices: 300,
+ MovedPermanently: 301,
+ Found: 302,
+ SeeOther: 303,
+ NotModified: 304,
+ UseProxy: 305,
+ Unused: 306,
+ TemporaryRedirect: 307,
+ PermanentRedirect: 308,
+ BadRequest: 400,
+ Unauthorized: 401,
+ PaymentRequired: 402,
+ Forbidden: 403,
+ NotFound: 404,
+ MethodNotAllowed: 405,
+ NotAcceptable: 406,
+ ProxyAuthenticationRequired: 407,
+ RequestTimeout: 408,
+ Conflict: 409,
+ Gone: 410,
+ LengthRequired: 411,
+ PreconditionFailed: 412,
+ PayloadTooLarge: 413,
+ UriTooLong: 414,
+ UnsupportedMediaType: 415,
+ RangeNotSatisfiable: 416,
+ ExpectationFailed: 417,
+ ImATeapot: 418,
+ MisdirectedRequest: 421,
+ UnprocessableEntity: 422,
+ Locked: 423,
+ FailedDependency: 424,
+ TooEarly: 425,
+ UpgradeRequired: 426,
+ PreconditionRequired: 428,
+ TooManyRequests: 429,
+ RequestHeaderFieldsTooLarge: 431,
+ UnavailableForLegalReasons: 451,
+ InternalServerError: 500,
+ NotImplemented: 501,
+ BadGateway: 502,
+ ServiceUnavailable: 503,
+ GatewayTimeout: 504,
+ HttpVersionNotSupported: 505,
+ VariantAlsoNegotiates: 506,
+ InsufficientStorage: 507,
+ LoopDetected: 508,
+ NotExtended: 510,
+ NetworkAuthenticationRequired: 511,
+};
+
+Object.entries(HttpStatusCode).forEach(([key, value]) => {
+ HttpStatusCode[value] = key;
+});
+
+const HttpStatusCode$1 = HttpStatusCode;
+
+/**
+ * Create an instance of Axios
+ *
+ * @param {Object} defaultConfig The default config for the instance
+ *
+ * @returns {Axios} A new instance of Axios
+ */
+function createInstance(defaultConfig) {
+ const context = new Axios$1(defaultConfig);
+ const instance = bind(Axios$1.prototype.request, context);
+
+ // Copy axios.prototype to instance
+ utils$1.extend(instance, Axios$1.prototype, context, {allOwnKeys: true});
+
+ // Copy context to instance
+ utils$1.extend(instance, context, null, {allOwnKeys: true});
+
+ // Factory for creating new instances
+ instance.create = function create(instanceConfig) {
+ return createInstance(mergeConfig(defaultConfig, instanceConfig));
+ };
+
+ return instance;
+}
+
+// Create the default instance to be exported
+const axios = createInstance(defaults$1);
+
+// Expose Axios class to allow class inheritance
+axios.Axios = Axios$1;
+
+// Expose Cancel & CancelToken
+axios.CanceledError = CanceledError;
+axios.CancelToken = CancelToken$1;
+axios.isCancel = isCancel;
+axios.VERSION = VERSION;
+axios.toFormData = toFormData;
+
+// Expose AxiosError class
+axios.AxiosError = AxiosError;
+
+// alias for CanceledError for backward compatibility
+axios.Cancel = axios.CanceledError;
+
+// Expose all/spread
+axios.all = function all(promises) {
+ return Promise.all(promises);
+};
+
+axios.spread = spread;
+
+// Expose isAxiosError
+axios.isAxiosError = isAxiosError;
+
+// Expose mergeConfig
+axios.mergeConfig = mergeConfig;
+
+axios.AxiosHeaders = AxiosHeaders$1;
+
+axios.formToJSON = thing => formDataToJSON(utils$1.isHTMLForm(thing) ? new FormData(thing) : thing);
+
+axios.getAdapter = adapters.getAdapter;
+
+axios.HttpStatusCode = HttpStatusCode$1;
+
+axios.default = axios;
+
+module.exports = axios;
+//# sourceMappingURL=axios.cjs.map
+
+
+/***/ }),
+
+/***/ 3765:
+/***/ ((module) => {
+
+"use strict";
+module.exports = JSON.parse('{"application/1d-interleaved-parityfec":{"source":"iana"},"application/3gpdash-qoe-report+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/3gpp-ims+xml":{"source":"iana","compressible":true},"application/3gpphal+json":{"source":"iana","compressible":true},"application/3gpphalforms+json":{"source":"iana","compressible":true},"application/a2l":{"source":"iana"},"application/ace+cbor":{"source":"iana"},"application/activemessage":{"source":"iana"},"application/activity+json":{"source":"iana","compressible":true},"application/alto-costmap+json":{"source":"iana","compressible":true},"application/alto-costmapfilter+json":{"source":"iana","compressible":true},"application/alto-directory+json":{"source":"iana","compressible":true},"application/alto-endpointcost+json":{"source":"iana","compressible":true},"application/alto-endpointcostparams+json":{"source":"iana","compressible":true},"application/alto-endpointprop+json":{"source":"iana","compressible":true},"application/alto-endpointpropparams+json":{"source":"iana","compressible":true},"application/alto-error+json":{"source":"iana","compressible":true},"application/alto-networkmap+json":{"source":"iana","compressible":true},"application/alto-networkmapfilter+json":{"source":"iana","compressible":true},"application/alto-updatestreamcontrol+json":{"source":"iana","compressible":true},"application/alto-updatestreamparams+json":{"source":"iana","compressible":true},"application/aml":{"source":"iana"},"application/andrew-inset":{"source":"iana","extensions":["ez"]},"application/applefile":{"source":"iana"},"application/applixware":{"source":"apache","extensions":["aw"]},"application/at+jwt":{"source":"iana"},"application/atf":{"source":"iana"},"application/atfx":{"source":"iana"},"application/atom+xml":{"source":"iana","compressible":true,"extensions":["atom"]},"application/atomcat+xml":{"source":"iana","compressible":true,"extensions":["atomcat"]},"application/atomdeleted+xml":{"source":"iana","compressible":true,"extensions":["atomdeleted"]},"application/atomicmail":{"source":"iana"},"application/atomsvc+xml":{"source":"iana","compressible":true,"extensions":["atomsvc"]},"application/atsc-dwd+xml":{"source":"iana","compressible":true,"extensions":["dwd"]},"application/atsc-dynamic-event-message":{"source":"iana"},"application/atsc-held+xml":{"source":"iana","compressible":true,"extensions":["held"]},"application/atsc-rdt+json":{"source":"iana","compressible":true},"application/atsc-rsat+xml":{"source":"iana","compressible":true,"extensions":["rsat"]},"application/atxml":{"source":"iana"},"application/auth-policy+xml":{"source":"iana","compressible":true},"application/bacnet-xdd+zip":{"source":"iana","compressible":false},"application/batch-smtp":{"source":"iana"},"application/bdoc":{"compressible":false,"extensions":["bdoc"]},"application/beep+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/calendar+json":{"source":"iana","compressible":true},"application/calendar+xml":{"source":"iana","compressible":true,"extensions":["xcs"]},"application/call-completion":{"source":"iana"},"application/cals-1840":{"source":"iana"},"application/captive+json":{"source":"iana","compressible":true},"application/cbor":{"source":"iana"},"application/cbor-seq":{"source":"iana"},"application/cccex":{"source":"iana"},"application/ccmp+xml":{"source":"iana","compressible":true},"application/ccxml+xml":{"source":"iana","compressible":true,"extensions":["ccxml"]},"application/cdfx+xml":{"source":"iana","compressible":true,"extensions":["cdfx"]},"application/cdmi-capability":{"source":"iana","extensions":["cdmia"]},"application/cdmi-container":{"source":"iana","extensions":["cdmic"]},"application/cdmi-domain":{"source":"iana","extensions":["cdmid"]},"application/cdmi-object":{"source":"iana","extensions":["cdmio"]},"application/cdmi-queue":{"source":"iana","extensions":["cdmiq"]},"application/cdni":{"source":"iana"},"application/cea":{"source":"iana"},"application/cea-2018+xml":{"source":"iana","compressible":true},"application/cellml+xml":{"source":"iana","compressible":true},"application/cfw":{"source":"iana"},"application/city+json":{"source":"iana","compressible":true},"application/clr":{"source":"iana"},"application/clue+xml":{"source":"iana","compressible":true},"application/clue_info+xml":{"source":"iana","compressible":true},"application/cms":{"source":"iana"},"application/cnrp+xml":{"source":"iana","compressible":true},"application/coap-group+json":{"source":"iana","compressible":true},"application/coap-payload":{"source":"iana"},"application/commonground":{"source":"iana"},"application/conference-info+xml":{"source":"iana","compressible":true},"application/cose":{"source":"iana"},"application/cose-key":{"source":"iana"},"application/cose-key-set":{"source":"iana"},"application/cpl+xml":{"source":"iana","compressible":true,"extensions":["cpl"]},"application/csrattrs":{"source":"iana"},"application/csta+xml":{"source":"iana","compressible":true},"application/cstadata+xml":{"source":"iana","compressible":true},"application/csvm+json":{"source":"iana","compressible":true},"application/cu-seeme":{"source":"apache","extensions":["cu"]},"application/cwt":{"source":"iana"},"application/cybercash":{"source":"iana"},"application/dart":{"compressible":true},"application/dash+xml":{"source":"iana","compressible":true,"extensions":["mpd"]},"application/dash-patch+xml":{"source":"iana","compressible":true,"extensions":["mpp"]},"application/dashdelta":{"source":"iana"},"application/davmount+xml":{"source":"iana","compressible":true,"extensions":["davmount"]},"application/dca-rft":{"source":"iana"},"application/dcd":{"source":"iana"},"application/dec-dx":{"source":"iana"},"application/dialog-info+xml":{"source":"iana","compressible":true},"application/dicom":{"source":"iana"},"application/dicom+json":{"source":"iana","compressible":true},"application/dicom+xml":{"source":"iana","compressible":true},"application/dii":{"source":"iana"},"application/dit":{"source":"iana"},"application/dns":{"source":"iana"},"application/dns+json":{"source":"iana","compressible":true},"application/dns-message":{"source":"iana"},"application/docbook+xml":{"source":"apache","compressible":true,"extensions":["dbk"]},"application/dots+cbor":{"source":"iana"},"application/dskpp+xml":{"source":"iana","compressible":true},"application/dssc+der":{"source":"iana","extensions":["dssc"]},"application/dssc+xml":{"source":"iana","compressible":true,"extensions":["xdssc"]},"application/dvcs":{"source":"iana"},"application/ecmascript":{"source":"iana","compressible":true,"extensions":["es","ecma"]},"application/edi-consent":{"source":"iana"},"application/edi-x12":{"source":"iana","compressible":false},"application/edifact":{"source":"iana","compressible":false},"application/efi":{"source":"iana"},"application/elm+json":{"source":"iana","charset":"UTF-8","compressible":true},"application/elm+xml":{"source":"iana","compressible":true},"application/emergencycalldata.cap+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/emergencycalldata.comment+xml":{"source":"iana","compressible":true},"application/emergencycalldata.control+xml":{"source":"iana","compressible":true},"application/emergencycalldata.deviceinfo+xml":{"source":"iana","compressible":true},"application/emergencycalldata.ecall.msd":{"source":"iana"},"application/emergencycalldata.providerinfo+xml":{"source":"iana","compressible":true},"application/emergencycalldata.serviceinfo+xml":{"source":"iana","compressible":true},"application/emergencycalldata.subscriberinfo+xml":{"source":"iana","compressible":true},"application/emergencycalldata.veds+xml":{"source":"iana","compressible":true},"application/emma+xml":{"source":"iana","compressible":true,"extensions":["emma"]},"application/emotionml+xml":{"source":"iana","compressible":true,"extensions":["emotionml"]},"application/encaprtp":{"source":"iana"},"application/epp+xml":{"source":"iana","compressible":true},"application/epub+zip":{"source":"iana","compressible":false,"extensions":["epub"]},"application/eshop":{"source":"iana"},"application/exi":{"source":"iana","extensions":["exi"]},"application/expect-ct-report+json":{"source":"iana","compressible":true},"application/express":{"source":"iana","extensions":["exp"]},"application/fastinfoset":{"source":"iana"},"application/fastsoap":{"source":"iana"},"application/fdt+xml":{"source":"iana","compressible":true,"extensions":["fdt"]},"application/fhir+json":{"source":"iana","charset":"UTF-8","compressible":true},"application/fhir+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/fido.trusted-apps+json":{"compressible":true},"application/fits":{"source":"iana"},"application/flexfec":{"source":"iana"},"application/font-sfnt":{"source":"iana"},"application/font-tdpfr":{"source":"iana","extensions":["pfr"]},"application/font-woff":{"source":"iana","compressible":false},"application/framework-attributes+xml":{"source":"iana","compressible":true},"application/geo+json":{"source":"iana","compressible":true,"extensions":["geojson"]},"application/geo+json-seq":{"source":"iana"},"application/geopackage+sqlite3":{"source":"iana"},"application/geoxacml+xml":{"source":"iana","compressible":true},"application/gltf-buffer":{"source":"iana"},"application/gml+xml":{"source":"iana","compressible":true,"extensions":["gml"]},"application/gpx+xml":{"source":"apache","compressible":true,"extensions":["gpx"]},"application/gxf":{"source":"apache","extensions":["gxf"]},"application/gzip":{"source":"iana","compressible":false,"extensions":["gz"]},"application/h224":{"source":"iana"},"application/held+xml":{"source":"iana","compressible":true},"application/hjson":{"extensions":["hjson"]},"application/http":{"source":"iana"},"application/hyperstudio":{"source":"iana","extensions":["stk"]},"application/ibe-key-request+xml":{"source":"iana","compressible":true},"application/ibe-pkg-reply+xml":{"source":"iana","compressible":true},"application/ibe-pp-data":{"source":"iana"},"application/iges":{"source":"iana"},"application/im-iscomposing+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/index":{"source":"iana"},"application/index.cmd":{"source":"iana"},"application/index.obj":{"source":"iana"},"application/index.response":{"source":"iana"},"application/index.vnd":{"source":"iana"},"application/inkml+xml":{"source":"iana","compressible":true,"extensions":["ink","inkml"]},"application/iotp":{"source":"iana"},"application/ipfix":{"source":"iana","extensions":["ipfix"]},"application/ipp":{"source":"iana"},"application/isup":{"source":"iana"},"application/its+xml":{"source":"iana","compressible":true,"extensions":["its"]},"application/java-archive":{"source":"apache","compressible":false,"extensions":["jar","war","ear"]},"application/java-serialized-object":{"source":"apache","compressible":false,"extensions":["ser"]},"application/java-vm":{"source":"apache","compressible":false,"extensions":["class"]},"application/javascript":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["js","mjs"]},"application/jf2feed+json":{"source":"iana","compressible":true},"application/jose":{"source":"iana"},"application/jose+json":{"source":"iana","compressible":true},"application/jrd+json":{"source":"iana","compressible":true},"application/jscalendar+json":{"source":"iana","compressible":true},"application/json":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["json","map"]},"application/json-patch+json":{"source":"iana","compressible":true},"application/json-seq":{"source":"iana"},"application/json5":{"extensions":["json5"]},"application/jsonml+json":{"source":"apache","compressible":true,"extensions":["jsonml"]},"application/jwk+json":{"source":"iana","compressible":true},"application/jwk-set+json":{"source":"iana","compressible":true},"application/jwt":{"source":"iana"},"application/kpml-request+xml":{"source":"iana","compressible":true},"application/kpml-response+xml":{"source":"iana","compressible":true},"application/ld+json":{"source":"iana","compressible":true,"extensions":["jsonld"]},"application/lgr+xml":{"source":"iana","compressible":true,"extensions":["lgr"]},"application/link-format":{"source":"iana"},"application/load-control+xml":{"source":"iana","compressible":true},"application/lost+xml":{"source":"iana","compressible":true,"extensions":["lostxml"]},"application/lostsync+xml":{"source":"iana","compressible":true},"application/lpf+zip":{"source":"iana","compressible":false},"application/lxf":{"source":"iana"},"application/mac-binhex40":{"source":"iana","extensions":["hqx"]},"application/mac-compactpro":{"source":"apache","extensions":["cpt"]},"application/macwriteii":{"source":"iana"},"application/mads+xml":{"source":"iana","compressible":true,"extensions":["mads"]},"application/manifest+json":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["webmanifest"]},"application/marc":{"source":"iana","extensions":["mrc"]},"application/marcxml+xml":{"source":"iana","compressible":true,"extensions":["mrcx"]},"application/mathematica":{"source":"iana","extensions":["ma","nb","mb"]},"application/mathml+xml":{"source":"iana","compressible":true,"extensions":["mathml"]},"application/mathml-content+xml":{"source":"iana","compressible":true},"application/mathml-presentation+xml":{"source":"iana","compressible":true},"application/mbms-associated-procedure-description+xml":{"source":"iana","compressible":true},"application/mbms-deregister+xml":{"source":"iana","compressible":true},"application/mbms-envelope+xml":{"source":"iana","compressible":true},"application/mbms-msk+xml":{"source":"iana","compressible":true},"application/mbms-msk-response+xml":{"source":"iana","compressible":true},"application/mbms-protection-description+xml":{"source":"iana","compressible":true},"application/mbms-reception-report+xml":{"source":"iana","compressible":true},"application/mbms-register+xml":{"source":"iana","compressible":true},"application/mbms-register-response+xml":{"source":"iana","compressible":true},"application/mbms-schedule+xml":{"source":"iana","compressible":true},"application/mbms-user-service-description+xml":{"source":"iana","compressible":true},"application/mbox":{"source":"iana","extensions":["mbox"]},"application/media-policy-dataset+xml":{"source":"iana","compressible":true,"extensions":["mpf"]},"application/media_control+xml":{"source":"iana","compressible":true},"application/mediaservercontrol+xml":{"source":"iana","compressible":true,"extensions":["mscml"]},"application/merge-patch+json":{"source":"iana","compressible":true},"application/metalink+xml":{"source":"apache","compressible":true,"extensions":["metalink"]},"application/metalink4+xml":{"source":"iana","compressible":true,"extensions":["meta4"]},"application/mets+xml":{"source":"iana","compressible":true,"extensions":["mets"]},"application/mf4":{"source":"iana"},"application/mikey":{"source":"iana"},"application/mipc":{"source":"iana"},"application/missing-blocks+cbor-seq":{"source":"iana"},"application/mmt-aei+xml":{"source":"iana","compressible":true,"extensions":["maei"]},"application/mmt-usd+xml":{"source":"iana","compressible":true,"extensions":["musd"]},"application/mods+xml":{"source":"iana","compressible":true,"extensions":["mods"]},"application/moss-keys":{"source":"iana"},"application/moss-signature":{"source":"iana"},"application/mosskey-data":{"source":"iana"},"application/mosskey-request":{"source":"iana"},"application/mp21":{"source":"iana","extensions":["m21","mp21"]},"application/mp4":{"source":"iana","extensions":["mp4s","m4p"]},"application/mpeg4-generic":{"source":"iana"},"application/mpeg4-iod":{"source":"iana"},"application/mpeg4-iod-xmt":{"source":"iana"},"application/mrb-consumer+xml":{"source":"iana","compressible":true},"application/mrb-publish+xml":{"source":"iana","compressible":true},"application/msc-ivr+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/msc-mixer+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/msword":{"source":"iana","compressible":false,"extensions":["doc","dot"]},"application/mud+json":{"source":"iana","compressible":true},"application/multipart-core":{"source":"iana"},"application/mxf":{"source":"iana","extensions":["mxf"]},"application/n-quads":{"source":"iana","extensions":["nq"]},"application/n-triples":{"source":"iana","extensions":["nt"]},"application/nasdata":{"source":"iana"},"application/news-checkgroups":{"source":"iana","charset":"US-ASCII"},"application/news-groupinfo":{"source":"iana","charset":"US-ASCII"},"application/news-transmission":{"source":"iana"},"application/nlsml+xml":{"source":"iana","compressible":true},"application/node":{"source":"iana","extensions":["cjs"]},"application/nss":{"source":"iana"},"application/oauth-authz-req+jwt":{"source":"iana"},"application/oblivious-dns-message":{"source":"iana"},"application/ocsp-request":{"source":"iana"},"application/ocsp-response":{"source":"iana"},"application/octet-stream":{"source":"iana","compressible":false,"extensions":["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"]},"application/oda":{"source":"iana","extensions":["oda"]},"application/odm+xml":{"source":"iana","compressible":true},"application/odx":{"source":"iana"},"application/oebps-package+xml":{"source":"iana","compressible":true,"extensions":["opf"]},"application/ogg":{"source":"iana","compressible":false,"extensions":["ogx"]},"application/omdoc+xml":{"source":"apache","compressible":true,"extensions":["omdoc"]},"application/onenote":{"source":"apache","extensions":["onetoc","onetoc2","onetmp","onepkg"]},"application/opc-nodeset+xml":{"source":"iana","compressible":true},"application/oscore":{"source":"iana"},"application/oxps":{"source":"iana","extensions":["oxps"]},"application/p21":{"source":"iana"},"application/p21+zip":{"source":"iana","compressible":false},"application/p2p-overlay+xml":{"source":"iana","compressible":true,"extensions":["relo"]},"application/parityfec":{"source":"iana"},"application/passport":{"source":"iana"},"application/patch-ops-error+xml":{"source":"iana","compressible":true,"extensions":["xer"]},"application/pdf":{"source":"iana","compressible":false,"extensions":["pdf"]},"application/pdx":{"source":"iana"},"application/pem-certificate-chain":{"source":"iana"},"application/pgp-encrypted":{"source":"iana","compressible":false,"extensions":["pgp"]},"application/pgp-keys":{"source":"iana","extensions":["asc"]},"application/pgp-signature":{"source":"iana","extensions":["asc","sig"]},"application/pics-rules":{"source":"apache","extensions":["prf"]},"application/pidf+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/pidf-diff+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/pkcs10":{"source":"iana","extensions":["p10"]},"application/pkcs12":{"source":"iana"},"application/pkcs7-mime":{"source":"iana","extensions":["p7m","p7c"]},"application/pkcs7-signature":{"source":"iana","extensions":["p7s"]},"application/pkcs8":{"source":"iana","extensions":["p8"]},"application/pkcs8-encrypted":{"source":"iana"},"application/pkix-attr-cert":{"source":"iana","extensions":["ac"]},"application/pkix-cert":{"source":"iana","extensions":["cer"]},"application/pkix-crl":{"source":"iana","extensions":["crl"]},"application/pkix-pkipath":{"source":"iana","extensions":["pkipath"]},"application/pkixcmp":{"source":"iana","extensions":["pki"]},"application/pls+xml":{"source":"iana","compressible":true,"extensions":["pls"]},"application/poc-settings+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/postscript":{"source":"iana","compressible":true,"extensions":["ai","eps","ps"]},"application/ppsp-tracker+json":{"source":"iana","compressible":true},"application/problem+json":{"source":"iana","compressible":true},"application/problem+xml":{"source":"iana","compressible":true},"application/provenance+xml":{"source":"iana","compressible":true,"extensions":["provx"]},"application/prs.alvestrand.titrax-sheet":{"source":"iana"},"application/prs.cww":{"source":"iana","extensions":["cww"]},"application/prs.cyn":{"source":"iana","charset":"7-BIT"},"application/prs.hpub+zip":{"source":"iana","compressible":false},"application/prs.nprend":{"source":"iana"},"application/prs.plucker":{"source":"iana"},"application/prs.rdf-xml-crypt":{"source":"iana"},"application/prs.xsf+xml":{"source":"iana","compressible":true},"application/pskc+xml":{"source":"iana","compressible":true,"extensions":["pskcxml"]},"application/pvd+json":{"source":"iana","compressible":true},"application/qsig":{"source":"iana"},"application/raml+yaml":{"compressible":true,"extensions":["raml"]},"application/raptorfec":{"source":"iana"},"application/rdap+json":{"source":"iana","compressible":true},"application/rdf+xml":{"source":"iana","compressible":true,"extensions":["rdf","owl"]},"application/reginfo+xml":{"source":"iana","compressible":true,"extensions":["rif"]},"application/relax-ng-compact-syntax":{"source":"iana","extensions":["rnc"]},"application/remote-printing":{"source":"iana"},"application/reputon+json":{"source":"iana","compressible":true},"application/resource-lists+xml":{"source":"iana","compressible":true,"extensions":["rl"]},"application/resource-lists-diff+xml":{"source":"iana","compressible":true,"extensions":["rld"]},"application/rfc+xml":{"source":"iana","compressible":true},"application/riscos":{"source":"iana"},"application/rlmi+xml":{"source":"iana","compressible":true},"application/rls-services+xml":{"source":"iana","compressible":true,"extensions":["rs"]},"application/route-apd+xml":{"source":"iana","compressible":true,"extensions":["rapd"]},"application/route-s-tsid+xml":{"source":"iana","compressible":true,"extensions":["sls"]},"application/route-usd+xml":{"source":"iana","compressible":true,"extensions":["rusd"]},"application/rpki-ghostbusters":{"source":"iana","extensions":["gbr"]},"application/rpki-manifest":{"source":"iana","extensions":["mft"]},"application/rpki-publication":{"source":"iana"},"application/rpki-roa":{"source":"iana","extensions":["roa"]},"application/rpki-updown":{"source":"iana"},"application/rsd+xml":{"source":"apache","compressible":true,"extensions":["rsd"]},"application/rss+xml":{"source":"apache","compressible":true,"extensions":["rss"]},"application/rtf":{"source":"iana","compressible":true,"extensions":["rtf"]},"application/rtploopback":{"source":"iana"},"application/rtx":{"source":"iana"},"application/samlassertion+xml":{"source":"iana","compressible":true},"application/samlmetadata+xml":{"source":"iana","compressible":true},"application/sarif+json":{"source":"iana","compressible":true},"application/sarif-external-properties+json":{"source":"iana","compressible":true},"application/sbe":{"source":"iana"},"application/sbml+xml":{"source":"iana","compressible":true,"extensions":["sbml"]},"application/scaip+xml":{"source":"iana","compressible":true},"application/scim+json":{"source":"iana","compressible":true},"application/scvp-cv-request":{"source":"iana","extensions":["scq"]},"application/scvp-cv-response":{"source":"iana","extensions":["scs"]},"application/scvp-vp-request":{"source":"iana","extensions":["spq"]},"application/scvp-vp-response":{"source":"iana","extensions":["spp"]},"application/sdp":{"source":"iana","extensions":["sdp"]},"application/secevent+jwt":{"source":"iana"},"application/senml+cbor":{"source":"iana"},"application/senml+json":{"source":"iana","compressible":true},"application/senml+xml":{"source":"iana","compressible":true,"extensions":["senmlx"]},"application/senml-etch+cbor":{"source":"iana"},"application/senml-etch+json":{"source":"iana","compressible":true},"application/senml-exi":{"source":"iana"},"application/sensml+cbor":{"source":"iana"},"application/sensml+json":{"source":"iana","compressible":true},"application/sensml+xml":{"source":"iana","compressible":true,"extensions":["sensmlx"]},"application/sensml-exi":{"source":"iana"},"application/sep+xml":{"source":"iana","compressible":true},"application/sep-exi":{"source":"iana"},"application/session-info":{"source":"iana"},"application/set-payment":{"source":"iana"},"application/set-payment-initiation":{"source":"iana","extensions":["setpay"]},"application/set-registration":{"source":"iana"},"application/set-registration-initiation":{"source":"iana","extensions":["setreg"]},"application/sgml":{"source":"iana"},"application/sgml-open-catalog":{"source":"iana"},"application/shf+xml":{"source":"iana","compressible":true,"extensions":["shf"]},"application/sieve":{"source":"iana","extensions":["siv","sieve"]},"application/simple-filter+xml":{"source":"iana","compressible":true},"application/simple-message-summary":{"source":"iana"},"application/simplesymbolcontainer":{"source":"iana"},"application/sipc":{"source":"iana"},"application/slate":{"source":"iana"},"application/smil":{"source":"iana"},"application/smil+xml":{"source":"iana","compressible":true,"extensions":["smi","smil"]},"application/smpte336m":{"source":"iana"},"application/soap+fastinfoset":{"source":"iana"},"application/soap+xml":{"source":"iana","compressible":true},"application/sparql-query":{"source":"iana","extensions":["rq"]},"application/sparql-results+xml":{"source":"iana","compressible":true,"extensions":["srx"]},"application/spdx+json":{"source":"iana","compressible":true},"application/spirits-event+xml":{"source":"iana","compressible":true},"application/sql":{"source":"iana"},"application/srgs":{"source":"iana","extensions":["gram"]},"application/srgs+xml":{"source":"iana","compressible":true,"extensions":["grxml"]},"application/sru+xml":{"source":"iana","compressible":true,"extensions":["sru"]},"application/ssdl+xml":{"source":"apache","compressible":true,"extensions":["ssdl"]},"application/ssml+xml":{"source":"iana","compressible":true,"extensions":["ssml"]},"application/stix+json":{"source":"iana","compressible":true},"application/swid+xml":{"source":"iana","compressible":true,"extensions":["swidtag"]},"application/tamp-apex-update":{"source":"iana"},"application/tamp-apex-update-confirm":{"source":"iana"},"application/tamp-community-update":{"source":"iana"},"application/tamp-community-update-confirm":{"source":"iana"},"application/tamp-error":{"source":"iana"},"application/tamp-sequence-adjust":{"source":"iana"},"application/tamp-sequence-adjust-confirm":{"source":"iana"},"application/tamp-status-query":{"source":"iana"},"application/tamp-status-response":{"source":"iana"},"application/tamp-update":{"source":"iana"},"application/tamp-update-confirm":{"source":"iana"},"application/tar":{"compressible":true},"application/taxii+json":{"source":"iana","compressible":true},"application/td+json":{"source":"iana","compressible":true},"application/tei+xml":{"source":"iana","compressible":true,"extensions":["tei","teicorpus"]},"application/tetra_isi":{"source":"iana"},"application/thraud+xml":{"source":"iana","compressible":true,"extensions":["tfi"]},"application/timestamp-query":{"source":"iana"},"application/timestamp-reply":{"source":"iana"},"application/timestamped-data":{"source":"iana","extensions":["tsd"]},"application/tlsrpt+gzip":{"source":"iana"},"application/tlsrpt+json":{"source":"iana","compressible":true},"application/tnauthlist":{"source":"iana"},"application/token-introspection+jwt":{"source":"iana"},"application/toml":{"compressible":true,"extensions":["toml"]},"application/trickle-ice-sdpfrag":{"source":"iana"},"application/trig":{"source":"iana","extensions":["trig"]},"application/ttml+xml":{"source":"iana","compressible":true,"extensions":["ttml"]},"application/tve-trigger":{"source":"iana"},"application/tzif":{"source":"iana"},"application/tzif-leap":{"source":"iana"},"application/ubjson":{"compressible":false,"extensions":["ubj"]},"application/ulpfec":{"source":"iana"},"application/urc-grpsheet+xml":{"source":"iana","compressible":true},"application/urc-ressheet+xml":{"source":"iana","compressible":true,"extensions":["rsheet"]},"application/urc-targetdesc+xml":{"source":"iana","compressible":true,"extensions":["td"]},"application/urc-uisocketdesc+xml":{"source":"iana","compressible":true},"application/vcard+json":{"source":"iana","compressible":true},"application/vcard+xml":{"source":"iana","compressible":true},"application/vemmi":{"source":"iana"},"application/vividence.scriptfile":{"source":"apache"},"application/vnd.1000minds.decision-model+xml":{"source":"iana","compressible":true,"extensions":["1km"]},"application/vnd.3gpp-prose+xml":{"source":"iana","compressible":true},"application/vnd.3gpp-prose-pc3ch+xml":{"source":"iana","compressible":true},"application/vnd.3gpp-v2x-local-service-information":{"source":"iana"},"application/vnd.3gpp.5gnas":{"source":"iana"},"application/vnd.3gpp.access-transfer-events+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.bsf+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.gmop+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.gtpc":{"source":"iana"},"application/vnd.3gpp.interworking-data":{"source":"iana"},"application/vnd.3gpp.lpp":{"source":"iana"},"application/vnd.3gpp.mc-signalling-ear":{"source":"iana"},"application/vnd.3gpp.mcdata-affiliation-command+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcdata-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcdata-payload":{"source":"iana"},"application/vnd.3gpp.mcdata-service-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcdata-signalling":{"source":"iana"},"application/vnd.3gpp.mcdata-ue-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcdata-user-profile+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-affiliation-command+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-floor-request+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-location-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-mbms-usage-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-service-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-signed+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-ue-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-ue-init-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcptt-user-profile+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-affiliation-command+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-affiliation-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-location-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-mbms-usage-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-service-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-transmission-request+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-ue-config+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mcvideo-user-profile+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.mid-call+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.ngap":{"source":"iana"},"application/vnd.3gpp.pfcp":{"source":"iana"},"application/vnd.3gpp.pic-bw-large":{"source":"iana","extensions":["plb"]},"application/vnd.3gpp.pic-bw-small":{"source":"iana","extensions":["psb"]},"application/vnd.3gpp.pic-bw-var":{"source":"iana","extensions":["pvb"]},"application/vnd.3gpp.s1ap":{"source":"iana"},"application/vnd.3gpp.sms":{"source":"iana"},"application/vnd.3gpp.sms+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.srvcc-ext+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.srvcc-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.state-and-event-info+xml":{"source":"iana","compressible":true},"application/vnd.3gpp.ussd+xml":{"source":"iana","compressible":true},"application/vnd.3gpp2.bcmcsinfo+xml":{"source":"iana","compressible":true},"application/vnd.3gpp2.sms":{"source":"iana"},"application/vnd.3gpp2.tcap":{"source":"iana","extensions":["tcap"]},"application/vnd.3lightssoftware.imagescal":{"source":"iana"},"application/vnd.3m.post-it-notes":{"source":"iana","extensions":["pwn"]},"application/vnd.accpac.simply.aso":{"source":"iana","extensions":["aso"]},"application/vnd.accpac.simply.imp":{"source":"iana","extensions":["imp"]},"application/vnd.acucobol":{"source":"iana","extensions":["acu"]},"application/vnd.acucorp":{"source":"iana","extensions":["atc","acutc"]},"application/vnd.adobe.air-application-installer-package+zip":{"source":"apache","compressible":false,"extensions":["air"]},"application/vnd.adobe.flash.movie":{"source":"iana"},"application/vnd.adobe.formscentral.fcdt":{"source":"iana","extensions":["fcdt"]},"application/vnd.adobe.fxp":{"source":"iana","extensions":["fxp","fxpl"]},"application/vnd.adobe.partial-upload":{"source":"iana"},"application/vnd.adobe.xdp+xml":{"source":"iana","compressible":true,"extensions":["xdp"]},"application/vnd.adobe.xfdf":{"source":"iana","extensions":["xfdf"]},"application/vnd.aether.imp":{"source":"iana"},"application/vnd.afpc.afplinedata":{"source":"iana"},"application/vnd.afpc.afplinedata-pagedef":{"source":"iana"},"application/vnd.afpc.cmoca-cmresource":{"source":"iana"},"application/vnd.afpc.foca-charset":{"source":"iana"},"application/vnd.afpc.foca-codedfont":{"source":"iana"},"application/vnd.afpc.foca-codepage":{"source":"iana"},"application/vnd.afpc.modca":{"source":"iana"},"application/vnd.afpc.modca-cmtable":{"source":"iana"},"application/vnd.afpc.modca-formdef":{"source":"iana"},"application/vnd.afpc.modca-mediummap":{"source":"iana"},"application/vnd.afpc.modca-objectcontainer":{"source":"iana"},"application/vnd.afpc.modca-overlay":{"source":"iana"},"application/vnd.afpc.modca-pagesegment":{"source":"iana"},"application/vnd.age":{"source":"iana","extensions":["age"]},"application/vnd.ah-barcode":{"source":"iana"},"application/vnd.ahead.space":{"source":"iana","extensions":["ahead"]},"application/vnd.airzip.filesecure.azf":{"source":"iana","extensions":["azf"]},"application/vnd.airzip.filesecure.azs":{"source":"iana","extensions":["azs"]},"application/vnd.amadeus+json":{"source":"iana","compressible":true},"application/vnd.amazon.ebook":{"source":"apache","extensions":["azw"]},"application/vnd.amazon.mobi8-ebook":{"source":"iana"},"application/vnd.americandynamics.acc":{"source":"iana","extensions":["acc"]},"application/vnd.amiga.ami":{"source":"iana","extensions":["ami"]},"application/vnd.amundsen.maze+xml":{"source":"iana","compressible":true},"application/vnd.android.ota":{"source":"iana"},"application/vnd.android.package-archive":{"source":"apache","compressible":false,"extensions":["apk"]},"application/vnd.anki":{"source":"iana"},"application/vnd.anser-web-certificate-issue-initiation":{"source":"iana","extensions":["cii"]},"application/vnd.anser-web-funds-transfer-initiation":{"source":"apache","extensions":["fti"]},"application/vnd.antix.game-component":{"source":"iana","extensions":["atx"]},"application/vnd.apache.arrow.file":{"source":"iana"},"application/vnd.apache.arrow.stream":{"source":"iana"},"application/vnd.apache.thrift.binary":{"source":"iana"},"application/vnd.apache.thrift.compact":{"source":"iana"},"application/vnd.apache.thrift.json":{"source":"iana"},"application/vnd.api+json":{"source":"iana","compressible":true},"application/vnd.aplextor.warrp+json":{"source":"iana","compressible":true},"application/vnd.apothekende.reservation+json":{"source":"iana","compressible":true},"application/vnd.apple.installer+xml":{"source":"iana","compressible":true,"extensions":["mpkg"]},"application/vnd.apple.keynote":{"source":"iana","extensions":["key"]},"application/vnd.apple.mpegurl":{"source":"iana","extensions":["m3u8"]},"application/vnd.apple.numbers":{"source":"iana","extensions":["numbers"]},"application/vnd.apple.pages":{"source":"iana","extensions":["pages"]},"application/vnd.apple.pkpass":{"compressible":false,"extensions":["pkpass"]},"application/vnd.arastra.swi":{"source":"iana"},"application/vnd.aristanetworks.swi":{"source":"iana","extensions":["swi"]},"application/vnd.artisan+json":{"source":"iana","compressible":true},"application/vnd.artsquare":{"source":"iana"},"application/vnd.astraea-software.iota":{"source":"iana","extensions":["iota"]},"application/vnd.audiograph":{"source":"iana","extensions":["aep"]},"application/vnd.autopackage":{"source":"iana"},"application/vnd.avalon+json":{"source":"iana","compressible":true},"application/vnd.avistar+xml":{"source":"iana","compressible":true},"application/vnd.balsamiq.bmml+xml":{"source":"iana","compressible":true,"extensions":["bmml"]},"application/vnd.balsamiq.bmpr":{"source":"iana"},"application/vnd.banana-accounting":{"source":"iana"},"application/vnd.bbf.usp.error":{"source":"iana"},"application/vnd.bbf.usp.msg":{"source":"iana"},"application/vnd.bbf.usp.msg+json":{"source":"iana","compressible":true},"application/vnd.bekitzur-stech+json":{"source":"iana","compressible":true},"application/vnd.bint.med-content":{"source":"iana"},"application/vnd.biopax.rdf+xml":{"source":"iana","compressible":true},"application/vnd.blink-idb-value-wrapper":{"source":"iana"},"application/vnd.blueice.multipass":{"source":"iana","extensions":["mpm"]},"application/vnd.bluetooth.ep.oob":{"source":"iana"},"application/vnd.bluetooth.le.oob":{"source":"iana"},"application/vnd.bmi":{"source":"iana","extensions":["bmi"]},"application/vnd.bpf":{"source":"iana"},"application/vnd.bpf3":{"source":"iana"},"application/vnd.businessobjects":{"source":"iana","extensions":["rep"]},"application/vnd.byu.uapi+json":{"source":"iana","compressible":true},"application/vnd.cab-jscript":{"source":"iana"},"application/vnd.canon-cpdl":{"source":"iana"},"application/vnd.canon-lips":{"source":"iana"},"application/vnd.capasystems-pg+json":{"source":"iana","compressible":true},"application/vnd.cendio.thinlinc.clientconf":{"source":"iana"},"application/vnd.century-systems.tcp_stream":{"source":"iana"},"application/vnd.chemdraw+xml":{"source":"iana","compressible":true,"extensions":["cdxml"]},"application/vnd.chess-pgn":{"source":"iana"},"application/vnd.chipnuts.karaoke-mmd":{"source":"iana","extensions":["mmd"]},"application/vnd.ciedi":{"source":"iana"},"application/vnd.cinderella":{"source":"iana","extensions":["cdy"]},"application/vnd.cirpack.isdn-ext":{"source":"iana"},"application/vnd.citationstyles.style+xml":{"source":"iana","compressible":true,"extensions":["csl"]},"application/vnd.claymore":{"source":"iana","extensions":["cla"]},"application/vnd.cloanto.rp9":{"source":"iana","extensions":["rp9"]},"application/vnd.clonk.c4group":{"source":"iana","extensions":["c4g","c4d","c4f","c4p","c4u"]},"application/vnd.cluetrust.cartomobile-config":{"source":"iana","extensions":["c11amc"]},"application/vnd.cluetrust.cartomobile-config-pkg":{"source":"iana","extensions":["c11amz"]},"application/vnd.coffeescript":{"source":"iana"},"application/vnd.collabio.xodocuments.document":{"source":"iana"},"application/vnd.collabio.xodocuments.document-template":{"source":"iana"},"application/vnd.collabio.xodocuments.presentation":{"source":"iana"},"application/vnd.collabio.xodocuments.presentation-template":{"source":"iana"},"application/vnd.collabio.xodocuments.spreadsheet":{"source":"iana"},"application/vnd.collabio.xodocuments.spreadsheet-template":{"source":"iana"},"application/vnd.collection+json":{"source":"iana","compressible":true},"application/vnd.collection.doc+json":{"source":"iana","compressible":true},"application/vnd.collection.next+json":{"source":"iana","compressible":true},"application/vnd.comicbook+zip":{"source":"iana","compressible":false},"application/vnd.comicbook-rar":{"source":"iana"},"application/vnd.commerce-battelle":{"source":"iana"},"application/vnd.commonspace":{"source":"iana","extensions":["csp"]},"application/vnd.contact.cmsg":{"source":"iana","extensions":["cdbcmsg"]},"application/vnd.coreos.ignition+json":{"source":"iana","compressible":true},"application/vnd.cosmocaller":{"source":"iana","extensions":["cmc"]},"application/vnd.crick.clicker":{"source":"iana","extensions":["clkx"]},"application/vnd.crick.clicker.keyboard":{"source":"iana","extensions":["clkk"]},"application/vnd.crick.clicker.palette":{"source":"iana","extensions":["clkp"]},"application/vnd.crick.clicker.template":{"source":"iana","extensions":["clkt"]},"application/vnd.crick.clicker.wordbank":{"source":"iana","extensions":["clkw"]},"application/vnd.criticaltools.wbs+xml":{"source":"iana","compressible":true,"extensions":["wbs"]},"application/vnd.cryptii.pipe+json":{"source":"iana","compressible":true},"application/vnd.crypto-shade-file":{"source":"iana"},"application/vnd.cryptomator.encrypted":{"source":"iana"},"application/vnd.cryptomator.vault":{"source":"iana"},"application/vnd.ctc-posml":{"source":"iana","extensions":["pml"]},"application/vnd.ctct.ws+xml":{"source":"iana","compressible":true},"application/vnd.cups-pdf":{"source":"iana"},"application/vnd.cups-postscript":{"source":"iana"},"application/vnd.cups-ppd":{"source":"iana","extensions":["ppd"]},"application/vnd.cups-raster":{"source":"iana"},"application/vnd.cups-raw":{"source":"iana"},"application/vnd.curl":{"source":"iana"},"application/vnd.curl.car":{"source":"apache","extensions":["car"]},"application/vnd.curl.pcurl":{"source":"apache","extensions":["pcurl"]},"application/vnd.cyan.dean.root+xml":{"source":"iana","compressible":true},"application/vnd.cybank":{"source":"iana"},"application/vnd.cyclonedx+json":{"source":"iana","compressible":true},"application/vnd.cyclonedx+xml":{"source":"iana","compressible":true},"application/vnd.d2l.coursepackage1p0+zip":{"source":"iana","compressible":false},"application/vnd.d3m-dataset":{"source":"iana"},"application/vnd.d3m-problem":{"source":"iana"},"application/vnd.dart":{"source":"iana","compressible":true,"extensions":["dart"]},"application/vnd.data-vision.rdz":{"source":"iana","extensions":["rdz"]},"application/vnd.datapackage+json":{"source":"iana","compressible":true},"application/vnd.dataresource+json":{"source":"iana","compressible":true},"application/vnd.dbf":{"source":"iana","extensions":["dbf"]},"application/vnd.debian.binary-package":{"source":"iana"},"application/vnd.dece.data":{"source":"iana","extensions":["uvf","uvvf","uvd","uvvd"]},"application/vnd.dece.ttml+xml":{"source":"iana","compressible":true,"extensions":["uvt","uvvt"]},"application/vnd.dece.unspecified":{"source":"iana","extensions":["uvx","uvvx"]},"application/vnd.dece.zip":{"source":"iana","extensions":["uvz","uvvz"]},"application/vnd.denovo.fcselayout-link":{"source":"iana","extensions":["fe_launch"]},"application/vnd.desmume.movie":{"source":"iana"},"application/vnd.dir-bi.plate-dl-nosuffix":{"source":"iana"},"application/vnd.dm.delegation+xml":{"source":"iana","compressible":true},"application/vnd.dna":{"source":"iana","extensions":["dna"]},"application/vnd.document+json":{"source":"iana","compressible":true},"application/vnd.dolby.mlp":{"source":"apache","extensions":["mlp"]},"application/vnd.dolby.mobile.1":{"source":"iana"},"application/vnd.dolby.mobile.2":{"source":"iana"},"application/vnd.doremir.scorecloud-binary-document":{"source":"iana"},"application/vnd.dpgraph":{"source":"iana","extensions":["dpg"]},"application/vnd.dreamfactory":{"source":"iana","extensions":["dfac"]},"application/vnd.drive+json":{"source":"iana","compressible":true},"application/vnd.ds-keypoint":{"source":"apache","extensions":["kpxx"]},"application/vnd.dtg.local":{"source":"iana"},"application/vnd.dtg.local.flash":{"source":"iana"},"application/vnd.dtg.local.html":{"source":"iana"},"application/vnd.dvb.ait":{"source":"iana","extensions":["ait"]},"application/vnd.dvb.dvbisl+xml":{"source":"iana","compressible":true},"application/vnd.dvb.dvbj":{"source":"iana"},"application/vnd.dvb.esgcontainer":{"source":"iana"},"application/vnd.dvb.ipdcdftnotifaccess":{"source":"iana"},"application/vnd.dvb.ipdcesgaccess":{"source":"iana"},"application/vnd.dvb.ipdcesgaccess2":{"source":"iana"},"application/vnd.dvb.ipdcesgpdd":{"source":"iana"},"application/vnd.dvb.ipdcroaming":{"source":"iana"},"application/vnd.dvb.iptv.alfec-base":{"source":"iana"},"application/vnd.dvb.iptv.alfec-enhancement":{"source":"iana"},"application/vnd.dvb.notif-aggregate-root+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-container+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-generic+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-ia-msglist+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-ia-registration-request+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-ia-registration-response+xml":{"source":"iana","compressible":true},"application/vnd.dvb.notif-init+xml":{"source":"iana","compressible":true},"application/vnd.dvb.pfr":{"source":"iana"},"application/vnd.dvb.service":{"source":"iana","extensions":["svc"]},"application/vnd.dxr":{"source":"iana"},"application/vnd.dynageo":{"source":"iana","extensions":["geo"]},"application/vnd.dzr":{"source":"iana"},"application/vnd.easykaraoke.cdgdownload":{"source":"iana"},"application/vnd.ecdis-update":{"source":"iana"},"application/vnd.ecip.rlp":{"source":"iana"},"application/vnd.eclipse.ditto+json":{"source":"iana","compressible":true},"application/vnd.ecowin.chart":{"source":"iana","extensions":["mag"]},"application/vnd.ecowin.filerequest":{"source":"iana"},"application/vnd.ecowin.fileupdate":{"source":"iana"},"application/vnd.ecowin.series":{"source":"iana"},"application/vnd.ecowin.seriesrequest":{"source":"iana"},"application/vnd.ecowin.seriesupdate":{"source":"iana"},"application/vnd.efi.img":{"source":"iana"},"application/vnd.efi.iso":{"source":"iana"},"application/vnd.emclient.accessrequest+xml":{"source":"iana","compressible":true},"application/vnd.enliven":{"source":"iana","extensions":["nml"]},"application/vnd.enphase.envoy":{"source":"iana"},"application/vnd.eprints.data+xml":{"source":"iana","compressible":true},"application/vnd.epson.esf":{"source":"iana","extensions":["esf"]},"application/vnd.epson.msf":{"source":"iana","extensions":["msf"]},"application/vnd.epson.quickanime":{"source":"iana","extensions":["qam"]},"application/vnd.epson.salt":{"source":"iana","extensions":["slt"]},"application/vnd.epson.ssf":{"source":"iana","extensions":["ssf"]},"application/vnd.ericsson.quickcall":{"source":"iana"},"application/vnd.espass-espass+zip":{"source":"iana","compressible":false},"application/vnd.eszigno3+xml":{"source":"iana","compressible":true,"extensions":["es3","et3"]},"application/vnd.etsi.aoc+xml":{"source":"iana","compressible":true},"application/vnd.etsi.asic-e+zip":{"source":"iana","compressible":false},"application/vnd.etsi.asic-s+zip":{"source":"iana","compressible":false},"application/vnd.etsi.cug+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvcommand+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvdiscovery+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvprofile+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvsad-bc+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvsad-cod+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvsad-npvr+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvservice+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvsync+xml":{"source":"iana","compressible":true},"application/vnd.etsi.iptvueprofile+xml":{"source":"iana","compressible":true},"application/vnd.etsi.mcid+xml":{"source":"iana","compressible":true},"application/vnd.etsi.mheg5":{"source":"iana"},"application/vnd.etsi.overload-control-policy-dataset+xml":{"source":"iana","compressible":true},"application/vnd.etsi.pstn+xml":{"source":"iana","compressible":true},"application/vnd.etsi.sci+xml":{"source":"iana","compressible":true},"application/vnd.etsi.simservs+xml":{"source":"iana","compressible":true},"application/vnd.etsi.timestamp-token":{"source":"iana"},"application/vnd.etsi.tsl+xml":{"source":"iana","compressible":true},"application/vnd.etsi.tsl.der":{"source":"iana"},"application/vnd.eu.kasparian.car+json":{"source":"iana","compressible":true},"application/vnd.eudora.data":{"source":"iana"},"application/vnd.evolv.ecig.profile":{"source":"iana"},"application/vnd.evolv.ecig.settings":{"source":"iana"},"application/vnd.evolv.ecig.theme":{"source":"iana"},"application/vnd.exstream-empower+zip":{"source":"iana","compressible":false},"application/vnd.exstream-package":{"source":"iana"},"application/vnd.ezpix-album":{"source":"iana","extensions":["ez2"]},"application/vnd.ezpix-package":{"source":"iana","extensions":["ez3"]},"application/vnd.f-secure.mobile":{"source":"iana"},"application/vnd.familysearch.gedcom+zip":{"source":"iana","compressible":false},"application/vnd.fastcopy-disk-image":{"source":"iana"},"application/vnd.fdf":{"source":"iana","extensions":["fdf"]},"application/vnd.fdsn.mseed":{"source":"iana","extensions":["mseed"]},"application/vnd.fdsn.seed":{"source":"iana","extensions":["seed","dataless"]},"application/vnd.ffsns":{"source":"iana"},"application/vnd.ficlab.flb+zip":{"source":"iana","compressible":false},"application/vnd.filmit.zfc":{"source":"iana"},"application/vnd.fints":{"source":"iana"},"application/vnd.firemonkeys.cloudcell":{"source":"iana"},"application/vnd.flographit":{"source":"iana","extensions":["gph"]},"application/vnd.fluxtime.clip":{"source":"iana","extensions":["ftc"]},"application/vnd.font-fontforge-sfd":{"source":"iana"},"application/vnd.framemaker":{"source":"iana","extensions":["fm","frame","maker","book"]},"application/vnd.frogans.fnc":{"source":"iana","extensions":["fnc"]},"application/vnd.frogans.ltf":{"source":"iana","extensions":["ltf"]},"application/vnd.fsc.weblaunch":{"source":"iana","extensions":["fsc"]},"application/vnd.fujifilm.fb.docuworks":{"source":"iana"},"application/vnd.fujifilm.fb.docuworks.binder":{"source":"iana"},"application/vnd.fujifilm.fb.docuworks.container":{"source":"iana"},"application/vnd.fujifilm.fb.jfi+xml":{"source":"iana","compressible":true},"application/vnd.fujitsu.oasys":{"source":"iana","extensions":["oas"]},"application/vnd.fujitsu.oasys2":{"source":"iana","extensions":["oa2"]},"application/vnd.fujitsu.oasys3":{"source":"iana","extensions":["oa3"]},"application/vnd.fujitsu.oasysgp":{"source":"iana","extensions":["fg5"]},"application/vnd.fujitsu.oasysprs":{"source":"iana","extensions":["bh2"]},"application/vnd.fujixerox.art-ex":{"source":"iana"},"application/vnd.fujixerox.art4":{"source":"iana"},"application/vnd.fujixerox.ddd":{"source":"iana","extensions":["ddd"]},"application/vnd.fujixerox.docuworks":{"source":"iana","extensions":["xdw"]},"application/vnd.fujixerox.docuworks.binder":{"source":"iana","extensions":["xbd"]},"application/vnd.fujixerox.docuworks.container":{"source":"iana"},"application/vnd.fujixerox.hbpl":{"source":"iana"},"application/vnd.fut-misnet":{"source":"iana"},"application/vnd.futoin+cbor":{"source":"iana"},"application/vnd.futoin+json":{"source":"iana","compressible":true},"application/vnd.fuzzysheet":{"source":"iana","extensions":["fzs"]},"application/vnd.genomatix.tuxedo":{"source":"iana","extensions":["txd"]},"application/vnd.gentics.grd+json":{"source":"iana","compressible":true},"application/vnd.geo+json":{"source":"iana","compressible":true},"application/vnd.geocube+xml":{"source":"iana","compressible":true},"application/vnd.geogebra.file":{"source":"iana","extensions":["ggb"]},"application/vnd.geogebra.slides":{"source":"iana"},"application/vnd.geogebra.tool":{"source":"iana","extensions":["ggt"]},"application/vnd.geometry-explorer":{"source":"iana","extensions":["gex","gre"]},"application/vnd.geonext":{"source":"iana","extensions":["gxt"]},"application/vnd.geoplan":{"source":"iana","extensions":["g2w"]},"application/vnd.geospace":{"source":"iana","extensions":["g3w"]},"application/vnd.gerber":{"source":"iana"},"application/vnd.globalplatform.card-content-mgt":{"source":"iana"},"application/vnd.globalplatform.card-content-mgt-response":{"source":"iana"},"application/vnd.gmx":{"source":"iana","extensions":["gmx"]},"application/vnd.google-apps.document":{"compressible":false,"extensions":["gdoc"]},"application/vnd.google-apps.presentation":{"compressible":false,"extensions":["gslides"]},"application/vnd.google-apps.spreadsheet":{"compressible":false,"extensions":["gsheet"]},"application/vnd.google-earth.kml+xml":{"source":"iana","compressible":true,"extensions":["kml"]},"application/vnd.google-earth.kmz":{"source":"iana","compressible":false,"extensions":["kmz"]},"application/vnd.gov.sk.e-form+xml":{"source":"iana","compressible":true},"application/vnd.gov.sk.e-form+zip":{"source":"iana","compressible":false},"application/vnd.gov.sk.xmldatacontainer+xml":{"source":"iana","compressible":true},"application/vnd.grafeq":{"source":"iana","extensions":["gqf","gqs"]},"application/vnd.gridmp":{"source":"iana"},"application/vnd.groove-account":{"source":"iana","extensions":["gac"]},"application/vnd.groove-help":{"source":"iana","extensions":["ghf"]},"application/vnd.groove-identity-message":{"source":"iana","extensions":["gim"]},"application/vnd.groove-injector":{"source":"iana","extensions":["grv"]},"application/vnd.groove-tool-message":{"source":"iana","extensions":["gtm"]},"application/vnd.groove-tool-template":{"source":"iana","extensions":["tpl"]},"application/vnd.groove-vcard":{"source":"iana","extensions":["vcg"]},"application/vnd.hal+json":{"source":"iana","compressible":true},"application/vnd.hal+xml":{"source":"iana","compressible":true,"extensions":["hal"]},"application/vnd.handheld-entertainment+xml":{"source":"iana","compressible":true,"extensions":["zmm"]},"application/vnd.hbci":{"source":"iana","extensions":["hbci"]},"application/vnd.hc+json":{"source":"iana","compressible":true},"application/vnd.hcl-bireports":{"source":"iana"},"application/vnd.hdt":{"source":"iana"},"application/vnd.heroku+json":{"source":"iana","compressible":true},"application/vnd.hhe.lesson-player":{"source":"iana","extensions":["les"]},"application/vnd.hl7cda+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/vnd.hl7v2+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/vnd.hp-hpgl":{"source":"iana","extensions":["hpgl"]},"application/vnd.hp-hpid":{"source":"iana","extensions":["hpid"]},"application/vnd.hp-hps":{"source":"iana","extensions":["hps"]},"application/vnd.hp-jlyt":{"source":"iana","extensions":["jlt"]},"application/vnd.hp-pcl":{"source":"iana","extensions":["pcl"]},"application/vnd.hp-pclxl":{"source":"iana","extensions":["pclxl"]},"application/vnd.httphone":{"source":"iana"},"application/vnd.hydrostatix.sof-data":{"source":"iana","extensions":["sfd-hdstx"]},"application/vnd.hyper+json":{"source":"iana","compressible":true},"application/vnd.hyper-item+json":{"source":"iana","compressible":true},"application/vnd.hyperdrive+json":{"source":"iana","compressible":true},"application/vnd.hzn-3d-crossword":{"source":"iana"},"application/vnd.ibm.afplinedata":{"source":"iana"},"application/vnd.ibm.electronic-media":{"source":"iana"},"application/vnd.ibm.minipay":{"source":"iana","extensions":["mpy"]},"application/vnd.ibm.modcap":{"source":"iana","extensions":["afp","listafp","list3820"]},"application/vnd.ibm.rights-management":{"source":"iana","extensions":["irm"]},"application/vnd.ibm.secure-container":{"source":"iana","extensions":["sc"]},"application/vnd.iccprofile":{"source":"iana","extensions":["icc","icm"]},"application/vnd.ieee.1905":{"source":"iana"},"application/vnd.igloader":{"source":"iana","extensions":["igl"]},"application/vnd.imagemeter.folder+zip":{"source":"iana","compressible":false},"application/vnd.imagemeter.image+zip":{"source":"iana","compressible":false},"application/vnd.immervision-ivp":{"source":"iana","extensions":["ivp"]},"application/vnd.immervision-ivu":{"source":"iana","extensions":["ivu"]},"application/vnd.ims.imsccv1p1":{"source":"iana"},"application/vnd.ims.imsccv1p2":{"source":"iana"},"application/vnd.ims.imsccv1p3":{"source":"iana"},"application/vnd.ims.lis.v2.result+json":{"source":"iana","compressible":true},"application/vnd.ims.lti.v2.toolconsumerprofile+json":{"source":"iana","compressible":true},"application/vnd.ims.lti.v2.toolproxy+json":{"source":"iana","compressible":true},"application/vnd.ims.lti.v2.toolproxy.id+json":{"source":"iana","compressible":true},"application/vnd.ims.lti.v2.toolsettings+json":{"source":"iana","compressible":true},"application/vnd.ims.lti.v2.toolsettings.simple+json":{"source":"iana","compressible":true},"application/vnd.informedcontrol.rms+xml":{"source":"iana","compressible":true},"application/vnd.informix-visionary":{"source":"iana"},"application/vnd.infotech.project":{"source":"iana"},"application/vnd.infotech.project+xml":{"source":"iana","compressible":true},"application/vnd.innopath.wamp.notification":{"source":"iana"},"application/vnd.insors.igm":{"source":"iana","extensions":["igm"]},"application/vnd.intercon.formnet":{"source":"iana","extensions":["xpw","xpx"]},"application/vnd.intergeo":{"source":"iana","extensions":["i2g"]},"application/vnd.intertrust.digibox":{"source":"iana"},"application/vnd.intertrust.nncp":{"source":"iana"},"application/vnd.intu.qbo":{"source":"iana","extensions":["qbo"]},"application/vnd.intu.qfx":{"source":"iana","extensions":["qfx"]},"application/vnd.iptc.g2.catalogitem+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.conceptitem+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.knowledgeitem+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.newsitem+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.newsmessage+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.packageitem+xml":{"source":"iana","compressible":true},"application/vnd.iptc.g2.planningitem+xml":{"source":"iana","compressible":true},"application/vnd.ipunplugged.rcprofile":{"source":"iana","extensions":["rcprofile"]},"application/vnd.irepository.package+xml":{"source":"iana","compressible":true,"extensions":["irp"]},"application/vnd.is-xpr":{"source":"iana","extensions":["xpr"]},"application/vnd.isac.fcs":{"source":"iana","extensions":["fcs"]},"application/vnd.iso11783-10+zip":{"source":"iana","compressible":false},"application/vnd.jam":{"source":"iana","extensions":["jam"]},"application/vnd.japannet-directory-service":{"source":"iana"},"application/vnd.japannet-jpnstore-wakeup":{"source":"iana"},"application/vnd.japannet-payment-wakeup":{"source":"iana"},"application/vnd.japannet-registration":{"source":"iana"},"application/vnd.japannet-registration-wakeup":{"source":"iana"},"application/vnd.japannet-setstore-wakeup":{"source":"iana"},"application/vnd.japannet-verification":{"source":"iana"},"application/vnd.japannet-verification-wakeup":{"source":"iana"},"application/vnd.jcp.javame.midlet-rms":{"source":"iana","extensions":["rms"]},"application/vnd.jisp":{"source":"iana","extensions":["jisp"]},"application/vnd.joost.joda-archive":{"source":"iana","extensions":["joda"]},"application/vnd.jsk.isdn-ngn":{"source":"iana"},"application/vnd.kahootz":{"source":"iana","extensions":["ktz","ktr"]},"application/vnd.kde.karbon":{"source":"iana","extensions":["karbon"]},"application/vnd.kde.kchart":{"source":"iana","extensions":["chrt"]},"application/vnd.kde.kformula":{"source":"iana","extensions":["kfo"]},"application/vnd.kde.kivio":{"source":"iana","extensions":["flw"]},"application/vnd.kde.kontour":{"source":"iana","extensions":["kon"]},"application/vnd.kde.kpresenter":{"source":"iana","extensions":["kpr","kpt"]},"application/vnd.kde.kspread":{"source":"iana","extensions":["ksp"]},"application/vnd.kde.kword":{"source":"iana","extensions":["kwd","kwt"]},"application/vnd.kenameaapp":{"source":"iana","extensions":["htke"]},"application/vnd.kidspiration":{"source":"iana","extensions":["kia"]},"application/vnd.kinar":{"source":"iana","extensions":["kne","knp"]},"application/vnd.koan":{"source":"iana","extensions":["skp","skd","skt","skm"]},"application/vnd.kodak-descriptor":{"source":"iana","extensions":["sse"]},"application/vnd.las":{"source":"iana"},"application/vnd.las.las+json":{"source":"iana","compressible":true},"application/vnd.las.las+xml":{"source":"iana","compressible":true,"extensions":["lasxml"]},"application/vnd.laszip":{"source":"iana"},"application/vnd.leap+json":{"source":"iana","compressible":true},"application/vnd.liberty-request+xml":{"source":"iana","compressible":true},"application/vnd.llamagraphics.life-balance.desktop":{"source":"iana","extensions":["lbd"]},"application/vnd.llamagraphics.life-balance.exchange+xml":{"source":"iana","compressible":true,"extensions":["lbe"]},"application/vnd.logipipe.circuit+zip":{"source":"iana","compressible":false},"application/vnd.loom":{"source":"iana"},"application/vnd.lotus-1-2-3":{"source":"iana","extensions":["123"]},"application/vnd.lotus-approach":{"source":"iana","extensions":["apr"]},"application/vnd.lotus-freelance":{"source":"iana","extensions":["pre"]},"application/vnd.lotus-notes":{"source":"iana","extensions":["nsf"]},"application/vnd.lotus-organizer":{"source":"iana","extensions":["org"]},"application/vnd.lotus-screencam":{"source":"iana","extensions":["scm"]},"application/vnd.lotus-wordpro":{"source":"iana","extensions":["lwp"]},"application/vnd.macports.portpkg":{"source":"iana","extensions":["portpkg"]},"application/vnd.mapbox-vector-tile":{"source":"iana","extensions":["mvt"]},"application/vnd.marlin.drm.actiontoken+xml":{"source":"iana","compressible":true},"application/vnd.marlin.drm.conftoken+xml":{"source":"iana","compressible":true},"application/vnd.marlin.drm.license+xml":{"source":"iana","compressible":true},"application/vnd.marlin.drm.mdcf":{"source":"iana"},"application/vnd.mason+json":{"source":"iana","compressible":true},"application/vnd.maxar.archive.3tz+zip":{"source":"iana","compressible":false},"application/vnd.maxmind.maxmind-db":{"source":"iana"},"application/vnd.mcd":{"source":"iana","extensions":["mcd"]},"application/vnd.medcalcdata":{"source":"iana","extensions":["mc1"]},"application/vnd.mediastation.cdkey":{"source":"iana","extensions":["cdkey"]},"application/vnd.meridian-slingshot":{"source":"iana"},"application/vnd.mfer":{"source":"iana","extensions":["mwf"]},"application/vnd.mfmp":{"source":"iana","extensions":["mfm"]},"application/vnd.micro+json":{"source":"iana","compressible":true},"application/vnd.micrografx.flo":{"source":"iana","extensions":["flo"]},"application/vnd.micrografx.igx":{"source":"iana","extensions":["igx"]},"application/vnd.microsoft.portable-executable":{"source":"iana"},"application/vnd.microsoft.windows.thumbnail-cache":{"source":"iana"},"application/vnd.miele+json":{"source":"iana","compressible":true},"application/vnd.mif":{"source":"iana","extensions":["mif"]},"application/vnd.minisoft-hp3000-save":{"source":"iana"},"application/vnd.mitsubishi.misty-guard.trustweb":{"source":"iana"},"application/vnd.mobius.daf":{"source":"iana","extensions":["daf"]},"application/vnd.mobius.dis":{"source":"iana","extensions":["dis"]},"application/vnd.mobius.mbk":{"source":"iana","extensions":["mbk"]},"application/vnd.mobius.mqy":{"source":"iana","extensions":["mqy"]},"application/vnd.mobius.msl":{"source":"iana","extensions":["msl"]},"application/vnd.mobius.plc":{"source":"iana","extensions":["plc"]},"application/vnd.mobius.txf":{"source":"iana","extensions":["txf"]},"application/vnd.mophun.application":{"source":"iana","extensions":["mpn"]},"application/vnd.mophun.certificate":{"source":"iana","extensions":["mpc"]},"application/vnd.motorola.flexsuite":{"source":"iana"},"application/vnd.motorola.flexsuite.adsi":{"source":"iana"},"application/vnd.motorola.flexsuite.fis":{"source":"iana"},"application/vnd.motorola.flexsuite.gotap":{"source":"iana"},"application/vnd.motorola.flexsuite.kmr":{"source":"iana"},"application/vnd.motorola.flexsuite.ttc":{"source":"iana"},"application/vnd.motorola.flexsuite.wem":{"source":"iana"},"application/vnd.motorola.iprm":{"source":"iana"},"application/vnd.mozilla.xul+xml":{"source":"iana","compressible":true,"extensions":["xul"]},"application/vnd.ms-3mfdocument":{"source":"iana"},"application/vnd.ms-artgalry":{"source":"iana","extensions":["cil"]},"application/vnd.ms-asf":{"source":"iana"},"application/vnd.ms-cab-compressed":{"source":"iana","extensions":["cab"]},"application/vnd.ms-color.iccprofile":{"source":"apache"},"application/vnd.ms-excel":{"source":"iana","compressible":false,"extensions":["xls","xlm","xla","xlc","xlt","xlw"]},"application/vnd.ms-excel.addin.macroenabled.12":{"source":"iana","extensions":["xlam"]},"application/vnd.ms-excel.sheet.binary.macroenabled.12":{"source":"iana","extensions":["xlsb"]},"application/vnd.ms-excel.sheet.macroenabled.12":{"source":"iana","extensions":["xlsm"]},"application/vnd.ms-excel.template.macroenabled.12":{"source":"iana","extensions":["xltm"]},"application/vnd.ms-fontobject":{"source":"iana","compressible":true,"extensions":["eot"]},"application/vnd.ms-htmlhelp":{"source":"iana","extensions":["chm"]},"application/vnd.ms-ims":{"source":"iana","extensions":["ims"]},"application/vnd.ms-lrm":{"source":"iana","extensions":["lrm"]},"application/vnd.ms-office.activex+xml":{"source":"iana","compressible":true},"application/vnd.ms-officetheme":{"source":"iana","extensions":["thmx"]},"application/vnd.ms-opentype":{"source":"apache","compressible":true},"application/vnd.ms-outlook":{"compressible":false,"extensions":["msg"]},"application/vnd.ms-package.obfuscated-opentype":{"source":"apache"},"application/vnd.ms-pki.seccat":{"source":"apache","extensions":["cat"]},"application/vnd.ms-pki.stl":{"source":"apache","extensions":["stl"]},"application/vnd.ms-playready.initiator+xml":{"source":"iana","compressible":true},"application/vnd.ms-powerpoint":{"source":"iana","compressible":false,"extensions":["ppt","pps","pot"]},"application/vnd.ms-powerpoint.addin.macroenabled.12":{"source":"iana","extensions":["ppam"]},"application/vnd.ms-powerpoint.presentation.macroenabled.12":{"source":"iana","extensions":["pptm"]},"application/vnd.ms-powerpoint.slide.macroenabled.12":{"source":"iana","extensions":["sldm"]},"application/vnd.ms-powerpoint.slideshow.macroenabled.12":{"source":"iana","extensions":["ppsm"]},"application/vnd.ms-powerpoint.template.macroenabled.12":{"source":"iana","extensions":["potm"]},"application/vnd.ms-printdevicecapabilities+xml":{"source":"iana","compressible":true},"application/vnd.ms-printing.printticket+xml":{"source":"apache","compressible":true},"application/vnd.ms-printschematicket+xml":{"source":"iana","compressible":true},"application/vnd.ms-project":{"source":"iana","extensions":["mpp","mpt"]},"application/vnd.ms-tnef":{"source":"iana"},"application/vnd.ms-windows.devicepairing":{"source":"iana"},"application/vnd.ms-windows.nwprinting.oob":{"source":"iana"},"application/vnd.ms-windows.printerpairing":{"source":"iana"},"application/vnd.ms-windows.wsd.oob":{"source":"iana"},"application/vnd.ms-wmdrm.lic-chlg-req":{"source":"iana"},"application/vnd.ms-wmdrm.lic-resp":{"source":"iana"},"application/vnd.ms-wmdrm.meter-chlg-req":{"source":"iana"},"application/vnd.ms-wmdrm.meter-resp":{"source":"iana"},"application/vnd.ms-word.document.macroenabled.12":{"source":"iana","extensions":["docm"]},"application/vnd.ms-word.template.macroenabled.12":{"source":"iana","extensions":["dotm"]},"application/vnd.ms-works":{"source":"iana","extensions":["wps","wks","wcm","wdb"]},"application/vnd.ms-wpl":{"source":"iana","extensions":["wpl"]},"application/vnd.ms-xpsdocument":{"source":"iana","compressible":false,"extensions":["xps"]},"application/vnd.msa-disk-image":{"source":"iana"},"application/vnd.mseq":{"source":"iana","extensions":["mseq"]},"application/vnd.msign":{"source":"iana"},"application/vnd.multiad.creator":{"source":"iana"},"application/vnd.multiad.creator.cif":{"source":"iana"},"application/vnd.music-niff":{"source":"iana"},"application/vnd.musician":{"source":"iana","extensions":["mus"]},"application/vnd.muvee.style":{"source":"iana","extensions":["msty"]},"application/vnd.mynfc":{"source":"iana","extensions":["taglet"]},"application/vnd.nacamar.ybrid+json":{"source":"iana","compressible":true},"application/vnd.ncd.control":{"source":"iana"},"application/vnd.ncd.reference":{"source":"iana"},"application/vnd.nearst.inv+json":{"source":"iana","compressible":true},"application/vnd.nebumind.line":{"source":"iana"},"application/vnd.nervana":{"source":"iana"},"application/vnd.netfpx":{"source":"iana"},"application/vnd.neurolanguage.nlu":{"source":"iana","extensions":["nlu"]},"application/vnd.nimn":{"source":"iana"},"application/vnd.nintendo.nitro.rom":{"source":"iana"},"application/vnd.nintendo.snes.rom":{"source":"iana"},"application/vnd.nitf":{"source":"iana","extensions":["ntf","nitf"]},"application/vnd.noblenet-directory":{"source":"iana","extensions":["nnd"]},"application/vnd.noblenet-sealer":{"source":"iana","extensions":["nns"]},"application/vnd.noblenet-web":{"source":"iana","extensions":["nnw"]},"application/vnd.nokia.catalogs":{"source":"iana"},"application/vnd.nokia.conml+wbxml":{"source":"iana"},"application/vnd.nokia.conml+xml":{"source":"iana","compressible":true},"application/vnd.nokia.iptv.config+xml":{"source":"iana","compressible":true},"application/vnd.nokia.isds-radio-presets":{"source":"iana"},"application/vnd.nokia.landmark+wbxml":{"source":"iana"},"application/vnd.nokia.landmark+xml":{"source":"iana","compressible":true},"application/vnd.nokia.landmarkcollection+xml":{"source":"iana","compressible":true},"application/vnd.nokia.n-gage.ac+xml":{"source":"iana","compressible":true,"extensions":["ac"]},"application/vnd.nokia.n-gage.data":{"source":"iana","extensions":["ngdat"]},"application/vnd.nokia.n-gage.symbian.install":{"source":"iana","extensions":["n-gage"]},"application/vnd.nokia.ncd":{"source":"iana"},"application/vnd.nokia.pcd+wbxml":{"source":"iana"},"application/vnd.nokia.pcd+xml":{"source":"iana","compressible":true},"application/vnd.nokia.radio-preset":{"source":"iana","extensions":["rpst"]},"application/vnd.nokia.radio-presets":{"source":"iana","extensions":["rpss"]},"application/vnd.novadigm.edm":{"source":"iana","extensions":["edm"]},"application/vnd.novadigm.edx":{"source":"iana","extensions":["edx"]},"application/vnd.novadigm.ext":{"source":"iana","extensions":["ext"]},"application/vnd.ntt-local.content-share":{"source":"iana"},"application/vnd.ntt-local.file-transfer":{"source":"iana"},"application/vnd.ntt-local.ogw_remote-access":{"source":"iana"},"application/vnd.ntt-local.sip-ta_remote":{"source":"iana"},"application/vnd.ntt-local.sip-ta_tcp_stream":{"source":"iana"},"application/vnd.oasis.opendocument.chart":{"source":"iana","extensions":["odc"]},"application/vnd.oasis.opendocument.chart-template":{"source":"iana","extensions":["otc"]},"application/vnd.oasis.opendocument.database":{"source":"iana","extensions":["odb"]},"application/vnd.oasis.opendocument.formula":{"source":"iana","extensions":["odf"]},"application/vnd.oasis.opendocument.formula-template":{"source":"iana","extensions":["odft"]},"application/vnd.oasis.opendocument.graphics":{"source":"iana","compressible":false,"extensions":["odg"]},"application/vnd.oasis.opendocument.graphics-template":{"source":"iana","extensions":["otg"]},"application/vnd.oasis.opendocument.image":{"source":"iana","extensions":["odi"]},"application/vnd.oasis.opendocument.image-template":{"source":"iana","extensions":["oti"]},"application/vnd.oasis.opendocument.presentation":{"source":"iana","compressible":false,"extensions":["odp"]},"application/vnd.oasis.opendocument.presentation-template":{"source":"iana","extensions":["otp"]},"application/vnd.oasis.opendocument.spreadsheet":{"source":"iana","compressible":false,"extensions":["ods"]},"application/vnd.oasis.opendocument.spreadsheet-template":{"source":"iana","extensions":["ots"]},"application/vnd.oasis.opendocument.text":{"source":"iana","compressible":false,"extensions":["odt"]},"application/vnd.oasis.opendocument.text-master":{"source":"iana","extensions":["odm"]},"application/vnd.oasis.opendocument.text-template":{"source":"iana","extensions":["ott"]},"application/vnd.oasis.opendocument.text-web":{"source":"iana","extensions":["oth"]},"application/vnd.obn":{"source":"iana"},"application/vnd.ocf+cbor":{"source":"iana"},"application/vnd.oci.image.manifest.v1+json":{"source":"iana","compressible":true},"application/vnd.oftn.l10n+json":{"source":"iana","compressible":true},"application/vnd.oipf.contentaccessdownload+xml":{"source":"iana","compressible":true},"application/vnd.oipf.contentaccessstreaming+xml":{"source":"iana","compressible":true},"application/vnd.oipf.cspg-hexbinary":{"source":"iana"},"application/vnd.oipf.dae.svg+xml":{"source":"iana","compressible":true},"application/vnd.oipf.dae.xhtml+xml":{"source":"iana","compressible":true},"application/vnd.oipf.mippvcontrolmessage+xml":{"source":"iana","compressible":true},"application/vnd.oipf.pae.gem":{"source":"iana"},"application/vnd.oipf.spdiscovery+xml":{"source":"iana","compressible":true},"application/vnd.oipf.spdlist+xml":{"source":"iana","compressible":true},"application/vnd.oipf.ueprofile+xml":{"source":"iana","compressible":true},"application/vnd.oipf.userprofile+xml":{"source":"iana","compressible":true},"application/vnd.olpc-sugar":{"source":"iana","extensions":["xo"]},"application/vnd.oma-scws-config":{"source":"iana"},"application/vnd.oma-scws-http-request":{"source":"iana"},"application/vnd.oma-scws-http-response":{"source":"iana"},"application/vnd.oma.bcast.associated-procedure-parameter+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.drm-trigger+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.imd+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.ltkm":{"source":"iana"},"application/vnd.oma.bcast.notification+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.provisioningtrigger":{"source":"iana"},"application/vnd.oma.bcast.sgboot":{"source":"iana"},"application/vnd.oma.bcast.sgdd+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.sgdu":{"source":"iana"},"application/vnd.oma.bcast.simple-symbol-container":{"source":"iana"},"application/vnd.oma.bcast.smartcard-trigger+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.sprov+xml":{"source":"iana","compressible":true},"application/vnd.oma.bcast.stkm":{"source":"iana"},"application/vnd.oma.cab-address-book+xml":{"source":"iana","compressible":true},"application/vnd.oma.cab-feature-handler+xml":{"source":"iana","compressible":true},"application/vnd.oma.cab-pcc+xml":{"source":"iana","compressible":true},"application/vnd.oma.cab-subs-invite+xml":{"source":"iana","compressible":true},"application/vnd.oma.cab-user-prefs+xml":{"source":"iana","compressible":true},"application/vnd.oma.dcd":{"source":"iana"},"application/vnd.oma.dcdc":{"source":"iana"},"application/vnd.oma.dd2+xml":{"source":"iana","compressible":true,"extensions":["dd2"]},"application/vnd.oma.drm.risd+xml":{"source":"iana","compressible":true},"application/vnd.oma.group-usage-list+xml":{"source":"iana","compressible":true},"application/vnd.oma.lwm2m+cbor":{"source":"iana"},"application/vnd.oma.lwm2m+json":{"source":"iana","compressible":true},"application/vnd.oma.lwm2m+tlv":{"source":"iana"},"application/vnd.oma.pal+xml":{"source":"iana","compressible":true},"application/vnd.oma.poc.detailed-progress-report+xml":{"source":"iana","compressible":true},"application/vnd.oma.poc.final-report+xml":{"source":"iana","compressible":true},"application/vnd.oma.poc.groups+xml":{"source":"iana","compressible":true},"application/vnd.oma.poc.invocation-descriptor+xml":{"source":"iana","compressible":true},"application/vnd.oma.poc.optimized-progress-report+xml":{"source":"iana","compressible":true},"application/vnd.oma.push":{"source":"iana"},"application/vnd.oma.scidm.messages+xml":{"source":"iana","compressible":true},"application/vnd.oma.xcap-directory+xml":{"source":"iana","compressible":true},"application/vnd.omads-email+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/vnd.omads-file+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/vnd.omads-folder+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/vnd.omaloc-supl-init":{"source":"iana"},"application/vnd.onepager":{"source":"iana"},"application/vnd.onepagertamp":{"source":"iana"},"application/vnd.onepagertamx":{"source":"iana"},"application/vnd.onepagertat":{"source":"iana"},"application/vnd.onepagertatp":{"source":"iana"},"application/vnd.onepagertatx":{"source":"iana"},"application/vnd.openblox.game+xml":{"source":"iana","compressible":true,"extensions":["obgx"]},"application/vnd.openblox.game-binary":{"source":"iana"},"application/vnd.openeye.oeb":{"source":"iana"},"application/vnd.openofficeorg.extension":{"source":"apache","extensions":["oxt"]},"application/vnd.openstreetmap.data+xml":{"source":"iana","compressible":true,"extensions":["osm"]},"application/vnd.opentimestamps.ots":{"source":"iana"},"application/vnd.openxmlformats-officedocument.custom-properties+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.customxmlproperties+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawing+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.chart+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.extended-properties+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.comments+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.presentation":{"source":"iana","compressible":false,"extensions":["pptx"]},"application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.presprops+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.slide":{"source":"iana","extensions":["sldx"]},"application/vnd.openxmlformats-officedocument.presentationml.slide+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.slideshow":{"source":"iana","extensions":["ppsx"]},"application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.tags+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.template":{"source":"iana","extensions":["potx"]},"application/vnd.openxmlformats-officedocument.presentationml.template.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{"source":"iana","compressible":false,"extensions":["xlsx"]},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.template":{"source":"iana","extensions":["xltx"]},"application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.theme+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.themeoverride+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.vmldrawing":{"source":"iana"},"application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.document":{"source":"iana","compressible":false,"extensions":["docx"]},"application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.template":{"source":"iana","extensions":["dotx"]},"application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-package.core-properties+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml":{"source":"iana","compressible":true},"application/vnd.openxmlformats-package.relationships+xml":{"source":"iana","compressible":true},"application/vnd.oracle.resource+json":{"source":"iana","compressible":true},"application/vnd.orange.indata":{"source":"iana"},"application/vnd.osa.netdeploy":{"source":"iana"},"application/vnd.osgeo.mapguide.package":{"source":"iana","extensions":["mgp"]},"application/vnd.osgi.bundle":{"source":"iana"},"application/vnd.osgi.dp":{"source":"iana","extensions":["dp"]},"application/vnd.osgi.subsystem":{"source":"iana","extensions":["esa"]},"application/vnd.otps.ct-kip+xml":{"source":"iana","compressible":true},"application/vnd.oxli.countgraph":{"source":"iana"},"application/vnd.pagerduty+json":{"source":"iana","compressible":true},"application/vnd.palm":{"source":"iana","extensions":["pdb","pqa","oprc"]},"application/vnd.panoply":{"source":"iana"},"application/vnd.paos.xml":{"source":"iana"},"application/vnd.patentdive":{"source":"iana"},"application/vnd.patientecommsdoc":{"source":"iana"},"application/vnd.pawaafile":{"source":"iana","extensions":["paw"]},"application/vnd.pcos":{"source":"iana"},"application/vnd.pg.format":{"source":"iana","extensions":["str"]},"application/vnd.pg.osasli":{"source":"iana","extensions":["ei6"]},"application/vnd.piaccess.application-licence":{"source":"iana"},"application/vnd.picsel":{"source":"iana","extensions":["efif"]},"application/vnd.pmi.widget":{"source":"iana","extensions":["wg"]},"application/vnd.poc.group-advertisement+xml":{"source":"iana","compressible":true},"application/vnd.pocketlearn":{"source":"iana","extensions":["plf"]},"application/vnd.powerbuilder6":{"source":"iana","extensions":["pbd"]},"application/vnd.powerbuilder6-s":{"source":"iana"},"application/vnd.powerbuilder7":{"source":"iana"},"application/vnd.powerbuilder7-s":{"source":"iana"},"application/vnd.powerbuilder75":{"source":"iana"},"application/vnd.powerbuilder75-s":{"source":"iana"},"application/vnd.preminet":{"source":"iana"},"application/vnd.previewsystems.box":{"source":"iana","extensions":["box"]},"application/vnd.proteus.magazine":{"source":"iana","extensions":["mgz"]},"application/vnd.psfs":{"source":"iana"},"application/vnd.publishare-delta-tree":{"source":"iana","extensions":["qps"]},"application/vnd.pvi.ptid1":{"source":"iana","extensions":["ptid"]},"application/vnd.pwg-multiplexed":{"source":"iana"},"application/vnd.pwg-xhtml-print+xml":{"source":"iana","compressible":true},"application/vnd.qualcomm.brew-app-res":{"source":"iana"},"application/vnd.quarantainenet":{"source":"iana"},"application/vnd.quark.quarkxpress":{"source":"iana","extensions":["qxd","qxt","qwd","qwt","qxl","qxb"]},"application/vnd.quobject-quoxdocument":{"source":"iana"},"application/vnd.radisys.moml+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-audit+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-audit-conf+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-audit-conn+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-audit-dialog+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-audit-stream+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-conf+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-base+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-fax-detect+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-fax-sendrecv+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-group+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-speech+xml":{"source":"iana","compressible":true},"application/vnd.radisys.msml-dialog-transform+xml":{"source":"iana","compressible":true},"application/vnd.rainstor.data":{"source":"iana"},"application/vnd.rapid":{"source":"iana"},"application/vnd.rar":{"source":"iana","extensions":["rar"]},"application/vnd.realvnc.bed":{"source":"iana","extensions":["bed"]},"application/vnd.recordare.musicxml":{"source":"iana","extensions":["mxl"]},"application/vnd.recordare.musicxml+xml":{"source":"iana","compressible":true,"extensions":["musicxml"]},"application/vnd.renlearn.rlprint":{"source":"iana"},"application/vnd.resilient.logic":{"source":"iana"},"application/vnd.restful+json":{"source":"iana","compressible":true},"application/vnd.rig.cryptonote":{"source":"iana","extensions":["cryptonote"]},"application/vnd.rim.cod":{"source":"apache","extensions":["cod"]},"application/vnd.rn-realmedia":{"source":"apache","extensions":["rm"]},"application/vnd.rn-realmedia-vbr":{"source":"apache","extensions":["rmvb"]},"application/vnd.route66.link66+xml":{"source":"iana","compressible":true,"extensions":["link66"]},"application/vnd.rs-274x":{"source":"iana"},"application/vnd.ruckus.download":{"source":"iana"},"application/vnd.s3sms":{"source":"iana"},"application/vnd.sailingtracker.track":{"source":"iana","extensions":["st"]},"application/vnd.sar":{"source":"iana"},"application/vnd.sbm.cid":{"source":"iana"},"application/vnd.sbm.mid2":{"source":"iana"},"application/vnd.scribus":{"source":"iana"},"application/vnd.sealed.3df":{"source":"iana"},"application/vnd.sealed.csf":{"source":"iana"},"application/vnd.sealed.doc":{"source":"iana"},"application/vnd.sealed.eml":{"source":"iana"},"application/vnd.sealed.mht":{"source":"iana"},"application/vnd.sealed.net":{"source":"iana"},"application/vnd.sealed.ppt":{"source":"iana"},"application/vnd.sealed.tiff":{"source":"iana"},"application/vnd.sealed.xls":{"source":"iana"},"application/vnd.sealedmedia.softseal.html":{"source":"iana"},"application/vnd.sealedmedia.softseal.pdf":{"source":"iana"},"application/vnd.seemail":{"source":"iana","extensions":["see"]},"application/vnd.seis+json":{"source":"iana","compressible":true},"application/vnd.sema":{"source":"iana","extensions":["sema"]},"application/vnd.semd":{"source":"iana","extensions":["semd"]},"application/vnd.semf":{"source":"iana","extensions":["semf"]},"application/vnd.shade-save-file":{"source":"iana"},"application/vnd.shana.informed.formdata":{"source":"iana","extensions":["ifm"]},"application/vnd.shana.informed.formtemplate":{"source":"iana","extensions":["itp"]},"application/vnd.shana.informed.interchange":{"source":"iana","extensions":["iif"]},"application/vnd.shana.informed.package":{"source":"iana","extensions":["ipk"]},"application/vnd.shootproof+json":{"source":"iana","compressible":true},"application/vnd.shopkick+json":{"source":"iana","compressible":true},"application/vnd.shp":{"source":"iana"},"application/vnd.shx":{"source":"iana"},"application/vnd.sigrok.session":{"source":"iana"},"application/vnd.simtech-mindmapper":{"source":"iana","extensions":["twd","twds"]},"application/vnd.siren+json":{"source":"iana","compressible":true},"application/vnd.smaf":{"source":"iana","extensions":["mmf"]},"application/vnd.smart.notebook":{"source":"iana"},"application/vnd.smart.teacher":{"source":"iana","extensions":["teacher"]},"application/vnd.snesdev-page-table":{"source":"iana"},"application/vnd.software602.filler.form+xml":{"source":"iana","compressible":true,"extensions":["fo"]},"application/vnd.software602.filler.form-xml-zip":{"source":"iana"},"application/vnd.solent.sdkm+xml":{"source":"iana","compressible":true,"extensions":["sdkm","sdkd"]},"application/vnd.spotfire.dxp":{"source":"iana","extensions":["dxp"]},"application/vnd.spotfire.sfs":{"source":"iana","extensions":["sfs"]},"application/vnd.sqlite3":{"source":"iana"},"application/vnd.sss-cod":{"source":"iana"},"application/vnd.sss-dtf":{"source":"iana"},"application/vnd.sss-ntf":{"source":"iana"},"application/vnd.stardivision.calc":{"source":"apache","extensions":["sdc"]},"application/vnd.stardivision.draw":{"source":"apache","extensions":["sda"]},"application/vnd.stardivision.impress":{"source":"apache","extensions":["sdd"]},"application/vnd.stardivision.math":{"source":"apache","extensions":["smf"]},"application/vnd.stardivision.writer":{"source":"apache","extensions":["sdw","vor"]},"application/vnd.stardivision.writer-global":{"source":"apache","extensions":["sgl"]},"application/vnd.stepmania.package":{"source":"iana","extensions":["smzip"]},"application/vnd.stepmania.stepchart":{"source":"iana","extensions":["sm"]},"application/vnd.street-stream":{"source":"iana"},"application/vnd.sun.wadl+xml":{"source":"iana","compressible":true,"extensions":["wadl"]},"application/vnd.sun.xml.calc":{"source":"apache","extensions":["sxc"]},"application/vnd.sun.xml.calc.template":{"source":"apache","extensions":["stc"]},"application/vnd.sun.xml.draw":{"source":"apache","extensions":["sxd"]},"application/vnd.sun.xml.draw.template":{"source":"apache","extensions":["std"]},"application/vnd.sun.xml.impress":{"source":"apache","extensions":["sxi"]},"application/vnd.sun.xml.impress.template":{"source":"apache","extensions":["sti"]},"application/vnd.sun.xml.math":{"source":"apache","extensions":["sxm"]},"application/vnd.sun.xml.writer":{"source":"apache","extensions":["sxw"]},"application/vnd.sun.xml.writer.global":{"source":"apache","extensions":["sxg"]},"application/vnd.sun.xml.writer.template":{"source":"apache","extensions":["stw"]},"application/vnd.sus-calendar":{"source":"iana","extensions":["sus","susp"]},"application/vnd.svd":{"source":"iana","extensions":["svd"]},"application/vnd.swiftview-ics":{"source":"iana"},"application/vnd.sycle+xml":{"source":"iana","compressible":true},"application/vnd.syft+json":{"source":"iana","compressible":true},"application/vnd.symbian.install":{"source":"apache","extensions":["sis","sisx"]},"application/vnd.syncml+xml":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["xsm"]},"application/vnd.syncml.dm+wbxml":{"source":"iana","charset":"UTF-8","extensions":["bdm"]},"application/vnd.syncml.dm+xml":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["xdm"]},"application/vnd.syncml.dm.notification":{"source":"iana"},"application/vnd.syncml.dmddf+wbxml":{"source":"iana"},"application/vnd.syncml.dmddf+xml":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["ddf"]},"application/vnd.syncml.dmtnds+wbxml":{"source":"iana"},"application/vnd.syncml.dmtnds+xml":{"source":"iana","charset":"UTF-8","compressible":true},"application/vnd.syncml.ds.notification":{"source":"iana"},"application/vnd.tableschema+json":{"source":"iana","compressible":true},"application/vnd.tao.intent-module-archive":{"source":"iana","extensions":["tao"]},"application/vnd.tcpdump.pcap":{"source":"iana","extensions":["pcap","cap","dmp"]},"application/vnd.think-cell.ppttc+json":{"source":"iana","compressible":true},"application/vnd.tmd.mediaflex.api+xml":{"source":"iana","compressible":true},"application/vnd.tml":{"source":"iana"},"application/vnd.tmobile-livetv":{"source":"iana","extensions":["tmo"]},"application/vnd.tri.onesource":{"source":"iana"},"application/vnd.trid.tpt":{"source":"iana","extensions":["tpt"]},"application/vnd.triscape.mxs":{"source":"iana","extensions":["mxs"]},"application/vnd.trueapp":{"source":"iana","extensions":["tra"]},"application/vnd.truedoc":{"source":"iana"},"application/vnd.ubisoft.webplayer":{"source":"iana"},"application/vnd.ufdl":{"source":"iana","extensions":["ufd","ufdl"]},"application/vnd.uiq.theme":{"source":"iana","extensions":["utz"]},"application/vnd.umajin":{"source":"iana","extensions":["umj"]},"application/vnd.unity":{"source":"iana","extensions":["unityweb"]},"application/vnd.uoml+xml":{"source":"iana","compressible":true,"extensions":["uoml"]},"application/vnd.uplanet.alert":{"source":"iana"},"application/vnd.uplanet.alert-wbxml":{"source":"iana"},"application/vnd.uplanet.bearer-choice":{"source":"iana"},"application/vnd.uplanet.bearer-choice-wbxml":{"source":"iana"},"application/vnd.uplanet.cacheop":{"source":"iana"},"application/vnd.uplanet.cacheop-wbxml":{"source":"iana"},"application/vnd.uplanet.channel":{"source":"iana"},"application/vnd.uplanet.channel-wbxml":{"source":"iana"},"application/vnd.uplanet.list":{"source":"iana"},"application/vnd.uplanet.list-wbxml":{"source":"iana"},"application/vnd.uplanet.listcmd":{"source":"iana"},"application/vnd.uplanet.listcmd-wbxml":{"source":"iana"},"application/vnd.uplanet.signal":{"source":"iana"},"application/vnd.uri-map":{"source":"iana"},"application/vnd.valve.source.material":{"source":"iana"},"application/vnd.vcx":{"source":"iana","extensions":["vcx"]},"application/vnd.vd-study":{"source":"iana"},"application/vnd.vectorworks":{"source":"iana"},"application/vnd.vel+json":{"source":"iana","compressible":true},"application/vnd.verimatrix.vcas":{"source":"iana"},"application/vnd.veritone.aion+json":{"source":"iana","compressible":true},"application/vnd.veryant.thin":{"source":"iana"},"application/vnd.ves.encrypted":{"source":"iana"},"application/vnd.vidsoft.vidconference":{"source":"iana"},"application/vnd.visio":{"source":"iana","extensions":["vsd","vst","vss","vsw"]},"application/vnd.visionary":{"source":"iana","extensions":["vis"]},"application/vnd.vividence.scriptfile":{"source":"iana"},"application/vnd.vsf":{"source":"iana","extensions":["vsf"]},"application/vnd.wap.sic":{"source":"iana"},"application/vnd.wap.slc":{"source":"iana"},"application/vnd.wap.wbxml":{"source":"iana","charset":"UTF-8","extensions":["wbxml"]},"application/vnd.wap.wmlc":{"source":"iana","extensions":["wmlc"]},"application/vnd.wap.wmlscriptc":{"source":"iana","extensions":["wmlsc"]},"application/vnd.webturbo":{"source":"iana","extensions":["wtb"]},"application/vnd.wfa.dpp":{"source":"iana"},"application/vnd.wfa.p2p":{"source":"iana"},"application/vnd.wfa.wsc":{"source":"iana"},"application/vnd.windows.devicepairing":{"source":"iana"},"application/vnd.wmc":{"source":"iana"},"application/vnd.wmf.bootstrap":{"source":"iana"},"application/vnd.wolfram.mathematica":{"source":"iana"},"application/vnd.wolfram.mathematica.package":{"source":"iana"},"application/vnd.wolfram.player":{"source":"iana","extensions":["nbp"]},"application/vnd.wordperfect":{"source":"iana","extensions":["wpd"]},"application/vnd.wqd":{"source":"iana","extensions":["wqd"]},"application/vnd.wrq-hp3000-labelled":{"source":"iana"},"application/vnd.wt.stf":{"source":"iana","extensions":["stf"]},"application/vnd.wv.csp+wbxml":{"source":"iana"},"application/vnd.wv.csp+xml":{"source":"iana","compressible":true},"application/vnd.wv.ssp+xml":{"source":"iana","compressible":true},"application/vnd.xacml+json":{"source":"iana","compressible":true},"application/vnd.xara":{"source":"iana","extensions":["xar"]},"application/vnd.xfdl":{"source":"iana","extensions":["xfdl"]},"application/vnd.xfdl.webform":{"source":"iana"},"application/vnd.xmi+xml":{"source":"iana","compressible":true},"application/vnd.xmpie.cpkg":{"source":"iana"},"application/vnd.xmpie.dpkg":{"source":"iana"},"application/vnd.xmpie.plan":{"source":"iana"},"application/vnd.xmpie.ppkg":{"source":"iana"},"application/vnd.xmpie.xlim":{"source":"iana"},"application/vnd.yamaha.hv-dic":{"source":"iana","extensions":["hvd"]},"application/vnd.yamaha.hv-script":{"source":"iana","extensions":["hvs"]},"application/vnd.yamaha.hv-voice":{"source":"iana","extensions":["hvp"]},"application/vnd.yamaha.openscoreformat":{"source":"iana","extensions":["osf"]},"application/vnd.yamaha.openscoreformat.osfpvg+xml":{"source":"iana","compressible":true,"extensions":["osfpvg"]},"application/vnd.yamaha.remote-setup":{"source":"iana"},"application/vnd.yamaha.smaf-audio":{"source":"iana","extensions":["saf"]},"application/vnd.yamaha.smaf-phrase":{"source":"iana","extensions":["spf"]},"application/vnd.yamaha.through-ngn":{"source":"iana"},"application/vnd.yamaha.tunnel-udpencap":{"source":"iana"},"application/vnd.yaoweme":{"source":"iana"},"application/vnd.yellowriver-custom-menu":{"source":"iana","extensions":["cmp"]},"application/vnd.youtube.yt":{"source":"iana"},"application/vnd.zul":{"source":"iana","extensions":["zir","zirz"]},"application/vnd.zzazz.deck+xml":{"source":"iana","compressible":true,"extensions":["zaz"]},"application/voicexml+xml":{"source":"iana","compressible":true,"extensions":["vxml"]},"application/voucher-cms+json":{"source":"iana","compressible":true},"application/vq-rtcpxr":{"source":"iana"},"application/wasm":{"source":"iana","compressible":true,"extensions":["wasm"]},"application/watcherinfo+xml":{"source":"iana","compressible":true,"extensions":["wif"]},"application/webpush-options+json":{"source":"iana","compressible":true},"application/whoispp-query":{"source":"iana"},"application/whoispp-response":{"source":"iana"},"application/widget":{"source":"iana","extensions":["wgt"]},"application/winhlp":{"source":"apache","extensions":["hlp"]},"application/wita":{"source":"iana"},"application/wordperfect5.1":{"source":"iana"},"application/wsdl+xml":{"source":"iana","compressible":true,"extensions":["wsdl"]},"application/wspolicy+xml":{"source":"iana","compressible":true,"extensions":["wspolicy"]},"application/x-7z-compressed":{"source":"apache","compressible":false,"extensions":["7z"]},"application/x-abiword":{"source":"apache","extensions":["abw"]},"application/x-ace-compressed":{"source":"apache","extensions":["ace"]},"application/x-amf":{"source":"apache"},"application/x-apple-diskimage":{"source":"apache","extensions":["dmg"]},"application/x-arj":{"compressible":false,"extensions":["arj"]},"application/x-authorware-bin":{"source":"apache","extensions":["aab","x32","u32","vox"]},"application/x-authorware-map":{"source":"apache","extensions":["aam"]},"application/x-authorware-seg":{"source":"apache","extensions":["aas"]},"application/x-bcpio":{"source":"apache","extensions":["bcpio"]},"application/x-bdoc":{"compressible":false,"extensions":["bdoc"]},"application/x-bittorrent":{"source":"apache","extensions":["torrent"]},"application/x-blorb":{"source":"apache","extensions":["blb","blorb"]},"application/x-bzip":{"source":"apache","compressible":false,"extensions":["bz"]},"application/x-bzip2":{"source":"apache","compressible":false,"extensions":["bz2","boz"]},"application/x-cbr":{"source":"apache","extensions":["cbr","cba","cbt","cbz","cb7"]},"application/x-cdlink":{"source":"apache","extensions":["vcd"]},"application/x-cfs-compressed":{"source":"apache","extensions":["cfs"]},"application/x-chat":{"source":"apache","extensions":["chat"]},"application/x-chess-pgn":{"source":"apache","extensions":["pgn"]},"application/x-chrome-extension":{"extensions":["crx"]},"application/x-cocoa":{"source":"nginx","extensions":["cco"]},"application/x-compress":{"source":"apache"},"application/x-conference":{"source":"apache","extensions":["nsc"]},"application/x-cpio":{"source":"apache","extensions":["cpio"]},"application/x-csh":{"source":"apache","extensions":["csh"]},"application/x-deb":{"compressible":false},"application/x-debian-package":{"source":"apache","extensions":["deb","udeb"]},"application/x-dgc-compressed":{"source":"apache","extensions":["dgc"]},"application/x-director":{"source":"apache","extensions":["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"]},"application/x-doom":{"source":"apache","extensions":["wad"]},"application/x-dtbncx+xml":{"source":"apache","compressible":true,"extensions":["ncx"]},"application/x-dtbook+xml":{"source":"apache","compressible":true,"extensions":["dtb"]},"application/x-dtbresource+xml":{"source":"apache","compressible":true,"extensions":["res"]},"application/x-dvi":{"source":"apache","compressible":false,"extensions":["dvi"]},"application/x-envoy":{"source":"apache","extensions":["evy"]},"application/x-eva":{"source":"apache","extensions":["eva"]},"application/x-font-bdf":{"source":"apache","extensions":["bdf"]},"application/x-font-dos":{"source":"apache"},"application/x-font-framemaker":{"source":"apache"},"application/x-font-ghostscript":{"source":"apache","extensions":["gsf"]},"application/x-font-libgrx":{"source":"apache"},"application/x-font-linux-psf":{"source":"apache","extensions":["psf"]},"application/x-font-pcf":{"source":"apache","extensions":["pcf"]},"application/x-font-snf":{"source":"apache","extensions":["snf"]},"application/x-font-speedo":{"source":"apache"},"application/x-font-sunos-news":{"source":"apache"},"application/x-font-type1":{"source":"apache","extensions":["pfa","pfb","pfm","afm"]},"application/x-font-vfont":{"source":"apache"},"application/x-freearc":{"source":"apache","extensions":["arc"]},"application/x-futuresplash":{"source":"apache","extensions":["spl"]},"application/x-gca-compressed":{"source":"apache","extensions":["gca"]},"application/x-glulx":{"source":"apache","extensions":["ulx"]},"application/x-gnumeric":{"source":"apache","extensions":["gnumeric"]},"application/x-gramps-xml":{"source":"apache","extensions":["gramps"]},"application/x-gtar":{"source":"apache","extensions":["gtar"]},"application/x-gzip":{"source":"apache"},"application/x-hdf":{"source":"apache","extensions":["hdf"]},"application/x-httpd-php":{"compressible":true,"extensions":["php"]},"application/x-install-instructions":{"source":"apache","extensions":["install"]},"application/x-iso9660-image":{"source":"apache","extensions":["iso"]},"application/x-iwork-keynote-sffkey":{"extensions":["key"]},"application/x-iwork-numbers-sffnumbers":{"extensions":["numbers"]},"application/x-iwork-pages-sffpages":{"extensions":["pages"]},"application/x-java-archive-diff":{"source":"nginx","extensions":["jardiff"]},"application/x-java-jnlp-file":{"source":"apache","compressible":false,"extensions":["jnlp"]},"application/x-javascript":{"compressible":true},"application/x-keepass2":{"extensions":["kdbx"]},"application/x-latex":{"source":"apache","compressible":false,"extensions":["latex"]},"application/x-lua-bytecode":{"extensions":["luac"]},"application/x-lzh-compressed":{"source":"apache","extensions":["lzh","lha"]},"application/x-makeself":{"source":"nginx","extensions":["run"]},"application/x-mie":{"source":"apache","extensions":["mie"]},"application/x-mobipocket-ebook":{"source":"apache","extensions":["prc","mobi"]},"application/x-mpegurl":{"compressible":false},"application/x-ms-application":{"source":"apache","extensions":["application"]},"application/x-ms-shortcut":{"source":"apache","extensions":["lnk"]},"application/x-ms-wmd":{"source":"apache","extensions":["wmd"]},"application/x-ms-wmz":{"source":"apache","extensions":["wmz"]},"application/x-ms-xbap":{"source":"apache","extensions":["xbap"]},"application/x-msaccess":{"source":"apache","extensions":["mdb"]},"application/x-msbinder":{"source":"apache","extensions":["obd"]},"application/x-mscardfile":{"source":"apache","extensions":["crd"]},"application/x-msclip":{"source":"apache","extensions":["clp"]},"application/x-msdos-program":{"extensions":["exe"]},"application/x-msdownload":{"source":"apache","extensions":["exe","dll","com","bat","msi"]},"application/x-msmediaview":{"source":"apache","extensions":["mvb","m13","m14"]},"application/x-msmetafile":{"source":"apache","extensions":["wmf","wmz","emf","emz"]},"application/x-msmoney":{"source":"apache","extensions":["mny"]},"application/x-mspublisher":{"source":"apache","extensions":["pub"]},"application/x-msschedule":{"source":"apache","extensions":["scd"]},"application/x-msterminal":{"source":"apache","extensions":["trm"]},"application/x-mswrite":{"source":"apache","extensions":["wri"]},"application/x-netcdf":{"source":"apache","extensions":["nc","cdf"]},"application/x-ns-proxy-autoconfig":{"compressible":true,"extensions":["pac"]},"application/x-nzb":{"source":"apache","extensions":["nzb"]},"application/x-perl":{"source":"nginx","extensions":["pl","pm"]},"application/x-pilot":{"source":"nginx","extensions":["prc","pdb"]},"application/x-pkcs12":{"source":"apache","compressible":false,"extensions":["p12","pfx"]},"application/x-pkcs7-certificates":{"source":"apache","extensions":["p7b","spc"]},"application/x-pkcs7-certreqresp":{"source":"apache","extensions":["p7r"]},"application/x-pki-message":{"source":"iana"},"application/x-rar-compressed":{"source":"apache","compressible":false,"extensions":["rar"]},"application/x-redhat-package-manager":{"source":"nginx","extensions":["rpm"]},"application/x-research-info-systems":{"source":"apache","extensions":["ris"]},"application/x-sea":{"source":"nginx","extensions":["sea"]},"application/x-sh":{"source":"apache","compressible":true,"extensions":["sh"]},"application/x-shar":{"source":"apache","extensions":["shar"]},"application/x-shockwave-flash":{"source":"apache","compressible":false,"extensions":["swf"]},"application/x-silverlight-app":{"source":"apache","extensions":["xap"]},"application/x-sql":{"source":"apache","extensions":["sql"]},"application/x-stuffit":{"source":"apache","compressible":false,"extensions":["sit"]},"application/x-stuffitx":{"source":"apache","extensions":["sitx"]},"application/x-subrip":{"source":"apache","extensions":["srt"]},"application/x-sv4cpio":{"source":"apache","extensions":["sv4cpio"]},"application/x-sv4crc":{"source":"apache","extensions":["sv4crc"]},"application/x-t3vm-image":{"source":"apache","extensions":["t3"]},"application/x-tads":{"source":"apache","extensions":["gam"]},"application/x-tar":{"source":"apache","compressible":true,"extensions":["tar"]},"application/x-tcl":{"source":"apache","extensions":["tcl","tk"]},"application/x-tex":{"source":"apache","extensions":["tex"]},"application/x-tex-tfm":{"source":"apache","extensions":["tfm"]},"application/x-texinfo":{"source":"apache","extensions":["texinfo","texi"]},"application/x-tgif":{"source":"apache","extensions":["obj"]},"application/x-ustar":{"source":"apache","extensions":["ustar"]},"application/x-virtualbox-hdd":{"compressible":true,"extensions":["hdd"]},"application/x-virtualbox-ova":{"compressible":true,"extensions":["ova"]},"application/x-virtualbox-ovf":{"compressible":true,"extensions":["ovf"]},"application/x-virtualbox-vbox":{"compressible":true,"extensions":["vbox"]},"application/x-virtualbox-vbox-extpack":{"compressible":false,"extensions":["vbox-extpack"]},"application/x-virtualbox-vdi":{"compressible":true,"extensions":["vdi"]},"application/x-virtualbox-vhd":{"compressible":true,"extensions":["vhd"]},"application/x-virtualbox-vmdk":{"compressible":true,"extensions":["vmdk"]},"application/x-wais-source":{"source":"apache","extensions":["src"]},"application/x-web-app-manifest+json":{"compressible":true,"extensions":["webapp"]},"application/x-www-form-urlencoded":{"source":"iana","compressible":true},"application/x-x509-ca-cert":{"source":"iana","extensions":["der","crt","pem"]},"application/x-x509-ca-ra-cert":{"source":"iana"},"application/x-x509-next-ca-cert":{"source":"iana"},"application/x-xfig":{"source":"apache","extensions":["fig"]},"application/x-xliff+xml":{"source":"apache","compressible":true,"extensions":["xlf"]},"application/x-xpinstall":{"source":"apache","compressible":false,"extensions":["xpi"]},"application/x-xz":{"source":"apache","extensions":["xz"]},"application/x-zmachine":{"source":"apache","extensions":["z1","z2","z3","z4","z5","z6","z7","z8"]},"application/x400-bp":{"source":"iana"},"application/xacml+xml":{"source":"iana","compressible":true},"application/xaml+xml":{"source":"apache","compressible":true,"extensions":["xaml"]},"application/xcap-att+xml":{"source":"iana","compressible":true,"extensions":["xav"]},"application/xcap-caps+xml":{"source":"iana","compressible":true,"extensions":["xca"]},"application/xcap-diff+xml":{"source":"iana","compressible":true,"extensions":["xdf"]},"application/xcap-el+xml":{"source":"iana","compressible":true,"extensions":["xel"]},"application/xcap-error+xml":{"source":"iana","compressible":true},"application/xcap-ns+xml":{"source":"iana","compressible":true,"extensions":["xns"]},"application/xcon-conference-info+xml":{"source":"iana","compressible":true},"application/xcon-conference-info-diff+xml":{"source":"iana","compressible":true},"application/xenc+xml":{"source":"iana","compressible":true,"extensions":["xenc"]},"application/xhtml+xml":{"source":"iana","compressible":true,"extensions":["xhtml","xht"]},"application/xhtml-voice+xml":{"source":"apache","compressible":true},"application/xliff+xml":{"source":"iana","compressible":true,"extensions":["xlf"]},"application/xml":{"source":"iana","compressible":true,"extensions":["xml","xsl","xsd","rng"]},"application/xml-dtd":{"source":"iana","compressible":true,"extensions":["dtd"]},"application/xml-external-parsed-entity":{"source":"iana"},"application/xml-patch+xml":{"source":"iana","compressible":true},"application/xmpp+xml":{"source":"iana","compressible":true},"application/xop+xml":{"source":"iana","compressible":true,"extensions":["xop"]},"application/xproc+xml":{"source":"apache","compressible":true,"extensions":["xpl"]},"application/xslt+xml":{"source":"iana","compressible":true,"extensions":["xsl","xslt"]},"application/xspf+xml":{"source":"apache","compressible":true,"extensions":["xspf"]},"application/xv+xml":{"source":"iana","compressible":true,"extensions":["mxml","xhvml","xvml","xvm"]},"application/yang":{"source":"iana","extensions":["yang"]},"application/yang-data+json":{"source":"iana","compressible":true},"application/yang-data+xml":{"source":"iana","compressible":true},"application/yang-patch+json":{"source":"iana","compressible":true},"application/yang-patch+xml":{"source":"iana","compressible":true},"application/yin+xml":{"source":"iana","compressible":true,"extensions":["yin"]},"application/zip":{"source":"iana","compressible":false,"extensions":["zip"]},"application/zlib":{"source":"iana"},"application/zstd":{"source":"iana"},"audio/1d-interleaved-parityfec":{"source":"iana"},"audio/32kadpcm":{"source":"iana"},"audio/3gpp":{"source":"iana","compressible":false,"extensions":["3gpp"]},"audio/3gpp2":{"source":"iana"},"audio/aac":{"source":"iana"},"audio/ac3":{"source":"iana"},"audio/adpcm":{"source":"apache","extensions":["adp"]},"audio/amr":{"source":"iana","extensions":["amr"]},"audio/amr-wb":{"source":"iana"},"audio/amr-wb+":{"source":"iana"},"audio/aptx":{"source":"iana"},"audio/asc":{"source":"iana"},"audio/atrac-advanced-lossless":{"source":"iana"},"audio/atrac-x":{"source":"iana"},"audio/atrac3":{"source":"iana"},"audio/basic":{"source":"iana","compressible":false,"extensions":["au","snd"]},"audio/bv16":{"source":"iana"},"audio/bv32":{"source":"iana"},"audio/clearmode":{"source":"iana"},"audio/cn":{"source":"iana"},"audio/dat12":{"source":"iana"},"audio/dls":{"source":"iana"},"audio/dsr-es201108":{"source":"iana"},"audio/dsr-es202050":{"source":"iana"},"audio/dsr-es202211":{"source":"iana"},"audio/dsr-es202212":{"source":"iana"},"audio/dv":{"source":"iana"},"audio/dvi4":{"source":"iana"},"audio/eac3":{"source":"iana"},"audio/encaprtp":{"source":"iana"},"audio/evrc":{"source":"iana"},"audio/evrc-qcp":{"source":"iana"},"audio/evrc0":{"source":"iana"},"audio/evrc1":{"source":"iana"},"audio/evrcb":{"source":"iana"},"audio/evrcb0":{"source":"iana"},"audio/evrcb1":{"source":"iana"},"audio/evrcnw":{"source":"iana"},"audio/evrcnw0":{"source":"iana"},"audio/evrcnw1":{"source":"iana"},"audio/evrcwb":{"source":"iana"},"audio/evrcwb0":{"source":"iana"},"audio/evrcwb1":{"source":"iana"},"audio/evs":{"source":"iana"},"audio/flexfec":{"source":"iana"},"audio/fwdred":{"source":"iana"},"audio/g711-0":{"source":"iana"},"audio/g719":{"source":"iana"},"audio/g722":{"source":"iana"},"audio/g7221":{"source":"iana"},"audio/g723":{"source":"iana"},"audio/g726-16":{"source":"iana"},"audio/g726-24":{"source":"iana"},"audio/g726-32":{"source":"iana"},"audio/g726-40":{"source":"iana"},"audio/g728":{"source":"iana"},"audio/g729":{"source":"iana"},"audio/g7291":{"source":"iana"},"audio/g729d":{"source":"iana"},"audio/g729e":{"source":"iana"},"audio/gsm":{"source":"iana"},"audio/gsm-efr":{"source":"iana"},"audio/gsm-hr-08":{"source":"iana"},"audio/ilbc":{"source":"iana"},"audio/ip-mr_v2.5":{"source":"iana"},"audio/isac":{"source":"apache"},"audio/l16":{"source":"iana"},"audio/l20":{"source":"iana"},"audio/l24":{"source":"iana","compressible":false},"audio/l8":{"source":"iana"},"audio/lpc":{"source":"iana"},"audio/melp":{"source":"iana"},"audio/melp1200":{"source":"iana"},"audio/melp2400":{"source":"iana"},"audio/melp600":{"source":"iana"},"audio/mhas":{"source":"iana"},"audio/midi":{"source":"apache","extensions":["mid","midi","kar","rmi"]},"audio/mobile-xmf":{"source":"iana","extensions":["mxmf"]},"audio/mp3":{"compressible":false,"extensions":["mp3"]},"audio/mp4":{"source":"iana","compressible":false,"extensions":["m4a","mp4a"]},"audio/mp4a-latm":{"source":"iana"},"audio/mpa":{"source":"iana"},"audio/mpa-robust":{"source":"iana"},"audio/mpeg":{"source":"iana","compressible":false,"extensions":["mpga","mp2","mp2a","mp3","m2a","m3a"]},"audio/mpeg4-generic":{"source":"iana"},"audio/musepack":{"source":"apache"},"audio/ogg":{"source":"iana","compressible":false,"extensions":["oga","ogg","spx","opus"]},"audio/opus":{"source":"iana"},"audio/parityfec":{"source":"iana"},"audio/pcma":{"source":"iana"},"audio/pcma-wb":{"source":"iana"},"audio/pcmu":{"source":"iana"},"audio/pcmu-wb":{"source":"iana"},"audio/prs.sid":{"source":"iana"},"audio/qcelp":{"source":"iana"},"audio/raptorfec":{"source":"iana"},"audio/red":{"source":"iana"},"audio/rtp-enc-aescm128":{"source":"iana"},"audio/rtp-midi":{"source":"iana"},"audio/rtploopback":{"source":"iana"},"audio/rtx":{"source":"iana"},"audio/s3m":{"source":"apache","extensions":["s3m"]},"audio/scip":{"source":"iana"},"audio/silk":{"source":"apache","extensions":["sil"]},"audio/smv":{"source":"iana"},"audio/smv-qcp":{"source":"iana"},"audio/smv0":{"source":"iana"},"audio/sofa":{"source":"iana"},"audio/sp-midi":{"source":"iana"},"audio/speex":{"source":"iana"},"audio/t140c":{"source":"iana"},"audio/t38":{"source":"iana"},"audio/telephone-event":{"source":"iana"},"audio/tetra_acelp":{"source":"iana"},"audio/tetra_acelp_bb":{"source":"iana"},"audio/tone":{"source":"iana"},"audio/tsvcis":{"source":"iana"},"audio/uemclip":{"source":"iana"},"audio/ulpfec":{"source":"iana"},"audio/usac":{"source":"iana"},"audio/vdvi":{"source":"iana"},"audio/vmr-wb":{"source":"iana"},"audio/vnd.3gpp.iufp":{"source":"iana"},"audio/vnd.4sb":{"source":"iana"},"audio/vnd.audiokoz":{"source":"iana"},"audio/vnd.celp":{"source":"iana"},"audio/vnd.cisco.nse":{"source":"iana"},"audio/vnd.cmles.radio-events":{"source":"iana"},"audio/vnd.cns.anp1":{"source":"iana"},"audio/vnd.cns.inf1":{"source":"iana"},"audio/vnd.dece.audio":{"source":"iana","extensions":["uva","uvva"]},"audio/vnd.digital-winds":{"source":"iana","extensions":["eol"]},"audio/vnd.dlna.adts":{"source":"iana"},"audio/vnd.dolby.heaac.1":{"source":"iana"},"audio/vnd.dolby.heaac.2":{"source":"iana"},"audio/vnd.dolby.mlp":{"source":"iana"},"audio/vnd.dolby.mps":{"source":"iana"},"audio/vnd.dolby.pl2":{"source":"iana"},"audio/vnd.dolby.pl2x":{"source":"iana"},"audio/vnd.dolby.pl2z":{"source":"iana"},"audio/vnd.dolby.pulse.1":{"source":"iana"},"audio/vnd.dra":{"source":"iana","extensions":["dra"]},"audio/vnd.dts":{"source":"iana","extensions":["dts"]},"audio/vnd.dts.hd":{"source":"iana","extensions":["dtshd"]},"audio/vnd.dts.uhd":{"source":"iana"},"audio/vnd.dvb.file":{"source":"iana"},"audio/vnd.everad.plj":{"source":"iana"},"audio/vnd.hns.audio":{"source":"iana"},"audio/vnd.lucent.voice":{"source":"iana","extensions":["lvp"]},"audio/vnd.ms-playready.media.pya":{"source":"iana","extensions":["pya"]},"audio/vnd.nokia.mobile-xmf":{"source":"iana"},"audio/vnd.nortel.vbk":{"source":"iana"},"audio/vnd.nuera.ecelp4800":{"source":"iana","extensions":["ecelp4800"]},"audio/vnd.nuera.ecelp7470":{"source":"iana","extensions":["ecelp7470"]},"audio/vnd.nuera.ecelp9600":{"source":"iana","extensions":["ecelp9600"]},"audio/vnd.octel.sbc":{"source":"iana"},"audio/vnd.presonus.multitrack":{"source":"iana"},"audio/vnd.qcelp":{"source":"iana"},"audio/vnd.rhetorex.32kadpcm":{"source":"iana"},"audio/vnd.rip":{"source":"iana","extensions":["rip"]},"audio/vnd.rn-realaudio":{"compressible":false},"audio/vnd.sealedmedia.softseal.mpeg":{"source":"iana"},"audio/vnd.vmx.cvsd":{"source":"iana"},"audio/vnd.wave":{"compressible":false},"audio/vorbis":{"source":"iana","compressible":false},"audio/vorbis-config":{"source":"iana"},"audio/wav":{"compressible":false,"extensions":["wav"]},"audio/wave":{"compressible":false,"extensions":["wav"]},"audio/webm":{"source":"apache","compressible":false,"extensions":["weba"]},"audio/x-aac":{"source":"apache","compressible":false,"extensions":["aac"]},"audio/x-aiff":{"source":"apache","extensions":["aif","aiff","aifc"]},"audio/x-caf":{"source":"apache","compressible":false,"extensions":["caf"]},"audio/x-flac":{"source":"apache","extensions":["flac"]},"audio/x-m4a":{"source":"nginx","extensions":["m4a"]},"audio/x-matroska":{"source":"apache","extensions":["mka"]},"audio/x-mpegurl":{"source":"apache","extensions":["m3u"]},"audio/x-ms-wax":{"source":"apache","extensions":["wax"]},"audio/x-ms-wma":{"source":"apache","extensions":["wma"]},"audio/x-pn-realaudio":{"source":"apache","extensions":["ram","ra"]},"audio/x-pn-realaudio-plugin":{"source":"apache","extensions":["rmp"]},"audio/x-realaudio":{"source":"nginx","extensions":["ra"]},"audio/x-tta":{"source":"apache"},"audio/x-wav":{"source":"apache","extensions":["wav"]},"audio/xm":{"source":"apache","extensions":["xm"]},"chemical/x-cdx":{"source":"apache","extensions":["cdx"]},"chemical/x-cif":{"source":"apache","extensions":["cif"]},"chemical/x-cmdf":{"source":"apache","extensions":["cmdf"]},"chemical/x-cml":{"source":"apache","extensions":["cml"]},"chemical/x-csml":{"source":"apache","extensions":["csml"]},"chemical/x-pdb":{"source":"apache"},"chemical/x-xyz":{"source":"apache","extensions":["xyz"]},"font/collection":{"source":"iana","extensions":["ttc"]},"font/otf":{"source":"iana","compressible":true,"extensions":["otf"]},"font/sfnt":{"source":"iana"},"font/ttf":{"source":"iana","compressible":true,"extensions":["ttf"]},"font/woff":{"source":"iana","extensions":["woff"]},"font/woff2":{"source":"iana","extensions":["woff2"]},"image/aces":{"source":"iana","extensions":["exr"]},"image/apng":{"compressible":false,"extensions":["apng"]},"image/avci":{"source":"iana","extensions":["avci"]},"image/avcs":{"source":"iana","extensions":["avcs"]},"image/avif":{"source":"iana","compressible":false,"extensions":["avif"]},"image/bmp":{"source":"iana","compressible":true,"extensions":["bmp"]},"image/cgm":{"source":"iana","extensions":["cgm"]},"image/dicom-rle":{"source":"iana","extensions":["drle"]},"image/emf":{"source":"iana","extensions":["emf"]},"image/fits":{"source":"iana","extensions":["fits"]},"image/g3fax":{"source":"iana","extensions":["g3"]},"image/gif":{"source":"iana","compressible":false,"extensions":["gif"]},"image/heic":{"source":"iana","extensions":["heic"]},"image/heic-sequence":{"source":"iana","extensions":["heics"]},"image/heif":{"source":"iana","extensions":["heif"]},"image/heif-sequence":{"source":"iana","extensions":["heifs"]},"image/hej2k":{"source":"iana","extensions":["hej2"]},"image/hsj2":{"source":"iana","extensions":["hsj2"]},"image/ief":{"source":"iana","extensions":["ief"]},"image/jls":{"source":"iana","extensions":["jls"]},"image/jp2":{"source":"iana","compressible":false,"extensions":["jp2","jpg2"]},"image/jpeg":{"source":"iana","compressible":false,"extensions":["jpeg","jpg","jpe"]},"image/jph":{"source":"iana","extensions":["jph"]},"image/jphc":{"source":"iana","extensions":["jhc"]},"image/jpm":{"source":"iana","compressible":false,"extensions":["jpm"]},"image/jpx":{"source":"iana","compressible":false,"extensions":["jpx","jpf"]},"image/jxr":{"source":"iana","extensions":["jxr"]},"image/jxra":{"source":"iana","extensions":["jxra"]},"image/jxrs":{"source":"iana","extensions":["jxrs"]},"image/jxs":{"source":"iana","extensions":["jxs"]},"image/jxsc":{"source":"iana","extensions":["jxsc"]},"image/jxsi":{"source":"iana","extensions":["jxsi"]},"image/jxss":{"source":"iana","extensions":["jxss"]},"image/ktx":{"source":"iana","extensions":["ktx"]},"image/ktx2":{"source":"iana","extensions":["ktx2"]},"image/naplps":{"source":"iana"},"image/pjpeg":{"compressible":false},"image/png":{"source":"iana","compressible":false,"extensions":["png"]},"image/prs.btif":{"source":"iana","extensions":["btif"]},"image/prs.pti":{"source":"iana","extensions":["pti"]},"image/pwg-raster":{"source":"iana"},"image/sgi":{"source":"apache","extensions":["sgi"]},"image/svg+xml":{"source":"iana","compressible":true,"extensions":["svg","svgz"]},"image/t38":{"source":"iana","extensions":["t38"]},"image/tiff":{"source":"iana","compressible":false,"extensions":["tif","tiff"]},"image/tiff-fx":{"source":"iana","extensions":["tfx"]},"image/vnd.adobe.photoshop":{"source":"iana","compressible":true,"extensions":["psd"]},"image/vnd.airzip.accelerator.azv":{"source":"iana","extensions":["azv"]},"image/vnd.cns.inf2":{"source":"iana"},"image/vnd.dece.graphic":{"source":"iana","extensions":["uvi","uvvi","uvg","uvvg"]},"image/vnd.djvu":{"source":"iana","extensions":["djvu","djv"]},"image/vnd.dvb.subtitle":{"source":"iana","extensions":["sub"]},"image/vnd.dwg":{"source":"iana","extensions":["dwg"]},"image/vnd.dxf":{"source":"iana","extensions":["dxf"]},"image/vnd.fastbidsheet":{"source":"iana","extensions":["fbs"]},"image/vnd.fpx":{"source":"iana","extensions":["fpx"]},"image/vnd.fst":{"source":"iana","extensions":["fst"]},"image/vnd.fujixerox.edmics-mmr":{"source":"iana","extensions":["mmr"]},"image/vnd.fujixerox.edmics-rlc":{"source":"iana","extensions":["rlc"]},"image/vnd.globalgraphics.pgb":{"source":"iana"},"image/vnd.microsoft.icon":{"source":"iana","compressible":true,"extensions":["ico"]},"image/vnd.mix":{"source":"iana"},"image/vnd.mozilla.apng":{"source":"iana"},"image/vnd.ms-dds":{"compressible":true,"extensions":["dds"]},"image/vnd.ms-modi":{"source":"iana","extensions":["mdi"]},"image/vnd.ms-photo":{"source":"apache","extensions":["wdp"]},"image/vnd.net-fpx":{"source":"iana","extensions":["npx"]},"image/vnd.pco.b16":{"source":"iana","extensions":["b16"]},"image/vnd.radiance":{"source":"iana"},"image/vnd.sealed.png":{"source":"iana"},"image/vnd.sealedmedia.softseal.gif":{"source":"iana"},"image/vnd.sealedmedia.softseal.jpg":{"source":"iana"},"image/vnd.svf":{"source":"iana"},"image/vnd.tencent.tap":{"source":"iana","extensions":["tap"]},"image/vnd.valve.source.texture":{"source":"iana","extensions":["vtf"]},"image/vnd.wap.wbmp":{"source":"iana","extensions":["wbmp"]},"image/vnd.xiff":{"source":"iana","extensions":["xif"]},"image/vnd.zbrush.pcx":{"source":"iana","extensions":["pcx"]},"image/webp":{"source":"apache","extensions":["webp"]},"image/wmf":{"source":"iana","extensions":["wmf"]},"image/x-3ds":{"source":"apache","extensions":["3ds"]},"image/x-cmu-raster":{"source":"apache","extensions":["ras"]},"image/x-cmx":{"source":"apache","extensions":["cmx"]},"image/x-freehand":{"source":"apache","extensions":["fh","fhc","fh4","fh5","fh7"]},"image/x-icon":{"source":"apache","compressible":true,"extensions":["ico"]},"image/x-jng":{"source":"nginx","extensions":["jng"]},"image/x-mrsid-image":{"source":"apache","extensions":["sid"]},"image/x-ms-bmp":{"source":"nginx","compressible":true,"extensions":["bmp"]},"image/x-pcx":{"source":"apache","extensions":["pcx"]},"image/x-pict":{"source":"apache","extensions":["pic","pct"]},"image/x-portable-anymap":{"source":"apache","extensions":["pnm"]},"image/x-portable-bitmap":{"source":"apache","extensions":["pbm"]},"image/x-portable-graymap":{"source":"apache","extensions":["pgm"]},"image/x-portable-pixmap":{"source":"apache","extensions":["ppm"]},"image/x-rgb":{"source":"apache","extensions":["rgb"]},"image/x-tga":{"source":"apache","extensions":["tga"]},"image/x-xbitmap":{"source":"apache","extensions":["xbm"]},"image/x-xcf":{"compressible":false},"image/x-xpixmap":{"source":"apache","extensions":["xpm"]},"image/x-xwindowdump":{"source":"apache","extensions":["xwd"]},"message/cpim":{"source":"iana"},"message/delivery-status":{"source":"iana"},"message/disposition-notification":{"source":"iana","extensions":["disposition-notification"]},"message/external-body":{"source":"iana"},"message/feedback-report":{"source":"iana"},"message/global":{"source":"iana","extensions":["u8msg"]},"message/global-delivery-status":{"source":"iana","extensions":["u8dsn"]},"message/global-disposition-notification":{"source":"iana","extensions":["u8mdn"]},"message/global-headers":{"source":"iana","extensions":["u8hdr"]},"message/http":{"source":"iana","compressible":false},"message/imdn+xml":{"source":"iana","compressible":true},"message/news":{"source":"iana"},"message/partial":{"source":"iana","compressible":false},"message/rfc822":{"source":"iana","compressible":true,"extensions":["eml","mime"]},"message/s-http":{"source":"iana"},"message/sip":{"source":"iana"},"message/sipfrag":{"source":"iana"},"message/tracking-status":{"source":"iana"},"message/vnd.si.simp":{"source":"iana"},"message/vnd.wfa.wsc":{"source":"iana","extensions":["wsc"]},"model/3mf":{"source":"iana","extensions":["3mf"]},"model/e57":{"source":"iana"},"model/gltf+json":{"source":"iana","compressible":true,"extensions":["gltf"]},"model/gltf-binary":{"source":"iana","compressible":true,"extensions":["glb"]},"model/iges":{"source":"iana","compressible":false,"extensions":["igs","iges"]},"model/mesh":{"source":"iana","compressible":false,"extensions":["msh","mesh","silo"]},"model/mtl":{"source":"iana","extensions":["mtl"]},"model/obj":{"source":"iana","extensions":["obj"]},"model/step":{"source":"iana"},"model/step+xml":{"source":"iana","compressible":true,"extensions":["stpx"]},"model/step+zip":{"source":"iana","compressible":false,"extensions":["stpz"]},"model/step-xml+zip":{"source":"iana","compressible":false,"extensions":["stpxz"]},"model/stl":{"source":"iana","extensions":["stl"]},"model/vnd.collada+xml":{"source":"iana","compressible":true,"extensions":["dae"]},"model/vnd.dwf":{"source":"iana","extensions":["dwf"]},"model/vnd.flatland.3dml":{"source":"iana"},"model/vnd.gdl":{"source":"iana","extensions":["gdl"]},"model/vnd.gs-gdl":{"source":"apache"},"model/vnd.gs.gdl":{"source":"iana"},"model/vnd.gtw":{"source":"iana","extensions":["gtw"]},"model/vnd.moml+xml":{"source":"iana","compressible":true},"model/vnd.mts":{"source":"iana","extensions":["mts"]},"model/vnd.opengex":{"source":"iana","extensions":["ogex"]},"model/vnd.parasolid.transmit.binary":{"source":"iana","extensions":["x_b"]},"model/vnd.parasolid.transmit.text":{"source":"iana","extensions":["x_t"]},"model/vnd.pytha.pyox":{"source":"iana"},"model/vnd.rosette.annotated-data-model":{"source":"iana"},"model/vnd.sap.vds":{"source":"iana","extensions":["vds"]},"model/vnd.usdz+zip":{"source":"iana","compressible":false,"extensions":["usdz"]},"model/vnd.valve.source.compiled-map":{"source":"iana","extensions":["bsp"]},"model/vnd.vtu":{"source":"iana","extensions":["vtu"]},"model/vrml":{"source":"iana","compressible":false,"extensions":["wrl","vrml"]},"model/x3d+binary":{"source":"apache","compressible":false,"extensions":["x3db","x3dbz"]},"model/x3d+fastinfoset":{"source":"iana","extensions":["x3db"]},"model/x3d+vrml":{"source":"apache","compressible":false,"extensions":["x3dv","x3dvz"]},"model/x3d+xml":{"source":"iana","compressible":true,"extensions":["x3d","x3dz"]},"model/x3d-vrml":{"source":"iana","extensions":["x3dv"]},"multipart/alternative":{"source":"iana","compressible":false},"multipart/appledouble":{"source":"iana"},"multipart/byteranges":{"source":"iana"},"multipart/digest":{"source":"iana"},"multipart/encrypted":{"source":"iana","compressible":false},"multipart/form-data":{"source":"iana","compressible":false},"multipart/header-set":{"source":"iana"},"multipart/mixed":{"source":"iana"},"multipart/multilingual":{"source":"iana"},"multipart/parallel":{"source":"iana"},"multipart/related":{"source":"iana","compressible":false},"multipart/report":{"source":"iana"},"multipart/signed":{"source":"iana","compressible":false},"multipart/vnd.bint.med-plus":{"source":"iana"},"multipart/voice-message":{"source":"iana"},"multipart/x-mixed-replace":{"source":"iana"},"text/1d-interleaved-parityfec":{"source":"iana"},"text/cache-manifest":{"source":"iana","compressible":true,"extensions":["appcache","manifest"]},"text/calendar":{"source":"iana","extensions":["ics","ifb"]},"text/calender":{"compressible":true},"text/cmd":{"compressible":true},"text/coffeescript":{"extensions":["coffee","litcoffee"]},"text/cql":{"source":"iana"},"text/cql-expression":{"source":"iana"},"text/cql-identifier":{"source":"iana"},"text/css":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["css"]},"text/csv":{"source":"iana","compressible":true,"extensions":["csv"]},"text/csv-schema":{"source":"iana"},"text/directory":{"source":"iana"},"text/dns":{"source":"iana"},"text/ecmascript":{"source":"iana"},"text/encaprtp":{"source":"iana"},"text/enriched":{"source":"iana"},"text/fhirpath":{"source":"iana"},"text/flexfec":{"source":"iana"},"text/fwdred":{"source":"iana"},"text/gff3":{"source":"iana"},"text/grammar-ref-list":{"source":"iana"},"text/html":{"source":"iana","compressible":true,"extensions":["html","htm","shtml"]},"text/jade":{"extensions":["jade"]},"text/javascript":{"source":"iana","compressible":true},"text/jcr-cnd":{"source":"iana"},"text/jsx":{"compressible":true,"extensions":["jsx"]},"text/less":{"compressible":true,"extensions":["less"]},"text/markdown":{"source":"iana","compressible":true,"extensions":["markdown","md"]},"text/mathml":{"source":"nginx","extensions":["mml"]},"text/mdx":{"compressible":true,"extensions":["mdx"]},"text/mizar":{"source":"iana"},"text/n3":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["n3"]},"text/parameters":{"source":"iana","charset":"UTF-8"},"text/parityfec":{"source":"iana"},"text/plain":{"source":"iana","compressible":true,"extensions":["txt","text","conf","def","list","log","in","ini"]},"text/provenance-notation":{"source":"iana","charset":"UTF-8"},"text/prs.fallenstein.rst":{"source":"iana"},"text/prs.lines.tag":{"source":"iana","extensions":["dsc"]},"text/prs.prop.logic":{"source":"iana"},"text/raptorfec":{"source":"iana"},"text/red":{"source":"iana"},"text/rfc822-headers":{"source":"iana"},"text/richtext":{"source":"iana","compressible":true,"extensions":["rtx"]},"text/rtf":{"source":"iana","compressible":true,"extensions":["rtf"]},"text/rtp-enc-aescm128":{"source":"iana"},"text/rtploopback":{"source":"iana"},"text/rtx":{"source":"iana"},"text/sgml":{"source":"iana","extensions":["sgml","sgm"]},"text/shaclc":{"source":"iana"},"text/shex":{"source":"iana","extensions":["shex"]},"text/slim":{"extensions":["slim","slm"]},"text/spdx":{"source":"iana","extensions":["spdx"]},"text/strings":{"source":"iana"},"text/stylus":{"extensions":["stylus","styl"]},"text/t140":{"source":"iana"},"text/tab-separated-values":{"source":"iana","compressible":true,"extensions":["tsv"]},"text/troff":{"source":"iana","extensions":["t","tr","roff","man","me","ms"]},"text/turtle":{"source":"iana","charset":"UTF-8","extensions":["ttl"]},"text/ulpfec":{"source":"iana"},"text/uri-list":{"source":"iana","compressible":true,"extensions":["uri","uris","urls"]},"text/vcard":{"source":"iana","compressible":true,"extensions":["vcard"]},"text/vnd.a":{"source":"iana"},"text/vnd.abc":{"source":"iana"},"text/vnd.ascii-art":{"source":"iana"},"text/vnd.curl":{"source":"iana","extensions":["curl"]},"text/vnd.curl.dcurl":{"source":"apache","extensions":["dcurl"]},"text/vnd.curl.mcurl":{"source":"apache","extensions":["mcurl"]},"text/vnd.curl.scurl":{"source":"apache","extensions":["scurl"]},"text/vnd.debian.copyright":{"source":"iana","charset":"UTF-8"},"text/vnd.dmclientscript":{"source":"iana"},"text/vnd.dvb.subtitle":{"source":"iana","extensions":["sub"]},"text/vnd.esmertec.theme-descriptor":{"source":"iana","charset":"UTF-8"},"text/vnd.familysearch.gedcom":{"source":"iana","extensions":["ged"]},"text/vnd.ficlab.flt":{"source":"iana"},"text/vnd.fly":{"source":"iana","extensions":["fly"]},"text/vnd.fmi.flexstor":{"source":"iana","extensions":["flx"]},"text/vnd.gml":{"source":"iana"},"text/vnd.graphviz":{"source":"iana","extensions":["gv"]},"text/vnd.hans":{"source":"iana"},"text/vnd.hgl":{"source":"iana"},"text/vnd.in3d.3dml":{"source":"iana","extensions":["3dml"]},"text/vnd.in3d.spot":{"source":"iana","extensions":["spot"]},"text/vnd.iptc.newsml":{"source":"iana"},"text/vnd.iptc.nitf":{"source":"iana"},"text/vnd.latex-z":{"source":"iana"},"text/vnd.motorola.reflex":{"source":"iana"},"text/vnd.ms-mediapackage":{"source":"iana"},"text/vnd.net2phone.commcenter.command":{"source":"iana"},"text/vnd.radisys.msml-basic-layout":{"source":"iana"},"text/vnd.senx.warpscript":{"source":"iana"},"text/vnd.si.uricatalogue":{"source":"iana"},"text/vnd.sosi":{"source":"iana"},"text/vnd.sun.j2me.app-descriptor":{"source":"iana","charset":"UTF-8","extensions":["jad"]},"text/vnd.trolltech.linguist":{"source":"iana","charset":"UTF-8"},"text/vnd.wap.si":{"source":"iana"},"text/vnd.wap.sl":{"source":"iana"},"text/vnd.wap.wml":{"source":"iana","extensions":["wml"]},"text/vnd.wap.wmlscript":{"source":"iana","extensions":["wmls"]},"text/vtt":{"source":"iana","charset":"UTF-8","compressible":true,"extensions":["vtt"]},"text/x-asm":{"source":"apache","extensions":["s","asm"]},"text/x-c":{"source":"apache","extensions":["c","cc","cxx","cpp","h","hh","dic"]},"text/x-component":{"source":"nginx","extensions":["htc"]},"text/x-fortran":{"source":"apache","extensions":["f","for","f77","f90"]},"text/x-gwt-rpc":{"compressible":true},"text/x-handlebars-template":{"extensions":["hbs"]},"text/x-java-source":{"source":"apache","extensions":["java"]},"text/x-jquery-tmpl":{"compressible":true},"text/x-lua":{"extensions":["lua"]},"text/x-markdown":{"compressible":true,"extensions":["mkd"]},"text/x-nfo":{"source":"apache","extensions":["nfo"]},"text/x-opml":{"source":"apache","extensions":["opml"]},"text/x-org":{"compressible":true,"extensions":["org"]},"text/x-pascal":{"source":"apache","extensions":["p","pas"]},"text/x-processing":{"compressible":true,"extensions":["pde"]},"text/x-sass":{"extensions":["sass"]},"text/x-scss":{"extensions":["scss"]},"text/x-setext":{"source":"apache","extensions":["etx"]},"text/x-sfv":{"source":"apache","extensions":["sfv"]},"text/x-suse-ymp":{"compressible":true,"extensions":["ymp"]},"text/x-uuencode":{"source":"apache","extensions":["uu"]},"text/x-vcalendar":{"source":"apache","extensions":["vcs"]},"text/x-vcard":{"source":"apache","extensions":["vcf"]},"text/xml":{"source":"iana","compressible":true,"extensions":["xml"]},"text/xml-external-parsed-entity":{"source":"iana"},"text/yaml":{"compressible":true,"extensions":["yaml","yml"]},"video/1d-interleaved-parityfec":{"source":"iana"},"video/3gpp":{"source":"iana","extensions":["3gp","3gpp"]},"video/3gpp-tt":{"source":"iana"},"video/3gpp2":{"source":"iana","extensions":["3g2"]},"video/av1":{"source":"iana"},"video/bmpeg":{"source":"iana"},"video/bt656":{"source":"iana"},"video/celb":{"source":"iana"},"video/dv":{"source":"iana"},"video/encaprtp":{"source":"iana"},"video/ffv1":{"source":"iana"},"video/flexfec":{"source":"iana"},"video/h261":{"source":"iana","extensions":["h261"]},"video/h263":{"source":"iana","extensions":["h263"]},"video/h263-1998":{"source":"iana"},"video/h263-2000":{"source":"iana"},"video/h264":{"source":"iana","extensions":["h264"]},"video/h264-rcdo":{"source":"iana"},"video/h264-svc":{"source":"iana"},"video/h265":{"source":"iana"},"video/iso.segment":{"source":"iana","extensions":["m4s"]},"video/jpeg":{"source":"iana","extensions":["jpgv"]},"video/jpeg2000":{"source":"iana"},"video/jpm":{"source":"apache","extensions":["jpm","jpgm"]},"video/jxsv":{"source":"iana"},"video/mj2":{"source":"iana","extensions":["mj2","mjp2"]},"video/mp1s":{"source":"iana"},"video/mp2p":{"source":"iana"},"video/mp2t":{"source":"iana","extensions":["ts"]},"video/mp4":{"source":"iana","compressible":false,"extensions":["mp4","mp4v","mpg4"]},"video/mp4v-es":{"source":"iana"},"video/mpeg":{"source":"iana","compressible":false,"extensions":["mpeg","mpg","mpe","m1v","m2v"]},"video/mpeg4-generic":{"source":"iana"},"video/mpv":{"source":"iana"},"video/nv":{"source":"iana"},"video/ogg":{"source":"iana","compressible":false,"extensions":["ogv"]},"video/parityfec":{"source":"iana"},"video/pointer":{"source":"iana"},"video/quicktime":{"source":"iana","compressible":false,"extensions":["qt","mov"]},"video/raptorfec":{"source":"iana"},"video/raw":{"source":"iana"},"video/rtp-enc-aescm128":{"source":"iana"},"video/rtploopback":{"source":"iana"},"video/rtx":{"source":"iana"},"video/scip":{"source":"iana"},"video/smpte291":{"source":"iana"},"video/smpte292m":{"source":"iana"},"video/ulpfec":{"source":"iana"},"video/vc1":{"source":"iana"},"video/vc2":{"source":"iana"},"video/vnd.cctv":{"source":"iana"},"video/vnd.dece.hd":{"source":"iana","extensions":["uvh","uvvh"]},"video/vnd.dece.mobile":{"source":"iana","extensions":["uvm","uvvm"]},"video/vnd.dece.mp4":{"source":"iana"},"video/vnd.dece.pd":{"source":"iana","extensions":["uvp","uvvp"]},"video/vnd.dece.sd":{"source":"iana","extensions":["uvs","uvvs"]},"video/vnd.dece.video":{"source":"iana","extensions":["uvv","uvvv"]},"video/vnd.directv.mpeg":{"source":"iana"},"video/vnd.directv.mpeg-tts":{"source":"iana"},"video/vnd.dlna.mpeg-tts":{"source":"iana"},"video/vnd.dvb.file":{"source":"iana","extensions":["dvb"]},"video/vnd.fvt":{"source":"iana","extensions":["fvt"]},"video/vnd.hns.video":{"source":"iana"},"video/vnd.iptvforum.1dparityfec-1010":{"source":"iana"},"video/vnd.iptvforum.1dparityfec-2005":{"source":"iana"},"video/vnd.iptvforum.2dparityfec-1010":{"source":"iana"},"video/vnd.iptvforum.2dparityfec-2005":{"source":"iana"},"video/vnd.iptvforum.ttsavc":{"source":"iana"},"video/vnd.iptvforum.ttsmpeg2":{"source":"iana"},"video/vnd.motorola.video":{"source":"iana"},"video/vnd.motorola.videop":{"source":"iana"},"video/vnd.mpegurl":{"source":"iana","extensions":["mxu","m4u"]},"video/vnd.ms-playready.media.pyv":{"source":"iana","extensions":["pyv"]},"video/vnd.nokia.interleaved-multimedia":{"source":"iana"},"video/vnd.nokia.mp4vr":{"source":"iana"},"video/vnd.nokia.videovoip":{"source":"iana"},"video/vnd.objectvideo":{"source":"iana"},"video/vnd.radgamettools.bink":{"source":"iana"},"video/vnd.radgamettools.smacker":{"source":"iana"},"video/vnd.sealed.mpeg1":{"source":"iana"},"video/vnd.sealed.mpeg4":{"source":"iana"},"video/vnd.sealed.swf":{"source":"iana"},"video/vnd.sealedmedia.softseal.mov":{"source":"iana"},"video/vnd.uvvu.mp4":{"source":"iana","extensions":["uvu","uvvu"]},"video/vnd.vivo":{"source":"iana","extensions":["viv"]},"video/vnd.youtube.yt":{"source":"iana"},"video/vp8":{"source":"iana"},"video/vp9":{"source":"iana"},"video/webm":{"source":"apache","compressible":false,"extensions":["webm"]},"video/x-f4v":{"source":"apache","extensions":["f4v"]},"video/x-fli":{"source":"apache","extensions":["fli"]},"video/x-flv":{"source":"apache","compressible":false,"extensions":["flv"]},"video/x-m4v":{"source":"apache","extensions":["m4v"]},"video/x-matroska":{"source":"apache","compressible":false,"extensions":["mkv","mk3d","mks"]},"video/x-mng":{"source":"apache","extensions":["mng"]},"video/x-ms-asf":{"source":"apache","extensions":["asf","asx"]},"video/x-ms-vob":{"source":"apache","extensions":["vob"]},"video/x-ms-wm":{"source":"apache","extensions":["wm"]},"video/x-ms-wmv":{"source":"apache","compressible":false,"extensions":["wmv"]},"video/x-ms-wmx":{"source":"apache","extensions":["wmx"]},"video/x-ms-wvx":{"source":"apache","extensions":["wvx"]},"video/x-msvideo":{"source":"apache","extensions":["avi"]},"video/x-sgi-movie":{"source":"apache","extensions":["movie"]},"video/x-smv":{"source":"apache","extensions":["smv"]},"x-conference/x-cooltalk":{"source":"apache","extensions":["ice"]},"x-shader/x-fragment":{"compressible":true},"x-shader/x-vertex":{"compressible":true}}');
+
+/***/ }),
+
/***/ 2020:
/***/ ((module) => {
diff --git a/examples/on-pr-merge/automated-workflow.yaml b/examples/on-pr-merge/automated-workflow.yaml
new file mode 100644
index 0000000..751bbb5
--- /dev/null
+++ b/examples/on-pr-merge/automated-workflow.yaml
@@ -0,0 +1,53 @@
+name: Automated Backporting on PR merge using Git Backporting
+
+on:
+ pull_request_target:
+ types: [closed, labeled]
+ branches:
+ - main
+
+env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+
+jobs:
+ compute-targets:
+ if: ${{ github.event.pull_request.state == 'closed' && github.event.pull_request.merged }}
+ runs-on: ubuntu-latest
+ outputs:
+ target-branches: ${{ steps.set-targets.outputs.targets }}
+ env:
+ LABELS: ${{ toJSON(github.event.pull_request.labels) }}
+ steps:
+ - name: Set target branches
+ id: set-targets
+ uses: kiegroup/kie-ci/.ci/actions/parse-labels@main
+ with:
+ labels: ${LABELS}
+
+ backporting:
+ if: ${{ github.event.pull_request.state == 'closed' && github.event.pull_request.merged && needs.compute-targets.outputs.target-branches != '[]' }}
+ name: "[${{ matrix.target-branch }}] - Backporting"
+ runs-on: ubuntu-latest
+ needs: compute-targets
+ strategy:
+ matrix:
+ target-branch: ${{ fromJSON(needs.compute-targets.outputs.target-branches) }}
+ fail-fast: true
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ - name: Backporting
+ uses: ./
+ with:
+ dry-run: true
+ pull-request: ${{ github.event.pull_request.html_url }}
+ target-branch: ${{ matrix.target-branch }}
+ auth: "${{ env.GITHUB_TOKEN }}"
+ title: "[${{ matrix.target-branch }}] ${{ github.event.pull_request.title }}"
+ body-prefix: "**Backport:** ${{ github.event.pull_request.html_url }}\r\n\r\n**Note**: comment 'ok to test' to properly launch Jenkins jobs\r\n\r\n"
+ body: "${{ github.event.pull_request.body }}"
+ labels: "cherry-pick :cherries:"
+ inherit-labels: false
+ bp-branch-name: "${{ matrix.target-branch }}_${{ github.event.pull_request.head.ref }}"
\ No newline at end of file
diff --git a/examples/on-pr-merge/pr-merge-event.json b/examples/on-pr-merge/pr-merge-event.json
new file mode 100644
index 0000000..a30b31f
--- /dev/null
+++ b/examples/on-pr-merge/pr-merge-event.json
@@ -0,0 +1,79 @@
+{
+ "pull_request": {
+ "url": "https://api.github.com/repos/lampajr/backporting-example/pulls/66",
+ "html_url": "https://github.com/lampajr/backporting-example/pull/66",
+ "diff_url": "https://github.com/lampajr/backporting-example/pull/66.diff",
+ "patch_url": "https://github.com/lampajr/backporting-example/pull/66.patch",
+ "issue_url": "https://api.github.com/repos/lampajr/backporting-example/issues/66",
+ "number": 66,
+ "state": "closed",
+ "title": "Feature1: multiple changes",
+ "user": {
+ "login": "lampajr"
+ },
+ "body": "This is the body of multiple change",
+ "merge_commit_sha": "0bcaa01cdd509ca434e123d2e2b9ce7f66234bd7",
+ "assignee": null,
+ "assignees": [
+
+ ],
+ "requested_reviewers": [
+
+ ],
+ "requested_teams": [
+
+ ],
+ "labels": [
+ {
+ "name": "backport-develop",
+ "color": "AB975B",
+ "default": false,
+ "description": ""
+ }
+ ],
+ "head": {
+ "label": "lampajr:feature1",
+ "ref": "feature1",
+ "sha": "69e49388ea2ca9be272b188a9271806d487bf01e",
+ "user": {
+ "login": "lampajr"
+ },
+ "repo": {
+ "name": "backporting-example",
+ "full_name": "lampajr/backporting-example",
+ "owner": {
+ "login": "lampajr"
+ },
+ "html_url": "https://github.com/lampajr/backporting-example",
+ "clone_url": "https://github.com/lampajr/backporting-example.git"
+ }
+ },
+ "base": {
+ "label": "lampajr:main",
+ "ref": "main",
+ "sha": "c85b8fcdb741814b3e90e6e5729455cf46ff26ea",
+ "user": {
+ "login": "lampajr"
+ },
+ "repo": {
+ "name": "backporting-example",
+ "full_name": "lampajr/backporting-example",
+ "owner": {
+ "login": "lampajr"
+ },
+ "html_url": "https://github.com/lampajr/backporting-example",
+ "description": "Playground repository for automated backporting testing",
+ "url": "https://api.github.com/repos/lampajr/backporting-example",
+ "issues_url": "https://api.github.com/repos/lampajr/backporting-example/issues{/number}",
+ "pulls_url": "https://api.github.com/repos/lampajr/backporting-example/pulls{/number}",
+ "clone_url": "https://github.com/lampajr/backporting-example.git"
+ }
+ },
+ "merged": true,
+ "merged_by": {
+ "login": "lampajr"
+ },
+ "comments": 0,
+ "commits": 2
+ }
+}
\ No newline at end of file
diff --git a/mise.toml b/mise.toml
new file mode 100644
index 0000000..126f680
--- /dev/null
+++ b/mise.toml
@@ -0,0 +1,2 @@
+[tools]
+node = "20"
diff --git a/package-lock.json b/package-lock.json
index dad3c12..6ff2d33 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,30 +1,32 @@
{
- "name": "@lampajr/bper",
- "version": "2.1.0",
+ "name": "@kie/git-backporting",
+ "version": "4.8.5",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
- "name": "@lampajr/bper",
- "version": "2.1.0",
+ "name": "@kie/git-backporting",
+ "version": "4.8.5",
"license": "MIT",
"dependencies": {
"@actions/core": "^1.10.0",
- "@octokit/rest": "^19.0.5",
- "@octokit/types": "^8.0.0",
- "@octokit/webhooks-types": "^6.8.0",
+ "@octokit/rest": "^18.12.0",
+ "axios": "^1.4.0",
"commander": "^9.3.0",
"fs-extra": "^11.1.0",
+ "https": "^1.0.0",
"simple-git": "^3.15.1"
},
"bin": {
- "bper": "dist/cli/index.js"
+ "git-backporting": "dist/cli/index.js"
},
"devDependencies": {
"@commitlint/cli": "^17.4.0",
"@commitlint/config-conventional": "^17.4.0",
- "@kie/mock-github": "^0.1.2",
- "@release-it/conventional-changelog": "^5.1.1",
+ "@gitbeaker/rest": "^39.1.0",
+ "@kie/mock-github": "^1.1.0",
+ "@octokit/webhooks-types": "^6.8.0",
+ "@release-it/conventional-changelog": "^10.0.0",
"@types/fs-extra": "^9.0.13",
"@types/jest": "^29.2.4",
"@types/node": "^18.11.17",
@@ -33,17 +35,26 @@
"@vercel/ncc": "^0.36.0",
"eslint": "^8.30.0",
"husky": "^8.0.2",
- "jest": "^29.3.1",
+ "jest": "^29.0.0",
"jest-sonar-reporter": "^2.0.0",
- "release-it": "^15.6.0",
+ "release-it": "^19.0.2",
"semver": "^7.3.8",
- "ts-jest": "^29.0.3",
+ "ts-jest": "^29.0.0",
"ts-node": "^10.8.1",
"tsc-alias": "^1.8.2",
"tsconfig-paths": "^4.1.0",
"typescript": "^4.9.3"
}
},
+ "node_modules/@aashutoshrathi/word-wrap": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
+ "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/@actions/core": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/@actions/core/-/core-1.10.0.tgz",
@@ -62,12 +73,12 @@
}
},
"node_modules/@ampproject/remapping": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
- "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz",
+ "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==",
"dev": true,
"dependencies": {
- "@jridgewell/gen-mapping": "^0.1.0",
+ "@jridgewell/gen-mapping": "^0.3.0",
"@jridgewell/trace-mapping": "^0.3.9"
},
"engines": {
@@ -75,46 +86,48 @@
}
},
"node_modules/@babel/code-frame": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz",
- "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==",
+ "version": "7.26.2",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
+ "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
"dev": true,
"dependencies": {
- "@babel/highlight": "^7.18.6"
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.0.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/compat-data": {
- "version": "7.20.5",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.5.tgz",
- "integrity": "sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.5.tgz",
+ "integrity": "sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/core": {
- "version": "7.20.5",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.5.tgz",
- "integrity": "sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz",
+ "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==",
"dev": true,
"dependencies": {
- "@ampproject/remapping": "^2.1.0",
- "@babel/code-frame": "^7.18.6",
- "@babel/generator": "^7.20.5",
- "@babel/helper-compilation-targets": "^7.20.0",
- "@babel/helper-module-transforms": "^7.20.2",
- "@babel/helpers": "^7.20.5",
- "@babel/parser": "^7.20.5",
- "@babel/template": "^7.18.10",
- "@babel/traverse": "^7.20.5",
- "@babel/types": "^7.20.5",
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.22.5",
+ "@babel/generator": "^7.22.5",
+ "@babel/helper-compilation-targets": "^7.22.5",
+ "@babel/helper-module-transforms": "^7.22.5",
+ "@babel/helpers": "^7.22.5",
+ "@babel/parser": "^7.22.5",
+ "@babel/template": "^7.22.5",
+ "@babel/traverse": "^7.22.5",
+ "@babel/types": "^7.22.5",
"convert-source-map": "^1.7.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
- "json5": "^2.2.1",
+ "json5": "^2.2.2",
"semver": "^6.3.0"
},
"engines": {
@@ -132,51 +145,39 @@
"dev": true
},
"node_modules/@babel/core/node_modules/semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true,
"bin": {
"semver": "bin/semver.js"
}
},
"node_modules/@babel/generator": {
- "version": "7.20.5",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.5.tgz",
- "integrity": "sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==",
+ "version": "7.23.0",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz",
+ "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==",
"dev": true,
"dependencies": {
- "@babel/types": "^7.20.5",
+ "@babel/types": "^7.23.0",
"@jridgewell/gen-mapping": "^0.3.2",
+ "@jridgewell/trace-mapping": "^0.3.17",
"jsesc": "^2.5.1"
},
"engines": {
"node": ">=6.9.0"
}
},
- "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
- "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
- "dev": true,
- "dependencies": {
- "@jridgewell/set-array": "^1.0.1",
- "@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.9"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
"node_modules/@babel/helper-compilation-targets": {
- "version": "7.20.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz",
- "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz",
+ "integrity": "sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==",
"dev": true,
"dependencies": {
- "@babel/compat-data": "^7.20.0",
- "@babel/helper-validator-option": "^7.18.6",
+ "@babel/compat-data": "^7.22.5",
+ "@babel/helper-validator-option": "^7.22.5",
"browserslist": "^4.21.3",
+ "lru-cache": "^5.1.1",
"semver": "^6.3.0"
},
"engines": {
@@ -186,244 +187,176 @@
"@babel/core": "^7.0.0"
}
},
+ "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
"node_modules/@babel/helper-compilation-targets/node_modules/semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true,
"bin": {
"semver": "bin/semver.js"
}
},
+ "node_modules/@babel/helper-compilation-targets/node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true
+ },
"node_modules/@babel/helper-environment-visitor": {
- "version": "7.18.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz",
- "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==",
+ "version": "7.22.20",
+ "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz",
+ "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-function-name": {
- "version": "7.19.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz",
- "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==",
+ "version": "7.23.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz",
+ "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==",
"dev": true,
"dependencies": {
- "@babel/template": "^7.18.10",
- "@babel/types": "^7.19.0"
+ "@babel/template": "^7.22.15",
+ "@babel/types": "^7.23.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-hoist-variables": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz",
- "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
+ "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
"dev": true,
"dependencies": {
- "@babel/types": "^7.18.6"
+ "@babel/types": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-module-imports": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz",
- "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz",
+ "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==",
"dev": true,
"dependencies": {
- "@babel/types": "^7.18.6"
+ "@babel/types": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-module-transforms": {
- "version": "7.20.2",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz",
- "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz",
+ "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==",
"dev": true,
"dependencies": {
- "@babel/helper-environment-visitor": "^7.18.9",
- "@babel/helper-module-imports": "^7.18.6",
- "@babel/helper-simple-access": "^7.20.2",
- "@babel/helper-split-export-declaration": "^7.18.6",
- "@babel/helper-validator-identifier": "^7.19.1",
- "@babel/template": "^7.18.10",
- "@babel/traverse": "^7.20.1",
- "@babel/types": "^7.20.2"
+ "@babel/helper-environment-visitor": "^7.22.5",
+ "@babel/helper-module-imports": "^7.22.5",
+ "@babel/helper-simple-access": "^7.22.5",
+ "@babel/helper-split-export-declaration": "^7.22.5",
+ "@babel/helper-validator-identifier": "^7.22.5",
+ "@babel/template": "^7.22.5",
+ "@babel/traverse": "^7.22.5",
+ "@babel/types": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-plugin-utils": {
- "version": "7.20.2",
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz",
- "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz",
+ "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-simple-access": {
- "version": "7.20.2",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz",
- "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz",
+ "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==",
"dev": true,
"dependencies": {
- "@babel/types": "^7.20.2"
+ "@babel/types": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-split-export-declaration": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz",
- "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==",
+ "version": "7.22.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz",
+ "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==",
"dev": true,
"dependencies": {
- "@babel/types": "^7.18.6"
+ "@babel/types": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-string-parser": {
- "version": "7.19.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz",
- "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
+ "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-identifier": {
- "version": "7.19.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
- "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
+ "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helper-validator-option": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz",
- "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz",
+ "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/helpers": {
- "version": "7.20.6",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.6.tgz",
- "integrity": "sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w==",
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz",
+ "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==",
"dev": true,
"dependencies": {
- "@babel/template": "^7.18.10",
- "@babel/traverse": "^7.20.5",
- "@babel/types": "^7.20.5"
+ "@babel/template": "^7.27.0",
+ "@babel/types": "^7.27.0"
},
"engines": {
"node": ">=6.9.0"
}
},
- "node_modules/@babel/highlight": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz",
- "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==",
- "dev": true,
- "dependencies": {
- "@babel/helper-validator-identifier": "^7.18.6",
- "chalk": "^2.0.0",
- "js-tokens": "^4.0.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/highlight/node_modules/ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "dependencies": {
- "color-convert": "^1.9.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@babel/highlight/node_modules/chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@babel/highlight/node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "dependencies": {
- "color-name": "1.1.3"
- }
- },
- "node_modules/@babel/highlight/node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "dev": true
- },
- "node_modules/@babel/highlight/node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "dev": true,
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/@babel/highlight/node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@babel/highlight/node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "dependencies": {
- "has-flag": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/@babel/parser": {
- "version": "7.20.5",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz",
- "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==",
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz",
+ "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==",
"dev": true,
+ "dependencies": {
+ "@babel/types": "^7.27.0"
+ },
"bin": {
"parser": "bin/babel-parser.js"
},
@@ -492,12 +425,12 @@
}
},
"node_modules/@babel/plugin-syntax-jsx": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz",
- "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz",
+ "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.18.6"
+ "@babel/helper-plugin-utils": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
@@ -594,12 +527,12 @@
}
},
"node_modules/@babel/plugin-syntax-typescript": {
- "version": "7.20.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz",
- "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz",
+ "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==",
"dev": true,
"dependencies": {
- "@babel/helper-plugin-utils": "^7.19.0"
+ "@babel/helper-plugin-utils": "^7.22.5"
},
"engines": {
"node": ">=6.9.0"
@@ -609,33 +542,33 @@
}
},
"node_modules/@babel/template": {
- "version": "7.18.10",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz",
- "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==",
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz",
+ "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==",
"dev": true,
"dependencies": {
- "@babel/code-frame": "^7.18.6",
- "@babel/parser": "^7.18.10",
- "@babel/types": "^7.18.10"
+ "@babel/code-frame": "^7.26.2",
+ "@babel/parser": "^7.27.0",
+ "@babel/types": "^7.27.0"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/traverse": {
- "version": "7.20.5",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.5.tgz",
- "integrity": "sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==",
+ "version": "7.23.2",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz",
+ "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==",
"dev": true,
"dependencies": {
- "@babel/code-frame": "^7.18.6",
- "@babel/generator": "^7.20.5",
- "@babel/helper-environment-visitor": "^7.18.9",
- "@babel/helper-function-name": "^7.19.0",
- "@babel/helper-hoist-variables": "^7.18.6",
- "@babel/helper-split-export-declaration": "^7.18.6",
- "@babel/parser": "^7.20.5",
- "@babel/types": "^7.20.5",
+ "@babel/code-frame": "^7.22.13",
+ "@babel/generator": "^7.23.0",
+ "@babel/helper-environment-visitor": "^7.22.20",
+ "@babel/helper-function-name": "^7.23.0",
+ "@babel/helper-hoist-variables": "^7.22.5",
+ "@babel/helper-split-export-declaration": "^7.22.6",
+ "@babel/parser": "^7.23.0",
+ "@babel/types": "^7.23.0",
"debug": "^4.1.0",
"globals": "^11.1.0"
},
@@ -653,14 +586,13 @@
}
},
"node_modules/@babel/types": {
- "version": "7.20.5",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz",
- "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==",
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz",
+ "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==",
"dev": true,
"dependencies": {
- "@babel/helper-string-parser": "^7.19.4",
- "@babel/helper-validator-identifier": "^7.19.1",
- "to-fast-properties": "^2.0.0"
+ "@babel/helper-string-parser": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9"
},
"engines": {
"node": ">=6.9.0"
@@ -673,16 +605,16 @@
"dev": true
},
"node_modules/@commitlint/cli": {
- "version": "17.4.0",
- "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-17.4.0.tgz",
- "integrity": "sha512-SEY4sYe8yVlgxPP7X0wJb96DBAGBPsCsy6QbqJt/UECbIAjDeDV5xXBV4jnS7T/qMC10sk6Ub9kDhEX0VWvblw==",
+ "version": "17.6.6",
+ "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-17.6.6.tgz",
+ "integrity": "sha512-sTKpr2i/Fjs9OmhU+beBxjPavpnLSqZaO6CzwKVq2Tc4UYVTMFgpKOslDhUBVlfAUBfjVO8ParxC/MXkIOevEA==",
"dev": true,
"dependencies": {
- "@commitlint/format": "^17.4.0",
- "@commitlint/lint": "^17.4.0",
- "@commitlint/load": "^17.4.0",
- "@commitlint/read": "^17.4.0",
- "@commitlint/types": "^17.4.0",
+ "@commitlint/format": "^17.4.4",
+ "@commitlint/lint": "^17.6.6",
+ "@commitlint/load": "^17.5.0",
+ "@commitlint/read": "^17.5.1",
+ "@commitlint/types": "^17.4.4",
"execa": "^5.0.0",
"lodash.isfunction": "^3.0.9",
"resolve-from": "5.0.0",
@@ -718,12 +650,12 @@
}
},
"node_modules/@commitlint/config-validator": {
- "version": "17.4.0",
- "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-17.4.0.tgz",
- "integrity": "sha512-Sa/+8KNpDXz4zT4bVbz2fpFjvgkPO6u2V2fP4TKgt6FjmOw2z3eEX859vtfeaTav/ukBw0/0jr+5ZTZp9zCBhA==",
+ "version": "17.4.4",
+ "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-17.4.4.tgz",
+ "integrity": "sha512-bi0+TstqMiqoBAQDvdEP4AFh0GaKyLFlPPEObgI29utoKEYoPQTvF0EYqIwYYLEoJYhj5GfMIhPHJkTJhagfeg==",
"dev": true,
"dependencies": {
- "@commitlint/types": "^17.4.0",
+ "@commitlint/types": "^17.4.4",
"ajv": "^8.11.0"
},
"engines": {
@@ -731,12 +663,12 @@
}
},
"node_modules/@commitlint/ensure": {
- "version": "17.4.0",
- "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-17.4.0.tgz",
- "integrity": "sha512-7oAxt25je0jeQ/E0O/M8L3ADb1Cvweu/5lc/kYF8g/kXatI0wxGE5La52onnAUAWeWlsuvBNar15WcrmDmr5Mw==",
+ "version": "17.4.4",
+ "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-17.4.4.tgz",
+ "integrity": "sha512-AHsFCNh8hbhJiuZ2qHv/m59W/GRE9UeOXbkOqxYMNNg9pJ7qELnFcwj5oYpa6vzTSHtPGKf3C2yUFNy1GGHq6g==",
"dev": true,
"dependencies": {
- "@commitlint/types": "^17.4.0",
+ "@commitlint/types": "^17.4.4",
"lodash.camelcase": "^4.3.0",
"lodash.kebabcase": "^4.1.1",
"lodash.snakecase": "^4.1.1",
@@ -757,12 +689,12 @@
}
},
"node_modules/@commitlint/format": {
- "version": "17.4.0",
- "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-17.4.0.tgz",
- "integrity": "sha512-Z2bWAU5+f1YZh9W76c84J8iLIWIvvm+mzqogTz0Nsc1x6EHW0Z2gI38g5HAjB0r0I3ZjR15IDEJKhsxyblcyhA==",
+ "version": "17.4.4",
+ "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-17.4.4.tgz",
+ "integrity": "sha512-+IS7vpC4Gd/x+uyQPTAt3hXs5NxnkqAZ3aqrHd5Bx/R9skyCAWusNlNbw3InDbAK6j166D9asQM8fnmYIa+CXQ==",
"dev": true,
"dependencies": {
- "@commitlint/types": "^17.4.0",
+ "@commitlint/types": "^17.4.4",
"chalk": "^4.1.0"
},
"engines": {
@@ -770,43 +702,59 @@
}
},
"node_modules/@commitlint/is-ignored": {
- "version": "17.4.0",
- "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.4.0.tgz",
- "integrity": "sha512-mkRuBlPUaBimvSvJyIHEHEW1/jP1SqEI7NOoaO9/eyJkMbsaiv5b1QgDYL4ZXlHdS64RMV7Y21MVVzuIceImDA==",
+ "version": "17.6.6",
+ "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.6.6.tgz",
+ "integrity": "sha512-4Fw875faAKO+2nILC04yW/2Vy/wlV3BOYCSQ4CEFzriPEprc1Td2LILmqmft6PDEK5Sr14dT9tEzeaZj0V56Gg==",
"dev": true,
"dependencies": {
- "@commitlint/types": "^17.4.0",
- "semver": "7.3.8"
+ "@commitlint/types": "^17.4.4",
+ "semver": "7.5.2"
},
"engines": {
"node": ">=v14"
}
},
- "node_modules/@commitlint/lint": {
- "version": "17.4.0",
- "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.4.0.tgz",
- "integrity": "sha512-HG2YT4TUbQKs9v8QvpQjJ6OK+fhflsDB8M+D5tLrY79hbQOWA9mDKdRkABsW/AAhpNI9+zeGUWF3jj245jSHKw==",
+ "node_modules/@commitlint/is-ignored/node_modules/semver": {
+ "version": "7.5.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz",
+ "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==",
"dev": true,
"dependencies": {
- "@commitlint/is-ignored": "^17.4.0",
- "@commitlint/parse": "^17.4.0",
- "@commitlint/rules": "^17.4.0",
- "@commitlint/types": "^17.4.0"
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@commitlint/lint": {
+ "version": "17.6.6",
+ "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.6.6.tgz",
+ "integrity": "sha512-5bN+dnHcRLkTvwCHYMS7Xpbr+9uNi0Kq5NR3v4+oPNx6pYXt8ACuw9luhM/yMgHYwW0ajIR20wkPAFkZLEMGmg==",
+ "dev": true,
+ "dependencies": {
+ "@commitlint/is-ignored": "^17.6.6",
+ "@commitlint/parse": "^17.6.5",
+ "@commitlint/rules": "^17.6.5",
+ "@commitlint/types": "^17.4.4"
},
"engines": {
"node": ">=v14"
}
},
"node_modules/@commitlint/load": {
- "version": "17.4.0",
- "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-17.4.0.tgz",
- "integrity": "sha512-wDKNvAJqukqZqKmhRlf3KNo/12QGo1AQcd80EbV01SxtGvyHOsJ/g+/IbrZpopZv8rvzmEVktcpfDYH6ITepFA==",
+ "version": "17.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-17.5.0.tgz",
+ "integrity": "sha512-l+4W8Sx4CD5rYFsrhHH8HP01/8jEP7kKf33Xlx2Uk2out/UKoKPYMOIRcDH5ppT8UXLMV+x6Wm5osdRKKgaD1Q==",
"dev": true,
"dependencies": {
- "@commitlint/config-validator": "^17.4.0",
+ "@commitlint/config-validator": "^17.4.4",
"@commitlint/execute-rule": "^17.4.0",
- "@commitlint/resolve-extends": "^17.4.0",
- "@commitlint/types": "^17.4.0",
+ "@commitlint/resolve-extends": "^17.4.4",
+ "@commitlint/types": "^17.4.4",
+ "@types/node": "*",
"chalk": "^4.1.0",
"cosmiconfig": "^8.0.0",
"cosmiconfig-typescript-loader": "^4.0.0",
@@ -815,7 +763,7 @@
"lodash.uniq": "^4.5.0",
"resolve-from": "^5.0.0",
"ts-node": "^10.8.1",
- "typescript": "^4.6.4"
+ "typescript": "^4.6.4 || ^5.0.0"
},
"engines": {
"node": ">=v14"
@@ -831,21 +779,21 @@
}
},
"node_modules/@commitlint/message": {
- "version": "17.4.0",
- "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-17.4.0.tgz",
- "integrity": "sha512-USGJDU9PPxcgQjKXCzvPUal65KAhxWq3hp+MrU1pNCN2itWM654CLIoY2LMIQ7rScTli9B5dTLH3vXhzbItmzA==",
+ "version": "17.4.2",
+ "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-17.4.2.tgz",
+ "integrity": "sha512-3XMNbzB+3bhKA1hSAWPCQA3lNxR4zaeQAQcHj0Hx5sVdO6ryXtgUBGGv+1ZCLMgAPRixuc6en+iNAzZ4NzAa8Q==",
"dev": true,
"engines": {
"node": ">=v14"
}
},
"node_modules/@commitlint/parse": {
- "version": "17.4.0",
- "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-17.4.0.tgz",
- "integrity": "sha512-x8opKc5p+Hgs+CrMbq3VAnW2L2foPAX6arW8u9c8nTzksldGgFsENT+XVyPmpSMLlVBswZ1tndcz1xyKiY9TJA==",
+ "version": "17.6.5",
+ "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-17.6.5.tgz",
+ "integrity": "sha512-0zle3bcn1Hevw5Jqpz/FzEWNo2KIzUbc1XyGg6WrWEoa6GH3A1pbqNF6MvE6rjuy6OY23c8stWnb4ETRZyN+Yw==",
"dev": true,
"dependencies": {
- "@commitlint/types": "^17.4.0",
+ "@commitlint/types": "^17.4.4",
"conventional-changelog-angular": "^5.0.11",
"conventional-commits-parser": "^3.2.2"
},
@@ -854,15 +802,15 @@
}
},
"node_modules/@commitlint/read": {
- "version": "17.4.0",
- "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-17.4.0.tgz",
- "integrity": "sha512-pGDeZpbkyvhxK8ZoCDUacPPRpauKPWF3n2XpDBEnuGreqUF2clq2PVJpwMMaNN5cHW8iFKCbcoOjXhD01sln0A==",
+ "version": "17.5.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-17.5.1.tgz",
+ "integrity": "sha512-7IhfvEvB//p9aYW09YVclHbdf1u7g7QhxeYW9ZHSO8Huzp8Rz7m05aCO1mFG7G8M+7yfFnXB5xOmG18brqQIBg==",
"dev": true,
"dependencies": {
"@commitlint/top-level": "^17.4.0",
- "@commitlint/types": "^17.4.0",
+ "@commitlint/types": "^17.4.4",
"fs-extra": "^11.0.0",
- "git-raw-commits": "^2.0.0",
+ "git-raw-commits": "^2.0.11",
"minimist": "^1.2.6"
},
"engines": {
@@ -870,13 +818,13 @@
}
},
"node_modules/@commitlint/resolve-extends": {
- "version": "17.4.0",
- "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-17.4.0.tgz",
- "integrity": "sha512-3JsmwkrCzoK8sO22AzLBvNEvC1Pmdn/65RKXzEtQMy6oYMl0Snrq97a5bQQEFETF0VsvbtUuKttLqqgn99OXRQ==",
+ "version": "17.4.4",
+ "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-17.4.4.tgz",
+ "integrity": "sha512-znXr1S0Rr8adInptHw0JeLgumS11lWbk5xAWFVno+HUFVN45875kUtqjrI6AppmD3JI+4s0uZlqqlkepjJd99A==",
"dev": true,
"dependencies": {
- "@commitlint/config-validator": "^17.4.0",
- "@commitlint/types": "^17.4.0",
+ "@commitlint/config-validator": "^17.4.4",
+ "@commitlint/types": "^17.4.4",
"import-fresh": "^3.0.0",
"lodash.mergewith": "^4.6.2",
"resolve-from": "^5.0.0",
@@ -896,15 +844,15 @@
}
},
"node_modules/@commitlint/rules": {
- "version": "17.4.0",
- "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-17.4.0.tgz",
- "integrity": "sha512-lz3i1jet2NNjTWpAMwjjQjMZCPWBIHK1Kkja9o09UmUtMjRdALTb8uMLe8gCyeq3DiiZ5lLYOhbsoPK56xGQKA==",
+ "version": "17.6.5",
+ "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-17.6.5.tgz",
+ "integrity": "sha512-uTB3zSmnPyW2qQQH+Dbq2rekjlWRtyrjDo4aLFe63uteandgkI+cc0NhhbBAzcXShzVk0qqp8SlkQMu0mgHg/A==",
"dev": true,
"dependencies": {
- "@commitlint/ensure": "^17.4.0",
- "@commitlint/message": "^17.4.0",
+ "@commitlint/ensure": "^17.4.4",
+ "@commitlint/message": "^17.4.2",
"@commitlint/to-lines": "^17.4.0",
- "@commitlint/types": "^17.4.0",
+ "@commitlint/types": "^17.4.4",
"execa": "^5.0.0"
},
"engines": {
@@ -933,9 +881,9 @@
}
},
"node_modules/@commitlint/types": {
- "version": "17.4.0",
- "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-17.4.0.tgz",
- "integrity": "sha512-2NjAnq5IcxY9kXtUeO2Ac0aPpvkuOmwbH/BxIm36XXK5LtWFObWJWjXOA+kcaABMrthjWu6la+FUpyYFMHRvbA==",
+ "version": "17.4.4",
+ "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-17.4.4.tgz",
+ "integrity": "sha512-amRN8tRLYOsxRr6mTnGGGvB5EmW/4DDjLMgiwK3CCVEmN6Sr/6xePGEpWaspKkckILuUORCwe6VfDBw6uj4axQ==",
"dev": true,
"dependencies": {
"chalk": "^4.1.0"
@@ -1011,6 +959,46 @@
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
"dev": true
},
+ "node_modules/@gitbeaker/core": {
+ "version": "39.1.0",
+ "resolved": "https://registry.npmjs.org/@gitbeaker/core/-/core-39.1.0.tgz",
+ "integrity": "sha512-uw6QqrGavIZkOuSNFF9KsosasLzE8VbT5da5vu4eIoBws3yu8aOSUI0ieikNxQXqx/O/IN4tp065YUDh/Wm2yw==",
+ "dev": true,
+ "dependencies": {
+ "@gitbeaker/requester-utils": "^39.1.0",
+ "qs": "^6.11.1",
+ "xcase": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@gitbeaker/requester-utils": {
+ "version": "39.1.0",
+ "resolved": "https://registry.npmjs.org/@gitbeaker/requester-utils/-/requester-utils-39.1.0.tgz",
+ "integrity": "sha512-dI02ABoGQluMNQ+o6K7ar1/yUnMQ4kX2Dk6yYIFWTqZEg4ZQRrkiBL7pcthTXOvq8lvlYC5j2NKpdddhbK3Q9g==",
+ "dev": true,
+ "dependencies": {
+ "qs": "^6.11.1",
+ "xcase": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/@gitbeaker/rest": {
+ "version": "39.1.0",
+ "resolved": "https://registry.npmjs.org/@gitbeaker/rest/-/rest-39.1.0.tgz",
+ "integrity": "sha512-1sXGl+efawaDaSKZOVxU3+GT/ETdWSkze6MFj8P5ATdddc+GgR+ZvHEJFqBJs8gKQ/jsFGdtFIFnB1HYmJKBzw==",
+ "dev": true,
+ "dependencies": {
+ "@gitbeaker/core": "^39.1.0",
+ "@gitbeaker/requester-utils": "^39.1.0"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
"node_modules/@humanwhocodes/config-array": {
"version": "0.11.8",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz",
@@ -1045,19 +1033,360 @@
"dev": true
},
"node_modules/@hutson/parse-repository-url": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz",
- "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-5.0.0.tgz",
+ "integrity": "sha512-e5+YUKENATs1JgYHMzTr2MW/NDcXGfYFAuOQU8gJgF/kEh4EqKgfGrfLI67bMD4tbhZVlkigz/9YYwWcbOFthg==",
"dev": true,
+ "license": "Apache-2.0",
"engines": {
- "node": ">=6.9.0"
+ "node": ">=10.13.0"
}
},
- "node_modules/@iarna/toml": {
- "version": "2.2.5",
- "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz",
- "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==",
- "dev": true
+ "node_modules/@inquirer/checkbox": {
+ "version": "4.1.6",
+ "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.1.6.tgz",
+ "integrity": "sha512-62u896rWCtKKE43soodq5e/QcRsA22I+7/4Ov7LESWnKRO6BVo2A1DFLDmXL9e28TB0CfHc3YtkbPm7iwajqkg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/core": "^10.1.11",
+ "@inquirer/figures": "^1.0.11",
+ "@inquirer/type": "^3.0.6",
+ "ansi-escapes": "^4.3.2",
+ "yoctocolors-cjs": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/confirm": {
+ "version": "5.1.10",
+ "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.10.tgz",
+ "integrity": "sha512-FxbQ9giWxUWKUk2O5XZ6PduVnH2CZ/fmMKMBkH71MHJvWr7WL5AHKevhzF1L5uYWB2P548o1RzVxrNd3dpmk6g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/core": "^10.1.11",
+ "@inquirer/type": "^3.0.6"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/core": {
+ "version": "10.1.11",
+ "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.11.tgz",
+ "integrity": "sha512-BXwI/MCqdtAhzNQlBEFE7CEflhPkl/BqvAuV/aK6lW3DClIfYVDWPP/kXuXHtBWC7/EEbNqd/1BGq2BGBBnuxw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/figures": "^1.0.11",
+ "@inquirer/type": "^3.0.6",
+ "ansi-escapes": "^4.3.2",
+ "cli-width": "^4.1.0",
+ "mute-stream": "^2.0.0",
+ "signal-exit": "^4.1.0",
+ "wrap-ansi": "^6.2.0",
+ "yoctocolors-cjs": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/core/node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@inquirer/core/node_modules/wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@inquirer/editor": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.11.tgz",
+ "integrity": "sha512-YoZr0lBnnLFPpfPSNsQ8IZyKxU47zPyVi9NLjCWtna52//M/xuL0PGPAxHxxYhdOhnvY2oBafoM+BI5w/JK7jw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/core": "^10.1.11",
+ "@inquirer/type": "^3.0.6",
+ "external-editor": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/expand": {
+ "version": "4.0.13",
+ "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.13.tgz",
+ "integrity": "sha512-HgYNWuZLHX6q5y4hqKhwyytqAghmx35xikOGY3TcgNiElqXGPas24+UzNPOwGUZa5Dn32y25xJqVeUcGlTv+QQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/core": "^10.1.11",
+ "@inquirer/type": "^3.0.6",
+ "yoctocolors-cjs": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/figures": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.11.tgz",
+ "integrity": "sha512-eOg92lvrn/aRUqbxRyvpEWnrvRuTYRifixHkYVpJiygTgVSBIHDqLh0SrMQXkafvULg3ck11V7xvR+zcgvpHFw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@inquirer/input": {
+ "version": "4.1.10",
+ "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.10.tgz",
+ "integrity": "sha512-kV3BVne3wJ+j6reYQUZi/UN9NZGZLxgc/tfyjeK3mrx1QI7RXPxGp21IUTv+iVHcbP4ytZALF8vCHoxyNSC6qg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/core": "^10.1.11",
+ "@inquirer/type": "^3.0.6"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/number": {
+ "version": "3.0.13",
+ "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.13.tgz",
+ "integrity": "sha512-IrLezcg/GWKS8zpKDvnJ/YTflNJdG0qSFlUM/zNFsdi4UKW/CO+gaJpbMgQ20Q58vNKDJbEzC6IebdkprwL6ew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/core": "^10.1.11",
+ "@inquirer/type": "^3.0.6"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/password": {
+ "version": "4.0.13",
+ "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.13.tgz",
+ "integrity": "sha512-NN0S/SmdhakqOTJhDwOpeBEEr8VdcYsjmZHDb0rblSh2FcbXQOr+2IApP7JG4WE3sxIdKytDn4ed3XYwtHxmJQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/core": "^10.1.11",
+ "@inquirer/type": "^3.0.6",
+ "ansi-escapes": "^4.3.2"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/prompts": {
+ "version": "7.5.1",
+ "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.5.1.tgz",
+ "integrity": "sha512-5AOrZPf2/GxZ+SDRZ5WFplCA2TAQgK3OYrXCYmJL5NaTu4ECcoWFlfUZuw7Es++6Njv7iu/8vpYJhuzxUH76Vg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/checkbox": "^4.1.6",
+ "@inquirer/confirm": "^5.1.10",
+ "@inquirer/editor": "^4.2.11",
+ "@inquirer/expand": "^4.0.13",
+ "@inquirer/input": "^4.1.10",
+ "@inquirer/number": "^3.0.13",
+ "@inquirer/password": "^4.0.13",
+ "@inquirer/rawlist": "^4.1.1",
+ "@inquirer/search": "^3.0.13",
+ "@inquirer/select": "^4.2.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/rawlist": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.1.tgz",
+ "integrity": "sha512-VBUC0jPN2oaOq8+krwpo/mf3n/UryDUkKog3zi+oIi8/e5hykvdntgHUB9nhDM78RubiyR1ldIOfm5ue+2DeaQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/core": "^10.1.11",
+ "@inquirer/type": "^3.0.6",
+ "yoctocolors-cjs": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/search": {
+ "version": "3.0.13",
+ "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.13.tgz",
+ "integrity": "sha512-9g89d2c5Izok/Gw/U7KPC3f9kfe5rA1AJ24xxNZG0st+vWekSk7tB9oE+dJv5JXd0ZSijomvW0KPMoBd8qbN4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/core": "^10.1.11",
+ "@inquirer/figures": "^1.0.11",
+ "@inquirer/type": "^3.0.6",
+ "yoctocolors-cjs": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/select": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.2.1.tgz",
+ "integrity": "sha512-gt1Kd5XZm+/ddemcT3m23IP8aD8rC9drRckWoP/1f7OL46Yy2FGi8DSmNjEjQKtPl6SV96Kmjbl6p713KXJ/Jg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@inquirer/core": "^10.1.11",
+ "@inquirer/figures": "^1.0.11",
+ "@inquirer/type": "^3.0.6",
+ "ansi-escapes": "^4.3.2",
+ "yoctocolors-cjs": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@inquirer/type": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.6.tgz",
+ "integrity": "sha512-/mKVCtVpyBu3IDarv0G+59KC4stsD5mDsGpYh+GKs1NZT88Jh52+cuoA1AtLk2Q0r/quNl+1cSUyLRHBFeD0XA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
+ }
},
"node_modules/@istanbuljs/load-nyc-config": {
"version": "1.1.0",
@@ -1168,16 +1497,16 @@
}
},
"node_modules/@jest/console": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.3.1.tgz",
- "integrity": "sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.5.0.tgz",
+ "integrity": "sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==",
"dev": true,
"dependencies": {
- "@jest/types": "^29.3.1",
+ "@jest/types": "^29.5.0",
"@types/node": "*",
"chalk": "^4.0.0",
- "jest-message-util": "^29.3.1",
- "jest-util": "^29.3.1",
+ "jest-message-util": "^29.5.0",
+ "jest-util": "^29.5.0",
"slash": "^3.0.0"
},
"engines": {
@@ -1185,37 +1514,37 @@
}
},
"node_modules/@jest/core": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.3.1.tgz",
- "integrity": "sha512-0ohVjjRex985w5MmO5L3u5GR1O30DexhBSpuwx2P+9ftyqHdJXnk7IUWiP80oHMvt7ubHCJHxV0a0vlKVuZirw==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.5.0.tgz",
+ "integrity": "sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==",
"dev": true,
"dependencies": {
- "@jest/console": "^29.3.1",
- "@jest/reporters": "^29.3.1",
- "@jest/test-result": "^29.3.1",
- "@jest/transform": "^29.3.1",
- "@jest/types": "^29.3.1",
+ "@jest/console": "^29.5.0",
+ "@jest/reporters": "^29.5.0",
+ "@jest/test-result": "^29.5.0",
+ "@jest/transform": "^29.5.0",
+ "@jest/types": "^29.5.0",
"@types/node": "*",
"ansi-escapes": "^4.2.1",
"chalk": "^4.0.0",
"ci-info": "^3.2.0",
"exit": "^0.1.2",
"graceful-fs": "^4.2.9",
- "jest-changed-files": "^29.2.0",
- "jest-config": "^29.3.1",
- "jest-haste-map": "^29.3.1",
- "jest-message-util": "^29.3.1",
- "jest-regex-util": "^29.2.0",
- "jest-resolve": "^29.3.1",
- "jest-resolve-dependencies": "^29.3.1",
- "jest-runner": "^29.3.1",
- "jest-runtime": "^29.3.1",
- "jest-snapshot": "^29.3.1",
- "jest-util": "^29.3.1",
- "jest-validate": "^29.3.1",
- "jest-watcher": "^29.3.1",
+ "jest-changed-files": "^29.5.0",
+ "jest-config": "^29.5.0",
+ "jest-haste-map": "^29.5.0",
+ "jest-message-util": "^29.5.0",
+ "jest-regex-util": "^29.4.3",
+ "jest-resolve": "^29.5.0",
+ "jest-resolve-dependencies": "^29.5.0",
+ "jest-runner": "^29.5.0",
+ "jest-runtime": "^29.5.0",
+ "jest-snapshot": "^29.5.0",
+ "jest-util": "^29.5.0",
+ "jest-validate": "^29.5.0",
+ "jest-watcher": "^29.5.0",
"micromatch": "^4.0.4",
- "pretty-format": "^29.3.1",
+ "pretty-format": "^29.5.0",
"slash": "^3.0.0",
"strip-ansi": "^6.0.0"
},
@@ -1232,88 +1561,88 @@
}
},
"node_modules/@jest/environment": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.3.1.tgz",
- "integrity": "sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.5.0.tgz",
+ "integrity": "sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==",
"dev": true,
"dependencies": {
- "@jest/fake-timers": "^29.3.1",
- "@jest/types": "^29.3.1",
+ "@jest/fake-timers": "^29.5.0",
+ "@jest/types": "^29.5.0",
"@types/node": "*",
- "jest-mock": "^29.3.1"
+ "jest-mock": "^29.5.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/@jest/expect": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.3.1.tgz",
- "integrity": "sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.5.0.tgz",
+ "integrity": "sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==",
"dev": true,
"dependencies": {
- "expect": "^29.3.1",
- "jest-snapshot": "^29.3.1"
+ "expect": "^29.5.0",
+ "jest-snapshot": "^29.5.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/@jest/expect-utils": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.3.1.tgz",
- "integrity": "sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz",
+ "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==",
"dev": true,
"dependencies": {
- "jest-get-type": "^29.2.0"
+ "jest-get-type": "^29.4.3"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/@jest/fake-timers": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.3.1.tgz",
- "integrity": "sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.5.0.tgz",
+ "integrity": "sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==",
"dev": true,
"dependencies": {
- "@jest/types": "^29.3.1",
- "@sinonjs/fake-timers": "^9.1.2",
+ "@jest/types": "^29.5.0",
+ "@sinonjs/fake-timers": "^10.0.2",
"@types/node": "*",
- "jest-message-util": "^29.3.1",
- "jest-mock": "^29.3.1",
- "jest-util": "^29.3.1"
+ "jest-message-util": "^29.5.0",
+ "jest-mock": "^29.5.0",
+ "jest-util": "^29.5.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/@jest/globals": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.3.1.tgz",
- "integrity": "sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.5.0.tgz",
+ "integrity": "sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==",
"dev": true,
"dependencies": {
- "@jest/environment": "^29.3.1",
- "@jest/expect": "^29.3.1",
- "@jest/types": "^29.3.1",
- "jest-mock": "^29.3.1"
+ "@jest/environment": "^29.5.0",
+ "@jest/expect": "^29.5.0",
+ "@jest/types": "^29.5.0",
+ "jest-mock": "^29.5.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/@jest/reporters": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.3.1.tgz",
- "integrity": "sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.5.0.tgz",
+ "integrity": "sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==",
"dev": true,
"dependencies": {
"@bcoe/v8-coverage": "^0.2.3",
- "@jest/console": "^29.3.1",
- "@jest/test-result": "^29.3.1",
- "@jest/transform": "^29.3.1",
- "@jest/types": "^29.3.1",
+ "@jest/console": "^29.5.0",
+ "@jest/test-result": "^29.5.0",
+ "@jest/transform": "^29.5.0",
+ "@jest/types": "^29.5.0",
"@jridgewell/trace-mapping": "^0.3.15",
"@types/node": "*",
"chalk": "^4.0.0",
@@ -1326,9 +1655,9 @@
"istanbul-lib-report": "^3.0.0",
"istanbul-lib-source-maps": "^4.0.0",
"istanbul-reports": "^3.1.3",
- "jest-message-util": "^29.3.1",
- "jest-util": "^29.3.1",
- "jest-worker": "^29.3.1",
+ "jest-message-util": "^29.5.0",
+ "jest-util": "^29.5.0",
+ "jest-worker": "^29.5.0",
"slash": "^3.0.0",
"string-length": "^4.0.1",
"strip-ansi": "^6.0.0",
@@ -1347,21 +1676,21 @@
}
},
"node_modules/@jest/schemas": {
- "version": "29.0.0",
- "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz",
- "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==",
+ "version": "29.4.3",
+ "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz",
+ "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==",
"dev": true,
"dependencies": {
- "@sinclair/typebox": "^0.24.1"
+ "@sinclair/typebox": "^0.25.16"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/@jest/source-map": {
- "version": "29.2.0",
- "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.2.0.tgz",
- "integrity": "sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==",
+ "version": "29.4.3",
+ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.4.3.tgz",
+ "integrity": "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==",
"dev": true,
"dependencies": {
"@jridgewell/trace-mapping": "^0.3.15",
@@ -1373,13 +1702,13 @@
}
},
"node_modules/@jest/test-result": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.3.1.tgz",
- "integrity": "sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.5.0.tgz",
+ "integrity": "sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==",
"dev": true,
"dependencies": {
- "@jest/console": "^29.3.1",
- "@jest/types": "^29.3.1",
+ "@jest/console": "^29.5.0",
+ "@jest/types": "^29.5.0",
"@types/istanbul-lib-coverage": "^2.0.0",
"collect-v8-coverage": "^1.0.0"
},
@@ -1388,14 +1717,14 @@
}
},
"node_modules/@jest/test-sequencer": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.3.1.tgz",
- "integrity": "sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz",
+ "integrity": "sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==",
"dev": true,
"dependencies": {
- "@jest/test-result": "^29.3.1",
+ "@jest/test-result": "^29.5.0",
"graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.3.1",
+ "jest-haste-map": "^29.5.0",
"slash": "^3.0.0"
},
"engines": {
@@ -1403,38 +1732,38 @@
}
},
"node_modules/@jest/transform": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.3.1.tgz",
- "integrity": "sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.5.0.tgz",
+ "integrity": "sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==",
"dev": true,
"dependencies": {
"@babel/core": "^7.11.6",
- "@jest/types": "^29.3.1",
+ "@jest/types": "^29.5.0",
"@jridgewell/trace-mapping": "^0.3.15",
"babel-plugin-istanbul": "^6.1.1",
"chalk": "^4.0.0",
"convert-source-map": "^2.0.0",
"fast-json-stable-stringify": "^2.1.0",
"graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.3.1",
- "jest-regex-util": "^29.2.0",
- "jest-util": "^29.3.1",
+ "jest-haste-map": "^29.5.0",
+ "jest-regex-util": "^29.4.3",
+ "jest-util": "^29.5.0",
"micromatch": "^4.0.4",
"pirates": "^4.0.4",
"slash": "^3.0.0",
- "write-file-atomic": "^4.0.1"
+ "write-file-atomic": "^4.0.2"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/@jest/types": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz",
- "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz",
+ "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==",
"dev": true,
"dependencies": {
- "@jest/schemas": "^29.0.0",
+ "@jest/schemas": "^29.4.3",
"@types/istanbul-lib-coverage": "^2.0.0",
"@types/istanbul-reports": "^3.0.0",
"@types/node": "*",
@@ -1446,13 +1775,14 @@
}
},
"node_modules/@jridgewell/gen-mapping": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz",
- "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==",
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
+ "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
"dev": true,
"dependencies": {
- "@jridgewell/set-array": "^1.0.0",
- "@jridgewell/sourcemap-codec": "^1.4.10"
+ "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
},
"engines": {
"node": ">=6.0.0"
@@ -1483,9 +1813,9 @@
"dev": true
},
"node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.17",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz",
- "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==",
+ "version": "0.3.18",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz",
+ "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==",
"dev": true,
"dependencies": {
"@jridgewell/resolve-uri": "3.1.0",
@@ -1493,9 +1823,9 @@
}
},
"node_modules/@kie/mock-github": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/@kie/mock-github/-/mock-github-0.1.2.tgz",
- "integrity": "sha512-WgJr0LmDye+YVZLmsRFVHlluLGVbRMosa1VKW7Nv1PvytcqHy1pdj8ljRN74uVHl7AcV0JDP/4Qb+wRwC4n18Q==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@kie/mock-github/-/mock-github-1.1.0.tgz",
+ "integrity": "sha512-fD+utlOiyZSOutOcXL0G9jfjbtvOO44PLUyTfgfkrm1+575R/dbvU6AcJfjc1DtHeRv7FC7f4ebyU+a1wgL6CA==",
"dev": true,
"dependencies": {
"@octokit/openapi-types-ghec": "^14.0.0",
@@ -1570,64 +1900,99 @@
"node": ">= 8"
}
},
- "node_modules/@octokit/auth-token": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.2.tgz",
- "integrity": "sha512-pq7CwIMV1kmzkFTimdwjAINCXKTajZErLB4wMLYapR2nuB/Jpr66+05wOTZMSCBXP6n4DdDWT2W19Bm17vU69Q==",
+ "node_modules/@nodeutils/defaults-deep": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@nodeutils/defaults-deep/-/defaults-deep-1.1.0.tgz",
+ "integrity": "sha512-gG44cwQovaOFdSR02jR9IhVRpnDP64VN6JdjYJTfNz4J4fWn7TQnmrf22nSjRqlwlxPcW8PL/L3KbJg3tdwvpg==",
+ "dev": true,
+ "license": "ISC",
"dependencies": {
- "@octokit/types": "^8.0.0"
- },
+ "lodash": "^4.15.0"
+ }
+ },
+ "node_modules/@octokit/auth-token": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.2.tgz",
+ "integrity": "sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw==",
+ "license": "MIT",
"engines": {
- "node": ">= 14"
+ "node": ">= 18"
}
},
"node_modules/@octokit/core": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.1.0.tgz",
- "integrity": "sha512-Czz/59VefU+kKDy+ZfDwtOIYIkFjExOKf+HA92aiTZJ6EfWpFzYQWw0l54ji8bVmyhc+mGaLUbSUmXazG7z5OQ==",
+ "version": "6.1.5",
+ "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.5.tgz",
+ "integrity": "sha512-vvmsN0r7rguA+FySiCsbaTTobSftpIDIpPW81trAmsv9TGxg3YCujAxRYp/Uy8xmDgYCzzgulG62H7KYUFmeIg==",
+ "license": "MIT",
"dependencies": {
- "@octokit/auth-token": "^3.0.0",
- "@octokit/graphql": "^5.0.0",
- "@octokit/request": "^6.0.0",
- "@octokit/request-error": "^3.0.0",
- "@octokit/types": "^8.0.0",
- "before-after-hook": "^2.2.0",
- "universal-user-agent": "^6.0.0"
+ "@octokit/auth-token": "^5.0.0",
+ "@octokit/graphql": "^8.2.2",
+ "@octokit/request": "^9.2.3",
+ "@octokit/request-error": "^6.1.8",
+ "@octokit/types": "^14.0.0",
+ "before-after-hook": "^3.0.2",
+ "universal-user-agent": "^7.0.0"
},
"engines": {
- "node": ">= 14"
+ "node": ">= 18"
}
},
+ "node_modules/@octokit/core/node_modules/before-after-hook": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz",
+ "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==",
+ "license": "Apache-2.0"
+ },
+ "node_modules/@octokit/core/node_modules/universal-user-agent": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.2.tgz",
+ "integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==",
+ "license": "ISC"
+ },
"node_modules/@octokit/endpoint": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.3.tgz",
- "integrity": "sha512-57gRlb28bwTsdNXq+O3JTQ7ERmBTuik9+LelgcLIVfYwf235VHbN9QNo4kXExtp/h8T423cR5iJThKtFYxC7Lw==",
+ "version": "10.1.4",
+ "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.4.tgz",
+ "integrity": "sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==",
+ "license": "MIT",
"dependencies": {
- "@octokit/types": "^8.0.0",
- "is-plain-object": "^5.0.0",
- "universal-user-agent": "^6.0.0"
+ "@octokit/types": "^14.0.0",
+ "universal-user-agent": "^7.0.2"
},
"engines": {
- "node": ">= 14"
+ "node": ">= 18"
}
},
+ "node_modules/@octokit/endpoint/node_modules/universal-user-agent": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.2.tgz",
+ "integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==",
+ "license": "ISC"
+ },
"node_modules/@octokit/graphql": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.4.tgz",
- "integrity": "sha512-amO1M5QUQgYQo09aStR/XO7KAl13xpigcy/kI8/N1PnZYSS69fgte+xA4+c2DISKqUZfsh0wwjc2FaCt99L41A==",
+ "version": "8.2.2",
+ "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.2.2.tgz",
+ "integrity": "sha512-Yi8hcoqsrXGdt0yObxbebHXFOiUA+2v3n53epuOg1QUgOB6c4XzvisBNVXJSl8RYA5KrDuSL2yq9Qmqe5N0ryA==",
+ "license": "MIT",
"dependencies": {
- "@octokit/request": "^6.0.0",
- "@octokit/types": "^8.0.0",
- "universal-user-agent": "^6.0.0"
+ "@octokit/request": "^9.2.3",
+ "@octokit/types": "^14.0.0",
+ "universal-user-agent": "^7.0.0"
},
"engines": {
- "node": ">= 14"
+ "node": ">= 18"
}
},
+ "node_modules/@octokit/graphql/node_modules/universal-user-agent": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.2.tgz",
+ "integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==",
+ "license": "ISC"
+ },
"node_modules/@octokit/openapi-types": {
- "version": "14.0.0",
- "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-14.0.0.tgz",
- "integrity": "sha512-HNWisMYlR8VCnNurDU6os2ikx0s0VyEjDYHNS/h4cgb8DeOxQ0n72HyinUtdDVxJhFy3FWLGl0DJhfEWk3P5Iw=="
+ "version": "25.0.0",
+ "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.0.0.tgz",
+ "integrity": "sha512-FZvktFu7HfOIJf2BScLKIEYjDsw6RKc7rBJCdvCTfKsVnx2GEB/Nbzjr29DUdb7vQhlzS/j8qDzdditP0OC6aw==",
+ "license": "MIT"
},
"node_modules/@octokit/openapi-types-ghec": {
"version": "14.0.0",
@@ -1636,17 +2001,27 @@
"dev": true
},
"node_modules/@octokit/plugin-paginate-rest": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-5.0.1.tgz",
- "integrity": "sha512-7A+rEkS70pH36Z6JivSlR7Zqepz3KVucEFVDnSrgHXzG7WLAzYwcHZbKdfTXHwuTHbkT1vKvz7dHl1+HNf6Qyw==",
+ "version": "2.21.3",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz",
+ "integrity": "sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==",
"dependencies": {
- "@octokit/types": "^8.0.0"
- },
- "engines": {
- "node": ">= 14"
+ "@octokit/types": "^6.40.0"
},
"peerDependencies": {
- "@octokit/core": ">=4"
+ "@octokit/core": ">=2"
+ }
+ },
+ "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/openapi-types": {
+ "version": "12.11.0",
+ "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz",
+ "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ=="
+ },
+ "node_modules/@octokit/plugin-paginate-rest/node_modules/@octokit/types": {
+ "version": "6.41.0",
+ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz",
+ "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==",
+ "dependencies": {
+ "@octokit/openapi-types": "^12.11.0"
}
},
"node_modules/@octokit/plugin-request-log": {
@@ -1658,175 +2033,232 @@
}
},
"node_modules/@octokit/plugin-rest-endpoint-methods": {
- "version": "6.7.0",
- "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-6.7.0.tgz",
- "integrity": "sha512-orxQ0fAHA7IpYhG2flD2AygztPlGYNAdlzYz8yrD8NDgelPfOYoRPROfEyIe035PlxvbYrgkfUZIhSBKju/Cvw==",
+ "version": "5.16.2",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz",
+ "integrity": "sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==",
"dependencies": {
- "@octokit/types": "^8.0.0",
+ "@octokit/types": "^6.39.0",
"deprecation": "^2.3.1"
},
- "engines": {
- "node": ">= 14"
- },
"peerDependencies": {
"@octokit/core": ">=3"
}
},
- "node_modules/@octokit/request": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.2.tgz",
- "integrity": "sha512-6VDqgj0HMc2FUX2awIs+sM6OwLgwHvAi4KCK3mT2H2IKRt6oH9d0fej5LluF5mck1lRR/rFWN0YIDSYXYSylbw==",
+ "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/openapi-types": {
+ "version": "12.11.0",
+ "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz",
+ "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ=="
+ },
+ "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": {
+ "version": "6.41.0",
+ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz",
+ "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==",
"dependencies": {
- "@octokit/endpoint": "^7.0.0",
- "@octokit/request-error": "^3.0.0",
- "@octokit/types": "^8.0.0",
- "is-plain-object": "^5.0.0",
- "node-fetch": "^2.6.7",
- "universal-user-agent": "^6.0.0"
+ "@octokit/openapi-types": "^12.11.0"
+ }
+ },
+ "node_modules/@octokit/request": {
+ "version": "9.2.3",
+ "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.2.3.tgz",
+ "integrity": "sha512-Ma+pZU8PXLOEYzsWf0cn/gY+ME57Wq8f49WTXA8FMHp2Ps9djKw//xYJ1je8Hm0pR2lU9FUGeJRWOtxq6olt4w==",
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/endpoint": "^10.1.4",
+ "@octokit/request-error": "^6.1.8",
+ "@octokit/types": "^14.0.0",
+ "fast-content-type-parse": "^2.0.0",
+ "universal-user-agent": "^7.0.2"
},
"engines": {
- "node": ">= 14"
+ "node": ">= 18"
}
},
"node_modules/@octokit/request-error": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.2.tgz",
- "integrity": "sha512-WMNOFYrSaX8zXWoJg9u/pKgWPo94JXilMLb2VManNOby9EZxrQaBe/QSC4a1TzpAlpxofg2X/jMnCyZgL6y7eg==",
+ "version": "6.1.8",
+ "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.8.tgz",
+ "integrity": "sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ==",
+ "license": "MIT",
"dependencies": {
- "@octokit/types": "^8.0.0",
- "deprecation": "^2.0.0",
- "once": "^1.4.0"
+ "@octokit/types": "^14.0.0"
},
"engines": {
- "node": ">= 14"
+ "node": ">= 18"
}
},
+ "node_modules/@octokit/request/node_modules/universal-user-agent": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.2.tgz",
+ "integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==",
+ "license": "ISC"
+ },
"node_modules/@octokit/rest": {
- "version": "19.0.5",
- "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.5.tgz",
- "integrity": "sha512-+4qdrUFq2lk7Va+Qff3ofREQWGBeoTKNqlJO+FGjFP35ZahP+nBenhZiGdu8USSgmq4Ky3IJ/i4u0xbLqHaeow==",
+ "version": "18.12.0",
+ "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.12.0.tgz",
+ "integrity": "sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==",
"dependencies": {
- "@octokit/core": "^4.1.0",
- "@octokit/plugin-paginate-rest": "^5.0.0",
+ "@octokit/core": "^3.5.1",
+ "@octokit/plugin-paginate-rest": "^2.16.8",
"@octokit/plugin-request-log": "^1.0.4",
- "@octokit/plugin-rest-endpoint-methods": "^6.7.0"
- },
- "engines": {
- "node": ">= 14"
+ "@octokit/plugin-rest-endpoint-methods": "^5.12.0"
+ }
+ },
+ "node_modules/@octokit/rest/node_modules/@octokit/auth-token": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz",
+ "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==",
+ "dependencies": {
+ "@octokit/types": "^6.0.3"
+ }
+ },
+ "node_modules/@octokit/rest/node_modules/@octokit/core": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz",
+ "integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==",
+ "dependencies": {
+ "@octokit/auth-token": "^2.4.4",
+ "@octokit/graphql": "^4.5.8",
+ "@octokit/request": "^5.6.3",
+ "@octokit/request-error": "^2.0.5",
+ "@octokit/types": "^6.0.3",
+ "before-after-hook": "^2.2.0",
+ "universal-user-agent": "^6.0.0"
+ }
+ },
+ "node_modules/@octokit/rest/node_modules/@octokit/endpoint": {
+ "version": "6.0.12",
+ "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz",
+ "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==",
+ "dependencies": {
+ "@octokit/types": "^6.0.3",
+ "is-plain-object": "^5.0.0",
+ "universal-user-agent": "^6.0.0"
+ }
+ },
+ "node_modules/@octokit/rest/node_modules/@octokit/graphql": {
+ "version": "4.8.0",
+ "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz",
+ "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==",
+ "dependencies": {
+ "@octokit/request": "^5.6.0",
+ "@octokit/types": "^6.0.3",
+ "universal-user-agent": "^6.0.0"
+ }
+ },
+ "node_modules/@octokit/rest/node_modules/@octokit/openapi-types": {
+ "version": "12.11.0",
+ "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz",
+ "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ=="
+ },
+ "node_modules/@octokit/rest/node_modules/@octokit/request": {
+ "version": "5.6.3",
+ "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz",
+ "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==",
+ "dependencies": {
+ "@octokit/endpoint": "^6.0.1",
+ "@octokit/request-error": "^2.1.0",
+ "@octokit/types": "^6.16.1",
+ "is-plain-object": "^5.0.0",
+ "node-fetch": "^2.6.7",
+ "universal-user-agent": "^6.0.0"
+ }
+ },
+ "node_modules/@octokit/rest/node_modules/@octokit/request-error": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz",
+ "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==",
+ "dependencies": {
+ "@octokit/types": "^6.0.3",
+ "deprecation": "^2.0.0",
+ "once": "^1.4.0"
+ }
+ },
+ "node_modules/@octokit/rest/node_modules/@octokit/types": {
+ "version": "6.41.0",
+ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz",
+ "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==",
+ "dependencies": {
+ "@octokit/openapi-types": "^12.11.0"
}
},
"node_modules/@octokit/types": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@octokit/types/-/types-8.0.0.tgz",
- "integrity": "sha512-65/TPpOJP1i3K4lBJMnWqPUJ6zuOtzhtagDvydAWbEXpbFYA0oMKKyLb95NFZZP0lSh/4b6K+DQlzvYQJQQePg==",
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.0.0.tgz",
+ "integrity": "sha512-VVmZP0lEhbo2O1pdq63gZFiGCKkm8PPp8AUOijlwPO6hojEVjspA0MWKP7E4hbvGxzFKNqKr6p0IYtOH/Wf/zA==",
+ "license": "MIT",
"dependencies": {
- "@octokit/openapi-types": "^14.0.0"
+ "@octokit/openapi-types": "^25.0.0"
}
},
"node_modules/@octokit/webhooks-types": {
"version": "6.8.0",
"resolved": "https://registry.npmjs.org/@octokit/webhooks-types/-/webhooks-types-6.8.0.tgz",
- "integrity": "sha512-Yq46asTPdEyrroCSBLRvcwNBsztiDHHvJ3+//2PhVbLSKp6kkj7NkjA3fyrpCrdlANj8REZSfus60v96EmlxCA=="
+ "integrity": "sha512-Yq46asTPdEyrroCSBLRvcwNBsztiDHHvJ3+//2PhVbLSKp6kkj7NkjA3fyrpCrdlANj8REZSfus60v96EmlxCA==",
+ "dev": true
},
- "node_modules/@pnpm/network.ca-file": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz",
- "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==",
+ "node_modules/@phun-ky/typeof": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@phun-ky/typeof/-/typeof-1.2.8.tgz",
+ "integrity": "sha512-7J6ca1tK0duM2BgVB+CuFMh3idlIVASOP2QvOCbNWDc6JnvjtKa9nufPoJQQ4xrwBonwgT1TIhRRcEtzdVgWsA==",
"dev": true,
- "dependencies": {
- "graceful-fs": "4.2.10"
- },
+ "license": "MIT",
"engines": {
- "node": ">=12.22.0"
- }
- },
- "node_modules/@pnpm/npm-conf": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-1.0.5.tgz",
- "integrity": "sha512-hD8ml183638O3R6/Txrh0L8VzGOrFXgRtRDG4qQC4tONdZ5Z1M+tlUUDUvrjYdmK6G+JTBTeaCLMna11cXzi8A==",
- "dev": true,
- "dependencies": {
- "@pnpm/network.ca-file": "^1.0.1",
- "config-chain": "^1.1.11"
+ "node": "^20.9.0 || >=22.0.0",
+ "npm": ">=10.8.2"
},
- "engines": {
- "node": ">=12"
+ "funding": {
+ "url": "https://github.com/phun-ky/typeof?sponsor=1"
}
},
"node_modules/@release-it/conventional-changelog": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/@release-it/conventional-changelog/-/conventional-changelog-5.1.1.tgz",
- "integrity": "sha512-QtbDBe36dQfzexAfDYrbLPvd5Cb5bMWmLcjcGhCOWBss7fe1/gCjoxDULVz+7N7G5Nu2UMeBwHcUp/w8RDh5VQ==",
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/@release-it/conventional-changelog/-/conventional-changelog-10.0.1.tgz",
+ "integrity": "sha512-Qp+eyMGCPyq5xiWoNK91cWVIR/6HD1QAUNeG6pV2G4kxotWl81k/KDQqDNvrNVmr9+zDp53jI7pVVYQp6mi4zA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"concat-stream": "^2.0.0",
- "conventional-changelog": "^3.1.25",
- "conventional-recommended-bump": "^6.1.0",
- "semver": "7.3.8"
+ "conventional-changelog": "^6.0.0",
+ "conventional-recommended-bump": "^10.0.0",
+ "git-semver-tags": "^8.0.0",
+ "semver": "^7.6.3"
},
"engines": {
- "node": ">=14"
+ "node": "^20.9.0 || >=22.0.0"
},
"peerDependencies": {
- "release-it": "^15.4.1"
+ "release-it": "^18.0.0 || ^19.0.0"
}
},
"node_modules/@sinclair/typebox": {
- "version": "0.24.51",
- "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz",
- "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==",
+ "version": "0.25.24",
+ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz",
+ "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==",
"dev": true
},
- "node_modules/@sindresorhus/is": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz",
- "integrity": "sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==",
- "dev": true,
- "engines": {
- "node": ">=14.16"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/is?sponsor=1"
- }
- },
"node_modules/@sinonjs/commons": {
- "version": "1.8.6",
- "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz",
- "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz",
+ "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==",
"dev": true,
"dependencies": {
"type-detect": "4.0.8"
}
},
"node_modules/@sinonjs/fake-timers": {
- "version": "9.1.2",
- "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz",
- "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==",
+ "version": "10.3.0",
+ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz",
+ "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==",
"dev": true,
"dependencies": {
- "@sinonjs/commons": "^1.7.0"
+ "@sinonjs/commons": "^3.0.0"
}
},
- "node_modules/@szmarczak/http-timer": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz",
- "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==",
+ "node_modules/@tootallnate/quickjs-emscripten": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz",
+ "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==",
"dev": true,
- "dependencies": {
- "defer-to-connect": "^2.0.1"
- },
- "engines": {
- "node": ">=14.16"
- }
- },
- "node_modules/@tootallnate/once": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
- "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
- "dev": true,
- "engines": {
- "node": ">= 6"
- }
+ "license": "MIT"
},
"node_modules/@tsconfig/node10": {
"version": "1.0.9",
@@ -1853,13 +2285,13 @@
"dev": true
},
"node_modules/@types/babel__core": {
- "version": "7.1.20",
- "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz",
- "integrity": "sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==",
+ "version": "7.20.1",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz",
+ "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==",
"dev": true,
"dependencies": {
- "@babel/parser": "^7.1.0",
- "@babel/types": "^7.0.0",
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7",
"@types/babel__generator": "*",
"@types/babel__template": "*",
"@types/babel__traverse": "*"
@@ -1885,12 +2317,12 @@
}
},
"node_modules/@types/babel__traverse": {
- "version": "7.18.3",
- "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz",
- "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==",
+ "version": "7.20.1",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz",
+ "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==",
"dev": true,
"dependencies": {
- "@babel/types": "^7.3.0"
+ "@babel/types": "^7.20.7"
}
},
"node_modules/@types/fs-extra": {
@@ -1903,9 +2335,9 @@
}
},
"node_modules/@types/graceful-fs": {
- "version": "4.1.5",
- "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz",
- "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==",
+ "version": "4.1.6",
+ "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz",
+ "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==",
"dev": true,
"dependencies": {
"@types/node": "*"
@@ -1964,22 +2396,31 @@
"dev": true
},
"node_modules/@types/normalize-package-data": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz",
- "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==",
- "dev": true
+ "version": "2.4.4",
+ "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz",
+ "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/parse-path": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/@types/parse-path/-/parse-path-7.0.3.tgz",
+ "integrity": "sha512-LriObC2+KYZD3FzCrgWGv/qufdUy4eXrxcLgQMfYXgPbLIecKIsVBaQgUPmxSSLcjmYbDTQbMgr6qr6l/eb7Bg==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@types/prettier": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz",
- "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==",
+ "version": "2.7.3",
+ "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz",
+ "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==",
"dev": true
},
"node_modules/@types/semver": {
- "version": "7.3.13",
- "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz",
- "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==",
- "dev": true
+ "version": "7.7.0",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.0.tgz",
+ "integrity": "sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@types/stack-utils": {
"version": "2.0.1",
@@ -2245,18 +2686,17 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz",
"integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/agent-base": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
- "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz",
+ "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==",
"dev": true,
- "dependencies": {
- "debug": "4"
- },
+ "license": "MIT",
"engines": {
- "node": ">= 6.0.0"
+ "node": ">= 14"
}
},
"node_modules/ajv": {
@@ -2275,15 +2715,6 @@
"url": "https://github.com/sponsors/epoberezkin"
}
},
- "node_modules/ansi-align": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz",
- "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==",
- "dev": true,
- "dependencies": {
- "string-width": "^4.1.0"
- }
- },
"node_modules/ansi-escapes": {
"version": "4.3.2",
"resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
@@ -2381,25 +2812,6 @@
"node": ">=8"
}
},
- "node_modules/array.prototype.map": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.5.tgz",
- "integrity": "sha512-gfaKntvwqYIuC7mLLyv2wzZIJqrRhn5PZ9EfFejSx6a78sV7iDsGpG9P+3oUPtm1Rerqm6nrKS4FYuTIvWfo3g==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4",
- "es-array-method-boxes-properly": "^1.0.0",
- "is-string": "^1.0.7"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/arrify": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
@@ -2414,6 +2826,7 @@
"resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz",
"integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"tslib": "^2.0.1"
},
@@ -2422,42 +2835,47 @@
}
},
"node_modules/ast-types/node_modules/tslib": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz",
- "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==",
- "dev": true
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "dev": true,
+ "license": "0BSD"
},
"node_modules/async-retry": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz",
"integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"retry": "0.13.1"
}
},
- "node_modules/available-typed-arrays": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
- "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ },
+ "node_modules/axios": {
+ "version": "1.8.4",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz",
+ "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==",
+ "dependencies": {
+ "follow-redirects": "^1.15.6",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
}
},
"node_modules/babel-jest": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.3.1.tgz",
- "integrity": "sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz",
+ "integrity": "sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==",
"dev": true,
"dependencies": {
- "@jest/transform": "^29.3.1",
+ "@jest/transform": "^29.5.0",
"@types/babel__core": "^7.1.14",
"babel-plugin-istanbul": "^6.1.1",
- "babel-preset-jest": "^29.2.0",
+ "babel-preset-jest": "^29.5.0",
"chalk": "^4.0.0",
"graceful-fs": "^4.2.9",
"slash": "^3.0.0"
@@ -2486,9 +2904,9 @@
}
},
"node_modules/babel-plugin-jest-hoist": {
- "version": "29.2.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz",
- "integrity": "sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz",
+ "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==",
"dev": true,
"dependencies": {
"@babel/template": "^7.3.3",
@@ -2524,12 +2942,12 @@
}
},
"node_modules/babel-preset-jest": {
- "version": "29.2.0",
- "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz",
- "integrity": "sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz",
+ "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==",
"dev": true,
"dependencies": {
- "babel-plugin-jest-hoist": "^29.2.0",
+ "babel-plugin-jest-hoist": "^29.5.0",
"babel-preset-current-node-syntax": "^1.0.0"
},
"engines": {
@@ -2545,25 +2963,15 @@
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"dev": true
},
- "node_modules/base64-js": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
- "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "node_modules/basic-ftp": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz",
+ "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==",
"dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
+ "license": "MIT",
+ "engines": {
+ "node": ">=10.0.0"
+ }
},
"node_modules/before-after-hook": {
"version": "2.2.3",
@@ -2579,33 +2987,22 @@
"node": ">=8"
}
},
- "node_modules/bl": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz",
- "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==",
- "dev": true,
- "dependencies": {
- "buffer": "^6.0.3",
- "inherits": "^2.0.4",
- "readable-stream": "^3.4.0"
- }
- },
"node_modules/body-parser": {
- "version": "1.20.1",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
- "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
+ "version": "1.20.3",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
+ "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
"dev": true,
"dependencies": {
"bytes": "3.1.2",
- "content-type": "~1.0.4",
+ "content-type": "~1.0.5",
"debug": "2.6.9",
"depd": "2.0.0",
"destroy": "1.2.0",
"http-errors": "2.0.0",
"iconv-lite": "0.4.24",
"on-finished": "2.4.1",
- "qs": "6.11.0",
- "raw-body": "2.5.1",
+ "qs": "6.13.0",
+ "raw-body": "2.5.2",
"type-is": "~1.6.18",
"unpipe": "1.0.0"
},
@@ -2629,143 +3026,6 @@
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"dev": true
},
- "node_modules/boxen": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.1.tgz",
- "integrity": "sha512-8k2eH6SRAK00NDl1iX5q17RJ8rfl53TajdYxE3ssMLehbg487dEVgsad4pIsZb/QqBgYWIl6JOauMTLGX2Kpkw==",
- "dev": true,
- "dependencies": {
- "ansi-align": "^3.0.1",
- "camelcase": "^7.0.0",
- "chalk": "^5.0.1",
- "cli-boxes": "^3.0.0",
- "string-width": "^5.1.2",
- "type-fest": "^2.13.0",
- "widest-line": "^4.0.1",
- "wrap-ansi": "^8.0.1"
- },
- "engines": {
- "node": ">=14.16"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/boxen/node_modules/ansi-regex": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
- "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
- "dev": true,
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-regex?sponsor=1"
- }
- },
- "node_modules/boxen/node_modules/ansi-styles": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
- "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
- "dev": true,
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/boxen/node_modules/camelcase": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz",
- "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==",
- "dev": true,
- "engines": {
- "node": ">=14.16"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/boxen/node_modules/chalk": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz",
- "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==",
- "dev": true,
- "engines": {
- "node": "^12.17.0 || ^14.13 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/boxen/node_modules/emoji-regex": {
- "version": "9.2.2",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
- "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
- "dev": true
- },
- "node_modules/boxen/node_modules/string-width": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
- "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
- "dev": true,
- "dependencies": {
- "eastasianwidth": "^0.2.0",
- "emoji-regex": "^9.2.2",
- "strip-ansi": "^7.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/boxen/node_modules/strip-ansi": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz",
- "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==",
- "dev": true,
- "dependencies": {
- "ansi-regex": "^6.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/strip-ansi?sponsor=1"
- }
- },
- "node_modules/boxen/node_modules/type-fest": {
- "version": "2.19.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
- "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==",
- "dev": true,
- "engines": {
- "node": ">=12.20"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/boxen/node_modules/wrap-ansi": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.0.1.tgz",
- "integrity": "sha512-QFF+ufAqhoYHvoHdajT/Po7KoXVBPXS2bgjIam5isfWJPfIOnQZ50JtUiVvCv/sjgacf3yRrt2ZKUZ/V4itN4g==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^6.1.0",
- "string-width": "^5.0.1",
- "strip-ansi": "^7.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
- }
- },
"node_modules/brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@@ -2777,21 +3037,21 @@
}
},
"node_modules/braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
"dev": true,
"dependencies": {
- "fill-range": "^7.0.1"
+ "fill-range": "^7.1.1"
},
"engines": {
"node": ">=8"
}
},
"node_modules/browserslist": {
- "version": "4.21.4",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz",
- "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==",
+ "version": "4.21.9",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz",
+ "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==",
"dev": true,
"funding": [
{
@@ -2801,13 +3061,17 @@
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
}
],
"dependencies": {
- "caniuse-lite": "^1.0.30001400",
- "electron-to-chromium": "^1.4.251",
- "node-releases": "^2.0.6",
- "update-browserslist-db": "^1.0.9"
+ "caniuse-lite": "^1.0.30001503",
+ "electron-to-chromium": "^1.4.431",
+ "node-releases": "^2.0.12",
+ "update-browserslist-db": "^1.0.11"
},
"bin": {
"browserslist": "cli.js"
@@ -2837,36 +3101,28 @@
"node-int64": "^0.4.0"
}
},
- "node_modules/buffer": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
- "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "dependencies": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.2.1"
- }
- },
"node_modules/buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
"dev": true
},
+ "node_modules/bundle-name": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz",
+ "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "run-applescript": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/bytes": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
@@ -2876,40 +3132,89 @@
"node": ">= 0.8"
}
},
- "node_modules/cacheable-lookup": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz",
- "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==",
+ "node_modules/c12": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/c12/-/c12-3.0.3.tgz",
+ "integrity": "sha512-uC3MacKBb0Z15o5QWCHvHWj5Zv34pGQj9P+iXKSpTuSGFS0KKhUWf4t9AJ+gWjYOdmWCPEGpEzm8sS0iqbpo1w==",
"dev": true,
- "engines": {
- "node": ">=14.16"
+ "license": "MIT",
+ "dependencies": {
+ "chokidar": "^4.0.3",
+ "confbox": "^0.2.2",
+ "defu": "^6.1.4",
+ "dotenv": "^16.4.7",
+ "exsolve": "^1.0.4",
+ "giget": "^2.0.0",
+ "jiti": "^2.4.2",
+ "ohash": "^2.0.11",
+ "pathe": "^2.0.3",
+ "perfect-debounce": "^1.0.0",
+ "pkg-types": "^2.1.0",
+ "rc9": "^2.1.2"
+ },
+ "peerDependencies": {
+ "magicast": "^0.3.5"
+ },
+ "peerDependenciesMeta": {
+ "magicast": {
+ "optional": true
+ }
}
},
- "node_modules/cacheable-request": {
- "version": "10.2.4",
- "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.4.tgz",
- "integrity": "sha512-IWIea8ei1Ht4dBqvlvh7Gs7EYlMyBhlJybLDUB9sadEqHqftmdNieMLIR5ia3vs8gbjj9t8hXLBpUVg3vcQNbg==",
+ "node_modules/c12/node_modules/chokidar": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
+ "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "get-stream": "^6.0.1",
- "http-cache-semantics": "^4.1.0",
- "keyv": "^4.5.2",
- "mimic-response": "^4.0.0",
- "normalize-url": "^8.0.0",
- "responselike": "^3.0.0"
+ "readdirp": "^4.0.1"
},
"engines": {
- "node": ">=14.16"
+ "node": ">= 14.16.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
}
},
- "node_modules/call-bind": {
+ "node_modules/c12/node_modules/readdirp": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
+ "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14.18.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
- "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
"dev": true,
"dependencies": {
- "function-bind": "^1.1.1",
- "get-intrinsic": "^1.0.2"
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -2951,9 +3256,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001436",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001436.tgz",
- "integrity": "sha512-ZmWkKsnC2ifEPoWUvSAIGyOYwT+keAaaWPHiQ9DfMqS1t6tfuyFYoWR78TeZtznkEQ64+vGXH9cZrElwR2Mrxg==",
+ "version": "1.0.30001509",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001509.tgz",
+ "integrity": "sha512-2uDDk+TRiTX5hMcUYT/7CSyzMZxjfGu0vAUjS2g0LSD8UoXOv0LtpH4LxGMemsiPq6LCVIUjNwVM0erkOkGCDA==",
"dev": true,
"funding": [
{
@@ -2963,6 +3268,10 @@
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
}
]
},
@@ -2995,7 +3304,8 @@
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
"integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/chokidar": {
"version": "3.5.3",
@@ -3045,44 +3355,44 @@
"node": ">=8"
}
},
- "node_modules/cjs-module-lexer": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz",
- "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==",
- "dev": true
- },
- "node_modules/cli-boxes": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz",
- "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==",
+ "node_modules/citty": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz",
+ "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==",
"dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "license": "MIT",
+ "dependencies": {
+ "consola": "^3.2.3"
}
},
+ "node_modules/cjs-module-lexer": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz",
+ "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==",
+ "dev": true
+ },
"node_modules/cli-cursor": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz",
- "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz",
+ "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "restore-cursor": "^4.0.0"
+ "restore-cursor": "^5.0.0"
},
"engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ "node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/cli-spinners": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz",
- "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==",
+ "version": "2.9.2",
+ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz",
+ "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=6"
},
@@ -3091,10 +3401,11 @@
}
},
"node_modules/cli-width": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.0.0.tgz",
- "integrity": "sha512-ZksGS2xpa/bYkNzN3BAw1wEjsLV/ZKOf/CCrJ/QOBsxx6fOARIkwTutxp1XIOIohi6HKmOFjMoK/XaqDVUpEEw==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz",
+ "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==",
"dev": true,
+ "license": "ISC",
"engines": {
"node": ">= 12"
}
@@ -3113,15 +3424,6 @@
"node": ">=12"
}
},
- "node_modules/clone": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
- "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
- "dev": true,
- "engines": {
- "node": ">=0.8"
- }
- },
"node_modules/co": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
@@ -3156,6 +3458,17 @@
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/commander": {
"version": "9.4.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz",
@@ -3188,6 +3501,7 @@
"engines": [
"node >= 6.0"
],
+ "license": "MIT",
"dependencies": {
"buffer-from": "^1.0.0",
"inherits": "^2.0.3",
@@ -3195,60 +3509,21 @@
"typedarray": "^0.0.6"
}
},
- "node_modules/config-chain": {
- "version": "1.1.13",
- "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz",
- "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==",
+ "node_modules/confbox": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz",
+ "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==",
"dev": true,
- "dependencies": {
- "ini": "^1.3.4",
- "proto-list": "~1.2.1"
- }
+ "license": "MIT"
},
- "node_modules/configstore": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz",
- "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==",
+ "node_modules/consola": {
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz",
+ "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==",
"dev": true,
- "dependencies": {
- "dot-prop": "^6.0.1",
- "graceful-fs": "^4.2.6",
- "unique-string": "^3.0.0",
- "write-file-atomic": "^3.0.3",
- "xdg-basedir": "^5.0.1"
- },
+ "license": "MIT",
"engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/yeoman/configstore?sponsor=1"
- }
- },
- "node_modules/configstore/node_modules/dot-prop": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz",
- "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==",
- "dev": true,
- "dependencies": {
- "is-obj": "^2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/configstore/node_modules/write-file-atomic": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
- "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
- "dev": true,
- "dependencies": {
- "imurmurhash": "^0.1.4",
- "is-typedarray": "^1.0.0",
- "signal-exit": "^3.0.2",
- "typedarray-to-buffer": "^3.1.5"
+ "node": "^14.18.0 || >=16.10.0"
}
},
"node_modules/content-disposition": {
@@ -3264,34 +3539,35 @@
}
},
"node_modules/content-type": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
- "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
"dev": true,
"engines": {
"node": ">= 0.6"
}
},
"node_modules/conventional-changelog": {
- "version": "3.1.25",
- "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.25.tgz",
- "integrity": "sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==",
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-6.0.0.tgz",
+ "integrity": "sha512-tuUH8H/19VjtD9Ig7l6TQRh+Z0Yt0NZ6w/cCkkyzUbGQTnUEmKfGtkC9gGfVgCfOL1Rzno5NgNF4KY8vR+Jo3w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "conventional-changelog-angular": "^5.0.12",
- "conventional-changelog-atom": "^2.0.8",
- "conventional-changelog-codemirror": "^2.0.8",
- "conventional-changelog-conventionalcommits": "^4.5.0",
- "conventional-changelog-core": "^4.2.1",
- "conventional-changelog-ember": "^2.0.9",
- "conventional-changelog-eslint": "^3.0.9",
- "conventional-changelog-express": "^2.0.6",
- "conventional-changelog-jquery": "^3.0.11",
- "conventional-changelog-jshint": "^2.0.9",
- "conventional-changelog-preset-loader": "^2.3.4"
+ "conventional-changelog-angular": "^8.0.0",
+ "conventional-changelog-atom": "^5.0.0",
+ "conventional-changelog-codemirror": "^5.0.0",
+ "conventional-changelog-conventionalcommits": "^8.0.0",
+ "conventional-changelog-core": "^8.0.0",
+ "conventional-changelog-ember": "^5.0.0",
+ "conventional-changelog-eslint": "^6.0.0",
+ "conventional-changelog-express": "^5.0.0",
+ "conventional-changelog-jquery": "^6.0.0",
+ "conventional-changelog-jshint": "^5.0.0",
+ "conventional-changelog-preset-loader": "^5.0.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=18"
}
},
"node_modules/conventional-changelog-angular": {
@@ -3308,27 +3584,23 @@
}
},
"node_modules/conventional-changelog-atom": {
- "version": "2.0.8",
- "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.8.tgz",
- "integrity": "sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-5.0.0.tgz",
+ "integrity": "sha512-WfzCaAvSCFPkznnLgLnfacRAzjgqjLUjvf3MftfsJzQdDICqkOOpcMtdJF3wTerxSpv2IAAjX8doM3Vozqle3g==",
"dev": true,
- "dependencies": {
- "q": "^1.5.1"
- },
+ "license": "ISC",
"engines": {
- "node": ">=10"
+ "node": ">=18"
}
},
"node_modules/conventional-changelog-codemirror": {
- "version": "2.0.8",
- "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.8.tgz",
- "integrity": "sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-5.0.0.tgz",
+ "integrity": "sha512-8gsBDI5Y3vrKUCxN6Ue8xr6occZ5nsDEc4C7jO/EovFGozx8uttCAyfhRrvoUAWi2WMm3OmYs+0mPJU7kQdYWQ==",
"dev": true,
- "dependencies": {
- "q": "^1.5.1"
- },
+ "license": "ISC",
"engines": {
- "node": ">=10"
+ "node": ">=18"
}
},
"node_modules/conventional-changelog-conventionalcommits": {
@@ -3346,299 +3618,314 @@
}
},
"node_modules/conventional-changelog-core": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz",
- "integrity": "sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==",
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-8.0.0.tgz",
+ "integrity": "sha512-EATUx5y9xewpEe10UEGNpbSHRC6cVZgO+hXQjofMqpy+gFIrcGvH3Fl6yk2VFKh7m+ffenup2N7SZJYpyD9evw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
+ "@hutson/parse-repository-url": "^5.0.0",
"add-stream": "^1.0.0",
- "conventional-changelog-writer": "^5.0.0",
- "conventional-commits-parser": "^3.2.0",
- "dateformat": "^3.0.0",
- "get-pkg-repo": "^4.0.0",
- "git-raw-commits": "^2.0.8",
- "git-remote-origin-url": "^2.0.0",
- "git-semver-tags": "^4.1.1",
- "lodash": "^4.17.15",
- "normalize-package-data": "^3.0.0",
- "q": "^1.5.1",
- "read-pkg": "^3.0.0",
- "read-pkg-up": "^3.0.0",
- "through2": "^4.0.0"
+ "conventional-changelog-writer": "^8.0.0",
+ "conventional-commits-parser": "^6.0.0",
+ "git-raw-commits": "^5.0.0",
+ "git-semver-tags": "^8.0.0",
+ "hosted-git-info": "^7.0.0",
+ "normalize-package-data": "^6.0.0",
+ "read-package-up": "^11.0.0",
+ "read-pkg": "^9.0.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=18"
}
},
- "node_modules/conventional-changelog-core/node_modules/find-up": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
- "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==",
+ "node_modules/conventional-changelog-core/node_modules/@conventional-changelog/git-client": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@conventional-changelog/git-client/-/git-client-1.0.1.tgz",
+ "integrity": "sha512-PJEqBwAleffCMETaVm/fUgHldzBE35JFk3/9LL6NUA5EXa3qednu+UT6M7E5iBu3zIQZCULYIiZ90fBYHt6xUw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "locate-path": "^2.0.0"
+ "@types/semver": "^7.5.5",
+ "semver": "^7.5.2"
},
"engines": {
- "node": ">=4"
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "conventional-commits-filter": "^5.0.0",
+ "conventional-commits-parser": "^6.0.0"
+ },
+ "peerDependenciesMeta": {
+ "conventional-commits-filter": {
+ "optional": true
+ },
+ "conventional-commits-parser": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/conventional-changelog-core/node_modules/conventional-commits-parser": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.1.0.tgz",
+ "integrity": "sha512-5nxDo7TwKB5InYBl4ZC//1g9GRwB/F3TXOGR9hgUjMGfvSP4Vu5NkpNro2+1+TIEy1vwxApl5ircECr2ri5JIw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "meow": "^13.0.0"
+ },
+ "bin": {
+ "conventional-commits-parser": "dist/cli/index.js"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/conventional-changelog-core/node_modules/git-raw-commits": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-5.0.0.tgz",
+ "integrity": "sha512-I2ZXrXeOc0KrCvC7swqtIFXFN+rbjnC7b2T943tvemIOVNl+XP8YnA9UVwqFhzzLClnSA60KR/qEjLpXzs73Qg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@conventional-changelog/git-client": "^1.0.0",
+ "meow": "^13.0.0"
+ },
+ "bin": {
+ "git-raw-commits": "src/cli.js"
+ },
+ "engines": {
+ "node": ">=18"
}
},
"node_modules/conventional-changelog-core/node_modules/hosted-git-info": {
- "version": "2.8.9",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
- "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
- "dev": true
- },
- "node_modules/conventional-changelog-core/node_modules/locate-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
- "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==",
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz",
+ "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==",
"dev": true,
+ "license": "ISC",
"dependencies": {
- "p-locate": "^2.0.0",
- "path-exists": "^3.0.0"
+ "lru-cache": "^10.0.1"
},
"engines": {
- "node": ">=4"
+ "node": "^16.14.0 || >=18.0.0"
}
},
- "node_modules/conventional-changelog-core/node_modules/p-limit": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
- "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+ "node_modules/conventional-changelog-core/node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
"dev": true,
+ "license": "ISC"
+ },
+ "node_modules/conventional-changelog-core/node_modules/meow": {
+ "version": "13.2.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz",
+ "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/conventional-changelog-core/node_modules/normalize-package-data": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz",
+ "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
"dependencies": {
- "p-try": "^1.0.0"
+ "hosted-git-info": "^7.0.0",
+ "semver": "^7.3.5",
+ "validate-npm-package-license": "^3.0.4"
},
"engines": {
- "node": ">=4"
+ "node": "^16.14.0 || >=18.0.0"
}
},
- "node_modules/conventional-changelog-core/node_modules/p-locate": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
- "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==",
+ "node_modules/conventional-changelog-core/node_modules/parse-json": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz",
+ "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "p-limit": "^1.1.0"
+ "@babel/code-frame": "^7.26.2",
+ "index-to-position": "^1.1.0",
+ "type-fest": "^4.39.1"
},
"engines": {
- "node": ">=4"
- }
- },
- "node_modules/conventional-changelog-core/node_modules/p-try": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
- "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/conventional-changelog-core/node_modules/path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/conventional-changelog-core/node_modules/path-type": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
- "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
- "dev": true,
- "dependencies": {
- "pify": "^3.0.0"
+ "node": ">=18"
},
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/conventional-changelog-core/node_modules/pify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
- "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==",
- "dev": true,
- "engines": {
- "node": ">=4"
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/conventional-changelog-core/node_modules/read-pkg": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
- "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==",
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz",
+ "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "load-json-file": "^4.0.0",
- "normalize-package-data": "^2.3.2",
- "path-type": "^3.0.0"
+ "@types/normalize-package-data": "^2.4.3",
+ "normalize-package-data": "^6.0.0",
+ "parse-json": "^8.0.0",
+ "type-fest": "^4.6.0",
+ "unicorn-magic": "^0.1.0"
},
"engines": {
- "node": ">=4"
- }
- },
- "node_modules/conventional-changelog-core/node_modules/read-pkg-up": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz",
- "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==",
- "dev": true,
- "dependencies": {
- "find-up": "^2.0.0",
- "read-pkg": "^3.0.0"
+ "node": ">=18"
},
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/conventional-changelog-core/node_modules/type-fest": {
+ "version": "4.39.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.39.1.tgz",
+ "integrity": "sha512-uW9qzd66uyHYxwyVBYiwS4Oi0qZyUqwjU+Oevr6ZogYiXt99EOYtwvzMSLw1c3lYo2HzJsep/NB23iEVEgjG/w==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
"engines": {
- "node": ">=4"
- }
- },
- "node_modules/conventional-changelog-core/node_modules/read-pkg/node_modules/normalize-package-data": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
- "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
- "dev": true,
- "dependencies": {
- "hosted-git-info": "^2.1.4",
- "resolve": "^1.10.0",
- "semver": "2 || 3 || 4 || 5",
- "validate-npm-package-license": "^3.0.1"
- }
- },
- "node_modules/conventional-changelog-core/node_modules/semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
- "dev": true,
- "bin": {
- "semver": "bin/semver"
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/conventional-changelog-ember": {
- "version": "2.0.9",
- "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.9.tgz",
- "integrity": "sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-5.0.0.tgz",
+ "integrity": "sha512-RPflVfm5s4cSO33GH/Ey26oxhiC67akcxSKL8CLRT3kQX2W3dbE19sSOM56iFqUJYEwv9mD9r6k79weWe1urfg==",
"dev": true,
- "dependencies": {
- "q": "^1.5.1"
- },
+ "license": "ISC",
"engines": {
- "node": ">=10"
+ "node": ">=18"
}
},
"node_modules/conventional-changelog-eslint": {
- "version": "3.0.9",
- "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.9.tgz",
- "integrity": "sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==",
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-6.0.0.tgz",
+ "integrity": "sha512-eiUyULWjzq+ybPjXwU6NNRflApDWlPEQEHvI8UAItYW/h22RKkMnOAtfCZxMmrcMO1OKUWtcf2MxKYMWe9zJuw==",
"dev": true,
- "dependencies": {
- "q": "^1.5.1"
- },
+ "license": "ISC",
"engines": {
- "node": ">=10"
+ "node": ">=18"
}
},
"node_modules/conventional-changelog-express": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.6.tgz",
- "integrity": "sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-5.0.0.tgz",
+ "integrity": "sha512-D8Q6WctPkQpvr2HNCCmwU5GkX22BVHM0r4EW8vN0230TSyS/d6VQJDAxGb84lbg0dFjpO22MwmsikKL++Oo/oQ==",
"dev": true,
- "dependencies": {
- "q": "^1.5.1"
- },
+ "license": "ISC",
"engines": {
- "node": ">=10"
+ "node": ">=18"
}
},
"node_modules/conventional-changelog-jquery": {
- "version": "3.0.11",
- "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.11.tgz",
- "integrity": "sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==",
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-6.0.0.tgz",
+ "integrity": "sha512-2kxmVakyehgyrho2ZHBi90v4AHswkGzHuTaoH40bmeNqUt20yEkDOSpw8HlPBfvEQBwGtbE+5HpRwzj6ac2UfA==",
"dev": true,
- "dependencies": {
- "q": "^1.5.1"
- },
+ "license": "ISC",
"engines": {
- "node": ">=10"
+ "node": ">=18"
}
},
"node_modules/conventional-changelog-jshint": {
- "version": "2.0.9",
- "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.9.tgz",
- "integrity": "sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-5.0.0.tgz",
+ "integrity": "sha512-gGNphSb/opc76n2eWaO6ma4/Wqu3tpa2w7i9WYqI6Cs2fncDSI2/ihOfMvXveeTTeld0oFvwMVNV+IYQIk3F3g==",
"dev": true,
+ "license": "ISC",
"dependencies": {
- "compare-func": "^2.0.0",
- "q": "^1.5.1"
+ "compare-func": "^2.0.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=18"
}
},
"node_modules/conventional-changelog-preset-loader": {
- "version": "2.3.4",
- "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz",
- "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-5.0.0.tgz",
+ "integrity": "sha512-SetDSntXLk8Jh1NOAl1Gu5uLiCNSYenB5tm0YVeZKePRIgDW9lQImromTwLa3c/Gae298tsgOM+/CYT9XAl0NA==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=10"
+ "node": ">=18"
}
},
"node_modules/conventional-changelog-writer": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz",
- "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==",
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-8.0.1.tgz",
+ "integrity": "sha512-hlqcy3xHred2gyYg/zXSMXraY2mjAYYo0msUCpK+BGyaVJMFCKWVXPIHiaacGO2GGp13kvHWXFhYmxT4QQqW3Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "conventional-commits-filter": "^2.0.7",
- "dateformat": "^3.0.0",
+ "conventional-commits-filter": "^5.0.0",
"handlebars": "^4.7.7",
- "json-stringify-safe": "^5.0.1",
- "lodash": "^4.17.15",
- "meow": "^8.0.0",
- "semver": "^6.0.0",
- "split": "^1.0.0",
- "through2": "^4.0.0"
+ "meow": "^13.0.0",
+ "semver": "^7.5.2"
},
"bin": {
- "conventional-changelog-writer": "cli.js"
+ "conventional-changelog-writer": "dist/cli/index.js"
},
"engines": {
- "node": ">=10"
+ "node": ">=18"
}
},
- "node_modules/conventional-changelog-writer/node_modules/semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "node_modules/conventional-changelog-writer/node_modules/meow": {
+ "version": "13.2.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz",
+ "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==",
"dev": true,
- "bin": {
- "semver": "bin/semver.js"
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/conventional-changelog/node_modules/conventional-changelog-angular": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-8.0.0.tgz",
+ "integrity": "sha512-CLf+zr6St0wIxos4bmaKHRXWAcsCXrJU6F4VdNDrGRK3B8LDLKoX3zuMV5GhtbGkVR/LohZ6MT6im43vZLSjmA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "compare-func": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
}
},
"node_modules/conventional-changelog/node_modules/conventional-changelog-conventionalcommits": {
- "version": "4.6.3",
- "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.3.tgz",
- "integrity": "sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==",
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-8.0.0.tgz",
+ "integrity": "sha512-eOvlTO6OcySPyyyk8pKz2dP4jjElYunj9hn9/s0OB+gapTO8zwS9UQWrZ1pmF2hFs3vw1xhonOLGcGjy/zgsuA==",
"dev": true,
+ "license": "ISC",
"dependencies": {
- "compare-func": "^2.0.0",
- "lodash": "^4.17.15",
- "q": "^1.5.1"
+ "compare-func": "^2.0.0"
},
"engines": {
- "node": ">=10"
+ "node": ">=18"
}
},
"node_modules/conventional-commits-filter": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz",
- "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-5.0.0.tgz",
+ "integrity": "sha512-tQMagCOC59EVgNZcC5zl7XqO30Wki9i9J3acbUvkaosCT6JX3EeFwJD7Qqp4MCikRnzS18WXV3BLIQ66ytu6+Q==",
"dev": true,
- "dependencies": {
- "lodash.ismatch": "^4.4.0",
- "modify-values": "^1.0.0"
- },
+ "license": "MIT",
"engines": {
- "node": ">=10"
+ "node": ">=18"
}
},
"node_modules/conventional-commits-parser": {
@@ -3662,25 +3949,78 @@
}
},
"node_modules/conventional-recommended-bump": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz",
- "integrity": "sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==",
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-10.0.0.tgz",
+ "integrity": "sha512-RK/fUnc2btot0oEVtrj3p2doImDSs7iiz/bftFCDzels0Qs1mxLghp+DFHMaOC0qiCI6sWzlTDyBFSYuot6pRA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "concat-stream": "^2.0.0",
- "conventional-changelog-preset-loader": "^2.3.4",
- "conventional-commits-filter": "^2.0.7",
- "conventional-commits-parser": "^3.2.0",
- "git-raw-commits": "^2.0.8",
- "git-semver-tags": "^4.1.1",
- "meow": "^8.0.0",
- "q": "^1.5.1"
+ "@conventional-changelog/git-client": "^1.0.0",
+ "conventional-changelog-preset-loader": "^5.0.0",
+ "conventional-commits-filter": "^5.0.0",
+ "conventional-commits-parser": "^6.0.0",
+ "meow": "^13.0.0"
},
"bin": {
- "conventional-recommended-bump": "cli.js"
+ "conventional-recommended-bump": "dist/cli/index.js"
},
"engines": {
- "node": ">=10"
+ "node": ">=18"
+ }
+ },
+ "node_modules/conventional-recommended-bump/node_modules/@conventional-changelog/git-client": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@conventional-changelog/git-client/-/git-client-1.0.1.tgz",
+ "integrity": "sha512-PJEqBwAleffCMETaVm/fUgHldzBE35JFk3/9LL6NUA5EXa3qednu+UT6M7E5iBu3zIQZCULYIiZ90fBYHt6xUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/semver": "^7.5.5",
+ "semver": "^7.5.2"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "conventional-commits-filter": "^5.0.0",
+ "conventional-commits-parser": "^6.0.0"
+ },
+ "peerDependenciesMeta": {
+ "conventional-commits-filter": {
+ "optional": true
+ },
+ "conventional-commits-parser": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/conventional-recommended-bump/node_modules/conventional-commits-parser": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.1.0.tgz",
+ "integrity": "sha512-5nxDo7TwKB5InYBl4ZC//1g9GRwB/F3TXOGR9hgUjMGfvSP4Vu5NkpNro2+1+TIEy1vwxApl5ircECr2ri5JIw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "meow": "^13.0.0"
+ },
+ "bin": {
+ "conventional-commits-parser": "dist/cli/index.js"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/conventional-recommended-bump/node_modules/meow": {
+ "version": "13.2.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz",
+ "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/convert-source-map": {
@@ -3690,9 +4030,9 @@
"dev": true
},
"node_modules/cookie": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
- "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz",
+ "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==",
"dev": true,
"engines": {
"node": ">= 0.6"
@@ -3704,16 +4044,10 @@
"integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
"dev": true
},
- "node_modules/core-util-is": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
- "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
- "dev": true
- },
"node_modules/cosmiconfig": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.0.0.tgz",
- "integrity": "sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==",
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz",
+ "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==",
"dev": true,
"dependencies": {
"import-fresh": "^3.2.1",
@@ -3723,6 +4057,9 @@
},
"engines": {
"node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/d-fischer"
}
},
"node_modules/cosmiconfig-typescript-loader": {
@@ -3748,9 +4085,9 @@
"dev": true
},
"node_modules/cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
"dev": true,
"dependencies": {
"path-key": "^3.1.0",
@@ -3761,33 +4098,6 @@
"node": ">= 8"
}
},
- "node_modules/crypto-random-string": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz",
- "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==",
- "dev": true,
- "dependencies": {
- "type-fest": "^1.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/crypto-random-string/node_modules/type-fest": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
- "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/dargs": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz",
@@ -3798,21 +4108,13 @@
}
},
"node_modules/data-uri-to-buffer": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz",
- "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==",
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz",
+ "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">= 6"
- }
- },
- "node_modules/dateformat": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz",
- "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==",
- "dev": true,
- "engines": {
- "node": "*"
+ "node": ">= 14"
}
},
"node_modules/debug": {
@@ -3865,48 +4167,12 @@
"node": ">=0.10.0"
}
},
- "node_modules/decompress-response": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
- "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
- "dev": true,
- "dependencies": {
- "mimic-response": "^3.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/decompress-response/node_modules/mimic-response": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
- "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/dedent": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
"integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==",
"dev": true
},
- "node_modules/deep-extend": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
- "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
- "dev": true,
- "engines": {
- "node": ">=4.0.0"
- }
- },
"node_modules/deep-is": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
@@ -3914,73 +4180,85 @@
"dev": true
},
"node_modules/deepmerge": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
- "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
- "node_modules/defaults": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
- "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
+ "node_modules/default-browser": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz",
+ "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "clone": "^1.0.2"
+ "bundle-name": "^4.1.0",
+ "default-browser-id": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/defer-to-connect": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
- "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
+ "node_modules/default-browser-id": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz",
+ "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=10"
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/define-lazy-prop": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
- "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz",
+ "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=8"
- }
- },
- "node_modules/define-properties": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz",
- "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==",
- "dev": true,
- "dependencies": {
- "has-property-descriptors": "^1.0.0",
- "object-keys": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
+ "node": ">=12"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/degenerator": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-3.0.2.tgz",
- "integrity": "sha512-c0mef3SNQo56t6urUU6tdQAs+ThoD0o9B9MJ8HEt7NQcGEILCRFqQb7ZbP9JAv+QF1Ky5plydhMR/IrqWDm+TQ==",
+ "node_modules/defu": {
+ "version": "6.1.4",
+ "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz",
+ "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==",
"dev": true,
+ "license": "MIT"
+ },
+ "node_modules/degenerator": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz",
+ "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
- "ast-types": "^0.13.2",
- "escodegen": "^1.8.1",
- "esprima": "^4.0.0",
- "vm2": "^3.9.8"
+ "ast-types": "^0.13.4",
+ "escodegen": "^2.1.0",
+ "esprima": "^4.0.1"
},
"engines": {
- "node": ">= 6"
+ "node": ">= 14"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "engines": {
+ "node": ">=0.4.0"
}
},
"node_modules/depd": {
@@ -3997,6 +4275,13 @@
"resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz",
"integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ=="
},
+ "node_modules/destr": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz",
+ "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/destroy": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
@@ -4026,9 +4311,9 @@
}
},
"node_modules/diff-sequences": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.3.1.tgz",
- "integrity": "sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==",
+ "version": "29.4.3",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz",
+ "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==",
"dev": true,
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
@@ -4070,11 +4355,32 @@
"node": ">=8"
}
},
- "node_modules/eastasianwidth": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
- "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
- "dev": true
+ "node_modules/dotenv": {
+ "version": "16.5.0",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz",
+ "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://dotenvx.com"
+ }
+ },
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "dev": true,
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
},
"node_modules/ee-first": {
"version": "1.1.1",
@@ -4083,9 +4389,9 @@
"dev": true
},
"node_modules/electron-to-chromium": {
- "version": "1.4.284",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz",
- "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==",
+ "version": "1.4.446",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.446.tgz",
+ "integrity": "sha512-4Gnw7ztEQ/E0eOt5JWfPn9jjeupfUlKoeW5ETKP9nLdWj+4spFoS3Stj19fqlKIaX28UQs0fNX+uKEyoLCBnkw==",
"dev": true
},
"node_modules/emittery": {
@@ -4107,9 +4413,9 @@
"dev": true
},
"node_modules/encodeurl": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
- "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
"dev": true,
"engines": {
"node": ">= 0.8"
@@ -4124,105 +4430,34 @@
"is-arrayish": "^0.2.1"
}
},
- "node_modules/es-abstract": {
- "version": "1.21.0",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.0.tgz",
- "integrity": "sha512-GUGtW7eXQay0c+PRq0sGIKSdaBorfVqsCMhGHo4elP7YVqZu9nCZS4UkK4gv71gOWNMra/PaSKD3ao1oWExO0g==",
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
"dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "es-set-tostringtag": "^2.0.0",
- "es-to-primitive": "^1.2.1",
- "function-bind": "^1.1.1",
- "function.prototype.name": "^1.1.5",
- "get-intrinsic": "^1.1.3",
- "get-symbol-description": "^1.0.0",
- "globalthis": "^1.0.3",
- "gopd": "^1.0.1",
- "has": "^1.0.3",
- "has-property-descriptors": "^1.0.0",
- "has-proto": "^1.0.1",
- "has-symbols": "^1.0.3",
- "internal-slot": "^1.0.4",
- "is-array-buffer": "^3.0.0",
- "is-callable": "^1.2.7",
- "is-negative-zero": "^2.0.2",
- "is-regex": "^1.1.4",
- "is-shared-array-buffer": "^1.0.2",
- "is-string": "^1.0.7",
- "is-typed-array": "^1.1.10",
- "is-weakref": "^1.0.2",
- "object-inspect": "^1.12.2",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.4",
- "regexp.prototype.flags": "^1.4.3",
- "safe-regex-test": "^1.0.0",
- "string.prototype.trimend": "^1.0.6",
- "string.prototype.trimstart": "^1.0.6",
- "typed-array-length": "^1.0.4",
- "unbox-primitive": "^1.0.2",
- "which-typed-array": "^1.1.9"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/es-array-method-boxes-properly": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz",
- "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==",
- "dev": true
- },
- "node_modules/es-get-iterator": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz",
- "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.0",
- "has-symbols": "^1.0.1",
- "is-arguments": "^1.1.0",
- "is-map": "^2.0.2",
- "is-set": "^2.0.2",
- "is-string": "^1.0.5",
- "isarray": "^2.0.5"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/es-set-tostringtag": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.0.tgz",
- "integrity": "sha512-vZVAIWss0FcR/+a08s6e2/GjGjjYBCZJXDrOnj6l5kJCKhQvJs4cnVqUxkVepIhqHbKHm3uwOvPb8lRcqA3DSg==",
- "dev": true,
- "dependencies": {
- "get-intrinsic": "^1.1.3",
- "has-tostringtag": "^1.0.0"
- },
"engines": {
"node": ">= 0.4"
}
},
- "node_modules/es-to-primitive": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
- "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
"dev": true,
"dependencies": {
- "is-callable": "^1.1.4",
- "is-date-object": "^1.0.1",
- "is-symbol": "^1.0.2"
+ "es-errors": "^1.3.0"
},
"engines": {
"node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/escalade": {
@@ -4234,18 +4469,6 @@
"node": ">=6"
}
},
- "node_modules/escape-goat": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz",
- "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==",
- "dev": true,
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
@@ -4265,76 +4488,35 @@
}
},
"node_modules/escodegen": {
- "version": "1.14.3",
- "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
- "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz",
+ "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==",
"dev": true,
+ "license": "BSD-2-Clause",
"dependencies": {
"esprima": "^4.0.1",
- "estraverse": "^4.2.0",
- "esutils": "^2.0.2",
- "optionator": "^0.8.1"
+ "estraverse": "^5.2.0",
+ "esutils": "^2.0.2"
},
"bin": {
"escodegen": "bin/escodegen.js",
"esgenerate": "bin/esgenerate.js"
},
"engines": {
- "node": ">=4.0"
+ "node": ">=6.0"
},
"optionalDependencies": {
"source-map": "~0.6.1"
}
},
- "node_modules/escodegen/node_modules/levn": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
- "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
+ "node_modules/escodegen/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
"dev": true,
- "dependencies": {
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2"
- },
+ "license": "BSD-2-Clause",
"engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/escodegen/node_modules/optionator": {
- "version": "0.8.3",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
- "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
- "dev": true,
- "dependencies": {
- "deep-is": "~0.1.3",
- "fast-levenshtein": "~2.0.6",
- "levn": "~0.3.0",
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2",
- "word-wrap": "~1.2.3"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/escodegen/node_modules/prelude-ls": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
- "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
- "dev": true,
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/escodegen/node_modules/type-check": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
- "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
- "dev": true,
- "dependencies": {
- "prelude-ls": "~1.1.2"
- },
- "engines": {
- "node": ">= 0.8.0"
+ "node": ">=4.0"
}
},
"node_modules/eslint": {
@@ -4576,6 +4758,19 @@
"node": ">=0.10.0"
}
},
+ "node_modules/eta": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/eta/-/eta-3.5.0.tgz",
+ "integrity": "sha512-e3x3FBvGzeCIHhF+zhK8FZA2vC5uFn6b4HJjegUbIWrDb4mJ7JjTGMJY9VGIbRVpmSwHopNiaJibhjIr+HfLug==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/eta-dev/eta?sponsor=1"
+ }
+ },
"node_modules/etag": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
@@ -4618,53 +4813,53 @@
}
},
"node_modules/expect": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/expect/-/expect-29.3.1.tgz",
- "integrity": "sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz",
+ "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==",
"dev": true,
"dependencies": {
- "@jest/expect-utils": "^29.3.1",
- "jest-get-type": "^29.2.0",
- "jest-matcher-utils": "^29.3.1",
- "jest-message-util": "^29.3.1",
- "jest-util": "^29.3.1"
+ "@jest/expect-utils": "^29.5.0",
+ "jest-get-type": "^29.4.3",
+ "jest-matcher-utils": "^29.5.0",
+ "jest-message-util": "^29.5.0",
+ "jest-util": "^29.5.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/express": {
- "version": "4.18.2",
- "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
- "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz",
+ "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==",
"dev": true,
"dependencies": {
"accepts": "~1.3.8",
"array-flatten": "1.1.1",
- "body-parser": "1.20.1",
+ "body-parser": "1.20.3",
"content-disposition": "0.5.4",
"content-type": "~1.0.4",
- "cookie": "0.5.0",
+ "cookie": "0.7.1",
"cookie-signature": "1.0.6",
"debug": "2.6.9",
"depd": "2.0.0",
- "encodeurl": "~1.0.2",
+ "encodeurl": "~2.0.0",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
- "finalhandler": "1.2.0",
+ "finalhandler": "1.3.1",
"fresh": "0.5.2",
"http-errors": "2.0.0",
- "merge-descriptors": "1.0.1",
+ "merge-descriptors": "1.0.3",
"methods": "~1.1.2",
"on-finished": "2.4.1",
"parseurl": "~1.3.3",
- "path-to-regexp": "0.1.7",
+ "path-to-regexp": "0.1.12",
"proxy-addr": "~2.0.7",
- "qs": "6.11.0",
+ "qs": "6.13.0",
"range-parser": "~1.2.1",
"safe-buffer": "5.2.1",
- "send": "0.18.0",
- "serve-static": "1.15.0",
+ "send": "0.19.0",
+ "serve-static": "1.16.2",
"setprototypeof": "1.2.0",
"statuses": "2.0.1",
"type-is": "~1.6.18",
@@ -4673,6 +4868,10 @@
},
"engines": {
"node": ">= 0.10.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
"node_modules/express/node_modules/debug": {
@@ -4690,11 +4889,19 @@
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"dev": true
},
+ "node_modules/exsolve": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.5.tgz",
+ "integrity": "sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/external-editor": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
"integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"chardet": "^0.7.0",
"iconv-lite": "^0.4.24",
@@ -4704,6 +4911,22 @@
"node": ">=4"
}
},
+ "node_modules/fast-content-type-parse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-2.0.1.tgz",
+ "integrity": "sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "MIT"
+ },
"node_modules/fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@@ -4711,16 +4934,17 @@
"dev": true
},
"node_modules/fast-glob": {
- "version": "3.2.12",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
- "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==",
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@nodelib/fs.stat": "^2.0.2",
"@nodelib/fs.walk": "^1.2.3",
"glob-parent": "^5.1.2",
"merge2": "^1.3.0",
- "micromatch": "^4.0.4"
+ "micromatch": "^4.0.8"
},
"engines": {
"node": ">=8.6.0"
@@ -4768,57 +4992,6 @@
"bser": "2.1.1"
}
},
- "node_modules/fetch-blob": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
- "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/jimmywarting"
- },
- {
- "type": "paypal",
- "url": "https://paypal.me/jimmywarting"
- }
- ],
- "dependencies": {
- "node-domexception": "^1.0.0",
- "web-streams-polyfill": "^3.0.3"
- },
- "engines": {
- "node": "^12.20 || >= 14.13"
- }
- },
- "node_modules/figures": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz",
- "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==",
- "dev": true,
- "dependencies": {
- "escape-string-regexp": "^5.0.0",
- "is-unicode-supported": "^1.2.0"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/figures/node_modules/escape-string-regexp": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
- "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
- "dev": true,
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/file-entry-cache": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
@@ -4831,19 +5004,10 @@
"node": "^10.12.0 || >=12.0.0"
}
},
- "node_modules/file-uri-to-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz",
- "integrity": "sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==",
- "dev": true,
- "engines": {
- "node": ">= 6"
- }
- },
"node_modules/fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
"dev": true,
"dependencies": {
"to-regex-range": "^5.0.1"
@@ -4853,13 +5017,13 @@
}
},
"node_modules/finalhandler": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
- "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
+ "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
"dev": true,
"dependencies": {
"debug": "2.6.9",
- "encodeurl": "~1.0.2",
+ "encodeurl": "~2.0.0",
"escape-html": "~1.0.3",
"on-finished": "2.4.1",
"parseurl": "~1.3.3",
@@ -4901,6 +5065,19 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/find-up-simple": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz",
+ "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/flat-cache": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
@@ -4920,34 +5097,36 @@
"integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
"dev": true
},
- "node_modules/for-each": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
- "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
- "dev": true,
- "dependencies": {
- "is-callable": "^1.1.3"
- }
- },
- "node_modules/form-data-encoder": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz",
- "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==",
- "dev": true,
+ "node_modules/follow-redirects": {
+ "version": "1.15.6",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
+ "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
"engines": {
- "node": ">= 14.17"
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
}
},
- "node_modules/formdata-polyfill": {
- "version": "4.0.10",
- "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
- "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
- "dev": true,
+ "node_modules/form-data": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
"dependencies": {
- "fetch-blob": "^3.1.2"
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
},
"engines": {
- "node": ">=12.20.0"
+ "node": ">= 6"
}
},
"node_modules/forwarded": {
@@ -4987,71 +5166,24 @@
"integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
"dev": true
},
- "node_modules/ftp": {
- "version": "0.3.10",
- "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz",
- "integrity": "sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==",
+ "node_modules/fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
"dev": true,
- "dependencies": {
- "readable-stream": "1.1.x",
- "xregexp": "2.0.0"
- },
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
"engines": {
- "node": ">=0.8.0"
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
}
},
- "node_modules/ftp/node_modules/isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==",
- "dev": true
- },
- "node_modules/ftp/node_modules/readable-stream": {
- "version": "1.1.14",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
- "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==",
- "dev": true,
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.1",
- "isarray": "0.0.1",
- "string_decoder": "~0.10.x"
- }
- },
- "node_modules/ftp/node_modules/string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==",
- "dev": true
- },
"node_modules/function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
- "dev": true
- },
- "node_modules/function.prototype.name": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz",
- "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3",
- "es-abstract": "^1.19.0",
- "functions-have-names": "^1.2.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/functions-have-names": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
- "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
"dev": true,
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -5075,15 +5207,38 @@
"node": "6.* || 8.* || >= 10.*"
}
},
+ "node_modules/get-east-asian-width": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz",
+ "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/get-intrinsic": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
- "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
"dev": true,
"dependencies": {
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.3"
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -5098,106 +5253,17 @@
"node": ">=8.0.0"
}
},
- "node_modules/get-pkg-repo": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz",
- "integrity": "sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==",
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
"dev": true,
"dependencies": {
- "@hutson/parse-repository-url": "^3.0.0",
- "hosted-git-info": "^4.0.0",
- "through2": "^2.0.0",
- "yargs": "^16.2.0"
- },
- "bin": {
- "get-pkg-repo": "src/cli.js"
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
},
"engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/get-pkg-repo/node_modules/cliui": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
- "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
- "dev": true,
- "dependencies": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.0",
- "wrap-ansi": "^7.0.0"
- }
- },
- "node_modules/get-pkg-repo/node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
- "dev": true
- },
- "node_modules/get-pkg-repo/node_modules/readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dev": true,
- "dependencies": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "node_modules/get-pkg-repo/node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true
- },
- "node_modules/get-pkg-repo/node_modules/string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dev": true,
- "dependencies": {
- "safe-buffer": "~5.1.0"
- }
- },
- "node_modules/get-pkg-repo/node_modules/through2": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
- "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
- "dev": true,
- "dependencies": {
- "readable-stream": "~2.3.6",
- "xtend": "~4.0.1"
- }
- },
- "node_modules/get-pkg-repo/node_modules/yargs": {
- "version": "16.2.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
- "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
- "dev": true,
- "dependencies": {
- "cliui": "^7.0.2",
- "escalade": "^3.1.1",
- "get-caller-file": "^2.0.5",
- "require-directory": "^2.1.1",
- "string-width": "^4.2.0",
- "y18n": "^5.0.5",
- "yargs-parser": "^20.2.2"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/get-pkg-repo/node_modules/yargs-parser": {
- "version": "20.2.9",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
- "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
- "dev": true,
- "engines": {
- "node": ">=10"
+ "node": ">= 0.4"
}
},
"node_modules/get-stream": {
@@ -5212,69 +5278,37 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/get-symbol-description": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
- "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/get-uri": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-3.0.2.tgz",
- "integrity": "sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==",
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.4.tgz",
+ "integrity": "sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@tootallnate/once": "1",
- "data-uri-to-buffer": "3",
- "debug": "4",
- "file-uri-to-path": "2",
- "fs-extra": "^8.1.0",
- "ftp": "^0.3.10"
+ "basic-ftp": "^5.0.2",
+ "data-uri-to-buffer": "^6.0.2",
+ "debug": "^4.3.4"
},
"engines": {
- "node": ">= 6"
+ "node": ">= 14"
}
},
- "node_modules/get-uri/node_modules/fs-extra": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
- "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
+ "node_modules/giget": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/giget/-/giget-2.0.0.tgz",
+ "integrity": "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^4.0.0",
- "universalify": "^0.1.0"
+ "citty": "^0.1.6",
+ "consola": "^3.4.0",
+ "defu": "^6.1.4",
+ "node-fetch-native": "^1.6.6",
+ "nypm": "^0.6.0",
+ "pathe": "^2.0.3"
},
- "engines": {
- "node": ">=6 <7 || >=8"
- }
- },
- "node_modules/get-uri/node_modules/jsonfile": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
- "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
- "dev": true,
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
- "node_modules/get-uri/node_modules/universalify": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
- "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
- "dev": true,
- "engines": {
- "node": ">= 4.0.0"
+ "bin": {
+ "giget": "dist/cli.mjs"
}
},
"node_modules/git-raw-commits": {
@@ -5296,70 +5330,99 @@
"node": ">=10"
}
},
- "node_modules/git-remote-origin-url": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz",
- "integrity": "sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==",
- "dev": true,
- "dependencies": {
- "gitconfiglocal": "^1.0.0",
- "pify": "^2.3.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/git-semver-tags": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz",
- "integrity": "sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==",
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-8.0.0.tgz",
+ "integrity": "sha512-N7YRIklvPH3wYWAR2vysaqGLPRcpwQ0GKdlqTiVN5w1UmCdaeY3K8s6DMKRCh54DDdzyt/OAB6C8jgVtb7Y2Fg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "meow": "^8.0.0",
- "semver": "^6.0.0"
+ "@conventional-changelog/git-client": "^1.0.0",
+ "meow": "^13.0.0"
},
"bin": {
- "git-semver-tags": "cli.js"
+ "git-semver-tags": "src/cli.js"
},
"engines": {
- "node": ">=10"
+ "node": ">=18"
}
},
- "node_modules/git-semver-tags/node_modules/semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "node_modules/git-semver-tags/node_modules/@conventional-changelog/git-client": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@conventional-changelog/git-client/-/git-client-1.0.1.tgz",
+ "integrity": "sha512-PJEqBwAleffCMETaVm/fUgHldzBE35JFk3/9LL6NUA5EXa3qednu+UT6M7E5iBu3zIQZCULYIiZ90fBYHt6xUw==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/semver": "^7.5.5",
+ "semver": "^7.5.2"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "conventional-commits-filter": "^5.0.0",
+ "conventional-commits-parser": "^6.0.0"
+ },
+ "peerDependenciesMeta": {
+ "conventional-commits-filter": {
+ "optional": true
+ },
+ "conventional-commits-parser": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/git-semver-tags/node_modules/conventional-commits-parser": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.1.0.tgz",
+ "integrity": "sha512-5nxDo7TwKB5InYBl4ZC//1g9GRwB/F3TXOGR9hgUjMGfvSP4Vu5NkpNro2+1+TIEy1vwxApl5ircECr2ri5JIw==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "meow": "^13.0.0"
+ },
"bin": {
- "semver": "bin/semver.js"
+ "conventional-commits-parser": "dist/cli/index.js"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/git-semver-tags/node_modules/meow": {
+ "version": "13.2.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz",
+ "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/git-up": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz",
- "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==",
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/git-up/-/git-up-8.1.1.tgz",
+ "integrity": "sha512-FDenSF3fVqBYSaJoYy1KSc2wosx0gCvKP+c+PRBht7cAaiCeQlBtfBDX9vgnNOHmdePlSFITVcn4pFfcgNvx3g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"is-ssh": "^1.4.0",
- "parse-url": "^8.1.0"
+ "parse-url": "^9.2.0"
}
},
"node_modules/git-url-parse": {
- "version": "13.1.0",
- "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-13.1.0.tgz",
- "integrity": "sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==",
+ "version": "16.1.0",
+ "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-16.1.0.tgz",
+ "integrity": "sha512-cPLz4HuK86wClEW7iDdeAKcCVlWXmrLpb2L+G9goW0Z1dtpNS6BXXSOckUTlJT/LDQViE1QZKstNORzHsLnobw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "git-up": "^7.0.0"
- }
- },
- "node_modules/gitconfiglocal": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz",
- "integrity": "sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==",
- "dev": true,
- "dependencies": {
- "ini": "^1.3.2"
+ "git-up": "^8.1.0"
}
},
"node_modules/glob": {
@@ -5421,21 +5484,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/globalthis": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
- "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
- "dev": true,
- "dependencies": {
- "define-properties": "^1.1.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/globby": {
"version": "11.1.0",
"resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
@@ -5457,46 +5505,22 @@
}
},
"node_modules/gopd": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
- "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
"dev": true,
- "dependencies": {
- "get-intrinsic": "^1.1.3"
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/got": {
- "version": "12.5.3",
- "resolved": "https://registry.npmjs.org/got/-/got-12.5.3.tgz",
- "integrity": "sha512-8wKnb9MGU8IPGRIo+/ukTy9XLJBwDiCpIf5TVzQ9Cpol50eMTpBq2GAuDsuDIz7hTYmZgMgC1e9ydr6kSDWs3w==",
- "dev": true,
- "dependencies": {
- "@sindresorhus/is": "^5.2.0",
- "@szmarczak/http-timer": "^5.0.1",
- "cacheable-lookup": "^7.0.0",
- "cacheable-request": "^10.2.1",
- "decompress-response": "^6.0.0",
- "form-data-encoder": "^2.1.2",
- "get-stream": "^6.0.1",
- "http2-wrapper": "^2.1.10",
- "lowercase-keys": "^3.0.0",
- "p-cancelable": "^3.0.0",
- "responselike": "^3.0.0"
- },
- "engines": {
- "node": ">=14.16"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/got?sponsor=1"
- }
- },
"node_modules/graceful-fs": {
- "version": "4.2.10",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
- "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA=="
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "license": "ISC"
},
"node_modules/grapheme-splitter": {
"version": "1.0.4",
@@ -5505,13 +5529,14 @@
"dev": true
},
"node_modules/handlebars": {
- "version": "4.7.7",
- "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz",
- "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==",
+ "version": "4.7.8",
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz",
+ "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"minimist": "^1.2.5",
- "neo-async": "^2.6.0",
+ "neo-async": "^2.6.2",
"source-map": "^0.6.1",
"wordwrap": "^1.0.0"
},
@@ -5546,15 +5571,6 @@
"node": ">= 0.4.0"
}
},
- "node_modules/has-bigints": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
- "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -5564,34 +5580,10 @@
"node": ">=8"
}
},
- "node_modules/has-property-descriptors": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
- "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
- "dev": true,
- "dependencies": {
- "get-intrinsic": "^1.1.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-proto": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
- "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/has-symbols": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
- "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
"dev": true,
"engines": {
"node": ">= 0.4"
@@ -5600,31 +5592,16 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/has-tostringtag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
- "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
"dev": true,
"dependencies": {
- "has-symbols": "^1.0.2"
+ "function-bind": "^1.1.2"
},
"engines": {
"node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-yarn": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz",
- "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==",
- "dev": true,
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/hosted-git-info": {
@@ -5645,12 +5622,6 @@
"integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
"dev": true
},
- "node_modules/http-cache-semantics": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
- "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
- "dev": true
- },
"node_modules/http-errors": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
@@ -5668,55 +5639,36 @@
}
},
"node_modules/http-proxy-agent": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
- "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
+ "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@tootallnate/once": "1",
- "agent-base": "6",
- "debug": "4"
+ "agent-base": "^7.1.0",
+ "debug": "^4.3.4"
},
"engines": {
- "node": ">= 6"
+ "node": ">= 14"
}
},
- "node_modules/http2-wrapper": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz",
- "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==",
- "dev": true,
- "dependencies": {
- "quick-lru": "^5.1.1",
- "resolve-alpn": "^1.2.0"
- },
- "engines": {
- "node": ">=10.19.0"
- }
- },
- "node_modules/http2-wrapper/node_modules/quick-lru": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
- "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
+ "node_modules/https": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/https/-/https-1.0.0.tgz",
+ "integrity": "sha512-4EC57ddXrkaF0x83Oj8sM6SLQHAWXw90Skqu2M4AEWENZ3F02dFJE/GARA8igO79tcgYqGrD7ae4f5L3um2lgg=="
},
"node_modules/https-proxy-agent": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
- "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "agent-base": "6",
+ "agent-base": "^7.1.2",
"debug": "4"
},
"engines": {
- "node": ">= 6"
+ "node": ">= 14"
}
},
"node_modules/human-signals": {
@@ -5755,30 +5707,10 @@
"node": ">=0.10.0"
}
},
- "node_modules/ieee754": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
- "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ]
- },
"node_modules/ignore": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.1.tgz",
- "integrity": "sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==",
+ "version": "5.2.4",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
+ "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
"dev": true,
"engines": {
"node": ">= 4"
@@ -5800,15 +5732,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/import-lazy": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz",
- "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/import-local": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
@@ -5846,6 +5769,19 @@
"node": ">=8"
}
},
+ "node_modules/index-to-position": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.1.0.tgz",
+ "integrity": "sha512-XPdx9Dq4t9Qk1mTMbWONJqU7boCoumEH7fRET37HX5+khDUl3J2W6PdALxhILYlIYx2amlwYcRPp28p0tSiojg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
@@ -5869,177 +5805,52 @@
"dev": true
},
"node_modules/inquirer": {
- "version": "9.1.4",
- "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.1.4.tgz",
- "integrity": "sha512-9hiJxE5gkK/cM2d1mTEnuurGTAoHebbkX0BYl3h7iEg7FYfuNIom+nDfBCSWtvSnoSrWCeBxqqBZu26xdlJlXA==",
+ "version": "12.6.0",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-12.6.0.tgz",
+ "integrity": "sha512-3zmmccQd/8o65nPOZJZ+2wqt76Ghw3+LaMrmc6JE/IzcvQhJ1st+QLCOo/iLS85/tILU0myG31a2TAZX0ysAvg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "ansi-escapes": "^6.0.0",
- "chalk": "^5.1.2",
- "cli-cursor": "^4.0.0",
- "cli-width": "^4.0.0",
- "external-editor": "^3.0.3",
- "figures": "^5.0.0",
- "lodash": "^4.17.21",
- "mute-stream": "0.0.8",
- "ora": "^6.1.2",
- "run-async": "^2.4.0",
- "rxjs": "^7.5.7",
- "string-width": "^5.1.2",
- "strip-ansi": "^7.0.1",
- "through": "^2.3.6",
- "wrap-ansi": "^8.0.1"
+ "@inquirer/core": "^10.1.10",
+ "@inquirer/prompts": "^7.5.0",
+ "@inquirer/type": "^3.0.6",
+ "ansi-escapes": "^4.3.2",
+ "mute-stream": "^2.0.0",
+ "run-async": "^3.0.0",
+ "rxjs": "^7.8.2"
},
"engines": {
- "node": ">=12.0.0"
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@types/node": ">=18"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ }
}
},
- "node_modules/inquirer/node_modules/ansi-escapes": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.0.0.tgz",
- "integrity": "sha512-IG23inYII3dWlU2EyiAiGj6Bwal5GzsgPMwjYGvc1HPE2dgbj4ZB5ToWBKSquKw74nB3TIuOwaI6/jSULzfgrw==",
+ "node_modules/ip-address": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz",
+ "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "type-fest": "^3.0.0"
+ "jsbn": "1.1.0",
+ "sprintf-js": "^1.1.3"
},
"engines": {
- "node": ">=14.16"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">= 12"
}
},
- "node_modules/inquirer/node_modules/ansi-regex": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
- "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+ "node_modules/ip-address/node_modules/sprintf-js": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz",
+ "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==",
"dev": true,
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-regex?sponsor=1"
- }
- },
- "node_modules/inquirer/node_modules/ansi-styles": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
- "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
- "dev": true,
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/inquirer/node_modules/chalk": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz",
- "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==",
- "dev": true,
- "engines": {
- "node": "^12.17.0 || ^14.13 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/inquirer/node_modules/emoji-regex": {
- "version": "9.2.2",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
- "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
- "dev": true
- },
- "node_modules/inquirer/node_modules/string-width": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
- "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
- "dev": true,
- "dependencies": {
- "eastasianwidth": "^0.2.0",
- "emoji-regex": "^9.2.2",
- "strip-ansi": "^7.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/inquirer/node_modules/strip-ansi": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz",
- "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==",
- "dev": true,
- "dependencies": {
- "ansi-regex": "^6.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/strip-ansi?sponsor=1"
- }
- },
- "node_modules/inquirer/node_modules/type-fest": {
- "version": "3.5.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.5.1.tgz",
- "integrity": "sha512-70T99cpILFk2fzwuljwWxmazSphFrdOe3gRHbp6bqs71pxFBbJwFqnmkLO2lQL6aLHxHmYAnP/sL+AJWpT70jA==",
- "dev": true,
- "engines": {
- "node": ">=14.16"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/inquirer/node_modules/wrap-ansi": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.0.1.tgz",
- "integrity": "sha512-QFF+ufAqhoYHvoHdajT/Po7KoXVBPXS2bgjIam5isfWJPfIOnQZ50JtUiVvCv/sjgacf3yRrt2ZKUZ/V4itN4g==",
- "dev": true,
- "dependencies": {
- "ansi-styles": "^6.1.0",
- "string-width": "^5.0.1",
- "strip-ansi": "^7.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
- }
- },
- "node_modules/internal-slot": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz",
- "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==",
- "dev": true,
- "dependencies": {
- "get-intrinsic": "^1.1.3",
- "has": "^1.0.3",
- "side-channel": "^1.0.4"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/interpret": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
- "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
- "dev": true,
- "engines": {
- "node": ">= 0.10"
- }
- },
- "node_modules/ip": {
- "version": "1.1.8",
- "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz",
- "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==",
- "dev": true
+ "license": "BSD-3-Clause"
},
"node_modules/ipaddr.js": {
"version": "1.9.1",
@@ -6050,53 +5861,12 @@
"node": ">= 0.10"
}
},
- "node_modules/is-arguments": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz",
- "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-array-buffer": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.0.tgz",
- "integrity": "sha512-TI2hnvT6dPUnn/jARFCJBKL1eeabAfLnKZ2lmW5Uh317s1Ii2IMroL1yMciEk/G+OETykVzlsH6x/L4q/avhgw==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/is-arrayish": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
"integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
"dev": true
},
- "node_modules/is-bigint": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
- "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
- "dev": true,
- "dependencies": {
- "has-bigints": "^1.0.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/is-binary-path": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
@@ -6109,46 +5879,6 @@
"node": ">=8"
}
},
- "node_modules/is-boolean-object": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
- "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-callable": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
- "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-ci": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz",
- "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==",
- "dev": true,
- "dependencies": {
- "ci-info": "^3.2.0"
- },
- "bin": {
- "is-ci": "bin.js"
- }
- },
"node_modules/is-core-module": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
@@ -6161,31 +5891,17 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-date-object": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
- "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
- "dev": true,
- "dependencies": {
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/is-docker": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
- "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz",
+ "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==",
"dev": true,
+ "license": "MIT",
"bin": {
"is-docker": "cli.js"
},
"engines": {
- "node": ">=8"
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
@@ -6230,51 +5946,31 @@
"node": ">=0.10.0"
}
},
- "node_modules/is-installed-globally": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz",
- "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==",
+ "node_modules/is-inside-container": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz",
+ "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "global-dirs": "^3.0.0",
- "is-path-inside": "^3.0.2"
+ "is-docker": "^3.0.0"
+ },
+ "bin": {
+ "is-inside-container": "cli.js"
},
"engines": {
- "node": ">=10"
+ "node": ">=14.16"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/is-installed-globally/node_modules/global-dirs": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz",
- "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==",
- "dev": true,
- "dependencies": {
- "ini": "2.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/is-installed-globally/node_modules/ini": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
- "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
- "dev": true,
- "engines": {
- "node": ">=10"
- }
- },
"node_modules/is-interactive": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz",
"integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=12"
},
@@ -6282,39 +5978,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/is-map": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz",
- "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-negative-zero": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
- "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-npm": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz",
- "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==",
- "dev": true,
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
@@ -6324,21 +5987,6 @@
"node": ">=0.12.0"
}
},
- "node_modules/is-number-object": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
- "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
- "dev": true,
- "dependencies": {
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/is-obj": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
@@ -6374,48 +6022,12 @@
"node": ">=0.10.0"
}
},
- "node_modules/is-regex": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
- "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-set": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz",
- "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-shared-array-buffer": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
- "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/is-ssh": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz",
- "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==",
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.1.tgz",
+ "integrity": "sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"protocols": "^2.0.1"
}
@@ -6432,36 +6044,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/is-string": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
- "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
- "dev": true,
- "dependencies": {
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-symbol": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
- "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
- "dev": true,
- "dependencies": {
- "has-symbols": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/is-text-path": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz",
@@ -6474,88 +6056,58 @@
"node": ">=0.10.0"
}
},
- "node_modules/is-typed-array": {
- "version": "1.1.10",
- "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz",
- "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==",
- "dev": true,
- "dependencies": {
- "available-typed-arrays": "^1.0.5",
- "call-bind": "^1.0.2",
- "for-each": "^0.3.3",
- "gopd": "^1.0.1",
- "has-tostringtag": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
- "dev": true
- },
"node_modules/is-unicode-supported": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz",
- "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz",
+ "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": ">=12"
+ "node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/is-weakref": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
- "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
+ "node_modules/is-wsl": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz",
+ "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2"
+ "is-inside-container": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=16"
},
"funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/is-wsl": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
- "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
- "dev": true,
- "dependencies": {
- "is-docker": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-yarn-global": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz",
- "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==",
- "dev": true,
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/isarray": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
- "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
- "dev": true
- },
"node_modules/isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
"dev": true
},
+ "node_modules/issue-parser": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-7.0.1.tgz",
+ "integrity": "sha512-3YZcUUR2Wt1WsapF+S/WiA2WmlW0cWAoPccMqne7AxEBhCdFeTPjfv/Axb8V2gyCgY3nRw+ksZ3xSUX+R47iAg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "lodash.capitalize": "^4.2.1",
+ "lodash.escaperegexp": "^4.1.2",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.isstring": "^4.0.1",
+ "lodash.uniqby": "^4.7.0"
+ },
+ "engines": {
+ "node": "^18.17 || >=20.6.1"
+ }
+ },
"node_modules/istanbul-lib-coverage": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz",
@@ -6582,9 +6134,9 @@
}
},
"node_modules/istanbul-lib-instrument/node_modules/semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true,
"bin": {
"semver": "bin/semver.js"
@@ -6631,38 +6183,16 @@
"node": ">=8"
}
},
- "node_modules/iterate-iterator": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.2.tgz",
- "integrity": "sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/iterate-value": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz",
- "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==",
- "dev": true,
- "dependencies": {
- "es-get-iterator": "^1.0.2",
- "iterate-iterator": "^1.0.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/jest": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/jest/-/jest-29.3.1.tgz",
- "integrity": "sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz",
+ "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==",
"dev": true,
"dependencies": {
- "@jest/core": "^29.3.1",
- "@jest/types": "^29.3.1",
+ "@jest/core": "^29.5.0",
+ "@jest/types": "^29.5.0",
"import-local": "^3.0.2",
- "jest-cli": "^29.3.1"
+ "jest-cli": "^29.5.0"
},
"bin": {
"jest": "bin/jest.js"
@@ -6680,9 +6210,9 @@
}
},
"node_modules/jest-changed-files": {
- "version": "29.2.0",
- "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.2.0.tgz",
- "integrity": "sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz",
+ "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==",
"dev": true,
"dependencies": {
"execa": "^5.0.0",
@@ -6693,28 +6223,29 @@
}
},
"node_modules/jest-circus": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.3.1.tgz",
- "integrity": "sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.5.0.tgz",
+ "integrity": "sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==",
"dev": true,
"dependencies": {
- "@jest/environment": "^29.3.1",
- "@jest/expect": "^29.3.1",
- "@jest/test-result": "^29.3.1",
- "@jest/types": "^29.3.1",
+ "@jest/environment": "^29.5.0",
+ "@jest/expect": "^29.5.0",
+ "@jest/test-result": "^29.5.0",
+ "@jest/types": "^29.5.0",
"@types/node": "*",
"chalk": "^4.0.0",
"co": "^4.6.0",
"dedent": "^0.7.0",
"is-generator-fn": "^2.0.0",
- "jest-each": "^29.3.1",
- "jest-matcher-utils": "^29.3.1",
- "jest-message-util": "^29.3.1",
- "jest-runtime": "^29.3.1",
- "jest-snapshot": "^29.3.1",
- "jest-util": "^29.3.1",
+ "jest-each": "^29.5.0",
+ "jest-matcher-utils": "^29.5.0",
+ "jest-message-util": "^29.5.0",
+ "jest-runtime": "^29.5.0",
+ "jest-snapshot": "^29.5.0",
+ "jest-util": "^29.5.0",
"p-limit": "^3.1.0",
- "pretty-format": "^29.3.1",
+ "pretty-format": "^29.5.0",
+ "pure-rand": "^6.0.0",
"slash": "^3.0.0",
"stack-utils": "^2.0.3"
},
@@ -6723,21 +6254,21 @@
}
},
"node_modules/jest-cli": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.3.1.tgz",
- "integrity": "sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.5.0.tgz",
+ "integrity": "sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==",
"dev": true,
"dependencies": {
- "@jest/core": "^29.3.1",
- "@jest/test-result": "^29.3.1",
- "@jest/types": "^29.3.1",
+ "@jest/core": "^29.5.0",
+ "@jest/test-result": "^29.5.0",
+ "@jest/types": "^29.5.0",
"chalk": "^4.0.0",
"exit": "^0.1.2",
"graceful-fs": "^4.2.9",
"import-local": "^3.0.2",
- "jest-config": "^29.3.1",
- "jest-util": "^29.3.1",
- "jest-validate": "^29.3.1",
+ "jest-config": "^29.5.0",
+ "jest-util": "^29.5.0",
+ "jest-validate": "^29.5.0",
"prompts": "^2.0.1",
"yargs": "^17.3.1"
},
@@ -6757,31 +6288,31 @@
}
},
"node_modules/jest-config": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.3.1.tgz",
- "integrity": "sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.5.0.tgz",
+ "integrity": "sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==",
"dev": true,
"dependencies": {
"@babel/core": "^7.11.6",
- "@jest/test-sequencer": "^29.3.1",
- "@jest/types": "^29.3.1",
- "babel-jest": "^29.3.1",
+ "@jest/test-sequencer": "^29.5.0",
+ "@jest/types": "^29.5.0",
+ "babel-jest": "^29.5.0",
"chalk": "^4.0.0",
"ci-info": "^3.2.0",
"deepmerge": "^4.2.2",
"glob": "^7.1.3",
"graceful-fs": "^4.2.9",
- "jest-circus": "^29.3.1",
- "jest-environment-node": "^29.3.1",
- "jest-get-type": "^29.2.0",
- "jest-regex-util": "^29.2.0",
- "jest-resolve": "^29.3.1",
- "jest-runner": "^29.3.1",
- "jest-util": "^29.3.1",
- "jest-validate": "^29.3.1",
+ "jest-circus": "^29.5.0",
+ "jest-environment-node": "^29.5.0",
+ "jest-get-type": "^29.4.3",
+ "jest-regex-util": "^29.4.3",
+ "jest-resolve": "^29.5.0",
+ "jest-runner": "^29.5.0",
+ "jest-util": "^29.5.0",
+ "jest-validate": "^29.5.0",
"micromatch": "^4.0.4",
"parse-json": "^5.2.0",
- "pretty-format": "^29.3.1",
+ "pretty-format": "^29.5.0",
"slash": "^3.0.0",
"strip-json-comments": "^3.1.1"
},
@@ -6802,24 +6333,24 @@
}
},
"node_modules/jest-diff": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.3.1.tgz",
- "integrity": "sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz",
+ "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==",
"dev": true,
"dependencies": {
"chalk": "^4.0.0",
- "diff-sequences": "^29.3.1",
- "jest-get-type": "^29.2.0",
- "pretty-format": "^29.3.1"
+ "diff-sequences": "^29.4.3",
+ "jest-get-type": "^29.4.3",
+ "pretty-format": "^29.5.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-docblock": {
- "version": "29.2.0",
- "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.2.0.tgz",
- "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==",
+ "version": "29.4.3",
+ "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz",
+ "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==",
"dev": true,
"dependencies": {
"detect-newline": "^3.0.0"
@@ -6829,62 +6360,62 @@
}
},
"node_modules/jest-each": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.3.1.tgz",
- "integrity": "sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.5.0.tgz",
+ "integrity": "sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==",
"dev": true,
"dependencies": {
- "@jest/types": "^29.3.1",
+ "@jest/types": "^29.5.0",
"chalk": "^4.0.0",
- "jest-get-type": "^29.2.0",
- "jest-util": "^29.3.1",
- "pretty-format": "^29.3.1"
+ "jest-get-type": "^29.4.3",
+ "jest-util": "^29.5.0",
+ "pretty-format": "^29.5.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-environment-node": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.3.1.tgz",
- "integrity": "sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz",
+ "integrity": "sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==",
"dev": true,
"dependencies": {
- "@jest/environment": "^29.3.1",
- "@jest/fake-timers": "^29.3.1",
- "@jest/types": "^29.3.1",
+ "@jest/environment": "^29.5.0",
+ "@jest/fake-timers": "^29.5.0",
+ "@jest/types": "^29.5.0",
"@types/node": "*",
- "jest-mock": "^29.3.1",
- "jest-util": "^29.3.1"
+ "jest-mock": "^29.5.0",
+ "jest-util": "^29.5.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-get-type": {
- "version": "29.2.0",
- "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz",
- "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==",
+ "version": "29.4.3",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz",
+ "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==",
"dev": true,
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-haste-map": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.3.1.tgz",
- "integrity": "sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.5.0.tgz",
+ "integrity": "sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==",
"dev": true,
"dependencies": {
- "@jest/types": "^29.3.1",
+ "@jest/types": "^29.5.0",
"@types/graceful-fs": "^4.1.3",
"@types/node": "*",
"anymatch": "^3.0.3",
"fb-watchman": "^2.0.0",
"graceful-fs": "^4.2.9",
- "jest-regex-util": "^29.2.0",
- "jest-util": "^29.3.1",
- "jest-worker": "^29.3.1",
+ "jest-regex-util": "^29.4.3",
+ "jest-util": "^29.5.0",
+ "jest-worker": "^29.5.0",
"micromatch": "^4.0.4",
"walker": "^1.0.8"
},
@@ -6896,46 +6427,46 @@
}
},
"node_modules/jest-leak-detector": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.3.1.tgz",
- "integrity": "sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz",
+ "integrity": "sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==",
"dev": true,
"dependencies": {
- "jest-get-type": "^29.2.0",
- "pretty-format": "^29.3.1"
+ "jest-get-type": "^29.4.3",
+ "pretty-format": "^29.5.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-matcher-utils": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz",
- "integrity": "sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz",
+ "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==",
"dev": true,
"dependencies": {
"chalk": "^4.0.0",
- "jest-diff": "^29.3.1",
- "jest-get-type": "^29.2.0",
- "pretty-format": "^29.3.1"
+ "jest-diff": "^29.5.0",
+ "jest-get-type": "^29.4.3",
+ "pretty-format": "^29.5.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-message-util": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz",
- "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz",
+ "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==",
"dev": true,
"dependencies": {
"@babel/code-frame": "^7.12.13",
- "@jest/types": "^29.3.1",
+ "@jest/types": "^29.5.0",
"@types/stack-utils": "^2.0.0",
"chalk": "^4.0.0",
"graceful-fs": "^4.2.9",
"micromatch": "^4.0.4",
- "pretty-format": "^29.3.1",
+ "pretty-format": "^29.5.0",
"slash": "^3.0.0",
"stack-utils": "^2.0.3"
},
@@ -6944,14 +6475,14 @@
}
},
"node_modules/jest-mock": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.3.1.tgz",
- "integrity": "sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz",
+ "integrity": "sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==",
"dev": true,
"dependencies": {
- "@jest/types": "^29.3.1",
+ "@jest/types": "^29.5.0",
"@types/node": "*",
- "jest-util": "^29.3.1"
+ "jest-util": "^29.5.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
@@ -6975,28 +6506,28 @@
}
},
"node_modules/jest-regex-util": {
- "version": "29.2.0",
- "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.2.0.tgz",
- "integrity": "sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==",
+ "version": "29.4.3",
+ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz",
+ "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==",
"dev": true,
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-resolve": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.3.1.tgz",
- "integrity": "sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.5.0.tgz",
+ "integrity": "sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==",
"dev": true,
"dependencies": {
"chalk": "^4.0.0",
"graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.3.1",
+ "jest-haste-map": "^29.5.0",
"jest-pnp-resolver": "^1.2.2",
- "jest-util": "^29.3.1",
- "jest-validate": "^29.3.1",
+ "jest-util": "^29.5.0",
+ "jest-validate": "^29.5.0",
"resolve": "^1.20.0",
- "resolve.exports": "^1.1.0",
+ "resolve.exports": "^2.0.0",
"slash": "^3.0.0"
},
"engines": {
@@ -7004,43 +6535,43 @@
}
},
"node_modules/jest-resolve-dependencies": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.3.1.tgz",
- "integrity": "sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz",
+ "integrity": "sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==",
"dev": true,
"dependencies": {
- "jest-regex-util": "^29.2.0",
- "jest-snapshot": "^29.3.1"
+ "jest-regex-util": "^29.4.3",
+ "jest-snapshot": "^29.5.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/jest-runner": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.3.1.tgz",
- "integrity": "sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.5.0.tgz",
+ "integrity": "sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==",
"dev": true,
"dependencies": {
- "@jest/console": "^29.3.1",
- "@jest/environment": "^29.3.1",
- "@jest/test-result": "^29.3.1",
- "@jest/transform": "^29.3.1",
- "@jest/types": "^29.3.1",
+ "@jest/console": "^29.5.0",
+ "@jest/environment": "^29.5.0",
+ "@jest/test-result": "^29.5.0",
+ "@jest/transform": "^29.5.0",
+ "@jest/types": "^29.5.0",
"@types/node": "*",
"chalk": "^4.0.0",
"emittery": "^0.13.1",
"graceful-fs": "^4.2.9",
- "jest-docblock": "^29.2.0",
- "jest-environment-node": "^29.3.1",
- "jest-haste-map": "^29.3.1",
- "jest-leak-detector": "^29.3.1",
- "jest-message-util": "^29.3.1",
- "jest-resolve": "^29.3.1",
- "jest-runtime": "^29.3.1",
- "jest-util": "^29.3.1",
- "jest-watcher": "^29.3.1",
- "jest-worker": "^29.3.1",
+ "jest-docblock": "^29.4.3",
+ "jest-environment-node": "^29.5.0",
+ "jest-haste-map": "^29.5.0",
+ "jest-leak-detector": "^29.5.0",
+ "jest-message-util": "^29.5.0",
+ "jest-resolve": "^29.5.0",
+ "jest-runtime": "^29.5.0",
+ "jest-util": "^29.5.0",
+ "jest-watcher": "^29.5.0",
+ "jest-worker": "^29.5.0",
"p-limit": "^3.1.0",
"source-map-support": "0.5.13"
},
@@ -7049,31 +6580,31 @@
}
},
"node_modules/jest-runtime": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.3.1.tgz",
- "integrity": "sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.5.0.tgz",
+ "integrity": "sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==",
"dev": true,
"dependencies": {
- "@jest/environment": "^29.3.1",
- "@jest/fake-timers": "^29.3.1",
- "@jest/globals": "^29.3.1",
- "@jest/source-map": "^29.2.0",
- "@jest/test-result": "^29.3.1",
- "@jest/transform": "^29.3.1",
- "@jest/types": "^29.3.1",
+ "@jest/environment": "^29.5.0",
+ "@jest/fake-timers": "^29.5.0",
+ "@jest/globals": "^29.5.0",
+ "@jest/source-map": "^29.4.3",
+ "@jest/test-result": "^29.5.0",
+ "@jest/transform": "^29.5.0",
+ "@jest/types": "^29.5.0",
"@types/node": "*",
"chalk": "^4.0.0",
"cjs-module-lexer": "^1.0.0",
"collect-v8-coverage": "^1.0.0",
"glob": "^7.1.3",
"graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.3.1",
- "jest-message-util": "^29.3.1",
- "jest-mock": "^29.3.1",
- "jest-regex-util": "^29.2.0",
- "jest-resolve": "^29.3.1",
- "jest-snapshot": "^29.3.1",
- "jest-util": "^29.3.1",
+ "jest-haste-map": "^29.5.0",
+ "jest-message-util": "^29.5.0",
+ "jest-mock": "^29.5.0",
+ "jest-regex-util": "^29.4.3",
+ "jest-resolve": "^29.5.0",
+ "jest-snapshot": "^29.5.0",
+ "jest-util": "^29.5.0",
"slash": "^3.0.0",
"strip-bom": "^4.0.0"
},
@@ -7082,9 +6613,9 @@
}
},
"node_modules/jest-snapshot": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.3.1.tgz",
- "integrity": "sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz",
+ "integrity": "sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==",
"dev": true,
"dependencies": {
"@babel/core": "^7.11.6",
@@ -7093,23 +6624,22 @@
"@babel/plugin-syntax-typescript": "^7.7.2",
"@babel/traverse": "^7.7.2",
"@babel/types": "^7.3.3",
- "@jest/expect-utils": "^29.3.1",
- "@jest/transform": "^29.3.1",
- "@jest/types": "^29.3.1",
+ "@jest/expect-utils": "^29.5.0",
+ "@jest/transform": "^29.5.0",
+ "@jest/types": "^29.5.0",
"@types/babel__traverse": "^7.0.6",
"@types/prettier": "^2.1.5",
"babel-preset-current-node-syntax": "^1.0.0",
"chalk": "^4.0.0",
- "expect": "^29.3.1",
+ "expect": "^29.5.0",
"graceful-fs": "^4.2.9",
- "jest-diff": "^29.3.1",
- "jest-get-type": "^29.2.0",
- "jest-haste-map": "^29.3.1",
- "jest-matcher-utils": "^29.3.1",
- "jest-message-util": "^29.3.1",
- "jest-util": "^29.3.1",
+ "jest-diff": "^29.5.0",
+ "jest-get-type": "^29.4.3",
+ "jest-matcher-utils": "^29.5.0",
+ "jest-message-util": "^29.5.0",
+ "jest-util": "^29.5.0",
"natural-compare": "^1.4.0",
- "pretty-format": "^29.3.1",
+ "pretty-format": "^29.5.0",
"semver": "^7.3.5"
},
"engines": {
@@ -7129,12 +6659,12 @@
}
},
"node_modules/jest-util": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz",
- "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz",
+ "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==",
"dev": true,
"dependencies": {
- "@jest/types": "^29.3.1",
+ "@jest/types": "^29.5.0",
"@types/node": "*",
"chalk": "^4.0.0",
"ci-info": "^3.2.0",
@@ -7146,17 +6676,17 @@
}
},
"node_modules/jest-validate": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.3.1.tgz",
- "integrity": "sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.5.0.tgz",
+ "integrity": "sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==",
"dev": true,
"dependencies": {
- "@jest/types": "^29.3.1",
+ "@jest/types": "^29.5.0",
"camelcase": "^6.2.0",
"chalk": "^4.0.0",
- "jest-get-type": "^29.2.0",
+ "jest-get-type": "^29.4.3",
"leven": "^3.1.0",
- "pretty-format": "^29.3.1"
+ "pretty-format": "^29.5.0"
},
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
@@ -7175,18 +6705,18 @@
}
},
"node_modules/jest-watcher": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.3.1.tgz",
- "integrity": "sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz",
+ "integrity": "sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==",
"dev": true,
"dependencies": {
- "@jest/test-result": "^29.3.1",
- "@jest/types": "^29.3.1",
+ "@jest/test-result": "^29.5.0",
+ "@jest/types": "^29.5.0",
"@types/node": "*",
"ansi-escapes": "^4.2.1",
"chalk": "^4.0.0",
"emittery": "^0.13.1",
- "jest-util": "^29.3.1",
+ "jest-util": "^29.5.0",
"string-length": "^4.0.1"
},
"engines": {
@@ -7194,13 +6724,13 @@
}
},
"node_modules/jest-worker": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.3.1.tgz",
- "integrity": "sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz",
+ "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==",
"dev": true,
"dependencies": {
"@types/node": "*",
- "jest-util": "^29.3.1",
+ "jest-util": "^29.5.0",
"merge-stream": "^2.0.0",
"supports-color": "^8.0.0"
},
@@ -7223,6 +6753,16 @@
"url": "https://github.com/chalk/supports-color?sponsor=1"
}
},
+ "node_modules/jiti": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz",
+ "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jiti": "lib/jiti-cli.mjs"
+ }
+ },
"node_modules/js-sdsl": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz",
@@ -7251,6 +6791,13 @@
"js-yaml": "bin/js-yaml.js"
}
},
+ "node_modules/jsbn": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz",
+ "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/jsesc": {
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
@@ -7263,18 +6810,6 @@
"node": ">=4"
}
},
- "node_modules/json-buffer": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
- "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
- "dev": true
- },
- "node_modules/json-parse-better-errors": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
- "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
- "dev": true
- },
"node_modules/json-parse-even-better-errors": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
@@ -7347,15 +6882,6 @@
"node": "*"
}
},
- "node_modules/keyv": {
- "version": "4.5.2",
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz",
- "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==",
- "dev": true,
- "dependencies": {
- "json-buffer": "3.0.1"
- }
- },
"node_modules/kind-of": {
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
@@ -7374,21 +6900,6 @@
"node": ">=6"
}
},
- "node_modules/latest-version": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz",
- "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==",
- "dev": true,
- "dependencies": {
- "package-json": "^8.1.0"
- },
- "engines": {
- "node": ">=14.16"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/leven": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
@@ -7417,52 +6928,6 @@
"integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
"dev": true
},
- "node_modules/load-json-file": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
- "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==",
- "dev": true,
- "dependencies": {
- "graceful-fs": "^4.1.2",
- "parse-json": "^4.0.0",
- "pify": "^3.0.0",
- "strip-bom": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/load-json-file/node_modules/parse-json": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
- "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==",
- "dev": true,
- "dependencies": {
- "error-ex": "^1.3.1",
- "json-parse-better-errors": "^1.0.1"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/load-json-file/node_modules/pify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
- "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/load-json-file/node_modules/strip-bom": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/locate-path": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
@@ -7490,24 +6955,47 @@
"integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==",
"dev": true
},
+ "node_modules/lodash.capitalize": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz",
+ "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.escaperegexp": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz",
+ "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/lodash.get": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
+ "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==",
+ "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/lodash.isfunction": {
"version": "3.0.9",
"resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz",
"integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==",
"dev": true
},
- "node_modules/lodash.ismatch": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz",
- "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==",
- "dev": true
- },
"node_modules/lodash.isplainobject": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
"integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
"dev": true
},
+ "node_modules/lodash.isstring": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
+ "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/lodash.kebabcase": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz",
@@ -7550,6 +7038,13 @@
"integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==",
"dev": true
},
+ "node_modules/lodash.uniqby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz",
+ "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/lodash.upperfirst": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz",
@@ -7557,26 +7052,28 @@
"dev": true
},
"node_modules/log-symbols": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz",
- "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==",
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz",
+ "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "chalk": "^5.0.0",
- "is-unicode-supported": "^1.1.0"
+ "chalk": "^5.3.0",
+ "is-unicode-supported": "^1.3.0"
},
"engines": {
- "node": ">=12"
+ "node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/log-symbols/node_modules/chalk": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz",
- "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==",
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz",
+ "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": "^12.17.0 || ^14.13 || >=16.0.0"
},
@@ -7584,13 +7081,14 @@
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
- "node_modules/lowercase-keys": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz",
- "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==",
+ "node_modules/log-symbols/node_modules/is-unicode-supported": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz",
+ "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ "node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
@@ -7609,10 +7107,11 @@
}
},
"node_modules/macos-release": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-3.1.0.tgz",
- "integrity": "sha512-/M/R0gCDgM+Cv1IuBG1XGdfTFnMEG6PZeT+KGWHO/OG+imqmaD9CH5vHBTycEM3+Kc4uG2Il+tFAuUWLqQOeUA==",
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-3.3.0.tgz",
+ "integrity": "sha512-tPJQ1HeyiU2vRruNGhZ+VleWuMQRro8iFtJxYgnS4NQe+EukKF6aGiIT+7flZhISAt2iaXBCfFGvAyif7/f8nQ==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
@@ -7636,9 +7135,9 @@
}
},
"node_modules/make-dir/node_modules/semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true,
"bin": {
"semver": "bin/semver.js"
@@ -7671,6 +7170,15 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
@@ -7727,10 +7235,13 @@
}
},
"node_modules/merge-descriptors": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
- "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==",
- "dev": true
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
+ "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
},
"node_modules/merge-stream": {
"version": "2.0.0",
@@ -7757,12 +7268,12 @@
}
},
"node_modules/micromatch": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
- "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
"dev": true,
"dependencies": {
- "braces": "^3.0.2",
+ "braces": "^3.0.3",
"picomatch": "^2.3.1"
},
"engines": {
@@ -7785,7 +7296,6 @@
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
- "dev": true,
"engines": {
"node": ">= 0.6"
}
@@ -7794,7 +7304,6 @@
"version": "2.1.35",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
- "dev": true,
"dependencies": {
"mime-db": "1.52.0"
},
@@ -7811,13 +7320,14 @@
"node": ">=6"
}
},
- "node_modules/mimic-response": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz",
- "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==",
+ "node_modules/mimic-function": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz",
+ "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==",
"dev": true,
+ "license": "MIT",
"engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ "node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
@@ -7867,25 +7377,20 @@
"node": ">= 6"
}
},
- "node_modules/modify-values": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz",
- "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
},
"node_modules/mute-stream": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
- "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
- "dev": true
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz",
+ "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
},
"node_modules/mylas": {
"version": "2.1.13",
@@ -7925,13 +7430,15 @@
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/netmask": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz",
"integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 0.4.0"
}
@@ -7941,6 +7448,7 @@
"resolved": "https://registry.npmjs.org/new-github-release-url/-/new-github-release-url-2.0.0.tgz",
"integrity": "sha512-NHDDGYudnvRutt/VhKFlX26IotXe1w0cmkDm6JGquh5bz/bDTw0LufSmH/GxTjEdpHEO+bVKFTwdrcGa/9XlKQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"type-fest": "^2.5.1"
},
@@ -7956,6 +7464,7 @@
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
"integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==",
"dev": true,
+ "license": "(MIT OR CC0-1.0)",
"engines": {
"node": ">=12.20"
},
@@ -7978,25 +7487,6 @@
"node": ">= 10.13"
}
},
- "node_modules/node-domexception": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
- "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/jimmywarting"
- },
- {
- "type": "github",
- "url": "https://paypal.me/jimmywarting"
- }
- ],
- "engines": {
- "node": ">=10.5.0"
- }
- },
"node_modules/node-fetch": {
"version": "2.6.7",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
@@ -8016,6 +7506,13 @@
}
}
},
+ "node_modules/node-fetch-native": {
+ "version": "1.6.6",
+ "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.6.tgz",
+ "integrity": "sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/node-int64": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
@@ -8023,9 +7520,9 @@
"dev": true
},
"node_modules/node-releases": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz",
- "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==",
+ "version": "2.0.12",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz",
+ "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==",
"dev": true
},
"node_modules/normalize-package-data": {
@@ -8052,18 +7549,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/normalize-url": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz",
- "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==",
- "dev": true,
- "engines": {
- "node": ">=14.16"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/npm-run-path": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
@@ -8076,35 +7561,38 @@
"node": ">=8"
}
},
- "node_modules/object-inspect": {
- "version": "1.12.2",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
- "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==",
- "dev": true,
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/object-keys": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
- "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
- "dev": true,
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/object.assign": {
- "version": "4.1.4",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz",
- "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==",
+ "node_modules/nypm": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.0.tgz",
+ "integrity": "sha512-mn8wBFV9G9+UFHIrq+pZ2r2zL4aPau/by3kJb3cM7+5tQHMt6HGQB8FDIeKFYp8o0D2pnH6nVsO88N4AmUxIWg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "has-symbols": "^1.0.3",
- "object-keys": "^1.1.1"
+ "citty": "^0.1.6",
+ "consola": "^3.4.0",
+ "pathe": "^2.0.3",
+ "pkg-types": "^2.0.0",
+ "tinyexec": "^0.3.2"
},
+ "bin": {
+ "nypm": "dist/cli.mjs"
+ },
+ "engines": {
+ "node": "^14.16.0 || >=16.10.0"
+ }
+ },
+ "node_modules/nypm/node_modules/tinyexec": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz",
+ "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+ "dev": true,
"engines": {
"node": ">= 0.4"
},
@@ -8112,6 +7600,13 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/ohash": {
+ "version": "2.0.11",
+ "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz",
+ "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/on-finished": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
@@ -8148,67 +7643,71 @@
}
},
"node_modules/open": {
- "version": "8.4.0",
- "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz",
- "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==",
+ "version": "10.1.2",
+ "resolved": "https://registry.npmjs.org/open/-/open-10.1.2.tgz",
+ "integrity": "sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "define-lazy-prop": "^2.0.0",
- "is-docker": "^2.1.1",
- "is-wsl": "^2.2.0"
+ "default-browser": "^5.2.1",
+ "define-lazy-prop": "^3.0.0",
+ "is-inside-container": "^1.0.0",
+ "is-wsl": "^3.1.0"
},
"engines": {
- "node": ">=12"
+ "node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/optionator": {
- "version": "0.9.1",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
- "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+ "version": "0.9.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
+ "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
"dev": true,
"dependencies": {
+ "@aashutoshrathi/word-wrap": "^1.2.3",
"deep-is": "^0.1.3",
"fast-levenshtein": "^2.0.6",
"levn": "^0.4.1",
"prelude-ls": "^1.2.1",
- "type-check": "^0.4.0",
- "word-wrap": "^1.2.3"
+ "type-check": "^0.4.0"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/ora": {
- "version": "6.1.2",
- "resolved": "https://registry.npmjs.org/ora/-/ora-6.1.2.tgz",
- "integrity": "sha512-EJQ3NiP5Xo94wJXIzAyOtSb0QEIAUu7m8t6UZ9krbz0vAJqr92JpcK/lEXg91q6B9pEGqrykkd2EQplnifDSBw==",
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz",
+ "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "bl": "^5.0.0",
- "chalk": "^5.0.0",
- "cli-cursor": "^4.0.0",
- "cli-spinners": "^2.6.1",
+ "chalk": "^5.3.0",
+ "cli-cursor": "^5.0.0",
+ "cli-spinners": "^2.9.2",
"is-interactive": "^2.0.0",
- "is-unicode-supported": "^1.1.0",
- "log-symbols": "^5.1.0",
- "strip-ansi": "^7.0.1",
- "wcwidth": "^1.0.1"
+ "is-unicode-supported": "^2.0.0",
+ "log-symbols": "^6.0.0",
+ "stdin-discarder": "^0.2.2",
+ "string-width": "^7.2.0",
+ "strip-ansi": "^7.1.0"
},
"engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ "node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/ora/node_modules/ansi-regex": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
- "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=12"
},
@@ -8217,10 +7716,11 @@
}
},
"node_modules/ora/node_modules/chalk": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz",
- "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==",
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz",
+ "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": "^12.17.0 || ^14.13 || >=16.0.0"
},
@@ -8228,11 +7728,37 @@
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
- "node_modules/ora/node_modules/strip-ansi": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz",
- "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==",
+ "node_modules/ora/node_modules/emoji-regex": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz",
+ "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==",
"dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ora/node_modules/string-width": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
+ "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^10.3.0",
+ "get-east-asian-width": "^1.0.0",
+ "strip-ansi": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ora/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dev": true,
+ "license": "MIT",
"dependencies": {
"ansi-regex": "^6.0.1"
},
@@ -8244,16 +7770,17 @@
}
},
"node_modules/os-name": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/os-name/-/os-name-5.0.1.tgz",
- "integrity": "sha512-0EQpaHUHq7olp2/YFUr+0vZi9tMpDTblHGz+Ch5RntKxiRXOAY0JOz1UlxhSjMSksHvkm13eD6elJj3M8Ht/kw==",
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/os-name/-/os-name-6.0.0.tgz",
+ "integrity": "sha512-bv608E0UX86atYi2GMGjDe0vF/X1TJjemNS8oEW6z22YW1Rc3QykSYoGfkQbX0zZX9H0ZB6CQP/3GTf1I5hURg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "macos-release": "^3.0.1",
- "windows-release": "^5.0.1"
+ "macos-release": "^3.2.0",
+ "windows-release": "^6.0.0"
},
"engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ "node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
@@ -8264,19 +7791,11 @@
"resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
"integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
- "node_modules/p-cancelable": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz",
- "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==",
- "dev": true,
- "engines": {
- "node": ">=12.20"
- }
- },
"node_modules/p-limit": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
@@ -8317,55 +7836,37 @@
}
},
"node_modules/pac-proxy-agent": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz",
- "integrity": "sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz",
+ "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "@tootallnate/once": "1",
- "agent-base": "6",
- "debug": "4",
- "get-uri": "3",
- "http-proxy-agent": "^4.0.1",
- "https-proxy-agent": "5",
- "pac-resolver": "^5.0.0",
- "raw-body": "^2.2.0",
- "socks-proxy-agent": "5"
+ "@tootallnate/quickjs-emscripten": "^0.23.0",
+ "agent-base": "^7.1.2",
+ "debug": "^4.3.4",
+ "get-uri": "^6.0.1",
+ "http-proxy-agent": "^7.0.0",
+ "https-proxy-agent": "^7.0.6",
+ "pac-resolver": "^7.0.1",
+ "socks-proxy-agent": "^8.0.5"
},
"engines": {
- "node": ">= 8"
+ "node": ">= 14"
}
},
"node_modules/pac-resolver": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.1.tgz",
- "integrity": "sha512-cy7u00ko2KVgBAjuhevqpPeHIkCIqPe1v24cydhWjmeuzaBfmUWFCZJ1iAh5TuVzVZoUzXIW7K8sMYOZ84uZ9Q==",
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz",
+ "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "degenerator": "^3.0.2",
- "ip": "^1.1.5",
+ "degenerator": "^5.0.0",
"netmask": "^2.0.2"
},
"engines": {
- "node": ">= 8"
- }
- },
- "node_modules/package-json": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.0.tgz",
- "integrity": "sha512-hySwcV8RAWeAfPsXb9/HGSPn8lwDnv6fabH+obUZKX169QknRkRhPxd1yMubpKDskLFATkl3jHpNtVtDPFA0Wg==",
- "dev": true,
- "dependencies": {
- "got": "^12.1.0",
- "registry-auth-token": "^5.0.1",
- "registry-url": "^6.0.0",
- "semver": "^7.3.7"
- },
- "engines": {
- "node": ">=14.16"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">= 14"
}
},
"node_modules/parent-module": {
@@ -8399,21 +7900,27 @@
}
},
"node_modules/parse-path": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz",
- "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==",
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.1.0.tgz",
+ "integrity": "sha512-EuCycjZtfPcjWk7KTksnJ5xPMvWGA/6i4zrLYhRG0hGvC3GPU/jGUj3Cy+ZR0v30duV3e23R95T1lE2+lsndSw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"protocols": "^2.0.0"
}
},
"node_modules/parse-url": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz",
- "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==",
+ "version": "9.2.0",
+ "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-9.2.0.tgz",
+ "integrity": "sha512-bCgsFI+GeGWPAvAiUv63ZorMeif3/U0zaXABGJbOWt5OH2KCaPHF6S+0ok4aqM9RuIPGyZdx9tR9l13PsW4AYQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
+ "@types/parse-path": "^7.0.0",
"parse-path": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=14.13.0"
}
},
"node_modules/parseurl": {
@@ -8459,9 +7966,9 @@
"dev": true
},
"node_modules/path-to-regexp": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
- "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==",
+ "version": "0.1.12",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
+ "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==",
"dev": true
},
"node_modules/path-type": {
@@ -8473,6 +7980,20 @@
"node": ">=8"
}
},
+ "node_modules/pathe": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
+ "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/perfect-debounce": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz",
+ "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/picocolors": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
@@ -8491,19 +8012,10 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
- "node_modules/pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/pirates": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz",
- "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==",
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
+ "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
"dev": true,
"engines": {
"node": ">= 6"
@@ -8573,6 +8085,18 @@
"node": ">=8"
}
},
+ "node_modules/pkg-types": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.1.0.tgz",
+ "integrity": "sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "confbox": "^0.2.1",
+ "exsolve": "^1.0.1",
+ "pathe": "^2.0.3"
+ }
+ },
"node_modules/plimit-lit": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/plimit-lit/-/plimit-lit-1.5.0.tgz",
@@ -8592,12 +8116,12 @@
}
},
"node_modules/pretty-format": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz",
- "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz",
+ "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==",
"dev": true,
"dependencies": {
- "@jest/schemas": "^29.0.0",
+ "@jest/schemas": "^29.4.3",
"ansi-styles": "^5.0.0",
"react-is": "^18.0.0"
},
@@ -8617,32 +8141,6 @@
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
- "node_modules/process-nextick-args": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
- "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
- "dev": true
- },
- "node_modules/promise.allsettled": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.6.tgz",
- "integrity": "sha512-22wJUOD3zswWFqgwjNHa1965LvqTX87WPu/lreY2KSd7SVcERfuZ4GfUaOnJNnvtoIv2yXT/W00YIGMetXtFXg==",
- "dev": true,
- "dependencies": {
- "array.prototype.map": "^1.0.5",
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4",
- "get-intrinsic": "^1.1.3",
- "iterate-value": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/prompts": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
@@ -8665,17 +8163,12 @@
"node": ">= 8"
}
},
- "node_modules/proto-list": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
- "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==",
- "dev": true
- },
"node_modules/protocols": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz",
- "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==",
- "dev": true
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.2.tgz",
+ "integrity": "sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/proxy-addr": {
"version": "2.0.7",
@@ -8691,44 +8184,39 @@
}
},
"node_modules/proxy-agent": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-5.0.0.tgz",
- "integrity": "sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==",
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz",
+ "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "agent-base": "^6.0.0",
- "debug": "4",
- "http-proxy-agent": "^4.0.0",
- "https-proxy-agent": "^5.0.0",
- "lru-cache": "^5.1.1",
- "pac-proxy-agent": "^5.0.0",
- "proxy-from-env": "^1.0.0",
- "socks-proxy-agent": "^5.0.0"
+ "agent-base": "^7.1.2",
+ "debug": "^4.3.4",
+ "http-proxy-agent": "^7.0.1",
+ "https-proxy-agent": "^7.0.6",
+ "lru-cache": "^7.14.1",
+ "pac-proxy-agent": "^7.1.0",
+ "proxy-from-env": "^1.1.0",
+ "socks-proxy-agent": "^8.0.5"
},
"engines": {
- "node": ">= 8"
+ "node": ">= 14"
}
},
"node_modules/proxy-agent/node_modules/lru-cache": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
- "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "version": "7.18.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
+ "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
"dev": true,
- "dependencies": {
- "yallist": "^3.0.2"
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
}
},
- "node_modules/proxy-agent/node_modules/yallist": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
- "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
- "dev": true
- },
"node_modules/proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
- "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
- "dev": true
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
},
"node_modules/punycode": {
"version": "2.1.1",
@@ -8739,20 +8227,21 @@
"node": ">=6"
}
},
- "node_modules/pupa": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz",
- "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==",
+ "node_modules/pure-rand": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz",
+ "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==",
"dev": true,
- "dependencies": {
- "escape-goat": "^4.0.0"
- },
- "engines": {
- "node": ">=12.20"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/dubzzz"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fast-check"
+ }
+ ]
},
"node_modules/q": {
"version": "1.5.1",
@@ -8765,12 +8254,12 @@
}
},
"node_modules/qs": {
- "version": "6.11.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
- "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
+ "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
"dev": true,
"dependencies": {
- "side-channel": "^1.0.4"
+ "side-channel": "^1.0.6"
},
"engines": {
"node": ">=0.6"
@@ -8824,9 +8313,9 @@
}
},
"node_modules/raw-body": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
- "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
+ "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
"dev": true,
"dependencies": {
"bytes": "3.1.2",
@@ -8838,28 +8327,15 @@
"node": ">= 0.8"
}
},
- "node_modules/rc": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
- "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+ "node_modules/rc9": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz",
+ "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "deep-extend": "^0.6.0",
- "ini": "~1.3.0",
- "minimist": "^1.2.0",
- "strip-json-comments": "~2.0.1"
- },
- "bin": {
- "rc": "cli.js"
- }
- },
- "node_modules/rc/node_modules/strip-json-comments": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
- "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
+ "defu": "^6.1.4",
+ "destr": "^2.0.3"
}
},
"node_modules/react-is": {
@@ -8868,6 +8344,110 @@
"integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==",
"dev": true
},
+ "node_modules/read-package-up": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-11.0.0.tgz",
+ "integrity": "sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "find-up-simple": "^1.0.0",
+ "read-pkg": "^9.0.0",
+ "type-fest": "^4.6.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/read-package-up/node_modules/hosted-git-info": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz",
+ "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "lru-cache": "^10.0.1"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/read-package-up/node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/read-package-up/node_modules/normalize-package-data": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz",
+ "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "hosted-git-info": "^7.0.0",
+ "semver": "^7.3.5",
+ "validate-npm-package-license": "^3.0.4"
+ },
+ "engines": {
+ "node": "^16.14.0 || >=18.0.0"
+ }
+ },
+ "node_modules/read-package-up/node_modules/parse-json": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz",
+ "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.26.2",
+ "index-to-position": "^1.1.0",
+ "type-fest": "^4.39.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/read-package-up/node_modules/read-pkg": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz",
+ "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/normalize-package-data": "^2.4.3",
+ "normalize-package-data": "^6.0.0",
+ "parse-json": "^8.0.0",
+ "type-fest": "^4.6.0",
+ "unicorn-magic": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/read-package-up/node_modules/type-fest": {
+ "version": "4.39.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.39.1.tgz",
+ "integrity": "sha512-uW9qzd66uyHYxwyVBYiwS4Oi0qZyUqwjU+Oevr6ZogYiXt99EOYtwvzMSLw1c3lYo2HzJsep/NB23iEVEgjG/w==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/read-pkg": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
@@ -8980,9 +8560,9 @@
}
},
"node_modules/read-pkg/node_modules/semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
"dev": true,
"bin": {
"semver": "bin/semver"
@@ -9023,18 +8603,6 @@
"node": ">=8.10.0"
}
},
- "node_modules/rechoir": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
- "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==",
- "dev": true,
- "dependencies": {
- "resolve": "^1.1.6"
- },
- "engines": {
- "node": ">= 0.10"
- }
- },
"node_modules/redent": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
@@ -9048,23 +8616,6 @@
"node": ">=8"
}
},
- "node_modules/regexp.prototype.flags": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz",
- "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3",
- "functions-have-names": "^1.2.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/regexpp": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
@@ -9077,251 +8628,171 @@
"url": "https://github.com/sponsors/mysticatea"
}
},
- "node_modules/registry-auth-token": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.1.tgz",
- "integrity": "sha512-UfxVOj8seK1yaIOiieV4FIP01vfBDLsY0H9sQzi9EbbUdJiuuBjJgLa1DpImXMNPnVkBD4eVxTEXcrZA6kfpJA==",
- "dev": true,
- "dependencies": {
- "@pnpm/npm-conf": "^1.0.4"
- },
- "engines": {
- "node": ">=14"
- }
- },
- "node_modules/registry-url": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz",
- "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==",
- "dev": true,
- "dependencies": {
- "rc": "1.2.8"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/release-it": {
- "version": "15.6.0",
- "resolved": "https://registry.npmjs.org/release-it/-/release-it-15.6.0.tgz",
- "integrity": "sha512-NXewgzO8QV1LOFjn2K7/dgE1Y1cG+2JiLOU/x9X/Lq9UdFn2hTH1r9SSrufCxG+y/Rp+oN8liYTsNptKrj92kg==",
+ "version": "19.0.2",
+ "resolved": "https://registry.npmjs.org/release-it/-/release-it-19.0.2.tgz",
+ "integrity": "sha512-tGRCcKeXNOMrK9Qe+ZIgQiMlQgjV8PLxZjTq1XGlCk5u1qPgx+Pps0i8HIt667FDt0wLjFtvn5o9ItpitKnVUA==",
"dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/webpro"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpro"
+ }
+ ],
+ "license": "MIT",
"dependencies": {
- "@iarna/toml": "2.2.5",
- "@octokit/rest": "19.0.5",
+ "@nodeutils/defaults-deep": "1.1.0",
+ "@octokit/rest": "21.1.1",
+ "@phun-ky/typeof": "1.2.8",
"async-retry": "1.3.3",
- "chalk": "5.1.2",
- "cosmiconfig": "8.0.0",
- "execa": "6.1.0",
- "git-url-parse": "13.1.0",
- "globby": "13.1.2",
- "got": "12.5.3",
- "inquirer": "9.1.4",
- "is-ci": "3.0.1",
- "lodash": "4.17.21",
- "mime-types": "2.1.35",
+ "c12": "3.0.3",
+ "ci-info": "^4.2.0",
+ "eta": "3.5.0",
+ "git-url-parse": "16.1.0",
+ "inquirer": "12.6.0",
+ "issue-parser": "7.0.1",
+ "lodash.get": "4.4.2",
+ "lodash.merge": "4.6.2",
+ "mime-types": "3.0.1",
"new-github-release-url": "2.0.0",
- "node-fetch": "3.3.0",
- "open": "8.4.0",
- "ora": "6.1.2",
- "os-name": "5.0.1",
- "promise.allsettled": "1.0.6",
- "proxy-agent": "5.0.0",
- "semver": "7.3.8",
- "shelljs": "0.8.5",
- "update-notifier": "6.0.2",
+ "open": "10.1.2",
+ "ora": "8.2.0",
+ "os-name": "6.0.0",
+ "proxy-agent": "6.5.0",
+ "semver": "7.7.1",
+ "tinyexec": "1.0.1",
+ "tinyglobby": "0.2.13",
+ "undici": "6.21.2",
"url-join": "5.0.0",
- "wildcard-match": "5.1.2",
+ "wildcard-match": "5.1.4",
"yargs-parser": "21.1.1"
},
"bin": {
"release-it": "bin/release-it.js"
},
"engines": {
- "node": ">=14.9"
+ "node": "^20.12.0 || >=22.0.0"
}
},
- "node_modules/release-it/node_modules/chalk": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.1.2.tgz",
- "integrity": "sha512-E5CkT4jWURs1Vy5qGJye+XwCkNj7Od3Af7CP6SujMetSMkLs8Do2RWJK5yx1wamHV/op8Rz+9rltjaTQWDnEFQ==",
+ "node_modules/release-it/node_modules/@octokit/openapi-types": {
+ "version": "24.2.0",
+ "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz",
+ "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==",
"dev": true,
- "engines": {
- "node": "^12.17.0 || ^14.13 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
+ "license": "MIT"
},
- "node_modules/release-it/node_modules/data-uri-to-buffer": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz",
- "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==",
- "dev": true,
- "engines": {
- "node": ">= 12"
- }
- },
- "node_modules/release-it/node_modules/execa": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz",
- "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==",
+ "node_modules/release-it/node_modules/@octokit/plugin-paginate-rest": {
+ "version": "11.6.0",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.6.0.tgz",
+ "integrity": "sha512-n5KPteiF7pWKgBIBJSk8qzoZWcUkza2O6A0za97pMGVrGfPdltxrfmfF5GucHYvHGZD8BdaZmmHGz5cX/3gdpw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "cross-spawn": "^7.0.3",
- "get-stream": "^6.0.1",
- "human-signals": "^3.0.1",
- "is-stream": "^3.0.0",
- "merge-stream": "^2.0.0",
- "npm-run-path": "^5.1.0",
- "onetime": "^6.0.0",
- "signal-exit": "^3.0.7",
- "strip-final-newline": "^3.0.0"
+ "@octokit/types": "^13.10.0"
},
"engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ "node": ">= 18"
},
- "funding": {
- "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ "peerDependencies": {
+ "@octokit/core": ">=6"
}
},
- "node_modules/release-it/node_modules/globby": {
- "version": "13.1.2",
- "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz",
- "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==",
+ "node_modules/release-it/node_modules/@octokit/plugin-request-log": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-5.3.1.tgz",
+ "integrity": "sha512-n/lNeCtq+9ofhC15xzmJCNKP2BWTv8Ih2TTy+jatNCCq/gQP/V7rK3fjIfuz0pDWDALO/o/4QY4hyOF6TQQFUw==",
"dev": true,
- "dependencies": {
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.2.11",
- "ignore": "^5.2.0",
- "merge2": "^1.4.1",
- "slash": "^4.0.0"
- },
+ "license": "MIT",
"engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ "node": ">= 18"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "peerDependencies": {
+ "@octokit/core": ">=6"
}
},
- "node_modules/release-it/node_modules/human-signals": {
+ "node_modules/release-it/node_modules/@octokit/plugin-rest-endpoint-methods": {
+ "version": "13.5.0",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.5.0.tgz",
+ "integrity": "sha512-9Pas60Iv9ejO3WlAX3maE1+38c5nqbJXV5GrncEfkndIpZrJ/WPMRd2xYDcPPEt5yzpxcjw9fWNoPhsSGzqKqw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/types": "^13.10.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ },
+ "peerDependencies": {
+ "@octokit/core": ">=6"
+ }
+ },
+ "node_modules/release-it/node_modules/@octokit/rest": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-21.1.1.tgz",
+ "integrity": "sha512-sTQV7va0IUVZcntzy1q3QqPm/r8rWtDCqpRAmb8eXXnKkjoQEtFe3Nt5GTVsHft+R6jJoHeSiVLcgcvhtue/rg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/core": "^6.1.4",
+ "@octokit/plugin-paginate-rest": "^11.4.2",
+ "@octokit/plugin-request-log": "^5.3.1",
+ "@octokit/plugin-rest-endpoint-methods": "^13.3.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/release-it/node_modules/@octokit/types": {
+ "version": "13.10.0",
+ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz",
+ "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/openapi-types": "^24.2.0"
+ }
+ },
+ "node_modules/release-it/node_modules/ci-info": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.2.0.tgz",
+ "integrity": "sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/release-it/node_modules/mime-db": {
+ "version": "1.54.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/release-it/node_modules/mime-types": {
"version": "3.0.1",
- "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz",
- "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==",
- "dev": true,
- "engines": {
- "node": ">=12.20.0"
- }
- },
- "node_modules/release-it/node_modules/is-stream": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
- "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
- "dev": true,
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/release-it/node_modules/mimic-fn": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
- "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
- "dev": true,
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/release-it/node_modules/node-fetch": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.0.tgz",
- "integrity": "sha512-BKwRP/O0UvoMKp7GNdwPlObhYGB5DQqwhEDQlNKuoqwVYSxkSZCSbHjnFFmUEtwSKRPU4kNK8PbDYYitwaE3QA==",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz",
+ "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "data-uri-to-buffer": "^4.0.0",
- "fetch-blob": "^3.1.4",
- "formdata-polyfill": "^4.0.10"
+ "mime-db": "^1.54.0"
},
"engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/node-fetch"
- }
- },
- "node_modules/release-it/node_modules/npm-run-path": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz",
- "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==",
- "dev": true,
- "dependencies": {
- "path-key": "^4.0.0"
- },
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/release-it/node_modules/onetime": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
- "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
- "dev": true,
- "dependencies": {
- "mimic-fn": "^4.0.0"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/release-it/node_modules/path-key": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
- "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
- "dev": true,
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/release-it/node_modules/slash": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz",
- "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==",
- "dev": true,
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/release-it/node_modules/strip-final-newline": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
- "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",
- "dev": true,
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": ">= 0.6"
}
},
"node_modules/require-directory": {
@@ -9359,12 +8830,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/resolve-alpn": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
- "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==",
- "dev": true
- },
"node_modules/resolve-cwd": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
@@ -9408,50 +8873,66 @@
}
},
"node_modules/resolve.exports": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz",
- "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz",
+ "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==",
"dev": true,
"engines": {
"node": ">=10"
}
},
- "node_modules/responselike": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz",
- "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==",
+ "node_modules/restore-cursor": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz",
+ "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "lowercase-keys": "^3.0.0"
+ "onetime": "^7.0.0",
+ "signal-exit": "^4.1.0"
},
"engines": {
- "node": ">=14.16"
+ "node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/restore-cursor": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz",
- "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==",
+ "node_modules/restore-cursor/node_modules/onetime": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz",
+ "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "onetime": "^5.1.0",
- "signal-exit": "^3.0.2"
+ "mimic-function": "^5.0.0"
},
"engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ "node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/restore-cursor/node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/retry": {
"version": "0.13.1",
"resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
"integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 4"
}
@@ -9481,11 +8962,25 @@
"url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/run-async": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
- "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
+ "node_modules/run-applescript": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz",
+ "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==",
"dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/run-async": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz",
+ "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==",
+ "dev": true,
+ "license": "MIT",
"engines": {
"node": ">=0.12.0"
}
@@ -9514,19 +9009,21 @@
}
},
"node_modules/rxjs": {
- "version": "7.8.0",
- "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz",
- "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==",
+ "version": "7.8.2",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz",
+ "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
"dev": true,
+ "license": "Apache-2.0",
"dependencies": {
"tslib": "^2.1.0"
}
},
"node_modules/rxjs/node_modules/tslib": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz",
- "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==",
- "dev": true
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
+ "dev": true,
+ "license": "0BSD"
},
"node_modules/safe-buffer": {
"version": "5.2.1",
@@ -9548,20 +9045,6 @@
}
]
},
- "node_modules/safe-regex-test": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz",
- "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.3",
- "is-regex": "^1.1.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
@@ -9569,13 +9052,11 @@
"dev": true
},
"node_modules/semver": {
- "version": "7.3.8",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
- "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
"dev": true,
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
+ "license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
@@ -9583,25 +9064,10 @@
"node": ">=10"
}
},
- "node_modules/semver-diff": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz",
- "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==",
- "dev": true,
- "dependencies": {
- "semver": "^7.3.5"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/send": {
- "version": "0.18.0",
- "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
- "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
+ "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
"dev": true,
"dependencies": {
"debug": "2.6.9",
@@ -9637,6 +9103,15 @@
"integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"dev": true
},
+ "node_modules/send/node_modules/encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/send/node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@@ -9644,15 +9119,15 @@
"dev": true
},
"node_modules/serve-static": {
- "version": "1.15.0",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
- "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
+ "version": "1.16.2",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
+ "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
"dev": true,
"dependencies": {
- "encodeurl": "~1.0.2",
+ "encodeurl": "~2.0.0",
"escape-html": "~1.0.3",
"parseurl": "~1.3.3",
- "send": "0.18.0"
+ "send": "0.19.0"
},
"engines": {
"node": ">= 0.8.0"
@@ -9685,32 +9160,73 @@
"node": ">=8"
}
},
- "node_modules/shelljs": {
- "version": "0.8.5",
- "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz",
- "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==",
+ "node_modules/side-channel": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
"dev": true,
"dependencies": {
- "glob": "^7.0.0",
- "interpret": "^1.0.0",
- "rechoir": "^0.6.2"
- },
- "bin": {
- "shjs": "bin/shjs"
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3",
+ "side-channel-list": "^1.0.0",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
},
"engines": {
- "node": ">=4"
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/side-channel": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
- "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "node_modules/side-channel-list": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
"dev": true,
"dependencies": {
- "call-bind": "^1.0.0",
- "get-intrinsic": "^1.0.2",
- "object-inspect": "^1.9.0"
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "dev": true,
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "dev": true,
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -9723,9 +9239,9 @@
"dev": true
},
"node_modules/simple-git": {
- "version": "3.15.1",
- "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.15.1.tgz",
- "integrity": "sha512-73MVa5984t/JP4JcQt0oZlKGr42ROYWC3BcUZfuHtT3IHKPspIvL0cZBnvPXF7LL3S/qVeVHVdYYmJ3LOTw4Rg==",
+ "version": "3.19.0",
+ "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.19.0.tgz",
+ "integrity": "sha512-hyH2p9Ptxjf/xPuL7HfXbpYt9gKhC1yWDh3KYIAYJJePAKV7AEjLN4xhp7lozOdNiaJ9jlVvAbBymVlcS2jRiA==",
"dependencies": {
"@kwsites/file-exists": "^1.1.1",
"@kwsites/promise-deferred": "^1.1.1",
@@ -9756,45 +9272,42 @@
"resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
"integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">= 6.0.0",
"npm": ">= 3.0.0"
}
},
"node_modules/socks": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz",
- "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==",
+ "version": "2.8.4",
+ "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz",
+ "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "ip": "^2.0.0",
+ "ip-address": "^9.0.5",
"smart-buffer": "^4.2.0"
},
"engines": {
- "node": ">= 10.13.0",
+ "node": ">= 10.0.0",
"npm": ">= 3.0.0"
}
},
"node_modules/socks-proxy-agent": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz",
- "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==",
+ "version": "8.0.5",
+ "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz",
+ "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "agent-base": "^6.0.2",
- "debug": "4",
- "socks": "^2.3.3"
+ "agent-base": "^7.1.2",
+ "debug": "^4.3.4",
+ "socks": "^2.8.3"
},
"engines": {
- "node": ">= 6"
+ "node": ">= 14"
}
},
- "node_modules/socks/node_modules/ip": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz",
- "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==",
- "dev": true
- },
"node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
@@ -9846,18 +9359,6 @@
"integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==",
"dev": true
},
- "node_modules/split": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz",
- "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==",
- "dev": true,
- "dependencies": {
- "through": "2"
- },
- "engines": {
- "node": "*"
- }
- },
"node_modules/split2": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz",
@@ -9903,6 +9404,19 @@
"node": ">= 0.8"
}
},
+ "node_modules/stdin-discarder": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz",
+ "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/string_decoder": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
@@ -9939,34 +9453,6 @@
"node": ">=8"
}
},
- "node_modules/string.prototype.trimend": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz",
- "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/string.prototype.trimstart": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz",
- "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
@@ -10089,11 +9575,64 @@
"readable-stream": "3"
}
},
+ "node_modules/tinyexec": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz",
+ "integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.13",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz",
+ "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fdir": "^6.4.4",
+ "picomatch": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/tinyglobby/node_modules/fdir": {
+ "version": "6.4.4",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz",
+ "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/tinyglobby/node_modules/picomatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
+ "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
"node_modules/tmp": {
"version": "0.0.33",
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
"integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"os-tmpdir": "~1.0.2"
},
@@ -10107,15 +9646,6 @@
"integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
"dev": true
},
- "node_modules/to-fast-properties": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
- "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -10161,18 +9691,18 @@
}
},
"node_modules/ts-jest": {
- "version": "29.0.3",
- "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.3.tgz",
- "integrity": "sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ==",
+ "version": "29.1.1",
+ "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz",
+ "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==",
"dev": true,
"dependencies": {
"bs-logger": "0.x",
"fast-json-stable-stringify": "2.x",
"jest-util": "^29.0.0",
- "json5": "^2.2.1",
+ "json5": "^2.2.3",
"lodash.memoize": "4.x",
"make-error": "1.x",
- "semver": "7.x",
+ "semver": "^7.5.3",
"yargs-parser": "^21.0.1"
},
"bin": {
@@ -10186,7 +9716,7 @@
"@jest/types": "^29.0.0",
"babel-jest": "^29.0.0",
"jest": "^29.0.0",
- "typescript": ">=4.3"
+ "typescript": ">=4.3 <6"
},
"peerDependenciesMeta": {
"@babel/core": {
@@ -10361,34 +9891,12 @@
"node": ">= 0.6"
}
},
- "node_modules/typed-array-length": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz",
- "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==",
- "dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "for-each": "^0.3.3",
- "is-typed-array": "^1.1.9"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
"node_modules/typedarray": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
"integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==",
- "dev": true
- },
- "node_modules/typedarray-to-buffer": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
- "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
"dev": true,
- "dependencies": {
- "is-typedarray": "^1.0.0"
- }
+ "license": "MIT"
},
"node_modules/typescript": {
"version": "4.9.4",
@@ -10404,10 +9912,11 @@
}
},
"node_modules/uglify-js": {
- "version": "3.17.4",
- "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz",
- "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==",
+ "version": "3.19.3",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz",
+ "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==",
"dev": true,
+ "license": "BSD-2-Clause",
"optional": true,
"bin": {
"uglifyjs": "bin/uglifyjs"
@@ -10416,31 +9925,24 @@
"node": ">=0.8.0"
}
},
- "node_modules/unbox-primitive": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
- "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
+ "node_modules/undici": {
+ "version": "6.21.2",
+ "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.2.tgz",
+ "integrity": "sha512-uROZWze0R0itiAKVPsYhFov9LxrPMHLMEQFszeI2gCN6bnIIZ8twzBCJcN2LJrBBLfrP0t1FW0g+JmKVl8Vk1g==",
"dev": true,
- "dependencies": {
- "call-bind": "^1.0.2",
- "has-bigints": "^1.0.2",
- "has-symbols": "^1.0.3",
- "which-boxed-primitive": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.17"
}
},
- "node_modules/unique-string": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz",
- "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==",
+ "node_modules/unicorn-magic": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz",
+ "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==",
"dev": true,
- "dependencies": {
- "crypto-random-string": "^4.0.0"
- },
+ "license": "MIT",
"engines": {
- "node": ">=12"
+ "node": ">=18"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
@@ -10469,9 +9971,9 @@
}
},
"node_modules/update-browserslist-db": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz",
- "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==",
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz",
+ "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==",
"dev": true,
"funding": [
{
@@ -10481,6 +9983,10 @@
{
"type": "tidelift",
"url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
}
],
"dependencies": {
@@ -10488,52 +9994,12 @@
"picocolors": "^1.0.0"
},
"bin": {
- "browserslist-lint": "cli.js"
+ "update-browserslist-db": "cli.js"
},
"peerDependencies": {
"browserslist": ">= 4.21.0"
}
},
- "node_modules/update-notifier": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz",
- "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==",
- "dev": true,
- "dependencies": {
- "boxen": "^7.0.0",
- "chalk": "^5.0.1",
- "configstore": "^6.0.0",
- "has-yarn": "^3.0.0",
- "import-lazy": "^4.0.0",
- "is-ci": "^3.0.1",
- "is-installed-globally": "^0.4.0",
- "is-npm": "^6.0.0",
- "is-yarn-global": "^0.4.0",
- "latest-version": "^7.0.0",
- "pupa": "^3.1.0",
- "semver": "^7.3.7",
- "semver-diff": "^4.0.0",
- "xdg-basedir": "^5.1.0"
- },
- "engines": {
- "node": ">=14.16"
- },
- "funding": {
- "url": "https://github.com/yeoman/update-notifier?sponsor=1"
- }
- },
- "node_modules/update-notifier/node_modules/chalk": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz",
- "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==",
- "dev": true,
- "engines": {
- "node": "^12.17.0 || ^14.13 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
"node_modules/uri-js": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
@@ -10548,6 +10014,7 @@
"resolved": "https://registry.npmjs.org/url-join/-/url-join-5.0.0.tgz",
"integrity": "sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
}
@@ -10582,9 +10049,9 @@
"dev": true
},
"node_modules/v8-to-istanbul": {
- "version": "9.0.1",
- "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz",
- "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==",
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz",
+ "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==",
"dev": true,
"dependencies": {
"@jridgewell/trace-mapping": "^0.3.12",
@@ -10620,22 +10087,6 @@
"node": ">= 0.8"
}
},
- "node_modules/vm2": {
- "version": "3.9.13",
- "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.13.tgz",
- "integrity": "sha512-0rvxpB8P8Shm4wX2EKOiMp7H2zq+HUE/UwodY0pCZXs9IffIKZq6vUti5OgkVCTakKo9e/fgO4X1fkwfjWxE3Q==",
- "dev": true,
- "dependencies": {
- "acorn": "^8.7.0",
- "acorn-walk": "^8.2.0"
- },
- "bin": {
- "vm2": "bin/vm2"
- },
- "engines": {
- "node": ">=6.0"
- }
- },
"node_modules/walker": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
@@ -10645,24 +10096,6 @@
"makeerror": "1.0.12"
}
},
- "node_modules/wcwidth": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
- "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
- "dev": true,
- "dependencies": {
- "defaults": "^1.0.3"
- }
- },
- "node_modules/web-streams-polyfill": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz",
- "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==",
- "dev": true,
- "engines": {
- "node": ">= 8"
- }
- },
"node_modules/webidl-conversions": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
@@ -10692,120 +10125,110 @@
"node": ">= 8"
}
},
- "node_modules/which-boxed-primitive": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
- "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
- "dev": true,
- "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"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/which-typed-array": {
- "version": "1.1.9",
- "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz",
- "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==",
- "dev": true,
- "dependencies": {
- "available-typed-arrays": "^1.0.5",
- "call-bind": "^1.0.2",
- "for-each": "^0.3.3",
- "gopd": "^1.0.1",
- "has-tostringtag": "^1.0.0",
- "is-typed-array": "^1.1.10"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/widest-line": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz",
- "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==",
- "dev": true,
- "dependencies": {
- "string-width": "^5.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/widest-line/node_modules/ansi-regex": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
- "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
- "dev": true,
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-regex?sponsor=1"
- }
- },
- "node_modules/widest-line/node_modules/emoji-regex": {
- "version": "9.2.2",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
- "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
- "dev": true
- },
- "node_modules/widest-line/node_modules/string-width": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
- "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
- "dev": true,
- "dependencies": {
- "eastasianwidth": "^0.2.0",
- "emoji-regex": "^9.2.2",
- "strip-ansi": "^7.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/widest-line/node_modules/strip-ansi": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz",
- "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==",
- "dev": true,
- "dependencies": {
- "ansi-regex": "^6.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/strip-ansi?sponsor=1"
- }
- },
"node_modules/wildcard-match": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/wildcard-match/-/wildcard-match-5.1.2.tgz",
- "integrity": "sha512-qNXwI591Z88c8bWxp+yjV60Ch4F8Riawe3iGxbzquhy8Xs9m+0+SLFBGb/0yCTIDElawtaImC37fYZ+dr32KqQ==",
- "dev": true
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/wildcard-match/-/wildcard-match-5.1.4.tgz",
+ "integrity": "sha512-wldeCaczs8XXq7hj+5d/F38JE2r7EXgb6WQDM84RVwxy81T/sxB5e9+uZLK9Q9oNz1mlvjut+QtvgaOQFPVq/g==",
+ "dev": true,
+ "license": "ISC"
},
"node_modules/windows-release": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-5.0.1.tgz",
- "integrity": "sha512-y1xFdFvdMiDXI3xiOhMbJwt1Y7dUxidha0CWPs1NgjZIjZANTcX7+7bMqNjuezhzb8s5JGEiBAbQjQQYYy7ulw==",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-6.0.1.tgz",
+ "integrity": "sha512-MS3BzG8QK33dAyqwxfYJCJ03arkwKaddUOvvnnlFdXLudflsQF6I8yAxrLBeQk4yO8wjdH/+ax0YzxJEDrOftg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "execa": "^5.1.1"
+ "execa": "^8.0.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/windows-release/node_modules/execa": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz",
+ "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^8.0.1",
+ "human-signals": "^5.0.0",
+ "is-stream": "^3.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^5.1.0",
+ "onetime": "^6.0.0",
+ "signal-exit": "^4.1.0",
+ "strip-final-newline": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=16.17"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/windows-release/node_modules/get-stream": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz",
+ "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/windows-release/node_modules/human-signals": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz",
+ "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=16.17.0"
+ }
+ },
+ "node_modules/windows-release/node_modules/is-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
+ "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/windows-release/node_modules/mimic-fn": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
+ "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/windows-release/node_modules/npm-run-path": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz",
+ "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^4.0.0"
},
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
@@ -10814,20 +10237,67 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/word-wrap": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
- "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+ "node_modules/windows-release/node_modules/onetime": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
+ "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
"dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mimic-fn": "^4.0.0"
+ },
"engines": {
- "node": ">=0.10.0"
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/windows-release/node_modules/path-key": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
+ "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/windows-release/node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/windows-release/node_modules/strip-final-newline": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
+ "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/wordwrap": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
"integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
},
"node_modules/wrap-ansi": {
"version": "7.0.0",
@@ -10864,17 +10334,11 @@
"node": "^12.13.0 || ^14.15.0 || >=16.0.0"
}
},
- "node_modules/xdg-basedir": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz",
- "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==",
- "dev": true,
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
+ "node_modules/xcase": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/xcase/-/xcase-2.0.1.tgz",
+ "integrity": "sha512-UmFXIPU+9Eg3E9m/728Bii0lAIuoc+6nbrNUKaRPJOFp91ih44qqGlWtxMB6kXFrRD6po+86ksHM5XHCfk6iPw==",
+ "dev": true
},
"node_modules/xml": {
"version": "1.0.1",
@@ -10882,24 +10346,6 @@
"integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==",
"dev": true
},
- "node_modules/xregexp": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz",
- "integrity": "sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==",
- "dev": true,
- "engines": {
- "node": "*"
- }
- },
- "node_modules/xtend": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
- "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
- "dev": true,
- "engines": {
- "node": ">=0.4"
- }
- },
"node_modules/y18n": {
"version": "5.0.8",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
@@ -10962,9 +10408,28 @@
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
+ },
+ "node_modules/yoctocolors-cjs": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz",
+ "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
}
},
"dependencies": {
+ "@aashutoshrathi/word-wrap": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
+ "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
+ "dev": true
+ },
"@actions/core": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/@actions/core/-/core-1.10.0.tgz",
@@ -10983,50 +10448,52 @@
}
},
"@ampproject/remapping": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz",
- "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==",
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz",
+ "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==",
"dev": true,
"requires": {
- "@jridgewell/gen-mapping": "^0.1.0",
+ "@jridgewell/gen-mapping": "^0.3.0",
"@jridgewell/trace-mapping": "^0.3.9"
}
},
"@babel/code-frame": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz",
- "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==",
+ "version": "7.26.2",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
+ "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
"dev": true,
"requires": {
- "@babel/highlight": "^7.18.6"
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.0.0"
}
},
"@babel/compat-data": {
- "version": "7.20.5",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.20.5.tgz",
- "integrity": "sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.5.tgz",
+ "integrity": "sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==",
"dev": true
},
"@babel/core": {
- "version": "7.20.5",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.5.tgz",
- "integrity": "sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz",
+ "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==",
"dev": true,
"requires": {
- "@ampproject/remapping": "^2.1.0",
- "@babel/code-frame": "^7.18.6",
- "@babel/generator": "^7.20.5",
- "@babel/helper-compilation-targets": "^7.20.0",
- "@babel/helper-module-transforms": "^7.20.2",
- "@babel/helpers": "^7.20.5",
- "@babel/parser": "^7.20.5",
- "@babel/template": "^7.18.10",
- "@babel/traverse": "^7.20.5",
- "@babel/types": "^7.20.5",
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.22.5",
+ "@babel/generator": "^7.22.5",
+ "@babel/helper-compilation-targets": "^7.22.5",
+ "@babel/helper-module-transforms": "^7.22.5",
+ "@babel/helpers": "^7.22.5",
+ "@babel/parser": "^7.22.5",
+ "@babel/template": "^7.22.5",
+ "@babel/traverse": "^7.22.5",
+ "@babel/types": "^7.22.5",
"convert-source-map": "^1.7.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
- "json5": "^2.2.1",
+ "json5": "^2.2.2",
"semver": "^6.3.0"
},
"dependencies": {
@@ -11037,234 +10504,171 @@
"dev": true
},
"semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true
}
}
},
"@babel/generator": {
- "version": "7.20.5",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.5.tgz",
- "integrity": "sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA==",
+ "version": "7.23.0",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz",
+ "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==",
"dev": true,
"requires": {
- "@babel/types": "^7.20.5",
+ "@babel/types": "^7.23.0",
"@jridgewell/gen-mapping": "^0.3.2",
+ "@jridgewell/trace-mapping": "^0.3.17",
"jsesc": "^2.5.1"
- },
- "dependencies": {
- "@jridgewell/gen-mapping": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
- "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
- "dev": true,
- "requires": {
- "@jridgewell/set-array": "^1.0.1",
- "@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.9"
- }
- }
}
},
"@babel/helper-compilation-targets": {
- "version": "7.20.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz",
- "integrity": "sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz",
+ "integrity": "sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==",
"dev": true,
"requires": {
- "@babel/compat-data": "^7.20.0",
- "@babel/helper-validator-option": "^7.18.6",
+ "@babel/compat-data": "^7.22.5",
+ "@babel/helper-validator-option": "^7.22.5",
"browserslist": "^4.21.3",
+ "lru-cache": "^5.1.1",
"semver": "^6.3.0"
},
"dependencies": {
+ "lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dev": true,
+ "requires": {
+ "yallist": "^3.0.2"
+ }
+ },
"semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true
+ },
+ "yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
"dev": true
}
}
},
"@babel/helper-environment-visitor": {
- "version": "7.18.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz",
- "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==",
+ "version": "7.22.20",
+ "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz",
+ "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==",
"dev": true
},
"@babel/helper-function-name": {
- "version": "7.19.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz",
- "integrity": "sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==",
+ "version": "7.23.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz",
+ "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==",
"dev": true,
"requires": {
- "@babel/template": "^7.18.10",
- "@babel/types": "^7.19.0"
+ "@babel/template": "^7.22.15",
+ "@babel/types": "^7.23.0"
}
},
"@babel/helper-hoist-variables": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz",
- "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
+ "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
"dev": true,
"requires": {
- "@babel/types": "^7.18.6"
+ "@babel/types": "^7.22.5"
}
},
"@babel/helper-module-imports": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz",
- "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz",
+ "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==",
"dev": true,
"requires": {
- "@babel/types": "^7.18.6"
+ "@babel/types": "^7.22.5"
}
},
"@babel/helper-module-transforms": {
- "version": "7.20.2",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz",
- "integrity": "sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz",
+ "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==",
"dev": true,
"requires": {
- "@babel/helper-environment-visitor": "^7.18.9",
- "@babel/helper-module-imports": "^7.18.6",
- "@babel/helper-simple-access": "^7.20.2",
- "@babel/helper-split-export-declaration": "^7.18.6",
- "@babel/helper-validator-identifier": "^7.19.1",
- "@babel/template": "^7.18.10",
- "@babel/traverse": "^7.20.1",
- "@babel/types": "^7.20.2"
+ "@babel/helper-environment-visitor": "^7.22.5",
+ "@babel/helper-module-imports": "^7.22.5",
+ "@babel/helper-simple-access": "^7.22.5",
+ "@babel/helper-split-export-declaration": "^7.22.5",
+ "@babel/helper-validator-identifier": "^7.22.5",
+ "@babel/template": "^7.22.5",
+ "@babel/traverse": "^7.22.5",
+ "@babel/types": "^7.22.5"
}
},
"@babel/helper-plugin-utils": {
- "version": "7.20.2",
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz",
- "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz",
+ "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==",
"dev": true
},
"@babel/helper-simple-access": {
- "version": "7.20.2",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz",
- "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz",
+ "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==",
"dev": true,
"requires": {
- "@babel/types": "^7.20.2"
+ "@babel/types": "^7.22.5"
}
},
"@babel/helper-split-export-declaration": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz",
- "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==",
+ "version": "7.22.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz",
+ "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==",
"dev": true,
"requires": {
- "@babel/types": "^7.18.6"
+ "@babel/types": "^7.22.5"
}
},
"@babel/helper-string-parser": {
- "version": "7.19.4",
- "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz",
- "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
+ "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
"dev": true
},
"@babel/helper-validator-identifier": {
- "version": "7.19.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz",
- "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==",
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
+ "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
"dev": true
},
"@babel/helper-validator-option": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz",
- "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz",
+ "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==",
"dev": true
},
"@babel/helpers": {
- "version": "7.20.6",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.6.tgz",
- "integrity": "sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w==",
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz",
+ "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==",
"dev": true,
"requires": {
- "@babel/template": "^7.18.10",
- "@babel/traverse": "^7.20.5",
- "@babel/types": "^7.20.5"
- }
- },
- "@babel/highlight": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz",
- "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==",
- "dev": true,
- "requires": {
- "@babel/helper-validator-identifier": "^7.18.6",
- "chalk": "^2.0.0",
- "js-tokens": "^4.0.0"
- },
- "dependencies": {
- "ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "requires": {
- "color-convert": "^1.9.0"
- }
- },
- "chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "requires": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- }
- },
- "color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "requires": {
- "color-name": "1.1.3"
- }
- },
- "color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
- "dev": true
- },
- "escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
- "dev": true
- },
- "has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
- "dev": true
- },
- "supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "requires": {
- "has-flag": "^3.0.0"
- }
- }
+ "@babel/template": "^7.27.0",
+ "@babel/types": "^7.27.0"
}
},
"@babel/parser": {
- "version": "7.20.5",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz",
- "integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==",
- "dev": true
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz",
+ "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.27.0"
+ }
},
"@babel/plugin-syntax-async-generators": {
"version": "7.8.4",
@@ -11312,12 +10716,12 @@
}
},
"@babel/plugin-syntax-jsx": {
- "version": "7.18.6",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz",
- "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz",
+ "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.18.6"
+ "@babel/helper-plugin-utils": "^7.22.5"
}
},
"@babel/plugin-syntax-logical-assignment-operators": {
@@ -11384,39 +10788,39 @@
}
},
"@babel/plugin-syntax-typescript": {
- "version": "7.20.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz",
- "integrity": "sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==",
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz",
+ "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==",
"dev": true,
"requires": {
- "@babel/helper-plugin-utils": "^7.19.0"
+ "@babel/helper-plugin-utils": "^7.22.5"
}
},
"@babel/template": {
- "version": "7.18.10",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz",
- "integrity": "sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==",
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz",
+ "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==",
"dev": true,
"requires": {
- "@babel/code-frame": "^7.18.6",
- "@babel/parser": "^7.18.10",
- "@babel/types": "^7.18.10"
+ "@babel/code-frame": "^7.26.2",
+ "@babel/parser": "^7.27.0",
+ "@babel/types": "^7.27.0"
}
},
"@babel/traverse": {
- "version": "7.20.5",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.20.5.tgz",
- "integrity": "sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ==",
+ "version": "7.23.2",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz",
+ "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==",
"dev": true,
"requires": {
- "@babel/code-frame": "^7.18.6",
- "@babel/generator": "^7.20.5",
- "@babel/helper-environment-visitor": "^7.18.9",
- "@babel/helper-function-name": "^7.19.0",
- "@babel/helper-hoist-variables": "^7.18.6",
- "@babel/helper-split-export-declaration": "^7.18.6",
- "@babel/parser": "^7.20.5",
- "@babel/types": "^7.20.5",
+ "@babel/code-frame": "^7.22.13",
+ "@babel/generator": "^7.23.0",
+ "@babel/helper-environment-visitor": "^7.22.20",
+ "@babel/helper-function-name": "^7.23.0",
+ "@babel/helper-hoist-variables": "^7.22.5",
+ "@babel/helper-split-export-declaration": "^7.22.6",
+ "@babel/parser": "^7.23.0",
+ "@babel/types": "^7.23.0",
"debug": "^4.1.0",
"globals": "^11.1.0"
},
@@ -11430,14 +10834,13 @@
}
},
"@babel/types": {
- "version": "7.20.5",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.20.5.tgz",
- "integrity": "sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg==",
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz",
+ "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==",
"dev": true,
"requires": {
- "@babel/helper-string-parser": "^7.19.4",
- "@babel/helper-validator-identifier": "^7.19.1",
- "to-fast-properties": "^2.0.0"
+ "@babel/helper-string-parser": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9"
}
},
"@bcoe/v8-coverage": {
@@ -11447,16 +10850,16 @@
"dev": true
},
"@commitlint/cli": {
- "version": "17.4.0",
- "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-17.4.0.tgz",
- "integrity": "sha512-SEY4sYe8yVlgxPP7X0wJb96DBAGBPsCsy6QbqJt/UECbIAjDeDV5xXBV4jnS7T/qMC10sk6Ub9kDhEX0VWvblw==",
+ "version": "17.6.6",
+ "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-17.6.6.tgz",
+ "integrity": "sha512-sTKpr2i/Fjs9OmhU+beBxjPavpnLSqZaO6CzwKVq2Tc4UYVTMFgpKOslDhUBVlfAUBfjVO8ParxC/MXkIOevEA==",
"dev": true,
"requires": {
- "@commitlint/format": "^17.4.0",
- "@commitlint/lint": "^17.4.0",
- "@commitlint/load": "^17.4.0",
- "@commitlint/read": "^17.4.0",
- "@commitlint/types": "^17.4.0",
+ "@commitlint/format": "^17.4.4",
+ "@commitlint/lint": "^17.6.6",
+ "@commitlint/load": "^17.5.0",
+ "@commitlint/read": "^17.5.1",
+ "@commitlint/types": "^17.4.4",
"execa": "^5.0.0",
"lodash.isfunction": "^3.0.9",
"resolve-from": "5.0.0",
@@ -11482,22 +10885,22 @@
}
},
"@commitlint/config-validator": {
- "version": "17.4.0",
- "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-17.4.0.tgz",
- "integrity": "sha512-Sa/+8KNpDXz4zT4bVbz2fpFjvgkPO6u2V2fP4TKgt6FjmOw2z3eEX859vtfeaTav/ukBw0/0jr+5ZTZp9zCBhA==",
+ "version": "17.4.4",
+ "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-17.4.4.tgz",
+ "integrity": "sha512-bi0+TstqMiqoBAQDvdEP4AFh0GaKyLFlPPEObgI29utoKEYoPQTvF0EYqIwYYLEoJYhj5GfMIhPHJkTJhagfeg==",
"dev": true,
"requires": {
- "@commitlint/types": "^17.4.0",
+ "@commitlint/types": "^17.4.4",
"ajv": "^8.11.0"
}
},
"@commitlint/ensure": {
- "version": "17.4.0",
- "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-17.4.0.tgz",
- "integrity": "sha512-7oAxt25je0jeQ/E0O/M8L3ADb1Cvweu/5lc/kYF8g/kXatI0wxGE5La52onnAUAWeWlsuvBNar15WcrmDmr5Mw==",
+ "version": "17.4.4",
+ "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-17.4.4.tgz",
+ "integrity": "sha512-AHsFCNh8hbhJiuZ2qHv/m59W/GRE9UeOXbkOqxYMNNg9pJ7qELnFcwj5oYpa6vzTSHtPGKf3C2yUFNy1GGHq6g==",
"dev": true,
"requires": {
- "@commitlint/types": "^17.4.0",
+ "@commitlint/types": "^17.4.4",
"lodash.camelcase": "^4.3.0",
"lodash.kebabcase": "^4.1.1",
"lodash.snakecase": "^4.1.1",
@@ -11512,47 +10915,59 @@
"dev": true
},
"@commitlint/format": {
- "version": "17.4.0",
- "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-17.4.0.tgz",
- "integrity": "sha512-Z2bWAU5+f1YZh9W76c84J8iLIWIvvm+mzqogTz0Nsc1x6EHW0Z2gI38g5HAjB0r0I3ZjR15IDEJKhsxyblcyhA==",
+ "version": "17.4.4",
+ "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-17.4.4.tgz",
+ "integrity": "sha512-+IS7vpC4Gd/x+uyQPTAt3hXs5NxnkqAZ3aqrHd5Bx/R9skyCAWusNlNbw3InDbAK6j166D9asQM8fnmYIa+CXQ==",
"dev": true,
"requires": {
- "@commitlint/types": "^17.4.0",
+ "@commitlint/types": "^17.4.4",
"chalk": "^4.1.0"
}
},
"@commitlint/is-ignored": {
- "version": "17.4.0",
- "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.4.0.tgz",
- "integrity": "sha512-mkRuBlPUaBimvSvJyIHEHEW1/jP1SqEI7NOoaO9/eyJkMbsaiv5b1QgDYL4ZXlHdS64RMV7Y21MVVzuIceImDA==",
+ "version": "17.6.6",
+ "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.6.6.tgz",
+ "integrity": "sha512-4Fw875faAKO+2nILC04yW/2Vy/wlV3BOYCSQ4CEFzriPEprc1Td2LILmqmft6PDEK5Sr14dT9tEzeaZj0V56Gg==",
"dev": true,
"requires": {
- "@commitlint/types": "^17.4.0",
- "semver": "7.3.8"
+ "@commitlint/types": "^17.4.4",
+ "semver": "7.5.2"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "7.5.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz",
+ "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ }
}
},
"@commitlint/lint": {
- "version": "17.4.0",
- "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.4.0.tgz",
- "integrity": "sha512-HG2YT4TUbQKs9v8QvpQjJ6OK+fhflsDB8M+D5tLrY79hbQOWA9mDKdRkABsW/AAhpNI9+zeGUWF3jj245jSHKw==",
+ "version": "17.6.6",
+ "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.6.6.tgz",
+ "integrity": "sha512-5bN+dnHcRLkTvwCHYMS7Xpbr+9uNi0Kq5NR3v4+oPNx6pYXt8ACuw9luhM/yMgHYwW0ajIR20wkPAFkZLEMGmg==",
"dev": true,
"requires": {
- "@commitlint/is-ignored": "^17.4.0",
- "@commitlint/parse": "^17.4.0",
- "@commitlint/rules": "^17.4.0",
- "@commitlint/types": "^17.4.0"
+ "@commitlint/is-ignored": "^17.6.6",
+ "@commitlint/parse": "^17.6.5",
+ "@commitlint/rules": "^17.6.5",
+ "@commitlint/types": "^17.4.4"
}
},
"@commitlint/load": {
- "version": "17.4.0",
- "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-17.4.0.tgz",
- "integrity": "sha512-wDKNvAJqukqZqKmhRlf3KNo/12QGo1AQcd80EbV01SxtGvyHOsJ/g+/IbrZpopZv8rvzmEVktcpfDYH6ITepFA==",
+ "version": "17.5.0",
+ "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-17.5.0.tgz",
+ "integrity": "sha512-l+4W8Sx4CD5rYFsrhHH8HP01/8jEP7kKf33Xlx2Uk2out/UKoKPYMOIRcDH5ppT8UXLMV+x6Wm5osdRKKgaD1Q==",
"dev": true,
"requires": {
- "@commitlint/config-validator": "^17.4.0",
+ "@commitlint/config-validator": "^17.4.4",
"@commitlint/execute-rule": "^17.4.0",
- "@commitlint/resolve-extends": "^17.4.0",
- "@commitlint/types": "^17.4.0",
+ "@commitlint/resolve-extends": "^17.4.4",
+ "@commitlint/types": "^17.4.4",
+ "@types/node": "*",
"chalk": "^4.1.0",
"cosmiconfig": "^8.0.0",
"cosmiconfig-typescript-loader": "^4.0.0",
@@ -11561,7 +10976,7 @@
"lodash.uniq": "^4.5.0",
"resolve-from": "^5.0.0",
"ts-node": "^10.8.1",
- "typescript": "^4.6.4"
+ "typescript": "^4.6.4 || ^5.0.0"
},
"dependencies": {
"resolve-from": {
@@ -11573,43 +10988,43 @@
}
},
"@commitlint/message": {
- "version": "17.4.0",
- "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-17.4.0.tgz",
- "integrity": "sha512-USGJDU9PPxcgQjKXCzvPUal65KAhxWq3hp+MrU1pNCN2itWM654CLIoY2LMIQ7rScTli9B5dTLH3vXhzbItmzA==",
+ "version": "17.4.2",
+ "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-17.4.2.tgz",
+ "integrity": "sha512-3XMNbzB+3bhKA1hSAWPCQA3lNxR4zaeQAQcHj0Hx5sVdO6ryXtgUBGGv+1ZCLMgAPRixuc6en+iNAzZ4NzAa8Q==",
"dev": true
},
"@commitlint/parse": {
- "version": "17.4.0",
- "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-17.4.0.tgz",
- "integrity": "sha512-x8opKc5p+Hgs+CrMbq3VAnW2L2foPAX6arW8u9c8nTzksldGgFsENT+XVyPmpSMLlVBswZ1tndcz1xyKiY9TJA==",
+ "version": "17.6.5",
+ "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-17.6.5.tgz",
+ "integrity": "sha512-0zle3bcn1Hevw5Jqpz/FzEWNo2KIzUbc1XyGg6WrWEoa6GH3A1pbqNF6MvE6rjuy6OY23c8stWnb4ETRZyN+Yw==",
"dev": true,
"requires": {
- "@commitlint/types": "^17.4.0",
+ "@commitlint/types": "^17.4.4",
"conventional-changelog-angular": "^5.0.11",
"conventional-commits-parser": "^3.2.2"
}
},
"@commitlint/read": {
- "version": "17.4.0",
- "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-17.4.0.tgz",
- "integrity": "sha512-pGDeZpbkyvhxK8ZoCDUacPPRpauKPWF3n2XpDBEnuGreqUF2clq2PVJpwMMaNN5cHW8iFKCbcoOjXhD01sln0A==",
+ "version": "17.5.1",
+ "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-17.5.1.tgz",
+ "integrity": "sha512-7IhfvEvB//p9aYW09YVclHbdf1u7g7QhxeYW9ZHSO8Huzp8Rz7m05aCO1mFG7G8M+7yfFnXB5xOmG18brqQIBg==",
"dev": true,
"requires": {
"@commitlint/top-level": "^17.4.0",
- "@commitlint/types": "^17.4.0",
+ "@commitlint/types": "^17.4.4",
"fs-extra": "^11.0.0",
- "git-raw-commits": "^2.0.0",
+ "git-raw-commits": "^2.0.11",
"minimist": "^1.2.6"
}
},
"@commitlint/resolve-extends": {
- "version": "17.4.0",
- "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-17.4.0.tgz",
- "integrity": "sha512-3JsmwkrCzoK8sO22AzLBvNEvC1Pmdn/65RKXzEtQMy6oYMl0Snrq97a5bQQEFETF0VsvbtUuKttLqqgn99OXRQ==",
+ "version": "17.4.4",
+ "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-17.4.4.tgz",
+ "integrity": "sha512-znXr1S0Rr8adInptHw0JeLgumS11lWbk5xAWFVno+HUFVN45875kUtqjrI6AppmD3JI+4s0uZlqqlkepjJd99A==",
"dev": true,
"requires": {
- "@commitlint/config-validator": "^17.4.0",
- "@commitlint/types": "^17.4.0",
+ "@commitlint/config-validator": "^17.4.4",
+ "@commitlint/types": "^17.4.4",
"import-fresh": "^3.0.0",
"lodash.mergewith": "^4.6.2",
"resolve-from": "^5.0.0",
@@ -11625,15 +11040,15 @@
}
},
"@commitlint/rules": {
- "version": "17.4.0",
- "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-17.4.0.tgz",
- "integrity": "sha512-lz3i1jet2NNjTWpAMwjjQjMZCPWBIHK1Kkja9o09UmUtMjRdALTb8uMLe8gCyeq3DiiZ5lLYOhbsoPK56xGQKA==",
+ "version": "17.6.5",
+ "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-17.6.5.tgz",
+ "integrity": "sha512-uTB3zSmnPyW2qQQH+Dbq2rekjlWRtyrjDo4aLFe63uteandgkI+cc0NhhbBAzcXShzVk0qqp8SlkQMu0mgHg/A==",
"dev": true,
"requires": {
- "@commitlint/ensure": "^17.4.0",
- "@commitlint/message": "^17.4.0",
+ "@commitlint/ensure": "^17.4.4",
+ "@commitlint/message": "^17.4.2",
"@commitlint/to-lines": "^17.4.0",
- "@commitlint/types": "^17.4.0",
+ "@commitlint/types": "^17.4.4",
"execa": "^5.0.0"
}
},
@@ -11653,9 +11068,9 @@
}
},
"@commitlint/types": {
- "version": "17.4.0",
- "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-17.4.0.tgz",
- "integrity": "sha512-2NjAnq5IcxY9kXtUeO2Ac0aPpvkuOmwbH/BxIm36XXK5LtWFObWJWjXOA+kcaABMrthjWu6la+FUpyYFMHRvbA==",
+ "version": "17.4.4",
+ "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-17.4.4.tgz",
+ "integrity": "sha512-amRN8tRLYOsxRr6mTnGGGvB5EmW/4DDjLMgiwK3CCVEmN6Sr/6xePGEpWaspKkckILuUORCwe6VfDBw6uj4axQ==",
"dev": true,
"requires": {
"chalk": "^4.1.0"
@@ -11719,6 +11134,37 @@
}
}
},
+ "@gitbeaker/core": {
+ "version": "39.1.0",
+ "resolved": "https://registry.npmjs.org/@gitbeaker/core/-/core-39.1.0.tgz",
+ "integrity": "sha512-uw6QqrGavIZkOuSNFF9KsosasLzE8VbT5da5vu4eIoBws3yu8aOSUI0ieikNxQXqx/O/IN4tp065YUDh/Wm2yw==",
+ "dev": true,
+ "requires": {
+ "@gitbeaker/requester-utils": "^39.1.0",
+ "qs": "^6.11.1",
+ "xcase": "^2.0.1"
+ }
+ },
+ "@gitbeaker/requester-utils": {
+ "version": "39.1.0",
+ "resolved": "https://registry.npmjs.org/@gitbeaker/requester-utils/-/requester-utils-39.1.0.tgz",
+ "integrity": "sha512-dI02ABoGQluMNQ+o6K7ar1/yUnMQ4kX2Dk6yYIFWTqZEg4ZQRrkiBL7pcthTXOvq8lvlYC5j2NKpdddhbK3Q9g==",
+ "dev": true,
+ "requires": {
+ "qs": "^6.11.1",
+ "xcase": "^2.0.1"
+ }
+ },
+ "@gitbeaker/rest": {
+ "version": "39.1.0",
+ "resolved": "https://registry.npmjs.org/@gitbeaker/rest/-/rest-39.1.0.tgz",
+ "integrity": "sha512-1sXGl+efawaDaSKZOVxU3+GT/ETdWSkze6MFj8P5ATdddc+GgR+ZvHEJFqBJs8gKQ/jsFGdtFIFnB1HYmJKBzw==",
+ "dev": true,
+ "requires": {
+ "@gitbeaker/core": "^39.1.0",
+ "@gitbeaker/requester-utils": "^39.1.0"
+ }
+ },
"@humanwhocodes/config-array": {
"version": "0.11.8",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz",
@@ -11743,17 +11189,189 @@
"dev": true
},
"@hutson/parse-repository-url": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz",
- "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-5.0.0.tgz",
+ "integrity": "sha512-e5+YUKENATs1JgYHMzTr2MW/NDcXGfYFAuOQU8gJgF/kEh4EqKgfGrfLI67bMD4tbhZVlkigz/9YYwWcbOFthg==",
"dev": true
},
- "@iarna/toml": {
- "version": "2.2.5",
- "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz",
- "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==",
+ "@inquirer/checkbox": {
+ "version": "4.1.6",
+ "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-4.1.6.tgz",
+ "integrity": "sha512-62u896rWCtKKE43soodq5e/QcRsA22I+7/4Ov7LESWnKRO6BVo2A1DFLDmXL9e28TB0CfHc3YtkbPm7iwajqkg==",
+ "dev": true,
+ "requires": {
+ "@inquirer/core": "^10.1.11",
+ "@inquirer/figures": "^1.0.11",
+ "@inquirer/type": "^3.0.6",
+ "ansi-escapes": "^4.3.2",
+ "yoctocolors-cjs": "^2.1.2"
+ }
+ },
+ "@inquirer/confirm": {
+ "version": "5.1.10",
+ "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.10.tgz",
+ "integrity": "sha512-FxbQ9giWxUWKUk2O5XZ6PduVnH2CZ/fmMKMBkH71MHJvWr7WL5AHKevhzF1L5uYWB2P548o1RzVxrNd3dpmk6g==",
+ "dev": true,
+ "requires": {
+ "@inquirer/core": "^10.1.11",
+ "@inquirer/type": "^3.0.6"
+ }
+ },
+ "@inquirer/core": {
+ "version": "10.1.11",
+ "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.11.tgz",
+ "integrity": "sha512-BXwI/MCqdtAhzNQlBEFE7CEflhPkl/BqvAuV/aK6lW3DClIfYVDWPP/kXuXHtBWC7/EEbNqd/1BGq2BGBBnuxw==",
+ "dev": true,
+ "requires": {
+ "@inquirer/figures": "^1.0.11",
+ "@inquirer/type": "^3.0.6",
+ "ansi-escapes": "^4.3.2",
+ "cli-width": "^4.1.0",
+ "mute-stream": "^2.0.0",
+ "signal-exit": "^4.1.0",
+ "wrap-ansi": "^6.2.0",
+ "yoctocolors-cjs": "^2.1.2"
+ },
+ "dependencies": {
+ "signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true
+ },
+ "wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ }
+ }
+ }
+ },
+ "@inquirer/editor": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/@inquirer/editor/-/editor-4.2.11.tgz",
+ "integrity": "sha512-YoZr0lBnnLFPpfPSNsQ8IZyKxU47zPyVi9NLjCWtna52//M/xuL0PGPAxHxxYhdOhnvY2oBafoM+BI5w/JK7jw==",
+ "dev": true,
+ "requires": {
+ "@inquirer/core": "^10.1.11",
+ "@inquirer/type": "^3.0.6",
+ "external-editor": "^3.1.0"
+ }
+ },
+ "@inquirer/expand": {
+ "version": "4.0.13",
+ "resolved": "https://registry.npmjs.org/@inquirer/expand/-/expand-4.0.13.tgz",
+ "integrity": "sha512-HgYNWuZLHX6q5y4hqKhwyytqAghmx35xikOGY3TcgNiElqXGPas24+UzNPOwGUZa5Dn32y25xJqVeUcGlTv+QQ==",
+ "dev": true,
+ "requires": {
+ "@inquirer/core": "^10.1.11",
+ "@inquirer/type": "^3.0.6",
+ "yoctocolors-cjs": "^2.1.2"
+ }
+ },
+ "@inquirer/figures": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.11.tgz",
+ "integrity": "sha512-eOg92lvrn/aRUqbxRyvpEWnrvRuTYRifixHkYVpJiygTgVSBIHDqLh0SrMQXkafvULg3ck11V7xvR+zcgvpHFw==",
"dev": true
},
+ "@inquirer/input": {
+ "version": "4.1.10",
+ "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-4.1.10.tgz",
+ "integrity": "sha512-kV3BVne3wJ+j6reYQUZi/UN9NZGZLxgc/tfyjeK3mrx1QI7RXPxGp21IUTv+iVHcbP4ytZALF8vCHoxyNSC6qg==",
+ "dev": true,
+ "requires": {
+ "@inquirer/core": "^10.1.11",
+ "@inquirer/type": "^3.0.6"
+ }
+ },
+ "@inquirer/number": {
+ "version": "3.0.13",
+ "resolved": "https://registry.npmjs.org/@inquirer/number/-/number-3.0.13.tgz",
+ "integrity": "sha512-IrLezcg/GWKS8zpKDvnJ/YTflNJdG0qSFlUM/zNFsdi4UKW/CO+gaJpbMgQ20Q58vNKDJbEzC6IebdkprwL6ew==",
+ "dev": true,
+ "requires": {
+ "@inquirer/core": "^10.1.11",
+ "@inquirer/type": "^3.0.6"
+ }
+ },
+ "@inquirer/password": {
+ "version": "4.0.13",
+ "resolved": "https://registry.npmjs.org/@inquirer/password/-/password-4.0.13.tgz",
+ "integrity": "sha512-NN0S/SmdhakqOTJhDwOpeBEEr8VdcYsjmZHDb0rblSh2FcbXQOr+2IApP7JG4WE3sxIdKytDn4ed3XYwtHxmJQ==",
+ "dev": true,
+ "requires": {
+ "@inquirer/core": "^10.1.11",
+ "@inquirer/type": "^3.0.6",
+ "ansi-escapes": "^4.3.2"
+ }
+ },
+ "@inquirer/prompts": {
+ "version": "7.5.1",
+ "resolved": "https://registry.npmjs.org/@inquirer/prompts/-/prompts-7.5.1.tgz",
+ "integrity": "sha512-5AOrZPf2/GxZ+SDRZ5WFplCA2TAQgK3OYrXCYmJL5NaTu4ECcoWFlfUZuw7Es++6Njv7iu/8vpYJhuzxUH76Vg==",
+ "dev": true,
+ "requires": {
+ "@inquirer/checkbox": "^4.1.6",
+ "@inquirer/confirm": "^5.1.10",
+ "@inquirer/editor": "^4.2.11",
+ "@inquirer/expand": "^4.0.13",
+ "@inquirer/input": "^4.1.10",
+ "@inquirer/number": "^3.0.13",
+ "@inquirer/password": "^4.0.13",
+ "@inquirer/rawlist": "^4.1.1",
+ "@inquirer/search": "^3.0.13",
+ "@inquirer/select": "^4.2.1"
+ }
+ },
+ "@inquirer/rawlist": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/@inquirer/rawlist/-/rawlist-4.1.1.tgz",
+ "integrity": "sha512-VBUC0jPN2oaOq8+krwpo/mf3n/UryDUkKog3zi+oIi8/e5hykvdntgHUB9nhDM78RubiyR1ldIOfm5ue+2DeaQ==",
+ "dev": true,
+ "requires": {
+ "@inquirer/core": "^10.1.11",
+ "@inquirer/type": "^3.0.6",
+ "yoctocolors-cjs": "^2.1.2"
+ }
+ },
+ "@inquirer/search": {
+ "version": "3.0.13",
+ "resolved": "https://registry.npmjs.org/@inquirer/search/-/search-3.0.13.tgz",
+ "integrity": "sha512-9g89d2c5Izok/Gw/U7KPC3f9kfe5rA1AJ24xxNZG0st+vWekSk7tB9oE+dJv5JXd0ZSijomvW0KPMoBd8qbN4g==",
+ "dev": true,
+ "requires": {
+ "@inquirer/core": "^10.1.11",
+ "@inquirer/figures": "^1.0.11",
+ "@inquirer/type": "^3.0.6",
+ "yoctocolors-cjs": "^2.1.2"
+ }
+ },
+ "@inquirer/select": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-4.2.1.tgz",
+ "integrity": "sha512-gt1Kd5XZm+/ddemcT3m23IP8aD8rC9drRckWoP/1f7OL46Yy2FGi8DSmNjEjQKtPl6SV96Kmjbl6p713KXJ/Jg==",
+ "dev": true,
+ "requires": {
+ "@inquirer/core": "^10.1.11",
+ "@inquirer/figures": "^1.0.11",
+ "@inquirer/type": "^3.0.6",
+ "ansi-escapes": "^4.3.2",
+ "yoctocolors-cjs": "^2.1.2"
+ }
+ },
+ "@inquirer/type": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.6.tgz",
+ "integrity": "sha512-/mKVCtVpyBu3IDarv0G+59KC4stsD5mDsGpYh+GKs1NZT88Jh52+cuoA1AtLk2Q0r/quNl+1cSUyLRHBFeD0XA==",
+ "dev": true,
+ "requires": {}
+ },
"@istanbuljs/load-nyc-config": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
@@ -11838,123 +11456,123 @@
"dev": true
},
"@jest/console": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.3.1.tgz",
- "integrity": "sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.5.0.tgz",
+ "integrity": "sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==",
"dev": true,
"requires": {
- "@jest/types": "^29.3.1",
+ "@jest/types": "^29.5.0",
"@types/node": "*",
"chalk": "^4.0.0",
- "jest-message-util": "^29.3.1",
- "jest-util": "^29.3.1",
+ "jest-message-util": "^29.5.0",
+ "jest-util": "^29.5.0",
"slash": "^3.0.0"
}
},
"@jest/core": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.3.1.tgz",
- "integrity": "sha512-0ohVjjRex985w5MmO5L3u5GR1O30DexhBSpuwx2P+9ftyqHdJXnk7IUWiP80oHMvt7ubHCJHxV0a0vlKVuZirw==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.5.0.tgz",
+ "integrity": "sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==",
"dev": true,
"requires": {
- "@jest/console": "^29.3.1",
- "@jest/reporters": "^29.3.1",
- "@jest/test-result": "^29.3.1",
- "@jest/transform": "^29.3.1",
- "@jest/types": "^29.3.1",
+ "@jest/console": "^29.5.0",
+ "@jest/reporters": "^29.5.0",
+ "@jest/test-result": "^29.5.0",
+ "@jest/transform": "^29.5.0",
+ "@jest/types": "^29.5.0",
"@types/node": "*",
"ansi-escapes": "^4.2.1",
"chalk": "^4.0.0",
"ci-info": "^3.2.0",
"exit": "^0.1.2",
"graceful-fs": "^4.2.9",
- "jest-changed-files": "^29.2.0",
- "jest-config": "^29.3.1",
- "jest-haste-map": "^29.3.1",
- "jest-message-util": "^29.3.1",
- "jest-regex-util": "^29.2.0",
- "jest-resolve": "^29.3.1",
- "jest-resolve-dependencies": "^29.3.1",
- "jest-runner": "^29.3.1",
- "jest-runtime": "^29.3.1",
- "jest-snapshot": "^29.3.1",
- "jest-util": "^29.3.1",
- "jest-validate": "^29.3.1",
- "jest-watcher": "^29.3.1",
+ "jest-changed-files": "^29.5.0",
+ "jest-config": "^29.5.0",
+ "jest-haste-map": "^29.5.0",
+ "jest-message-util": "^29.5.0",
+ "jest-regex-util": "^29.4.3",
+ "jest-resolve": "^29.5.0",
+ "jest-resolve-dependencies": "^29.5.0",
+ "jest-runner": "^29.5.0",
+ "jest-runtime": "^29.5.0",
+ "jest-snapshot": "^29.5.0",
+ "jest-util": "^29.5.0",
+ "jest-validate": "^29.5.0",
+ "jest-watcher": "^29.5.0",
"micromatch": "^4.0.4",
- "pretty-format": "^29.3.1",
+ "pretty-format": "^29.5.0",
"slash": "^3.0.0",
"strip-ansi": "^6.0.0"
}
},
"@jest/environment": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.3.1.tgz",
- "integrity": "sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.5.0.tgz",
+ "integrity": "sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==",
"dev": true,
"requires": {
- "@jest/fake-timers": "^29.3.1",
- "@jest/types": "^29.3.1",
+ "@jest/fake-timers": "^29.5.0",
+ "@jest/types": "^29.5.0",
"@types/node": "*",
- "jest-mock": "^29.3.1"
+ "jest-mock": "^29.5.0"
}
},
"@jest/expect": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.3.1.tgz",
- "integrity": "sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.5.0.tgz",
+ "integrity": "sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==",
"dev": true,
"requires": {
- "expect": "^29.3.1",
- "jest-snapshot": "^29.3.1"
+ "expect": "^29.5.0",
+ "jest-snapshot": "^29.5.0"
}
},
"@jest/expect-utils": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.3.1.tgz",
- "integrity": "sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz",
+ "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==",
"dev": true,
"requires": {
- "jest-get-type": "^29.2.0"
+ "jest-get-type": "^29.4.3"
}
},
"@jest/fake-timers": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.3.1.tgz",
- "integrity": "sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.5.0.tgz",
+ "integrity": "sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==",
"dev": true,
"requires": {
- "@jest/types": "^29.3.1",
- "@sinonjs/fake-timers": "^9.1.2",
+ "@jest/types": "^29.5.0",
+ "@sinonjs/fake-timers": "^10.0.2",
"@types/node": "*",
- "jest-message-util": "^29.3.1",
- "jest-mock": "^29.3.1",
- "jest-util": "^29.3.1"
+ "jest-message-util": "^29.5.0",
+ "jest-mock": "^29.5.0",
+ "jest-util": "^29.5.0"
}
},
"@jest/globals": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.3.1.tgz",
- "integrity": "sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.5.0.tgz",
+ "integrity": "sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==",
"dev": true,
"requires": {
- "@jest/environment": "^29.3.1",
- "@jest/expect": "^29.3.1",
- "@jest/types": "^29.3.1",
- "jest-mock": "^29.3.1"
+ "@jest/environment": "^29.5.0",
+ "@jest/expect": "^29.5.0",
+ "@jest/types": "^29.5.0",
+ "jest-mock": "^29.5.0"
}
},
"@jest/reporters": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.3.1.tgz",
- "integrity": "sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.5.0.tgz",
+ "integrity": "sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==",
"dev": true,
"requires": {
"@bcoe/v8-coverage": "^0.2.3",
- "@jest/console": "^29.3.1",
- "@jest/test-result": "^29.3.1",
- "@jest/transform": "^29.3.1",
- "@jest/types": "^29.3.1",
+ "@jest/console": "^29.5.0",
+ "@jest/test-result": "^29.5.0",
+ "@jest/transform": "^29.5.0",
+ "@jest/types": "^29.5.0",
"@jridgewell/trace-mapping": "^0.3.15",
"@types/node": "*",
"chalk": "^4.0.0",
@@ -11967,9 +11585,9 @@
"istanbul-lib-report": "^3.0.0",
"istanbul-lib-source-maps": "^4.0.0",
"istanbul-reports": "^3.1.3",
- "jest-message-util": "^29.3.1",
- "jest-util": "^29.3.1",
- "jest-worker": "^29.3.1",
+ "jest-message-util": "^29.5.0",
+ "jest-util": "^29.5.0",
+ "jest-worker": "^29.5.0",
"slash": "^3.0.0",
"string-length": "^4.0.1",
"strip-ansi": "^6.0.0",
@@ -11977,18 +11595,18 @@
}
},
"@jest/schemas": {
- "version": "29.0.0",
- "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz",
- "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==",
+ "version": "29.4.3",
+ "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz",
+ "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==",
"dev": true,
"requires": {
- "@sinclair/typebox": "^0.24.1"
+ "@sinclair/typebox": "^0.25.16"
}
},
"@jest/source-map": {
- "version": "29.2.0",
- "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.2.0.tgz",
- "integrity": "sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==",
+ "version": "29.4.3",
+ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.4.3.tgz",
+ "integrity": "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==",
"dev": true,
"requires": {
"@jridgewell/trace-mapping": "^0.3.15",
@@ -11997,59 +11615,59 @@
}
},
"@jest/test-result": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.3.1.tgz",
- "integrity": "sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.5.0.tgz",
+ "integrity": "sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==",
"dev": true,
"requires": {
- "@jest/console": "^29.3.1",
- "@jest/types": "^29.3.1",
+ "@jest/console": "^29.5.0",
+ "@jest/types": "^29.5.0",
"@types/istanbul-lib-coverage": "^2.0.0",
"collect-v8-coverage": "^1.0.0"
}
},
"@jest/test-sequencer": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.3.1.tgz",
- "integrity": "sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz",
+ "integrity": "sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==",
"dev": true,
"requires": {
- "@jest/test-result": "^29.3.1",
+ "@jest/test-result": "^29.5.0",
"graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.3.1",
+ "jest-haste-map": "^29.5.0",
"slash": "^3.0.0"
}
},
"@jest/transform": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.3.1.tgz",
- "integrity": "sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.5.0.tgz",
+ "integrity": "sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==",
"dev": true,
"requires": {
"@babel/core": "^7.11.6",
- "@jest/types": "^29.3.1",
+ "@jest/types": "^29.5.0",
"@jridgewell/trace-mapping": "^0.3.15",
"babel-plugin-istanbul": "^6.1.1",
"chalk": "^4.0.0",
"convert-source-map": "^2.0.0",
"fast-json-stable-stringify": "^2.1.0",
"graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.3.1",
- "jest-regex-util": "^29.2.0",
- "jest-util": "^29.3.1",
+ "jest-haste-map": "^29.5.0",
+ "jest-regex-util": "^29.4.3",
+ "jest-util": "^29.5.0",
"micromatch": "^4.0.4",
"pirates": "^4.0.4",
"slash": "^3.0.0",
- "write-file-atomic": "^4.0.1"
+ "write-file-atomic": "^4.0.2"
}
},
"@jest/types": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz",
- "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz",
+ "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==",
"dev": true,
"requires": {
- "@jest/schemas": "^29.0.0",
+ "@jest/schemas": "^29.4.3",
"@types/istanbul-lib-coverage": "^2.0.0",
"@types/istanbul-reports": "^3.0.0",
"@types/node": "*",
@@ -12058,13 +11676,14 @@
}
},
"@jridgewell/gen-mapping": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz",
- "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==",
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
+ "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
"dev": true,
"requires": {
- "@jridgewell/set-array": "^1.0.0",
- "@jridgewell/sourcemap-codec": "^1.4.10"
+ "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
}
},
"@jridgewell/resolve-uri": {
@@ -12086,9 +11705,9 @@
"dev": true
},
"@jridgewell/trace-mapping": {
- "version": "0.3.17",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz",
- "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==",
+ "version": "0.3.18",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz",
+ "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==",
"dev": true,
"requires": {
"@jridgewell/resolve-uri": "3.1.0",
@@ -12096,9 +11715,9 @@
}
},
"@kie/mock-github": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/@kie/mock-github/-/mock-github-0.1.2.tgz",
- "integrity": "sha512-WgJr0LmDye+YVZLmsRFVHlluLGVbRMosa1VKW7Nv1PvytcqHy1pdj8ljRN74uVHl7AcV0JDP/4Qb+wRwC4n18Q==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@kie/mock-github/-/mock-github-1.1.0.tgz",
+ "integrity": "sha512-fD+utlOiyZSOutOcXL0G9jfjbtvOO44PLUyTfgfkrm1+575R/dbvU6AcJfjc1DtHeRv7FC7f4ebyU+a1wgL6CA==",
"dev": true,
"requires": {
"@octokit/openapi-types-ghec": "^14.0.0",
@@ -12163,52 +11782,83 @@
"fastq": "^1.6.0"
}
},
- "@octokit/auth-token": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.2.tgz",
- "integrity": "sha512-pq7CwIMV1kmzkFTimdwjAINCXKTajZErLB4wMLYapR2nuB/Jpr66+05wOTZMSCBXP6n4DdDWT2W19Bm17vU69Q==",
+ "@nodeutils/defaults-deep": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@nodeutils/defaults-deep/-/defaults-deep-1.1.0.tgz",
+ "integrity": "sha512-gG44cwQovaOFdSR02jR9IhVRpnDP64VN6JdjYJTfNz4J4fWn7TQnmrf22nSjRqlwlxPcW8PL/L3KbJg3tdwvpg==",
+ "dev": true,
"requires": {
- "@octokit/types": "^8.0.0"
+ "lodash": "^4.15.0"
}
},
+ "@octokit/auth-token": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-5.1.2.tgz",
+ "integrity": "sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw=="
+ },
"@octokit/core": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.1.0.tgz",
- "integrity": "sha512-Czz/59VefU+kKDy+ZfDwtOIYIkFjExOKf+HA92aiTZJ6EfWpFzYQWw0l54ji8bVmyhc+mGaLUbSUmXazG7z5OQ==",
+ "version": "6.1.5",
+ "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.5.tgz",
+ "integrity": "sha512-vvmsN0r7rguA+FySiCsbaTTobSftpIDIpPW81trAmsv9TGxg3YCujAxRYp/Uy8xmDgYCzzgulG62H7KYUFmeIg==",
"requires": {
- "@octokit/auth-token": "^3.0.0",
- "@octokit/graphql": "^5.0.0",
- "@octokit/request": "^6.0.0",
- "@octokit/request-error": "^3.0.0",
- "@octokit/types": "^8.0.0",
- "before-after-hook": "^2.2.0",
- "universal-user-agent": "^6.0.0"
+ "@octokit/auth-token": "^5.0.0",
+ "@octokit/graphql": "^8.2.2",
+ "@octokit/request": "^9.2.3",
+ "@octokit/request-error": "^6.1.8",
+ "@octokit/types": "^14.0.0",
+ "before-after-hook": "^3.0.2",
+ "universal-user-agent": "^7.0.0"
+ },
+ "dependencies": {
+ "before-after-hook": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-3.0.2.tgz",
+ "integrity": "sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A=="
+ },
+ "universal-user-agent": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.2.tgz",
+ "integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q=="
+ }
}
},
"@octokit/endpoint": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.3.tgz",
- "integrity": "sha512-57gRlb28bwTsdNXq+O3JTQ7ERmBTuik9+LelgcLIVfYwf235VHbN9QNo4kXExtp/h8T423cR5iJThKtFYxC7Lw==",
+ "version": "10.1.4",
+ "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.4.tgz",
+ "integrity": "sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==",
"requires": {
- "@octokit/types": "^8.0.0",
- "is-plain-object": "^5.0.0",
- "universal-user-agent": "^6.0.0"
+ "@octokit/types": "^14.0.0",
+ "universal-user-agent": "^7.0.2"
+ },
+ "dependencies": {
+ "universal-user-agent": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.2.tgz",
+ "integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q=="
+ }
}
},
"@octokit/graphql": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.4.tgz",
- "integrity": "sha512-amO1M5QUQgYQo09aStR/XO7KAl13xpigcy/kI8/N1PnZYSS69fgte+xA4+c2DISKqUZfsh0wwjc2FaCt99L41A==",
+ "version": "8.2.2",
+ "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.2.2.tgz",
+ "integrity": "sha512-Yi8hcoqsrXGdt0yObxbebHXFOiUA+2v3n53epuOg1QUgOB6c4XzvisBNVXJSl8RYA5KrDuSL2yq9Qmqe5N0ryA==",
"requires": {
- "@octokit/request": "^6.0.0",
- "@octokit/types": "^8.0.0",
- "universal-user-agent": "^6.0.0"
+ "@octokit/request": "^9.2.3",
+ "@octokit/types": "^14.0.0",
+ "universal-user-agent": "^7.0.0"
+ },
+ "dependencies": {
+ "universal-user-agent": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.2.tgz",
+ "integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q=="
+ }
}
},
"@octokit/openapi-types": {
- "version": "14.0.0",
- "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-14.0.0.tgz",
- "integrity": "sha512-HNWisMYlR8VCnNurDU6os2ikx0s0VyEjDYHNS/h4cgb8DeOxQ0n72HyinUtdDVxJhFy3FWLGl0DJhfEWk3P5Iw=="
+ "version": "25.0.0",
+ "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.0.0.tgz",
+ "integrity": "sha512-FZvktFu7HfOIJf2BScLKIEYjDsw6RKc7rBJCdvCTfKsVnx2GEB/Nbzjr29DUdb7vQhlzS/j8qDzdditP0OC6aw=="
},
"@octokit/openapi-types-ghec": {
"version": "14.0.0",
@@ -12217,11 +11867,26 @@
"dev": true
},
"@octokit/plugin-paginate-rest": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-5.0.1.tgz",
- "integrity": "sha512-7A+rEkS70pH36Z6JivSlR7Zqepz3KVucEFVDnSrgHXzG7WLAzYwcHZbKdfTXHwuTHbkT1vKvz7dHl1+HNf6Qyw==",
+ "version": "2.21.3",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz",
+ "integrity": "sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==",
"requires": {
- "@octokit/types": "^8.0.0"
+ "@octokit/types": "^6.40.0"
+ },
+ "dependencies": {
+ "@octokit/openapi-types": {
+ "version": "12.11.0",
+ "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz",
+ "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ=="
+ },
+ "@octokit/types": {
+ "version": "6.41.0",
+ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz",
+ "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==",
+ "requires": {
+ "@octokit/openapi-types": "^12.11.0"
+ }
+ }
}
},
"@octokit/plugin-request-log": {
@@ -12231,135 +11896,208 @@
"requires": {}
},
"@octokit/plugin-rest-endpoint-methods": {
- "version": "6.7.0",
- "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-6.7.0.tgz",
- "integrity": "sha512-orxQ0fAHA7IpYhG2flD2AygztPlGYNAdlzYz8yrD8NDgelPfOYoRPROfEyIe035PlxvbYrgkfUZIhSBKju/Cvw==",
+ "version": "5.16.2",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz",
+ "integrity": "sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==",
"requires": {
- "@octokit/types": "^8.0.0",
+ "@octokit/types": "^6.39.0",
"deprecation": "^2.3.1"
+ },
+ "dependencies": {
+ "@octokit/openapi-types": {
+ "version": "12.11.0",
+ "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz",
+ "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ=="
+ },
+ "@octokit/types": {
+ "version": "6.41.0",
+ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz",
+ "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==",
+ "requires": {
+ "@octokit/openapi-types": "^12.11.0"
+ }
+ }
}
},
"@octokit/request": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.2.tgz",
- "integrity": "sha512-6VDqgj0HMc2FUX2awIs+sM6OwLgwHvAi4KCK3mT2H2IKRt6oH9d0fej5LluF5mck1lRR/rFWN0YIDSYXYSylbw==",
+ "version": "9.2.3",
+ "resolved": "https://registry.npmjs.org/@octokit/request/-/request-9.2.3.tgz",
+ "integrity": "sha512-Ma+pZU8PXLOEYzsWf0cn/gY+ME57Wq8f49WTXA8FMHp2Ps9djKw//xYJ1je8Hm0pR2lU9FUGeJRWOtxq6olt4w==",
"requires": {
- "@octokit/endpoint": "^7.0.0",
- "@octokit/request-error": "^3.0.0",
- "@octokit/types": "^8.0.0",
- "is-plain-object": "^5.0.0",
- "node-fetch": "^2.6.7",
- "universal-user-agent": "^6.0.0"
+ "@octokit/endpoint": "^10.1.4",
+ "@octokit/request-error": "^6.1.8",
+ "@octokit/types": "^14.0.0",
+ "fast-content-type-parse": "^2.0.0",
+ "universal-user-agent": "^7.0.2"
+ },
+ "dependencies": {
+ "universal-user-agent": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.2.tgz",
+ "integrity": "sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q=="
+ }
}
},
"@octokit/request-error": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.2.tgz",
- "integrity": "sha512-WMNOFYrSaX8zXWoJg9u/pKgWPo94JXilMLb2VManNOby9EZxrQaBe/QSC4a1TzpAlpxofg2X/jMnCyZgL6y7eg==",
+ "version": "6.1.8",
+ "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-6.1.8.tgz",
+ "integrity": "sha512-WEi/R0Jmq+IJKydWlKDmryPcmdYSVjL3ekaiEL1L9eo1sUnqMJ+grqmC9cjk7CA7+b2/T397tO5d8YLOH3qYpQ==",
"requires": {
- "@octokit/types": "^8.0.0",
- "deprecation": "^2.0.0",
- "once": "^1.4.0"
+ "@octokit/types": "^14.0.0"
}
},
"@octokit/rest": {
- "version": "19.0.5",
- "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.5.tgz",
- "integrity": "sha512-+4qdrUFq2lk7Va+Qff3ofREQWGBeoTKNqlJO+FGjFP35ZahP+nBenhZiGdu8USSgmq4Ky3IJ/i4u0xbLqHaeow==",
+ "version": "18.12.0",
+ "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.12.0.tgz",
+ "integrity": "sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==",
"requires": {
- "@octokit/core": "^4.1.0",
- "@octokit/plugin-paginate-rest": "^5.0.0",
+ "@octokit/core": "^3.5.1",
+ "@octokit/plugin-paginate-rest": "^2.16.8",
"@octokit/plugin-request-log": "^1.0.4",
- "@octokit/plugin-rest-endpoint-methods": "^6.7.0"
+ "@octokit/plugin-rest-endpoint-methods": "^5.12.0"
+ },
+ "dependencies": {
+ "@octokit/auth-token": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz",
+ "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==",
+ "requires": {
+ "@octokit/types": "^6.0.3"
+ }
+ },
+ "@octokit/core": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz",
+ "integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==",
+ "requires": {
+ "@octokit/auth-token": "^2.4.4",
+ "@octokit/graphql": "^4.5.8",
+ "@octokit/request": "^5.6.3",
+ "@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": {
+ "version": "6.0.12",
+ "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz",
+ "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==",
+ "requires": {
+ "@octokit/types": "^6.0.3",
+ "is-plain-object": "^5.0.0",
+ "universal-user-agent": "^6.0.0"
+ }
+ },
+ "@octokit/graphql": {
+ "version": "4.8.0",
+ "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz",
+ "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==",
+ "requires": {
+ "@octokit/request": "^5.6.0",
+ "@octokit/types": "^6.0.3",
+ "universal-user-agent": "^6.0.0"
+ }
+ },
+ "@octokit/openapi-types": {
+ "version": "12.11.0",
+ "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-12.11.0.tgz",
+ "integrity": "sha512-VsXyi8peyRq9PqIz/tpqiL2w3w80OgVMwBHltTml3LmVvXiphgeqmY9mvBw9Wu7e0QWk/fqD37ux8yP5uVekyQ=="
+ },
+ "@octokit/request": {
+ "version": "5.6.3",
+ "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz",
+ "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==",
+ "requires": {
+ "@octokit/endpoint": "^6.0.1",
+ "@octokit/request-error": "^2.1.0",
+ "@octokit/types": "^6.16.1",
+ "is-plain-object": "^5.0.0",
+ "node-fetch": "^2.6.7",
+ "universal-user-agent": "^6.0.0"
+ }
+ },
+ "@octokit/request-error": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz",
+ "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==",
+ "requires": {
+ "@octokit/types": "^6.0.3",
+ "deprecation": "^2.0.0",
+ "once": "^1.4.0"
+ }
+ },
+ "@octokit/types": {
+ "version": "6.41.0",
+ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.41.0.tgz",
+ "integrity": "sha512-eJ2jbzjdijiL3B4PrSQaSjuF2sPEQPVCPzBvTHJD9Nz+9dw2SGH4K4xeQJ77YfTq5bRQ+bD8wT11JbeDPmxmGg==",
+ "requires": {
+ "@octokit/openapi-types": "^12.11.0"
+ }
+ }
}
},
"@octokit/types": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/@octokit/types/-/types-8.0.0.tgz",
- "integrity": "sha512-65/TPpOJP1i3K4lBJMnWqPUJ6zuOtzhtagDvydAWbEXpbFYA0oMKKyLb95NFZZP0lSh/4b6K+DQlzvYQJQQePg==",
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.0.0.tgz",
+ "integrity": "sha512-VVmZP0lEhbo2O1pdq63gZFiGCKkm8PPp8AUOijlwPO6hojEVjspA0MWKP7E4hbvGxzFKNqKr6p0IYtOH/Wf/zA==",
"requires": {
- "@octokit/openapi-types": "^14.0.0"
+ "@octokit/openapi-types": "^25.0.0"
}
},
"@octokit/webhooks-types": {
"version": "6.8.0",
"resolved": "https://registry.npmjs.org/@octokit/webhooks-types/-/webhooks-types-6.8.0.tgz",
- "integrity": "sha512-Yq46asTPdEyrroCSBLRvcwNBsztiDHHvJ3+//2PhVbLSKp6kkj7NkjA3fyrpCrdlANj8REZSfus60v96EmlxCA=="
+ "integrity": "sha512-Yq46asTPdEyrroCSBLRvcwNBsztiDHHvJ3+//2PhVbLSKp6kkj7NkjA3fyrpCrdlANj8REZSfus60v96EmlxCA==",
+ "dev": true
},
- "@pnpm/network.ca-file": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz",
- "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==",
- "dev": true,
- "requires": {
- "graceful-fs": "4.2.10"
- }
- },
- "@pnpm/npm-conf": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-1.0.5.tgz",
- "integrity": "sha512-hD8ml183638O3R6/Txrh0L8VzGOrFXgRtRDG4qQC4tONdZ5Z1M+tlUUDUvrjYdmK6G+JTBTeaCLMna11cXzi8A==",
- "dev": true,
- "requires": {
- "@pnpm/network.ca-file": "^1.0.1",
- "config-chain": "^1.1.11"
- }
+ "@phun-ky/typeof": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@phun-ky/typeof/-/typeof-1.2.8.tgz",
+ "integrity": "sha512-7J6ca1tK0duM2BgVB+CuFMh3idlIVASOP2QvOCbNWDc6JnvjtKa9nufPoJQQ4xrwBonwgT1TIhRRcEtzdVgWsA==",
+ "dev": true
},
"@release-it/conventional-changelog": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/@release-it/conventional-changelog/-/conventional-changelog-5.1.1.tgz",
- "integrity": "sha512-QtbDBe36dQfzexAfDYrbLPvd5Cb5bMWmLcjcGhCOWBss7fe1/gCjoxDULVz+7N7G5Nu2UMeBwHcUp/w8RDh5VQ==",
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/@release-it/conventional-changelog/-/conventional-changelog-10.0.1.tgz",
+ "integrity": "sha512-Qp+eyMGCPyq5xiWoNK91cWVIR/6HD1QAUNeG6pV2G4kxotWl81k/KDQqDNvrNVmr9+zDp53jI7pVVYQp6mi4zA==",
"dev": true,
"requires": {
"concat-stream": "^2.0.0",
- "conventional-changelog": "^3.1.25",
- "conventional-recommended-bump": "^6.1.0",
- "semver": "7.3.8"
+ "conventional-changelog": "^6.0.0",
+ "conventional-recommended-bump": "^10.0.0",
+ "git-semver-tags": "^8.0.0",
+ "semver": "^7.6.3"
}
},
"@sinclair/typebox": {
- "version": "0.24.51",
- "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz",
- "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==",
- "dev": true
- },
- "@sindresorhus/is": {
- "version": "5.3.0",
- "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.3.0.tgz",
- "integrity": "sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw==",
+ "version": "0.25.24",
+ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz",
+ "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==",
"dev": true
},
"@sinonjs/commons": {
- "version": "1.8.6",
- "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz",
- "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz",
+ "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==",
"dev": true,
"requires": {
"type-detect": "4.0.8"
}
},
"@sinonjs/fake-timers": {
- "version": "9.1.2",
- "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz",
- "integrity": "sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==",
+ "version": "10.3.0",
+ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz",
+ "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==",
"dev": true,
"requires": {
- "@sinonjs/commons": "^1.7.0"
+ "@sinonjs/commons": "^3.0.0"
}
},
- "@szmarczak/http-timer": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz",
- "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==",
- "dev": true,
- "requires": {
- "defer-to-connect": "^2.0.1"
- }
- },
- "@tootallnate/once": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
- "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
+ "@tootallnate/quickjs-emscripten": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz",
+ "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==",
"dev": true
},
"@tsconfig/node10": {
@@ -12387,13 +12125,13 @@
"dev": true
},
"@types/babel__core": {
- "version": "7.1.20",
- "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.20.tgz",
- "integrity": "sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ==",
+ "version": "7.20.1",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz",
+ "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==",
"dev": true,
"requires": {
- "@babel/parser": "^7.1.0",
- "@babel/types": "^7.0.0",
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7",
"@types/babel__generator": "*",
"@types/babel__template": "*",
"@types/babel__traverse": "*"
@@ -12419,12 +12157,12 @@
}
},
"@types/babel__traverse": {
- "version": "7.18.3",
- "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.3.tgz",
- "integrity": "sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w==",
+ "version": "7.20.1",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz",
+ "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==",
"dev": true,
"requires": {
- "@babel/types": "^7.3.0"
+ "@babel/types": "^7.20.7"
}
},
"@types/fs-extra": {
@@ -12437,9 +12175,9 @@
}
},
"@types/graceful-fs": {
- "version": "4.1.5",
- "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.5.tgz",
- "integrity": "sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==",
+ "version": "4.1.6",
+ "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz",
+ "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==",
"dev": true,
"requires": {
"@types/node": "*"
@@ -12498,21 +12236,27 @@
"dev": true
},
"@types/normalize-package-data": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz",
- "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==",
+ "version": "2.4.4",
+ "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz",
+ "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==",
+ "dev": true
+ },
+ "@types/parse-path": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/@types/parse-path/-/parse-path-7.0.3.tgz",
+ "integrity": "sha512-LriObC2+KYZD3FzCrgWGv/qufdUy4eXrxcLgQMfYXgPbLIecKIsVBaQgUPmxSSLcjmYbDTQbMgr6qr6l/eb7Bg==",
"dev": true
},
"@types/prettier": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.1.tgz",
- "integrity": "sha512-ri0UmynRRvZiiUJdiz38MmIblKK+oH30MztdBVR95dv/Ubw6neWSb8u1XpRb72L4qsZOhz+L+z9JD40SJmfWow==",
+ "version": "2.7.3",
+ "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz",
+ "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==",
"dev": true
},
"@types/semver": {
- "version": "7.3.13",
- "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz",
- "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==",
+ "version": "7.7.0",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.0.tgz",
+ "integrity": "sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==",
"dev": true
},
"@types/stack-utils": {
@@ -12676,13 +12420,10 @@
"dev": true
},
"agent-base": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
- "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
- "dev": true,
- "requires": {
- "debug": "4"
- }
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz",
+ "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==",
+ "dev": true
},
"ajv": {
"version": "8.11.2",
@@ -12696,15 +12437,6 @@
"uri-js": "^4.2.2"
}
},
- "ansi-align": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz",
- "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==",
- "dev": true,
- "requires": {
- "string-width": "^4.1.0"
- }
- },
"ansi-escapes": {
"version": "4.3.2",
"resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
@@ -12777,19 +12509,6 @@
"integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
"dev": true
},
- "array.prototype.map": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.5.tgz",
- "integrity": "sha512-gfaKntvwqYIuC7mLLyv2wzZIJqrRhn5PZ9EfFejSx6a78sV7iDsGpG9P+3oUPtm1Rerqm6nrKS4FYuTIvWfo3g==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4",
- "es-array-method-boxes-properly": "^1.0.0",
- "is-string": "^1.0.7"
- }
- },
"arrify": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
@@ -12806,9 +12525,9 @@
},
"dependencies": {
"tslib": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz",
- "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==",
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
"dev": true
}
}
@@ -12822,22 +12541,31 @@
"retry": "0.13.1"
}
},
- "available-typed-arrays": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz",
- "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==",
- "dev": true
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ },
+ "axios": {
+ "version": "1.8.4",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz",
+ "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==",
+ "requires": {
+ "follow-redirects": "^1.15.6",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ }
},
"babel-jest": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.3.1.tgz",
- "integrity": "sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz",
+ "integrity": "sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==",
"dev": true,
"requires": {
- "@jest/transform": "^29.3.1",
+ "@jest/transform": "^29.5.0",
"@types/babel__core": "^7.1.14",
"babel-plugin-istanbul": "^6.1.1",
- "babel-preset-jest": "^29.2.0",
+ "babel-preset-jest": "^29.5.0",
"chalk": "^4.0.0",
"graceful-fs": "^4.2.9",
"slash": "^3.0.0"
@@ -12857,9 +12585,9 @@
}
},
"babel-plugin-jest-hoist": {
- "version": "29.2.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz",
- "integrity": "sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz",
+ "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==",
"dev": true,
"requires": {
"@babel/template": "^7.3.3",
@@ -12889,12 +12617,12 @@
}
},
"babel-preset-jest": {
- "version": "29.2.0",
- "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz",
- "integrity": "sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz",
+ "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==",
"dev": true,
"requires": {
- "babel-plugin-jest-hoist": "^29.2.0",
+ "babel-plugin-jest-hoist": "^29.5.0",
"babel-preset-current-node-syntax": "^1.0.0"
}
},
@@ -12904,10 +12632,10 @@
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"dev": true
},
- "base64-js": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
- "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "basic-ftp": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz",
+ "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==",
"dev": true
},
"before-after-hook": {
@@ -12921,33 +12649,22 @@
"integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
"dev": true
},
- "bl": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz",
- "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==",
- "dev": true,
- "requires": {
- "buffer": "^6.0.3",
- "inherits": "^2.0.4",
- "readable-stream": "^3.4.0"
- }
- },
"body-parser": {
- "version": "1.20.1",
- "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
- "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
+ "version": "1.20.3",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
+ "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
"dev": true,
"requires": {
"bytes": "3.1.2",
- "content-type": "~1.0.4",
+ "content-type": "~1.0.5",
"debug": "2.6.9",
"depd": "2.0.0",
"destroy": "1.2.0",
"http-errors": "2.0.0",
"iconv-lite": "0.4.24",
"on-finished": "2.4.1",
- "qs": "6.11.0",
- "raw-body": "2.5.1",
+ "qs": "6.13.0",
+ "raw-body": "2.5.2",
"type-is": "~1.6.18",
"unpipe": "1.0.0"
},
@@ -12969,91 +12686,6 @@
}
}
},
- "boxen": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.0.1.tgz",
- "integrity": "sha512-8k2eH6SRAK00NDl1iX5q17RJ8rfl53TajdYxE3ssMLehbg487dEVgsad4pIsZb/QqBgYWIl6JOauMTLGX2Kpkw==",
- "dev": true,
- "requires": {
- "ansi-align": "^3.0.1",
- "camelcase": "^7.0.0",
- "chalk": "^5.0.1",
- "cli-boxes": "^3.0.0",
- "string-width": "^5.1.2",
- "type-fest": "^2.13.0",
- "widest-line": "^4.0.1",
- "wrap-ansi": "^8.0.1"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
- "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
- "dev": true
- },
- "ansi-styles": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
- "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
- "dev": true
- },
- "camelcase": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz",
- "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==",
- "dev": true
- },
- "chalk": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz",
- "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==",
- "dev": true
- },
- "emoji-regex": {
- "version": "9.2.2",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
- "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
- "dev": true
- },
- "string-width": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
- "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
- "dev": true,
- "requires": {
- "eastasianwidth": "^0.2.0",
- "emoji-regex": "^9.2.2",
- "strip-ansi": "^7.0.1"
- }
- },
- "strip-ansi": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz",
- "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==",
- "dev": true,
- "requires": {
- "ansi-regex": "^6.0.1"
- }
- },
- "type-fest": {
- "version": "2.19.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz",
- "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==",
- "dev": true
- },
- "wrap-ansi": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.0.1.tgz",
- "integrity": "sha512-QFF+ufAqhoYHvoHdajT/Po7KoXVBPXS2bgjIam5isfWJPfIOnQZ50JtUiVvCv/sjgacf3yRrt2ZKUZ/V4itN4g==",
- "dev": true,
- "requires": {
- "ansi-styles": "^6.1.0",
- "string-width": "^5.0.1",
- "strip-ansi": "^7.0.1"
- }
- }
- }
- },
"brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@@ -13065,24 +12697,24 @@
}
},
"braces": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
- "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
"dev": true,
"requires": {
- "fill-range": "^7.0.1"
+ "fill-range": "^7.1.1"
}
},
"browserslist": {
- "version": "4.21.4",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz",
- "integrity": "sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==",
+ "version": "4.21.9",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz",
+ "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==",
"dev": true,
"requires": {
- "caniuse-lite": "^1.0.30001400",
- "electron-to-chromium": "^1.4.251",
- "node-releases": "^2.0.6",
- "update-browserslist-db": "^1.0.9"
+ "caniuse-lite": "^1.0.30001503",
+ "electron-to-chromium": "^1.4.431",
+ "node-releases": "^2.0.12",
+ "update-browserslist-db": "^1.0.11"
}
},
"bs-logger": {
@@ -13103,56 +12735,82 @@
"node-int64": "^0.4.0"
}
},
- "buffer": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
- "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
- "dev": true,
- "requires": {
- "base64-js": "^1.3.1",
- "ieee754": "^1.2.1"
- }
- },
"buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
"dev": true
},
+ "bundle-name": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz",
+ "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==",
+ "dev": true,
+ "requires": {
+ "run-applescript": "^7.0.0"
+ }
+ },
"bytes": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
"integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
"dev": true
},
- "cacheable-lookup": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz",
- "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==",
- "dev": true
- },
- "cacheable-request": {
- "version": "10.2.4",
- "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.4.tgz",
- "integrity": "sha512-IWIea8ei1Ht4dBqvlvh7Gs7EYlMyBhlJybLDUB9sadEqHqftmdNieMLIR5ia3vs8gbjj9t8hXLBpUVg3vcQNbg==",
+ "c12": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/c12/-/c12-3.0.3.tgz",
+ "integrity": "sha512-uC3MacKBb0Z15o5QWCHvHWj5Zv34pGQj9P+iXKSpTuSGFS0KKhUWf4t9AJ+gWjYOdmWCPEGpEzm8sS0iqbpo1w==",
"dev": true,
"requires": {
- "get-stream": "^6.0.1",
- "http-cache-semantics": "^4.1.0",
- "keyv": "^4.5.2",
- "mimic-response": "^4.0.0",
- "normalize-url": "^8.0.0",
- "responselike": "^3.0.0"
+ "chokidar": "^4.0.3",
+ "confbox": "^0.2.2",
+ "defu": "^6.1.4",
+ "dotenv": "^16.4.7",
+ "exsolve": "^1.0.4",
+ "giget": "^2.0.0",
+ "jiti": "^2.4.2",
+ "ohash": "^2.0.11",
+ "pathe": "^2.0.3",
+ "perfect-debounce": "^1.0.0",
+ "pkg-types": "^2.1.0",
+ "rc9": "^2.1.2"
+ },
+ "dependencies": {
+ "chokidar": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
+ "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
+ "dev": true,
+ "requires": {
+ "readdirp": "^4.0.1"
+ }
+ },
+ "readdirp": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
+ "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
+ "dev": true
+ }
}
},
- "call-bind": {
+ "call-bind-apply-helpers": {
"version": "1.0.2",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
- "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
"dev": true,
"requires": {
- "function-bind": "^1.1.1",
- "get-intrinsic": "^1.0.2"
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ }
+ },
+ "call-bound": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+ "dev": true,
+ "requires": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
}
},
"callsites": {
@@ -13179,9 +12837,9 @@
}
},
"caniuse-lite": {
- "version": "1.0.30001436",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001436.tgz",
- "integrity": "sha512-ZmWkKsnC2ifEPoWUvSAIGyOYwT+keAaaWPHiQ9DfMqS1t6tfuyFYoWR78TeZtznkEQ64+vGXH9cZrElwR2Mrxg==",
+ "version": "1.0.30001509",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001509.tgz",
+ "integrity": "sha512-2uDDk+TRiTX5hMcUYT/7CSyzMZxjfGu0vAUjS2g0LSD8UoXOv0LtpH4LxGMemsiPq6LCVIUjNwVM0erkOkGCDA==",
"dev": true
},
"chalk": {
@@ -13239,37 +12897,40 @@
"integrity": "sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog==",
"dev": true
},
- "cjs-module-lexer": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz",
- "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==",
- "dev": true
+ "citty": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz",
+ "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==",
+ "dev": true,
+ "requires": {
+ "consola": "^3.2.3"
+ }
},
- "cli-boxes": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz",
- "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==",
+ "cjs-module-lexer": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz",
+ "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==",
"dev": true
},
"cli-cursor": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz",
- "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz",
+ "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==",
"dev": true,
"requires": {
- "restore-cursor": "^4.0.0"
+ "restore-cursor": "^5.0.0"
}
},
"cli-spinners": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.7.0.tgz",
- "integrity": "sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw==",
+ "version": "2.9.2",
+ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz",
+ "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==",
"dev": true
},
"cli-width": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.0.0.tgz",
- "integrity": "sha512-ZksGS2xpa/bYkNzN3BAw1wEjsLV/ZKOf/CCrJ/QOBsxx6fOARIkwTutxp1XIOIohi6HKmOFjMoK/XaqDVUpEEw==",
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz",
+ "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==",
"dev": true
},
"cliui": {
@@ -13283,12 +12944,6 @@
"wrap-ansi": "^7.0.0"
}
},
- "clone": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
- "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
- "dev": true
- },
"co": {
"version": "4.6.0",
"resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
@@ -13316,6 +12971,14 @@
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
},
+ "combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "requires": {
+ "delayed-stream": "~1.0.0"
+ }
+ },
"commander": {
"version": "9.4.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-9.4.1.tgz",
@@ -13349,51 +13012,17 @@
"typedarray": "^0.0.6"
}
},
- "config-chain": {
- "version": "1.1.13",
- "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz",
- "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==",
- "dev": true,
- "requires": {
- "ini": "^1.3.4",
- "proto-list": "~1.2.1"
- }
+ "confbox": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz",
+ "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==",
+ "dev": true
},
- "configstore": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz",
- "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==",
- "dev": true,
- "requires": {
- "dot-prop": "^6.0.1",
- "graceful-fs": "^4.2.6",
- "unique-string": "^3.0.0",
- "write-file-atomic": "^3.0.3",
- "xdg-basedir": "^5.0.1"
- },
- "dependencies": {
- "dot-prop": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz",
- "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==",
- "dev": true,
- "requires": {
- "is-obj": "^2.0.0"
- }
- },
- "write-file-atomic": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
- "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
- "dev": true,
- "requires": {
- "imurmurhash": "^0.1.4",
- "is-typedarray": "^1.0.0",
- "signal-exit": "^3.0.2",
- "typedarray-to-buffer": "^3.1.5"
- }
- }
- }
+ "consola": {
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz",
+ "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==",
+ "dev": true
},
"content-disposition": {
"version": "0.5.4",
@@ -13405,39 +13034,46 @@
}
},
"content-type": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
- "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
"dev": true
},
"conventional-changelog": {
- "version": "3.1.25",
- "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.25.tgz",
- "integrity": "sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==",
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-6.0.0.tgz",
+ "integrity": "sha512-tuUH8H/19VjtD9Ig7l6TQRh+Z0Yt0NZ6w/cCkkyzUbGQTnUEmKfGtkC9gGfVgCfOL1Rzno5NgNF4KY8vR+Jo3w==",
"dev": true,
"requires": {
- "conventional-changelog-angular": "^5.0.12",
- "conventional-changelog-atom": "^2.0.8",
- "conventional-changelog-codemirror": "^2.0.8",
- "conventional-changelog-conventionalcommits": "^4.5.0",
- "conventional-changelog-core": "^4.2.1",
- "conventional-changelog-ember": "^2.0.9",
- "conventional-changelog-eslint": "^3.0.9",
- "conventional-changelog-express": "^2.0.6",
- "conventional-changelog-jquery": "^3.0.11",
- "conventional-changelog-jshint": "^2.0.9",
- "conventional-changelog-preset-loader": "^2.3.4"
+ "conventional-changelog-angular": "^8.0.0",
+ "conventional-changelog-atom": "^5.0.0",
+ "conventional-changelog-codemirror": "^5.0.0",
+ "conventional-changelog-conventionalcommits": "^8.0.0",
+ "conventional-changelog-core": "^8.0.0",
+ "conventional-changelog-ember": "^5.0.0",
+ "conventional-changelog-eslint": "^6.0.0",
+ "conventional-changelog-express": "^5.0.0",
+ "conventional-changelog-jquery": "^6.0.0",
+ "conventional-changelog-jshint": "^5.0.0",
+ "conventional-changelog-preset-loader": "^5.0.0"
},
"dependencies": {
- "conventional-changelog-conventionalcommits": {
- "version": "4.6.3",
- "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-4.6.3.tgz",
- "integrity": "sha512-LTTQV4fwOM4oLPad317V/QNQ1FY4Hju5qeBIM1uTHbrnCE+Eg4CdRZ3gO2pUeR+tzWdp80M2j3qFFEDWVqOV4g==",
+ "conventional-changelog-angular": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-8.0.0.tgz",
+ "integrity": "sha512-CLf+zr6St0wIxos4bmaKHRXWAcsCXrJU6F4VdNDrGRK3B8LDLKoX3zuMV5GhtbGkVR/LohZ6MT6im43vZLSjmA==",
"dev": true,
"requires": {
- "compare-func": "^2.0.0",
- "lodash": "^4.17.15",
- "q": "^1.5.1"
+ "compare-func": "^2.0.0"
+ }
+ },
+ "conventional-changelog-conventionalcommits": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-8.0.0.tgz",
+ "integrity": "sha512-eOvlTO6OcySPyyyk8pKz2dP4jjElYunj9hn9/s0OB+gapTO8zwS9UQWrZ1pmF2hFs3vw1xhonOLGcGjy/zgsuA==",
+ "dev": true,
+ "requires": {
+ "compare-func": "^2.0.0"
}
}
}
@@ -13453,22 +13089,16 @@
}
},
"conventional-changelog-atom": {
- "version": "2.0.8",
- "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.8.tgz",
- "integrity": "sha512-xo6v46icsFTK3bb7dY/8m2qvc8sZemRgdqLb/bjpBsH2UyOS8rKNTgcb5025Hri6IpANPApbXMg15QLb1LJpBw==",
- "dev": true,
- "requires": {
- "q": "^1.5.1"
- }
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-5.0.0.tgz",
+ "integrity": "sha512-WfzCaAvSCFPkznnLgLnfacRAzjgqjLUjvf3MftfsJzQdDICqkOOpcMtdJF3wTerxSpv2IAAjX8doM3Vozqle3g==",
+ "dev": true
},
"conventional-changelog-codemirror": {
- "version": "2.0.8",
- "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.8.tgz",
- "integrity": "sha512-z5DAsn3uj1Vfp7po3gpt2Boc+Bdwmw2++ZHa5Ak9k0UKsYAO5mH1UBTN0qSCuJZREIhX6WU4E1p3IW2oRCNzQw==",
- "dev": true,
- "requires": {
- "q": "^1.5.1"
- }
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-5.0.0.tgz",
+ "integrity": "sha512-8gsBDI5Y3vrKUCxN6Ue8xr6occZ5nsDEc4C7jO/EovFGozx8uttCAyfhRrvoUAWi2WMm3OmYs+0mPJU7kQdYWQ==",
+ "dev": true
},
"conventional-changelog-conventionalcommits": {
"version": "5.0.0",
@@ -13482,226 +13112,180 @@
}
},
"conventional-changelog-core": {
- "version": "4.2.4",
- "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz",
- "integrity": "sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==",
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-8.0.0.tgz",
+ "integrity": "sha512-EATUx5y9xewpEe10UEGNpbSHRC6cVZgO+hXQjofMqpy+gFIrcGvH3Fl6yk2VFKh7m+ffenup2N7SZJYpyD9evw==",
"dev": true,
"requires": {
+ "@hutson/parse-repository-url": "^5.0.0",
"add-stream": "^1.0.0",
- "conventional-changelog-writer": "^5.0.0",
- "conventional-commits-parser": "^3.2.0",
- "dateformat": "^3.0.0",
- "get-pkg-repo": "^4.0.0",
- "git-raw-commits": "^2.0.8",
- "git-remote-origin-url": "^2.0.0",
- "git-semver-tags": "^4.1.1",
- "lodash": "^4.17.15",
- "normalize-package-data": "^3.0.0",
- "q": "^1.5.1",
- "read-pkg": "^3.0.0",
- "read-pkg-up": "^3.0.0",
- "through2": "^4.0.0"
+ "conventional-changelog-writer": "^8.0.0",
+ "conventional-commits-parser": "^6.0.0",
+ "git-raw-commits": "^5.0.0",
+ "git-semver-tags": "^8.0.0",
+ "hosted-git-info": "^7.0.0",
+ "normalize-package-data": "^6.0.0",
+ "read-package-up": "^11.0.0",
+ "read-pkg": "^9.0.0"
},
"dependencies": {
- "find-up": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
- "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==",
+ "@conventional-changelog/git-client": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@conventional-changelog/git-client/-/git-client-1.0.1.tgz",
+ "integrity": "sha512-PJEqBwAleffCMETaVm/fUgHldzBE35JFk3/9LL6NUA5EXa3qednu+UT6M7E5iBu3zIQZCULYIiZ90fBYHt6xUw==",
"dev": true,
"requires": {
- "locate-path": "^2.0.0"
+ "@types/semver": "^7.5.5",
+ "semver": "^7.5.2"
+ }
+ },
+ "conventional-commits-parser": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.1.0.tgz",
+ "integrity": "sha512-5nxDo7TwKB5InYBl4ZC//1g9GRwB/F3TXOGR9hgUjMGfvSP4Vu5NkpNro2+1+TIEy1vwxApl5ircECr2ri5JIw==",
+ "dev": true,
+ "requires": {
+ "meow": "^13.0.0"
+ }
+ },
+ "git-raw-commits": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-5.0.0.tgz",
+ "integrity": "sha512-I2ZXrXeOc0KrCvC7swqtIFXFN+rbjnC7b2T943tvemIOVNl+XP8YnA9UVwqFhzzLClnSA60KR/qEjLpXzs73Qg==",
+ "dev": true,
+ "requires": {
+ "@conventional-changelog/git-client": "^1.0.0",
+ "meow": "^13.0.0"
}
},
"hosted-git-info": {
- "version": "2.8.9",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
- "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
- "dev": true
- },
- "locate-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
- "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==",
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz",
+ "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==",
"dev": true,
"requires": {
- "p-locate": "^2.0.0",
- "path-exists": "^3.0.0"
+ "lru-cache": "^10.0.1"
}
},
- "p-limit": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
- "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
- "dev": true,
- "requires": {
- "p-try": "^1.0.0"
- }
- },
- "p-locate": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
- "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==",
- "dev": true,
- "requires": {
- "p-limit": "^1.1.0"
- }
- },
- "p-try": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
- "integrity": "sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==",
+ "lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
"dev": true
},
- "path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
+ "meow": {
+ "version": "13.2.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz",
+ "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==",
"dev": true
},
- "path-type": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
- "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
+ "normalize-package-data": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz",
+ "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==",
"dev": true,
"requires": {
- "pify": "^3.0.0"
+ "hosted-git-info": "^7.0.0",
+ "semver": "^7.3.5",
+ "validate-npm-package-license": "^3.0.4"
}
},
- "pify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
- "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==",
- "dev": true
+ "parse-json": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz",
+ "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.26.2",
+ "index-to-position": "^1.1.0",
+ "type-fest": "^4.39.1"
+ }
},
"read-pkg": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
- "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==",
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz",
+ "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==",
"dev": true,
"requires": {
- "load-json-file": "^4.0.0",
- "normalize-package-data": "^2.3.2",
- "path-type": "^3.0.0"
- },
- "dependencies": {
- "normalize-package-data": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
- "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
- "dev": true,
- "requires": {
- "hosted-git-info": "^2.1.4",
- "resolve": "^1.10.0",
- "semver": "2 || 3 || 4 || 5",
- "validate-npm-package-license": "^3.0.1"
- }
- }
+ "@types/normalize-package-data": "^2.4.3",
+ "normalize-package-data": "^6.0.0",
+ "parse-json": "^8.0.0",
+ "type-fest": "^4.6.0",
+ "unicorn-magic": "^0.1.0"
}
},
- "read-pkg-up": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz",
- "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==",
- "dev": true,
- "requires": {
- "find-up": "^2.0.0",
- "read-pkg": "^3.0.0"
- }
- },
- "semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "type-fest": {
+ "version": "4.39.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.39.1.tgz",
+ "integrity": "sha512-uW9qzd66uyHYxwyVBYiwS4Oi0qZyUqwjU+Oevr6ZogYiXt99EOYtwvzMSLw1c3lYo2HzJsep/NB23iEVEgjG/w==",
"dev": true
}
}
},
"conventional-changelog-ember": {
- "version": "2.0.9",
- "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.9.tgz",
- "integrity": "sha512-ulzIReoZEvZCBDhcNYfDIsLTHzYHc7awh+eI44ZtV5cx6LVxLlVtEmcO+2/kGIHGtw+qVabJYjdI5cJOQgXh1A==",
- "dev": true,
- "requires": {
- "q": "^1.5.1"
- }
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-5.0.0.tgz",
+ "integrity": "sha512-RPflVfm5s4cSO33GH/Ey26oxhiC67akcxSKL8CLRT3kQX2W3dbE19sSOM56iFqUJYEwv9mD9r6k79weWe1urfg==",
+ "dev": true
},
"conventional-changelog-eslint": {
- "version": "3.0.9",
- "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.9.tgz",
- "integrity": "sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==",
- "dev": true,
- "requires": {
- "q": "^1.5.1"
- }
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-6.0.0.tgz",
+ "integrity": "sha512-eiUyULWjzq+ybPjXwU6NNRflApDWlPEQEHvI8UAItYW/h22RKkMnOAtfCZxMmrcMO1OKUWtcf2MxKYMWe9zJuw==",
+ "dev": true
},
"conventional-changelog-express": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.6.tgz",
- "integrity": "sha512-SDez2f3iVJw6V563O3pRtNwXtQaSmEfTCaTBPCqn0oG0mfkq0rX4hHBq5P7De2MncoRixrALj3u3oQsNK+Q0pQ==",
- "dev": true,
- "requires": {
- "q": "^1.5.1"
- }
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-5.0.0.tgz",
+ "integrity": "sha512-D8Q6WctPkQpvr2HNCCmwU5GkX22BVHM0r4EW8vN0230TSyS/d6VQJDAxGb84lbg0dFjpO22MwmsikKL++Oo/oQ==",
+ "dev": true
},
"conventional-changelog-jquery": {
- "version": "3.0.11",
- "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.11.tgz",
- "integrity": "sha512-x8AWz5/Td55F7+o/9LQ6cQIPwrCjfJQ5Zmfqi8thwUEKHstEn4kTIofXub7plf1xvFA2TqhZlq7fy5OmV6BOMw==",
- "dev": true,
- "requires": {
- "q": "^1.5.1"
- }
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-6.0.0.tgz",
+ "integrity": "sha512-2kxmVakyehgyrho2ZHBi90v4AHswkGzHuTaoH40bmeNqUt20yEkDOSpw8HlPBfvEQBwGtbE+5HpRwzj6ac2UfA==",
+ "dev": true
},
"conventional-changelog-jshint": {
- "version": "2.0.9",
- "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.9.tgz",
- "integrity": "sha512-wMLdaIzq6TNnMHMy31hql02OEQ8nCQfExw1SE0hYL5KvU+JCTuPaDO+7JiogGT2gJAxiUGATdtYYfh+nT+6riA==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-5.0.0.tgz",
+ "integrity": "sha512-gGNphSb/opc76n2eWaO6ma4/Wqu3tpa2w7i9WYqI6Cs2fncDSI2/ihOfMvXveeTTeld0oFvwMVNV+IYQIk3F3g==",
"dev": true,
"requires": {
- "compare-func": "^2.0.0",
- "q": "^1.5.1"
+ "compare-func": "^2.0.0"
}
},
"conventional-changelog-preset-loader": {
- "version": "2.3.4",
- "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz",
- "integrity": "sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g==",
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-5.0.0.tgz",
+ "integrity": "sha512-SetDSntXLk8Jh1NOAl1Gu5uLiCNSYenB5tm0YVeZKePRIgDW9lQImromTwLa3c/Gae298tsgOM+/CYT9XAl0NA==",
"dev": true
},
"conventional-changelog-writer": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz",
- "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==",
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-8.0.1.tgz",
+ "integrity": "sha512-hlqcy3xHred2gyYg/zXSMXraY2mjAYYo0msUCpK+BGyaVJMFCKWVXPIHiaacGO2GGp13kvHWXFhYmxT4QQqW3Q==",
"dev": true,
"requires": {
- "conventional-commits-filter": "^2.0.7",
- "dateformat": "^3.0.0",
+ "conventional-commits-filter": "^5.0.0",
"handlebars": "^4.7.7",
- "json-stringify-safe": "^5.0.1",
- "lodash": "^4.17.15",
- "meow": "^8.0.0",
- "semver": "^6.0.0",
- "split": "^1.0.0",
- "through2": "^4.0.0"
+ "meow": "^13.0.0",
+ "semver": "^7.5.2"
},
"dependencies": {
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "meow": {
+ "version": "13.2.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz",
+ "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==",
"dev": true
}
}
},
"conventional-commits-filter": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz",
- "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==",
- "dev": true,
- "requires": {
- "lodash.ismatch": "^4.4.0",
- "modify-values": "^1.0.0"
- }
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-5.0.0.tgz",
+ "integrity": "sha512-tQMagCOC59EVgNZcC5zl7XqO30Wki9i9J3acbUvkaosCT6JX3EeFwJD7Qqp4MCikRnzS18WXV3BLIQ66ytu6+Q==",
+ "dev": true
},
"conventional-commits-parser": {
"version": "3.2.4",
@@ -13718,19 +13302,43 @@
}
},
"conventional-recommended-bump": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz",
- "integrity": "sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==",
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-10.0.0.tgz",
+ "integrity": "sha512-RK/fUnc2btot0oEVtrj3p2doImDSs7iiz/bftFCDzels0Qs1mxLghp+DFHMaOC0qiCI6sWzlTDyBFSYuot6pRA==",
"dev": true,
"requires": {
- "concat-stream": "^2.0.0",
- "conventional-changelog-preset-loader": "^2.3.4",
- "conventional-commits-filter": "^2.0.7",
- "conventional-commits-parser": "^3.2.0",
- "git-raw-commits": "^2.0.8",
- "git-semver-tags": "^4.1.1",
- "meow": "^8.0.0",
- "q": "^1.5.1"
+ "@conventional-changelog/git-client": "^1.0.0",
+ "conventional-changelog-preset-loader": "^5.0.0",
+ "conventional-commits-filter": "^5.0.0",
+ "conventional-commits-parser": "^6.0.0",
+ "meow": "^13.0.0"
+ },
+ "dependencies": {
+ "@conventional-changelog/git-client": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@conventional-changelog/git-client/-/git-client-1.0.1.tgz",
+ "integrity": "sha512-PJEqBwAleffCMETaVm/fUgHldzBE35JFk3/9LL6NUA5EXa3qednu+UT6M7E5iBu3zIQZCULYIiZ90fBYHt6xUw==",
+ "dev": true,
+ "requires": {
+ "@types/semver": "^7.5.5",
+ "semver": "^7.5.2"
+ }
+ },
+ "conventional-commits-parser": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.1.0.tgz",
+ "integrity": "sha512-5nxDo7TwKB5InYBl4ZC//1g9GRwB/F3TXOGR9hgUjMGfvSP4Vu5NkpNro2+1+TIEy1vwxApl5ircECr2ri5JIw==",
+ "dev": true,
+ "requires": {
+ "meow": "^13.0.0"
+ }
+ },
+ "meow": {
+ "version": "13.2.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz",
+ "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==",
+ "dev": true
+ }
}
},
"convert-source-map": {
@@ -13740,9 +13348,9 @@
"dev": true
},
"cookie": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
- "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz",
+ "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==",
"dev": true
},
"cookie-signature": {
@@ -13751,16 +13359,10 @@
"integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
"dev": true
},
- "core-util-is": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
- "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
- "dev": true
- },
"cosmiconfig": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.0.0.tgz",
- "integrity": "sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ==",
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz",
+ "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==",
"dev": true,
"requires": {
"import-fresh": "^3.2.1",
@@ -13783,9 +13385,9 @@
"dev": true
},
"cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
"dev": true,
"requires": {
"path-key": "^3.1.0",
@@ -13793,23 +13395,6 @@
"which": "^2.0.1"
}
},
- "crypto-random-string": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz",
- "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==",
- "dev": true,
- "requires": {
- "type-fest": "^1.0.1"
- },
- "dependencies": {
- "type-fest": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz",
- "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==",
- "dev": true
- }
- }
- },
"dargs": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz",
@@ -13817,15 +13402,9 @@
"dev": true
},
"data-uri-to-buffer": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz",
- "integrity": "sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==",
- "dev": true
- },
- "dateformat": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz",
- "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==",
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz",
+ "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==",
"dev": true
},
"debug": {
@@ -13860,35 +13439,12 @@
}
}
},
- "decompress-response": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
- "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
- "dev": true,
- "requires": {
- "mimic-response": "^3.1.0"
- },
- "dependencies": {
- "mimic-response": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
- "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
- "dev": true
- }
- }
- },
"dedent": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz",
"integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==",
"dev": true
},
- "deep-extend": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
- "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
- "dev": true
- },
"deep-is": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
@@ -13896,54 +13452,55 @@
"dev": true
},
"deepmerge": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
- "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
"dev": true
},
- "defaults": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
- "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
+ "default-browser": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz",
+ "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==",
"dev": true,
"requires": {
- "clone": "^1.0.2"
+ "bundle-name": "^4.1.0",
+ "default-browser-id": "^5.0.0"
}
},
- "defer-to-connect": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
- "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
+ "default-browser-id": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz",
+ "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==",
"dev": true
},
"define-lazy-prop": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
- "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz",
+ "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==",
"dev": true
},
- "define-properties": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz",
- "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==",
- "dev": true,
- "requires": {
- "has-property-descriptors": "^1.0.0",
- "object-keys": "^1.1.1"
- }
+ "defu": {
+ "version": "6.1.4",
+ "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz",
+ "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==",
+ "dev": true
},
"degenerator": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-3.0.2.tgz",
- "integrity": "sha512-c0mef3SNQo56t6urUU6tdQAs+ThoD0o9B9MJ8HEt7NQcGEILCRFqQb7ZbP9JAv+QF1Ky5plydhMR/IrqWDm+TQ==",
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz",
+ "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==",
"dev": true,
"requires": {
- "ast-types": "^0.13.2",
- "escodegen": "^1.8.1",
- "esprima": "^4.0.0",
- "vm2": "^3.9.8"
+ "ast-types": "^0.13.4",
+ "escodegen": "^2.1.0",
+ "esprima": "^4.0.1"
}
},
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
+ },
"depd": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
@@ -13955,6 +13512,12 @@
"resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz",
"integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ=="
},
+ "destr": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.5.tgz",
+ "integrity": "sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==",
+ "dev": true
+ },
"destroy": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
@@ -13974,9 +13537,9 @@
"dev": true
},
"diff-sequences": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.3.1.tgz",
- "integrity": "sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==",
+ "version": "29.4.3",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz",
+ "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==",
"dev": true
},
"dir-glob": {
@@ -14006,12 +13569,23 @@
"is-obj": "^2.0.0"
}
},
- "eastasianwidth": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
- "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "dotenv": {
+ "version": "16.5.0",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz",
+ "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==",
"dev": true
},
+ "dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "dev": true,
+ "requires": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ }
+ },
"ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@@ -14019,9 +13593,9 @@
"dev": true
},
"electron-to-chromium": {
- "version": "1.4.284",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz",
- "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==",
+ "version": "1.4.446",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.446.tgz",
+ "integrity": "sha512-4Gnw7ztEQ/E0eOt5JWfPn9jjeupfUlKoeW5ETKP9nLdWj+4spFoS3Stj19fqlKIaX28UQs0fNX+uKEyoLCBnkw==",
"dev": true
},
"emittery": {
@@ -14037,9 +13611,9 @@
"dev": true
},
"encodeurl": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
- "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
"dev": true
},
"error-ex": {
@@ -14051,87 +13625,25 @@
"is-arrayish": "^0.2.1"
}
},
- "es-abstract": {
- "version": "1.21.0",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.0.tgz",
- "integrity": "sha512-GUGtW7eXQay0c+PRq0sGIKSdaBorfVqsCMhGHo4elP7YVqZu9nCZS4UkK4gv71gOWNMra/PaSKD3ao1oWExO0g==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2",
- "es-set-tostringtag": "^2.0.0",
- "es-to-primitive": "^1.2.1",
- "function-bind": "^1.1.1",
- "function.prototype.name": "^1.1.5",
- "get-intrinsic": "^1.1.3",
- "get-symbol-description": "^1.0.0",
- "globalthis": "^1.0.3",
- "gopd": "^1.0.1",
- "has": "^1.0.3",
- "has-property-descriptors": "^1.0.0",
- "has-proto": "^1.0.1",
- "has-symbols": "^1.0.3",
- "internal-slot": "^1.0.4",
- "is-array-buffer": "^3.0.0",
- "is-callable": "^1.2.7",
- "is-negative-zero": "^2.0.2",
- "is-regex": "^1.1.4",
- "is-shared-array-buffer": "^1.0.2",
- "is-string": "^1.0.7",
- "is-typed-array": "^1.1.10",
- "is-weakref": "^1.0.2",
- "object-inspect": "^1.12.2",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.4",
- "regexp.prototype.flags": "^1.4.3",
- "safe-regex-test": "^1.0.0",
- "string.prototype.trimend": "^1.0.6",
- "string.prototype.trimstart": "^1.0.6",
- "typed-array-length": "^1.0.4",
- "unbox-primitive": "^1.0.2",
- "which-typed-array": "^1.1.9"
- }
- },
- "es-array-method-boxes-properly": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz",
- "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==",
+ "es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
"dev": true
},
- "es-get-iterator": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.2.tgz",
- "integrity": "sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.0",
- "has-symbols": "^1.0.1",
- "is-arguments": "^1.1.0",
- "is-map": "^2.0.2",
- "is-set": "^2.0.2",
- "is-string": "^1.0.5",
- "isarray": "^2.0.5"
- }
+ "es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "dev": true
},
- "es-set-tostringtag": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.0.tgz",
- "integrity": "sha512-vZVAIWss0FcR/+a08s6e2/GjGjjYBCZJXDrOnj6l5kJCKhQvJs4cnVqUxkVepIhqHbKHm3uwOvPb8lRcqA3DSg==",
+ "es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
"dev": true,
"requires": {
- "get-intrinsic": "^1.1.3",
- "has-tostringtag": "^1.0.0"
- }
- },
- "es-to-primitive": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
- "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
- "dev": true,
- "requires": {
- "is-callable": "^1.1.4",
- "is-date-object": "^1.0.1",
- "is-symbol": "^1.0.2"
+ "es-errors": "^1.3.0"
}
},
"escalade": {
@@ -14140,12 +13652,6 @@
"integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
"dev": true
},
- "escape-goat": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz",
- "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==",
- "dev": true
- },
"escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
@@ -14159,56 +13665,22 @@
"dev": true
},
"escodegen": {
- "version": "1.14.3",
- "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz",
- "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz",
+ "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==",
"dev": true,
"requires": {
"esprima": "^4.0.1",
- "estraverse": "^4.2.0",
+ "estraverse": "^5.2.0",
"esutils": "^2.0.2",
- "optionator": "^0.8.1",
"source-map": "~0.6.1"
},
"dependencies": {
- "levn": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
- "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==",
- "dev": true,
- "requires": {
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2"
- }
- },
- "optionator": {
- "version": "0.8.3",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
- "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
- "dev": true,
- "requires": {
- "deep-is": "~0.1.3",
- "fast-levenshtein": "~2.0.6",
- "levn": "~0.3.0",
- "prelude-ls": "~1.1.2",
- "type-check": "~0.3.2",
- "word-wrap": "~1.2.3"
- }
- },
- "prelude-ls": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
- "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==",
+ "estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
"dev": true
- },
- "type-check": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
- "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==",
- "dev": true,
- "requires": {
- "prelude-ls": "~1.1.2"
- }
}
}
},
@@ -14391,6 +13863,12 @@
"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
"dev": true
},
+ "eta": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/eta/-/eta-3.5.0.tgz",
+ "integrity": "sha512-e3x3FBvGzeCIHhF+zhK8FZA2vC5uFn6b4HJjegUbIWrDb4mJ7JjTGMJY9VGIbRVpmSwHopNiaJibhjIr+HfLug==",
+ "dev": true
+ },
"etag": {
"version": "1.8.1",
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
@@ -14421,50 +13899,50 @@
"dev": true
},
"expect": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/expect/-/expect-29.3.1.tgz",
- "integrity": "sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz",
+ "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==",
"dev": true,
"requires": {
- "@jest/expect-utils": "^29.3.1",
- "jest-get-type": "^29.2.0",
- "jest-matcher-utils": "^29.3.1",
- "jest-message-util": "^29.3.1",
- "jest-util": "^29.3.1"
+ "@jest/expect-utils": "^29.5.0",
+ "jest-get-type": "^29.4.3",
+ "jest-matcher-utils": "^29.5.0",
+ "jest-message-util": "^29.5.0",
+ "jest-util": "^29.5.0"
}
},
"express": {
- "version": "4.18.2",
- "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
- "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz",
+ "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==",
"dev": true,
"requires": {
"accepts": "~1.3.8",
"array-flatten": "1.1.1",
- "body-parser": "1.20.1",
+ "body-parser": "1.20.3",
"content-disposition": "0.5.4",
"content-type": "~1.0.4",
- "cookie": "0.5.0",
+ "cookie": "0.7.1",
"cookie-signature": "1.0.6",
"debug": "2.6.9",
"depd": "2.0.0",
- "encodeurl": "~1.0.2",
+ "encodeurl": "~2.0.0",
"escape-html": "~1.0.3",
"etag": "~1.8.1",
- "finalhandler": "1.2.0",
+ "finalhandler": "1.3.1",
"fresh": "0.5.2",
"http-errors": "2.0.0",
- "merge-descriptors": "1.0.1",
+ "merge-descriptors": "1.0.3",
"methods": "~1.1.2",
"on-finished": "2.4.1",
"parseurl": "~1.3.3",
- "path-to-regexp": "0.1.7",
+ "path-to-regexp": "0.1.12",
"proxy-addr": "~2.0.7",
- "qs": "6.11.0",
+ "qs": "6.13.0",
"range-parser": "~1.2.1",
"safe-buffer": "5.2.1",
- "send": "0.18.0",
- "serve-static": "1.15.0",
+ "send": "0.19.0",
+ "serve-static": "1.16.2",
"setprototypeof": "1.2.0",
"statuses": "2.0.1",
"type-is": "~1.6.18",
@@ -14489,6 +13967,12 @@
}
}
},
+ "exsolve": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.5.tgz",
+ "integrity": "sha512-pz5dvkYYKQ1AHVrgOzBKWeP4u4FRb3a6DNK2ucr0OoNwYIU4QWsJ+NM36LLzORT+z845MzKHHhpXiUF5nvQoJg==",
+ "dev": true
+ },
"external-editor": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
@@ -14500,6 +13984,11 @@
"tmp": "^0.0.33"
}
},
+ "fast-content-type-parse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-2.0.1.tgz",
+ "integrity": "sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q=="
+ },
"fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@@ -14507,16 +13996,16 @@
"dev": true
},
"fast-glob": {
- "version": "3.2.12",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz",
- "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==",
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
"dev": true,
"requires": {
"@nodelib/fs.stat": "^2.0.2",
"@nodelib/fs.walk": "^1.2.3",
"glob-parent": "^5.1.2",
"merge2": "^1.3.0",
- "micromatch": "^4.0.4"
+ "micromatch": "^4.0.8"
},
"dependencies": {
"glob-parent": {
@@ -14560,34 +14049,6 @@
"bser": "2.1.1"
}
},
- "fetch-blob": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
- "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
- "dev": true,
- "requires": {
- "node-domexception": "^1.0.0",
- "web-streams-polyfill": "^3.0.3"
- }
- },
- "figures": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz",
- "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==",
- "dev": true,
- "requires": {
- "escape-string-regexp": "^5.0.0",
- "is-unicode-supported": "^1.2.0"
- },
- "dependencies": {
- "escape-string-regexp": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
- "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
- "dev": true
- }
- }
- },
"file-entry-cache": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
@@ -14597,29 +14058,23 @@
"flat-cache": "^3.0.4"
}
},
- "file-uri-to-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz",
- "integrity": "sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg==",
- "dev": true
- },
"fill-range": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
- "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
"dev": true,
"requires": {
"to-regex-range": "^5.0.1"
}
},
"finalhandler": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
- "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
+ "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
"dev": true,
"requires": {
"debug": "2.6.9",
- "encodeurl": "~1.0.2",
+ "encodeurl": "~2.0.0",
"escape-html": "~1.0.3",
"on-finished": "2.4.1",
"parseurl": "~1.3.3",
@@ -14654,6 +14109,12 @@
"path-exists": "^4.0.0"
}
},
+ "find-up-simple": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz",
+ "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==",
+ "dev": true
+ },
"flat-cache": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
@@ -14670,28 +14131,19 @@
"integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==",
"dev": true
},
- "for-each": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
- "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
- "dev": true,
- "requires": {
- "is-callable": "^1.1.3"
- }
+ "follow-redirects": {
+ "version": "1.15.6",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
+ "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA=="
},
- "form-data-encoder": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz",
- "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==",
- "dev": true
- },
- "formdata-polyfill": {
- "version": "4.0.10",
- "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
- "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
- "dev": true,
+ "form-data": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
"requires": {
- "fetch-blob": "^3.1.2"
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
}
},
"forwarded": {
@@ -14722,64 +14174,17 @@
"integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
"dev": true
},
- "ftp": {
- "version": "0.3.10",
- "resolved": "https://registry.npmjs.org/ftp/-/ftp-0.3.10.tgz",
- "integrity": "sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ==",
+ "fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
"dev": true,
- "requires": {
- "readable-stream": "1.1.x",
- "xregexp": "2.0.0"
- },
- "dependencies": {
- "isarray": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==",
- "dev": true
- },
- "readable-stream": {
- "version": "1.1.14",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
- "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==",
- "dev": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.1",
- "isarray": "0.0.1",
- "string_decoder": "~0.10.x"
- }
- },
- "string_decoder": {
- "version": "0.10.31",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==",
- "dev": true
- }
- }
+ "optional": true
},
"function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
- "dev": true
- },
- "function.prototype.name": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz",
- "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3",
- "es-abstract": "^1.19.0",
- "functions-have-names": "^1.2.2"
- }
- },
- "functions-have-names": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
- "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
"dev": true
},
"gensync": {
@@ -14794,15 +14199,28 @@
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
"dev": true
},
+ "get-east-asian-width": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz",
+ "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==",
+ "dev": true
+ },
"get-intrinsic": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
- "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
"dev": true,
"requires": {
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.3"
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
}
},
"get-package-type": {
@@ -14811,96 +14229,14 @@
"integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
"dev": true
},
- "get-pkg-repo": {
- "version": "4.2.1",
- "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-4.2.1.tgz",
- "integrity": "sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==",
+ "get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
"dev": true,
"requires": {
- "@hutson/parse-repository-url": "^3.0.0",
- "hosted-git-info": "^4.0.0",
- "through2": "^2.0.0",
- "yargs": "^16.2.0"
- },
- "dependencies": {
- "cliui": {
- "version": "7.0.4",
- "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
- "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
- "dev": true,
- "requires": {
- "string-width": "^4.2.0",
- "strip-ansi": "^6.0.0",
- "wrap-ansi": "^7.0.0"
- }
- },
- "isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
- "dev": true
- },
- "readable-stream": {
- "version": "2.3.7",
- "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
- "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
- "dev": true,
- "requires": {
- "core-util-is": "~1.0.0",
- "inherits": "~2.0.3",
- "isarray": "~1.0.0",
- "process-nextick-args": "~2.0.0",
- "safe-buffer": "~5.1.1",
- "string_decoder": "~1.1.1",
- "util-deprecate": "~1.0.1"
- }
- },
- "safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true
- },
- "string_decoder": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
- "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
- "dev": true,
- "requires": {
- "safe-buffer": "~5.1.0"
- }
- },
- "through2": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
- "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
- "dev": true,
- "requires": {
- "readable-stream": "~2.3.6",
- "xtend": "~4.0.1"
- }
- },
- "yargs": {
- "version": "16.2.0",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
- "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
- "dev": true,
- "requires": {
- "cliui": "^7.0.2",
- "escalade": "^3.1.1",
- "get-caller-file": "^2.0.5",
- "require-directory": "^2.1.1",
- "string-width": "^4.2.0",
- "y18n": "^5.0.5",
- "yargs-parser": "^20.2.2"
- }
- },
- "yargs-parser": {
- "version": "20.2.9",
- "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
- "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
- "dev": true
- }
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
}
},
"get-stream": {
@@ -14909,56 +14245,29 @@
"integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
"dev": true
},
- "get-symbol-description": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
- "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
+ "get-uri": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.4.tgz",
+ "integrity": "sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==",
"dev": true,
"requires": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.1"
+ "basic-ftp": "^5.0.2",
+ "data-uri-to-buffer": "^6.0.2",
+ "debug": "^4.3.4"
}
},
- "get-uri": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-3.0.2.tgz",
- "integrity": "sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg==",
+ "giget": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/giget/-/giget-2.0.0.tgz",
+ "integrity": "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==",
"dev": true,
"requires": {
- "@tootallnate/once": "1",
- "data-uri-to-buffer": "3",
- "debug": "4",
- "file-uri-to-path": "2",
- "fs-extra": "^8.1.0",
- "ftp": "^0.3.10"
- },
- "dependencies": {
- "fs-extra": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
- "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^4.0.0",
- "universalify": "^0.1.0"
- }
- },
- "jsonfile": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
- "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.6"
- }
- },
- "universalify": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
- "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
- "dev": true
- }
+ "citty": "^0.1.6",
+ "consola": "^3.4.0",
+ "defu": "^6.1.4",
+ "node-fetch-native": "^1.6.6",
+ "nypm": "^0.6.0",
+ "pathe": "^2.0.3"
}
},
"git-raw-commits": {
@@ -14974,60 +14283,62 @@
"through2": "^4.0.0"
}
},
- "git-remote-origin-url": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz",
- "integrity": "sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==",
- "dev": true,
- "requires": {
- "gitconfiglocal": "^1.0.0",
- "pify": "^2.3.0"
- }
- },
"git-semver-tags": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz",
- "integrity": "sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==",
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-8.0.0.tgz",
+ "integrity": "sha512-N7YRIklvPH3wYWAR2vysaqGLPRcpwQ0GKdlqTiVN5w1UmCdaeY3K8s6DMKRCh54DDdzyt/OAB6C8jgVtb7Y2Fg==",
"dev": true,
"requires": {
- "meow": "^8.0.0",
- "semver": "^6.0.0"
+ "@conventional-changelog/git-client": "^1.0.0",
+ "meow": "^13.0.0"
},
"dependencies": {
- "semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "@conventional-changelog/git-client": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@conventional-changelog/git-client/-/git-client-1.0.1.tgz",
+ "integrity": "sha512-PJEqBwAleffCMETaVm/fUgHldzBE35JFk3/9LL6NUA5EXa3qednu+UT6M7E5iBu3zIQZCULYIiZ90fBYHt6xUw==",
+ "dev": true,
+ "requires": {
+ "@types/semver": "^7.5.5",
+ "semver": "^7.5.2"
+ }
+ },
+ "conventional-commits-parser": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-6.1.0.tgz",
+ "integrity": "sha512-5nxDo7TwKB5InYBl4ZC//1g9GRwB/F3TXOGR9hgUjMGfvSP4Vu5NkpNro2+1+TIEy1vwxApl5ircECr2ri5JIw==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "requires": {
+ "meow": "^13.0.0"
+ }
+ },
+ "meow": {
+ "version": "13.2.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz",
+ "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==",
"dev": true
}
}
},
"git-up": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz",
- "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==",
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/git-up/-/git-up-8.1.1.tgz",
+ "integrity": "sha512-FDenSF3fVqBYSaJoYy1KSc2wosx0gCvKP+c+PRBht7cAaiCeQlBtfBDX9vgnNOHmdePlSFITVcn4pFfcgNvx3g==",
"dev": true,
"requires": {
"is-ssh": "^1.4.0",
- "parse-url": "^8.1.0"
+ "parse-url": "^9.2.0"
}
},
"git-url-parse": {
- "version": "13.1.0",
- "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-13.1.0.tgz",
- "integrity": "sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==",
+ "version": "16.1.0",
+ "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-16.1.0.tgz",
+ "integrity": "sha512-cPLz4HuK86wClEW7iDdeAKcCVlWXmrLpb2L+G9goW0Z1dtpNS6BXXSOckUTlJT/LDQViE1QZKstNORzHsLnobw==",
"dev": true,
"requires": {
- "git-up": "^7.0.0"
- }
- },
- "gitconfiglocal": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz",
- "integrity": "sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==",
- "dev": true,
- "requires": {
- "ini": "^1.3.2"
+ "git-up": "^8.1.0"
}
},
"glob": {
@@ -15071,15 +14382,6 @@
"type-fest": "^0.20.2"
}
},
- "globalthis": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
- "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
- "dev": true,
- "requires": {
- "define-properties": "^1.1.3"
- }
- },
"globby": {
"version": "11.1.0",
"resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
@@ -15095,37 +14397,15 @@
}
},
"gopd": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
- "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
- "dev": true,
- "requires": {
- "get-intrinsic": "^1.1.3"
- }
- },
- "got": {
- "version": "12.5.3",
- "resolved": "https://registry.npmjs.org/got/-/got-12.5.3.tgz",
- "integrity": "sha512-8wKnb9MGU8IPGRIo+/ukTy9XLJBwDiCpIf5TVzQ9Cpol50eMTpBq2GAuDsuDIz7hTYmZgMgC1e9ydr6kSDWs3w==",
- "dev": true,
- "requires": {
- "@sindresorhus/is": "^5.2.0",
- "@szmarczak/http-timer": "^5.0.1",
- "cacheable-lookup": "^7.0.0",
- "cacheable-request": "^10.2.1",
- "decompress-response": "^6.0.0",
- "form-data-encoder": "^2.1.2",
- "get-stream": "^6.0.1",
- "http2-wrapper": "^2.1.10",
- "lowercase-keys": "^3.0.0",
- "p-cancelable": "^3.0.0",
- "responselike": "^3.0.0"
- }
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "dev": true
},
"graceful-fs": {
- "version": "4.2.10",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
- "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA=="
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
},
"grapheme-splitter": {
"version": "1.0.4",
@@ -15134,13 +14414,13 @@
"dev": true
},
"handlebars": {
- "version": "4.7.7",
- "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz",
- "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==",
+ "version": "4.7.8",
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz",
+ "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==",
"dev": true,
"requires": {
"minimist": "^1.2.5",
- "neo-async": "^2.6.0",
+ "neo-async": "^2.6.2",
"source-map": "^0.6.1",
"uglify-js": "^3.1.4",
"wordwrap": "^1.0.0"
@@ -15161,54 +14441,27 @@
"function-bind": "^1.1.1"
}
},
- "has-bigints": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
- "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
- "dev": true
- },
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"dev": true
},
- "has-property-descriptors": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
- "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
- "dev": true,
- "requires": {
- "get-intrinsic": "^1.1.1"
- }
- },
- "has-proto": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
- "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
- "dev": true
- },
"has-symbols": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
- "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
"dev": true
},
- "has-tostringtag": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
- "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
+ "hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
"dev": true,
"requires": {
- "has-symbols": "^1.0.2"
+ "function-bind": "^1.1.2"
}
},
- "has-yarn": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz",
- "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==",
- "dev": true
- },
"hosted-git-info": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
@@ -15224,12 +14477,6 @@
"integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
"dev": true
},
- "http-cache-semantics": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
- "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
- "dev": true
- },
"http-errors": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
@@ -15244,41 +14491,27 @@
}
},
"http-proxy-agent": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
- "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
+ "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
"dev": true,
"requires": {
- "@tootallnate/once": "1",
- "agent-base": "6",
- "debug": "4"
+ "agent-base": "^7.1.0",
+ "debug": "^4.3.4"
}
},
- "http2-wrapper": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz",
- "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==",
- "dev": true,
- "requires": {
- "quick-lru": "^5.1.1",
- "resolve-alpn": "^1.2.0"
- },
- "dependencies": {
- "quick-lru": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
- "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
- "dev": true
- }
- }
+ "https": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/https/-/https-1.0.0.tgz",
+ "integrity": "sha512-4EC57ddXrkaF0x83Oj8sM6SLQHAWXw90Skqu2M4AEWENZ3F02dFJE/GARA8igO79tcgYqGrD7ae4f5L3um2lgg=="
},
"https-proxy-agent": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
- "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
"dev": true,
"requires": {
- "agent-base": "6",
+ "agent-base": "^7.1.2",
"debug": "4"
}
},
@@ -15303,16 +14536,10 @@
"safer-buffer": ">= 2.1.2 < 3"
}
},
- "ieee754": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
- "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
- "dev": true
- },
"ignore": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.1.tgz",
- "integrity": "sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==",
+ "version": "5.2.4",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
+ "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
"dev": true
},
"import-fresh": {
@@ -15325,12 +14552,6 @@
"resolve-from": "^4.0.0"
}
},
- "import-lazy": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz",
- "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==",
- "dev": true
- },
"import-local": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
@@ -15353,6 +14574,12 @@
"integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
"dev": true
},
+ "index-to-position": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/index-to-position/-/index-to-position-1.1.0.tgz",
+ "integrity": "sha512-XPdx9Dq4t9Qk1mTMbWONJqU7boCoumEH7fRET37HX5+khDUl3J2W6PdALxhILYlIYx2amlwYcRPp28p0tSiojg==",
+ "dev": true
+ },
"inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
@@ -15376,164 +14603,50 @@
"dev": true
},
"inquirer": {
- "version": "9.1.4",
- "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.1.4.tgz",
- "integrity": "sha512-9hiJxE5gkK/cM2d1mTEnuurGTAoHebbkX0BYl3h7iEg7FYfuNIom+nDfBCSWtvSnoSrWCeBxqqBZu26xdlJlXA==",
+ "version": "12.6.0",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-12.6.0.tgz",
+ "integrity": "sha512-3zmmccQd/8o65nPOZJZ+2wqt76Ghw3+LaMrmc6JE/IzcvQhJ1st+QLCOo/iLS85/tILU0myG31a2TAZX0ysAvg==",
"dev": true,
"requires": {
- "ansi-escapes": "^6.0.0",
- "chalk": "^5.1.2",
- "cli-cursor": "^4.0.0",
- "cli-width": "^4.0.0",
- "external-editor": "^3.0.3",
- "figures": "^5.0.0",
- "lodash": "^4.17.21",
- "mute-stream": "0.0.8",
- "ora": "^6.1.2",
- "run-async": "^2.4.0",
- "rxjs": "^7.5.7",
- "string-width": "^5.1.2",
- "strip-ansi": "^7.0.1",
- "through": "^2.3.6",
- "wrap-ansi": "^8.0.1"
+ "@inquirer/core": "^10.1.10",
+ "@inquirer/prompts": "^7.5.0",
+ "@inquirer/type": "^3.0.6",
+ "ansi-escapes": "^4.3.2",
+ "mute-stream": "^2.0.0",
+ "run-async": "^3.0.0",
+ "rxjs": "^7.8.2"
+ }
+ },
+ "ip-address": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz",
+ "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==",
+ "dev": true,
+ "requires": {
+ "jsbn": "1.1.0",
+ "sprintf-js": "^1.1.3"
},
"dependencies": {
- "ansi-escapes": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.0.0.tgz",
- "integrity": "sha512-IG23inYII3dWlU2EyiAiGj6Bwal5GzsgPMwjYGvc1HPE2dgbj4ZB5ToWBKSquKw74nB3TIuOwaI6/jSULzfgrw==",
- "dev": true,
- "requires": {
- "type-fest": "^3.0.0"
- }
- },
- "ansi-regex": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
- "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+ "sprintf-js": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz",
+ "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==",
"dev": true
- },
- "ansi-styles": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
- "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
- "dev": true
- },
- "chalk": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz",
- "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==",
- "dev": true
- },
- "emoji-regex": {
- "version": "9.2.2",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
- "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
- "dev": true
- },
- "string-width": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
- "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
- "dev": true,
- "requires": {
- "eastasianwidth": "^0.2.0",
- "emoji-regex": "^9.2.2",
- "strip-ansi": "^7.0.1"
- }
- },
- "strip-ansi": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz",
- "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==",
- "dev": true,
- "requires": {
- "ansi-regex": "^6.0.1"
- }
- },
- "type-fest": {
- "version": "3.5.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.5.1.tgz",
- "integrity": "sha512-70T99cpILFk2fzwuljwWxmazSphFrdOe3gRHbp6bqs71pxFBbJwFqnmkLO2lQL6aLHxHmYAnP/sL+AJWpT70jA==",
- "dev": true
- },
- "wrap-ansi": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.0.1.tgz",
- "integrity": "sha512-QFF+ufAqhoYHvoHdajT/Po7KoXVBPXS2bgjIam5isfWJPfIOnQZ50JtUiVvCv/sjgacf3yRrt2ZKUZ/V4itN4g==",
- "dev": true,
- "requires": {
- "ansi-styles": "^6.1.0",
- "string-width": "^5.0.1",
- "strip-ansi": "^7.0.1"
- }
}
}
},
- "internal-slot": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz",
- "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==",
- "dev": true,
- "requires": {
- "get-intrinsic": "^1.1.3",
- "has": "^1.0.3",
- "side-channel": "^1.0.4"
- }
- },
- "interpret": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
- "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
- "dev": true
- },
- "ip": {
- "version": "1.1.8",
- "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz",
- "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==",
- "dev": true
- },
"ipaddr.js": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
"integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
"dev": true
},
- "is-arguments": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz",
- "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
- }
- },
- "is-array-buffer": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.0.tgz",
- "integrity": "sha512-TI2hnvT6dPUnn/jARFCJBKL1eeabAfLnKZ2lmW5Uh317s1Ii2IMroL1yMciEk/G+OETykVzlsH6x/L4q/avhgw==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.3"
- }
- },
"is-arrayish": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
"integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
"dev": true
},
- "is-bigint": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
- "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
- "dev": true,
- "requires": {
- "has-bigints": "^1.0.1"
- }
- },
"is-binary-path": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
@@ -15543,31 +14656,6 @@
"binary-extensions": "^2.0.0"
}
},
- "is-boolean-object": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
- "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
- }
- },
- "is-callable": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
- "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
- "dev": true
- },
- "is-ci": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz",
- "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==",
- "dev": true,
- "requires": {
- "ci-info": "^3.2.0"
- }
- },
"is-core-module": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz",
@@ -15577,19 +14665,10 @@
"has": "^1.0.3"
}
},
- "is-date-object": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
- "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
- "dev": true,
- "requires": {
- "has-tostringtag": "^1.0.0"
- }
- },
"is-docker": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
- "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz",
+ "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==",
"dev": true
},
"is-extglob": {
@@ -15619,31 +14698,13 @@
"is-extglob": "^2.1.1"
}
},
- "is-installed-globally": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz",
- "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==",
+ "is-inside-container": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz",
+ "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==",
"dev": true,
"requires": {
- "global-dirs": "^3.0.0",
- "is-path-inside": "^3.0.2"
- },
- "dependencies": {
- "global-dirs": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz",
- "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==",
- "dev": true,
- "requires": {
- "ini": "2.0.0"
- }
- },
- "ini": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz",
- "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==",
- "dev": true
- }
+ "is-docker": "^3.0.0"
}
},
"is-interactive": {
@@ -15652,39 +14713,12 @@
"integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==",
"dev": true
},
- "is-map": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz",
- "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==",
- "dev": true
- },
- "is-negative-zero": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
- "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==",
- "dev": true
- },
- "is-npm": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz",
- "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==",
- "dev": true
- },
"is-number": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true
},
- "is-number-object": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
- "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
- "dev": true,
- "requires": {
- "has-tostringtag": "^1.0.0"
- }
- },
"is-obj": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
@@ -15708,35 +14742,10 @@
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
"integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="
},
- "is-regex": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
- "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2",
- "has-tostringtag": "^1.0.0"
- }
- },
- "is-set": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz",
- "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==",
- "dev": true
- },
- "is-shared-array-buffer": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz",
- "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2"
- }
- },
"is-ssh": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz",
- "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==",
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.1.tgz",
+ "integrity": "sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg==",
"dev": true,
"requires": {
"protocols": "^2.0.1"
@@ -15748,24 +14757,6 @@
"integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
"dev": true
},
- "is-string": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
- "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
- "dev": true,
- "requires": {
- "has-tostringtag": "^1.0.0"
- }
- },
- "is-symbol": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
- "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
- "dev": true,
- "requires": {
- "has-symbols": "^1.0.2"
- }
- },
"is-text-path": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz",
@@ -15775,67 +14766,40 @@
"text-extensions": "^1.0.0"
}
},
- "is-typed-array": {
- "version": "1.1.10",
- "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz",
- "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==",
- "dev": true,
- "requires": {
- "available-typed-arrays": "^1.0.5",
- "call-bind": "^1.0.2",
- "for-each": "^0.3.3",
- "gopd": "^1.0.1",
- "has-tostringtag": "^1.0.0"
- }
- },
- "is-typedarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
- "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
- "dev": true
- },
"is-unicode-supported": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz",
- "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==",
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz",
+ "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==",
"dev": true
},
- "is-weakref": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
- "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2"
- }
- },
"is-wsl": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
- "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz",
+ "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==",
"dev": true,
"requires": {
- "is-docker": "^2.0.0"
+ "is-inside-container": "^1.0.0"
}
},
- "is-yarn-global": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz",
- "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==",
- "dev": true
- },
- "isarray": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
- "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
- "dev": true
- },
"isexe": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
"dev": true
},
+ "issue-parser": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-7.0.1.tgz",
+ "integrity": "sha512-3YZcUUR2Wt1WsapF+S/WiA2WmlW0cWAoPccMqne7AxEBhCdFeTPjfv/Axb8V2gyCgY3nRw+ksZ3xSUX+R47iAg==",
+ "dev": true,
+ "requires": {
+ "lodash.capitalize": "^4.2.1",
+ "lodash.escaperegexp": "^4.1.2",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.isstring": "^4.0.1",
+ "lodash.uniqby": "^4.7.0"
+ }
+ },
"istanbul-lib-coverage": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz",
@@ -15856,9 +14820,9 @@
},
"dependencies": {
"semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true
}
}
@@ -15895,38 +14859,22 @@
"istanbul-lib-report": "^3.0.0"
}
},
- "iterate-iterator": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.2.tgz",
- "integrity": "sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw==",
- "dev": true
- },
- "iterate-value": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz",
- "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==",
- "dev": true,
- "requires": {
- "es-get-iterator": "^1.0.2",
- "iterate-iterator": "^1.0.1"
- }
- },
"jest": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/jest/-/jest-29.3.1.tgz",
- "integrity": "sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz",
+ "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==",
"dev": true,
"requires": {
- "@jest/core": "^29.3.1",
- "@jest/types": "^29.3.1",
+ "@jest/core": "^29.5.0",
+ "@jest/types": "^29.5.0",
"import-local": "^3.0.2",
- "jest-cli": "^29.3.1"
+ "jest-cli": "^29.5.0"
}
},
"jest-changed-files": {
- "version": "29.2.0",
- "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.2.0.tgz",
- "integrity": "sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz",
+ "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==",
"dev": true,
"requires": {
"execa": "^5.0.0",
@@ -15934,204 +14882,205 @@
}
},
"jest-circus": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.3.1.tgz",
- "integrity": "sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.5.0.tgz",
+ "integrity": "sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==",
"dev": true,
"requires": {
- "@jest/environment": "^29.3.1",
- "@jest/expect": "^29.3.1",
- "@jest/test-result": "^29.3.1",
- "@jest/types": "^29.3.1",
+ "@jest/environment": "^29.5.0",
+ "@jest/expect": "^29.5.0",
+ "@jest/test-result": "^29.5.0",
+ "@jest/types": "^29.5.0",
"@types/node": "*",
"chalk": "^4.0.0",
"co": "^4.6.0",
"dedent": "^0.7.0",
"is-generator-fn": "^2.0.0",
- "jest-each": "^29.3.1",
- "jest-matcher-utils": "^29.3.1",
- "jest-message-util": "^29.3.1",
- "jest-runtime": "^29.3.1",
- "jest-snapshot": "^29.3.1",
- "jest-util": "^29.3.1",
+ "jest-each": "^29.5.0",
+ "jest-matcher-utils": "^29.5.0",
+ "jest-message-util": "^29.5.0",
+ "jest-runtime": "^29.5.0",
+ "jest-snapshot": "^29.5.0",
+ "jest-util": "^29.5.0",
"p-limit": "^3.1.0",
- "pretty-format": "^29.3.1",
+ "pretty-format": "^29.5.0",
+ "pure-rand": "^6.0.0",
"slash": "^3.0.0",
"stack-utils": "^2.0.3"
}
},
"jest-cli": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.3.1.tgz",
- "integrity": "sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.5.0.tgz",
+ "integrity": "sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==",
"dev": true,
"requires": {
- "@jest/core": "^29.3.1",
- "@jest/test-result": "^29.3.1",
- "@jest/types": "^29.3.1",
+ "@jest/core": "^29.5.0",
+ "@jest/test-result": "^29.5.0",
+ "@jest/types": "^29.5.0",
"chalk": "^4.0.0",
"exit": "^0.1.2",
"graceful-fs": "^4.2.9",
"import-local": "^3.0.2",
- "jest-config": "^29.3.1",
- "jest-util": "^29.3.1",
- "jest-validate": "^29.3.1",
+ "jest-config": "^29.5.0",
+ "jest-util": "^29.5.0",
+ "jest-validate": "^29.5.0",
"prompts": "^2.0.1",
"yargs": "^17.3.1"
}
},
"jest-config": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.3.1.tgz",
- "integrity": "sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.5.0.tgz",
+ "integrity": "sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==",
"dev": true,
"requires": {
"@babel/core": "^7.11.6",
- "@jest/test-sequencer": "^29.3.1",
- "@jest/types": "^29.3.1",
- "babel-jest": "^29.3.1",
+ "@jest/test-sequencer": "^29.5.0",
+ "@jest/types": "^29.5.0",
+ "babel-jest": "^29.5.0",
"chalk": "^4.0.0",
"ci-info": "^3.2.0",
"deepmerge": "^4.2.2",
"glob": "^7.1.3",
"graceful-fs": "^4.2.9",
- "jest-circus": "^29.3.1",
- "jest-environment-node": "^29.3.1",
- "jest-get-type": "^29.2.0",
- "jest-regex-util": "^29.2.0",
- "jest-resolve": "^29.3.1",
- "jest-runner": "^29.3.1",
- "jest-util": "^29.3.1",
- "jest-validate": "^29.3.1",
+ "jest-circus": "^29.5.0",
+ "jest-environment-node": "^29.5.0",
+ "jest-get-type": "^29.4.3",
+ "jest-regex-util": "^29.4.3",
+ "jest-resolve": "^29.5.0",
+ "jest-runner": "^29.5.0",
+ "jest-util": "^29.5.0",
+ "jest-validate": "^29.5.0",
"micromatch": "^4.0.4",
"parse-json": "^5.2.0",
- "pretty-format": "^29.3.1",
+ "pretty-format": "^29.5.0",
"slash": "^3.0.0",
"strip-json-comments": "^3.1.1"
}
},
"jest-diff": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.3.1.tgz",
- "integrity": "sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz",
+ "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==",
"dev": true,
"requires": {
"chalk": "^4.0.0",
- "diff-sequences": "^29.3.1",
- "jest-get-type": "^29.2.0",
- "pretty-format": "^29.3.1"
+ "diff-sequences": "^29.4.3",
+ "jest-get-type": "^29.4.3",
+ "pretty-format": "^29.5.0"
}
},
"jest-docblock": {
- "version": "29.2.0",
- "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.2.0.tgz",
- "integrity": "sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==",
+ "version": "29.4.3",
+ "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz",
+ "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==",
"dev": true,
"requires": {
"detect-newline": "^3.0.0"
}
},
"jest-each": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.3.1.tgz",
- "integrity": "sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.5.0.tgz",
+ "integrity": "sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==",
"dev": true,
"requires": {
- "@jest/types": "^29.3.1",
+ "@jest/types": "^29.5.0",
"chalk": "^4.0.0",
- "jest-get-type": "^29.2.0",
- "jest-util": "^29.3.1",
- "pretty-format": "^29.3.1"
+ "jest-get-type": "^29.4.3",
+ "jest-util": "^29.5.0",
+ "pretty-format": "^29.5.0"
}
},
"jest-environment-node": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.3.1.tgz",
- "integrity": "sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz",
+ "integrity": "sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==",
"dev": true,
"requires": {
- "@jest/environment": "^29.3.1",
- "@jest/fake-timers": "^29.3.1",
- "@jest/types": "^29.3.1",
+ "@jest/environment": "^29.5.0",
+ "@jest/fake-timers": "^29.5.0",
+ "@jest/types": "^29.5.0",
"@types/node": "*",
- "jest-mock": "^29.3.1",
- "jest-util": "^29.3.1"
+ "jest-mock": "^29.5.0",
+ "jest-util": "^29.5.0"
}
},
"jest-get-type": {
- "version": "29.2.0",
- "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz",
- "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==",
+ "version": "29.4.3",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz",
+ "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==",
"dev": true
},
"jest-haste-map": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.3.1.tgz",
- "integrity": "sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.5.0.tgz",
+ "integrity": "sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==",
"dev": true,
"requires": {
- "@jest/types": "^29.3.1",
+ "@jest/types": "^29.5.0",
"@types/graceful-fs": "^4.1.3",
"@types/node": "*",
"anymatch": "^3.0.3",
"fb-watchman": "^2.0.0",
"fsevents": "^2.3.2",
"graceful-fs": "^4.2.9",
- "jest-regex-util": "^29.2.0",
- "jest-util": "^29.3.1",
- "jest-worker": "^29.3.1",
+ "jest-regex-util": "^29.4.3",
+ "jest-util": "^29.5.0",
+ "jest-worker": "^29.5.0",
"micromatch": "^4.0.4",
"walker": "^1.0.8"
}
},
"jest-leak-detector": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.3.1.tgz",
- "integrity": "sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz",
+ "integrity": "sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==",
"dev": true,
"requires": {
- "jest-get-type": "^29.2.0",
- "pretty-format": "^29.3.1"
+ "jest-get-type": "^29.4.3",
+ "pretty-format": "^29.5.0"
}
},
"jest-matcher-utils": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz",
- "integrity": "sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz",
+ "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==",
"dev": true,
"requires": {
"chalk": "^4.0.0",
- "jest-diff": "^29.3.1",
- "jest-get-type": "^29.2.0",
- "pretty-format": "^29.3.1"
+ "jest-diff": "^29.5.0",
+ "jest-get-type": "^29.4.3",
+ "pretty-format": "^29.5.0"
}
},
"jest-message-util": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz",
- "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz",
+ "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.12.13",
- "@jest/types": "^29.3.1",
+ "@jest/types": "^29.5.0",
"@types/stack-utils": "^2.0.0",
"chalk": "^4.0.0",
"graceful-fs": "^4.2.9",
"micromatch": "^4.0.4",
- "pretty-format": "^29.3.1",
+ "pretty-format": "^29.5.0",
"slash": "^3.0.0",
"stack-utils": "^2.0.3"
}
},
"jest-mock": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.3.1.tgz",
- "integrity": "sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz",
+ "integrity": "sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==",
"dev": true,
"requires": {
- "@jest/types": "^29.3.1",
+ "@jest/types": "^29.5.0",
"@types/node": "*",
- "jest-util": "^29.3.1"
+ "jest-util": "^29.5.0"
}
},
"jest-pnp-resolver": {
@@ -16142,101 +15091,101 @@
"requires": {}
},
"jest-regex-util": {
- "version": "29.2.0",
- "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.2.0.tgz",
- "integrity": "sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==",
+ "version": "29.4.3",
+ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz",
+ "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==",
"dev": true
},
"jest-resolve": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.3.1.tgz",
- "integrity": "sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.5.0.tgz",
+ "integrity": "sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==",
"dev": true,
"requires": {
"chalk": "^4.0.0",
"graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.3.1",
+ "jest-haste-map": "^29.5.0",
"jest-pnp-resolver": "^1.2.2",
- "jest-util": "^29.3.1",
- "jest-validate": "^29.3.1",
+ "jest-util": "^29.5.0",
+ "jest-validate": "^29.5.0",
"resolve": "^1.20.0",
- "resolve.exports": "^1.1.0",
+ "resolve.exports": "^2.0.0",
"slash": "^3.0.0"
}
},
"jest-resolve-dependencies": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.3.1.tgz",
- "integrity": "sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz",
+ "integrity": "sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==",
"dev": true,
"requires": {
- "jest-regex-util": "^29.2.0",
- "jest-snapshot": "^29.3.1"
+ "jest-regex-util": "^29.4.3",
+ "jest-snapshot": "^29.5.0"
}
},
"jest-runner": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.3.1.tgz",
- "integrity": "sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.5.0.tgz",
+ "integrity": "sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==",
"dev": true,
"requires": {
- "@jest/console": "^29.3.1",
- "@jest/environment": "^29.3.1",
- "@jest/test-result": "^29.3.1",
- "@jest/transform": "^29.3.1",
- "@jest/types": "^29.3.1",
+ "@jest/console": "^29.5.0",
+ "@jest/environment": "^29.5.0",
+ "@jest/test-result": "^29.5.0",
+ "@jest/transform": "^29.5.0",
+ "@jest/types": "^29.5.0",
"@types/node": "*",
"chalk": "^4.0.0",
"emittery": "^0.13.1",
"graceful-fs": "^4.2.9",
- "jest-docblock": "^29.2.0",
- "jest-environment-node": "^29.3.1",
- "jest-haste-map": "^29.3.1",
- "jest-leak-detector": "^29.3.1",
- "jest-message-util": "^29.3.1",
- "jest-resolve": "^29.3.1",
- "jest-runtime": "^29.3.1",
- "jest-util": "^29.3.1",
- "jest-watcher": "^29.3.1",
- "jest-worker": "^29.3.1",
+ "jest-docblock": "^29.4.3",
+ "jest-environment-node": "^29.5.0",
+ "jest-haste-map": "^29.5.0",
+ "jest-leak-detector": "^29.5.0",
+ "jest-message-util": "^29.5.0",
+ "jest-resolve": "^29.5.0",
+ "jest-runtime": "^29.5.0",
+ "jest-util": "^29.5.0",
+ "jest-watcher": "^29.5.0",
+ "jest-worker": "^29.5.0",
"p-limit": "^3.1.0",
"source-map-support": "0.5.13"
}
},
"jest-runtime": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.3.1.tgz",
- "integrity": "sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.5.0.tgz",
+ "integrity": "sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==",
"dev": true,
"requires": {
- "@jest/environment": "^29.3.1",
- "@jest/fake-timers": "^29.3.1",
- "@jest/globals": "^29.3.1",
- "@jest/source-map": "^29.2.0",
- "@jest/test-result": "^29.3.1",
- "@jest/transform": "^29.3.1",
- "@jest/types": "^29.3.1",
+ "@jest/environment": "^29.5.0",
+ "@jest/fake-timers": "^29.5.0",
+ "@jest/globals": "^29.5.0",
+ "@jest/source-map": "^29.4.3",
+ "@jest/test-result": "^29.5.0",
+ "@jest/transform": "^29.5.0",
+ "@jest/types": "^29.5.0",
"@types/node": "*",
"chalk": "^4.0.0",
"cjs-module-lexer": "^1.0.0",
"collect-v8-coverage": "^1.0.0",
"glob": "^7.1.3",
"graceful-fs": "^4.2.9",
- "jest-haste-map": "^29.3.1",
- "jest-message-util": "^29.3.1",
- "jest-mock": "^29.3.1",
- "jest-regex-util": "^29.2.0",
- "jest-resolve": "^29.3.1",
- "jest-snapshot": "^29.3.1",
- "jest-util": "^29.3.1",
+ "jest-haste-map": "^29.5.0",
+ "jest-message-util": "^29.5.0",
+ "jest-mock": "^29.5.0",
+ "jest-regex-util": "^29.4.3",
+ "jest-resolve": "^29.5.0",
+ "jest-snapshot": "^29.5.0",
+ "jest-util": "^29.5.0",
"slash": "^3.0.0",
"strip-bom": "^4.0.0"
}
},
"jest-snapshot": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.3.1.tgz",
- "integrity": "sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz",
+ "integrity": "sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==",
"dev": true,
"requires": {
"@babel/core": "^7.11.6",
@@ -16245,23 +15194,22 @@
"@babel/plugin-syntax-typescript": "^7.7.2",
"@babel/traverse": "^7.7.2",
"@babel/types": "^7.3.3",
- "@jest/expect-utils": "^29.3.1",
- "@jest/transform": "^29.3.1",
- "@jest/types": "^29.3.1",
+ "@jest/expect-utils": "^29.5.0",
+ "@jest/transform": "^29.5.0",
+ "@jest/types": "^29.5.0",
"@types/babel__traverse": "^7.0.6",
"@types/prettier": "^2.1.5",
"babel-preset-current-node-syntax": "^1.0.0",
"chalk": "^4.0.0",
- "expect": "^29.3.1",
+ "expect": "^29.5.0",
"graceful-fs": "^4.2.9",
- "jest-diff": "^29.3.1",
- "jest-get-type": "^29.2.0",
- "jest-haste-map": "^29.3.1",
- "jest-matcher-utils": "^29.3.1",
- "jest-message-util": "^29.3.1",
- "jest-util": "^29.3.1",
+ "jest-diff": "^29.5.0",
+ "jest-get-type": "^29.4.3",
+ "jest-matcher-utils": "^29.5.0",
+ "jest-message-util": "^29.5.0",
+ "jest-util": "^29.5.0",
"natural-compare": "^1.4.0",
- "pretty-format": "^29.3.1",
+ "pretty-format": "^29.5.0",
"semver": "^7.3.5"
}
},
@@ -16275,12 +15223,12 @@
}
},
"jest-util": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz",
- "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz",
+ "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==",
"dev": true,
"requires": {
- "@jest/types": "^29.3.1",
+ "@jest/types": "^29.5.0",
"@types/node": "*",
"chalk": "^4.0.0",
"ci-info": "^3.2.0",
@@ -16289,17 +15237,17 @@
}
},
"jest-validate": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.3.1.tgz",
- "integrity": "sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.5.0.tgz",
+ "integrity": "sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==",
"dev": true,
"requires": {
- "@jest/types": "^29.3.1",
+ "@jest/types": "^29.5.0",
"camelcase": "^6.2.0",
"chalk": "^4.0.0",
- "jest-get-type": "^29.2.0",
+ "jest-get-type": "^29.4.3",
"leven": "^3.1.0",
- "pretty-format": "^29.3.1"
+ "pretty-format": "^29.5.0"
},
"dependencies": {
"camelcase": {
@@ -16311,29 +15259,29 @@
}
},
"jest-watcher": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.3.1.tgz",
- "integrity": "sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz",
+ "integrity": "sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==",
"dev": true,
"requires": {
- "@jest/test-result": "^29.3.1",
- "@jest/types": "^29.3.1",
+ "@jest/test-result": "^29.5.0",
+ "@jest/types": "^29.5.0",
"@types/node": "*",
"ansi-escapes": "^4.2.1",
"chalk": "^4.0.0",
"emittery": "^0.13.1",
- "jest-util": "^29.3.1",
+ "jest-util": "^29.5.0",
"string-length": "^4.0.1"
}
},
"jest-worker": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.3.1.tgz",
- "integrity": "sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz",
+ "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==",
"dev": true,
"requires": {
"@types/node": "*",
- "jest-util": "^29.3.1",
+ "jest-util": "^29.5.0",
"merge-stream": "^2.0.0",
"supports-color": "^8.0.0"
},
@@ -16349,6 +15297,12 @@
}
}
},
+ "jiti": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz",
+ "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==",
+ "dev": true
+ },
"js-sdsl": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz",
@@ -16370,24 +15324,18 @@
"argparse": "^2.0.1"
}
},
+ "jsbn": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz",
+ "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==",
+ "dev": true
+ },
"jsesc": {
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
"integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
"dev": true
},
- "json-buffer": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
- "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
- "dev": true
- },
- "json-parse-better-errors": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
- "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
- "dev": true
- },
"json-parse-even-better-errors": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
@@ -16443,15 +15391,6 @@
"through": ">=2.2.7 <3"
}
},
- "keyv": {
- "version": "4.5.2",
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz",
- "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==",
- "dev": true,
- "requires": {
- "json-buffer": "3.0.1"
- }
- },
"kind-of": {
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
@@ -16464,15 +15403,6 @@
"integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
"dev": true
},
- "latest-version": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz",
- "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==",
- "dev": true,
- "requires": {
- "package-json": "^8.1.0"
- }
- },
"leven": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
@@ -16495,42 +15425,6 @@
"integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
"dev": true
},
- "load-json-file": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
- "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==",
- "dev": true,
- "requires": {
- "graceful-fs": "^4.1.2",
- "parse-json": "^4.0.0",
- "pify": "^3.0.0",
- "strip-bom": "^3.0.0"
- },
- "dependencies": {
- "parse-json": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
- "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==",
- "dev": true,
- "requires": {
- "error-ex": "^1.3.1",
- "json-parse-better-errors": "^1.0.1"
- }
- },
- "pify": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
- "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==",
- "dev": true
- },
- "strip-bom": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
- "dev": true
- }
- }
- },
"locate-path": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
@@ -16552,24 +15446,42 @@
"integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==",
"dev": true
},
+ "lodash.capitalize": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz",
+ "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==",
+ "dev": true
+ },
+ "lodash.escaperegexp": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz",
+ "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==",
+ "dev": true
+ },
+ "lodash.get": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
+ "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==",
+ "dev": true
+ },
"lodash.isfunction": {
"version": "3.0.9",
"resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz",
"integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==",
"dev": true
},
- "lodash.ismatch": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz",
- "integrity": "sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==",
- "dev": true
- },
"lodash.isplainobject": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
"integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
"dev": true
},
+ "lodash.isstring": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
+ "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==",
+ "dev": true
+ },
"lodash.kebabcase": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz",
@@ -16612,6 +15524,12 @@
"integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==",
"dev": true
},
+ "lodash.uniqby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz",
+ "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==",
+ "dev": true
+ },
"lodash.upperfirst": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz",
@@ -16619,29 +15537,29 @@
"dev": true
},
"log-symbols": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz",
- "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==",
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz",
+ "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==",
"dev": true,
"requires": {
- "chalk": "^5.0.0",
- "is-unicode-supported": "^1.1.0"
+ "chalk": "^5.3.0",
+ "is-unicode-supported": "^1.3.0"
},
"dependencies": {
"chalk": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz",
- "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==",
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz",
+ "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==",
+ "dev": true
+ },
+ "is-unicode-supported": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz",
+ "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==",
"dev": true
}
}
},
- "lowercase-keys": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz",
- "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==",
- "dev": true
- },
"lru-cache": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
@@ -16652,9 +15570,9 @@
}
},
"macos-release": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-3.1.0.tgz",
- "integrity": "sha512-/M/R0gCDgM+Cv1IuBG1XGdfTFnMEG6PZeT+KGWHO/OG+imqmaD9CH5vHBTycEM3+Kc4uG2Il+tFAuUWLqQOeUA==",
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-3.3.0.tgz",
+ "integrity": "sha512-tPJQ1HeyiU2vRruNGhZ+VleWuMQRro8iFtJxYgnS4NQe+EukKF6aGiIT+7flZhISAt2iaXBCfFGvAyif7/f8nQ==",
"dev": true
},
"make-dir": {
@@ -16667,9 +15585,9 @@
},
"dependencies": {
"semver": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
- "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"dev": true
}
}
@@ -16695,6 +15613,12 @@
"integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
"dev": true
},
+ "math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "dev": true
+ },
"media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
@@ -16735,9 +15659,9 @@
}
},
"merge-descriptors": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
- "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==",
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
+ "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
"dev": true
},
"merge-stream": {
@@ -16759,12 +15683,12 @@
"dev": true
},
"micromatch": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
- "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
"dev": true,
"requires": {
- "braces": "^3.0.2",
+ "braces": "^3.0.3",
"picomatch": "^2.3.1"
}
},
@@ -16777,14 +15701,12 @@
"mime-db": {
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
- "dev": true
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
},
"mime-types": {
"version": "2.1.35",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
- "dev": true,
"requires": {
"mime-db": "1.52.0"
}
@@ -16795,10 +15717,10 @@
"integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
"dev": true
},
- "mimic-response": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz",
- "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==",
+ "mimic-function": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz",
+ "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==",
"dev": true
},
"min-indent": {
@@ -16833,21 +15755,15 @@
"kind-of": "^6.0.3"
}
},
- "modify-values": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz",
- "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==",
- "dev": true
- },
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
},
"mute-stream": {
- "version": "0.0.8",
- "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
- "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz",
+ "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==",
"dev": true
},
"mylas": {
@@ -16915,12 +15831,6 @@
"propagate": "^2.0.0"
}
},
- "node-domexception": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
- "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
- "dev": true
- },
"node-fetch": {
"version": "2.6.7",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz",
@@ -16929,6 +15839,12 @@
"whatwg-url": "^5.0.0"
}
},
+ "node-fetch-native": {
+ "version": "1.6.6",
+ "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.6.tgz",
+ "integrity": "sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==",
+ "dev": true
+ },
"node-int64": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
@@ -16936,9 +15852,9 @@
"dev": true
},
"node-releases": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz",
- "integrity": "sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==",
+ "version": "2.0.12",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz",
+ "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==",
"dev": true
},
"normalize-package-data": {
@@ -16959,12 +15875,6 @@
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
"dev": true
},
- "normalize-url": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz",
- "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==",
- "dev": true
- },
"npm-run-path": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
@@ -16974,30 +15884,39 @@
"path-key": "^3.0.0"
}
},
- "object-inspect": {
- "version": "1.12.2",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
- "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==",
- "dev": true
- },
- "object-keys": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
- "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
- "dev": true
- },
- "object.assign": {
- "version": "4.1.4",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz",
- "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==",
+ "nypm": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.0.tgz",
+ "integrity": "sha512-mn8wBFV9G9+UFHIrq+pZ2r2zL4aPau/by3kJb3cM7+5tQHMt6HGQB8FDIeKFYp8o0D2pnH6nVsO88N4AmUxIWg==",
"dev": true,
"requires": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "has-symbols": "^1.0.3",
- "object-keys": "^1.1.1"
+ "citty": "^0.1.6",
+ "consola": "^3.4.0",
+ "pathe": "^2.0.3",
+ "pkg-types": "^2.0.0",
+ "tinyexec": "^0.3.2"
+ },
+ "dependencies": {
+ "tinyexec": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz",
+ "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==",
+ "dev": true
+ }
}
},
+ "object-inspect": {
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+ "dev": true
+ },
+ "ohash": {
+ "version": "2.0.11",
+ "resolved": "https://registry.npmjs.org/ohash/-/ohash-2.0.11.tgz",
+ "integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==",
+ "dev": true
+ },
"on-finished": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
@@ -17025,63 +15944,81 @@
}
},
"open": {
- "version": "8.4.0",
- "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz",
- "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==",
+ "version": "10.1.2",
+ "resolved": "https://registry.npmjs.org/open/-/open-10.1.2.tgz",
+ "integrity": "sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw==",
"dev": true,
"requires": {
- "define-lazy-prop": "^2.0.0",
- "is-docker": "^2.1.1",
- "is-wsl": "^2.2.0"
+ "default-browser": "^5.2.1",
+ "define-lazy-prop": "^3.0.0",
+ "is-inside-container": "^1.0.0",
+ "is-wsl": "^3.1.0"
}
},
"optionator": {
- "version": "0.9.1",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
- "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+ "version": "0.9.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
+ "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
"dev": true,
"requires": {
+ "@aashutoshrathi/word-wrap": "^1.2.3",
"deep-is": "^0.1.3",
"fast-levenshtein": "^2.0.6",
"levn": "^0.4.1",
"prelude-ls": "^1.2.1",
- "type-check": "^0.4.0",
- "word-wrap": "^1.2.3"
+ "type-check": "^0.4.0"
}
},
"ora": {
- "version": "6.1.2",
- "resolved": "https://registry.npmjs.org/ora/-/ora-6.1.2.tgz",
- "integrity": "sha512-EJQ3NiP5Xo94wJXIzAyOtSb0QEIAUu7m8t6UZ9krbz0vAJqr92JpcK/lEXg91q6B9pEGqrykkd2EQplnifDSBw==",
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz",
+ "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==",
"dev": true,
"requires": {
- "bl": "^5.0.0",
- "chalk": "^5.0.0",
- "cli-cursor": "^4.0.0",
- "cli-spinners": "^2.6.1",
+ "chalk": "^5.3.0",
+ "cli-cursor": "^5.0.0",
+ "cli-spinners": "^2.9.2",
"is-interactive": "^2.0.0",
- "is-unicode-supported": "^1.1.0",
- "log-symbols": "^5.1.0",
- "strip-ansi": "^7.0.1",
- "wcwidth": "^1.0.1"
+ "is-unicode-supported": "^2.0.0",
+ "log-symbols": "^6.0.0",
+ "stdin-discarder": "^0.2.2",
+ "string-width": "^7.2.0",
+ "strip-ansi": "^7.1.0"
},
"dependencies": {
"ansi-regex": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
- "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
"dev": true
},
"chalk": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz",
- "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==",
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz",
+ "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==",
"dev": true
},
+ "emoji-regex": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz",
+ "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==",
+ "dev": true
+ },
+ "string-width": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz",
+ "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^10.3.0",
+ "get-east-asian-width": "^1.0.0",
+ "strip-ansi": "^7.1.0"
+ }
+ },
"strip-ansi": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz",
- "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==",
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
"dev": true,
"requires": {
"ansi-regex": "^6.0.1"
@@ -17090,13 +16027,13 @@
}
},
"os-name": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/os-name/-/os-name-5.0.1.tgz",
- "integrity": "sha512-0EQpaHUHq7olp2/YFUr+0vZi9tMpDTblHGz+Ch5RntKxiRXOAY0JOz1UlxhSjMSksHvkm13eD6elJj3M8Ht/kw==",
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/os-name/-/os-name-6.0.0.tgz",
+ "integrity": "sha512-bv608E0UX86atYi2GMGjDe0vF/X1TJjemNS8oEW6z22YW1Rc3QykSYoGfkQbX0zZX9H0ZB6CQP/3GTf1I5hURg==",
"dev": true,
"requires": {
- "macos-release": "^3.0.1",
- "windows-release": "^5.0.1"
+ "macos-release": "^3.2.0",
+ "windows-release": "^6.0.0"
}
},
"os-tmpdir": {
@@ -17105,12 +16042,6 @@
"integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==",
"dev": true
},
- "p-cancelable": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz",
- "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==",
- "dev": true
- },
"p-limit": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
@@ -17136,45 +16067,31 @@
"dev": true
},
"pac-proxy-agent": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz",
- "integrity": "sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ==",
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz",
+ "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==",
"dev": true,
"requires": {
- "@tootallnate/once": "1",
- "agent-base": "6",
- "debug": "4",
- "get-uri": "3",
- "http-proxy-agent": "^4.0.1",
- "https-proxy-agent": "5",
- "pac-resolver": "^5.0.0",
- "raw-body": "^2.2.0",
- "socks-proxy-agent": "5"
+ "@tootallnate/quickjs-emscripten": "^0.23.0",
+ "agent-base": "^7.1.2",
+ "debug": "^4.3.4",
+ "get-uri": "^6.0.1",
+ "http-proxy-agent": "^7.0.0",
+ "https-proxy-agent": "^7.0.6",
+ "pac-resolver": "^7.0.1",
+ "socks-proxy-agent": "^8.0.5"
}
},
"pac-resolver": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-5.0.1.tgz",
- "integrity": "sha512-cy7u00ko2KVgBAjuhevqpPeHIkCIqPe1v24cydhWjmeuzaBfmUWFCZJ1iAh5TuVzVZoUzXIW7K8sMYOZ84uZ9Q==",
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz",
+ "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==",
"dev": true,
"requires": {
- "degenerator": "^3.0.2",
- "ip": "^1.1.5",
+ "degenerator": "^5.0.0",
"netmask": "^2.0.2"
}
},
- "package-json": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.0.tgz",
- "integrity": "sha512-hySwcV8RAWeAfPsXb9/HGSPn8lwDnv6fabH+obUZKX169QknRkRhPxd1yMubpKDskLFATkl3jHpNtVtDPFA0Wg==",
- "dev": true,
- "requires": {
- "got": "^12.1.0",
- "registry-auth-token": "^5.0.1",
- "registry-url": "^6.0.0",
- "semver": "^7.3.7"
- }
- },
"parent-module": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
@@ -17197,20 +16114,21 @@
}
},
"parse-path": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz",
- "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==",
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.1.0.tgz",
+ "integrity": "sha512-EuCycjZtfPcjWk7KTksnJ5xPMvWGA/6i4zrLYhRG0hGvC3GPU/jGUj3Cy+ZR0v30duV3e23R95T1lE2+lsndSw==",
"dev": true,
"requires": {
"protocols": "^2.0.0"
}
},
"parse-url": {
- "version": "8.1.0",
- "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz",
- "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==",
+ "version": "9.2.0",
+ "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-9.2.0.tgz",
+ "integrity": "sha512-bCgsFI+GeGWPAvAiUv63ZorMeif3/U0zaXABGJbOWt5OH2KCaPHF6S+0ok4aqM9RuIPGyZdx9tR9l13PsW4AYQ==",
"dev": true,
"requires": {
+ "@types/parse-path": "^7.0.0",
"parse-path": "^7.0.0"
}
},
@@ -17245,9 +16163,9 @@
"dev": true
},
"path-to-regexp": {
- "version": "0.1.7",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
- "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==",
+ "version": "0.1.12",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
+ "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==",
"dev": true
},
"path-type": {
@@ -17256,6 +16174,18 @@
"integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
"dev": true
},
+ "pathe": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
+ "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
+ "dev": true
+ },
+ "perfect-debounce": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz",
+ "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==",
+ "dev": true
+ },
"picocolors": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
@@ -17268,16 +16198,10 @@
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"dev": true
},
- "pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
- "dev": true
- },
"pirates": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz",
- "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==",
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
+ "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
"dev": true
},
"pkg-dir": {
@@ -17328,6 +16252,17 @@
}
}
},
+ "pkg-types": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.1.0.tgz",
+ "integrity": "sha512-wmJwA+8ihJixSoHKxZJRBQG1oY8Yr9pGLzRmSsNms0iNWyHHAlZCa7mmKiFR10YPZuz/2k169JiS/inOjBCZ2A==",
+ "dev": true,
+ "requires": {
+ "confbox": "^0.2.1",
+ "exsolve": "^1.0.1",
+ "pathe": "^2.0.3"
+ }
+ },
"plimit-lit": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/plimit-lit/-/plimit-lit-1.5.0.tgz",
@@ -17344,12 +16279,12 @@
"dev": true
},
"pretty-format": {
- "version": "29.3.1",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz",
- "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==",
+ "version": "29.5.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz",
+ "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==",
"dev": true,
"requires": {
- "@jest/schemas": "^29.0.0",
+ "@jest/schemas": "^29.4.3",
"ansi-styles": "^5.0.0",
"react-is": "^18.0.0"
},
@@ -17362,26 +16297,6 @@
}
}
},
- "process-nextick-args": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
- "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
- "dev": true
- },
- "promise.allsettled": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.6.tgz",
- "integrity": "sha512-22wJUOD3zswWFqgwjNHa1965LvqTX87WPu/lreY2KSd7SVcERfuZ4GfUaOnJNnvtoIv2yXT/W00YIGMetXtFXg==",
- "dev": true,
- "requires": {
- "array.prototype.map": "^1.0.5",
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4",
- "get-intrinsic": "^1.1.3",
- "iterate-value": "^1.0.2"
- }
- },
"prompts": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
@@ -17398,16 +16313,10 @@
"integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==",
"dev": true
},
- "proto-list": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
- "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==",
- "dev": true
- },
"protocols": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz",
- "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.2.tgz",
+ "integrity": "sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==",
"dev": true
},
"proxy-addr": {
@@ -17421,34 +16330,25 @@
}
},
"proxy-agent": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-5.0.0.tgz",
- "integrity": "sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g==",
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz",
+ "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==",
"dev": true,
"requires": {
- "agent-base": "^6.0.0",
- "debug": "4",
- "http-proxy-agent": "^4.0.0",
- "https-proxy-agent": "^5.0.0",
- "lru-cache": "^5.1.1",
- "pac-proxy-agent": "^5.0.0",
- "proxy-from-env": "^1.0.0",
- "socks-proxy-agent": "^5.0.0"
+ "agent-base": "^7.1.2",
+ "debug": "^4.3.4",
+ "http-proxy-agent": "^7.0.1",
+ "https-proxy-agent": "^7.0.6",
+ "lru-cache": "^7.14.1",
+ "pac-proxy-agent": "^7.1.0",
+ "proxy-from-env": "^1.1.0",
+ "socks-proxy-agent": "^8.0.5"
},
"dependencies": {
"lru-cache": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
- "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
- "dev": true,
- "requires": {
- "yallist": "^3.0.2"
- }
- },
- "yallist": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
- "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "version": "7.18.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
+ "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
"dev": true
}
}
@@ -17456,8 +16356,7 @@
"proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
- "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
- "dev": true
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
},
"punycode": {
"version": "2.1.1",
@@ -17465,14 +16364,11 @@
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
"dev": true
},
- "pupa": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz",
- "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==",
- "dev": true,
- "requires": {
- "escape-goat": "^4.0.0"
- }
+ "pure-rand": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz",
+ "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==",
+ "dev": true
},
"q": {
"version": "1.5.1",
@@ -17481,12 +16377,12 @@
"dev": true
},
"qs": {
- "version": "6.11.0",
- "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
- "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
+ "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
"dev": true,
"requires": {
- "side-channel": "^1.0.4"
+ "side-channel": "^1.0.6"
}
},
"queue-lit": {
@@ -17514,9 +16410,9 @@
"dev": true
},
"raw-body": {
- "version": "2.5.1",
- "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
- "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
+ "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
"dev": true,
"requires": {
"bytes": "3.1.2",
@@ -17525,24 +16421,14 @@
"unpipe": "1.0.0"
}
},
- "rc": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
- "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+ "rc9": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz",
+ "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==",
"dev": true,
"requires": {
- "deep-extend": "^0.6.0",
- "ini": "~1.3.0",
- "minimist": "^1.2.0",
- "strip-json-comments": "~2.0.1"
- },
- "dependencies": {
- "strip-json-comments": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
- "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
- "dev": true
- }
+ "defu": "^6.1.4",
+ "destr": "^2.0.3"
}
},
"react-is": {
@@ -17551,6 +16437,75 @@
"integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==",
"dev": true
},
+ "read-package-up": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/read-package-up/-/read-package-up-11.0.0.tgz",
+ "integrity": "sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==",
+ "dev": true,
+ "requires": {
+ "find-up-simple": "^1.0.0",
+ "read-pkg": "^9.0.0",
+ "type-fest": "^4.6.0"
+ },
+ "dependencies": {
+ "hosted-git-info": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz",
+ "integrity": "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^10.0.1"
+ }
+ },
+ "lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "dev": true
+ },
+ "normalize-package-data": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz",
+ "integrity": "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==",
+ "dev": true,
+ "requires": {
+ "hosted-git-info": "^7.0.0",
+ "semver": "^7.3.5",
+ "validate-npm-package-license": "^3.0.4"
+ }
+ },
+ "parse-json": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-8.3.0.tgz",
+ "integrity": "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.26.2",
+ "index-to-position": "^1.1.0",
+ "type-fest": "^4.39.1"
+ }
+ },
+ "read-pkg": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz",
+ "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==",
+ "dev": true,
+ "requires": {
+ "@types/normalize-package-data": "^2.4.3",
+ "normalize-package-data": "^6.0.0",
+ "parse-json": "^8.0.0",
+ "type-fest": "^4.6.0",
+ "unicorn-magic": "^0.1.0"
+ }
+ },
+ "type-fest": {
+ "version": "4.39.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.39.1.tgz",
+ "integrity": "sha512-uW9qzd66uyHYxwyVBYiwS4Oi0qZyUqwjU+Oevr6ZogYiXt99EOYtwvzMSLw1c3lYo2HzJsep/NB23iEVEgjG/w==",
+ "dev": true
+ }
+ }
+ },
"read-pkg": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
@@ -17582,9 +16537,9 @@
}
},
"semver": {
- "version": "5.7.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
"dev": true
},
"type-fest": {
@@ -17671,15 +16626,6 @@
"picomatch": "^2.2.1"
}
},
- "rechoir": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
- "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==",
- "dev": true,
- "requires": {
- "resolve": "^1.1.6"
- }
- },
"redent": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
@@ -17690,181 +16636,117 @@
"strip-indent": "^3.0.0"
}
},
- "regexp.prototype.flags": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz",
- "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3",
- "functions-have-names": "^1.2.2"
- }
- },
"regexpp": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
"integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
"dev": true
},
- "registry-auth-token": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.1.tgz",
- "integrity": "sha512-UfxVOj8seK1yaIOiieV4FIP01vfBDLsY0H9sQzi9EbbUdJiuuBjJgLa1DpImXMNPnVkBD4eVxTEXcrZA6kfpJA==",
- "dev": true,
- "requires": {
- "@pnpm/npm-conf": "^1.0.4"
- }
- },
- "registry-url": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz",
- "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==",
- "dev": true,
- "requires": {
- "rc": "1.2.8"
- }
- },
"release-it": {
- "version": "15.6.0",
- "resolved": "https://registry.npmjs.org/release-it/-/release-it-15.6.0.tgz",
- "integrity": "sha512-NXewgzO8QV1LOFjn2K7/dgE1Y1cG+2JiLOU/x9X/Lq9UdFn2hTH1r9SSrufCxG+y/Rp+oN8liYTsNptKrj92kg==",
+ "version": "19.0.2",
+ "resolved": "https://registry.npmjs.org/release-it/-/release-it-19.0.2.tgz",
+ "integrity": "sha512-tGRCcKeXNOMrK9Qe+ZIgQiMlQgjV8PLxZjTq1XGlCk5u1qPgx+Pps0i8HIt667FDt0wLjFtvn5o9ItpitKnVUA==",
"dev": true,
"requires": {
- "@iarna/toml": "2.2.5",
- "@octokit/rest": "19.0.5",
+ "@nodeutils/defaults-deep": "1.1.0",
+ "@octokit/rest": "21.1.1",
+ "@phun-ky/typeof": "1.2.8",
"async-retry": "1.3.3",
- "chalk": "5.1.2",
- "cosmiconfig": "8.0.0",
- "execa": "6.1.0",
- "git-url-parse": "13.1.0",
- "globby": "13.1.2",
- "got": "12.5.3",
- "inquirer": "9.1.4",
- "is-ci": "3.0.1",
- "lodash": "4.17.21",
- "mime-types": "2.1.35",
+ "c12": "3.0.3",
+ "ci-info": "^4.2.0",
+ "eta": "3.5.0",
+ "git-url-parse": "16.1.0",
+ "inquirer": "12.6.0",
+ "issue-parser": "7.0.1",
+ "lodash.get": "4.4.2",
+ "lodash.merge": "4.6.2",
+ "mime-types": "3.0.1",
"new-github-release-url": "2.0.0",
- "node-fetch": "3.3.0",
- "open": "8.4.0",
- "ora": "6.1.2",
- "os-name": "5.0.1",
- "promise.allsettled": "1.0.6",
- "proxy-agent": "5.0.0",
- "semver": "7.3.8",
- "shelljs": "0.8.5",
- "update-notifier": "6.0.2",
+ "open": "10.1.2",
+ "ora": "8.2.0",
+ "os-name": "6.0.0",
+ "proxy-agent": "6.5.0",
+ "semver": "7.7.1",
+ "tinyexec": "1.0.1",
+ "tinyglobby": "0.2.13",
+ "undici": "6.21.2",
"url-join": "5.0.0",
- "wildcard-match": "5.1.2",
+ "wildcard-match": "5.1.4",
"yargs-parser": "21.1.1"
},
"dependencies": {
- "chalk": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.1.2.tgz",
- "integrity": "sha512-E5CkT4jWURs1Vy5qGJye+XwCkNj7Od3Af7CP6SujMetSMkLs8Do2RWJK5yx1wamHV/op8Rz+9rltjaTQWDnEFQ==",
+ "@octokit/openapi-types": {
+ "version": "24.2.0",
+ "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-24.2.0.tgz",
+ "integrity": "sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==",
"dev": true
},
- "data-uri-to-buffer": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz",
- "integrity": "sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==",
+ "@octokit/plugin-paginate-rest": {
+ "version": "11.6.0",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.6.0.tgz",
+ "integrity": "sha512-n5KPteiF7pWKgBIBJSk8qzoZWcUkza2O6A0za97pMGVrGfPdltxrfmfF5GucHYvHGZD8BdaZmmHGz5cX/3gdpw==",
+ "dev": true,
+ "requires": {
+ "@octokit/types": "^13.10.0"
+ }
+ },
+ "@octokit/plugin-request-log": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-5.3.1.tgz",
+ "integrity": "sha512-n/lNeCtq+9ofhC15xzmJCNKP2BWTv8Ih2TTy+jatNCCq/gQP/V7rK3fjIfuz0pDWDALO/o/4QY4hyOF6TQQFUw==",
+ "dev": true,
+ "requires": {}
+ },
+ "@octokit/plugin-rest-endpoint-methods": {
+ "version": "13.5.0",
+ "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.5.0.tgz",
+ "integrity": "sha512-9Pas60Iv9ejO3WlAX3maE1+38c5nqbJXV5GrncEfkndIpZrJ/WPMRd2xYDcPPEt5yzpxcjw9fWNoPhsSGzqKqw==",
+ "dev": true,
+ "requires": {
+ "@octokit/types": "^13.10.0"
+ }
+ },
+ "@octokit/rest": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-21.1.1.tgz",
+ "integrity": "sha512-sTQV7va0IUVZcntzy1q3QqPm/r8rWtDCqpRAmb8eXXnKkjoQEtFe3Nt5GTVsHft+R6jJoHeSiVLcgcvhtue/rg==",
+ "dev": true,
+ "requires": {
+ "@octokit/core": "^6.1.4",
+ "@octokit/plugin-paginate-rest": "^11.4.2",
+ "@octokit/plugin-request-log": "^5.3.1",
+ "@octokit/plugin-rest-endpoint-methods": "^13.3.0"
+ }
+ },
+ "@octokit/types": {
+ "version": "13.10.0",
+ "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz",
+ "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==",
+ "dev": true,
+ "requires": {
+ "@octokit/openapi-types": "^24.2.0"
+ }
+ },
+ "ci-info": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.2.0.tgz",
+ "integrity": "sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg==",
"dev": true
},
- "execa": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/execa/-/execa-6.1.0.tgz",
- "integrity": "sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA==",
- "dev": true,
- "requires": {
- "cross-spawn": "^7.0.3",
- "get-stream": "^6.0.1",
- "human-signals": "^3.0.1",
- "is-stream": "^3.0.0",
- "merge-stream": "^2.0.0",
- "npm-run-path": "^5.1.0",
- "onetime": "^6.0.0",
- "signal-exit": "^3.0.7",
- "strip-final-newline": "^3.0.0"
- }
+ "mime-db": {
+ "version": "1.54.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
+ "dev": true
},
- "globby": {
- "version": "13.1.2",
- "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz",
- "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==",
- "dev": true,
- "requires": {
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.2.11",
- "ignore": "^5.2.0",
- "merge2": "^1.4.1",
- "slash": "^4.0.0"
- }
- },
- "human-signals": {
+ "mime-types": {
"version": "3.0.1",
- "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-3.0.1.tgz",
- "integrity": "sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ==",
- "dev": true
- },
- "is-stream": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
- "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
- "dev": true
- },
- "mimic-fn": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
- "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
- "dev": true
- },
- "node-fetch": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.0.tgz",
- "integrity": "sha512-BKwRP/O0UvoMKp7GNdwPlObhYGB5DQqwhEDQlNKuoqwVYSxkSZCSbHjnFFmUEtwSKRPU4kNK8PbDYYitwaE3QA==",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz",
+ "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==",
"dev": true,
"requires": {
- "data-uri-to-buffer": "^4.0.0",
- "fetch-blob": "^3.1.4",
- "formdata-polyfill": "^4.0.10"
+ "mime-db": "^1.54.0"
}
- },
- "npm-run-path": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz",
- "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==",
- "dev": true,
- "requires": {
- "path-key": "^4.0.0"
- }
- },
- "onetime": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
- "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
- "dev": true,
- "requires": {
- "mimic-fn": "^4.0.0"
- }
- },
- "path-key": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
- "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
- "dev": true
- },
- "slash": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz",
- "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==",
- "dev": true
- },
- "strip-final-newline": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
- "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",
- "dev": true
}
}
},
@@ -17891,12 +16773,6 @@
"supports-preserve-symlinks-flag": "^1.0.0"
}
},
- "resolve-alpn": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
- "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==",
- "dev": true
- },
"resolve-cwd": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
@@ -17930,28 +16806,36 @@
}
},
"resolve.exports": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.0.tgz",
- "integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz",
+ "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==",
"dev": true
},
- "responselike": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz",
- "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==",
- "dev": true,
- "requires": {
- "lowercase-keys": "^3.0.0"
- }
- },
"restore-cursor": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz",
- "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==",
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-5.1.0.tgz",
+ "integrity": "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==",
"dev": true,
"requires": {
- "onetime": "^5.1.0",
- "signal-exit": "^3.0.2"
+ "onetime": "^7.0.0",
+ "signal-exit": "^4.1.0"
+ },
+ "dependencies": {
+ "onetime": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-7.0.0.tgz",
+ "integrity": "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==",
+ "dev": true,
+ "requires": {
+ "mimic-function": "^5.0.0"
+ }
+ },
+ "signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true
+ }
}
},
"retry": {
@@ -17975,10 +16859,16 @@
"glob": "^7.1.3"
}
},
+ "run-applescript": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz",
+ "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==",
+ "dev": true
+ },
"run-async": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
- "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz",
+ "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==",
"dev": true
},
"run-parallel": {
@@ -17991,18 +16881,18 @@
}
},
"rxjs": {
- "version": "7.8.0",
- "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz",
- "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==",
+ "version": "7.8.2",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz",
+ "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
"dev": true,
"requires": {
"tslib": "^2.1.0"
},
"dependencies": {
"tslib": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz",
- "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==",
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
"dev": true
}
}
@@ -18013,17 +16903,6 @@
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
"dev": true
},
- "safe-regex-test": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz",
- "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2",
- "get-intrinsic": "^1.1.3",
- "is-regex": "^1.1.4"
- }
- },
"safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
@@ -18031,27 +16910,15 @@
"dev": true
},
"semver": {
- "version": "7.3.8",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz",
- "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==",
- "dev": true,
- "requires": {
- "lru-cache": "^6.0.0"
- }
- },
- "semver-diff": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz",
- "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==",
- "dev": true,
- "requires": {
- "semver": "^7.3.5"
- }
+ "version": "7.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz",
+ "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==",
+ "dev": true
},
"send": {
- "version": "0.18.0",
- "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
- "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
+ "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
"dev": true,
"requires": {
"debug": "2.6.9",
@@ -18086,6 +16953,12 @@
}
}
},
+ "encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+ "dev": true
+ },
"ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@@ -18095,15 +16968,15 @@
}
},
"serve-static": {
- "version": "1.15.0",
- "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
- "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
+ "version": "1.16.2",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
+ "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
"dev": true,
"requires": {
- "encodeurl": "~1.0.2",
+ "encodeurl": "~2.0.0",
"escape-html": "~1.0.3",
"parseurl": "~1.3.3",
- "send": "0.18.0"
+ "send": "0.19.0"
}
},
"setprototypeof": {
@@ -18127,26 +17000,52 @@
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
"dev": true
},
- "shelljs": {
- "version": "0.8.5",
- "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz",
- "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==",
+ "side-channel": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
"dev": true,
"requires": {
- "glob": "^7.0.0",
- "interpret": "^1.0.0",
- "rechoir": "^0.6.2"
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3",
+ "side-channel-list": "^1.0.0",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
}
},
- "side-channel": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
- "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+ "side-channel-list": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
"dev": true,
"requires": {
- "call-bind": "^1.0.0",
- "get-intrinsic": "^1.0.2",
- "object-inspect": "^1.9.0"
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3"
+ }
+ },
+ "side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "dev": true,
+ "requires": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ }
+ },
+ "side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "dev": true,
+ "requires": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
}
},
"signal-exit": {
@@ -18156,9 +17055,9 @@
"dev": true
},
"simple-git": {
- "version": "3.15.1",
- "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.15.1.tgz",
- "integrity": "sha512-73MVa5984t/JP4JcQt0oZlKGr42ROYWC3BcUZfuHtT3IHKPspIvL0cZBnvPXF7LL3S/qVeVHVdYYmJ3LOTw4Rg==",
+ "version": "3.19.0",
+ "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.19.0.tgz",
+ "integrity": "sha512-hyH2p9Ptxjf/xPuL7HfXbpYt9gKhC1yWDh3KYIAYJJePAKV7AEjLN4xhp7lozOdNiaJ9jlVvAbBymVlcS2jRiA==",
"requires": {
"@kwsites/file-exists": "^1.1.1",
"@kwsites/promise-deferred": "^1.1.1",
@@ -18184,32 +17083,24 @@
"dev": true
},
"socks": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz",
- "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==",
+ "version": "2.8.4",
+ "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz",
+ "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==",
"dev": true,
"requires": {
- "ip": "^2.0.0",
+ "ip-address": "^9.0.5",
"smart-buffer": "^4.2.0"
- },
- "dependencies": {
- "ip": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz",
- "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==",
- "dev": true
- }
}
},
"socks-proxy-agent": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz",
- "integrity": "sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ==",
+ "version": "8.0.5",
+ "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz",
+ "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==",
"dev": true,
"requires": {
- "agent-base": "^6.0.2",
- "debug": "4",
- "socks": "^2.3.3"
+ "agent-base": "^7.1.2",
+ "debug": "^4.3.4",
+ "socks": "^2.8.3"
}
},
"source-map": {
@@ -18260,15 +17151,6 @@
"integrity": "sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==",
"dev": true
},
- "split": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz",
- "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==",
- "dev": true,
- "requires": {
- "through": "2"
- }
- },
"split2": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz",
@@ -18307,6 +17189,12 @@
"integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
"dev": true
},
+ "stdin-discarder": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.2.2.tgz",
+ "integrity": "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==",
+ "dev": true
+ },
"string_decoder": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
@@ -18337,28 +17225,6 @@
"strip-ansi": "^6.0.1"
}
},
- "string.prototype.trimend": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz",
- "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4"
- }
- },
- "string.prototype.trimstart": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz",
- "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.4",
- "es-abstract": "^1.20.4"
- }
- },
"strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
@@ -18448,6 +17314,37 @@
"readable-stream": "3"
}
},
+ "tinyexec": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz",
+ "integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==",
+ "dev": true
+ },
+ "tinyglobby": {
+ "version": "0.2.13",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz",
+ "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==",
+ "dev": true,
+ "requires": {
+ "fdir": "^6.4.4",
+ "picomatch": "^4.0.2"
+ },
+ "dependencies": {
+ "fdir": {
+ "version": "6.4.4",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz",
+ "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==",
+ "dev": true,
+ "requires": {}
+ },
+ "picomatch": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
+ "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
+ "dev": true
+ }
+ }
+ },
"tmp": {
"version": "0.0.33",
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
@@ -18463,12 +17360,6 @@
"integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
"dev": true
},
- "to-fast-properties": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
- "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
- "dev": true
- },
"to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -18502,18 +17393,18 @@
"dev": true
},
"ts-jest": {
- "version": "29.0.3",
- "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.0.3.tgz",
- "integrity": "sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ==",
+ "version": "29.1.1",
+ "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz",
+ "integrity": "sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==",
"dev": true,
"requires": {
"bs-logger": "0.x",
"fast-json-stable-stringify": "2.x",
"jest-util": "^29.0.0",
- "json5": "^2.2.1",
+ "json5": "^2.2.3",
"lodash.memoize": "4.x",
"make-error": "1.x",
- "semver": "7.x",
+ "semver": "^7.5.3",
"yargs-parser": "^21.0.1"
}
},
@@ -18622,32 +17513,12 @@
"mime-types": "~2.1.24"
}
},
- "typed-array-length": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz",
- "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2",
- "for-each": "^0.3.3",
- "is-typed-array": "^1.1.9"
- }
- },
"typedarray": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
"integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==",
"dev": true
},
- "typedarray-to-buffer": {
- "version": "3.1.5",
- "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
- "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
- "dev": true,
- "requires": {
- "is-typedarray": "^1.0.0"
- }
- },
"typescript": {
"version": "4.9.4",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz",
@@ -18655,32 +17526,23 @@
"dev": true
},
"uglify-js": {
- "version": "3.17.4",
- "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz",
- "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==",
+ "version": "3.19.3",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz",
+ "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==",
"dev": true,
"optional": true
},
- "unbox-primitive": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
- "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
- "dev": true,
- "requires": {
- "call-bind": "^1.0.2",
- "has-bigints": "^1.0.2",
- "has-symbols": "^1.0.3",
- "which-boxed-primitive": "^1.0.2"
- }
+ "undici": {
+ "version": "6.21.2",
+ "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.2.tgz",
+ "integrity": "sha512-uROZWze0R0itiAKVPsYhFov9LxrPMHLMEQFszeI2gCN6bnIIZ8twzBCJcN2LJrBBLfrP0t1FW0g+JmKVl8Vk1g==",
+ "dev": true
},
- "unique-string": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz",
- "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==",
- "dev": true,
- "requires": {
- "crypto-random-string": "^4.0.0"
- }
+ "unicorn-magic": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz",
+ "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==",
+ "dev": true
},
"universal-user-agent": {
"version": "6.0.0",
@@ -18699,45 +17561,15 @@
"dev": true
},
"update-browserslist-db": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz",
- "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==",
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz",
+ "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==",
"dev": true,
"requires": {
"escalade": "^3.1.1",
"picocolors": "^1.0.0"
}
},
- "update-notifier": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz",
- "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==",
- "dev": true,
- "requires": {
- "boxen": "^7.0.0",
- "chalk": "^5.0.1",
- "configstore": "^6.0.0",
- "has-yarn": "^3.0.0",
- "import-lazy": "^4.0.0",
- "is-ci": "^3.0.1",
- "is-installed-globally": "^0.4.0",
- "is-npm": "^6.0.0",
- "is-yarn-global": "^0.4.0",
- "latest-version": "^7.0.0",
- "pupa": "^3.1.0",
- "semver": "^7.3.7",
- "semver-diff": "^4.0.0",
- "xdg-basedir": "^5.1.0"
- },
- "dependencies": {
- "chalk": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz",
- "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==",
- "dev": true
- }
- }
- },
"uri-js": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
@@ -18777,9 +17609,9 @@
"dev": true
},
"v8-to-istanbul": {
- "version": "9.0.1",
- "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz",
- "integrity": "sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==",
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz",
+ "integrity": "sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==",
"dev": true,
"requires": {
"@jridgewell/trace-mapping": "^0.3.12",
@@ -18811,16 +17643,6 @@
"integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
"dev": true
},
- "vm2": {
- "version": "3.9.13",
- "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.13.tgz",
- "integrity": "sha512-0rvxpB8P8Shm4wX2EKOiMp7H2zq+HUE/UwodY0pCZXs9IffIKZq6vUti5OgkVCTakKo9e/fgO4X1fkwfjWxE3Q==",
- "dev": true,
- "requires": {
- "acorn": "^8.7.0",
- "acorn-walk": "^8.2.0"
- }
- },
"walker": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
@@ -18830,21 +17652,6 @@
"makeerror": "1.0.12"
}
},
- "wcwidth": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
- "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
- "dev": true,
- "requires": {
- "defaults": "^1.0.3"
- }
- },
- "web-streams-polyfill": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz",
- "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==",
- "dev": true
- },
"webidl-conversions": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
@@ -18868,97 +17675,100 @@
"isexe": "^2.0.0"
}
},
- "which-boxed-primitive": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
- "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
- "dev": true,
- "requires": {
- "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-typed-array": {
- "version": "1.1.9",
- "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz",
- "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==",
- "dev": true,
- "requires": {
- "available-typed-arrays": "^1.0.5",
- "call-bind": "^1.0.2",
- "for-each": "^0.3.3",
- "gopd": "^1.0.1",
- "has-tostringtag": "^1.0.0",
- "is-typed-array": "^1.1.10"
- }
- },
- "widest-line": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz",
- "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==",
- "dev": true,
- "requires": {
- "string-width": "^5.0.1"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
- "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
- "dev": true
- },
- "emoji-regex": {
- "version": "9.2.2",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
- "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
- "dev": true
- },
- "string-width": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
- "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
- "dev": true,
- "requires": {
- "eastasianwidth": "^0.2.0",
- "emoji-regex": "^9.2.2",
- "strip-ansi": "^7.0.1"
- }
- },
- "strip-ansi": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz",
- "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==",
- "dev": true,
- "requires": {
- "ansi-regex": "^6.0.1"
- }
- }
- }
- },
"wildcard-match": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/wildcard-match/-/wildcard-match-5.1.2.tgz",
- "integrity": "sha512-qNXwI591Z88c8bWxp+yjV60Ch4F8Riawe3iGxbzquhy8Xs9m+0+SLFBGb/0yCTIDElawtaImC37fYZ+dr32KqQ==",
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/wildcard-match/-/wildcard-match-5.1.4.tgz",
+ "integrity": "sha512-wldeCaczs8XXq7hj+5d/F38JE2r7EXgb6WQDM84RVwxy81T/sxB5e9+uZLK9Q9oNz1mlvjut+QtvgaOQFPVq/g==",
"dev": true
},
"windows-release": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-5.0.1.tgz",
- "integrity": "sha512-y1xFdFvdMiDXI3xiOhMbJwt1Y7dUxidha0CWPs1NgjZIjZANTcX7+7bMqNjuezhzb8s5JGEiBAbQjQQYYy7ulw==",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-6.0.1.tgz",
+ "integrity": "sha512-MS3BzG8QK33dAyqwxfYJCJ03arkwKaddUOvvnnlFdXLudflsQF6I8yAxrLBeQk4yO8wjdH/+ax0YzxJEDrOftg==",
"dev": true,
"requires": {
- "execa": "^5.1.1"
+ "execa": "^8.0.1"
+ },
+ "dependencies": {
+ "execa": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz",
+ "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^8.0.1",
+ "human-signals": "^5.0.0",
+ "is-stream": "^3.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^5.1.0",
+ "onetime": "^6.0.0",
+ "signal-exit": "^4.1.0",
+ "strip-final-newline": "^3.0.0"
+ }
+ },
+ "get-stream": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz",
+ "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==",
+ "dev": true
+ },
+ "human-signals": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz",
+ "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==",
+ "dev": true
+ },
+ "is-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz",
+ "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==",
+ "dev": true
+ },
+ "mimic-fn": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz",
+ "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==",
+ "dev": true
+ },
+ "npm-run-path": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz",
+ "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==",
+ "dev": true,
+ "requires": {
+ "path-key": "^4.0.0"
+ }
+ },
+ "onetime": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz",
+ "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==",
+ "dev": true,
+ "requires": {
+ "mimic-fn": "^4.0.0"
+ }
+ },
+ "path-key": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz",
+ "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==",
+ "dev": true
+ },
+ "signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true
+ },
+ "strip-final-newline": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz",
+ "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==",
+ "dev": true
+ }
}
},
- "word-wrap": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
- "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
- "dev": true
- },
"wordwrap": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
@@ -18991,10 +17801,10 @@
"signal-exit": "^3.0.7"
}
},
- "xdg-basedir": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz",
- "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==",
+ "xcase": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/xcase/-/xcase-2.0.1.tgz",
+ "integrity": "sha512-UmFXIPU+9Eg3E9m/728Bii0lAIuoc+6nbrNUKaRPJOFp91ih44qqGlWtxMB6kXFrRD6po+86ksHM5XHCfk6iPw==",
"dev": true
},
"xml": {
@@ -19003,18 +17813,6 @@
"integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==",
"dev": true
},
- "xregexp": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz",
- "integrity": "sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA==",
- "dev": true
- },
- "xtend": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
- "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
- "dev": true
- },
"y18n": {
"version": "5.0.8",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
@@ -19059,6 +17857,12 @@
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
"integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
"dev": true
+ },
+ "yoctocolors-cjs": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz",
+ "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==",
+ "dev": true
}
}
}
diff --git a/package.json b/package.json
index 79bd1c1..ddaaf60 100644
--- a/package.json
+++ b/package.json
@@ -1,17 +1,20 @@
{
- "name": "@lampajr/bper",
- "version": "2.1.0",
- "description": "BPer is a tool to execute automatic git backporting.",
+ "name": "@kie/git-backporting",
+ "version": "4.8.5",
+ "description": "Git backporting is a tool to execute automatic pull request git backporting.",
"author": "",
"license": "MIT",
"private": false,
"main": "./dist/gha/index.js",
"bin": {
- "bper": "./dist/cli/index.js"
+ "git-backporting": "./dist/cli/index.js"
},
"files": [
"dist/cli/index.js"
],
+ "publishConfig": {
+ "access": "public"
+ },
"scripts": {
"prepare": "husky install",
"clean": "rm -rf ./build ./dist",
@@ -20,33 +23,39 @@
"package:cli": "ncc build ./build/src/bin/cli.js -o dist/cli",
"package:gha": "ncc build ./build/src/bin/gha.js -o dist/gha",
"build": "npm run clean && npm run compile && npm run package",
- "test": "jest",
+ "test": "jest --silent",
"test:report": "npm test -- --coverage --testResultsProcessor=jest-sonar-reporter",
"lint": "eslint . --ext .ts",
"lint:fix": "npm run lint -- --fix",
"ts-node": "ts-node",
"postversion": "npm run build && git add dist && rm -rf build",
- "release": "release-it"
+ "release": "release-it",
+ "release:branch": "git checkout -b release/$(release-it --release-version) main",
+ "release:prepare": "release-it --no-npm.publish --no-github.release --no-git.push --no-git.tag --no-git.requireUpstream",
+ "release:prepare:all": "npm run release:branch && npm run release:prepare"
},
"repository": {
"type": "git",
- "url": "git+https://github.com/lampajr/backporting.git"
+ "url": "git+https://github.com/kiegroup/git-backporting.git"
},
"keywords": [
"backporting",
"pull-requests",
+ "merge-requests",
"github-action",
"cherry-pick"
],
"bugs": {
- "url": "https://github.com/lampajr/backporting/issues"
+ "url": "https://github.com/kiegroup/git-backporting/issues"
},
- "homepage": "https://github.com/lampajr/backporting#readme",
+ "homepage": "https://github.com/kiegroup/git-backporting#readme",
"devDependencies": {
"@commitlint/cli": "^17.4.0",
"@commitlint/config-conventional": "^17.4.0",
- "@kie/mock-github": "^0.1.2",
- "@release-it/conventional-changelog": "^5.1.1",
+ "@gitbeaker/rest": "^39.1.0",
+ "@kie/mock-github": "^1.1.0",
+ "@octokit/webhooks-types": "^6.8.0",
+ "@release-it/conventional-changelog": "^10.0.0",
"@types/fs-extra": "^9.0.13",
"@types/jest": "^29.2.4",
"@types/node": "^18.11.17",
@@ -55,11 +64,11 @@
"@vercel/ncc": "^0.36.0",
"eslint": "^8.30.0",
"husky": "^8.0.2",
- "jest": "^29.3.1",
+ "jest": "^29.0.0",
"jest-sonar-reporter": "^2.0.0",
- "release-it": "^15.6.0",
+ "release-it": "^19.0.2",
"semver": "^7.3.8",
- "ts-jest": "^29.0.3",
+ "ts-jest": "^29.0.0",
"ts-node": "^10.8.1",
"tsc-alias": "^1.8.2",
"tsconfig-paths": "^4.1.0",
@@ -67,11 +76,11 @@
},
"dependencies": {
"@actions/core": "^1.10.0",
- "@octokit/rest": "^19.0.5",
- "@octokit/types": "^8.0.0",
- "@octokit/webhooks-types": "^6.8.0",
+ "@octokit/rest": "^18.12.0",
+ "axios": "^1.4.0",
"commander": "^9.3.0",
"fs-extra": "^11.1.0",
+ "https": "^1.0.0",
"simple-git": "^3.15.1"
}
}
diff --git a/src/service/args/args-parser.ts b/src/service/args/args-parser.ts
index 8b44d04..344b3ec 100644
--- a/src/service/args/args-parser.ts
+++ b/src/service/args/args-parser.ts
@@ -4,7 +4,52 @@ import { Args } from "@bp/service/args/args.types";
* Abstract arguments parser interface in charge to parse inputs and
* produce a common Args object
*/
-export default interface ArgsParser {
+export default abstract class ArgsParser {
- parse(): Args;
+ abstract readArgs(): Args;
+
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ private getOrDefault(parsedValue: any, defaultValue?: any) {
+ return parsedValue === undefined ? defaultValue : parsedValue;
+ }
+
+ public parse(): Args {
+ const args = this.readArgs();
+
+ if (!args.pullRequest) {
+ throw new Error("Missing option: pull request must be provided");
+ }
+ // validate and fill with defaults
+ if ((!args.targetBranch || args.targetBranch.trim().length == 0) && !args.targetBranchPattern) {
+ throw new Error("Missing option: target branch(es) or target regular expression must be provided");
+ }
+
+ return {
+ pullRequest: args.pullRequest,
+ targetBranch: args.targetBranch,
+ targetBranchPattern: args.targetBranchPattern,
+ dryRun: this.getOrDefault(args.dryRun, false),
+ auth: this.getOrDefault(args.auth),
+ folder: this.getOrDefault(args.folder),
+ gitClient: this.getOrDefault(args.gitClient),
+ gitUser: this.getOrDefault(args.gitUser),
+ gitEmail: this.getOrDefault(args.gitEmail),
+ title: this.getOrDefault(args.title),
+ body: this.getOrDefault(args.body),
+ bodyPrefix: this.getOrDefault(args.bodyPrefix),
+ bpBranchName: this.getOrDefault(args.bpBranchName),
+ reviewers: this.getOrDefault(args.reviewers, []),
+ assignees: this.getOrDefault(args.assignees, []),
+ inheritReviewers: this.getOrDefault(args.inheritReviewers, true),
+ labels: this.getOrDefault(args.labels, []),
+ inheritLabels: this.getOrDefault(args.inheritLabels, false),
+ squash: this.getOrDefault(args.squash, true),
+ autoNoSquash: this.getOrDefault(args.autoNoSquash, false),
+ strategy: this.getOrDefault(args.strategy),
+ strategyOption: this.getOrDefault(args.strategyOption),
+ cherryPickOptions: this.getOrDefault(args.cherryPickOptions),
+ comments: this.getOrDefault(args.comments),
+ enableErrorNotification: this.getOrDefault(args.enableErrorNotification, false),
+ };
+ }
}
\ No newline at end of file
diff --git a/src/service/args/args-utils.ts b/src/service/args/args-utils.ts
new file mode 100644
index 0000000..d270a14
--- /dev/null
+++ b/src/service/args/args-utils.ts
@@ -0,0 +1,56 @@
+import { Args } from "@bp/service/args/args.types";
+import * as fs from "fs";
+
+/**
+ * Parse the input configuation string as json object and
+ * return it as Args
+ * @param configFileContent
+ * @returns {Args}
+ */
+export function parseArgs(configFileContent: string): Args {
+ return JSON.parse(configFileContent) as Args;
+}
+
+/**
+ * Read a configuration file in json format anf parse it as {Args}
+ * @param pathToFile Full path name of the config file, e.g., /tmp/dir/config-file.json
+ * @returns {Args}
+ */
+export function readConfigFile(pathToFile: string): Args {
+ const asString: string = fs.readFileSync(pathToFile, "utf-8");
+ return parseArgs(asString);
+}
+
+/**
+ * Return the input only if it is not a blank or null string, otherwise returns undefined
+ * @param key input key
+ * @returns the value or undefined
+ */
+export function getOrUndefined(value: string): string | undefined {
+ return value !== "" ? value : undefined;
+}
+
+// get rid of inner spaces too
+export function getAsCleanedCommaSeparatedList(value: string): string[] | undefined {
+ // trim the value
+ const trimmed: string = value.trim();
+ return trimmed !== "" ? trimmed.replace(/\s/g, "").split(",") : undefined;
+}
+
+// preserve inner spaces
+export function getAsCommaSeparatedList(value: string): string[] | undefined {
+ // trim the value
+ const trimmed: string = value.trim();
+ return trimmed !== "" ? trimmed.split(",").map(v => v.trim()) : undefined;
+}
+
+export function getAsSemicolonSeparatedList(value: string): string[] | undefined {
+ // trim the value
+ const trimmed: string = value.trim();
+ return trimmed !== "" ? trimmed.split(";").map(v => v.trim()) : undefined;
+}
+
+export function getAsBooleanOrUndefined(value: string): boolean | undefined {
+ const trimmed = value.trim();
+ return trimmed !== "" ? trimmed.toLowerCase() === "true" : undefined;
+}
\ No newline at end of file
diff --git a/src/service/args/args.types.ts b/src/service/args/args.types.ts
index 0986fdf..78d56f1 100644
--- a/src/service/args/args.types.ts
+++ b/src/service/args/args.types.ts
@@ -1,15 +1,32 @@
/**
- * Input arguments
+ * Tool's input arguments interface
*/
export interface Args {
- dryRun: boolean, // if enabled do not push anything remotely
- auth: string, // git service auth, like github token
- targetBranch: string, // branch on the target repo where the change should be backported to
+ // NOTE: keep targetBranch as singular and of type string for backward compatibilities
+ targetBranch?: string, // comma separated list of branches on the target repo where the change should be backported to
+ targetBranchPattern?: string, // regular expression to extract target branch(es) from pull request labels
pullRequest: string, // url of the pull request to backport
+ dryRun?: boolean, // if enabled do not push anything remotely
+ auth?: string, // git service auth, like github token
folder?: string, // local folder where the repositories should be cloned
- author?: string, // backport pr author, default taken from pr
+ gitClient?: string, // git client
+ gitUser?: string, // local git user, default 'GitHub'
+ gitEmail?: string, // local git email, default 'noreply@github.com'
title?: string, // backport pr title, default original pr title prefixed by target branch
body?: string, // backport pr title, default original pr body prefixed by bodyPrefix
bodyPrefix?: string, // backport pr body prefix, default `backport `
- bpBranchName?: string, // backport pr branch name, default computed from commit
+ // NOTE: keep bpBranchName as singular and of type string for backward compatibilities
+ bpBranchName?: string, // comma separated list of backport pr branch names, default computed from commit and target branches
+ reviewers?: string[], // backport pr reviewers
+ assignees?: string[], // backport pr assignees
+ inheritReviewers?: boolean, // if true and reviewers == [] then inherit reviewers from original pr
+ labels?: string[], // backport pr labels
+ inheritLabels?: boolean, // if true inherit labels from original pr
+ squash?: boolean,
+ autoNoSquash?: boolean,
+ strategy?: string, // cherry-pick merge strategy
+ strategyOption?: string, // cherry-pick merge strategy option
+ cherryPickOptions?: string, // additional cherry-pick options
+ comments?: string[], // additional comments to be posted
+ enableErrorNotification?: boolean, // enable the error notification on original pull request
}
\ No newline at end of file
diff --git a/src/service/args/cli/cli-args-parser.ts b/src/service/args/cli/cli-args-parser.ts
index 8f2b26a..d7728ae 100644
--- a/src/service/args/cli/cli-args-parser.ts
+++ b/src/service/args/cli/cli-args-parser.ts
@@ -2,41 +2,82 @@ import ArgsParser from "@bp/service/args/args-parser";
import { Args } from "@bp/service/args/args.types";
import { Command } from "commander";
import { name, version, description } from "@bp/../package.json";
+import { getAsCleanedCommaSeparatedList, getAsCommaSeparatedList, getAsSemicolonSeparatedList, readConfigFile } from "@bp/service/args/args-utils";
-
-export default class CLIArgsParser implements ArgsParser {
+export default class CLIArgsParser extends ArgsParser {
private getCommand(): Command {
return new Command(name)
.version(version)
.description(description)
- .requiredOption("-tb, --target-branch ", "branch where changes must be backported to.")
- .requiredOption("-pr, --pull-request ", "pull request url, e.g., https://github.com/lampajr/backporting/pull/1.")
- .option("-d, --dry-run", "if enabled the tool does not create any pull request nor push anything remotely", false)
- .option("-a, --auth ", "git service authentication string, e.g., github token.", "")
- .option("-f, --folder ", "local folder where the repo will be checked out, e.g., /tmp/folder.", undefined)
- .option("--title ", "backport pr title, default original pr title prefixed by target branch.", undefined)
- .option("--body ", "backport pr title, default original pr body prefixed by bodyPrefix.", undefined)
- .option("--body-prefix ", "backport pr body prefix, default `backport `.", undefined)
- .option("--bp-branch-name ", "backport pr branch name, default auto-generated by the commit.", undefined);
+ .option("-tb, --target-branch ", "comma separated list of branches where changes must be backported to")
+ .option("-tbp, --target-branch-pattern ", "regular expression pattern to extract target branch(es) from pr labels, the branches will be extracted from the pattern's required `target` named capturing group")
+ .option("-pr, --pull-request ", "pull request url, e.g., https://github.com/kiegroup/git-backporting/pull/1")
+ .option("-d, --dry-run", "if enabled the tool does not create any pull request nor push anything remotely")
+ .option("-a, --auth ", "git authentication string, if not provided fallback by looking for existing env variables like GITHUB_TOKEN")
+ .option("--git-client ", "git client type, if not set it is infered from --pull-request")
+ .option("-gu, --git-user ", "local git user name, default is 'GitHub'")
+ .option("-ge, --git-email ", "local git user email, default is 'noreply@github.com'")
+ .option("-f, --folder ", "local folder where the repo will be checked out, e.g., /tmp/folder")
+ .option("--title ", "backport pr title, default original pr title prefixed by target branch")
+ .option("--body ", "backport pr title, default original pr body prefixed by bodyPrefix")
+ .option("--body-prefix ", "backport pr body prefix, default `backport `")
+ .option("--bp-branch-name ", "comma separated list of backport pr branch names, default auto-generated by the commit and target branch")
+ .option("--reviewers ", "comma separated list of reviewers for the backporting pull request", getAsCleanedCommaSeparatedList)
+ .option("--assignees ", "comma separated list of assignees for the backporting pull request", getAsCleanedCommaSeparatedList)
+ .option("--no-inherit-reviewers", "if provided and reviewers option is empty then inherit them from original pull request")
+ .option("--labels ", "comma separated list of labels to be assigned to the backported pull request", getAsCommaSeparatedList)
+ .option("--inherit-labels", "if true the backported pull request will inherit labels from the original one")
+ .option("--no-squash", "backport all commits found in the pull request. The default behavior is to only backport the first commit that was merged in the base branch")
+ .option("--auto-no-squash", "if the pull request was merged or is open, backport all commits. If the pull request commits were squashed, backport the squashed commit.")
+ .option("--strategy ", "cherry-pick merge strategy, default to 'recursive'", undefined)
+ .option("--strategy-option ", "cherry-pick merge strategy option, default to 'theirs'")
+ .option("--cherry-pick-options ", "additional cherry-pick options")
+ .option("--comments ", "semicolon separated list of additional comments to be posted to the backported pull request", getAsSemicolonSeparatedList)
+ .option("--enable-err-notification", "if true, enable the error notification as comment on the original pull request")
+ .option("-cf, --config-file ", "configuration file containing all valid options, the json must match Args interface");
}
- parse(): Args {
+ readArgs(): Args {
const opts = this.getCommand()
.parse()
.opts();
- return {
- dryRun: opts.dryRun,
- auth: opts.auth,
- pullRequest: opts.pullRequest,
- targetBranch: opts.targetBranch,
- folder: opts.folder,
- title: opts.title,
- body: opts.body,
- bodyPrefix: opts.bodyPrefix,
- bpBranchName: opts.bpBranchName,
- };
+ let args: Args;
+ if (opts.configFile) {
+ // if config file is set ignore all other options
+ args = readConfigFile(opts.configFile);
+ } else {
+ args = {
+ dryRun: opts.dryRun,
+ auth: opts.auth,
+ pullRequest: opts.pullRequest,
+ targetBranch: opts.targetBranch,
+ targetBranchPattern: opts.targetBranchPattern,
+ folder: opts.folder,
+ gitClient: opts.gitClient,
+ gitUser: opts.gitUser,
+ gitEmail: opts.gitEmail,
+ title: opts.title,
+ body: opts.body,
+ bodyPrefix: opts.bodyPrefix,
+ bpBranchName: opts.bpBranchName,
+ reviewers: opts.reviewers,
+ assignees: opts.assignees,
+ inheritReviewers: opts.inheritReviewers,
+ labels: opts.labels,
+ inheritLabels: opts.inheritLabels,
+ squash: opts.squash,
+ autoNoSquash: opts.autoNoSquash,
+ strategy: opts.strategy,
+ strategyOption: opts.strategyOption,
+ cherryPickOptions: opts.cherryPickOptions,
+ comments: opts.comments,
+ enableErrorNotification: opts.enableErrNotification,
+ };
+ }
+
+ return args;
}
}
\ No newline at end of file
diff --git a/src/service/args/gha/gha-args-parser.ts b/src/service/args/gha/gha-args-parser.ts
index e298443..2bb516f 100644
--- a/src/service/args/gha/gha-args-parser.ts
+++ b/src/service/args/gha/gha-args-parser.ts
@@ -1,31 +1,47 @@
import ArgsParser from "@bp/service/args/args-parser";
import { Args } from "@bp/service/args/args.types";
import { getInput } from "@actions/core";
+import { getAsBooleanOrUndefined, getAsCleanedCommaSeparatedList, getAsCommaSeparatedList, getAsSemicolonSeparatedList, getOrUndefined, readConfigFile } from "@bp/service/args/args-utils";
-export default class GHAArgsParser implements ArgsParser {
+export default class GHAArgsParser extends ArgsParser {
- /**
- * Return the input only if it is not a blank or null string, otherwise returns undefined
- * @param key input key
- * @returns the value or undefined
- */
- private _getOrUndefined(key: string): string | undefined {
- const value = getInput(key);
- return value !== "" ? value : undefined;
- }
+ readArgs(): Args {
+ const configFile = getOrUndefined(getInput("config-file"));
- parse(): Args {
- return {
- dryRun: getInput("dry-run") === "true",
- auth: getInput("auth") ? getInput("auth") : "",
- pullRequest: getInput("pull-request"),
- targetBranch: getInput("target-branch"),
- folder: this._getOrUndefined("folder"),
- title: this._getOrUndefined("title"),
- body: this._getOrUndefined("body"),
- bodyPrefix: this._getOrUndefined("body-prefix"),
- bpBranchName: this._getOrUndefined("bp-branch-name"),
- };
+ let args: Args;
+ if (configFile) {
+ args = readConfigFile(configFile);
+ } else {
+ args = {
+ dryRun: getAsBooleanOrUndefined(getInput("dry-run")),
+ auth: getOrUndefined(getInput("auth")),
+ pullRequest: getInput("pull-request"),
+ targetBranch: getOrUndefined(getInput("target-branch")),
+ targetBranchPattern: getOrUndefined(getInput("target-branch-pattern")),
+ folder: getOrUndefined(getInput("folder")),
+ gitClient: getOrUndefined(getInput("git-client")),
+ gitUser: getOrUndefined(getInput("git-user")),
+ gitEmail: getOrUndefined(getInput("git-email")),
+ title: getOrUndefined(getInput("title")),
+ body: getOrUndefined(getInput("body", { trimWhitespace: false })),
+ bodyPrefix: getOrUndefined(getInput("body-prefix", { trimWhitespace: false })),
+ bpBranchName: getOrUndefined(getInput("bp-branch-name")),
+ reviewers: getAsCleanedCommaSeparatedList(getInput("reviewers")),
+ assignees: getAsCleanedCommaSeparatedList(getInput("assignees")),
+ inheritReviewers: !getAsBooleanOrUndefined(getInput("no-inherit-reviewers")),
+ labels: getAsCommaSeparatedList(getInput("labels")),
+ inheritLabels: getAsBooleanOrUndefined(getInput("inherit-labels")),
+ squash: !getAsBooleanOrUndefined(getInput("no-squash")),
+ autoNoSquash: getAsBooleanOrUndefined(getInput("auto-no-squash")),
+ strategy: getOrUndefined(getInput("strategy")),
+ strategyOption: getOrUndefined(getInput("strategy-option")),
+ cherryPickOptions: getOrUndefined(getInput("cherry-pick-options")),
+ comments: getAsSemicolonSeparatedList(getInput("comments")),
+ enableErrorNotification: getAsBooleanOrUndefined(getInput("enable-err-notification")),
+ };
+ }
+
+ return args;
}
}
\ No newline at end of file
diff --git a/src/service/configs/configs-parser.ts b/src/service/configs/configs-parser.ts
index 0b30f08..5b901cb 100644
--- a/src/service/configs/configs-parser.ts
+++ b/src/service/configs/configs-parser.ts
@@ -9,7 +9,7 @@ import LoggerServiceFactory from "../logger/logger-service-factory";
*/
export default abstract class ConfigsParser {
- private readonly logger: LoggerService;
+ protected readonly logger: LoggerService;
constructor() {
this.logger = LoggerServiceFactory.getLogger();
@@ -24,12 +24,12 @@ import LoggerServiceFactory from "../logger/logger-service-factory";
// if pr is opened check if the there exists one single commit
if (configs.originalPullRequest.state == "open") {
- this.logger.warn("Trying to backport an open pull request!");
+ this.logger.warn("Trying to backport an open pull request");
}
- // if PR is closed and not merged log a warning
+ // if PR is closed and not merged throw an error
if (configs.originalPullRequest.state == "closed" && !configs.originalPullRequest.merged) {
- throw new Error("Provided pull request is closed and not merged!");
+ throw new Error("Provided pull request is closed and not merged");
}
return Promise.resolve(configs);
diff --git a/src/service/configs/configs.types.ts b/src/service/configs/configs.types.ts
index ab3f84b..85dd1f9 100644
--- a/src/service/configs/configs.types.ts
+++ b/src/service/configs/configs.types.ts
@@ -1,17 +1,43 @@
-import { GitPullRequest } from "@bp/service/git/git.types";
+import { BackportPullRequest, GitPullRequest } from "@bp/service/git/git.types";
+
+export const MESSAGE_ERROR_PLACEHOLDER = "{{error}}";
+export const MESSAGE_TARGET_BRANCH_PLACEHOLDER = "{{target-branch}}";
+
+export interface LocalGit {
+ user: string, // local git user
+ email: string, // local git email
+}
+
+export interface ErrorNotification {
+ enabled: boolean, // if the error notification is enabled
+ message: string, // notification message, placeholder {{error}} will be replaced with actual error
+}
/**
* Internal configuration object
*/
export interface Configs {
dryRun: boolean,
- auth: string,
- author: string, // author of the backport pr
+ auth?: string,
+ git: LocalGit,
folder: string,
- targetBranch: string,
+ mergeStrategy?: string, // cherry-pick merge strategy
+ mergeStrategyOption?: string, // cherry-pick merge strategy option
+ cherryPickOptions?: string, // additional cherry-pick options
originalPullRequest: GitPullRequest,
- backportPullRequest: GitPullRequest
+ backportPullRequests: BackportPullRequest[],
+ errorNotification: ErrorNotification,
}
+export enum AuthTokenId {
+ // github specific token
+ GITHUB_TOKEN = "GITHUB_TOKEN",
+ // gitlab specific token
+ GITLAB_TOKEN = "GITLAB_TOKEN",
+ // codeberg specific token
+ CODEBERG_TOKEN = "CODEBERG_TOKEN",
+ // generic git token
+ GIT_TOKEN = "GIT_TOKEN",
+}
\ No newline at end of file
diff --git a/src/service/configs/pullrequest/pr-configs-parser.ts b/src/service/configs/pullrequest/pr-configs-parser.ts
index 8e5034e..cb483bd 100644
--- a/src/service/configs/pullrequest/pr-configs-parser.ts
+++ b/src/service/configs/pullrequest/pr-configs-parser.ts
@@ -1,31 +1,68 @@
+import { getAsCleanedCommaSeparatedList, getAsCommaSeparatedList } from "@bp/service/args/args-utils";
import { Args } from "@bp/service/args/args.types";
import ConfigsParser from "@bp/service/configs/configs-parser";
-import { Configs } from "@bp/service/configs/configs.types";
-import GitService from "@bp/service/git/git-service";
-import GitServiceFactory from "@bp/service/git/git-service-factory";
-import { GitPullRequest } from "@bp/service/git/git.types";
+import { Configs, MESSAGE_TARGET_BRANCH_PLACEHOLDER } from "@bp/service/configs/configs.types";
+import GitClient from "@bp/service/git/git-client";
+import GitClientFactory from "@bp/service/git/git-client-factory";
+import { BackportPullRequest, GitPullRequest } from "@bp/service/git/git.types";
export default class PullRequestConfigsParser extends ConfigsParser {
- private gitService: GitService;
+ private gitClient: GitClient;
constructor() {
super();
- this.gitService = GitServiceFactory.getService();
+ this.gitClient = GitClientFactory.getClient();
}
public async parse(args: Args): Promise {
- const pr: GitPullRequest = await this.gitService.getPullRequestFromUrl(args.pullRequest);
+ let pr: GitPullRequest;
+ if (args.autoNoSquash) {
+ args.squash = undefined;
+ }
+ try {
+ pr = await this.gitClient.getPullRequestFromUrl(args.pullRequest, args.squash);
+ } catch(error) {
+ this.logger.error("Something went wrong retrieving pull request");
+ throw error;
+ }
+
const folder: string = args.folder ?? this.getDefaultFolder();
+ let targetBranches: string[] = [];
+ if (args.targetBranchPattern) {
+ // parse labels to extract target branch(es)
+ targetBranches = this.getTargetBranchesFromLabels(args.targetBranchPattern, pr.labels);
+ if (targetBranches.length === 0) {
+ throw new Error(`Unable to extract target branches with regular expression "${args.targetBranchPattern}"`);
+ }
+ } else {
+ // target branch must be provided if targetRegExp is missing
+ targetBranches = [...new Set(getAsCommaSeparatedList(args.targetBranch!)!)];
+ }
+ const bpBranchNames: string[] = [...new Set(args.bpBranchName ? (getAsCleanedCommaSeparatedList(args.bpBranchName) ?? []) : [])];
+
+ if (bpBranchNames.length > 1 && bpBranchNames.length != targetBranches.length) {
+ throw new Error(`The number of backport branch names, if provided, must match the number of target branches or just one, provided ${bpBranchNames.length} branch names instead`);
+ }
+
return {
- dryRun: args.dryRun,
- auth: args.auth,
- author: args.author ?? pr.author,
+ dryRun: args.dryRun!,
+ auth: args.auth, // this has been already pre-processed before parsing configs
folder: `${folder.startsWith("/") ? "" : process.cwd() + "/"}${args.folder ?? this.getDefaultFolder()}`,
- targetBranch: args.targetBranch,
+ mergeStrategy: args.strategy,
+ mergeStrategyOption: args.strategyOption,
+ cherryPickOptions: args.cherryPickOptions,
originalPullRequest: pr,
- backportPullRequest: this.getDefaultBackportPullRequest(pr, args)
+ backportPullRequests: this.generateBackportPullRequestsData(pr, args, targetBranches, bpBranchNames),
+ git: {
+ user: args.gitUser ?? this.gitClient.getDefaultGitUser(),
+ email: args.gitEmail ?? this.gitClient.getDefaultGitEmail(),
+ },
+ errorNotification: {
+ enabled: args.enableErrorNotification ?? false,
+ message: this.getDefaultErrorComment(),
+ },
};
}
@@ -33,6 +70,38 @@ export default class PullRequestConfigsParser extends ConfigsParser {
return "bp";
}
+ private getDefaultErrorComment(): string {
+ // TODO: fetch from arg or set default with placeholder {{error}}
+ return `The backport to \`${MESSAGE_TARGET_BRANCH_PLACEHOLDER}\` failed. Check the latest run for more details.`;
+ }
+
+ /**
+ * Parse the provided labels and return a list of target branches
+ * obtained by applying the provided pattern as regular expression extractor
+ * @param pattern reg exp pattern to extract target branch from label name
+ * @param labels list of labels to check
+ * @returns list of target branches
+ */
+ private getTargetBranchesFromLabels(pattern: string, labels: string[]): string[] {
+ this.logger.debug(`Extracting branches from [${labels}] using ${pattern}`);
+ const regExp = new RegExp(pattern);
+
+ const branches: string[] = [];
+ for (const l of labels) {
+ const result = regExp.exec(l);
+
+ if (result?.groups) {
+ const { target } = result.groups;
+ if (target){
+ branches.push(target);
+ }
+ }
+ }
+
+
+ return [...new Set(branches)];
+ }
+
/**
* Create a backport pull request starting from the target branch and
* the original pr to be backported
@@ -40,26 +109,62 @@ export default class PullRequestConfigsParser extends ConfigsParser {
* @param targetBranch target branch where the backport should be applied
* @returns {GitPullRequest}
*/
- private getDefaultBackportPullRequest(originalPullRequest: GitPullRequest, args: Args): GitPullRequest {
- const reviewers = [];
- reviewers.push(originalPullRequest.author);
- if (originalPullRequest.mergedBy) {
- reviewers.push(originalPullRequest.mergedBy);
+ private generateBackportPullRequestsData(
+ originalPullRequest: GitPullRequest,
+ args: Args,
+ targetBranches: string[],
+ bpBranchNames: string[]
+ ): BackportPullRequest[] {
+
+ const reviewers = args.reviewers ?? [];
+ if (reviewers.length == 0 && args.inheritReviewers) {
+ // inherit only if args.reviewers is empty and args.inheritReviewers set to true
+ reviewers.push(originalPullRequest.author);
+ if (originalPullRequest.mergedBy) {
+ reviewers.push(originalPullRequest.mergedBy);
+ }
}
const bodyPrefix = args.bodyPrefix ?? `**Backport:** ${originalPullRequest.htmlUrl}\r\n\r\n`;
- const body = args.body ?? `${originalPullRequest.body}\r\n\r\nPowered by [BPer](https://github.com/lampajr/backporting).`;
+ const body = bodyPrefix + (args.body ?? `${originalPullRequest.body}`);
- return {
- author: originalPullRequest.author,
- title: args.title ?? `[${args.targetBranch}] ${originalPullRequest.title}`,
- body: `${bodyPrefix}${body}`,
- reviewers: [...new Set(reviewers)],
- targetRepo: originalPullRequest.targetRepo,
- sourceRepo: originalPullRequest.targetRepo,
- branchName: args.bpBranchName,
- nCommits: 0, // TODO: needed?
- commits: [] // TODO needed?
- };
+ const labels = args.labels ?? [];
+ if (args.inheritLabels) {
+ labels.push(...originalPullRequest.labels);
+ }
+
+ return targetBranches.map((tb, idx) => {
+
+ // if there multiple branch names take the corresponding one, otherwise get the the first one if it exists
+ let backportBranch = bpBranchNames.length > 1 ? bpBranchNames[idx] : bpBranchNames[0];
+ if (backportBranch === undefined || backportBranch.trim() === "") {
+ // for each commit takes the first 7 chars that are enough to uniquely identify them in most of the projects
+ const concatenatedCommits: string = originalPullRequest.commits!.map(c => c.slice(0, 7)).join("-");
+ backportBranch = `bp-${tb}-${concatenatedCommits}`;
+ } else if (bpBranchNames.length == 1 && targetBranches.length > 1) {
+ // multiple targets and single custom backport branch name we need to differentiate branch names
+ // so append "-${tb}" to the provided name
+ backportBranch = backportBranch + `-${tb}`;
+ }
+
+ if (backportBranch.length > 250) {
+ this.logger.warn(`Backport branch (length=${backportBranch.length}) exceeded the max length of 250 chars, branch name truncated!`);
+ backportBranch = backportBranch.slice(0, 250);
+ }
+
+ return {
+ owner: originalPullRequest.targetRepo.owner,
+ repo: originalPullRequest.targetRepo.project,
+ head: backportBranch,
+ base: tb,
+ title: args.title ?? `[${tb}] ${originalPullRequest.title}`,
+ // preserve new line chars
+ body: body.replace(/\\n/g, "\n").replace(/\\r/g, "\r"),
+ reviewers: [...new Set(reviewers)],
+ assignees: [...new Set(args.assignees)],
+ labels: [...new Set(labels)],
+ comments: args.comments?.map(c => c.replace(/\\n/g, "\n").replace(/\\r/g, "\r")) ?? [],
+ };
+ }) as BackportPullRequest[];
}
}
\ No newline at end of file
diff --git a/src/service/git/git-cli.ts b/src/service/git/git-cli.ts
index 8c3b628..d7fc7e6 100644
--- a/src/service/git/git-cli.ts
+++ b/src/service/git/git-cli.ts
@@ -2,6 +2,7 @@ import LoggerService from "@bp/service/logger/logger-service";
import LoggerServiceFactory from "@bp/service/logger/logger-service-factory";
import simpleGit, { SimpleGit } from "simple-git";
import fs from "fs";
+import { LocalGit } from "@bp/service/configs/configs.types";
/**
* Command line git commands executor service
@@ -9,13 +10,13 @@ import fs from "fs";
export default class GitCLIService {
private readonly logger: LoggerService;
- private readonly auth: string;
- private readonly author: string;
+ private readonly auth: string | undefined;
+ private readonly gitData: LocalGit;
- constructor(auth: string, author: string) {
+ constructor(auth: string | undefined, gitData: LocalGit) {
this.logger = LoggerServiceFactory.getLogger();
this.auth = auth;
- this.author = author;
+ this.gitData = gitData;
}
/**
@@ -26,16 +27,17 @@ export default class GitCLIService {
*/
private git(cwd?: string): SimpleGit {
const gitConfig = { ...(cwd ? { baseDir: cwd } : {})};
- return simpleGit(gitConfig).addConfig("user.name", this.author).addConfig("user.email", "noreply@github.com");
+ return simpleGit(gitConfig).addConfig("user.name", this.gitData.user).addConfig("user.email", this.gitData.email);
}
/**
* Update the provided remote URL by adding the auth token if not empty
- * @param remoteURL remote link, e.g., https://github.com/lampajr/backporting-example.git
+ * @param remoteURL remote link, e.g., https://github.com/kiegroup/git-backporting-example.git
*/
private remoteWithAuth(remoteURL: string): string {
- if (this.auth && this.author) {
- return remoteURL.replace("://", `://${this.author}:${this.auth}@`);
+ if (this.auth) {
+ // Anything will work as a username.
+ return remoteURL.replace("://", `://token:${this.auth}@`);
}
// return remote as it is
@@ -59,12 +61,25 @@ export default class GitCLIService {
* @param branch branch which should be cloned
*/
async clone(from: string, to: string, branch: string): Promise {
- this.logger.info(`Cloning repository ${from} to ${to}.`);
+ this.logger.info(`Cloning repository ${from} to ${to}`);
if (!fs.existsSync(to)) {
await simpleGit().clone(this.remoteWithAuth(from), to, ["--quiet", "--shallow-submodules", "--no-tags", "--branch", branch]);
- } else {
- this.logger.warn(`Folder ${to} already exist. Won't clone`);
+ return;
}
+
+ this.logger.info(`Folder ${to} already exist. Won't clone`);
+
+ // ensure the working tree is properly reset - no stale changes
+ // from previous (failed) backport
+ const ongoingCherryPick = await this.anyConflict(to);
+ if (ongoingCherryPick) {
+ this.logger.warn("Found previously failed cherry-pick, aborting it");
+ await this.git(to).raw(["cherry-pick", "--abort"]);
+ }
+
+ // checkout to the proper branch
+ this.logger.info(`Checking out branch ${branch}`);
+ await this.git(to).checkout(branch);
}
/**
@@ -73,7 +88,7 @@ export default class GitCLIService {
* @param newBranch new branch name
*/
async createLocalBranch(cwd: string, newBranch: string): Promise {
- this.logger.info(`Creating branch ${newBranch}.`);
+ this.logger.info(`Creating branch ${newBranch}`);
await this.git(cwd).checkoutLocalBranch(newBranch);
}
@@ -84,7 +99,7 @@ export default class GitCLIService {
* @param remoteName [optional] name of the remote, by default 'fork' is used
*/
async addRemote(cwd: string, remote: string, remoteName = "fork"): Promise {
- this.logger.info(`Adding new remote ${remote}.`);
+ this.logger.info(`Adding new remote ${remote}`);
await this.git(cwd).addRemote(remoteName, this.remoteWithAuth(remote));
}
@@ -95,7 +110,7 @@ export default class GitCLIService {
* @param remote [optional] the remote to fetch, by default origin
*/
async fetch(cwd: string, branch: string, remote = "origin"): Promise {
- this.logger.info(`Fetching ${remote} ${branch}.`);
+ this.logger.info(`Fetching ${remote} ${branch}`);
await this.git(cwd).fetch(remote, branch, ["--quiet"]);
}
@@ -104,9 +119,40 @@ export default class GitCLIService {
* @param cwd repository in which the sha should be cherry picked to
* @param sha commit sha
*/
- async cherryPick(cwd: string, sha: string): Promise {
- this.logger.info(`Cherry picking ${sha}.`);
- await this.git(cwd).raw(["cherry-pick", "-m", "1", "--strategy=recursive", "--strategy-option=theirs", sha]);
+ async cherryPick(cwd: string, sha: string, strategy = "recursive", strategyOption = "theirs", cherryPickOptions: string | undefined): Promise {
+ this.logger.info(`Cherry picking ${sha}`);
+
+ let options = ["cherry-pick", "-m", "1", `--strategy=${strategy}`, `--strategy-option=${strategyOption}`];
+ if (cherryPickOptions !== undefined) {
+ options = options.concat(cherryPickOptions.split(" "));
+ }
+ options.push(sha);
+ this.logger.debug(`Cherry picking command git ${options}`);
+ try {
+ await this.git(cwd).raw(options);
+ } catch(error) {
+ const diff = await this.git(cwd).diff();
+ if (diff) {
+ throw new Error(`${error}\r\nShowing git diff:\r\n` + diff);
+ }
+
+ throw error;
+ }
+ }
+
+ /**
+ * Check whether there are some conflicts in the current working directory
+ * which means there is an ongoing cherry-pick that did not complete successfully
+ * @param cwd repository in which the check should be performed
+ * @return true if there is some conflict, false otherwise
+ */
+ async anyConflict(cwd: string): Promise {
+ const status = await this.git(cwd).status();
+ if (status.conflicted.length > 0) {
+ this.logger.debug(`Found conflicts in branch ${status.current}`);
+ return true;
+ }
+ return false;
}
/**
@@ -116,7 +162,7 @@ export default class GitCLIService {
* @param remote [optional] remote to which the branch should be pushed to, by default 'origin'
*/
async push(cwd: string, branch: string, remote = "origin", force = false): Promise {
- this.logger.info(`Pushing ${branch} to ${remote}.`);
+ this.logger.info(`Pushing ${branch} to ${remote}`);
const options = ["--quiet"];
if (force) {
diff --git a/src/service/git/git-client-factory.ts b/src/service/git/git-client-factory.ts
new file mode 100644
index 0000000..7b38308
--- /dev/null
+++ b/src/service/git/git-client-factory.ts
@@ -0,0 +1,61 @@
+import GitClient from "@bp/service/git/git-client";
+import { GitClientType } from "@bp/service/git/git.types";
+import GitHubService from "@bp/service/git/github/github-client";
+import LoggerService from "@bp/service/logger/logger-service";
+import LoggerServiceFactory from "@bp/service/logger/logger-service-factory";
+import GitLabClient from "./gitlab/gitlab-client";
+
+/**
+ * Singleton git service factory class
+ */
+export default class GitClientFactory {
+
+ private static logger: LoggerService = LoggerServiceFactory.getLogger();
+ private static instance?: GitClient;
+
+ // this method assumes there already exists a singleton client instance, otherwise it will fail
+ public static getClient(): GitClient {
+ if (!GitClientFactory.instance) {
+ throw new Error("You must call `getOrCreate` method first");
+ }
+
+ return GitClientFactory.instance;
+ }
+
+ /**
+ * Initialize the singleton git management service
+ * @param type git management service type
+ * @param authToken authentication token, like github/gitlab token
+ */
+ public static getOrCreate(type: GitClientType, authToken: string | undefined, apiUrl: string): GitClient {
+
+ if (GitClientFactory.instance) {
+ GitClientFactory.logger.warn("Git service already initialized");
+ return GitClientFactory.instance;
+ }
+
+ this.logger.debug(`Setting up ${type} client: apiUrl=${apiUrl}, token=****`);
+
+ switch(type) {
+ case GitClientType.GITHUB:
+ GitClientFactory.instance = new GitHubService(authToken, apiUrl);
+ break;
+ case GitClientType.GITLAB:
+ GitClientFactory.instance = new GitLabClient(authToken, apiUrl);
+ break;
+ case GitClientType.CODEBERG:
+ GitClientFactory.instance = new GitHubService(authToken, apiUrl, true);
+ break;
+ default:
+ throw new Error(`Invalid git service type received: ${type}`);
+ }
+
+ return GitClientFactory.instance;
+ }
+
+ // this is used for testing purposes
+ public static reset(): void {
+ GitClientFactory.logger.warn("Resetting git service");
+ GitClientFactory.instance = undefined;
+ }
+}
\ No newline at end of file
diff --git a/src/service/git/git-client.ts b/src/service/git/git-client.ts
new file mode 100644
index 0000000..93190d9
--- /dev/null
+++ b/src/service/git/git-client.ts
@@ -0,0 +1,54 @@
+import { BackportPullRequest, GitClientType, GitPullRequest } from "@bp/service/git/git.types";
+
+/**
+ * Git management service interface, which provides a common API for interacting
+ * with several git management services like GitHub, Gitlab or Bitbucket.
+ */
+ export default interface GitClient {
+
+ /**
+ * @returns {GitClientType} specific git client enum type
+ */
+ getClientType(): GitClientType
+
+ // READ
+
+ getDefaultGitUser(): string;
+
+ getDefaultGitEmail(): string;
+
+ /**
+ * Get a pull request object from the underneath git service
+ * @param owner repository's owner
+ * @param repo repository's name
+ * @param prNumber pull request number
+ * @param squash if true keep just one single commit, otherwise get the full list
+ * @returns {Promise}
+ */
+ getPullRequest(owner: string, repo: string, prNumber: number, squash: boolean | undefined): Promise;
+
+ /**
+ * Get a pull request object from the underneath git service
+ * @param prUrl pull request html url
+ * @param squash if true keep just one single commit, otherwise get the full list
+ * @returns {Promise}
+ */
+ getPullRequestFromUrl(prUrl: string, squash: boolean | undefined): Promise;
+
+ // WRITE
+
+ /**
+ * Create a new pull request on the underneath git service
+ * @param backport backport pull request data
+ * @returns {Promise} the pull request url
+ */
+ createPullRequest(backport: BackportPullRequest): Promise;
+
+ /**
+ * Create a new comment on the provided pull request
+ * @param prUrl pull request's URL
+ * @param comment comment body
+ */
+ createPullRequestComment(prUrl: string, comment: string): Promise;
+
+}
\ No newline at end of file
diff --git a/src/service/git/git-mapper.ts b/src/service/git/git-mapper.ts
new file mode 100644
index 0000000..5658f14
--- /dev/null
+++ b/src/service/git/git-mapper.ts
@@ -0,0 +1,21 @@
+import { GitPullRequest, GitRepoState, GitRepository } from "@bp/service/git/git.types";
+
+/**
+ * Generic git client response mapper
+ *
+ * PR - full pull request schema type
+ * S - pull request state type
+ */
+export default interface GitResponseMapper {
+
+ mapPullRequest(
+ pr: PR,
+ commits?: string[],
+ ): Promise;
+
+ mapGitState(state: S): GitRepoState;
+
+ mapSourceRepo(pull: PR): Promise;
+
+ mapTargetRepo (pull: PR): Promise;
+}
\ No newline at end of file
diff --git a/src/service/git/git-service-factory.ts b/src/service/git/git-service-factory.ts
deleted file mode 100644
index 40573fb..0000000
--- a/src/service/git/git-service-factory.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-import GitService from "@bp/service/git/git-service";
-import { GitServiceType } from "@bp/service/git/git.types";
-import GitHubService from "@bp/service/git/github/github-service";
-import LoggerService from "@bp/service/logger/logger-service";
-import LoggerServiceFactory from "@bp/service/logger/logger-service-factory";
-
-/**
- * Singleton git service factory class
- */
-export default class GitServiceFactory {
-
- private static logger: LoggerService = LoggerServiceFactory.getLogger();
- private static instance?: GitService;
-
- public static getService(): GitService {
- if (!GitServiceFactory.instance) {
- throw new Error("You must call `init` method first!");
- }
-
- return GitServiceFactory.instance;
- }
-
- /**
- * Initialize the singleton git management service
- * @param type git management service type
- * @param auth authentication, like github token
- */
- public static init(type: GitServiceType, auth: string): void {
-
- if (GitServiceFactory.instance) {
- GitServiceFactory.logger.warn("Git service already initialized!");
- return;
- }
-
- switch(type) {
- case GitServiceType.GITHUB:
- GitServiceFactory.instance = new GitHubService(auth);
- break;
- default:
- throw new Error(`Invalid git service type received: ${type}`);
- }
- }
-}
\ No newline at end of file
diff --git a/src/service/git/git-service.ts b/src/service/git/git-service.ts
deleted file mode 100644
index 28baed6..0000000
--- a/src/service/git/git-service.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-import { BackportPullRequest, GitPullRequest } from "@bp/service/git/git.types";
-
-/**
- * Git management service interface, which provides a common API for interacting
- * with several git management services like GitHub, Gitlab or Bitbucket.
- */
- export default interface GitService {
-
- // READ
-
- /**
- * Get a pull request object from the underneath git service
- * @param owner repository's owner
- * @param repo repository's name
- * @param prNumber pull request number
- * @returns {Promise}
- */
- getPullRequest(owner: string, repo: string, prNumber: number): Promise;
-
- /**
- * Get a pull request object from the underneath git service
- * @param prUrl pull request html url
- * @returns {Promise}
- */
- getPullRequestFromUrl(prUrl: string): Promise;
-
- // WRITE
-
- /**
- * Create a new pull request on the underneath git service
- * @param backport backport pull request data
- */
- createPullRequest(backport: BackportPullRequest): Promise;
-}
\ No newline at end of file
diff --git a/src/service/git/git-util.ts b/src/service/git/git-util.ts
new file mode 100644
index 0000000..4e649b5
--- /dev/null
+++ b/src/service/git/git-util.ts
@@ -0,0 +1,104 @@
+import LoggerServiceFactory from "@bp/service/logger/logger-service-factory";
+import { GitClientType } from "@bp/service/git/git.types";
+import { AuthTokenId } from "@bp/service/configs/configs.types";
+
+const PUBLIC_GITHUB_URL = "https://github.com";
+const PUBLIC_GITHUB_API = "https://api.github.com";
+
+/**
+ * Infer the remote GIT service to interact with based on the provided
+ * pull request URL
+ * @param prUrl provided pull request URL
+ * @returns {GitClientType}
+ */
+export const inferGitClient = (prUrl: string): GitClientType => {
+ const stdPrUrl = prUrl.toLowerCase().trim();
+
+ if (stdPrUrl.includes(GitClientType.GITHUB.toString())) {
+ return GitClientType.GITHUB;
+ } else if (stdPrUrl.includes(GitClientType.GITLAB.toString())) {
+ return GitClientType.GITLAB;
+ } else if (stdPrUrl.includes(GitClientType.CODEBERG.toString())) {
+ return GitClientType.CODEBERG;
+ }
+
+ throw new Error(`Remote git service not recognized from pr url: ${prUrl}`);
+};
+
+/**
+ * Infer the host git service from the pull request url
+ * @param prUrl pull/merge request url
+ * @param apiVersion the api version, ignored in case of public github
+ * @returns api URL like https://api.github.com or https://gitlab.com/api/v4
+ */
+export const inferGitApiUrl = (prUrl: string, apiVersion = "v4"): string => {
+ const url = new URL(prUrl);
+ const baseUrl = `${url.protocol}//${url.host}`;
+
+ if (baseUrl.includes(PUBLIC_GITHUB_URL) || baseUrl.includes(PUBLIC_GITHUB_API)) {
+ return PUBLIC_GITHUB_API;
+ }
+
+ return `${baseUrl}/api/${apiVersion}`;
+};
+
+/**
+ * Infer the value of the squash option
+ * @param open true if the pull/merge request is still open
+ * @param squash_commit undefined or null if the pull/merge request was merged, the sha of the squashed commit if it was squashed
+ * @returns true if a single commit must be cherry-picked, false if all merged commits must be cherry-picked
+ */
+export const inferSquash = (open: boolean, squash_commit: string | undefined | null): boolean => {
+ const logger = LoggerServiceFactory.getLogger();
+
+ if (open) {
+ logger.debug("cherry-pick all commits because they have not been merged (or squashed) in the base branch yet");
+ return false;
+ } else {
+ if (squash_commit) {
+ logger.debug(`cherry-pick the squashed commit ${squash_commit}`);
+ return true;
+ } else {
+ logger.debug("cherry-pick the merged commit(s)");
+ return false;
+ }
+ }
+};
+
+/**
+ * Retrieve the git token from env variable, the default is taken from GIT_TOKEN env.
+ * All specific git env variable have precedence and override the default one.
+ * @param gitType
+ * @returns tuple where
+ * - the first element is the corresponding env value
+ * - the second element is true if the value is not undefined nor empty
+ */
+export const getGitTokenFromEnv = (gitType: GitClientType): string | undefined => {
+ let [token] = getEnv(AuthTokenId.GIT_TOKEN);
+ let [specToken, specOk]: [string | undefined, boolean] = [undefined, false];
+ if (GitClientType.GITHUB == gitType) {
+ [specToken, specOk] = getEnv(AuthTokenId.GITHUB_TOKEN);
+ } else if (GitClientType.GITLAB == gitType) {
+ [specToken, specOk] = getEnv(AuthTokenId.GITLAB_TOKEN);
+ } else if (GitClientType.CODEBERG == gitType) {
+ [specToken, specOk] = getEnv(AuthTokenId.CODEBERG_TOKEN);
+ }
+
+ if (specOk) {
+ token = specToken;
+ }
+
+ return token;
+};
+
+/**
+ * Get process env variable given the input key string
+ * @param key
+ * @returns tuple where
+ * - the first element is the corresponding env value
+ * - the second element is true if the value is not undefined nor empty
+ */
+export const getEnv = (key: string): [string | undefined, boolean] => {
+ const val = process.env[key];
+ return [val, val !== undefined && val !== ""];
+};
\ No newline at end of file
diff --git a/src/service/git/git.types.ts b/src/service/git/git.types.ts
index ba90f6d..868440c 100644
--- a/src/service/git/git.types.ts
+++ b/src/service/git/git.types.ts
@@ -1,14 +1,16 @@
export interface GitPullRequest {
number?: number,
author: string,
- url?: string,
+ url: string,
htmlUrl?: string,
- state?: "open" | "closed",
+ state?: GitRepoState,
merged?: boolean,
mergedBy?: string,
title: string,
body: string,
reviewers: string[],
+ assignees: string[],
+ labels: string[],
targetRepo: GitRepository,
sourceRepo: GitRepository,
nCommits: number, // number of commits in the pr
@@ -30,9 +32,21 @@ export interface BackportPullRequest {
title: string, // pr title
body: string, // pr body
reviewers: string[], // pr list of reviewers
- branchName?: string,
+ assignees: string[], // pr list of assignees
+ labels: string[], // pr list of assigned labels
+ comments: string[], // pr list of additional comments
+ // branchName?: string,
}
-export enum GitServiceType {
- GITHUB = "github"
+export enum GitClientType {
+ GITHUB = "github",
+ GITLAB = "gitlab",
+ CODEBERG = "codeberg",
+}
+
+export enum GitRepoState {
+ OPEN = "open",
+ CLOSED = "closed",
+ LOCKED = "locked", // just on gitlab
+ MERGED = "merged", // just on gitlab
}
\ No newline at end of file
diff --git a/src/service/git/github/github-client.ts b/src/service/git/github/github-client.ts
new file mode 100644
index 0000000..9802ef5
--- /dev/null
+++ b/src/service/git/github/github-client.ts
@@ -0,0 +1,204 @@
+import GitClient from "@bp/service/git/git-client";
+import { inferSquash } from "@bp/service/git/git-util";
+import { BackportPullRequest, GitClientType, GitPullRequest } from "@bp/service/git/git.types";
+import GitHubMapper from "@bp/service/git/github/github-mapper";
+import OctokitFactory from "@bp/service/git/github/octokit-factory";
+import LoggerService from "@bp/service/logger/logger-service";
+import LoggerServiceFactory from "@bp/service/logger/logger-service-factory";
+import { Octokit } from "@octokit/rest";
+import { PullRequest } from "@octokit/webhooks-types";
+
+export default class GitHubClient implements GitClient {
+
+ private logger: LoggerService;
+ private apiUrl: string;
+ private isForCodeberg: boolean;
+ private octokit: Octokit;
+ private mapper: GitHubMapper;
+
+ constructor(token: string | undefined, apiUrl: string, isForCodeberg = false) {
+ this.apiUrl = apiUrl;
+ this.isForCodeberg = isForCodeberg;
+ this.logger = LoggerServiceFactory.getLogger();
+ this.octokit = OctokitFactory.getOctokit(token, this.apiUrl);
+ this.mapper = new GitHubMapper();
+ }
+
+ getClientType(): GitClientType {
+ return this.isForCodeberg ? GitClientType.CODEBERG : GitClientType.GITHUB;
+ }
+
+ // READ
+
+ getDefaultGitUser(): string {
+ return this.apiUrl.includes(GitClientType.CODEBERG.toString()) ? "Codeberg" : "GitHub";
+ }
+
+ getDefaultGitEmail(): string {
+ return "noreply@github.com";
+ }
+
+ async getPullRequest(owner: string, repo: string, prNumber: number, squash: boolean | undefined): Promise {
+ this.logger.debug(`Fetching pull request ${owner}/${repo}/${prNumber}`);
+ const { data } = await this.octokit.rest.pulls.get({
+ owner: owner,
+ repo: repo,
+ pull_number: prNumber,
+ });
+
+ if (squash === undefined) {
+ let commit_sha: string | undefined = undefined;
+ const open: boolean = data.state == "open";
+ if (!open) {
+ const commit = await this.octokit.rest.git.getCommit({
+ owner: owner,
+ repo: repo,
+ commit_sha: (data.merge_commit_sha as string),
+ });
+ if (commit.data.parents.length === 1) {
+ commit_sha = (data.merge_commit_sha as string);
+ }
+ }
+ squash = inferSquash(open, commit_sha);
+ }
+
+ const commits: string[] = [];
+ if (!squash) {
+ // fetch all commits
+ try {
+ const { data } = await this.octokit.rest.pulls.listCommits({
+ owner: owner,
+ repo: repo,
+ pull_number: prNumber,
+ });
+
+ commits.push(...data.map(c => c.sha));
+ if (this.isForCodeberg) {
+ // For some reason, even though Codeberg advertises API compatibility
+ // with GitHub, it returns commits in reversed order.
+ commits.reverse();
+ }
+ } catch(error) {
+ throw new Error(`Failed to retrieve commits for pull request n. ${prNumber}`);
+ }
+ }
+
+ return this.mapper.mapPullRequest(data as PullRequest, commits);
+ }
+
+ async getPullRequestFromUrl(prUrl: string, squash: boolean | undefined): Promise {
+ const { owner, project, id } = this.extractPullRequestData(prUrl);
+ return this.getPullRequest(owner, project, id, squash);
+ }
+
+ // WRITE
+
+ async createPullRequest(backport: BackportPullRequest): Promise {
+ this.logger.info(`Creating pull request ${backport.head} -> ${backport.base}`);
+ this.logger.info(`${JSON.stringify(backport, null, 2)}`);
+
+ const { data } = await this.octokit.pulls.create({
+ owner: backport.owner,
+ repo: backport.repo,
+ head: backport.head,
+ base: backport.base,
+ title: backport.title,
+ body: backport.body,
+ });
+
+ if (!data) {
+ throw new Error("Pull request creation failed");
+ }
+
+ const promises = [];
+
+ if (backport.labels.length > 0) {
+ promises.push(
+ this.octokit.issues.addLabels({
+ owner: backport.owner,
+ repo: backport.repo,
+ issue_number: (data as PullRequest).number,
+ labels: backport.labels,
+ }).catch(error => this.logger.error(`Error setting labels: ${error}`))
+ );
+ }
+
+ if (backport.reviewers.length > 0) {
+ promises.push(
+ this.octokit.pulls.requestReviewers({
+ owner: backport.owner,
+ repo: backport.repo,
+ pull_number: (data as PullRequest).number,
+ reviewers: backport.reviewers,
+ }).catch(error => this.logger.error(`Error requesting reviewers: ${error}`))
+ );
+ }
+
+ if (backport.assignees.length > 0) {
+ promises.push(
+ this.octokit.issues.addAssignees({
+ owner: backport.owner,
+ repo: backport.repo,
+ issue_number: (data as PullRequest).number,
+ assignees: backport.assignees,
+ }).catch(error => this.logger.error(`Error setting assignees: ${error}`))
+ );
+ }
+
+ if (backport.comments.length > 0) {
+ backport.comments.forEach(c => {
+ promises.push(
+ this.octokit.issues.createComment({
+ owner: backport.owner,
+ repo: backport.repo,
+ issue_number: (data as PullRequest).number,
+ body: c,
+ }).catch(error => this.logger.error(`Error posting comment: ${error}`))
+ );
+ });
+ }
+
+ await Promise.all(promises);
+
+ return data.html_url;
+ }
+
+ async createPullRequestComment(prUrl: string, comment: string): Promise {
+ let commentUrl: string | undefined = undefined;
+ try {
+ const { owner, project, id } = this.extractPullRequestData(prUrl);
+ const { data } = await this.octokit.issues.createComment({
+ owner: owner,
+ repo: project,
+ issue_number: id,
+ body: comment
+ });
+
+ if (!data) {
+ throw new Error("Pull request comment creation failed");
+ }
+
+ commentUrl = data.url;
+ } catch (error) {
+ this.logger.error(`Error creating comment on pull request ${prUrl}: ${error}`);
+ }
+
+ return commentUrl;
+ }
+
+ // UTILS
+
+ /**
+ * Extract repository owner and project from the pull request url
+ * @param prUrl pull request url
+ * @returns {{owner: string, project: string}}
+ */
+ private extractPullRequestData(prUrl: string): {owner: string, project: string, id: number} {
+ const elems: string[] = prUrl.split("/");
+ return {
+ owner: elems[elems.length - 4],
+ project: elems[elems.length - 3],
+ id: parseInt(prUrl.substring(prUrl.lastIndexOf("/") + 1, prUrl.length)),
+ };
+ }
+}
\ No newline at end of file
diff --git a/src/service/git/github/github-mapper.ts b/src/service/git/github/github-mapper.ts
index 8b519aa..f501b5d 100644
--- a/src/service/git/github/github-mapper.ts
+++ b/src/service/git/github/github-mapper.ts
@@ -1,9 +1,19 @@
-import { GitPullRequest } from "@bp/service/git/git.types";
+import { GitPullRequest, GitRepoState, GitRepository } from "@bp/service/git/git.types";
import { PullRequest, User } from "@octokit/webhooks-types";
+import GitResponseMapper from "@bp/service/git/git-mapper";
-export default class GitHubMapper {
+export default class GitHubMapper implements GitResponseMapper {
- mapPullRequest(pr: PullRequest): GitPullRequest {
+ mapGitState(state: "open" | "closed"): GitRepoState {
+ switch (state) {
+ case "open":
+ return GitRepoState.OPEN;
+ default:
+ return GitRepoState.CLOSED;
+ }
+ }
+
+ async mapPullRequest(pr: PullRequest, commits?: string[]): Promise {
return {
number: pr.number,
author: pr.user.login,
@@ -11,23 +21,38 @@ export default class GitHubMapper {
htmlUrl: pr.html_url,
title: pr.title,
body: pr.body ?? "",
- state: pr.state,
+ state: this.mapGitState(pr.state), // TODO fix using custom mapper
merged: pr.merged ?? false,
mergedBy: pr.merged_by?.login,
- reviewers: pr.requested_reviewers.filter(r => "login" in r).map((r => (r as User)?.login)),
- sourceRepo: {
- owner: pr.head.repo.full_name.split("/")[0],
- project: pr.head.repo.full_name.split("/")[1],
- cloneUrl: pr.head.repo.clone_url
- },
- targetRepo: {
- owner: pr.base.repo.full_name.split("/")[0],
- project: pr.base.repo.full_name.split("/")[1],
- cloneUrl: pr.base.repo.clone_url
- },
+ reviewers: pr.requested_reviewers?.filter(r => r && "login" in r).map((r => (r as User)?.login)) ?? [],
+ assignees: pr.assignees?.filter(r => r && "login" in r).map(r => r.login) ?? [],
+ labels: pr.labels?.map(l => l.name) ?? [],
+ sourceRepo: await this.mapSourceRepo(pr),
+ targetRepo: await this.mapTargetRepo(pr),
nCommits: pr.commits,
- // if pr is open use latest commit sha otherwise use merge_commit_sha
- commits: pr.state === "open" ? [pr.head.sha] : [pr.merge_commit_sha as string]
+ // if commits is provided use them, otherwise fetch the single sha representing the whole pr
+ commits: (commits && commits.length > 0) ? commits : this.getSha(pr),
};
}
+
+ private getSha(pr: PullRequest) {
+ // if pr is open use latest commit sha otherwise use merge_commit_sha
+ return pr.state === "open" ? [pr.head.sha] : [pr.merge_commit_sha as string];
+ }
+
+ async mapSourceRepo(pr: PullRequest): Promise {
+ return Promise.resolve({
+ owner: pr.head.repo.full_name.split("/")[0],
+ project: pr.head.repo.full_name.split("/")[1],
+ cloneUrl: pr.head.repo.clone_url
+ });
+ }
+
+ async mapTargetRepo(pr: PullRequest): Promise {
+ return Promise.resolve({
+ owner: pr.base.repo.full_name.split("/")[0],
+ project: pr.base.repo.full_name.split("/")[1],
+ cloneUrl: pr.base.repo.clone_url
+ });
+ }
}
\ No newline at end of file
diff --git a/src/service/git/github/github-service.ts b/src/service/git/github/github-service.ts
deleted file mode 100644
index 3b016be..0000000
--- a/src/service/git/github/github-service.ts
+++ /dev/null
@@ -1,83 +0,0 @@
-import GitService from "@bp/service/git/git-service";
-import { BackportPullRequest, GitPullRequest } from "@bp/service/git/git.types";
-import GitHubMapper from "@bp/service/git/github/github-mapper";
-import OctokitFactory from "@bp/service/git/github/octokit-factory";
-import LoggerService from "@bp/service/logger/logger-service";
-import LoggerServiceFactory from "@bp/service/logger/logger-service-factory";
-import { Octokit } from "@octokit/rest";
-import { PullRequest } from "@octokit/webhooks-types";
-
-export default class GitHubService implements GitService {
-
- private logger: LoggerService;
- private octokit: Octokit;
- private mapper: GitHubMapper;
-
- constructor(token: string) {
- this.logger = LoggerServiceFactory.getLogger();
- this.octokit = OctokitFactory.getOctokit(token);
- this.mapper = new GitHubMapper();
- }
-
- // READ
-
- async getPullRequest(owner: string, repo: string, prNumber: number): Promise {
- this.logger.info(`Getting pull request ${owner}/${repo}/${prNumber}.`);
- const { data } = await this.octokit.rest.pulls.get({
- owner: owner,
- repo: repo,
- pull_number: prNumber
- });
-
- return this.mapper.mapPullRequest(data as PullRequest);
- }
-
- async getPullRequestFromUrl(prUrl: string): Promise {
- const {owner, project} = this.getRepositoryFromPrUrl(prUrl);
- return this.getPullRequest(owner, project, parseInt(prUrl.substring(prUrl.lastIndexOf("/") + 1, prUrl.length)));
- }
-
- // WRITE
-
- async createPullRequest(backport: BackportPullRequest): Promise {
- this.logger.info(`Creating pull request ${backport.head} -> ${backport.base}.`);
- this.logger.info(`${JSON.stringify(backport, null, 2)}`);
-
- const { data } = await this.octokit.pulls.create({
- owner: backport.owner,
- repo: backport.repo,
- head: backport.head,
- base: backport.base,
- title: backport.title,
- body: backport.body
- });
-
- if (backport.reviewers.length > 0) {
- try {
- await this.octokit.pulls.requestReviewers({
- owner: backport.owner,
- repo: backport.repo,
- pull_number: (data as PullRequest).number,
- reviewers: backport.reviewers
- });
- } catch (error) {
- this.logger.error(`Error requesting reviewers: ${error}`);
- }
- }
- }
-
- // UTILS
-
- /**
- * Extract repository owner and project from the pull request url
- * @param prUrl pull request url
- * @returns {{owner: string, project: string}}
- */
- private getRepositoryFromPrUrl(prUrl: string): {owner: string, project: string} {
- const elems: string[] = prUrl.split("/");
- return {
- owner: elems[elems.length - 4],
- project: elems[elems.length - 3]
- };
- }
-}
\ No newline at end of file
diff --git a/src/service/git/github/octokit-factory.ts b/src/service/git/github/octokit-factory.ts
index 4cfcb67..7792ed6 100644
--- a/src/service/git/github/octokit-factory.ts
+++ b/src/service/git/github/octokit-factory.ts
@@ -10,12 +10,12 @@ export default class OctokitFactory {
private static logger: LoggerService = LoggerServiceFactory.getLogger();
private static octokit?: Octokit;
- public static getOctokit(token: string): Octokit {
+ public static getOctokit(token: string | undefined, apiUrl: string): Octokit {
if (!OctokitFactory.octokit) {
- OctokitFactory.logger.info("Creating octokit instance.");
OctokitFactory.octokit = new Octokit({
auth: token,
- userAgent: "lampajr/backporting"
+ userAgent: "kiegroup/git-backporting",
+ baseUrl: apiUrl
});
}
diff --git a/src/service/git/gitlab/gitlab-client.ts b/src/service/git/gitlab/gitlab-client.ts
new file mode 100644
index 0000000..6d17ccf
--- /dev/null
+++ b/src/service/git/gitlab/gitlab-client.ts
@@ -0,0 +1,239 @@
+import LoggerService from "@bp/service/logger/logger-service";
+import GitClient from "@bp/service/git/git-client";
+import { inferSquash } from "@bp/service/git/git-util";
+import { GitPullRequest, BackportPullRequest, GitClientType } from "@bp/service/git/git.types";
+import LoggerServiceFactory from "@bp/service/logger/logger-service-factory";
+import { CommitSchema, MergeRequestSchema, UserSchema } from "@gitbeaker/rest";
+import GitLabMapper from "@bp/service/git/gitlab/gitlab-mapper";
+import axios, { Axios } from "axios";
+import https from "https";
+
+export default class GitLabClient implements GitClient {
+
+ private readonly logger: LoggerService;
+ private readonly apiUrl: string;
+ private readonly mapper: GitLabMapper;
+ private readonly client: Axios;
+
+ constructor(token: string | undefined, apiUrl: string, rejectUnauthorized = false) {
+ this.logger = LoggerServiceFactory.getLogger();
+ this.apiUrl = apiUrl;
+ this.client = axios.create({
+ baseURL: this.apiUrl,
+ headers: {
+ Authorization: token ? `Bearer ${token}` : "",
+ "User-Agent": "kiegroup/git-backporting",
+ },
+ httpsAgent: new https.Agent({
+ rejectUnauthorized
+ })
+ });
+ this.mapper = new GitLabMapper(this.client);
+ }
+
+ getClientType(): GitClientType {
+ return GitClientType.GITLAB;
+ }
+
+ getDefaultGitUser(): string {
+ return "Gitlab";
+ }
+
+ getDefaultGitEmail(): string {
+ return "noreply@gitlab.com";
+ }
+
+ // READ
+
+ // example: /api/v4/projects/%2Fbackporting-example/merge_requests/1
+ async getPullRequest(namespace: string, repo: string, mrNumber: number, squash: boolean | undefined): Promise {
+ const projectId = this.getProjectId(namespace, repo);
+ const url = `/projects/${projectId}/merge_requests/${mrNumber}`;
+ this.logger.debug(`Fetching pull request ${url}`);
+ const { data } = await this.client.get(`${url}`);
+
+ if (squash === undefined) {
+ squash = inferSquash(data.state === "opened", data.squash_commit_sha);
+ }
+
+ const commits: string[] = [];
+ if (!squash) {
+ // fetch all commits
+ try {
+ const { data } = await this.client.get(`/projects/${projectId}/merge_requests/${mrNumber}/commits`);
+
+ // gitlab returns them in reverse order
+ commits.push(...(data as CommitSchema[]).map(c => c.id).reverse());
+ } catch(error) {
+ throw new Error(`Failed to retrieve commits for merge request n. ${mrNumber}`);
+ }
+ }
+
+ return this.mapper.mapPullRequest(data as MergeRequestSchema, commits);
+ }
+
+ getPullRequestFromUrl(mrUrl: string, squash: boolean | undefined): Promise {
+ const { namespace, project, id } = this.extractMergeRequestData(mrUrl);
+ return this.getPullRequest(namespace, project, id, squash);
+ }
+
+ // WRITE
+
+ async createPullRequest(backport: BackportPullRequest): Promise {
+ this.logger.info(`Creating pull request ${backport.head} -> ${backport.base}`);
+ this.logger.info(`${JSON.stringify(backport, null, 2)}`);
+
+ const projectId = this.getProjectId(backport.owner, backport.repo);
+
+ const { data } = await this.client.post(`/projects/${projectId}/merge_requests`, {
+ source_branch: backport.head,
+ target_branch: backport.base,
+ title: backport.title,
+ description: backport.body,
+ reviewer_ids: [],
+ assignee_ids: [],
+ });
+
+ const mr = data as MergeRequestSchema;
+ const promises = [];
+
+ // labels
+ if (backport.labels.length > 0) {
+ this.logger.info("Setting labels: " + backport.labels);
+ promises.push(
+ this.client.put(`/projects/${projectId}/merge_requests/${mr.iid}`, {
+ labels: backport.labels.join(","),
+ }).catch(error => this.logger.warn("Failure trying to update labels. " + error))
+ );
+ }
+
+ // comments
+ if (backport.comments.length > 0) {
+ this.logger.info("Posting comments: " + backport.comments);
+ backport.comments.forEach(c => {
+ promises.push(
+ this.client.post(`/projects/${projectId}/merge_requests/${mr.iid}/notes`, {
+ body: c,
+ }).catch(error => this.logger.warn("Failure trying to post comment. " + error))
+ );
+ });
+ }
+
+ // reviewers
+ const reviewerIds = await Promise.all(backport.reviewers.map(async r => {
+ this.logger.debug("Retrieving user: " + r);
+ return this.getUser(r).then(user => user.id).catch(
+ () => {
+ this.logger.warn(`Failed to retrieve reviewer ${r}`);
+ return undefined;
+ }
+ );
+ }));
+
+ if (reviewerIds.length > 0) {
+ this.logger.info("Setting reviewers: " + reviewerIds);
+ promises.push(
+ this.client.put(`/projects/${projectId}/merge_requests/${mr.iid}`, {
+ reviewer_ids: reviewerIds.filter(r => r !== undefined),
+ }).catch(error => this.logger.warn("Failure trying to update reviewers. " + error))
+ );
+ }
+
+ // assignees
+ const assigneeIds = await Promise.all(backport.assignees.map(async a => {
+ this.logger.debug("Retrieving user: " + a);
+ return this.getUser(a).then(user => user.id).catch(
+ () => {
+ this.logger.warn(`Failed to retrieve assignee ${a}`);
+ return undefined;
+ }
+ );
+ }));
+
+ if (assigneeIds.length > 0) {
+ this.logger.info("Setting assignees: " + assigneeIds);
+ promises.push(
+ this.client.put(`/projects/${projectId}/merge_requests/${mr.iid}`, {
+ assignee_ids: assigneeIds.filter(a => a !== undefined),
+ }).catch(error => this.logger.warn("Failure trying to update assignees. " + error))
+ );
+ }
+
+ await Promise.all(promises);
+
+ return mr.web_url;
+ }
+
+ // https://docs.gitlab.com/ee/api/notes.html#create-new-issue-note
+ async createPullRequestComment(mrUrl: string, comment: string): Promise {
+ const commentUrl: string | undefined = undefined;
+ try{
+ const { namespace, project, id } = this.extractMergeRequestData(mrUrl);
+ const projectId = this.getProjectId(namespace, project);
+
+ const { data } = await this.client.post(`/projects/${projectId}/merge_requests/${id}/notes`, {
+ body: comment,
+ });
+
+ if (!data) {
+ throw new Error("Merge request comment creation failed");
+ }
+ } catch(error) {
+ this.logger.error(`Error creating comment on merge request ${mrUrl}: ${error}`);
+ }
+
+ return commentUrl;
+ }
+
+ // UTILS
+
+ /**
+ * Retrieve a gitlab user given its username
+ * @param username
+ * @returns UserSchema
+ */
+ private async getUser(username: string): Promise {
+ const { data } = await this.client.get(`/users?username=${username}`);
+ const users = data as UserSchema[];
+
+ if (users.length > 1) {
+ throw new Error("Too many users found with username=" + username);
+ }
+
+ if (users.length == 0) {
+ throw new Error("User " + username + " not found");
+ }
+
+ return users[0];
+ }
+
+ /**
+ * Extract repository namespace, project and mr number from the merge request url
+ * example: //backporting-example/-/merge_requests/1
+ * note: "-/" could be omitted
+ * @param mrUrl merge request url
+ * @returns {{owner: string, project: string}}
+ */
+ private extractMergeRequestData(mrUrl: string): {namespace: string, project: string, id: number} {
+ const { pathname } = new URL(mrUrl);
+ const elems: string[] = pathname.substring(1).replace("/-/", "/").split("/");
+ let namespace = "";
+
+ for (let i = 0; i < elems.length - 3; i++) {
+ namespace += elems[i] + "/";
+ }
+
+ namespace = namespace.substring(0, namespace.length - 1);
+
+ return {
+ namespace: namespace,
+ project: elems[elems.length - 3],
+ id: parseInt(mrUrl.substring(mrUrl.lastIndexOf("/") + 1, mrUrl.length)),
+ };
+ }
+
+ private getProjectId(namespace: string, repo: string) {
+ // e.g., %2F
+ return encodeURIComponent(`${namespace}/${repo}`);
+ }
+}
\ No newline at end of file
diff --git a/src/service/git/gitlab/gitlab-mapper.ts b/src/service/git/gitlab/gitlab-mapper.ts
new file mode 100644
index 0000000..9efe2a0
--- /dev/null
+++ b/src/service/git/gitlab/gitlab-mapper.ts
@@ -0,0 +1,88 @@
+import { GitPullRequest, GitRepoState, GitRepository } from "@bp/service/git/git.types";
+import GitResponseMapper from "@bp/service/git/git-mapper";
+import { MergeRequestSchema, ProjectSchema } from "@gitbeaker/rest";
+import { Axios } from "axios";
+
+export default class GitLabMapper implements GitResponseMapper {
+
+ private readonly client;
+ // needs client to perform additional requests
+ constructor(client: Axios) {
+ this.client = client;
+ }
+
+ mapGitState(state: string): GitRepoState {
+ switch (state) {
+ case "opened":
+ return GitRepoState.OPEN;
+ case "closed":
+ return GitRepoState.CLOSED;
+ case "merged":
+ return GitRepoState.MERGED;
+ default:
+ return GitRepoState.LOCKED;
+ }
+ }
+
+ async mapPullRequest(mr: MergeRequestSchema, commits?: string[]): Promise {
+ return {
+ number: mr.iid,
+ author: mr.author.username,
+ url: mr.web_url,
+ htmlUrl: mr.web_url,
+ title: mr.title,
+ body: mr.description,
+ state: this.mapGitState(mr.state),
+ merged: this.isMerged(mr),
+ mergedBy: mr.merged_by?.username,
+ reviewers: mr.reviewers?.map((r => r.username)) ?? [],
+ assignees: mr.assignees?.map((r => r.username)) ?? [],
+ labels: mr.labels ?? [],
+ sourceRepo: await this.mapSourceRepo(mr),
+ targetRepo: await this.mapTargetRepo(mr),
+ // if commits list is provided use that as source
+ nCommits: (commits && commits.length > 0) ? commits.length : 1,
+ commits: (commits && commits.length > 0) ? commits : this.getSha(mr)
+ };
+ }
+
+ private getSha(mr: MergeRequestSchema) {
+ // if mr is merged, use merge_commit_sha otherwise use sha
+ // what is the difference between sha and diff_refs.head_sha?
+ return this.isMerged(mr) ? [mr.squash_commit_sha ? mr.squash_commit_sha : mr.merge_commit_sha as string] : [mr.sha];
+ }
+
+ async mapSourceRepo(mr: MergeRequestSchema): Promise {
+ const project: ProjectSchema = await this.getProject(mr.source_project_id);
+
+ return {
+ owner: project.namespace.full_path, // or just proj.path?
+ project: project.path,
+ cloneUrl: project.http_url_to_repo,
+ };
+ }
+
+ async mapTargetRepo(mr: MergeRequestSchema): Promise {
+ const project: ProjectSchema = await this.getProject(mr.target_project_id);
+
+ return {
+ owner: project.namespace.full_path, // or just proj.path?
+ project: project.path,
+ cloneUrl: project.http_url_to_repo,
+ };
+ }
+
+ private isMerged(mr: MergeRequestSchema) {
+ return this.mapGitState(mr.state) === GitRepoState.MERGED;
+ }
+
+ private async getProject(projectId: number): Promise {
+ const { data } = await this.client.get(`/projects/${projectId}`);
+
+ if (!data) {
+ throw new Error(`Project ${projectId} not found`);
+ }
+
+ return data as ProjectSchema;
+ }
+}
\ No newline at end of file
diff --git a/src/service/logger/console-logger-service.ts b/src/service/logger/console-logger-service.ts
index b1605f3..6de8020 100644
--- a/src/service/logger/console-logger-service.ts
+++ b/src/service/logger/console-logger-service.ts
@@ -3,30 +3,50 @@ import LoggerService from "@bp/service/logger/logger-service";
export default class ConsoleLoggerService implements LoggerService {
- private readonly logger;
+ private readonly logger: Logger;
+ private readonly verbose: boolean;
+ private context?: string;
- constructor() {
+ constructor(verbose = true) {
this.logger = new Logger();
+ this.verbose = verbose;
+ }
+
+ setContext(newContext: string) {
+ this.context = newContext;
+ }
+
+ getContext(): string | undefined {
+ return this.context;
+ }
+
+ clearContext() {
+ this.context = undefined;
}
trace(message: string): void {
- this.logger.log("[TRACE]", message);
+ this.logger.log("TRACE", this.fromContext(message));
}
debug(message: string): void {
- this.logger.log("[DEBUG]", message);
+ if (this.verbose) {
+ this.logger.log("DEBUG", this.fromContext(message));
+ }
}
info(message: string): void {
- this.logger.log("[INFO]", message);
+ this.logger.log("INFO", this.fromContext(message));
}
warn(message: string): void {
- this.logger.log("[WARN]", message);
+ this.logger.log("WARN", this.fromContext(message));
}
error(message: string): void {
- this.logger.log("[ERROR]", message);
+ this.logger.log("ERROR", this.fromContext(message));
}
+ private fromContext(msg: string): string {
+ return this.context ? `[${this.context}] ${msg}` : msg;
+ }
}
\ No newline at end of file
diff --git a/src/service/logger/logger-service.ts b/src/service/logger/logger-service.ts
index 34b1895..477da94 100644
--- a/src/service/logger/logger-service.ts
+++ b/src/service/logger/logger-service.ts
@@ -3,6 +3,12 @@
*/
export default interface LoggerService {
+ setContext(newContext: string): void;
+
+ getContext(): string | undefined;
+
+ clearContext(): void;
+
trace(message: string): void;
debug(message: string): void;
diff --git a/src/service/logger/logger.ts b/src/service/logger/logger.ts
index f058525..18f76e5 100644
--- a/src/service/logger/logger.ts
+++ b/src/service/logger/logger.ts
@@ -6,7 +6,7 @@
log(prefix: string, ...str: string[]) {
// eslint-disable-next-line no-console
- console.log.apply(console, [prefix, ...str]);
+ console.log.apply(console, [`[${prefix.padEnd(5)}]`, ...str]);
}
emptyLine() {
diff --git a/src/service/runner/runner-util.ts b/src/service/runner/runner-util.ts
new file mode 100644
index 0000000..2d5bd2a
--- /dev/null
+++ b/src/service/runner/runner-util.ts
@@ -0,0 +1,22 @@
+import { MESSAGE_ERROR_PLACEHOLDER, MESSAGE_TARGET_BRANCH_PLACEHOLDER } from "@bp/service/configs/configs.types";
+
+/**
+ * Inject the error message in the provided `message`.
+ * This is injected in place of the MESSAGE_ERROR_PLACEHOLDER placeholder
+ * @param message string that needs to be updated
+ * @param errMsg the error message that needs to be injected
+ */
+export const injectError = (message: string, errMsg: string): string => {
+ return message.replace(MESSAGE_ERROR_PLACEHOLDER, errMsg);
+};
+
+/**
+ * Inject the target branch into the provided `message`.
+ * This is injected in place of the MESSAGE_TARGET_BRANCH_PLACEHOLDER placeholder
+ * @param message string that needs to be updated
+ * @param targetBranch the target branch to inject
+ * @returns
+ */
+export const injectTargetBranch = (message: string, targetBranch: string): string => {
+ return message.replace(MESSAGE_TARGET_BRANCH_PLACEHOLDER, targetBranch);
+};
\ No newline at end of file
diff --git a/src/service/runner/runner.ts b/src/service/runner/runner.ts
index b4bf10d..4df541d 100644
--- a/src/service/runner/runner.ts
+++ b/src/service/runner/runner.ts
@@ -3,11 +3,19 @@ import { Args } from "@bp/service/args/args.types";
import { Configs } from "@bp/service/configs/configs.types";
import PullRequestConfigsParser from "@bp/service/configs/pullrequest/pr-configs-parser";
import GitCLIService from "@bp/service/git/git-cli";
-import GitService from "@bp/service/git/git-service";
-import GitServiceFactory from "@bp/service/git/git-service-factory";
-import { BackportPullRequest, GitPullRequest, GitServiceType } from "@bp/service/git/git.types";
+import GitClient from "@bp/service/git/git-client";
+import GitClientFactory from "@bp/service/git/git-client-factory";
+import { BackportPullRequest, GitClientType, GitPullRequest } from "@bp/service/git/git.types";
import LoggerService from "@bp/service/logger/logger-service";
import LoggerServiceFactory from "@bp/service/logger/logger-service-factory";
+import { inferGitClient, inferGitApiUrl, getGitTokenFromEnv } from "@bp/service/git/git-util";
+import { injectError, injectTargetBranch } from "./runner-util";
+
+interface Git {
+ gitClientType: GitClientType;
+ gitClientApi: GitClient;
+ gitCli: GitCLIService;
+}
/**
* Main runner implementation, it implements the core logic flow
@@ -22,38 +30,20 @@ export default class Runner {
this.argsParser = parser;
}
- /**
- * Infer the remote GIT service to interact with based on the provided
- * pull request URL
- * @param prUrl provided pull request URL
- * @returns {GitServiceType}
- */
- private inferRemoteGitService(prUrl: string): GitServiceType {
- const stdPrUrl = prUrl.toLowerCase().trim();
-
- if (stdPrUrl.includes(GitServiceType.GITHUB.toString())) {
- return GitServiceType.GITHUB;
- }
-
- throw new Error(`Remote GIT service not recognixed from PR url: ${prUrl}`);
- }
-
/**
* Entry point invoked by the command line or gha
*/
async run(): Promise {
- this.logger.info("Starting process.");
-
try {
await this.execute();
- this.logger.info("Process succeeded!");
+ this.logger.info("Process succeeded");
process.exit(0);
} catch (error) {
this.logger.error(`${error}`);
- this.logger.info("Process failed!");
+ this.logger.info("Process failed");
process.exit(1);
}
}
@@ -67,60 +57,118 @@ export default class Runner {
const args: Args = this.argsParser.parse();
if (args.dryRun) {
- this.logger.warn("Dry run enabled!");
+ this.logger.warn("Dry run enabled");
}
// 2. init git service
- GitServiceFactory.init(this.inferRemoteGitService(args.pullRequest), args.auth);
- const gitApi: GitService = GitServiceFactory.getService();
+ let gitClientType: GitClientType;
+ if (args.gitClient === undefined) {
+ gitClientType = inferGitClient(args.pullRequest);
+ } else {
+ gitClientType = args.gitClient as GitClientType;
+ }
+ // the api version is ignored in case of github
+ const apiUrl = inferGitApiUrl(args.pullRequest, gitClientType === GitClientType.CODEBERG ? "v1" : undefined);
+ const token = this.fetchToken(args, gitClientType);
+ const gitApi: GitClient = GitClientFactory.getOrCreate(gitClientType, token, apiUrl);
// 3. parse configs
+ this.logger.debug("Parsing configs..");
+ args.auth = token; // override auth
const configs: Configs = await new PullRequestConfigsParser().parseAndValidate(args);
- const originalPR: GitPullRequest = configs.originalPullRequest;
- const backportPR: GitPullRequest = configs.backportPullRequest;
+ const backportPRs: BackportPullRequest[] = configs.backportPullRequests;
// start local git operations
- const git: GitCLIService = new GitCLIService(configs.auth, configs.author);
+ const git: GitCLIService = new GitCLIService(configs.auth, configs.git);
+ const failures: string[] = [];
+ // we need sequential backporting as they will operate on the same folder
+ // avoid cloning the same repo multiple times
+ for(const pr of backportPRs) {
+ try {
+ await this.executeBackport(configs, pr, {
+ gitClientType: gitClientType,
+ gitClientApi: gitApi,
+ gitCli: git,
+ });
+ } catch(error) {
+ this.logger.error(`Something went wrong backporting to ${pr.base}: ${error}`);
+ if (!configs.dryRun && configs.errorNotification.enabled && configs.errorNotification.message.length > 0) {
+ // notify the failure as comment in the original pull request
+ let comment = injectError(configs.errorNotification.message, error as string);
+ comment = injectTargetBranch(comment, pr.base);
+ await gitApi.createPullRequestComment(configs.originalPullRequest.url, comment);
+ }
+ failures.push(error as string);
+ }
+ }
+
+ if (failures.length > 0) {
+ throw new Error(`Failure occurred during one of the backports: [${failures.join(" ; ")}]`);
+ }
+ }
+
+ /**
+ * Fetch the GIT token from the provided Args obj, if not empty, otherwise fallback
+ * to the environment variables.
+ * @param args input arguments
+ * @param gitType git client type
+ * @returns the provided or fetched token, or undefined if not set anywhere
+ */
+ fetchToken(args: Args, gitType: GitClientType): string | undefined {
+ let token = args.auth;
+ if (token === undefined) {
+ // try to fetch the auth from env variable
+ this.logger.info("Auth argument not provided, checking available tokens from env..");
+ token = getGitTokenFromEnv(gitType);
+ if (!token) {
+ this.logger.info("Git token not found in the environment");
+ }
+ }
+
+ return token;
+ }
+
+ async executeBackport(configs: Configs, backportPR: BackportPullRequest, git: Git): Promise {
+ this.logger.setContext(backportPR.base);
+
+ const originalPR: GitPullRequest = configs.originalPullRequest;
+
// 4. clone the repository
- await git.clone(configs.originalPullRequest.targetRepo.cloneUrl, configs.folder, configs.targetBranch);
+ this.logger.debug("Cloning repo..");
+ await git.gitCli.clone(configs.originalPullRequest.targetRepo.cloneUrl, configs.folder, backportPR.base);
// 5. create new branch from target one and checkout
- const backportBranch = backportPR.branchName ?? `bp-${configs.targetBranch}-${originalPR.commits.join("-")}`;
- await git.createLocalBranch(configs.folder, backportBranch);
+ this.logger.debug("Creating local branch..");
+ await git.gitCli.createLocalBranch(configs.folder, backportPR.head);
// 6. fetch pull request remote if source owner != target owner or pull request still open
if (configs.originalPullRequest.sourceRepo.owner !== configs.originalPullRequest.targetRepo.owner ||
configs.originalPullRequest.state === "open") {
- await git.fetch(configs.folder, `pull/${configs.originalPullRequest.number}/head:pr/${configs.originalPullRequest.number}`);
+ this.logger.debug("Fetching pull request remote..");
+ const prefix = git.gitClientType === GitClientType.GITLAB ? "merge-requests" : "pull" ; // default is for gitlab
+ await git.gitCli.fetch(configs.folder, `${prefix}/${configs.originalPullRequest.number}/head:pr/${configs.originalPullRequest.number}`);
}
// 7. apply all changes to the new branch
+ this.logger.debug("Cherry picking commits..");
for (const sha of originalPR.commits) {
- await git.cherryPick(configs.folder, sha);
+ await git.gitCli.cherryPick(configs.folder, sha, configs.mergeStrategy, configs.mergeStrategyOption, configs.cherryPickOptions);
}
- const backport: BackportPullRequest = {
- owner: originalPR.targetRepo.owner,
- repo: originalPR.targetRepo.project,
- head: backportBranch,
- base: configs.targetBranch,
- title: backportPR.title,
- body: backportPR.body,
- reviewers: backportPR.reviewers
- };
-
if (!configs.dryRun) {
// 8. push the new branch to origin
- await git.push(configs.folder, backportBranch);
+ await git.gitCli.push(configs.folder, backportPR.head);
// 9. create pull request new branch -> target branch (using octokit)
- await gitApi.createPullRequest(backport);
+ const prUrl = await git.gitClientApi.createPullRequest(backportPR);
+ this.logger.info(`Pull request created: ${prUrl}`);
} else {
- this.logger.warn("Pull request creation and remote push skipped!");
- this.logger.info(`${JSON.stringify(backport, null, 2)}`);
+ this.logger.warn("Pull request creation and remote push skipped");
+ this.logger.info(`${JSON.stringify(backportPR, null, 2)}`);
}
- }
-}
\ No newline at end of file
+ this.logger.clearContext();
+ }
+}
diff --git a/test/service/args/args-utils.test.ts b/test/service/args/args-utils.test.ts
new file mode 100644
index 0000000..508e5d7
--- /dev/null
+++ b/test/service/args/args-utils.test.ts
@@ -0,0 +1,78 @@
+import { getAsCleanedCommaSeparatedList, getAsCommaSeparatedList, getOrUndefined, parseArgs, readConfigFile } from "@bp/service/args/args-utils";
+import { createTestFile, expectArrayEqual, removeTestFile, spyGetInput } from "../../support/utils";
+import { getInput } from "@actions/core";
+
+const RANDOM_CONFIG_FILE_CONTENT_PATHNAME = "./args-utils-test-random-config-file.json";
+const RANDOM_CONFIG_FILE_CONTENT = {
+ "dryRun": true,
+ "auth": "your-git-service-auth-token",
+ "targetBranch": "target-branch-name",
+ "pullRequest": "https://github.com/user/repo/pull/123",
+ "folder": "/path/to/local/folder",
+ "gitUser": "YourGitUser",
+ "gitEmail": "your-email@example.com",
+ "title": "Backport: Original PR Title",
+ "body": "Backport: Original PR Body",
+ "bodyPrefix": "backport ",
+ "bpBranchName": "backport-branch-name",
+ "reviewers": ["reviewer1", "reviewer2"],
+ "assignees": ["assignee1", "assignee2"],
+ "inheritReviewers": true,
+};
+
+
+describe("args utils test suite", () => {
+ beforeAll(() => {
+ // create a temporary file
+ createTestFile(RANDOM_CONFIG_FILE_CONTENT_PATHNAME, JSON.stringify(RANDOM_CONFIG_FILE_CONTENT));
+ });
+
+ afterAll(() => {
+ // clean up all temporary files
+ removeTestFile(RANDOM_CONFIG_FILE_CONTENT_PATHNAME);
+ });
+
+ test("check parseArgs function", () => {
+ const asString = JSON.stringify(RANDOM_CONFIG_FILE_CONTENT);
+ expect(parseArgs(asString)).toStrictEqual(RANDOM_CONFIG_FILE_CONTENT);
+ });
+
+ test("check readConfigFile function", () => {
+ expect(readConfigFile(RANDOM_CONFIG_FILE_CONTENT_PATHNAME)).toStrictEqual(RANDOM_CONFIG_FILE_CONTENT);
+ });
+
+ test("gha getOrUndefined", () => {
+ spyGetInput({
+ "present": "value",
+ "empty": "",
+ });
+ expect(getOrUndefined(getInput("empty"))).toStrictEqual(undefined);
+ expect(getOrUndefined(getInput("present"))).toStrictEqual("value");
+ });
+
+ test("gha getAsCleanedCommaSeparatedList", () => {
+ spyGetInput({
+ "present": "value1, value2 , value3",
+ "empty": "",
+ "blank": " ",
+ "inner": " inner spaces ",
+ });
+ expectArrayEqual(getAsCleanedCommaSeparatedList(getInput("present"))!, ["value1", "value2", "value3"]);
+ expect(getAsCleanedCommaSeparatedList(getInput("empty"))).toStrictEqual(undefined);
+ expect(getAsCleanedCommaSeparatedList(getInput("blank"))).toStrictEqual(undefined);
+ expect(getAsCleanedCommaSeparatedList(getInput("inner"))).toStrictEqual(["innerspaces"]);
+ });
+
+ test("gha getAsCommaSeparatedList", () => {
+ spyGetInput({
+ "present": "value1, value2 , value3",
+ "empty": "",
+ "blank": " ",
+ "inner": " inner spaces ",
+ });
+ expectArrayEqual(getAsCommaSeparatedList(getInput("present"))!, ["value1", "value2", "value3"]);
+ expect(getAsCommaSeparatedList(getInput("empty"))).toStrictEqual(undefined);
+ expect(getAsCommaSeparatedList(getInput("blank"))).toStrictEqual(undefined);
+ expectArrayEqual(getAsCommaSeparatedList(getInput("inner"))!, ["inner spaces"]);
+ });
+});
\ No newline at end of file
diff --git a/test/service/args/cli/cli-args-parser.test.ts b/test/service/args/cli/cli-args-parser.test.ts
index 6fbb5f2..31d4c15 100644
--- a/test/service/args/cli/cli-args-parser.test.ts
+++ b/test/service/args/cli/cli-args-parser.test.ts
@@ -1,16 +1,55 @@
import { Args } from "@bp/service/args/args.types";
import CLIArgsParser from "@bp/service/args/cli/cli-args-parser";
-import { addProcessArgs, resetProcessArgs } from "../../../support/utils";
+import { addProcessArgs, resetProcessArgs, expectArrayEqual, createTestFile, removeTestFile } from "../../../support/utils";
+
+export const SIMPLE_CONFIG_FILE_CONTENT_PATHNAME = "./cli-args-parser-test-simple-config-file-pulls-1.json";
+export const SIMPLE_CONFIG_FILE_CONTENT = {
+ "targetBranch": "target",
+ "pullRequest": "https://localhost/whatever/pulls/1",
+};
+
+const RANDOM_CONFIG_FILE_CONTENT_PATHNAME = "./cli-args-parser-test-random-config-file.json";
+const RANDOM_CONFIG_FILE_CONTENT = {
+ "dryRun": true,
+ "auth": "your-git-service-auth-token",
+ "targetBranch": "target-branch-name",
+ "pullRequest": "https://github.com/user/repo/pull/123",
+ "folder": "/path/to/local/folder",
+ "gitClient": "codeberg",
+ "gitUser": "YourGitUser",
+ "gitEmail": "your-email@example.com",
+ "title": "Backport: Original PR Title",
+ "body": "Backport: Original PR Body",
+ "bodyPrefix": "backport ",
+ "bpBranchName": "backport-branch-name",
+ "reviewers": ["reviewer1", "reviewer2"],
+ "assignees": ["assignee1", "assignee2"],
+ "inheritReviewers": true,
+ "labels": ["cherry-pick :cherries:"],
+ "inheritLabels": true,
+};
describe("cli args parser", () => {
let parser: CLIArgsParser;
+
+ beforeAll(() => {
+ // create a temporary file
+ createTestFile(SIMPLE_CONFIG_FILE_CONTENT_PATHNAME, JSON.stringify(SIMPLE_CONFIG_FILE_CONTENT));
+ createTestFile(RANDOM_CONFIG_FILE_CONTENT_PATHNAME, JSON.stringify(RANDOM_CONFIG_FILE_CONTENT));
+ });
+
+ afterAll(() => {
+ // clean up all temporary files
+ removeTestFile(SIMPLE_CONFIG_FILE_CONTENT_PATHNAME);
+ removeTestFile(RANDOM_CONFIG_FILE_CONTENT_PATHNAME);
+ });
beforeEach(() => {
- // create a fresh new instance every time
- parser = new CLIArgsParser();
-
// reset process.env variables
resetProcessArgs();
+
+ // create a fresh new instance every time
+ parser = new CLIArgsParser();
});
test("valid execution [default, short]", () => {
@@ -23,8 +62,10 @@ describe("cli args parser", () => {
const args: Args = parser.parse();
expect(args.dryRun).toEqual(false);
- expect(args.auth).toEqual("");
- expect(args.author).toEqual(undefined);
+ expect(args.auth).toEqual(undefined);
+ expect(args.gitClient).toEqual(undefined);
+ expect(args.gitUser).toEqual(undefined);
+ expect(args.gitEmail).toEqual(undefined);
expect(args.folder).toEqual(undefined);
expect(args.targetBranch).toEqual("target");
expect(args.pullRequest).toEqual("https://localhost/whatever/pulls/1");
@@ -32,6 +73,49 @@ describe("cli args parser", () => {
expect(args.body).toEqual(undefined);
expect(args.bodyPrefix).toEqual(undefined);
expect(args.bpBranchName).toEqual(undefined);
+ expect(args.reviewers).toEqual([]);
+ expect(args.assignees).toEqual([]);
+ expect(args.inheritReviewers).toEqual(true);
+ expect(args.labels).toEqual([]);
+ expect(args.inheritLabels).toEqual(false);
+ expect(args.squash).toEqual(true);
+ expect(args.autoNoSquash).toEqual(false);
+ expect(args.strategy).toEqual(undefined);
+ expect(args.strategyOption).toEqual(undefined);
+ expect(args.cherryPickOptions).toEqual(undefined);
+ expect(args.enableErrorNotification).toEqual(false);
+ });
+
+ test("with config file [default, short]", () => {
+ addProcessArgs([
+ "-cf",
+ SIMPLE_CONFIG_FILE_CONTENT_PATHNAME,
+ ]);
+
+ const args: Args = parser.parse();
+ expect(args.dryRun).toEqual(false);
+ expect(args.auth).toEqual(undefined);
+ expect(args.gitClient).toEqual(undefined);
+ expect(args.gitUser).toEqual(undefined);
+ expect(args.gitEmail).toEqual(undefined);
+ expect(args.folder).toEqual(undefined);
+ expect(args.targetBranch).toEqual("target");
+ expect(args.pullRequest).toEqual("https://localhost/whatever/pulls/1");
+ expect(args.title).toEqual(undefined);
+ expect(args.body).toEqual(undefined);
+ expect(args.bodyPrefix).toEqual(undefined);
+ expect(args.bpBranchName).toEqual(undefined);
+ expect(args.reviewers).toEqual([]);
+ expect(args.assignees).toEqual([]);
+ expect(args.inheritReviewers).toEqual(true);
+ expect(args.labels).toEqual([]);
+ expect(args.inheritLabels).toEqual(false);
+ expect(args.squash).toEqual(true);
+ expect(args.autoNoSquash).toEqual(false);
+ expect(args.strategy).toEqual(undefined);
+ expect(args.strategyOption).toEqual(undefined);
+ expect(args.cherryPickOptions).toEqual(undefined);
+ expect(args.enableErrorNotification).toEqual(false);
});
test("valid execution [default, long]", () => {
@@ -44,8 +128,10 @@ describe("cli args parser", () => {
const args: Args = parser.parse();
expect(args.dryRun).toEqual(false);
- expect(args.auth).toEqual("");
- expect(args.author).toEqual(undefined);
+ expect(args.auth).toEqual(undefined);
+ expect(args.gitClient).toEqual(undefined);
+ expect(args.gitUser).toEqual(undefined);
+ expect(args.gitEmail).toEqual(undefined);
expect(args.folder).toEqual(undefined);
expect(args.targetBranch).toEqual("target");
expect(args.pullRequest).toEqual("https://localhost/whatever/pulls/1");
@@ -53,6 +139,45 @@ describe("cli args parser", () => {
expect(args.body).toEqual(undefined);
expect(args.bodyPrefix).toEqual(undefined);
expect(args.bpBranchName).toEqual(undefined);
+ expect(args.reviewers).toEqual([]);
+ expect(args.assignees).toEqual([]);
+ expect(args.inheritReviewers).toEqual(true);
+ expect(args.labels).toEqual([]);
+ expect(args.inheritLabels).toEqual(false);
+ expect(args.squash).toEqual(true);
+ expect(args.strategy).toEqual(undefined);
+ expect(args.strategyOption).toEqual(undefined);
+ expect(args.cherryPickOptions).toEqual(undefined);
+ });
+
+ test("with config file [default, long]", () => {
+ addProcessArgs([
+ "--config-file",
+ SIMPLE_CONFIG_FILE_CONTENT_PATHNAME,
+ ]);
+
+ const args: Args = parser.parse();
+ expect(args.dryRun).toEqual(false);
+ expect(args.auth).toEqual(undefined);
+ expect(args.gitClient).toEqual(undefined);
+ expect(args.gitUser).toEqual(undefined);
+ expect(args.gitEmail).toEqual(undefined);
+ expect(args.folder).toEqual(undefined);
+ expect(args.targetBranch).toEqual("target");
+ expect(args.pullRequest).toEqual("https://localhost/whatever/pulls/1");
+ expect(args.title).toEqual(undefined);
+ expect(args.body).toEqual(undefined);
+ expect(args.bodyPrefix).toEqual(undefined);
+ expect(args.bpBranchName).toEqual(undefined);
+ expect(args.reviewers).toEqual([]);
+ expect(args.assignees).toEqual([]);
+ expect(args.inheritReviewers).toEqual(true);
+ expect(args.labels).toEqual([]);
+ expect(args.inheritLabels).toEqual(false);
+ expect(args.squash).toEqual(true);
+ expect(args.strategy).toEqual(undefined);
+ expect(args.strategyOption).toEqual(undefined);
+ expect(args.cherryPickOptions).toEqual(undefined);
});
test("valid execution [override, short]", () => {
@@ -63,13 +188,19 @@ describe("cli args parser", () => {
"-tb",
"target",
"-pr",
- "https://localhost/whatever/pulls/1"
+ "https://localhost/whatever/pulls/1",
+ "-gu",
+ "Me",
+ "-ge",
+ "me@email.com",
]);
const args: Args = parser.parse();
expect(args.dryRun).toEqual(true);
expect(args.auth).toEqual("bearer-token");
- expect(args.author).toEqual(undefined);
+ expect(args.gitClient).toEqual(undefined);
+ expect(args.gitUser).toEqual("Me");
+ expect(args.gitEmail).toEqual("me@email.com");
expect(args.folder).toEqual(undefined);
expect(args.targetBranch).toEqual("target");
expect(args.pullRequest).toEqual("https://localhost/whatever/pulls/1");
@@ -77,6 +208,15 @@ describe("cli args parser", () => {
expect(args.body).toEqual(undefined);
expect(args.bodyPrefix).toEqual(undefined);
expect(args.bpBranchName).toEqual(undefined);
+ expect(args.reviewers).toEqual([]);
+ expect(args.assignees).toEqual([]);
+ expect(args.inheritReviewers).toEqual(true);
+ expect(args.labels).toEqual([]);
+ expect(args.inheritLabels).toEqual(false);
+ expect(args.squash).toEqual(true);
+ expect(args.strategy).toEqual(undefined);
+ expect(args.strategyOption).toEqual(undefined);
+ expect(args.cherryPickOptions).toEqual(undefined);
});
test("valid execution [override, long]", () => {
@@ -88,6 +228,12 @@ describe("cli args parser", () => {
"target",
"--pull-request",
"https://localhost/whatever/pulls/1",
+ "--git-client",
+ "codeberg",
+ "--git-user",
+ "Me",
+ "--git-email",
+ "me@email.com",
"--title",
"New Title",
"--body",
@@ -96,12 +242,22 @@ describe("cli args parser", () => {
"New Body Prefix",
"--bp-branch-name",
"bp_branch_name",
+ "--reviewers",
+ "al , john, jack",
+ "--assignees",
+ " pippo,pluto, paperino",
+ "--no-inherit-reviewers",
+ "--labels",
+ "cherry-pick :cherries:, another spaced label",
+ "--inherit-labels",
]);
const args: Args = parser.parse();
expect(args.dryRun).toEqual(true);
expect(args.auth).toEqual("bearer-token");
- expect(args.author).toEqual(undefined);
+ expect(args.gitClient).toEqual("codeberg");
+ expect(args.gitUser).toEqual("Me");
+ expect(args.gitEmail).toEqual("me@email.com");
expect(args.folder).toEqual(undefined);
expect(args.targetBranch).toEqual("target");
expect(args.pullRequest).toEqual("https://localhost/whatever/pulls/1");
@@ -109,6 +265,277 @@ describe("cli args parser", () => {
expect(args.body).toEqual("New Body");
expect(args.bodyPrefix).toEqual("New Body Prefix");
expect(args.bpBranchName).toEqual("bp_branch_name");
+ expectArrayEqual(args.reviewers!, ["al", "john", "jack"]);
+ expectArrayEqual(args.assignees!, ["pippo", "pluto", "paperino"]);
+ expect(args.inheritReviewers).toEqual(false);
+ expectArrayEqual(args.labels!, ["cherry-pick :cherries:", "another spaced label"]);
+ expect(args.inheritLabels).toEqual(true);
+ expect(args.squash).toEqual(true);
+ expect(args.strategy).toEqual(undefined);
+ expect(args.strategyOption).toEqual(undefined);
+ expect(args.cherryPickOptions).toEqual(undefined);
});
+ test("override using config file", () => {
+ addProcessArgs([
+ "--config-file",
+ RANDOM_CONFIG_FILE_CONTENT_PATHNAME,
+ ]);
+
+ const args: Args = parser.parse();
+ expect(args.dryRun).toEqual(true);
+ expect(args.auth).toEqual("your-git-service-auth-token");
+ expect(args.gitClient).toEqual("codeberg");
+ expect(args.gitUser).toEqual("YourGitUser");
+ expect(args.gitEmail).toEqual("your-email@example.com");
+ expect(args.folder).toEqual("/path/to/local/folder");
+ expect(args.targetBranch).toEqual("target-branch-name");
+ expect(args.pullRequest).toEqual("https://github.com/user/repo/pull/123");
+ expect(args.title).toEqual("Backport: Original PR Title");
+ expect(args.body).toEqual("Backport: Original PR Body");
+ expect(args.bodyPrefix).toEqual("backport ");
+ expect(args.bpBranchName).toEqual("backport-branch-name");
+ expectArrayEqual(args.reviewers!, ["reviewer1", "reviewer2"]);
+ expectArrayEqual(args.assignees!,["assignee1", "assignee2"]);
+ expect(args.inheritReviewers).toEqual(true);
+ expectArrayEqual(args.labels!, ["cherry-pick :cherries:"]);
+ expect(args.inheritLabels).toEqual(true);
+ expect(args.squash).toEqual(true);
+ expect(args.strategy).toEqual(undefined);
+ expect(args.strategyOption).toEqual(undefined);
+ expect(args.cherryPickOptions).toEqual(undefined);
+ });
+
+ test("ignore custom option when config file is set", () => {
+ addProcessArgs([
+ "--config-file",
+ RANDOM_CONFIG_FILE_CONTENT_PATHNAME,
+ "--dry-run",
+ "--auth",
+ "bearer-token",
+ "--target-branch",
+ "target",
+ "--pull-request",
+ "https://localhost/whatever/pulls/1",
+ "--git-client",
+ "github",
+ "--git-user",
+ "Me",
+ "--git-email",
+ "me@email.com",
+ "--title",
+ "New Title",
+ "--body",
+ "New Body",
+ "--body-prefix",
+ "New Body Prefix",
+ "--bp-branch-name",
+ "bp_branch_name",
+ "--reviewers",
+ "al , john, jack",
+ "--assignees",
+ " pippo,pluto, paperino",
+ "--no-inherit-reviewers",
+ "--labels",
+ "cherry-pick :cherries:, another spaced label",
+ "--inherit-labels",
+ ]);
+
+ const args: Args = parser.parse();
+ expect(args.dryRun).toEqual(true);
+ expect(args.auth).toEqual("your-git-service-auth-token");
+ expect(args.gitClient).toEqual("codeberg");
+ expect(args.gitUser).toEqual("YourGitUser");
+ expect(args.gitEmail).toEqual("your-email@example.com");
+ expect(args.folder).toEqual("/path/to/local/folder");
+ expect(args.targetBranch).toEqual("target-branch-name");
+ expect(args.pullRequest).toEqual("https://github.com/user/repo/pull/123");
+ expect(args.title).toEqual("Backport: Original PR Title");
+ expect(args.body).toEqual("Backport: Original PR Body");
+ expect(args.bodyPrefix).toEqual("backport ");
+ expect(args.bpBranchName).toEqual("backport-branch-name");
+ expectArrayEqual(args.reviewers!, ["reviewer1", "reviewer2"]);
+ expectArrayEqual(args.assignees!,["assignee1", "assignee2"]);
+ expect(args.inheritReviewers).toEqual(true);
+ expectArrayEqual(args.labels!, ["cherry-pick :cherries:"]);
+ expect(args.inheritLabels).toEqual(true);
+ expect(args.squash).toEqual(true);
+ expect(args.strategy).toEqual(undefined);
+ expect(args.strategyOption).toEqual(undefined);
+ expect(args.cherryPickOptions).toEqual(undefined);
+ });
+
+ test("override squash to false", () => {
+ addProcessArgs([
+ "--target-branch",
+ "target",
+ "--pull-request",
+ "https://localhost/whatever/pulls/1",
+ "--no-squash"
+ ]);
+
+ const args: Args = parser.parse();
+ expect(args.dryRun).toEqual(false);
+ expect(args.auth).toEqual(undefined);
+ expect(args.gitClient).toEqual(undefined);
+ expect(args.gitUser).toEqual(undefined);
+ expect(args.gitEmail).toEqual(undefined);
+ expect(args.folder).toEqual(undefined);
+ expect(args.targetBranch).toEqual("target");
+ expect(args.pullRequest).toEqual("https://localhost/whatever/pulls/1");
+ expect(args.title).toEqual(undefined);
+ expect(args.body).toEqual(undefined);
+ expect(args.bodyPrefix).toEqual(undefined);
+ expect(args.bpBranchName).toEqual(undefined);
+ expect(args.reviewers).toEqual([]);
+ expect(args.assignees).toEqual([]);
+ expect(args.inheritReviewers).toEqual(true);
+ expect(args.labels).toEqual([]);
+ expect(args.inheritLabels).toEqual(false);
+ expect(args.squash).toEqual(false);
+ });
+
+ test("override cherry pick strategies and options", () => {
+ addProcessArgs([
+ "--target-branch",
+ "target",
+ "--pull-request",
+ "https://localhost/whatever/pulls/1",
+ "--strategy",
+ "ort",
+ "--strategy-option",
+ "ours",
+ "--cherry-pick-options",
+ "--allow-empty -x",
+ ]);
+
+ const args: Args = parser.parse();
+ expect(args.dryRun).toEqual(false);
+ expect(args.auth).toEqual(undefined);
+ expect(args.gitClient).toEqual(undefined);
+ expect(args.gitUser).toEqual(undefined);
+ expect(args.gitEmail).toEqual(undefined);
+ expect(args.folder).toEqual(undefined);
+ expect(args.targetBranch).toEqual("target");
+ expect(args.pullRequest).toEqual("https://localhost/whatever/pulls/1");
+ expect(args.title).toEqual(undefined);
+ expect(args.body).toEqual(undefined);
+ expect(args.bodyPrefix).toEqual(undefined);
+ expect(args.bpBranchName).toEqual(undefined);
+ expect(args.reviewers).toEqual([]);
+ expect(args.assignees).toEqual([]);
+ expect(args.inheritReviewers).toEqual(true);
+ expect(args.labels).toEqual([]);
+ expect(args.inheritLabels).toEqual(false);
+ expect(args.squash).toEqual(true);
+ expect(args.strategy).toEqual("ort");
+ expect(args.strategyOption).toEqual("ours");
+ expect(args.cherryPickOptions).toEqual("--allow-empty -x");
+ });
+
+ test("additional pr comments", () => {
+ addProcessArgs([
+ "--target-branch",
+ "target",
+ "--pull-request",
+ "https://localhost/whatever/pulls/1",
+ "--comments",
+ "first comment;second comment",
+ ]);
+
+ const args: Args = parser.parse();
+ expect(args.dryRun).toEqual(false);
+ expect(args.auth).toEqual(undefined);
+ expect(args.gitClient).toEqual(undefined);
+ expect(args.gitUser).toEqual(undefined);
+ expect(args.gitEmail).toEqual(undefined);
+ expect(args.folder).toEqual(undefined);
+ expect(args.targetBranch).toEqual("target");
+ expect(args.pullRequest).toEqual("https://localhost/whatever/pulls/1");
+ expect(args.title).toEqual(undefined);
+ expect(args.body).toEqual(undefined);
+ expect(args.bodyPrefix).toEqual(undefined);
+ expect(args.bpBranchName).toEqual(undefined);
+ expect(args.reviewers).toEqual([]);
+ expect(args.assignees).toEqual([]);
+ expect(args.inheritReviewers).toEqual(true);
+ expect(args.labels).toEqual([]);
+ expect(args.inheritLabels).toEqual(false);
+ expect(args.squash).toEqual(true);
+ expectArrayEqual(args.comments!,["first comment", "second comment"]);
+ });
+
+ test("valid execution with multiple branches", () => {
+ addProcessArgs([
+ "-tb",
+ "target, old",
+ "-pr",
+ "https://localhost/whatever/pulls/1"
+ ]);
+
+ const args: Args = parser.parse();
+ expect(args.dryRun).toEqual(false);
+ expect(args.auth).toEqual(undefined);
+ expect(args.gitClient).toEqual(undefined);
+ expect(args.gitUser).toEqual(undefined);
+ expect(args.gitEmail).toEqual(undefined);
+ expect(args.folder).toEqual(undefined);
+ expect(args.targetBranch).toEqual("target, old");
+ expect(args.pullRequest).toEqual("https://localhost/whatever/pulls/1");
+ expect(args.title).toEqual(undefined);
+ expect(args.body).toEqual(undefined);
+ expect(args.bodyPrefix).toEqual(undefined);
+ expect(args.bpBranchName).toEqual(undefined);
+ expect(args.reviewers).toEqual([]);
+ expect(args.assignees).toEqual([]);
+ expect(args.inheritReviewers).toEqual(true);
+ expect(args.labels).toEqual([]);
+ expect(args.inheritLabels).toEqual(false);
+ expect(args.squash).toEqual(true);
+ expect(args.strategy).toEqual(undefined);
+ expect(args.strategyOption).toEqual(undefined);
+ expect(args.cherryPickOptions).toEqual(undefined);
+ });
+
+ test("invalid execution with empty target branch", () => {
+ addProcessArgs([
+ "-tb",
+ " ",
+ "-pr",
+ "https://localhost/whatever/pulls/1"
+ ]);
+
+ expect(() => parser.parse()).toThrowError("Missing option: target branch(es) or target regular expression must be provided");
+ });
+
+ test("invalid execution with missing mandatory target branch", () => {
+ addProcessArgs([
+ "-pr",
+ "https://localhost/whatever/pulls/1"
+ ]);
+
+ expect(() => parser.parse()).toThrowError("Missing option: target branch(es) or target regular expression must be provided");
+ });
+
+ test("invalid execution with missing mandatory pull request", () => {
+ addProcessArgs([
+ "-tb",
+ "target",
+ ]);
+
+ expect(() => parser.parse()).toThrowError("Missing option: pull request must be provided");
+ });
+
+ test("enable error notification flag", () => {
+ addProcessArgs([
+ "-tb",
+ "target, old",
+ "-pr",
+ "https://localhost/whatever/pulls/1",
+ "--enable-err-notification",
+ ]);
+
+ const args: Args = parser.parse();
+ expect(args.enableErrorNotification).toEqual(true);
+ });
});
\ No newline at end of file
diff --git a/test/service/args/gha/gha-args-parser.test.ts b/test/service/args/gha/gha-args-parser.test.ts
index e8cc233..9039a55 100644
--- a/test/service/args/gha/gha-args-parser.test.ts
+++ b/test/service/args/gha/gha-args-parser.test.ts
@@ -1,20 +1,53 @@
import { Args } from "@bp/service/args/args.types";
import GHAArgsParser from "@bp/service/args/gha/gha-args-parser";
-import { spyGetInput } from "../../../support/utils";
+import { spyGetInput, expectArrayEqual, removeTestFile, createTestFile } from "../../../support/utils";
+
+const SIMPLE_CONFIG_FILE_CONTENT_PATHNAME = "./gha-args-parser-test-simple-config-file-pulls-1.json";
+const SIMPLE_CONFIG_FILE_CONTENT = {
+ "targetBranch": "target",
+ "pullRequest": "https://localhost/whatever/pulls/1",
+};
+
+const RANDOM_CONFIG_FILE_CONTENT_PATHNAME = "./gha-args-parser-test-random-config-file.json";
+const RANDOM_CONFIG_FILE_CONTENT = {
+ "dryRun": true,
+ "auth": "your-git-service-auth-token",
+ "targetBranch": "target-branch-name",
+ "pullRequest": "https://github.com/user/repo/pull/123",
+ "folder": "/path/to/local/folder",
+ "gitUser": "YourGitUser",
+ "gitEmail": "your-email@example.com",
+ "title": "Backport: Original PR Title",
+ "body": "Backport: Original PR Body",
+ "bodyPrefix": "backport ",
+ "bpBranchName": "backport-branch-name",
+ "reviewers": ["reviewer1", "reviewer2"],
+ "assignees": ["assignee1", "assignee2"],
+ "inheritReviewers": true,
+ "labels": ["cherry-pick :cherries:"],
+ "inheritLabels": true,
+};
describe("gha args parser", () => {
let parser: GHAArgsParser;
+ beforeAll(() => {
+ // create a temporary file
+ createTestFile(SIMPLE_CONFIG_FILE_CONTENT_PATHNAME, JSON.stringify(SIMPLE_CONFIG_FILE_CONTENT));
+ createTestFile(RANDOM_CONFIG_FILE_CONTENT_PATHNAME, JSON.stringify(RANDOM_CONFIG_FILE_CONTENT));
+ });
+
+ afterAll(() => {
+ // clean up all temporary files
+ removeTestFile(SIMPLE_CONFIG_FILE_CONTENT_PATHNAME);
+ removeTestFile(RANDOM_CONFIG_FILE_CONTENT_PATHNAME);
+ });
+
beforeEach(() => {
// create a fresh new instance every time
parser = new GHAArgsParser();
});
- afterEach(() => {
- jest.clearAllMocks();
- });
-
-
test("valid execution [default]", () => {
spyGetInput({
"target-branch": "target",
@@ -23,15 +56,23 @@ describe("gha args parser", () => {
const args: Args = parser.parse();
expect(args.dryRun).toEqual(false);
- expect(args.auth).toEqual("");
- expect(args.author).toEqual(undefined);
+ expect(args.auth).toEqual(undefined);
+ expect(args.gitUser).toEqual(undefined);
+ expect(args.gitEmail).toEqual(undefined);
expect(args.folder).toEqual(undefined);
expect(args.targetBranch).toEqual("target");
expect(args.pullRequest).toEqual("https://localhost/whatever/pulls/1");
expect(args.title).toEqual(undefined);
expect(args.body).toEqual(undefined);
- expect(args.bodyPrefix).toEqual(undefined);
- expect(args.bpBranchName).toEqual(undefined);
+ expect(args.reviewers).toEqual([]);
+ expect(args.assignees).toEqual([]);
+ expect(args.inheritReviewers).toEqual(true);
+ expect(args.labels).toEqual([]);
+ expect(args.inheritLabels).toEqual(false);
+ expect(args.squash).toEqual(true);
+ expect(args.strategy).toEqual(undefined);
+ expect(args.strategyOption).toEqual(undefined);
+ expect(args.cherryPickOptions).toEqual(undefined);
});
test("valid execution [override]", () => {
@@ -40,16 +81,24 @@ describe("gha args parser", () => {
"auth": "bearer-token",
"target-branch": "target",
"pull-request": "https://localhost/whatever/pulls/1",
+ "git-user": "Me",
+ "git-email": "me@email.com",
"title": "New Title",
"body": "New Body",
"body-prefix": "New Body Prefix",
"bp-branch-name": "bp_branch_name",
+ "reviewers": "al , john, jack",
+ "assignees": " pippo,pluto, paperino",
+ "no-inherit-reviewers": "true",
+ "labels": "cherry-pick :cherries:, another spaced label",
+ "inherit-labels": "true"
});
const args: Args = parser.parse();
expect(args.dryRun).toEqual(true);
expect(args.auth).toEqual("bearer-token");
- expect(args.author).toEqual(undefined);
+ expect(args.gitUser).toEqual("Me");
+ expect(args.gitEmail).toEqual("me@email.com");
expect(args.folder).toEqual(undefined);
expect(args.targetBranch).toEqual("target");
expect(args.pullRequest).toEqual("https://localhost/whatever/pulls/1");
@@ -57,6 +106,228 @@ describe("gha args parser", () => {
expect(args.body).toEqual("New Body");
expect(args.bodyPrefix).toEqual("New Body Prefix");
expect(args.bpBranchName).toEqual("bp_branch_name");
+ expectArrayEqual(args.reviewers!, ["al", "john", "jack"]);
+ expectArrayEqual(args.assignees!, ["pippo", "pluto", "paperino"]);
+ expect(args.inheritReviewers).toEqual(false);
+ expectArrayEqual(args.labels!, ["cherry-pick :cherries:", "another spaced label"]);
+ expect(args.inheritLabels).toEqual(true);
+ expect(args.squash).toEqual(true);
+ expect(args.strategy).toEqual(undefined);
+ expect(args.strategyOption).toEqual(undefined);
+ expect(args.cherryPickOptions).toEqual(undefined);
});
+ test("using config file", () => {
+ spyGetInput({
+ "config-file": SIMPLE_CONFIG_FILE_CONTENT_PATHNAME,
+ });
+
+ const args: Args = parser.parse();
+ expect(args.dryRun).toEqual(false);
+ expect(args.auth).toEqual(undefined);
+ expect(args.gitUser).toEqual(undefined);
+ expect(args.gitEmail).toEqual(undefined);
+ expect(args.folder).toEqual(undefined);
+ expect(args.targetBranch).toEqual("target");
+ expect(args.pullRequest).toEqual("https://localhost/whatever/pulls/1");
+ expect(args.title).toEqual(undefined);
+ expect(args.body).toEqual(undefined);
+ expect(args.bodyPrefix).toEqual(undefined);
+ expect(args.bpBranchName).toEqual(undefined);
+ expect(args.reviewers).toEqual([]);
+ expect(args.assignees).toEqual([]);
+ expect(args.inheritReviewers).toEqual(true);
+ expectArrayEqual(args.labels!, []);
+ expect(args.inheritLabels).toEqual(false);
+ expect(args.squash).toEqual(true);
+ expect(args.strategy).toEqual(undefined);
+ expect(args.strategyOption).toEqual(undefined);
+ expect(args.cherryPickOptions).toEqual(undefined);
+ });
+
+ test("ignore custom options when using config file", () => {
+ spyGetInput({
+ "config-file": RANDOM_CONFIG_FILE_CONTENT_PATHNAME,
+ "dry-run": "true",
+ "auth": "bearer-token",
+ "target-branch": "target",
+ "pull-request": "https://localhost/whatever/pulls/1",
+ "git-user": "Me",
+ "git-email": "me@email.com",
+ "title": "New Title",
+ "body": "New Body",
+ "body-prefix": "New Body Prefix",
+ "bp-branch-name": "bp_branch_name",
+ "reviewers": "al , john, jack",
+ "assignees": " pippo,pluto, paperino",
+ "no-inherit-reviewers": "true",
+ "labels": "cherry-pick :cherries:, another spaced label",
+ "inherit-labels": "false"
+ });
+
+ const args: Args = parser.parse();
+ expect(args.dryRun).toEqual(true);
+ expect(args.auth).toEqual("your-git-service-auth-token");
+ expect(args.gitUser).toEqual("YourGitUser");
+ expect(args.gitEmail).toEqual("your-email@example.com");
+ expect(args.folder).toEqual("/path/to/local/folder");
+ expect(args.targetBranch).toEqual("target-branch-name");
+ expect(args.pullRequest).toEqual("https://github.com/user/repo/pull/123");
+ expect(args.title).toEqual("Backport: Original PR Title");
+ expect(args.body).toEqual("Backport: Original PR Body");
+ expect(args.bodyPrefix).toEqual("backport ");
+ expect(args.bpBranchName).toEqual("backport-branch-name");
+ expectArrayEqual(args.reviewers!, ["reviewer1", "reviewer2"]);
+ expectArrayEqual(args.assignees!,["assignee1", "assignee2"]);
+ expect(args.inheritReviewers).toEqual(true);
+ expectArrayEqual(args.labels!, ["cherry-pick :cherries:"]);
+ expect(args.inheritLabels).toEqual(true);
+ expect(args.squash).toEqual(true);
+ expect(args.strategy).toEqual(undefined);
+ expect(args.strategyOption).toEqual(undefined);
+ expect(args.cherryPickOptions).toEqual(undefined);
+ });
+
+ test("override squash to false", () => {
+ spyGetInput({
+ "target-branch": "target",
+ "pull-request": "https://localhost/whatever/pulls/1",
+ "no-squash": "true",
+ });
+
+ const args: Args = parser.parse();
+ expect(args.dryRun).toEqual(false);
+ expect(args.auth).toEqual(undefined);
+ expect(args.gitUser).toEqual(undefined);
+ expect(args.gitEmail).toEqual(undefined);
+ expect(args.folder).toEqual(undefined);
+ expect(args.targetBranch).toEqual("target");
+ expect(args.pullRequest).toEqual("https://localhost/whatever/pulls/1");
+ expect(args.title).toEqual(undefined);
+ expect(args.body).toEqual(undefined);
+ expect(args.reviewers).toEqual([]);
+ expect(args.assignees).toEqual([]);
+ expect(args.inheritReviewers).toEqual(true);
+ expect(args.labels).toEqual([]);
+ expect(args.inheritLabels).toEqual(false);
+ expect(args.squash).toEqual(false);
+ });
+
+ test("override cherry pick strategy", () => {
+ spyGetInput({
+ "target-branch": "target",
+ "pull-request": "https://localhost/whatever/pulls/1",
+ "strategy": "ort",
+ "strategy-option": "ours",
+ });
+
+ const args: Args = parser.parse();
+ expect(args.dryRun).toEqual(false);
+ expect(args.auth).toEqual(undefined);
+ expect(args.gitUser).toEqual(undefined);
+ expect(args.gitEmail).toEqual(undefined);
+ expect(args.folder).toEqual(undefined);
+ expect(args.targetBranch).toEqual("target");
+ expect(args.pullRequest).toEqual("https://localhost/whatever/pulls/1");
+ expect(args.title).toEqual(undefined);
+ expect(args.body).toEqual(undefined);
+ expect(args.reviewers).toEqual([]);
+ expect(args.assignees).toEqual([]);
+ expect(args.inheritReviewers).toEqual(true);
+ expect(args.labels).toEqual([]);
+ expect(args.inheritLabels).toEqual(false);
+ expect(args.squash).toEqual(true);
+ expect(args.strategy).toEqual("ort");
+ expect(args.strategyOption).toEqual("ours");
+ expect(args.cherryPickOptions).toEqual(undefined);
+ });
+
+ test("additional pr comments", () => {
+ spyGetInput({
+ "target-branch": "target",
+ "pull-request": "https://localhost/whatever/pulls/1",
+ "comments": "first comment;second comment",
+ });
+
+ const args: Args = parser.parse();
+ expect(args.dryRun).toEqual(false);
+ expect(args.auth).toEqual(undefined);
+ expect(args.gitUser).toEqual(undefined);
+ expect(args.gitEmail).toEqual(undefined);
+ expect(args.folder).toEqual(undefined);
+ expect(args.targetBranch).toEqual("target");
+ expect(args.pullRequest).toEqual("https://localhost/whatever/pulls/1");
+ expect(args.title).toEqual(undefined);
+ expect(args.body).toEqual(undefined);
+ expect(args.reviewers).toEqual([]);
+ expect(args.assignees).toEqual([]);
+ expect(args.inheritReviewers).toEqual(true);
+ expect(args.labels).toEqual([]);
+ expect(args.inheritLabels).toEqual(false);
+ expect(args.squash).toEqual(true);
+ expectArrayEqual(args.comments!,["first comment", "second comment"]);
+ });
+
+ test("valid execution with multiple branches", () => {
+ spyGetInput({
+ "target-branch": "target,old",
+ "pull-request": "https://localhost/whatever/pulls/1"
+ });
+
+ const args: Args = parser.parse();
+ expect(args.dryRun).toEqual(false);
+ expect(args.auth).toEqual(undefined);
+ expect(args.gitUser).toEqual(undefined);
+ expect(args.gitEmail).toEqual(undefined);
+ expect(args.folder).toEqual(undefined);
+ expect(args.targetBranch).toEqual("target,old");
+ expect(args.pullRequest).toEqual("https://localhost/whatever/pulls/1");
+ expect(args.title).toEqual(undefined);
+ expect(args.body).toEqual(undefined);
+ expect(args.reviewers).toEqual([]);
+ expect(args.assignees).toEqual([]);
+ expect(args.inheritReviewers).toEqual(true);
+ expect(args.labels).toEqual([]);
+ expect(args.inheritLabels).toEqual(false);
+ expect(args.squash).toEqual(true);
+ expect(args.strategy).toEqual(undefined);
+ expect(args.strategyOption).toEqual(undefined);
+ expect(args.cherryPickOptions).toEqual(undefined);
+ });
+
+ test("invalid execution with empty target branch", () => {
+ spyGetInput({
+ "target-branch": " ",
+ "pull-request": "https://localhost/whatever/pulls/1"
+ });
+
+ expect(() => parser.parse()).toThrowError("Missing option: target branch(es) or target regular expression must be provided");
+ });
+
+ test("invalid execution with missing mandatory target branch", () => {
+ spyGetInput({
+ "pull-request": "https://localhost/whatever/pulls/1"
+ });
+
+ expect(() => parser.parse()).toThrowError("Missing option: target branch(es) or target regular expression must be provided");
+ });
+
+ test("invalid execution with missin mandatory pull request", () => {
+ spyGetInput({
+ "target-branch": "target,old",
+ });
+
+ expect(() => parser.parse()).toThrowError("Missing option: pull request must be provided");
+ });
+
+ test("enable error notification flag", () => {
+ spyGetInput({
+ "target-branch": "target,old",
+ "pull-request": "https://localhost/whatever/pulls/1",
+ "enable-err-notification": "true"
+ });
+
+ const args: Args = parser.parse();
+ expect(args.enableErrorNotification).toEqual(true);
+ });
});
\ No newline at end of file
diff --git a/test/service/configs/pullrequest/github-pr-configs-parser-multiple.test.ts b/test/service/configs/pullrequest/github-pr-configs-parser-multiple.test.ts
new file mode 100644
index 0000000..138a1b0
--- /dev/null
+++ b/test/service/configs/pullrequest/github-pr-configs-parser-multiple.test.ts
@@ -0,0 +1,493 @@
+import { Args } from "@bp/service/args/args.types";
+import { Configs } from "@bp/service/configs/configs.types";
+import PullRequestConfigsParser from "@bp/service/configs/pullrequest/pr-configs-parser";
+import GitClientFactory from "@bp/service/git/git-client-factory";
+import { GitClientType } from "@bp/service/git/git.types";
+import { mockGitHubClient } from "../../../support/mock/git-client-mock-support";
+import { resetProcessArgs } from "../../../support/utils";
+import { MERGED_PR_FIXTURE, REPO, TARGET_OWNER, MULT_COMMITS_PR_FIXTURE } from "../../../support/mock/github-data";
+import GitHubMapper from "@bp/service/git/github/github-mapper";
+import GitHubClient from "@bp/service/git/github/github-client";
+
+jest.spyOn(GitHubMapper.prototype, "mapPullRequest");
+jest.spyOn(GitHubClient.prototype, "getPullRequest");
+
+describe("github pull request config parser", () => {
+
+ const mergedPRUrl = `https://github.com/${TARGET_OWNER}/${REPO}/pull/${MERGED_PR_FIXTURE.number}`;
+ const multipleCommitsPRUrl = `https://github.com/${TARGET_OWNER}/${REPO}/pull/${MULT_COMMITS_PR_FIXTURE.number}`;
+
+ let configParser: PullRequestConfigsParser;
+
+ beforeAll(() => {
+ GitClientFactory.reset();
+ GitClientFactory.getOrCreate(GitClientType.GITHUB, "whatever", "http://localhost/api/v3");
+ });
+
+ beforeEach(() => {
+ // reset process.env variables
+ resetProcessArgs();
+
+ // mock octokit
+ mockGitHubClient("http://localhost/api/v3");
+
+ // create a fresh new instance every time
+ configParser = new PullRequestConfigsParser();
+ });
+
+ test("multiple backports", async () => {
+ const args: Args = {
+ dryRun: false,
+ auth: "",
+ pullRequest: mergedPRUrl,
+ targetBranch: "v1, v2, v3",
+ gitUser: "Me",
+ gitEmail: "me@email.com",
+ title: "New Title",
+ body: "New Body",
+ bodyPrefix: "New Body Prefix -",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ inheritReviewers: false,
+ labels: [],
+ inheritLabels: false,
+ comments: [],
+ };
+
+ const configs: Configs = await configParser.parseAndValidate(args);
+
+ expect(GitHubClient.prototype.getPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.getPullRequest).toBeCalledWith("owner", "reponame", 2368, undefined);
+ expect(GitHubMapper.prototype.mapPullRequest).toBeCalledTimes(1);
+ expect(GitHubMapper.prototype.mapPullRequest).toBeCalledWith(expect.anything(), []);
+
+ expect(configs.dryRun).toEqual(false);
+ expect(configs.auth).toEqual("");
+ expect(configs.folder).toEqual(process.cwd() + "/bp");
+ expect(configs.backportPullRequests.length).toEqual(3);
+ expect(configs.backportPullRequests).toEqual(
+ expect.arrayContaining([
+ {
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-v1-28f63db",
+ base: "v1",
+ title: "New Title",
+ body: "New Body Prefix -New Body",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ labels: [],
+ comments: [],
+ },
+ {
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-v2-28f63db",
+ base: "v2",
+ title: "New Title",
+ body: "New Body Prefix -New Body",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ labels: [],
+ comments: [],
+ },
+ {
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-v3-28f63db",
+ base: "v3",
+ title: "New Title",
+ body: "New Body Prefix -New Body",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ labels: [],
+ comments: [],
+ },
+ ])
+ );
+ });
+
+ test("multiple backports ignore duplicates", async () => {
+ const args: Args = {
+ dryRun: false,
+ auth: "",
+ pullRequest: mergedPRUrl,
+ targetBranch: "v1, v2, v2, v3",
+ gitUser: "Me",
+ gitEmail: "me@email.com",
+ title: "New Title",
+ body: "New Body",
+ bodyPrefix: "New Body Prefix -",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ inheritReviewers: false,
+ labels: [],
+ inheritLabels: false,
+ comments: [],
+ };
+
+ const configs: Configs = await configParser.parseAndValidate(args);
+
+ expect(GitHubClient.prototype.getPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.getPullRequest).toBeCalledWith("owner", "reponame", 2368, undefined);
+ expect(GitHubMapper.prototype.mapPullRequest).toBeCalledTimes(1);
+ expect(GitHubMapper.prototype.mapPullRequest).toBeCalledWith(expect.anything(), []);
+
+ expect(configs.dryRun).toEqual(false);
+ expect(configs.auth).toEqual("");
+ expect(configs.folder).toEqual(process.cwd() + "/bp");
+ expect(configs.backportPullRequests.length).toEqual(3);
+ expect(configs.backportPullRequests).toEqual(
+ expect.arrayContaining([
+ {
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-v1-28f63db",
+ base: "v1",
+ title: "New Title",
+ body: "New Body Prefix -New Body",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ labels: [],
+ comments: [],
+ },
+ {
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-v2-28f63db",
+ base: "v2",
+ title: "New Title",
+ body: "New Body Prefix -New Body",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ labels: [],
+ comments: [],
+ },
+ {
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-v3-28f63db",
+ base: "v3",
+ title: "New Title",
+ body: "New Body Prefix -New Body",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ labels: [],
+ comments: [],
+ },
+ ])
+ );
+ });
+
+ test("multiple backports with custom branch name", async () => {
+ const args: Args = {
+ dryRun: false,
+ auth: "",
+ pullRequest: mergedPRUrl,
+ targetBranch: "v1, v2, v3",
+ gitUser: "Me",
+ gitEmail: "me@email.com",
+ title: "New Title",
+ body: "New Body",
+ bodyPrefix: "New Body Prefix -",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ inheritReviewers: false,
+ labels: [],
+ inheritLabels: false,
+ comments: [],
+ bpBranchName: "custom-branch",
+ };
+
+ const configs: Configs = await configParser.parseAndValidate(args);
+
+ expect(GitHubClient.prototype.getPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.getPullRequest).toBeCalledWith("owner", "reponame", 2368, undefined);
+ expect(GitHubMapper.prototype.mapPullRequest).toBeCalledTimes(1);
+ expect(GitHubMapper.prototype.mapPullRequest).toBeCalledWith(expect.anything(), []);
+
+ expect(configs.dryRun).toEqual(false);
+ expect(configs.auth).toEqual("");
+ expect(configs.folder).toEqual(process.cwd() + "/bp");
+ expect(configs.backportPullRequests.length).toEqual(3);
+ expect(configs.backportPullRequests).toEqual(
+ expect.arrayContaining([
+ {
+ owner: "owner",
+ repo: "reponame",
+ head: "custom-branch-v1",
+ base: "v1",
+ title: "New Title",
+ body: "New Body Prefix -New Body",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ labels: [],
+ comments: [],
+ },
+ {
+ owner: "owner",
+ repo: "reponame",
+ head: "custom-branch-v2",
+ base: "v2",
+ title: "New Title",
+ body: "New Body Prefix -New Body",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ labels: [],
+ comments: [],
+ },
+ {
+ owner: "owner",
+ repo: "reponame",
+ head: "custom-branch-v3",
+ base: "v3",
+ title: "New Title",
+ body: "New Body Prefix -New Body",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ labels: [],
+ comments: [],
+ },
+ ])
+ );
+ });
+
+ test("multiple backports with multiple custom branch names", async () => {
+ const args: Args = {
+ dryRun: false,
+ auth: "",
+ pullRequest: mergedPRUrl,
+ targetBranch: "v1, v2, v3",
+ gitUser: "Me",
+ gitEmail: "me@email.com",
+ title: "New Title",
+ body: "New Body",
+ bodyPrefix: "New Body Prefix -",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ inheritReviewers: false,
+ labels: [],
+ inheritLabels: false,
+ comments: [],
+ bpBranchName: "custom-branch1, custom-branch2, custom-branch3",
+ };
+
+ const configs: Configs = await configParser.parseAndValidate(args);
+
+ expect(GitHubClient.prototype.getPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.getPullRequest).toBeCalledWith("owner", "reponame", 2368, undefined);
+ expect(GitHubMapper.prototype.mapPullRequest).toBeCalledTimes(1);
+ expect(GitHubMapper.prototype.mapPullRequest).toBeCalledWith(expect.anything(), []);
+
+ expect(configs.dryRun).toEqual(false);
+ expect(configs.auth).toEqual("");
+ expect(configs.folder).toEqual(process.cwd() + "/bp");
+ expect(configs.backportPullRequests.length).toEqual(3);
+ expect(configs.backportPullRequests).toEqual(
+ expect.arrayContaining([
+ {
+ owner: "owner",
+ repo: "reponame",
+ head: "custom-branch1",
+ base: "v1",
+ title: "New Title",
+ body: "New Body Prefix -New Body",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ labels: [],
+ comments: [],
+ },
+ {
+ owner: "owner",
+ repo: "reponame",
+ head: "custom-branch2",
+ base: "v2",
+ title: "New Title",
+ body: "New Body Prefix -New Body",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ labels: [],
+ comments: [],
+ },
+ {
+ owner: "owner",
+ repo: "reponame",
+ head: "custom-branch3",
+ base: "v3",
+ title: "New Title",
+ body: "New Body Prefix -New Body",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ labels: [],
+ comments: [],
+ },
+ ])
+ );
+ });
+
+ test("multiple backports with incorrect number of bp branch names", async () => {
+ const args: Args = {
+ dryRun: false,
+ auth: "",
+ pullRequest: mergedPRUrl,
+ targetBranch: "v1, v2, v3",
+ gitUser: "Me",
+ gitEmail: "me@email.com",
+ title: "New Title",
+ body: "New Body",
+ bodyPrefix: "New Body Prefix -",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ inheritReviewers: false,
+ labels: [],
+ inheritLabels: false,
+ comments: [],
+ bpBranchName: "custom-branch1, custom-branch2",
+ };
+
+ await expect(() => configParser.parseAndValidate(args)).rejects.toThrow("The number of backport branch names, if provided, must match the number of target branches or just one, provided 2 branch names instead");
+ });
+
+ test("multiple backports and multiple commits", async () => {
+ const args: Args = {
+ dryRun: false,
+ auth: "",
+ pullRequest: multipleCommitsPRUrl,
+ targetBranch: "v4, v5, v6",
+ gitUser: "GitHub",
+ gitEmail: "noreply@github.com",
+ reviewers: [],
+ assignees: [],
+ inheritReviewers: true,
+ squash: false,
+ };
+
+ const configs: Configs = await configParser.parseAndValidate(args);
+
+ expect(GitHubClient.prototype.getPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.getPullRequest).toBeCalledWith("owner", "reponame", 8632, false);
+ expect(GitHubMapper.prototype.mapPullRequest).toBeCalledTimes(1);
+ expect(GitHubMapper.prototype.mapPullRequest).toBeCalledWith(expect.anything(), ["0404fb922ab75c3a8aecad5c97d9af388df04695", "11da4e38aa3e577ffde6d546f1c52e53b04d3151"]);
+
+ expect(configs.dryRun).toEqual(false);
+ expect(configs.git).toEqual({
+ user: "GitHub",
+ email: "noreply@github.com"
+ });
+ expect(configs.auth).toEqual("");
+ expect(configs.folder).toEqual(process.cwd() + "/bp");
+ expect(configs.backportPullRequests.length).toEqual(3);
+ expect(configs.backportPullRequests).toEqual(
+ expect.arrayContaining([
+ {
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-v4-0404fb9-11da4e3",
+ base: "v4",
+ title: "[v4] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/8632\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ },
+ {
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-v5-0404fb9-11da4e3",
+ base: "v5",
+ title: "[v5] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/8632\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ },
+ {
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-v6-0404fb9-11da4e3",
+ base: "v6",
+ title: "[v6] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/8632\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ },
+ ])
+ );
+ });
+
+ test("multiple extracted branches and multiple commits", async () => {
+ const args: Args = {
+ dryRun: false,
+ auth: "",
+ pullRequest: multipleCommitsPRUrl,
+ targetBranchPattern: "^backport (?([^ ]+))$",
+ gitUser: "GitHub",
+ gitEmail: "noreply@github.com",
+ reviewers: [],
+ assignees: [],
+ inheritReviewers: true,
+ squash: false,
+ };
+
+ const configs: Configs = await configParser.parseAndValidate(args);
+
+ expect(GitHubClient.prototype.getPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.getPullRequest).toBeCalledWith("owner", "reponame", 8632, false);
+ expect(GitHubMapper.prototype.mapPullRequest).toBeCalledTimes(1);
+ expect(GitHubMapper.prototype.mapPullRequest).toBeCalledWith(expect.anything(), ["0404fb922ab75c3a8aecad5c97d9af388df04695", "11da4e38aa3e577ffde6d546f1c52e53b04d3151"]);
+
+ expect(configs.dryRun).toEqual(false);
+ expect(configs.git).toEqual({
+ user: "GitHub",
+ email: "noreply@github.com"
+ });
+ expect(configs.auth).toEqual("");
+ expect(configs.folder).toEqual(process.cwd() + "/bp");
+ expect(configs.backportPullRequests.length).toEqual(3);
+ expect(configs.backportPullRequests).toEqual(
+ expect.arrayContaining([
+ {
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-v1-0404fb9-11da4e3",
+ base: "v1",
+ title: "[v1] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/8632\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ },
+ {
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-v2-0404fb9-11da4e3",
+ base: "v2",
+ title: "[v2] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/8632\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ },
+ {
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-v3-0404fb9-11da4e3",
+ base: "v3",
+ title: "[v3] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/8632\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ },
+ ])
+ );
+ });
+
+});
\ No newline at end of file
diff --git a/test/service/configs/pullrequest/github-pr-configs-parser.test.ts b/test/service/configs/pullrequest/github-pr-configs-parser.test.ts
new file mode 100644
index 0000000..369695e
--- /dev/null
+++ b/test/service/configs/pullrequest/github-pr-configs-parser.test.ts
@@ -0,0 +1,968 @@
+import { Args } from "@bp/service/args/args.types";
+import { Configs } from "@bp/service/configs/configs.types";
+import PullRequestConfigsParser from "@bp/service/configs/pullrequest/pr-configs-parser";
+import GitClientFactory from "@bp/service/git/git-client-factory";
+import { GitClientType } from "@bp/service/git/git.types";
+import { mockGitHubClient } from "../../../support/mock/git-client-mock-support";
+import { addProcessArgs, createTestFile, removeTestFile, resetProcessArgs } from "../../../support/utils";
+import { MERGED_PR_FIXTURE, OPEN_PR_FIXTURE, NOT_MERGED_PR_FIXTURE, REPO, TARGET_OWNER, MULT_COMMITS_PR_FIXTURE } from "../../../support/mock/github-data";
+import CLIArgsParser from "@bp/service/args/cli/cli-args-parser";
+import GitHubMapper from "@bp/service/git/github/github-mapper";
+import GitHubClient from "@bp/service/git/github/github-client";
+
+const GITHUB_MERGED_PR_SIMPLE_CONFIG_FILE_CONTENT_PATHNAME = "./github-pr-configs-parser-simple-pr-merged.json";
+const GITHUB_MERGED_PR_SIMPLE_CONFIG_FILE_CONTENT = {
+ "targetBranch": "prod",
+ "pullRequest": `https://github.com/${TARGET_OWNER}/${REPO}/pull/${MERGED_PR_FIXTURE.number}`,
+};
+
+const GITHUB_MERGED_PR_COMPLEX_CONFIG_FILE_CONTENT_PATHNAME = "./github-pr-configs-parser-complex-pr-merged.json";
+const GITHUB_MERGED_PR_COMPLEX_CONFIG_FILE_CONTENT = {
+ "dryRun": false,
+ "auth": "my-auth-token",
+ "pullRequest": `https://github.com/${TARGET_OWNER}/${REPO}/pull/${MERGED_PR_FIXTURE.number}`,
+ "targetBranch": "prod",
+ "gitUser": "Me",
+ "gitEmail": "me@email.com",
+ "title": "New Title",
+ "body": "New Body",
+ "bodyPrefix": "New Body Prefix -",
+ "reviewers": ["user1", "user2"],
+ "assignees": ["user3", "user4"],
+ "inheritReviewers": true, // not taken into account
+ "labels": ["cherry-pick :cherries:"],
+ "inheritLabels": true,
+};
+
+jest.spyOn(GitHubMapper.prototype, "mapPullRequest");
+jest.spyOn(GitHubClient.prototype, "getPullRequest");
+
+describe("github pull request config parser", () => {
+
+ const mergedPRUrl = `https://github.com/${TARGET_OWNER}/${REPO}/pull/${MERGED_PR_FIXTURE.number}`;
+ const openPRUrl = `https://github.com/${TARGET_OWNER}/${REPO}/pull/${OPEN_PR_FIXTURE.number}`;
+ const notMergedPRUrl = `https://github.com/${TARGET_OWNER}/${REPO}/pull/${NOT_MERGED_PR_FIXTURE.number}`;
+ const multipleCommitsPRUrl = `https://github.com/${TARGET_OWNER}/${REPO}/pull/${MULT_COMMITS_PR_FIXTURE.number}`;
+
+ let argsParser: CLIArgsParser;
+ let configParser: PullRequestConfigsParser;
+
+ beforeAll(() => {
+ // create a temporary file
+ createTestFile(GITHUB_MERGED_PR_SIMPLE_CONFIG_FILE_CONTENT_PATHNAME, JSON.stringify(GITHUB_MERGED_PR_SIMPLE_CONFIG_FILE_CONTENT));
+ createTestFile(GITHUB_MERGED_PR_COMPLEX_CONFIG_FILE_CONTENT_PATHNAME, JSON.stringify(GITHUB_MERGED_PR_COMPLEX_CONFIG_FILE_CONTENT));
+
+ GitClientFactory.reset();
+ GitClientFactory.getOrCreate(GitClientType.GITHUB, "whatever", "http://localhost/api/v3");
+ });
+
+ afterAll(() => {
+ // clean up all temporary files
+ removeTestFile(GITHUB_MERGED_PR_SIMPLE_CONFIG_FILE_CONTENT_PATHNAME);
+ removeTestFile(GITHUB_MERGED_PR_COMPLEX_CONFIG_FILE_CONTENT_PATHNAME);
+ });
+
+ beforeEach(() => {
+ // reset process.env variables
+ resetProcessArgs();
+
+ // mock octokit
+ mockGitHubClient("http://localhost/api/v3");
+
+ // create a fresh new instance every time
+ argsParser = new CLIArgsParser();
+ configParser = new PullRequestConfigsParser();
+ });
+
+ test("parse configs from pull request", async () => {
+ const args: Args = {
+ dryRun: false,
+ pullRequest: mergedPRUrl,
+ targetBranch: "prod",
+ gitUser: "GitHub",
+ gitEmail: "noreply@github.com",
+ reviewers: [],
+ assignees: [],
+ inheritReviewers: true,
+ };
+
+ const configs: Configs = await configParser.parseAndValidate(args);
+
+ expect(GitHubClient.prototype.getPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.getPullRequest).toBeCalledWith("owner", "reponame", 2368, undefined);
+ expect(GitHubMapper.prototype.mapPullRequest).toBeCalledTimes(1);
+ expect(GitHubMapper.prototype.mapPullRequest).toBeCalledWith(expect.anything(), []);
+
+ expect(configs.dryRun).toEqual(false);
+ expect(configs.git).toEqual({
+ user: "GitHub",
+ email: "noreply@github.com"
+ });
+ expect(configs.auth).toEqual(undefined);
+ expect(configs.folder).toEqual(process.cwd() + "/bp");
+ expect(configs.originalPullRequest).toEqual({
+ number: 2368,
+ author: "gh-user",
+ url: "https://api.github.com/repos/owner/reponame/pulls/2368",
+ htmlUrl: "https://github.com/owner/reponame/pull/2368",
+ state: "closed",
+ merged: true,
+ mergedBy: "that-s-a-user",
+ title: "PR Title",
+ body: "Please review and merge",
+ reviewers: ["requested-gh-user", "gh-user"],
+ assignees: [],
+ labels: ["backport prod"],
+ targetRepo: {
+ owner: "owner",
+ project: "reponame",
+ cloneUrl: "https://github.com/owner/reponame.git"
+ },
+ sourceRepo: {
+ owner: "fork",
+ project: "reponame",
+ cloneUrl: "https://github.com/fork/reponame.git"
+ },
+ nCommits: 2,
+ commits: ["28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc"]
+ });
+ expect(configs.backportPullRequests.length).toEqual(1);
+ expect(configs.backportPullRequests[0]).toEqual({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-prod-28f63db",
+ base: "prod",
+ title: "[prod] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ });
+ expect(configs.errorNotification).toEqual({
+ enabled: false,
+ message: "The backport to `{{target-branch}}` failed. Check the latest run for more details."
+ });
+ });
+
+ test("override folder", async () => {
+ const args: Args = {
+ dryRun: true,
+ auth: "whatever",
+ pullRequest: mergedPRUrl,
+ targetBranch: "prod",
+ folder: "/tmp/test",
+ gitUser: "GitHub",
+ gitEmail: "noreply@github.com",
+ reviewers: [],
+ assignees: [],
+ inheritReviewers: true,
+ };
+
+ const configs: Configs = await configParser.parseAndValidate(args);
+
+ expect(configs.dryRun).toEqual(true);
+ expect(configs.auth).toEqual("whatever");
+ expect(configs.folder).toEqual("/tmp/test");
+ expect(configs.git).toEqual({
+ user: "GitHub",
+ email: "noreply@github.com"
+ });
+ });
+
+ test("still open pull request", async () => {
+ const args: Args = {
+ dryRun: true,
+ auth: "whatever",
+ pullRequest: openPRUrl,
+ targetBranch: "prod",
+ gitUser: "GitHub",
+ gitEmail: "noreply@github.com",
+ reviewers: [],
+ assignees: [],
+ inheritReviewers: true,
+ };
+
+ const configs: Configs = await configParser.parseAndValidate(args);
+
+ expect(GitHubClient.prototype.getPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.getPullRequest).toBeCalledWith("owner", "reponame", 4444, undefined);
+ expect(GitHubMapper.prototype.mapPullRequest).toBeCalledTimes(1);
+ expect(GitHubMapper.prototype.mapPullRequest).toBeCalledWith(expect.anything(), ["0404fb922ab75c3a8aecad5c97d9af388df04695", "11da4e38aa3e577ffde6d546f1c52e53b04d3151"]);
+
+ expect(configs.dryRun).toEqual(true);
+ expect(configs.auth).toEqual("whatever");
+ expect(configs.git).toEqual({
+ user: "GitHub",
+ email: "noreply@github.com"
+ });
+ expect(configs.originalPullRequest).toEqual({
+ number: 4444,
+ author: "gh-user",
+ url: "https://api.github.com/repos/owner/reponame/pulls/4444",
+ htmlUrl: "https://github.com/owner/reponame/pull/4444",
+ state: "open",
+ merged: false,
+ mergedBy: undefined,
+ title: "PR Title",
+ body: "Please review and merge",
+ reviewers: ["gh-user"],
+ assignees: [],
+ labels: [],
+ targetRepo: {
+ owner: "owner",
+ project: "reponame",
+ cloneUrl: "https://github.com/owner/reponame.git"
+ },
+ sourceRepo: {
+ owner: "fork",
+ project: "reponame",
+ cloneUrl: "https://github.com/fork/reponame.git"
+ },
+ bpBranchName: undefined,
+ nCommits: 2,
+ commits: ["0404fb922ab75c3a8aecad5c97d9af388df04695", "11da4e38aa3e577ffde6d546f1c52e53b04d3151"],
+ });
+ });
+
+ test("closed pull request", async () => {
+ const args: Args = {
+ dryRun: true,
+ auth: "whatever",
+ pullRequest: notMergedPRUrl,
+ targetBranch: "prod",
+ gitUser: "GitHub",
+ gitEmail: "noreply@github.com",
+ reviewers: [],
+ assignees: [],
+ inheritReviewers: true,
+ };
+
+ await expect(() => configParser.parseAndValidate(args)).rejects.toThrow("Provided pull request is closed and not merged");
+ });
+
+ test("override backport pr data inheriting reviewers", async () => {
+ const args: Args = {
+ dryRun: false,
+ auth: "",
+ pullRequest: mergedPRUrl,
+ targetBranch: "prod",
+ gitUser: "Me",
+ gitEmail: "me@email.com",
+ title: "New Title",
+ body: "New Body",
+ bodyPrefix: "New Body Prefix -",
+ reviewers: [],
+ assignees: [],
+ inheritReviewers: true,
+ bpBranchName: "custom-branch"
+ };
+
+ const configs: Configs = await configParser.parseAndValidate(args);
+
+ expect(GitHubClient.prototype.getPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.getPullRequest).toBeCalledWith("owner", "reponame", 2368, undefined);
+ expect(GitHubMapper.prototype.mapPullRequest).toBeCalledTimes(1);
+ expect(GitHubMapper.prototype.mapPullRequest).toBeCalledWith(expect.anything(), []);
+
+ expect(configs.dryRun).toEqual(false);
+ expect(configs.git).toEqual({
+ user: "Me",
+ email: "me@email.com"
+ });
+ expect(configs.auth).toEqual("");
+ expect(configs.folder).toEqual(process.cwd() + "/bp");
+ expect(configs.originalPullRequest).toEqual({
+ number: 2368,
+ author: "gh-user",
+ url: "https://api.github.com/repos/owner/reponame/pulls/2368",
+ htmlUrl: "https://github.com/owner/reponame/pull/2368",
+ state: "closed",
+ merged: true,
+ mergedBy: "that-s-a-user",
+ title: "PR Title",
+ body: "Please review and merge",
+ reviewers: ["requested-gh-user", "gh-user"],
+ assignees: [],
+ labels: ["backport prod"],
+ targetRepo: {
+ owner: "owner",
+ project: "reponame",
+ cloneUrl: "https://github.com/owner/reponame.git"
+ },
+ sourceRepo: {
+ owner: "fork",
+ project: "reponame",
+ cloneUrl: "https://github.com/fork/reponame.git"
+ },
+ bpBranchName: undefined,
+ nCommits: 2,
+ commits: ["28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc"],
+ });
+ expect(configs.backportPullRequests.length).toEqual(1);
+ expect(configs.backportPullRequests[0]).toEqual({
+ owner: "owner",
+ repo: "reponame",
+ head: "custom-branch",
+ base: "prod",
+ title: "New Title",
+ body: "New Body Prefix -New Body",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ });
+ });
+
+ test("override backport with empty bp branch name", async () => {
+ const args: Args = {
+ dryRun: false,
+ auth: "",
+ pullRequest: mergedPRUrl,
+ targetBranch: "prod",
+ gitUser: "Me",
+ gitEmail: "me@email.com",
+ title: "New Title",
+ body: "New Body",
+ bodyPrefix: "New Body Prefix -",
+ reviewers: [],
+ assignees: [],
+ inheritReviewers: true,
+ bpBranchName: " "
+ };
+
+ const configs: Configs = await configParser.parseAndValidate(args);
+
+ expect(GitHubClient.prototype.getPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.getPullRequest).toBeCalledWith("owner", "reponame", 2368, undefined);
+ expect(GitHubMapper.prototype.mapPullRequest).toBeCalledTimes(1);
+ expect(GitHubMapper.prototype.mapPullRequest).toBeCalledWith(expect.anything(), []);
+
+ expect(configs.dryRun).toEqual(false);
+ expect(configs.auth).toEqual("");
+ expect(configs.folder).toEqual(process.cwd() + "/bp");
+ expect(configs.backportPullRequests.length).toEqual(1);
+ expect(configs.backportPullRequests[0]).toEqual({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-prod-28f63db",
+ base: "prod",
+ title: "New Title",
+ body: "New Body Prefix -New Body",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ });
+ });
+
+ test("override backport pr reviewers and assignees", async () => {
+ const args: Args = {
+ dryRun: false,
+ auth: "",
+ pullRequest: mergedPRUrl,
+ targetBranch: "prod",
+ gitUser: "Me",
+ gitEmail: "me@email.com",
+ title: "New Title",
+ body: "New Body",
+ bodyPrefix: "New Body Prefix -",
+ reviewers: ["user1", "user2"],
+ assignees: ["user3", "user4"],
+ inheritReviewers: true, // not taken into account
+ };
+
+ const configs: Configs = await configParser.parseAndValidate(args);
+
+ expect(GitHubClient.prototype.getPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.getPullRequest).toBeCalledWith("owner", "reponame", 2368, undefined);
+ expect(GitHubMapper.prototype.mapPullRequest).toBeCalledTimes(1);
+ expect(GitHubMapper.prototype.mapPullRequest).toBeCalledWith(expect.anything(), []);
+
+ expect(configs.dryRun).toEqual(false);
+ expect(configs.git).toEqual({
+ user: "Me",
+ email: "me@email.com"
+ });
+ expect(configs.auth).toEqual("");
+ expect(configs.folder).toEqual(process.cwd() + "/bp");
+ expect(configs.originalPullRequest).toEqual({
+ number: 2368,
+ author: "gh-user",
+ url: "https://api.github.com/repos/owner/reponame/pulls/2368",
+ htmlUrl: "https://github.com/owner/reponame/pull/2368",
+ state: "closed",
+ merged: true,
+ mergedBy: "that-s-a-user",
+ title: "PR Title",
+ body: "Please review and merge",
+ reviewers: ["requested-gh-user", "gh-user"],
+ assignees: [],
+ labels: ["backport prod"],
+ targetRepo: {
+ owner: "owner",
+ project: "reponame",
+ cloneUrl: "https://github.com/owner/reponame.git"
+ },
+ sourceRepo: {
+ owner: "fork",
+ project: "reponame",
+ cloneUrl: "https://github.com/fork/reponame.git"
+ },
+ bpBranchName: undefined,
+ nCommits: 2,
+ commits: ["28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc"],
+ });
+ expect(configs.backportPullRequests.length).toEqual(1);
+ expect(configs.backportPullRequests[0]).toEqual({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-prod-28f63db",
+ base: "prod",
+ title: "New Title",
+ body: "New Body Prefix -New Body",
+ reviewers: ["user1", "user2"],
+ assignees: ["user3", "user4"],
+ labels: [],
+ comments: [],
+ });
+ });
+
+ test("override backport pr empty reviewers", async () => {
+ const args: Args = {
+ dryRun: false,
+ auth: "",
+ pullRequest: mergedPRUrl,
+ targetBranch: "prod",
+ gitUser: "Me",
+ gitEmail: "me@email.com",
+ title: "New Title",
+ body: "New Body",
+ bodyPrefix: "New Body Prefix -",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ inheritReviewers: false,
+ };
+
+ const configs: Configs = await configParser.parseAndValidate(args);
+
+ expect(GitHubClient.prototype.getPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.getPullRequest).toBeCalledWith("owner", "reponame", 2368, undefined);
+ expect(GitHubMapper.prototype.mapPullRequest).toBeCalledTimes(1);
+ expect(GitHubMapper.prototype.mapPullRequest).toBeCalledWith(expect.anything(), []);
+
+ expect(configs.dryRun).toEqual(false);
+ expect(configs.git).toEqual({
+ user: "Me",
+ email: "me@email.com"
+ });
+ expect(configs.auth).toEqual("");
+ expect(configs.folder).toEqual(process.cwd() + "/bp");
+ expect(configs.originalPullRequest).toEqual({
+ number: 2368,
+ author: "gh-user",
+ url: "https://api.github.com/repos/owner/reponame/pulls/2368",
+ htmlUrl: "https://github.com/owner/reponame/pull/2368",
+ state: "closed",
+ merged: true,
+ mergedBy: "that-s-a-user",
+ title: "PR Title",
+ body: "Please review and merge",
+ reviewers: ["requested-gh-user", "gh-user"],
+ assignees: [],
+ labels: ["backport prod"],
+ targetRepo: {
+ owner: "owner",
+ project: "reponame",
+ cloneUrl: "https://github.com/owner/reponame.git"
+ },
+ sourceRepo: {
+ owner: "fork",
+ project: "reponame",
+ cloneUrl: "https://github.com/fork/reponame.git"
+ },
+ bpBranchName: undefined,
+ nCommits: 2,
+ commits: ["28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc"],
+ });
+ expect(configs.backportPullRequests.length).toEqual(1);
+ expect(configs.backportPullRequests[0]).toEqual({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-prod-28f63db",
+ base: "prod",
+ title: "New Title",
+ body: "New Body Prefix -New Body",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ labels: [],
+ comments: [],
+ });
+ });
+
+ test("override backport pr custom labels with duplicates", async () => {
+ const args: Args = {
+ dryRun: false,
+ auth: "",
+ pullRequest: mergedPRUrl,
+ targetBranch: "prod",
+ gitUser: "Me",
+ gitEmail: "me@email.com",
+ title: "New Title",
+ body: "New Body",
+ bodyPrefix: "New Body Prefix -",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ inheritReviewers: false,
+ labels: ["custom-label", "backport prod"], // also include the one inherited
+ inheritLabels: true,
+ };
+
+ const configs: Configs = await configParser.parseAndValidate(args);
+
+ expect(GitHubClient.prototype.getPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.getPullRequest).toBeCalledWith("owner", "reponame", 2368, undefined);
+ expect(GitHubMapper.prototype.mapPullRequest).toBeCalledTimes(1);
+ expect(GitHubMapper.prototype.mapPullRequest).toBeCalledWith(expect.anything(), []);
+
+ expect(configs.dryRun).toEqual(false);
+ expect(configs.git).toEqual({
+ user: "Me",
+ email: "me@email.com"
+ });
+ expect(configs.auth).toEqual("");
+ expect(configs.folder).toEqual(process.cwd() + "/bp");
+ expect(configs.originalPullRequest).toEqual({
+ number: 2368,
+ author: "gh-user",
+ url: "https://api.github.com/repos/owner/reponame/pulls/2368",
+ htmlUrl: "https://github.com/owner/reponame/pull/2368",
+ state: "closed",
+ merged: true,
+ mergedBy: "that-s-a-user",
+ title: "PR Title",
+ body: "Please review and merge",
+ reviewers: ["requested-gh-user", "gh-user"],
+ assignees: [],
+ labels: ["backport prod"],
+ targetRepo: {
+ owner: "owner",
+ project: "reponame",
+ cloneUrl: "https://github.com/owner/reponame.git"
+ },
+ sourceRepo: {
+ owner: "fork",
+ project: "reponame",
+ cloneUrl: "https://github.com/fork/reponame.git"
+ },
+ bpBranchName: undefined,
+ nCommits: 2,
+ commits: ["28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc"],
+ });
+ expect(configs.backportPullRequests.length).toEqual(1);
+ expect(configs.backportPullRequests[0]).toEqual({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-prod-28f63db",
+ base: "prod",
+ title: "New Title",
+ body: "New Body Prefix -New Body",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ labels: ["custom-label", "backport prod"],
+ comments: [],
+ });
+ });
+
+ test("using simple config file", async () => {
+ addProcessArgs([
+ "-cf",
+ GITHUB_MERGED_PR_SIMPLE_CONFIG_FILE_CONTENT_PATHNAME,
+ ]);
+
+ const args: Args = argsParser.parse();
+ const configs: Configs = await configParser.parseAndValidate(args);
+
+ expect(GitHubClient.prototype.getPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.getPullRequest).toBeCalledWith("owner", "reponame", 2368, true);
+ expect(GitHubMapper.prototype.mapPullRequest).toBeCalledTimes(1);
+ expect(GitHubMapper.prototype.mapPullRequest).toBeCalledWith(expect.anything(), []);
+
+ expect(configs.dryRun).toEqual(false);
+ expect(configs.git).toEqual({
+ user: "GitHub",
+ email: "noreply@github.com"
+ });
+ expect(configs.auth).toEqual(undefined);
+ expect(configs.folder).toEqual(process.cwd() + "/bp");
+ expect(configs.originalPullRequest).toEqual({
+ number: 2368,
+ author: "gh-user",
+ url: "https://api.github.com/repos/owner/reponame/pulls/2368",
+ htmlUrl: "https://github.com/owner/reponame/pull/2368",
+ state: "closed",
+ merged: true,
+ mergedBy: "that-s-a-user",
+ title: "PR Title",
+ body: "Please review and merge",
+ reviewers: ["requested-gh-user", "gh-user"],
+ assignees: [],
+ labels: ["backport prod"],
+ targetRepo: {
+ owner: "owner",
+ project: "reponame",
+ cloneUrl: "https://github.com/owner/reponame.git"
+ },
+ sourceRepo: {
+ owner: "fork",
+ project: "reponame",
+ cloneUrl: "https://github.com/fork/reponame.git"
+ },
+ nCommits: 2,
+ commits: ["28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc"]
+ });
+ expect(configs.backportPullRequests.length).toEqual(1);
+ expect(configs.backportPullRequests[0]).toEqual({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-prod-28f63db",
+ base: "prod",
+ title: "[prod] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ });
+ });
+
+ test("using complex config file", async () => {
+ addProcessArgs([
+ "-cf",
+ GITHUB_MERGED_PR_COMPLEX_CONFIG_FILE_CONTENT_PATHNAME,
+ ]);
+
+ const args: Args = argsParser.parse();
+ const configs: Configs = await configParser.parseAndValidate(args);
+
+ expect(GitHubClient.prototype.getPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.getPullRequest).toBeCalledWith("owner", "reponame", 2368, true);
+ expect(GitHubMapper.prototype.mapPullRequest).toBeCalledTimes(1);
+ expect(GitHubMapper.prototype.mapPullRequest).toBeCalledWith(expect.anything(), []);
+
+ expect(configs.dryRun).toEqual(false);
+ expect(configs.git).toEqual({
+ user: "Me",
+ email: "me@email.com"
+ });
+ expect(configs.auth).toEqual("my-auth-token");
+ expect(configs.folder).toEqual(process.cwd() + "/bp");
+ expect(configs.originalPullRequest).toEqual({
+ number: 2368,
+ author: "gh-user",
+ url: "https://api.github.com/repos/owner/reponame/pulls/2368",
+ htmlUrl: "https://github.com/owner/reponame/pull/2368",
+ state: "closed",
+ merged: true,
+ mergedBy: "that-s-a-user",
+ title: "PR Title",
+ body: "Please review and merge",
+ reviewers: ["requested-gh-user", "gh-user"],
+ assignees: [],
+ labels: ["backport prod"],
+ targetRepo: {
+ owner: "owner",
+ project: "reponame",
+ cloneUrl: "https://github.com/owner/reponame.git"
+ },
+ sourceRepo: {
+ owner: "fork",
+ project: "reponame",
+ cloneUrl: "https://github.com/fork/reponame.git"
+ },
+ bpBranchName: undefined,
+ nCommits: 2,
+ commits: ["28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc"],
+ });
+ expect(configs.backportPullRequests.length).toEqual(1);
+ expect(configs.backportPullRequests[0]).toEqual({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-prod-28f63db",
+ base: "prod",
+ title: "New Title",
+ body: "New Body Prefix -New Body",
+ reviewers: ["user1", "user2"],
+ assignees: ["user3", "user4"],
+ labels: ["cherry-pick :cherries:", "backport prod"],
+ comments: [],
+ });
+ });
+
+ test("parse configs from pull request without squashing with multiple commits", async () => {
+ const args: Args = {
+ dryRun: false,
+ auth: "",
+ pullRequest: multipleCommitsPRUrl,
+ targetBranch: "prod",
+ gitUser: "GitHub",
+ gitEmail: "noreply@github.com",
+ reviewers: [],
+ assignees: [],
+ inheritReviewers: true,
+ squash: false,
+ };
+
+ const configs: Configs = await configParser.parseAndValidate(args);
+
+ expect(GitHubClient.prototype.getPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.getPullRequest).toBeCalledWith("owner", "reponame", 8632, false);
+ expect(GitHubMapper.prototype.mapPullRequest).toBeCalledTimes(1);
+ expect(GitHubMapper.prototype.mapPullRequest).toBeCalledWith(expect.anything(), ["0404fb922ab75c3a8aecad5c97d9af388df04695", "11da4e38aa3e577ffde6d546f1c52e53b04d3151"]);
+
+ expect(configs.dryRun).toEqual(false);
+ expect(configs.git).toEqual({
+ user: "GitHub",
+ email: "noreply@github.com"
+ });
+ expect(configs.auth).toEqual("");
+ expect(configs.folder).toEqual(process.cwd() + "/bp");
+ expect(configs.originalPullRequest).toEqual({
+ number: 8632,
+ author: "gh-user",
+ url: "https://api.github.com/repos/owner/reponame/pulls/8632",
+ htmlUrl: "https://github.com/owner/reponame/pull/8632",
+ state: "closed",
+ merged: true,
+ mergedBy: "that-s-a-user",
+ title: "PR Title",
+ body: "Please review and merge",
+ reviewers: ["requested-gh-user", "gh-user"],
+ assignees: [],
+ labels: [
+ "backport v1",
+ "backport v2",
+ "backport v3",
+ ],
+ targetRepo: {
+ owner: "owner",
+ project: "reponame",
+ cloneUrl: "https://github.com/owner/reponame.git"
+ },
+ sourceRepo: {
+ owner: "owner",
+ project: "reponame",
+ cloneUrl: "https://github.com/owner/reponame.git"
+ },
+ nCommits: 2,
+ commits: ["0404fb922ab75c3a8aecad5c97d9af388df04695", "11da4e38aa3e577ffde6d546f1c52e53b04d3151"]
+ });
+ expect(configs.backportPullRequests.length).toEqual(1);
+ expect(configs.backportPullRequests[0]).toEqual({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-prod-0404fb9-11da4e3",
+ base: "prod",
+ title: "[prod] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/8632\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ });
+ });
+
+ test("override backport pr with additional comments", async () => {
+ const args: Args = {
+ dryRun: false,
+ auth: "",
+ pullRequest: mergedPRUrl,
+ targetBranch: "prod",
+ gitUser: "Me",
+ gitEmail: "me@email.com",
+ title: "New Title",
+ body: "New Body",
+ bodyPrefix: "New Body Prefix -",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ inheritReviewers: false,
+ labels: [],
+ inheritLabels: false,
+ comments: ["First comment", "Second comment"],
+ };
+
+ const configs: Configs = await configParser.parseAndValidate(args);
+
+ expect(GitHubClient.prototype.getPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.getPullRequest).toBeCalledWith("owner", "reponame", 2368, undefined);
+ expect(GitHubMapper.prototype.mapPullRequest).toBeCalledTimes(1);
+ expect(GitHubMapper.prototype.mapPullRequest).toBeCalledWith(expect.anything(), []);
+
+ expect(configs.dryRun).toEqual(false);
+ expect(configs.git).toEqual({
+ user: "Me",
+ email: "me@email.com"
+ });
+ expect(configs.auth).toEqual("");
+ expect(configs.folder).toEqual(process.cwd() + "/bp");
+ expect(configs.originalPullRequest).toEqual({
+ number: 2368,
+ author: "gh-user",
+ url: "https://api.github.com/repos/owner/reponame/pulls/2368",
+ htmlUrl: "https://github.com/owner/reponame/pull/2368",
+ state: "closed",
+ merged: true,
+ mergedBy: "that-s-a-user",
+ title: "PR Title",
+ body: "Please review and merge",
+ reviewers: ["requested-gh-user", "gh-user"],
+ assignees: [],
+ labels: ["backport prod"],
+ targetRepo: {
+ owner: "owner",
+ project: "reponame",
+ cloneUrl: "https://github.com/owner/reponame.git"
+ },
+ sourceRepo: {
+ owner: "fork",
+ project: "reponame",
+ cloneUrl: "https://github.com/fork/reponame.git"
+ },
+ bpBranchName: undefined,
+ nCommits: 2,
+ commits: ["28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc"],
+ });
+ expect(configs.backportPullRequests.length).toEqual(1);
+ expect(configs.backportPullRequests[0]).toEqual({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-prod-28f63db",
+ base: "prod",
+ title: "New Title",
+ body: "New Body Prefix -New Body",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ labels: [],
+ comments: ["First comment", "Second comment"],
+ });
+ });
+
+ test("no extracted target branches from pr labels due to wrong group name", async () => {
+ const args: Args = {
+ dryRun: false,
+ auth: "",
+ pullRequest: mergedPRUrl,
+ targetBranchPattern: "^backport (?([^ ]+))$",
+ gitUser: "Me",
+ gitEmail: "me@email.com",
+ title: "New Title",
+ body: "New Body",
+ bodyPrefix: "New Body Prefix -",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ inheritReviewers: false,
+ labels: [],
+ inheritLabels: false,
+ comments: ["First comment", "Second comment"],
+ };
+
+ await expect(() => configParser.parseAndValidate(args)).rejects.toThrow("Unable to extract target branches with regular expression");
+ });
+
+ test("extract target branches from pr labels", async () => {
+ const args: Args = {
+ dryRun: false,
+ auth: "",
+ pullRequest: mergedPRUrl,
+ targetBranchPattern: "^backport (?([^ ]+))$",
+ gitUser: "Me",
+ gitEmail: "me@email.com",
+ title: "New Title",
+ body: "New Body",
+ bodyPrefix: "New Body Prefix -",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ inheritReviewers: false,
+ labels: [],
+ inheritLabels: false,
+ comments: ["First comment", "Second comment"],
+ };
+
+ const configs: Configs = await configParser.parseAndValidate(args);
+
+ expect(GitHubClient.prototype.getPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.getPullRequest).toBeCalledWith("owner", "reponame", 2368, undefined);
+ expect(GitHubMapper.prototype.mapPullRequest).toBeCalledTimes(1);
+ expect(GitHubMapper.prototype.mapPullRequest).toBeCalledWith(expect.anything(), []);
+
+ expect(configs.dryRun).toEqual(false);
+ expect(configs.git).toEqual({
+ user: "Me",
+ email: "me@email.com"
+ });
+ expect(configs.auth).toEqual("");
+ expect(configs.folder).toEqual(process.cwd() + "/bp");
+ expect(configs.originalPullRequest).toEqual({
+ number: 2368,
+ author: "gh-user",
+ url: "https://api.github.com/repos/owner/reponame/pulls/2368",
+ htmlUrl: "https://github.com/owner/reponame/pull/2368",
+ state: "closed",
+ merged: true,
+ mergedBy: "that-s-a-user",
+ title: "PR Title",
+ body: "Please review and merge",
+ reviewers: ["requested-gh-user", "gh-user"],
+ assignees: [],
+ labels: ["backport prod"],
+ targetRepo: {
+ owner: "owner",
+ project: "reponame",
+ cloneUrl: "https://github.com/owner/reponame.git"
+ },
+ sourceRepo: {
+ owner: "fork",
+ project: "reponame",
+ cloneUrl: "https://github.com/fork/reponame.git"
+ },
+ bpBranchName: undefined,
+ nCommits: 2,
+ commits: ["28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc"],
+ });
+ expect(configs.backportPullRequests.length).toEqual(1);
+ expect(configs.backportPullRequests[0]).toEqual({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-prod-28f63db",
+ base: "prod",
+ title: "New Title",
+ body: "New Body Prefix -New Body",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ labels: [],
+ comments: ["First comment", "Second comment"],
+ });
+ });
+
+ test("enable error notification message", async () => {
+ const args: Args = {
+ dryRun: false,
+ auth: "",
+ pullRequest: mergedPRUrl,
+ targetBranch: "prod",
+ enableErrorNotification: true,
+ };
+
+ const configs: Configs = await configParser.parseAndValidate(args);
+
+ expect(GitHubClient.prototype.getPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.getPullRequest).toBeCalledWith("owner", "reponame", 2368, undefined);
+ expect(GitHubMapper.prototype.mapPullRequest).toBeCalledTimes(1);
+ expect(GitHubMapper.prototype.mapPullRequest).toBeCalledWith(expect.anything(), []);
+
+ expect(configs.errorNotification).toEqual({
+ "enabled": true,
+ "message": "The backport to `{{target-branch}}` failed. Check the latest run for more details."
+ });
+ });
+});
\ No newline at end of file
diff --git a/test/service/configs/pullrequest/gitlab-pr-configs-parser-multiple.test.ts b/test/service/configs/pullrequest/gitlab-pr-configs-parser-multiple.test.ts
new file mode 100644
index 0000000..140c343
--- /dev/null
+++ b/test/service/configs/pullrequest/gitlab-pr-configs-parser-multiple.test.ts
@@ -0,0 +1,353 @@
+import { Args } from "@bp/service/args/args.types";
+import { Configs } from "@bp/service/configs/configs.types";
+import PullRequestConfigsParser from "@bp/service/configs/pullrequest/pr-configs-parser";
+import GitClientFactory from "@bp/service/git/git-client-factory";
+import { GitClientType } from "@bp/service/git/git.types";
+import { getAxiosMocked } from "../../../support/mock/git-client-mock-support";
+import { MERGED_SQUASHED_MR } from "../../../support/mock/gitlab-data";
+import GitLabClient from "@bp/service/git/gitlab/gitlab-client";
+import GitLabMapper from "@bp/service/git/gitlab/gitlab-mapper";
+
+jest.spyOn(GitLabMapper.prototype, "mapPullRequest");
+jest.spyOn(GitLabClient.prototype, "getPullRequest");
+
+jest.mock("axios", () => {
+ return {
+ create: jest.fn(() => ({
+ get: getAxiosMocked,
+ })),
+ };
+});
+
+describe("gitlab merge request config parser", () => {
+
+ const mergedPRUrl = `https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/${MERGED_SQUASHED_MR.iid}`;
+
+ let configParser: PullRequestConfigsParser;
+
+ beforeAll(() => {
+ GitClientFactory.reset();
+ GitClientFactory.getOrCreate(GitClientType.GITLAB, "whatever", "my.gitlab.host.com");
+ });
+
+ beforeEach(() => {
+ configParser = new PullRequestConfigsParser();
+ });
+
+ test("multiple backports", async () => {
+ const args: Args = {
+ dryRun: false,
+ auth: "",
+ pullRequest: mergedPRUrl,
+ targetBranch: "v1, v2, v3",
+ gitUser: "Me",
+ gitEmail: "me@email.com",
+ title: "New Title",
+ body: "New Body",
+ bodyPrefix: "New Body Prefix -",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ inheritReviewers: false,
+ labels: [],
+ inheritLabels: false,
+ comments: [],
+ squash: true,
+ };
+
+ const configs: Configs = await configParser.parseAndValidate(args);
+
+ expect(GitLabClient.prototype.getPullRequest).toBeCalledTimes(1);
+ expect(GitLabClient.prototype.getPullRequest).toBeCalledWith("superuser", "backporting-example", 1, true);
+ expect(GitLabMapper.prototype.mapPullRequest).toBeCalledTimes(1);
+ expect(GitLabMapper.prototype.mapPullRequest).toBeCalledWith(expect.anything(), []);
+
+ expect(configs.dryRun).toEqual(false);
+ expect(configs.auth).toEqual("");
+ expect(configs.folder).toEqual(process.cwd() + "/bp");
+ expect(configs.backportPullRequests.length).toEqual(3);
+ expect(configs.backportPullRequests).toEqual(
+ expect.arrayContaining([
+ {
+ owner: "superuser",
+ repo: "backporting-example",
+ head: "bp-v1-ebb1eca",
+ base: "v1",
+ title: "New Title",
+ body: "New Body Prefix -New Body",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ labels: [],
+ comments: [],
+ },
+ {
+ owner: "superuser",
+ repo: "backporting-example",
+ head: "bp-v2-ebb1eca",
+ base: "v2",
+ title: "New Title",
+ body: "New Body Prefix -New Body",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ labels: [],
+ comments: [],
+ },
+ {
+ owner: "superuser",
+ repo: "backporting-example",
+ head: "bp-v3-ebb1eca",
+ base: "v3",
+ title: "New Title",
+ body: "New Body Prefix -New Body",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ labels: [],
+ comments: [],
+ }
+ ])
+ );
+ });
+
+ test("multiple backports ignore duplicates", async () => {
+ const args: Args = {
+ dryRun: false,
+ auth: "",
+ pullRequest: mergedPRUrl,
+ targetBranch: "v1, v2, v3, v1",
+ gitUser: "Me",
+ gitEmail: "me@email.com",
+ title: "New Title",
+ body: "New Body",
+ bodyPrefix: "New Body Prefix -",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ inheritReviewers: false,
+ labels: [],
+ inheritLabels: false,
+ comments: [],
+ squash: true,
+ };
+
+ const configs: Configs = await configParser.parseAndValidate(args);
+
+ expect(GitLabClient.prototype.getPullRequest).toBeCalledTimes(1);
+ expect(GitLabClient.prototype.getPullRequest).toBeCalledWith("superuser", "backporting-example", 1, true);
+ expect(GitLabMapper.prototype.mapPullRequest).toBeCalledTimes(1);
+ expect(GitLabMapper.prototype.mapPullRequest).toBeCalledWith(expect.anything(), []);
+
+ expect(configs.dryRun).toEqual(false);
+ expect(configs.auth).toEqual("");
+ expect(configs.folder).toEqual(process.cwd() + "/bp");
+ expect(configs.backportPullRequests.length).toEqual(3);
+ expect(configs.backportPullRequests).toEqual(
+ expect.arrayContaining([
+ {
+ owner: "superuser",
+ repo: "backporting-example",
+ head: "bp-v1-ebb1eca",
+ base: "v1",
+ title: "New Title",
+ body: "New Body Prefix -New Body",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ labels: [],
+ comments: [],
+ },
+ {
+ owner: "superuser",
+ repo: "backporting-example",
+ head: "bp-v2-ebb1eca",
+ base: "v2",
+ title: "New Title",
+ body: "New Body Prefix -New Body",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ labels: [],
+ comments: [],
+ },
+ {
+ owner: "superuser",
+ repo: "backporting-example",
+ head: "bp-v3-ebb1eca",
+ base: "v3",
+ title: "New Title",
+ body: "New Body Prefix -New Body",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ labels: [],
+ comments: [],
+ }
+ ])
+ );
+ });
+
+ test("multiple backports with custom branch name", async () => {
+ const args: Args = {
+ dryRun: false,
+ auth: "",
+ pullRequest: mergedPRUrl,
+ targetBranch: "v1, v2, v3",
+ gitUser: "Me",
+ gitEmail: "me@email.com",
+ title: "New Title",
+ body: "New Body",
+ bodyPrefix: "New Body Prefix -",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ inheritReviewers: false,
+ labels: [],
+ inheritLabels: false,
+ comments: [],
+ bpBranchName: "custom-branch",
+ squash: true,
+ };
+
+ const configs: Configs = await configParser.parseAndValidate(args);
+
+ expect(GitLabClient.prototype.getPullRequest).toBeCalledTimes(1);
+ expect(GitLabClient.prototype.getPullRequest).toBeCalledWith("superuser", "backporting-example", 1, true);
+ expect(GitLabMapper.prototype.mapPullRequest).toBeCalledTimes(1);
+ expect(GitLabMapper.prototype.mapPullRequest).toBeCalledWith(expect.anything(), []);
+
+ expect(configs.dryRun).toEqual(false);
+ expect(configs.auth).toEqual("");
+ expect(configs.folder).toEqual(process.cwd() + "/bp");
+ expect(configs.backportPullRequests.length).toEqual(3);
+ expect(configs.backportPullRequests).toEqual(
+ expect.arrayContaining([
+ {
+ owner: "superuser",
+ repo: "backporting-example",
+ head: "custom-branch-v1",
+ base: "v1",
+ title: "New Title",
+ body: "New Body Prefix -New Body",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ labels: [],
+ comments: [],
+ },
+ {
+ owner: "superuser",
+ repo: "backporting-example",
+ head: "custom-branch-v2",
+ base: "v2",
+ title: "New Title",
+ body: "New Body Prefix -New Body",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ labels: [],
+ comments: [],
+ },
+ {
+ owner: "superuser",
+ repo: "backporting-example",
+ head: "custom-branch-v3",
+ base: "v3",
+ title: "New Title",
+ body: "New Body Prefix -New Body",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ labels: [],
+ comments: [],
+ }
+ ])
+ );
+ });
+
+ test("multiple backports with multiple custom branch names", async () => {
+ const args: Args = {
+ dryRun: false,
+ auth: "",
+ pullRequest: mergedPRUrl,
+ targetBranch: "v1, v2, v3",
+ gitUser: "Me",
+ gitEmail: "me@email.com",
+ title: "New Title",
+ body: "New Body",
+ bodyPrefix: "New Body Prefix -",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ inheritReviewers: false,
+ labels: [],
+ inheritLabels: false,
+ comments: [],
+ bpBranchName: "custom1, custom2, custom3",
+ squash: true,
+ };
+
+ const configs: Configs = await configParser.parseAndValidate(args);
+
+ expect(GitLabClient.prototype.getPullRequest).toBeCalledTimes(1);
+ expect(GitLabClient.prototype.getPullRequest).toBeCalledWith("superuser", "backporting-example", 1, true);
+ expect(GitLabMapper.prototype.mapPullRequest).toBeCalledTimes(1);
+ expect(GitLabMapper.prototype.mapPullRequest).toBeCalledWith(expect.anything(), []);
+
+ expect(configs.dryRun).toEqual(false);
+ expect(configs.auth).toEqual("");
+ expect(configs.folder).toEqual(process.cwd() + "/bp");
+ expect(configs.backportPullRequests.length).toEqual(3);
+ expect(configs.backportPullRequests).toEqual(
+ expect.arrayContaining([
+ {
+ owner: "superuser",
+ repo: "backporting-example",
+ head: "custom1",
+ base: "v1",
+ title: "New Title",
+ body: "New Body Prefix -New Body",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ labels: [],
+ comments: [],
+ },
+ {
+ owner: "superuser",
+ repo: "backporting-example",
+ head: "custom2",
+ base: "v2",
+ title: "New Title",
+ body: "New Body Prefix -New Body",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ labels: [],
+ comments: [],
+ },
+ {
+ owner: "superuser",
+ repo: "backporting-example",
+ head: "custom3",
+ base: "v3",
+ title: "New Title",
+ body: "New Body Prefix -New Body",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ labels: [],
+ comments: [],
+ }
+ ])
+ );
+ });
+
+ test("multiple backports with incorrect number of bp branch names", async () => {
+ const args: Args = {
+ dryRun: false,
+ auth: "",
+ pullRequest: mergedPRUrl,
+ targetBranch: "v1, v2, v3",
+ gitUser: "Me",
+ gitEmail: "me@email.com",
+ title: "New Title",
+ body: "New Body",
+ bodyPrefix: "New Body Prefix -",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ inheritReviewers: false,
+ labels: [],
+ inheritLabels: false,
+ comments: [],
+ bpBranchName: "custom-branch1, custom-branch2, custom-branch2, custom-branch3, custom-branch4",
+ };
+
+ await expect(() => configParser.parseAndValidate(args)).rejects.toThrow("The number of backport branch names, if provided, must match the number of target branches or just one, provided 4 branch names instead");
+ });
+});
\ No newline at end of file
diff --git a/test/service/configs/pullrequest/gitlab-pr-configs-parser.test.ts b/test/service/configs/pullrequest/gitlab-pr-configs-parser.test.ts
new file mode 100644
index 0000000..bbaaf98
--- /dev/null
+++ b/test/service/configs/pullrequest/gitlab-pr-configs-parser.test.ts
@@ -0,0 +1,911 @@
+import { Args } from "@bp/service/args/args.types";
+import { Configs } from "@bp/service/configs/configs.types";
+import PullRequestConfigsParser from "@bp/service/configs/pullrequest/pr-configs-parser";
+import GitClientFactory from "@bp/service/git/git-client-factory";
+import { GitClientType } from "@bp/service/git/git.types";
+import { getAxiosMocked } from "../../../support/mock/git-client-mock-support";
+import { CLOSED_NOT_MERGED_MR, MERGED_SQUASHED_MR, OPEN_MR } from "../../../support/mock/gitlab-data";
+import GHAArgsParser from "@bp/service/args/gha/gha-args-parser";
+import { createTestFile, removeTestFile, resetEnvTokens, spyGetInput } from "../../../support/utils";
+import GitLabClient from "@bp/service/git/gitlab/gitlab-client";
+import GitLabMapper from "@bp/service/git/gitlab/gitlab-mapper";
+
+const GITLAB_MERGED_PR_SIMPLE_CONFIG_FILE_CONTENT_PATHNAME = "./gitlab-pr-configs-parser-simple-pr-merged.json";
+const GITLAB_MERGED_PR_SIMPLE_CONFIG_FILE_CONTENT = {
+ "targetBranch": "prod",
+ "pullRequest": `https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/${MERGED_SQUASHED_MR.iid}`,
+};
+
+const GITLAB_MERGED_PR_COMPLEX_CONFIG_FILE_CONTENT_PATHNAME = "./gitlab-pr-configs-parser-complex-pr-merged.json";
+const GITLAB_MERGED_PR_COMPLEX_CONFIG_FILE_CONTENT = {
+ "dryRun": false,
+ "auth": "my-token",
+ "pullRequest": `https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/${MERGED_SQUASHED_MR.iid}`,
+ "targetBranch": "prod",
+ "gitUser": "Me",
+ "gitEmail": "me@email.com",
+ "title": "New Title",
+ "body": "New Body",
+ "bodyPrefix": "New Body Prefix -",
+ "reviewers": [],
+ "assignees": ["user3", "user4"],
+ "inheritReviewers": false,
+ "labels": ["cherry-pick :cherries:"],
+ "inheritLabels": true,
+};
+
+jest.spyOn(GitLabMapper.prototype, "mapPullRequest");
+jest.spyOn(GitLabClient.prototype, "getPullRequest");
+
+jest.mock("axios", () => {
+ return {
+ create: jest.fn(() => ({
+ get: getAxiosMocked,
+ })),
+ };
+});
+
+describe("gitlab merge request config parser", () => {
+
+ const mergedPRUrl = `https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/${MERGED_SQUASHED_MR.iid}`;
+ const openPRUrl = `https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/${OPEN_MR.iid}`;
+ const notMergedPRUrl = `https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/${CLOSED_NOT_MERGED_MR.iid}`;
+
+ let argsParser: GHAArgsParser;
+ let configParser: PullRequestConfigsParser;
+
+ beforeAll(() => {
+ // create a temporary file
+ createTestFile(GITLAB_MERGED_PR_SIMPLE_CONFIG_FILE_CONTENT_PATHNAME, JSON.stringify(GITLAB_MERGED_PR_SIMPLE_CONFIG_FILE_CONTENT));
+ createTestFile(GITLAB_MERGED_PR_COMPLEX_CONFIG_FILE_CONTENT_PATHNAME, JSON.stringify(GITLAB_MERGED_PR_COMPLEX_CONFIG_FILE_CONTENT));
+
+ GitClientFactory.reset();
+ GitClientFactory.getOrCreate(GitClientType.GITLAB, "whatever", "my.gitlab.host.com");
+ });
+
+ afterAll(() => {
+ // clean up all temporary files
+ removeTestFile(GITLAB_MERGED_PR_SIMPLE_CONFIG_FILE_CONTENT_PATHNAME);
+ removeTestFile(GITLAB_MERGED_PR_COMPLEX_CONFIG_FILE_CONTENT_PATHNAME);
+ });
+
+ beforeEach(() => {
+ // reset env tokens
+ resetEnvTokens();
+
+ argsParser = new GHAArgsParser();
+ configParser = new PullRequestConfigsParser();
+ });
+
+ test("parse configs from merge request", async () => {
+ const args: Args = {
+ dryRun: false,
+ auth: undefined,
+ pullRequest: mergedPRUrl,
+ targetBranch: "prod",
+ gitUser: "Gitlab",
+ gitEmail: "noreply@gitlab.com",
+ reviewers: [],
+ assignees: [],
+ inheritReviewers: true,
+ squash: true,
+ };
+
+ const configs: Configs = await configParser.parseAndValidate(args);
+
+ expect(GitLabClient.prototype.getPullRequest).toBeCalledTimes(1);
+ expect(GitLabClient.prototype.getPullRequest).toBeCalledWith("superuser", "backporting-example", 1, true);
+ expect(GitLabMapper.prototype.mapPullRequest).toBeCalledTimes(1);
+ expect(GitLabMapper.prototype.mapPullRequest).toBeCalledWith(expect.anything(), []);
+
+ expect(configs.dryRun).toEqual(false);
+ expect(configs.git).toEqual({
+ user: "Gitlab",
+ email: "noreply@gitlab.com"
+ });
+ expect(configs.auth).toEqual(undefined);
+ expect(configs.folder).toEqual(process.cwd() + "/bp");
+ expect(configs.originalPullRequest).toEqual({
+ number: 1,
+ author: "superuser",
+ url: "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/1",
+ htmlUrl: "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/1",
+ state: "merged",
+ merged: true,
+ mergedBy: "superuser",
+ title: "Update test.txt",
+ body: "This is the body",
+ reviewers: ["superuser1", "superuser2"],
+ assignees: ["superuser"],
+ labels: ["backport-prod"],
+ targetRepo: {
+ owner: "superuser",
+ project: "backporting-example",
+ cloneUrl: "https://my.gitlab.host.com/superuser/backporting-example.git"
+ },
+ sourceRepo: {
+ owner: "superuser",
+ project: "backporting-example",
+ cloneUrl: "https://my.gitlab.host.com/superuser/backporting-example.git"
+ },
+ nCommits: 1,
+ commits: ["ebb1eca696c42fd067658bd9b5267709f78ef38e"]
+ });
+ expect(configs.backportPullRequests.length).toEqual(1);
+ expect(configs.backportPullRequests[0]).toEqual({
+ owner: "superuser",
+ repo: "backporting-example",
+ head: "bp-prod-ebb1eca",
+ base: "prod",
+ title: "[prod] Update test.txt",
+ body: "**Backport:** https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/1\r\n\r\nThis is the body",
+ reviewers: ["superuser"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ });
+ expect(configs.errorNotification).toEqual({
+ "enabled": false,
+ "message": "The backport to `{{target-branch}}` failed. Check the latest run for more details."
+ });
+ });
+
+
+ test("override folder", async () => {
+ const args: Args = {
+ dryRun: true,
+ auth: "whatever",
+ pullRequest: mergedPRUrl,
+ targetBranch: "prod",
+ folder: "/tmp/test",
+ gitUser: "Gitlab",
+ gitEmail: "noreply@gitlab.com",
+ reviewers: [],
+ assignees: [],
+ inheritReviewers: true,
+ squash: true,
+ };
+
+ const configs: Configs = await configParser.parseAndValidate(args);
+
+ expect(GitLabClient.prototype.getPullRequest).toBeCalledTimes(1);
+ expect(GitLabClient.prototype.getPullRequest).toBeCalledWith("superuser", "backporting-example", 1, true);
+ expect(GitLabMapper.prototype.mapPullRequest).toBeCalledTimes(1);
+ expect(GitLabMapper.prototype.mapPullRequest).toBeCalledWith(expect.anything(), []);
+
+ expect(configs.dryRun).toEqual(true);
+ expect(configs.auth).toEqual("whatever");
+ expect(configs.folder).toEqual("/tmp/test");
+ expect(configs.git).toEqual({
+ user: "Gitlab",
+ email: "noreply@gitlab.com"
+ });
+ });
+
+ test("still open pull request", async () => {
+ const args: Args = {
+ dryRun: true,
+ auth: "whatever",
+ pullRequest: openPRUrl,
+ targetBranch: "prod",
+ gitUser: "Gitlab",
+ gitEmail: "noreply@gitlab.com",
+ reviewers: [],
+ assignees: [],
+ inheritReviewers: true,
+ squash: true,
+ };
+
+ const configs: Configs = await configParser.parseAndValidate(args);
+
+ expect(GitLabClient.prototype.getPullRequest).toBeCalledTimes(1);
+ expect(GitLabClient.prototype.getPullRequest).toBeCalledWith("superuser", "backporting-example", 2, true);
+ expect(GitLabMapper.prototype.mapPullRequest).toBeCalledTimes(1);
+ expect(GitLabMapper.prototype.mapPullRequest).toBeCalledWith(expect.anything(), []);
+
+ expect(configs.dryRun).toEqual(true);
+ expect(configs.auth).toEqual("whatever");
+ expect(configs.git).toEqual({
+ user: "Gitlab",
+ email: "noreply@gitlab.com"
+ });
+ expect(configs.originalPullRequest).toEqual({
+ number: 2,
+ author: "superuser",
+ url: "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/2",
+ htmlUrl: "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/2",
+ state: "open",
+ merged: false,
+ mergedBy: undefined,
+ title: "Update test.txt opened",
+ body: "Still opened mr body",
+ reviewers: ["superuser"],
+ assignees: ["superuser"],
+ labels: [],
+ targetRepo: {
+ owner: "superuser",
+ project: "backporting-example",
+ cloneUrl: "https://my.gitlab.host.com/superuser/backporting-example.git"
+ },
+ sourceRepo: {
+ owner: "superuser",
+ project: "backporting-example",
+ cloneUrl: "https://my.gitlab.host.com/superuser/backporting-example.git"
+ },
+ bpBranchName: undefined,
+ nCommits: 1,
+ // taken from mr.sha
+ commits: ["9e15674ebd48e05c6e428a1fa31dbb60a778d644"]
+ });
+ });
+
+ test("closed pull request", async () => {
+ const args: Args = {
+ dryRun: true,
+ auth: "whatever",
+ pullRequest: notMergedPRUrl,
+ targetBranch: "prod",
+ gitUser: "Gitlab",
+ gitEmail: "noreply@gitlab.com",
+ reviewers: [],
+ assignees: [],
+ inheritReviewers: true,
+ squash: true,
+ };
+
+ await expect(() => configParser.parseAndValidate(args)).rejects.toThrow("Provided pull request is closed and not merged");
+ });
+
+ test("override backport pr data inheriting reviewers", async () => {
+ const args: Args = {
+ dryRun: false,
+ auth: "",
+ pullRequest: mergedPRUrl,
+ targetBranch: "prod",
+ gitUser: "Me",
+ gitEmail: "me@email.com",
+ title: "New Title",
+ body: "New Body",
+ bodyPrefix: "New Body Prefix -",
+ reviewers: [],
+ assignees: [],
+ inheritReviewers: true,
+ squash: true,
+ };
+
+ const configs: Configs = await configParser.parseAndValidate(args);
+
+ expect(GitLabClient.prototype.getPullRequest).toBeCalledTimes(1);
+ expect(GitLabClient.prototype.getPullRequest).toBeCalledWith("superuser", "backporting-example", 1, true);
+ expect(GitLabMapper.prototype.mapPullRequest).toBeCalledTimes(1);
+ expect(GitLabMapper.prototype.mapPullRequest).toBeCalledWith(expect.anything(), []);
+
+ expect(configs.dryRun).toEqual(false);
+ expect(configs.git).toEqual({
+ user: "Me",
+ email: "me@email.com"
+ });
+ expect(configs.auth).toEqual("");
+ expect(configs.folder).toEqual(process.cwd() + "/bp");
+ expect(configs.originalPullRequest).toEqual({
+ number: 1,
+ author: "superuser",
+ url: "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/1",
+ htmlUrl: "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/1",
+ state: "merged",
+ merged: true,
+ mergedBy: "superuser",
+ title: "Update test.txt",
+ body: "This is the body",
+ reviewers: ["superuser1", "superuser2"],
+ assignees: ["superuser"],
+ labels: ["backport-prod"],
+ targetRepo: {
+ owner: "superuser",
+ project: "backporting-example",
+ cloneUrl: "https://my.gitlab.host.com/superuser/backporting-example.git"
+ },
+ sourceRepo: {
+ owner: "superuser",
+ project: "backporting-example",
+ cloneUrl: "https://my.gitlab.host.com/superuser/backporting-example.git"
+ },
+ nCommits: 1,
+ commits: ["ebb1eca696c42fd067658bd9b5267709f78ef38e"]
+ });
+ expect(configs.backportPullRequests.length).toEqual(1);
+ expect(configs.backportPullRequests[0]).toEqual({
+ owner: "superuser",
+ repo: "backporting-example",
+ head: "bp-prod-ebb1eca",
+ base: "prod",
+ title: "New Title",
+ body: "New Body Prefix -New Body",
+ reviewers: ["superuser"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ });
+ });
+
+ test("override backport pr reviewers and assignees", async () => {
+ const args: Args = {
+ dryRun: false,
+ auth: "",
+ pullRequest: mergedPRUrl,
+ targetBranch: "prod",
+ gitUser: "Me",
+ gitEmail: "me@email.com",
+ title: "New Title",
+ body: "New Body",
+ bodyPrefix: "New Body Prefix -",
+ reviewers: ["user1", "user2"],
+ assignees: ["user3", "user4"],
+ inheritReviewers: true, // not taken into account
+ squash: true,
+ };
+
+ const configs: Configs = await configParser.parseAndValidate(args);
+
+ expect(GitLabClient.prototype.getPullRequest).toBeCalledTimes(1);
+ expect(GitLabClient.prototype.getPullRequest).toBeCalledWith("superuser", "backporting-example", 1, true);
+ expect(GitLabMapper.prototype.mapPullRequest).toBeCalledTimes(1);
+ expect(GitLabMapper.prototype.mapPullRequest).toBeCalledWith(expect.anything(), []);
+
+ expect(configs.dryRun).toEqual(false);
+ expect(configs.git).toEqual({
+ user: "Me",
+ email: "me@email.com"
+ });
+ expect(configs.auth).toEqual("");
+ expect(configs.folder).toEqual(process.cwd() + "/bp");
+ expect(configs.originalPullRequest).toEqual({
+ number: 1,
+ author: "superuser",
+ url: "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/1",
+ htmlUrl: "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/1",
+ state: "merged",
+ merged: true,
+ mergedBy: "superuser",
+ title: "Update test.txt",
+ body: "This is the body",
+ reviewers: ["superuser1", "superuser2"],
+ assignees: ["superuser"],
+ labels: ["backport-prod"],
+ targetRepo: {
+ owner: "superuser",
+ project: "backporting-example",
+ cloneUrl: "https://my.gitlab.host.com/superuser/backporting-example.git"
+ },
+ sourceRepo: {
+ owner: "superuser",
+ project: "backporting-example",
+ cloneUrl: "https://my.gitlab.host.com/superuser/backporting-example.git"
+ },
+ nCommits: 1,
+ commits: ["ebb1eca696c42fd067658bd9b5267709f78ef38e"]
+ });
+ expect(configs.backportPullRequests.length).toEqual(1);
+ expect(configs.backportPullRequests[0]).toEqual({
+ owner: "superuser",
+ repo: "backporting-example",
+ head: "bp-prod-ebb1eca",
+ base: "prod",
+ title: "New Title",
+ body: "New Body Prefix -New Body",
+ reviewers: ["user1", "user2"],
+ assignees: ["user3", "user4"],
+ labels: [],
+ comments: [],
+ });
+ });
+
+ test("override backport pr empty reviewers", async () => {
+ const args: Args = {
+ dryRun: false,
+ auth: "",
+ pullRequest: mergedPRUrl,
+ targetBranch: "prod",
+ gitUser: "Me",
+ gitEmail: "me@email.com",
+ title: "New Title",
+ body: "New Body",
+ bodyPrefix: "New Body Prefix -",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ inheritReviewers: false,
+ squash: true,
+ };
+
+ const configs: Configs = await configParser.parseAndValidate(args);
+
+ expect(GitLabClient.prototype.getPullRequest).toBeCalledTimes(1);
+ expect(GitLabClient.prototype.getPullRequest).toBeCalledWith("superuser", "backporting-example", 1, true);
+ expect(GitLabMapper.prototype.mapPullRequest).toBeCalledTimes(1);
+ expect(GitLabMapper.prototype.mapPullRequest).toBeCalledWith(expect.anything(), []);
+
+ expect(configs.dryRun).toEqual(false);
+ expect(configs.git).toEqual({
+ user: "Me",
+ email: "me@email.com"
+ });
+ expect(configs.auth).toEqual("");
+ expect(configs.folder).toEqual(process.cwd() + "/bp");
+ expect(configs.originalPullRequest).toEqual({
+ number: 1,
+ author: "superuser",
+ url: "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/1",
+ htmlUrl: "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/1",
+ state: "merged",
+ merged: true,
+ mergedBy: "superuser",
+ title: "Update test.txt",
+ body: "This is the body",
+ reviewers: ["superuser1", "superuser2"],
+ assignees: ["superuser"],
+ labels: ["backport-prod"],
+ targetRepo: {
+ owner: "superuser",
+ project: "backporting-example",
+ cloneUrl: "https://my.gitlab.host.com/superuser/backporting-example.git"
+ },
+ sourceRepo: {
+ owner: "superuser",
+ project: "backporting-example",
+ cloneUrl: "https://my.gitlab.host.com/superuser/backporting-example.git"
+ },
+ nCommits: 1,
+ commits: ["ebb1eca696c42fd067658bd9b5267709f78ef38e"]
+ });
+ expect(configs.backportPullRequests.length).toEqual(1);
+ expect(configs.backportPullRequests[0]).toEqual({
+ owner: "superuser",
+ repo: "backporting-example",
+ head: "bp-prod-ebb1eca",
+ base: "prod",
+ title: "New Title",
+ body: "New Body Prefix -New Body",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ labels: [],
+ comments: [],
+ });
+ });
+
+ test("override backport pr custom labels with duplicates", async () => {
+ const args: Args = {
+ dryRun: false,
+ auth: "",
+ pullRequest: mergedPRUrl,
+ targetBranch: "prod",
+ gitUser: "Me",
+ gitEmail: "me@email.com",
+ title: "New Title",
+ body: "New Body",
+ bodyPrefix: "New Body Prefix -",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ inheritReviewers: false,
+ labels: ["custom-label", "backport-prod"], // also include the one inherited
+ inheritLabels: true,
+ squash: true,
+ };
+
+ const configs: Configs = await configParser.parseAndValidate(args);
+
+ expect(GitLabClient.prototype.getPullRequest).toBeCalledTimes(1);
+ expect(GitLabClient.prototype.getPullRequest).toBeCalledWith("superuser", "backporting-example", 1, true);
+ expect(GitLabMapper.prototype.mapPullRequest).toBeCalledTimes(1);
+ expect(GitLabMapper.prototype.mapPullRequest).toBeCalledWith(expect.anything(), []);
+
+ expect(configs.dryRun).toEqual(false);
+ expect(configs.git).toEqual({
+ user: "Me",
+ email: "me@email.com"
+ });
+ expect(configs.auth).toEqual("");
+ expect(configs.folder).toEqual(process.cwd() + "/bp");
+ expect(configs.originalPullRequest).toEqual({
+ number: 1,
+ author: "superuser",
+ url: "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/1",
+ htmlUrl: "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/1",
+ state: "merged",
+ merged: true,
+ mergedBy: "superuser",
+ title: "Update test.txt",
+ body: "This is the body",
+ reviewers: ["superuser1", "superuser2"],
+ assignees: ["superuser"],
+ labels: ["backport-prod"],
+ targetRepo: {
+ owner: "superuser",
+ project: "backporting-example",
+ cloneUrl: "https://my.gitlab.host.com/superuser/backporting-example.git"
+ },
+ sourceRepo: {
+ owner: "superuser",
+ project: "backporting-example",
+ cloneUrl: "https://my.gitlab.host.com/superuser/backporting-example.git"
+ },
+ nCommits: 1,
+ commits: ["ebb1eca696c42fd067658bd9b5267709f78ef38e"]
+ });
+ expect(configs.backportPullRequests.length).toEqual(1);
+ expect(configs.backportPullRequests[0]).toEqual({
+ owner: "superuser",
+ repo: "backporting-example",
+ head: "bp-prod-ebb1eca",
+ base: "prod",
+ title: "New Title",
+ body: "New Body Prefix -New Body",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ labels: ["custom-label", "backport-prod"],
+ comments: [],
+ });
+ });
+
+ test("using simple config file", async () => {
+ spyGetInput({
+ "config-file": GITLAB_MERGED_PR_SIMPLE_CONFIG_FILE_CONTENT_PATHNAME,
+ });
+
+ const args: Args = argsParser.parse();
+ const configs: Configs = await configParser.parseAndValidate(args);
+
+ expect(GitLabClient.prototype.getPullRequest).toBeCalledTimes(1);
+ expect(GitLabClient.prototype.getPullRequest).toBeCalledWith("superuser", "backporting-example", 1, true);
+ expect(GitLabMapper.prototype.mapPullRequest).toBeCalledTimes(1);
+ expect(GitLabMapper.prototype.mapPullRequest).toBeCalledWith(expect.anything(), []);
+
+ expect(configs.dryRun).toEqual(false);
+ expect(configs.git).toEqual({
+ user: "Gitlab",
+ email: "noreply@gitlab.com"
+ });
+ expect(configs.auth).toEqual(undefined);
+ expect(configs.folder).toEqual(process.cwd() + "/bp");
+ expect(configs.originalPullRequest).toEqual({
+ number: 1,
+ author: "superuser",
+ url: "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/1",
+ htmlUrl: "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/1",
+ state: "merged",
+ merged: true,
+ mergedBy: "superuser",
+ title: "Update test.txt",
+ body: "This is the body",
+ reviewers: ["superuser1", "superuser2"],
+ assignees: ["superuser"],
+ labels: ["backport-prod"],
+ targetRepo: {
+ owner: "superuser",
+ project: "backporting-example",
+ cloneUrl: "https://my.gitlab.host.com/superuser/backporting-example.git"
+ },
+ sourceRepo: {
+ owner: "superuser",
+ project: "backporting-example",
+ cloneUrl: "https://my.gitlab.host.com/superuser/backporting-example.git"
+ },
+ nCommits: 1,
+ commits: ["ebb1eca696c42fd067658bd9b5267709f78ef38e"]
+ });
+ expect(configs.backportPullRequests.length).toEqual(1);
+ expect(configs.backportPullRequests[0]).toEqual({
+ owner: "superuser",
+ repo: "backporting-example",
+ head: "bp-prod-ebb1eca",
+ base: "prod",
+ title: "[prod] Update test.txt",
+ body: "**Backport:** https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/1\r\n\r\nThis is the body",
+ reviewers: ["superuser"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ });
+ });
+
+ test("using complex config file", async () => {
+ spyGetInput({
+ "config-file": GITLAB_MERGED_PR_COMPLEX_CONFIG_FILE_CONTENT_PATHNAME,
+ });
+
+ const args: Args = argsParser.parse();
+ const configs: Configs = await configParser.parseAndValidate(args);
+
+ expect(GitLabClient.prototype.getPullRequest).toBeCalledTimes(1);
+ expect(GitLabClient.prototype.getPullRequest).toBeCalledWith("superuser", "backporting-example", 1, true);
+ expect(GitLabMapper.prototype.mapPullRequest).toBeCalledTimes(1);
+ expect(GitLabMapper.prototype.mapPullRequest).toBeCalledWith(expect.anything(), []);
+
+ expect(configs.dryRun).toEqual(false);
+ expect(configs.git).toEqual({
+ user: "Me",
+ email: "me@email.com"
+ });
+ expect(configs.auth).toEqual("my-token");
+ expect(configs.folder).toEqual(process.cwd() + "/bp");
+ expect(configs.originalPullRequest).toEqual({
+ number: 1,
+ author: "superuser",
+ url: "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/1",
+ htmlUrl: "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/1",
+ state: "merged",
+ merged: true,
+ mergedBy: "superuser",
+ title: "Update test.txt",
+ body: "This is the body",
+ reviewers: ["superuser1", "superuser2"],
+ assignees: ["superuser"],
+ labels: ["backport-prod"],
+ targetRepo: {
+ owner: "superuser",
+ project: "backporting-example",
+ cloneUrl: "https://my.gitlab.host.com/superuser/backporting-example.git"
+ },
+ sourceRepo: {
+ owner: "superuser",
+ project: "backporting-example",
+ cloneUrl: "https://my.gitlab.host.com/superuser/backporting-example.git"
+ },
+ nCommits: 1,
+ commits: ["ebb1eca696c42fd067658bd9b5267709f78ef38e"]
+ });
+ expect(configs.backportPullRequests.length).toEqual(1);
+ expect(configs.backportPullRequests[0]).toEqual({
+ owner: "superuser",
+ repo: "backporting-example",
+ head: "bp-prod-ebb1eca",
+ base: "prod",
+ title: "New Title",
+ body: "New Body Prefix -New Body",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ labels: ["cherry-pick :cherries:", "backport-prod"],
+ comments: [],
+ });
+ });
+
+ test("still open pull request without squash", async () => {
+ const args: Args = {
+ dryRun: true,
+ auth: "whatever",
+ pullRequest: openPRUrl,
+ targetBranch: "prod",
+ gitUser: "Gitlab",
+ gitEmail: "noreply@gitlab.com",
+ reviewers: [],
+ assignees: [],
+ inheritReviewers: true,
+ squash: false,
+ };
+
+ const configs: Configs = await configParser.parseAndValidate(args);
+
+ expect(GitLabClient.prototype.getPullRequest).toBeCalledTimes(1);
+ expect(GitLabClient.prototype.getPullRequest).toBeCalledWith("superuser", "backporting-example", 2, false);
+ expect(GitLabMapper.prototype.mapPullRequest).toBeCalledTimes(1);
+ expect(GitLabMapper.prototype.mapPullRequest).toBeCalledWith(expect.anything(), ["e4dd336a4a20f394df6665994df382fb1d193a11", "974519f65c9e0ed65277cd71026657a09fca05e7"]);
+
+ expect(configs.dryRun).toEqual(true);
+ expect(configs.auth).toEqual("whatever");
+ expect(configs.git).toEqual({
+ user: "Gitlab",
+ email: "noreply@gitlab.com"
+ });
+ expect(configs.originalPullRequest).toEqual({
+ number: 2,
+ author: "superuser",
+ url: "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/2",
+ htmlUrl: "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/2",
+ state: "open",
+ merged: false,
+ mergedBy: undefined,
+ title: "Update test.txt opened",
+ body: "Still opened mr body",
+ reviewers: ["superuser"],
+ assignees: ["superuser"],
+ labels: [],
+ targetRepo: {
+ owner: "superuser",
+ project: "backporting-example",
+ cloneUrl: "https://my.gitlab.host.com/superuser/backporting-example.git"
+ },
+ sourceRepo: {
+ owner: "superuser",
+ project: "backporting-example",
+ cloneUrl: "https://my.gitlab.host.com/superuser/backporting-example.git"
+ },
+ bpBranchName: undefined,
+ nCommits: 2,
+ commits: ["e4dd336a4a20f394df6665994df382fb1d193a11", "974519f65c9e0ed65277cd71026657a09fca05e7"]
+ });
+ expect(configs.backportPullRequests.length).toEqual(1);
+ expect(configs.backportPullRequests[0]).toEqual({
+ owner: "superuser",
+ repo: "backporting-example",
+ head: "bp-prod-e4dd336-974519f",
+ base: "prod",
+ title: "[prod] Update test.txt opened",
+ body: "**Backport:** https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/2\r\n\r\nStill opened mr body",
+ reviewers: ["superuser"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ });
+ });
+
+ test("override backport pr with additional comments", async () => {
+ const args: Args = {
+ dryRun: false,
+ auth: "",
+ pullRequest: mergedPRUrl,
+ targetBranch: "prod",
+ gitUser: "Me",
+ gitEmail: "me@email.com",
+ title: "New Title",
+ body: "New Body",
+ bodyPrefix: "New Body Prefix -",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ inheritReviewers: false,
+ labels: [],
+ inheritLabels: false,
+ comments: ["First comment", "Second comment"],
+ squash: true,
+ };
+
+ const configs: Configs = await configParser.parseAndValidate(args);
+
+ expect(GitLabClient.prototype.getPullRequest).toBeCalledTimes(1);
+ expect(GitLabClient.prototype.getPullRequest).toBeCalledWith("superuser", "backporting-example", 1, true);
+ expect(GitLabMapper.prototype.mapPullRequest).toBeCalledTimes(1);
+ expect(GitLabMapper.prototype.mapPullRequest).toBeCalledWith(expect.anything(), []);
+
+ expect(configs.dryRun).toEqual(false);
+ expect(configs.git).toEqual({
+ user: "Me",
+ email: "me@email.com"
+ });
+ expect(configs.auth).toEqual("");
+ expect(configs.folder).toEqual(process.cwd() + "/bp");
+ expect(configs.originalPullRequest).toEqual({
+ number: 1,
+ author: "superuser",
+ url: "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/1",
+ htmlUrl: "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/1",
+ state: "merged",
+ merged: true,
+ mergedBy: "superuser",
+ title: "Update test.txt",
+ body: "This is the body",
+ reviewers: ["superuser1", "superuser2"],
+ assignees: ["superuser"],
+ labels: ["backport-prod"],
+ targetRepo: {
+ owner: "superuser",
+ project: "backporting-example",
+ cloneUrl: "https://my.gitlab.host.com/superuser/backporting-example.git"
+ },
+ sourceRepo: {
+ owner: "superuser",
+ project: "backporting-example",
+ cloneUrl: "https://my.gitlab.host.com/superuser/backporting-example.git"
+ },
+ nCommits: 1,
+ commits: ["ebb1eca696c42fd067658bd9b5267709f78ef38e"]
+ });
+ expect(configs.backportPullRequests.length).toEqual(1);
+ expect(configs.backportPullRequests[0]).toEqual({
+ owner: "superuser",
+ repo: "backporting-example",
+ head: "bp-prod-ebb1eca",
+ base: "prod",
+ title: "New Title",
+ body: "New Body Prefix -New Body",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ labels: [],
+ comments: ["First comment", "Second comment"],
+ });
+ });
+
+ test("extract target branches from pr labels", async () => {
+ const args: Args = {
+ dryRun: false,
+ auth: "",
+ pullRequest: mergedPRUrl,
+ targetBranchPattern: "^backport-(?([^ ]+))$",
+ gitUser: "Me",
+ gitEmail: "me@email.com",
+ title: "New Title",
+ body: "New Body",
+ bodyPrefix: "New Body Prefix -",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ inheritReviewers: false,
+ labels: [],
+ inheritLabels: false,
+ comments: ["First comment", "Second comment"],
+ squash: true,
+ };
+
+ const configs: Configs = await configParser.parseAndValidate(args);
+
+ expect(GitLabClient.prototype.getPullRequest).toBeCalledTimes(1);
+ expect(GitLabClient.prototype.getPullRequest).toBeCalledWith("superuser", "backporting-example", 1, true);
+ expect(GitLabMapper.prototype.mapPullRequest).toBeCalledTimes(1);
+ expect(GitLabMapper.prototype.mapPullRequest).toBeCalledWith(expect.anything(), []);
+
+ expect(configs.dryRun).toEqual(false);
+ expect(configs.git).toEqual({
+ user: "Me",
+ email: "me@email.com"
+ });
+ expect(configs.auth).toEqual("");
+ expect(configs.folder).toEqual(process.cwd() + "/bp");
+ expect(configs.originalPullRequest).toEqual({
+ number: 1,
+ author: "superuser",
+ url: "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/1",
+ htmlUrl: "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/1",
+ state: "merged",
+ merged: true,
+ mergedBy: "superuser",
+ title: "Update test.txt",
+ body: "This is the body",
+ reviewers: ["superuser1", "superuser2"],
+ assignees: ["superuser"],
+ labels: ["backport-prod"],
+ targetRepo: {
+ owner: "superuser",
+ project: "backporting-example",
+ cloneUrl: "https://my.gitlab.host.com/superuser/backporting-example.git"
+ },
+ sourceRepo: {
+ owner: "superuser",
+ project: "backporting-example",
+ cloneUrl: "https://my.gitlab.host.com/superuser/backporting-example.git"
+ },
+ nCommits: 1,
+ commits: ["ebb1eca696c42fd067658bd9b5267709f78ef38e"]
+ });
+ expect(configs.backportPullRequests.length).toEqual(1);
+ expect(configs.backportPullRequests[0]).toEqual({
+ owner: "superuser",
+ repo: "backporting-example",
+ head: "bp-prod-ebb1eca",
+ base: "prod",
+ title: "New Title",
+ body: "New Body Prefix -New Body",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ labels: [],
+ comments: ["First comment", "Second comment"],
+ });
+ });
+
+ test("enable error notification message", async () => {
+ const args: Args = {
+ dryRun: false,
+ auth: "",
+ pullRequest: mergedPRUrl,
+ targetBranch: "prod",
+ enableErrorNotification: true,
+ };
+
+ const configs: Configs = await configParser.parseAndValidate(args);
+
+ expect(GitLabClient.prototype.getPullRequest).toBeCalledTimes(1);
+ expect(GitLabClient.prototype.getPullRequest).toBeCalledWith("superuser", "backporting-example", 1, undefined);
+ expect(GitLabMapper.prototype.mapPullRequest).toBeCalledTimes(1);
+ expect(GitLabMapper.prototype.mapPullRequest).toBeCalledWith(expect.anything(), []);
+
+ expect(configs.errorNotification).toEqual({
+ "enabled": true,
+ "message": "The backport to `{{target-branch}}` failed. Check the latest run for more details.",
+ });
+ });
+});
\ No newline at end of file
diff --git a/test/service/configs/pullrequest/pr-configs-parser.test.ts b/test/service/configs/pullrequest/pr-configs-parser.test.ts
deleted file mode 100644
index c57fcec..0000000
--- a/test/service/configs/pullrequest/pr-configs-parser.test.ts
+++ /dev/null
@@ -1,245 +0,0 @@
-import { Args } from "@bp/service/args/args.types";
-import { Configs } from "@bp/service/configs/configs.types";
-import PullRequestConfigsParser from "@bp/service/configs/pullrequest/pr-configs-parser";
-import GitServiceFactory from "@bp/service/git/git-service-factory";
-import { GitServiceType } from "@bp/service/git/git.types";
-import { setupMoctokit } from "../../../support/moctokit/moctokit-support";
-import { mergedPullRequestFixture, openPullRequestFixture, notMergedPullRequestFixture, repo, targetOwner } from "../../../support/moctokit/moctokit-data";
-
-describe("pull request config parser", () => {
-
- const mergedPRUrl = `https://github.com/${targetOwner}/${repo}/pull/${mergedPullRequestFixture.number}`;
- const openPRUrl = `https://github.com/${targetOwner}/${repo}/pull/${openPullRequestFixture.number}`;
- const notMergedPRUrl = `https://github.com/${targetOwner}/${repo}/pull/${notMergedPullRequestFixture.number}`;
-
- let parser: PullRequestConfigsParser;
-
- beforeAll(() => {
- GitServiceFactory.init(GitServiceType.GITHUB, "whatever");
- });
-
- beforeEach(() => {
- setupMoctokit();
-
- parser = new PullRequestConfigsParser();
- });
-
- afterEach(() => {
- jest.clearAllMocks();
- });
-
- test("parse configs from pull request", async () => {
- const args: Args = {
- dryRun: false,
- auth: "",
- pullRequest: mergedPRUrl,
- targetBranch: "prod"
- };
-
- const configs: Configs = await parser.parseAndValidate(args);
-
- expect(configs.dryRun).toEqual(false);
- expect(configs.author).toEqual("gh-user");
- expect(configs.auth).toEqual("");
- expect(configs.targetBranch).toEqual("prod");
- expect(configs.folder).toEqual(process.cwd() + "/bp");
- expect(configs.originalPullRequest).toEqual({
- number: 2368,
- author: "gh-user",
- url: "https://api.github.com/repos/owner/reponame/pulls/2368",
- htmlUrl: "https://github.com/owner/reponame/pull/2368",
- state: "closed",
- merged: true,
- mergedBy: "that-s-a-user",
- title: "PR Title",
- body: "Please review and merge",
- reviewers: ["requested-gh-user", "gh-user"],
- targetRepo: {
- owner: "owner",
- project: "reponame",
- cloneUrl: "https://github.com/owner/reponame.git"
- },
- sourceRepo: {
- owner: "fork",
- project: "reponame",
- cloneUrl: "https://github.com/fork/reponame.git"
- },
- nCommits: 2,
- commits: ["28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc"]
- });
- expect(configs.backportPullRequest).toEqual({
- author: "gh-user",
- url: undefined,
- htmlUrl: undefined,
- title: "[prod] PR Title",
- body: "**Backport:** https://github.com/owner/reponame/pull/2368\r\n\r\nPlease review and merge\r\n\r\nPowered by [BPer](https://github.com/lampajr/backporting).",
- reviewers: ["gh-user", "that-s-a-user"],
- targetRepo: {
- owner: "owner",
- project: "reponame",
- cloneUrl: "https://github.com/owner/reponame.git"
- },
- sourceRepo: {
- owner: "owner",
- project: "reponame",
- cloneUrl: "https://github.com/owner/reponame.git"
- },
- bpBranchName: undefined,
- nCommits: 0,
- commits: []
- });
- });
-
- test("override folder", async () => {
- const args: Args = {
- dryRun: true,
- auth: "whatever",
- pullRequest: mergedPRUrl,
- targetBranch: "prod",
- folder: "/tmp/test"
- };
-
- const configs: Configs = await parser.parseAndValidate(args);
-
- expect(configs.dryRun).toEqual(true);
- expect(configs.auth).toEqual("whatever");
- expect(configs.targetBranch).toEqual("prod");
- expect(configs.folder).toEqual("/tmp/test");
- });
-
- test("override author", async () => {
- const args: Args = {
- dryRun: true,
- auth: "whatever",
- pullRequest: mergedPRUrl,
- targetBranch: "prod",
- author: "another-user"
- };
-
- const configs: Configs = await parser.parseAndValidate(args);
-
- expect(configs.dryRun).toEqual(true);
- expect(configs.auth).toEqual("whatever");
- expect(configs.targetBranch).toEqual("prod");
- expect(configs.author).toEqual("another-user");
- });
-
- test("still open pull request", async () => {
- const args: Args = {
- dryRun: true,
- auth: "whatever",
- pullRequest: openPRUrl,
- targetBranch: "prod"
- };
-
- const configs: Configs = await parser.parseAndValidate(args);
-
- expect(configs.dryRun).toEqual(true);
- expect(configs.auth).toEqual("whatever");
- expect(configs.targetBranch).toEqual("prod");
- expect(configs.author).toEqual("gh-user");
- expect(configs.originalPullRequest).toEqual({
- number: 4444,
- author: "gh-user",
- url: "https://api.github.com/repos/owner/reponame/pulls/4444",
- htmlUrl: "https://github.com/owner/reponame/pull/4444",
- state: "open",
- merged: false,
- mergedBy: "that-s-a-user",
- title: "PR Title",
- body: "Please review and merge",
- reviewers: ["gh-user"],
- targetRepo: {
- owner: "owner",
- project: "reponame",
- cloneUrl: "https://github.com/owner/reponame.git"
- },
- sourceRepo: {
- owner: "fork",
- project: "reponame",
- cloneUrl: "https://github.com/fork/reponame.git"
- },
- bpBranchName: undefined,
- nCommits: 2,
- // taken from head.sha
- commits: ["91748965051fae1330ad58d15cf694e103267c87"]
- });
- });
-
- test("closed pull request", async () => {
- const args: Args = {
- dryRun: true,
- auth: "whatever",
- pullRequest: notMergedPRUrl,
- targetBranch: "prod"
- };
-
- expect(async () => await parser.parseAndValidate(args)).rejects.toThrow("Provided pull request is closed and not merged!");
- });
-
- test("override backport pr data", async () => {
- const args: Args = {
- dryRun: false,
- auth: "",
- pullRequest: mergedPRUrl,
- targetBranch: "prod",
- title: "New Title",
- body: "New Body",
- bodyPrefix: "New Body Prefix -",
- };
-
- const configs: Configs = await parser.parseAndValidate(args);
-
- expect(configs.dryRun).toEqual(false);
- expect(configs.author).toEqual("gh-user");
- expect(configs.auth).toEqual("");
- expect(configs.targetBranch).toEqual("prod");
- expect(configs.folder).toEqual(process.cwd() + "/bp");
- expect(configs.originalPullRequest).toEqual({
- number: 2368,
- author: "gh-user",
- url: "https://api.github.com/repos/owner/reponame/pulls/2368",
- htmlUrl: "https://github.com/owner/reponame/pull/2368",
- state: "closed",
- merged: true,
- mergedBy: "that-s-a-user",
- title: "PR Title",
- body: "Please review and merge",
- reviewers: ["requested-gh-user", "gh-user"],
- targetRepo: {
- owner: "owner",
- project: "reponame",
- cloneUrl: "https://github.com/owner/reponame.git"
- },
- sourceRepo: {
- owner: "fork",
- project: "reponame",
- cloneUrl: "https://github.com/fork/reponame.git"
- },
- bpBranchName: undefined,
- nCommits: 2,
- commits: ["28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc"],
- });
- expect(configs.backportPullRequest).toEqual({
- author: "gh-user",
- url: undefined,
- htmlUrl: undefined,
- title: "New Title",
- body: "New Body Prefix -New Body",
- reviewers: ["gh-user", "that-s-a-user"],
- targetRepo: {
- owner: "owner",
- project: "reponame",
- cloneUrl: "https://github.com/owner/reponame.git"
- },
- sourceRepo: {
- owner: "owner",
- project: "reponame",
- cloneUrl: "https://github.com/owner/reponame.git"
- },
- bpBranchName: undefined,
- nCommits: 0,
- commits: []
- });
- });
-});
\ No newline at end of file
diff --git a/test/service/git/git-cli.test.ts b/test/service/git/git-cli.test.ts
index 746d847..8c71609 100644
--- a/test/service/git/git-cli.test.ts
+++ b/test/service/git/git-cli.test.ts
@@ -69,7 +69,10 @@ afterAll(async () => {
beforeEach(() => {
// create a fresh instance of git before each test
- git = new GitCLIService("", "author");
+ git = new GitCLIService("", {
+ user: "user",
+ email: "user@email.com"
+ });
});
describe("git cli service", () => {
@@ -111,4 +114,31 @@ describe("git cli service", () => {
const output = spawnSync("git", ["cherry", "-v"], { cwd }).stdout.toString();
expect(output.includes(expressionToTest)).toBe(false);
});
+
+
+ test("git clone on already created repo", async () => {
+ await git.clone("remote", cwd, "tbranch");
+
+ // use rev-parse to double check the current branch is the expected one
+ const post = spawnSync("git", ["rev-parse", "--abbrev-ref", "HEAD"], { cwd }).stdout.toString().trim();
+ expect(post).toEqual("tbranch");
+ });
+
+ test("git clone set url with auth correctly for API token", async () => {
+ const git2 = new GitCLIService("api-token", {
+ user: "Backporting bot",
+ email: "bot@example.com",
+ });
+ const cwd2 = `${__dirname}/test-api-token`;
+
+ try {
+ await git2.clone(`file://${cwd}`, cwd2, "main");
+ const remoteURL = spawnSync("git", ["remote", "get-url", "origin"], { cwd: cwd2 }).stdout.toString().trim();
+
+ expect(remoteURL).toContain("api-token");
+ expect(remoteURL).not.toContain("Backporting bot");
+ } finally {
+ fs.rmSync(cwd2, { recursive: true, force: true });
+ }
+ });
});
\ No newline at end of file
diff --git a/test/service/git/git-client-factory.test.ts b/test/service/git/git-client-factory.test.ts
new file mode 100644
index 0000000..df64e40
--- /dev/null
+++ b/test/service/git/git-client-factory.test.ts
@@ -0,0 +1,45 @@
+import GitClientFactory from "@bp/service/git/git-client-factory";
+import { GitClientType } from "@bp/service/git/git.types";
+import GitHubClient from "@bp/service/git/github/github-client";
+import GitLabClient from "@bp/service/git/gitlab/gitlab-client";
+
+describe("git client factory test", () => {
+
+ beforeEach(() => {
+ // reset git service
+ GitClientFactory.reset();
+ });
+
+ test("correctly create github client", () => {
+ const client = GitClientFactory.getOrCreate(GitClientType.GITHUB, "auth", "apiurl");
+ expect(client).toBeInstanceOf(GitHubClient);
+ });
+
+ test("correctly create gitlab client", () => {
+ const client = GitClientFactory.getOrCreate(GitClientType.GITLAB, "auth", "apiurl");
+ expect(client).toBeInstanceOf(GitLabClient);
+ });
+
+ test("correctly create codeberg client", () => {
+ const client = GitClientFactory.getOrCreate(GitClientType.CODEBERG, "auth", "apiurl");
+ expect(client).toBeInstanceOf(GitHubClient);
+ });
+
+ test("check get service github", () => {
+ const create = GitClientFactory.getOrCreate(GitClientType.GITHUB, "auth", "apiurl");
+ const get = GitClientFactory.getClient();
+ expect(create).toStrictEqual(get);
+ });
+
+ test("check get service gitlab", () => {
+ const create = GitClientFactory.getOrCreate(GitClientType.GITLAB, "auth", "apiurl");
+ const get = GitClientFactory.getClient();
+ expect(create).toStrictEqual(get);
+ });
+
+ test("check get service codeberg", () => {
+ const create = GitClientFactory.getOrCreate(GitClientType.CODEBERG, "auth", "apiurl");
+ const get = GitClientFactory.getClient();
+ expect(create).toStrictEqual(get);
+ });
+});
\ No newline at end of file
diff --git a/test/service/git/git-util.test.ts b/test/service/git/git-util.test.ts
new file mode 100644
index 0000000..9a90936
--- /dev/null
+++ b/test/service/git/git-util.test.ts
@@ -0,0 +1,64 @@
+import { inferGitApiUrl, inferGitClient, inferSquash } from "@bp/service/git/git-util";
+import { GitClientType } from "@bp/service/git/git.types";
+
+describe("check git utilities", () => {
+
+ test("check infer gitlab api", ()=> {
+ expect(inferGitApiUrl("https://my.gitlab.awesome.com/superuser/backporting-example/-/merge_requests/4")).toStrictEqual("https://my.gitlab.awesome.com/api/v4");
+ });
+
+ test("check infer gitlab api with different version", ()=> {
+ expect(inferGitApiUrl("http://my.gitlab.awesome.com/superuser/backporting-example/-/merge_requests/4", "v2")).toStrictEqual("http://my.gitlab.awesome.com/api/v2");
+ });
+
+ test("check infer github api", ()=> {
+ expect(inferGitApiUrl("https://github.com/superuser/backporting-example/pull/4")).toStrictEqual("https://api.github.com");
+ });
+
+ test("check infer custom github api", ()=> {
+ expect(inferGitApiUrl("http://github.acme-inc.com/superuser/backporting-example/pull/4")).toStrictEqual("http://github.acme-inc.com/api/v4");
+ });
+
+ test("check infer custom github api with different version", ()=> {
+ expect(inferGitApiUrl("http://github.acme-inc.com/superuser/backporting-example/pull/4", "v3")).toStrictEqual("http://github.acme-inc.com/api/v3");
+ });
+
+ test("check infer github api from github api url", ()=> {
+ expect(inferGitApiUrl("https://api.github.com/repos/owner/repo/pulls/1")).toStrictEqual("https://api.github.com");
+ });
+
+ test("check infer codeberg api", ()=> {
+ expect(inferGitApiUrl("https://codeberg.org/lampajr/backporting-example/pulls/1", "v1")).toStrictEqual("https://codeberg.org/api/v1");
+ });
+
+ test("check infer codeberg api", ()=> {
+ expect(inferGitApiUrl("https://codeberg.org/lampajr/backporting-example/pulls/1", undefined)).toStrictEqual("https://codeberg.org/api/v4");
+ });
+
+ test("check infer github client", ()=> {
+ expect(inferGitClient("https://github.com/superuser/backporting-example/pull/4")).toStrictEqual(GitClientType.GITHUB);
+ });
+
+ test("check infer gitlab client", ()=> {
+ expect(inferGitClient("https://my.gitlab.awesome.com/superuser/backporting-example/-/merge_requests/4")).toStrictEqual(GitClientType.GITLAB);
+ });
+
+ test("not recognized git client type", ()=> {
+ expect(() => inferGitClient("https://not.recognized/superuser/backporting-example/-/merge_requests/4")).toThrowError("Remote git service not recognized from pr url: https://not.recognized/superuser/backporting-example/-/merge_requests/4");
+ });
+
+ test("check infer github client using github api", ()=> {
+ expect(inferGitClient("https://api.github.com/repos/owner/repo/pulls/1")).toStrictEqual(GitClientType.GITHUB);
+ });
+
+ test("check infer codeberg client", ()=> {
+ expect(inferGitClient("https://codeberg.org/lampajr/backporting-example/pulls/1")).toStrictEqual(GitClientType.CODEBERG);
+ });
+
+ test("check inferSquash", ()=> {
+ expect(inferSquash(true, undefined)).toStrictEqual(false);
+ expect(inferSquash(false, "SHA")).toStrictEqual(true);
+ expect(inferSquash(false, undefined)).toStrictEqual(false);
+ expect(inferSquash(false, null)).toStrictEqual(false);
+ });
+});
diff --git a/test/service/git/github/github-client.test.ts b/test/service/git/github/github-client.test.ts
new file mode 100644
index 0000000..35a4d5c
--- /dev/null
+++ b/test/service/git/github/github-client.test.ts
@@ -0,0 +1,41 @@
+import GitClientFactory from "@bp/service/git/git-client-factory";
+import { GitPullRequest, GitClientType } from "@bp/service/git/git.types";
+import GitHubClient from "@bp/service/git/github/github-client";
+import { MERGED_PR_FIXTURE, REPO, TARGET_OWNER } from "../../../support/mock/github-data";
+import { mockGitHubClient } from "../../../support/mock/git-client-mock-support";
+
+describe("github service", () => {
+
+ let gitClient: GitHubClient;
+
+ beforeAll(() => {
+ // init git service
+ GitClientFactory.reset();
+ GitClientFactory.getOrCreate(GitClientType.GITHUB, "whatever", "http://localhost/api/v3");
+ });
+
+ beforeEach(() => {
+ // mock github api calls
+ mockGitHubClient("http://localhost/api/v3");
+
+ gitClient = GitClientFactory.getClient() as GitHubClient;
+ });
+
+ test("get pull request: success", async () => {
+ const res: GitPullRequest = await gitClient.getPullRequest(TARGET_OWNER, REPO, MERGED_PR_FIXTURE.number, true);
+ expect(res.sourceRepo).toEqual({
+ owner: "fork",
+ project: "reponame",
+ cloneUrl: "https://github.com/fork/reponame.git"
+ });
+ expect(res.targetRepo).toEqual({
+ owner: "owner",
+ project: "reponame",
+ cloneUrl: "https://github.com/owner/reponame.git"
+ });
+ expect(res.title).toBe("PR Title");
+ expect(res.commits!.length).toBe(1);
+ expect(res.commits).toEqual(["28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc"]);
+ });
+
+});
\ No newline at end of file
diff --git a/test/service/git/github/github-service.test.ts b/test/service/git/github/github-service.test.ts
deleted file mode 100644
index addcd80..0000000
--- a/test/service/git/github/github-service.test.ts
+++ /dev/null
@@ -1,40 +0,0 @@
-import GitServiceFactory from "@bp/service/git/git-service-factory";
-import { GitPullRequest, GitServiceType } from "@bp/service/git/git.types";
-import GitHubService from "@bp/service/git/github/github-service";
-import { mergedPullRequestFixture, repo, targetOwner } from "../../../support/moctokit/moctokit-data";
-import { setupMoctokit } from "../../../support/moctokit/moctokit-support";
-
-describe("github service", () => {
-
- let gitService: GitHubService;
-
- beforeAll(() => {
- // init git service
- GitServiceFactory.init(GitServiceType.GITHUB, "whatever");
- });
-
- beforeEach(() => {
- // mock github api calls
- setupMoctokit();
-
- gitService = GitServiceFactory.getService() as GitHubService;
- });
-
- test("get pull request: success", async () => {
- const res: GitPullRequest = await gitService.getPullRequest(targetOwner, repo, mergedPullRequestFixture.number);
- expect(res.sourceRepo).toEqual({
- owner: "fork",
- project: "reponame",
- cloneUrl: "https://github.com/fork/reponame.git"
- });
- expect(res.targetRepo).toEqual({
- owner: "owner",
- project: "reponame",
- cloneUrl: "https://github.com/owner/reponame.git"
- });
- expect(res.title).toBe("PR Title");
- expect(res.commits.length).toBe(1);
- expect(res.commits).toEqual(["28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc"]);
- });
-
-});
\ No newline at end of file
diff --git a/test/service/git/gitlab/gitlab-client.test.ts b/test/service/git/gitlab/gitlab-client.test.ts
new file mode 100644
index 0000000..38deda1
--- /dev/null
+++ b/test/service/git/gitlab/gitlab-client.test.ts
@@ -0,0 +1,351 @@
+import GitClientFactory from "@bp/service/git/git-client-factory";
+import { NEW_GITLAB_MR_ID, SECOND_NEW_GITLAB_MR_ID, getAxiosMocked, postAxiosMocked, putAxiosMocked } from "../../../support/mock/git-client-mock-support";
+import { BackportPullRequest, GitClientType, GitPullRequest } from "@bp/service/git/git.types";
+import GitLabClient from "@bp/service/git/gitlab/gitlab-client";
+import axios from "axios";
+
+jest.mock("axios");
+const axiosSpy = axios.create as jest.Mock;
+let axiosInstanceSpy: {[key: string]: jest.Func};
+
+function setupAxiosSpy() {
+ const getSpy = jest.fn(getAxiosMocked);
+ const postSpy = jest.fn(postAxiosMocked);
+ const putSpy = jest.fn(putAxiosMocked);
+ const axiosInstance = {
+ get: getSpy,
+ post: postSpy,
+ put: putSpy,
+ };
+ axiosSpy.mockImplementation(() => (axiosInstance));
+ return axiosInstance;
+}
+
+describe("github service", () => {
+ let gitClient: GitLabClient;
+
+ beforeEach(() => {
+ axiosInstanceSpy = setupAxiosSpy();
+ GitClientFactory.reset();
+ gitClient = GitClientFactory.getOrCreate(GitClientType.GITLAB, "whatever", "apiUrl") as GitLabClient;
+ });
+
+ test("get merged pull request", async () => {
+ const res: GitPullRequest = await gitClient.getPullRequest("superuser", "backporting-example", 1, true);
+
+ // check content
+ expect(res.sourceRepo).toEqual({
+ owner: "superuser",
+ project: "backporting-example",
+ cloneUrl: "https://my.gitlab.host.com/superuser/backporting-example.git"
+ });
+ expect(res.targetRepo).toEqual({
+ owner: "superuser",
+ project: "backporting-example",
+ cloneUrl: "https://my.gitlab.host.com/superuser/backporting-example.git"
+ });
+ expect(res.title).toBe("Update test.txt");
+ expect(res.commits!.length).toBe(1);
+ expect(res.commits).toEqual(["ebb1eca696c42fd067658bd9b5267709f78ef38e"]);
+
+ // check axios invocation
+ expect(axiosInstanceSpy.get).toBeCalledTimes(3); // merge request and 2 repos
+ expect(axiosInstanceSpy.get).toBeCalledWith("/projects/superuser%2Fbackporting-example/merge_requests/1");
+ expect(axiosInstanceSpy.get).toBeCalledWith("/projects/76316");
+ expect(axiosInstanceSpy.get).toBeCalledWith("/projects/76316");
+ });
+
+ test("get open pull request", async () => {
+ const res: GitPullRequest = await gitClient.getPullRequest("superuser", "backporting-example", 2, true);
+ expect(res.sourceRepo).toEqual({
+ owner: "superuser",
+ project: "backporting-example",
+ cloneUrl: "https://my.gitlab.host.com/superuser/backporting-example.git"
+ });
+ expect(res.targetRepo).toEqual({
+ owner: "superuser",
+ project: "backporting-example",
+ cloneUrl: "https://my.gitlab.host.com/superuser/backporting-example.git"
+ });
+ expect(res.title).toBe("Update test.txt opened");
+ expect(res.commits!.length).toBe(1);
+ expect(res.commits).toEqual(["9e15674ebd48e05c6e428a1fa31dbb60a778d644"]);
+
+ // check axios invocation
+ expect(axiosInstanceSpy.get).toBeCalledTimes(3); // merge request and 2 repos
+ expect(axiosInstanceSpy.get).toBeCalledWith("/projects/superuser%2Fbackporting-example/merge_requests/2");
+ expect(axiosInstanceSpy.get).toBeCalledWith("/projects/76316");
+ expect(axiosInstanceSpy.get).toBeCalledWith("/projects/76316");
+ });
+
+ test("create backport pull request without reviewers and assignees", async () => {
+ const backport: BackportPullRequest = {
+ title: "Backport Title",
+ body: "Backport Body",
+ owner: "superuser",
+ repo: "backporting-example",
+ base: "old/branch",
+ head: "bp-branch",
+ reviewers: [],
+ assignees: [],
+ labels: [],
+ comments: [],
+ };
+
+ const url: string = await gitClient.createPullRequest(backport);
+ expect(url).toStrictEqual("https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/" + NEW_GITLAB_MR_ID);
+
+ // check axios invocation
+ expect(axiosInstanceSpy.post).toBeCalledTimes(1);
+ expect(axiosInstanceSpy.post).toBeCalledWith("/projects/superuser%2Fbackporting-example/merge_requests", expect.objectContaining({
+ source_branch: "bp-branch",
+ target_branch: "old/branch",
+ title: "Backport Title",
+ description: "Backport Body",
+ reviewer_ids: [],
+ assignee_ids: [],
+ }));
+ expect(axiosInstanceSpy.get).toBeCalledTimes(0); // no reviewers nor assignees
+ expect(axiosInstanceSpy.put).toBeCalledTimes(0); // no reviewers nor assignees
+ });
+
+ test("create backport pull request with reviewers", async () => {
+ const backport: BackportPullRequest = {
+ title: "Backport Title",
+ body: "Backport Body",
+ owner: "superuser",
+ repo: "backporting-example",
+ base: "old/branch",
+ head: "bp-branch",
+ reviewers: ["superuser", "invalid"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ };
+
+ const url: string = await gitClient.createPullRequest(backport);
+ expect(url).toStrictEqual("https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/" + NEW_GITLAB_MR_ID);
+
+ // check axios invocation
+ expect(axiosInstanceSpy.post).toBeCalledTimes(1);
+ expect(axiosInstanceSpy.post).toBeCalledWith("/projects/superuser%2Fbackporting-example/merge_requests", expect.objectContaining({
+ source_branch: "bp-branch",
+ target_branch: "old/branch",
+ title: "Backport Title",
+ description: "Backport Body",
+ reviewer_ids: [],
+ assignee_ids: [],
+ }));
+ expect(axiosInstanceSpy.get).toBeCalledTimes(2); // just reviewers, one invalid
+ expect(axiosInstanceSpy.get).toBeCalledWith("/users?username=superuser");
+ expect(axiosInstanceSpy.get).toBeCalledWith("/users?username=invalid");
+ expect(axiosInstanceSpy.put).toBeCalledTimes(1); // just reviewers
+ expect(axiosInstanceSpy.put).toBeCalledWith("/projects/superuser%2Fbackporting-example/merge_requests/" + NEW_GITLAB_MR_ID, {
+ reviewer_ids: [14041],
+ });
+ });
+
+ test("create backport pull request with assignees", async () => {
+ const backport: BackportPullRequest = {
+ title: "Backport Title",
+ body: "Backport Body",
+ owner: "superuser",
+ repo: "backporting-example",
+ base: "old/branch",
+ head: "bp-branch",
+ reviewers: [],
+ assignees: ["superuser", "invalid"],
+ labels: [],
+ comments: [],
+ };
+
+ const url: string = await gitClient.createPullRequest(backport);
+ expect(url).toStrictEqual("https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/" + NEW_GITLAB_MR_ID);
+
+ // check axios invocation
+ expect(axiosInstanceSpy.post).toBeCalledTimes(1);
+ expect(axiosInstanceSpy.post).toBeCalledWith("/projects/superuser%2Fbackporting-example/merge_requests", expect.objectContaining({
+ source_branch: "bp-branch",
+ target_branch: "old/branch",
+ title: "Backport Title",
+ description: "Backport Body",
+ reviewer_ids: [],
+ assignee_ids: [],
+ }));
+ expect(axiosInstanceSpy.get).toBeCalledTimes(2); // just assignees, one invalid
+ expect(axiosInstanceSpy.get).toBeCalledWith("/users?username=superuser");
+ expect(axiosInstanceSpy.get).toBeCalledWith("/users?username=invalid");
+ expect(axiosInstanceSpy.put).toBeCalledTimes(1); // just assignees
+ expect(axiosInstanceSpy.put).toBeCalledWith("/projects/superuser%2Fbackporting-example/merge_requests/" + NEW_GITLAB_MR_ID, {
+ assignee_ids: [14041],
+ });
+ });
+
+ test("create backport pull request with failure assigning reviewers", async () => {
+ const backport: BackportPullRequest = {
+ title: "Backport Title",
+ body: "Backport Body",
+ owner: "superuser",
+ repo: "backporting-example",
+ base: "old/branch",
+ head: "bp-branch-2",
+ reviewers: ["superuser", "invalid"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ };
+
+ const url: string = await gitClient.createPullRequest(backport);
+ expect(url).toStrictEqual("https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/" + SECOND_NEW_GITLAB_MR_ID);
+
+ // check axios invocation
+ expect(axiosInstanceSpy.post).toBeCalledTimes(1);
+ expect(axiosInstanceSpy.post).toBeCalledWith("/projects/superuser%2Fbackporting-example/merge_requests", expect.objectContaining({
+ source_branch: "bp-branch-2",
+ target_branch: "old/branch",
+ title: "Backport Title",
+ description: "Backport Body",
+ reviewer_ids: [],
+ assignee_ids: [],
+ }));
+ expect(axiosInstanceSpy.get).toBeCalledTimes(2); // just reviewers, one invalid
+ expect(axiosInstanceSpy.get).toBeCalledWith("/users?username=superuser");
+ expect(axiosInstanceSpy.get).toBeCalledWith("/users?username=invalid");
+ expect(axiosInstanceSpy.put).toBeCalledTimes(1); // just reviewers
+ expect(axiosInstanceSpy.put).toBeCalledWith("/projects/superuser%2Fbackporting-example/merge_requests/" + SECOND_NEW_GITLAB_MR_ID, {
+ reviewer_ids: [14041],
+ });
+ });
+
+ test("create backport pull request with failure assigning assignees", async () => {
+ const backport: BackportPullRequest = {
+ title: "Backport Title",
+ body: "Backport Body",
+ owner: "superuser",
+ repo: "backporting-example",
+ base: "old/branch",
+ head: "bp-branch-2",
+ reviewers: [],
+ assignees: ["superuser", "invalid"],
+ labels: [],
+ comments: [],
+ };
+
+ const url: string = await gitClient.createPullRequest(backport);
+ expect(url).toStrictEqual("https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/" + SECOND_NEW_GITLAB_MR_ID);
+
+ // check axios invocation
+ expect(axiosInstanceSpy.post).toBeCalledTimes(1);
+ expect(axiosInstanceSpy.post).toBeCalledWith("/projects/superuser%2Fbackporting-example/merge_requests", expect.objectContaining({
+ source_branch: "bp-branch-2",
+ target_branch: "old/branch",
+ title: "Backport Title",
+ description: "Backport Body",
+ reviewer_ids: [],
+ assignee_ids: [],
+ }));
+ expect(axiosInstanceSpy.get).toBeCalledTimes(2); // just assignees, one invalid
+ expect(axiosInstanceSpy.get).toBeCalledWith("/users?username=superuser");
+ expect(axiosInstanceSpy.get).toBeCalledWith("/users?username=invalid");
+ expect(axiosInstanceSpy.put).toBeCalledTimes(1); // just assignees
+ expect(axiosInstanceSpy.put).toBeCalledWith("/projects/superuser%2Fbackporting-example/merge_requests/" + SECOND_NEW_GITLAB_MR_ID, {
+ assignee_ids: [14041],
+ });
+ });
+
+ test("create backport pull request with custom labels", async () => {
+ const backport: BackportPullRequest = {
+ title: "Backport Title",
+ body: "Backport Body",
+ owner: "superuser",
+ repo: "backporting-example",
+ base: "old/branch",
+ head: "bp-branch-2",
+ reviewers: [],
+ assignees: [],
+ labels: ["label1", "label2"],
+ comments: [],
+ };
+
+ const url: string = await gitClient.createPullRequest(backport);
+ expect(url).toStrictEqual("https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/" + SECOND_NEW_GITLAB_MR_ID);
+
+ // check axios invocation
+ expect(axiosInstanceSpy.post).toBeCalledTimes(1);
+ expect(axiosInstanceSpy.post).toBeCalledWith("/projects/superuser%2Fbackporting-example/merge_requests", expect.objectContaining({
+ source_branch: "bp-branch-2",
+ target_branch: "old/branch",
+ title: "Backport Title",
+ description: "Backport Body",
+ reviewer_ids: [],
+ assignee_ids: [],
+ }));
+ expect(axiosInstanceSpy.get).toBeCalledTimes(0);
+ expect(axiosInstanceSpy.put).toBeCalledTimes(1); // just labels
+ expect(axiosInstanceSpy.put).toBeCalledWith("/projects/superuser%2Fbackporting-example/merge_requests/" + SECOND_NEW_GITLAB_MR_ID, {
+ labels: "label1,label2",
+ });
+ });
+
+ test("create backport pull request with post comments", async () => {
+ const backport: BackportPullRequest = {
+ title: "Backport Title",
+ body: "Backport Body",
+ owner: "superuser",
+ repo: "backporting-example",
+ base: "old/branch",
+ head: "bp-branch-2",
+ reviewers: [],
+ assignees: [],
+ labels: [],
+ comments: ["this is first comment", "this is second comment"],
+ };
+
+ const url: string = await gitClient.createPullRequest(backport);
+ expect(url).toStrictEqual("https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/" + SECOND_NEW_GITLAB_MR_ID);
+
+ // check axios invocation
+ expect(axiosInstanceSpy.post).toBeCalledTimes(3); // also comments
+ expect(axiosInstanceSpy.post).toBeCalledWith("/projects/superuser%2Fbackporting-example/merge_requests", expect.objectContaining({
+ source_branch: "bp-branch-2",
+ target_branch: "old/branch",
+ title: "Backport Title",
+ description: "Backport Body",
+ reviewer_ids: [],
+ assignee_ids: [],
+ }));
+ expect(axiosInstanceSpy.get).toBeCalledTimes(0);
+
+ expect(axiosInstanceSpy.post).toBeCalledWith("/projects/superuser%2Fbackporting-example/merge_requests/" + SECOND_NEW_GITLAB_MR_ID + "/notes", {
+ body: "this is first comment",
+ });
+ expect(axiosInstanceSpy.post).toBeCalledWith("/projects/superuser%2Fbackporting-example/merge_requests/" + SECOND_NEW_GITLAB_MR_ID + "/notes", {
+ body: "this is second comment",
+ });
+ });
+
+ test("get pull request for nested namespaces", async () => {
+ const res: GitPullRequest = await gitClient.getPullRequestFromUrl("https://my.gitlab.host.com/mysuperorg/6/mysuperproduct/mysuperunit/backporting-example/-/merge_requests/4", true);
+
+ // check content
+ expect(res.sourceRepo).toEqual({
+ owner: "superuser",
+ project: "backporting-example",
+ cloneUrl: "https://my.gitlab.host.com/mysuperorg/6/mysuperproduct/mysuperunit/backporting-example.git"
+ });
+ expect(res.targetRepo).toEqual({
+ owner: "superuser",
+ project: "backporting-example",
+ cloneUrl: "https://my.gitlab.host.com/mysuperorg/6/mysuperproduct/mysuperunit/backporting-example.git"
+ });
+ expect(res.title).toBe("Update test.txt");
+ expect(res.commits!.length).toBe(1);
+ expect(res.commits).toEqual(["ebb1eca696c42fd067658bd9b5267709f78ef38e"]);
+
+ // check axios invocation
+ expect(axiosInstanceSpy.get).toBeCalledTimes(3); // merge request and 2 repos
+ expect(axiosInstanceSpy.get).toBeCalledWith("/projects/mysuperorg%2F6%2Fmysuperproduct%2Fmysuperunit%2Fbackporting-example/merge_requests/4");
+ expect(axiosInstanceSpy.get).toBeCalledWith("/projects/1645");
+ expect(axiosInstanceSpy.get).toBeCalledWith("/projects/1645");
+ });
+});
\ No newline at end of file
diff --git a/test/service/runner/cli-codeberg-runner.test.ts b/test/service/runner/cli-codeberg-runner.test.ts
new file mode 100644
index 0000000..653dea5
--- /dev/null
+++ b/test/service/runner/cli-codeberg-runner.test.ts
@@ -0,0 +1,1376 @@
+import ArgsParser from "@bp/service/args/args-parser";
+import Runner from "@bp/service/runner/runner";
+import GitCLIService from "@bp/service/git/git-cli";
+import GitHubClient from "@bp/service/git/github/github-client";
+import CLIArgsParser from "@bp/service/args/cli/cli-args-parser";
+import { addProcessArgs, createTestFile, removeTestFile, resetEnvTokens, resetProcessArgs } from "../../support/utils";
+import { mockCodebergClient } from "../../support/mock/git-client-mock-support";
+import GitClientFactory from "@bp/service/git/git-client-factory";
+import { BackportPullRequest, GitClientType } from "@bp/service/git/git.types";
+import { AuthTokenId } from "@bp/service/configs/configs.types";
+
+const GITHUB_MERGED_PR_W_OVERRIDES_CONFIG_FILE_CONTENT_PATHNAME = "./cli-codeberg-runner-pr-merged-with-overrides.json";
+const GITHUB_MERGED_PR_W_OVERRIDES_CONFIG_FILE_CONTENT = {
+ "dryRun": false,
+ "auth": "my-auth-token",
+ "pullRequest": "https://codeberg.org/owner/reponame/pulls/2368",
+ "targetBranch": "target",
+ "gitUser": "Me",
+ "gitEmail": "me@email.com",
+ "title": "New Title",
+ "body": "New Body",
+ "bodyPrefix": "New Body Prefix - ",
+ "bpBranchName": "bp_branch_name",
+ "reviewers": [],
+ "assignees": ["user3", "user4"],
+ "inheritReviewers": false,
+ "labels": ["cli github cherry pick :cherries:"],
+ "inheritLabels": true,
+};
+
+jest.mock("@bp/service/git/git-cli");
+jest.spyOn(GitHubClient.prototype, "createPullRequest");
+jest.spyOn(GitHubClient.prototype, "createPullRequestComment");
+jest.spyOn(GitClientFactory, "getOrCreate");
+
+let parser: ArgsParser;
+let runner: Runner;
+
+beforeAll(() => {
+ // create a temporary file
+ createTestFile(GITHUB_MERGED_PR_W_OVERRIDES_CONFIG_FILE_CONTENT_PATHNAME, JSON.stringify(GITHUB_MERGED_PR_W_OVERRIDES_CONFIG_FILE_CONTENT));
+});
+
+afterAll(() => {
+ // clean up all temporary files
+ removeTestFile(GITHUB_MERGED_PR_W_OVERRIDES_CONFIG_FILE_CONTENT_PATHNAME);
+});
+
+beforeEach(() => {
+ // reset process.env variables
+ resetProcessArgs();
+
+ // reset git env tokens
+ resetEnvTokens();
+
+ // mock octokit
+ mockCodebergClient();
+
+ // create CLI arguments parser
+ parser = new CLIArgsParser();
+
+ // create runner
+ runner = new Runner(parser);
+});
+
+describe("cli runner", () => {
+
+ test("with dry run", async () => {
+ addProcessArgs([
+ "-d",
+ "-tb",
+ "target",
+ "-pr",
+ "https://codeberg.org/owner/reponame/pulls/2368"
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.CODEBERG, undefined, "https://codeberg.org/api/v1");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://codeberg.org/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(0);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(0);
+ expect(GitHubClient.prototype.createPullRequestComment).toBeCalledTimes(0);
+ });
+
+ test("overriding author", async () => {
+ addProcessArgs([
+ "-d",
+ "-tb",
+ "target",
+ "-pr",
+ "https://codeberg.org/owner/reponame/pulls/2368"
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://codeberg.org/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(0);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(0);
+ });
+
+ test("with relative folder", async () => {
+ addProcessArgs([
+ "-d",
+ "-tb",
+ "target",
+ "-pr",
+ "https://codeberg.org/owner/reponame/pulls/2368",
+ "-f",
+ "folder"
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/folder";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.CODEBERG, undefined, "https://codeberg.org/api/v1");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://codeberg.org/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.addRemote).toBeCalledTimes(0);
+ expect(GitCLIService.prototype.addRemote).toBeCalledTimes(0);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(0);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(0);
+ });
+
+ test("with absolute folder", async () => {
+ addProcessArgs([
+ "-d",
+ "-tb",
+ "target",
+ "-pr",
+ "https://codeberg.org/owner/reponame/pulls/2368",
+ "-f",
+ "/tmp/folder"
+ ]);
+
+ await runner.execute();
+
+ const cwd = "/tmp/folder";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.CODEBERG, undefined, "https://codeberg.org/api/v1");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://codeberg.org/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(0);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(0);
+ });
+
+ test("without dry run", async () => {
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://codeberg.org/owner/reponame/pulls/2368"
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.CODEBERG, undefined, "https://codeberg.org/api/v1");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://codeberg.org/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-target-28f63db",
+ base: "target",
+ title: "[target] PR Title",
+ body: "**Backport:** https://codeberg.org/owner/reponame/pulls/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ }
+ );
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(1);
+ });
+
+ test("same owner", async () => {
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://codeberg.org/owner/reponame/pulls/8632"
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.CODEBERG, undefined, "https://codeberg.org/api/v1");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://codeberg.org/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(0);
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-target-28f63db",
+ base: "target",
+ title: "[target] PR Title",
+ body: "**Backport:** https://codeberg.org/owner/reponame/pulls/8632\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ }
+ );
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(1);
+ expect(GitHubClient.prototype.createPullRequestComment).toBeCalledTimes(0);
+ });
+
+ test("closed and not merged pull request", async () => {
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://codeberg.org/owner/reponame/pulls/6666"
+ ]);
+
+ await expect(() => runner.execute()).rejects.toThrow("Provided pull request is closed and not merged");
+ });
+
+ test("open pull request simple", async () => {
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://codeberg.org/owner/reponame/pulls/4444"
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.CODEBERG, undefined, "https://codeberg.org/api/v1");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://codeberg.org/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-9174896");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/4444/head:pr/4444");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "91748965051fae1330ad58d15cf694e103267c87", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-9174896");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-target-9174896",
+ base: "target",
+ title: "[target] PR Title",
+ body: "**Backport:** https://codeberg.org/owner/reponame/pulls/4444\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ }
+ );
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(1);
+ });
+
+ test("open pull request with --auto-no-squash", async () => {
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://codeberg.org/owner/reponame/pulls/4444",
+ "--auto-no-squash",
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.CODEBERG, undefined, "https://codeberg.org/api/v1");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://codeberg.org/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-11da4e3-0404fb9");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/4444/head:pr/4444");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(2);
+ expect(GitCLIService.prototype.cherryPick).toHaveBeenLastCalledWith(cwd, "0404fb922ab75c3a8aecad5c97d9af388df04695", undefined, undefined, undefined);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "11da4e38aa3e577ffde6d546f1c52e53b04d3151", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-11da4e3-0404fb9");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-target-11da4e3-0404fb9",
+ base: "target",
+ title: "[target] PR Title",
+ body: "**Backport:** https://codeberg.org/owner/reponame/pulls/4444\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ }
+ );
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(1);
+ });
+
+ test("override backporting pr data", async () => {
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://codeberg.org/owner/reponame/pulls/2368",
+ "--title",
+ "New Title",
+ "--body",
+ "New Body",
+ "--body-prefix",
+ "New Body Prefix\\r\\n\\r\\n",
+ "--bp-branch-name",
+ "bp_branch_name",
+ "--reviewers",
+ "user1,user2",
+ "--assignees",
+ "user3,user4",
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.CODEBERG, undefined, "https://codeberg.org/api/v1");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://codeberg.org/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp_branch_name");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp_branch_name");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp_branch_name",
+ base: "target",
+ title: "New Title",
+ body: "New Body Prefix\r\n\r\nNew Body",
+ reviewers: ["user1", "user2"],
+ assignees: ["user3", "user4"],
+ labels: [],
+ comments: [],
+ }
+ );
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(1);
+ });
+
+ test("set empty reviewers", async () => {
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://codeberg.org/owner/reponame/pulls/2368",
+ "--title",
+ "New Title",
+ "--body",
+ "New Body",
+ "--body-prefix",
+ "New Body Prefix - ",
+ "--bp-branch-name",
+ "bp_branch_name",
+ "--no-inherit-reviewers",
+ "--assignees",
+ "user3,user4",
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.CODEBERG, undefined, "https://codeberg.org/api/v1");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://codeberg.org/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp_branch_name");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp_branch_name");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp_branch_name",
+ base: "target",
+ title: "New Title",
+ body: "New Body Prefix - New Body",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ labels: [],
+ comments: [],
+ }
+ );
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(1);
+ });
+
+ test("set custom labels with inheritance", async () => {
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://codeberg.org/owner/reponame/pulls/2368",
+ "--labels",
+ "cherry-pick :cherries:, backport prod",
+ "--inherit-labels",
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.CODEBERG, undefined, "https://codeberg.org/api/v1");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://codeberg.org/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-target-28f63db",
+ base: "target",
+ title: "[target] PR Title",
+ body: "**Backport:** https://codeberg.org/owner/reponame/pulls/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: ["cherry-pick :cherries:", "backport prod"],
+ comments: [],
+ }
+ );
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(1);
+ });
+
+ test("set custom labels without inheritance", async () => {
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://codeberg.org/owner/reponame/pulls/2368",
+ "--labels",
+ "first-label, second-label ",
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.CODEBERG, undefined, "https://codeberg.org/api/v1");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://codeberg.org/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-target-28f63db",
+ base: "target",
+ title: "[target] PR Title",
+ body: "**Backport:** https://codeberg.org/owner/reponame/pulls/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: ["first-label", "second-label"],
+ comments: [],
+ }
+ );
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(1);
+ });
+
+ test("using config file with overrides", async () => {
+ addProcessArgs([
+ "--config-file",
+ GITHUB_MERGED_PR_W_OVERRIDES_CONFIG_FILE_CONTENT_PATHNAME,
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.CODEBERG, "my-auth-token", "https://codeberg.org/api/v1");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://codeberg.org/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp_branch_name");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp_branch_name");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp_branch_name",
+ base: "target",
+ title: "New Title",
+ body: "New Body Prefix - New Body",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ labels: ["cli github cherry pick :cherries:", "backport prod"],
+ comments: [],
+ }
+ );
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(1);
+ });
+
+ // to check: https://codeberg.org/kiegroup/git-backporting/issues/52
+ test("using codeberg api url instead of html one", async () => {
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://codeberg.org/api/v1/repos/owner/reponame/pulls/2368"
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.CODEBERG, undefined, "https://codeberg.org/api/v1");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://codeberg.org/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-target-28f63db",
+ base: "target",
+ title: "[target] PR Title",
+ body: "**Backport:** https://codeberg.org/owner/reponame/pulls/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ }
+ );
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(1);
+ });
+
+ test("multiple commits pr", async () => {
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://codeberg.org/owner/reponame/pulls/8632",
+ "--no-squash",
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.CODEBERG, undefined, "https://codeberg.org/api/v1");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://codeberg.org/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-11da4e3-0404fb9");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(0);
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(2);
+ expect(GitCLIService.prototype.cherryPick).toHaveBeenLastCalledWith(cwd, "0404fb922ab75c3a8aecad5c97d9af388df04695", undefined, undefined, undefined);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "11da4e38aa3e577ffde6d546f1c52e53b04d3151", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-11da4e3-0404fb9");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-target-11da4e3-0404fb9",
+ base: "target",
+ title: "[target] PR Title",
+ body: "**Backport:** https://codeberg.org/owner/reponame/pulls/8632\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ }
+ );
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(1);
+ });
+
+ test("too long bp branch name", async () => {
+ // 260 chars
+ const tooLongBranchName = "too-long-branch-name".repeat(13);
+
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://codeberg.org/owner/reponame/pulls/2368",
+ "--bp-branch-name",
+ tooLongBranchName,
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ const truncatedBranch = tooLongBranchName.slice(0, 250);
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.CODEBERG, undefined, "https://codeberg.org/api/v1");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://codeberg.org/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, truncatedBranch);
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, truncatedBranch);
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: truncatedBranch,
+ base: "target",
+ title: "[target] PR Title",
+ body: "**Backport:** https://codeberg.org/owner/reponame/pulls/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ }
+ );
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(1);
+ });
+
+ test("multiple commits pr with different strategy", async () => {
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://codeberg.org/owner/reponame/pulls/8632",
+ "--no-squash",
+ "--strategy",
+ "ort",
+ "--strategy-option",
+ "find-renames",
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.CODEBERG, undefined, "https://codeberg.org/api/v1");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://codeberg.org/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-11da4e3-0404fb9");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(0);
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(2);
+ expect(GitCLIService.prototype.cherryPick).toHaveBeenLastCalledWith(cwd, "0404fb922ab75c3a8aecad5c97d9af388df04695", "ort", "find-renames", undefined);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "11da4e38aa3e577ffde6d546f1c52e53b04d3151", "ort", "find-renames", undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-11da4e3-0404fb9");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-target-11da4e3-0404fb9",
+ base: "target",
+ title: "[target] PR Title",
+ body: "**Backport:** https://codeberg.org/owner/reponame/pulls/8632\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ }
+ );
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(1);
+ });
+
+ test("additional pr comments", async () => {
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://codeberg.org/owner/reponame/pulls/8632",
+ "--comments",
+ "first comment; second comment",
+ "--body",
+ "New body"
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.CODEBERG, undefined, "https://codeberg.org/api/v1");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://codeberg.org/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(0);
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-target-28f63db",
+ base: "target",
+ title: "[target] PR Title",
+ body: "**Backport:** https://codeberg.org/owner/reponame/pulls/8632\r\n\r\nNew body",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: ["first comment", "second comment"],
+ }
+ );
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(1);
+ });
+
+ test("with multiple target branches", async () => {
+ addProcessArgs([
+ "-tb",
+ "v1, v2, v3",
+ "-pr",
+ "https://codeberg.org/owner/reponame/pulls/2368",
+ "-f",
+ "/tmp/folder"
+ ]);
+
+ await runner.execute();
+
+ const cwd = "/tmp/folder";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.CODEBERG, undefined, "https://codeberg.org/api/v1");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://codeberg.org/owner/reponame.git", cwd, "v1");
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://codeberg.org/owner/reponame.git", cwd, "v2");
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://codeberg.org/owner/reponame.git", cwd, "v3");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-v1-28f63db");
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-v2-28f63db");
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-v3-28f63db");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-v1-28f63db");
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-v2-28f63db");
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-v3-28f63db");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(3);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-v1-28f63db",
+ base: "v1",
+ title: "[v1] PR Title",
+ body: "**Backport:** https://codeberg.org/owner/reponame/pulls/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ });
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-v2-28f63db",
+ base: "v2",
+ title: "[v2] PR Title",
+ body: "**Backport:** https://codeberg.org/owner/reponame/pulls/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ });
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-v3-28f63db",
+ base: "v3",
+ title: "[v3] PR Title",
+ body: "**Backport:** https://codeberg.org/owner/reponame/pulls/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ });
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(3);
+ });
+
+ test("with multiple target branches and multiple bp names", async () => {
+ addProcessArgs([
+ "-tb",
+ "v1, v2, v3",
+ "-pr",
+ "https://codeberg.org/owner/reponame/pulls/2368",
+ "-f",
+ "/tmp/folder",
+ "--bp-branch-name",
+ "custom1, custom1, custom2, custom3",
+ ]);
+
+ await runner.execute();
+
+ const cwd = "/tmp/folder";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.CODEBERG, undefined, "https://codeberg.org/api/v1");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://codeberg.org/owner/reponame.git", cwd, "v1");
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://codeberg.org/owner/reponame.git", cwd, "v2");
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://codeberg.org/owner/reponame.git", cwd, "v3");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "custom1");
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "custom2");
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "custom3");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "custom1");
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "custom2");
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "custom3");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(3);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "custom1",
+ base: "v1",
+ title: "[v1] PR Title",
+ body: "**Backport:** https://codeberg.org/owner/reponame/pulls/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ });
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "custom2",
+ base: "v2",
+ title: "[v2] PR Title",
+ body: "**Backport:** https://codeberg.org/owner/reponame/pulls/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ });
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "custom3",
+ base: "v3",
+ title: "[v3] PR Title",
+ body: "**Backport:** https://codeberg.org/owner/reponame/pulls/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ });
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(3);
+ });
+
+ test("with multiple target branches and one failure", async () => {
+ jest.spyOn(GitHubClient.prototype, "createPullRequest").mockImplementation((_backport: BackportPullRequest) => {
+
+ throw new Error("Mocked error");
+ });
+
+ addProcessArgs([
+ "-tb",
+ "v1, v2, v3",
+ "-pr",
+ "https://codeberg.org/owner/reponame/pulls/2368",
+ "-f",
+ "/tmp/folder",
+ "--bp-branch-name",
+ "custom-failure-head",
+ ]);
+
+ await expect(() => runner.execute()).rejects.toThrowError("Failure occurred during one of the backports: [Error: Mocked error ; Error: Mocked error ; Error: Mocked error]");
+
+ const cwd = "/tmp/folder";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.CODEBERG, undefined, "https://codeberg.org/api/v1");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://codeberg.org/owner/reponame.git", cwd, "v1");
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://codeberg.org/owner/reponame.git", cwd, "v2");
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://codeberg.org/owner/reponame.git", cwd, "v3");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "custom-failure-head-v1");
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "custom-failure-head-v2");
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "custom-failure-head-v3");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "custom-failure-head-v1");
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "custom-failure-head-v2");
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "custom-failure-head-v3");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(3);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "custom-failure-head-v1",
+ base: "v1",
+ title: "[v1] PR Title",
+ body: "**Backport:** https://codeberg.org/owner/reponame/pulls/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ });
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "custom-failure-head-v2",
+ base: "v2",
+ title: "[v2] PR Title",
+ body: "**Backport:** https://codeberg.org/owner/reponame/pulls/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ });
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "custom-failure-head-v3",
+ base: "v3",
+ title: "[v3] PR Title",
+ body: "**Backport:** https://codeberg.org/owner/reponame/pulls/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ });
+ expect(GitHubClient.prototype.createPullRequest).toThrowError();
+ expect(GitHubClient.prototype.createPullRequestComment).toBeCalledTimes(0);
+ });
+
+ test("auth using CODEBERG_TOKEN takes precedence over GIT_TOKEN env variable", async () => {
+ process.env[AuthTokenId.GIT_TOKEN] = "mygittoken";
+ process.env[AuthTokenId.CODEBERG_TOKEN] = "mycodebergtoken";
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://codeberg.org/owner/reponame/pulls/8632"
+ ]);
+
+ await runner.execute();
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.CODEBERG, "mycodebergtoken", "https://codeberg.org/api/v1");
+
+ // Not interested in all subsequent calls, already tested in other test cases
+ });
+
+ test("auth arg takes precedence over CODEBERG_TOKEN", async () => {
+ process.env[AuthTokenId.CODEBERG_TOKEN] = "mycodebergtoken";
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://codeberg.org/owner/reponame/pulls/8632",
+ "-a",
+ "mytoken"
+ ]);
+
+ await runner.execute();
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.CODEBERG, "mytoken", "https://codeberg.org/api/v1");
+
+ // Not interested in all subsequent calls, already tested in other test cases
+ });
+
+ test("ignore env variables related to other git platforms", async () => {
+ process.env[AuthTokenId.GITLAB_TOKEN] = "mygitlabtoken";
+ process.env[AuthTokenId.GITHUB_TOKEN] = "mygithubtoken";
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://codeberg.org/owner/reponame/pulls/8632"
+ ]);
+
+ await runner.execute();
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.CODEBERG, undefined, "https://codeberg.org/api/v1");
+
+ // Not interested in all subsequent calls, already tested in other test cases
+ });
+
+ test("extract target branch from label", async () => {
+ addProcessArgs([
+ "--target-branch-pattern",
+ "^backport (?([^ ]+))$",
+ "-pr",
+ "https://codeberg.org/owner/reponame/pulls/2368"
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.CODEBERG, undefined, "https://codeberg.org/api/v1");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://codeberg.org/owner/reponame.git", cwd, "prod");
+ });
+
+ test("with multiple target branches, one failure and error notification enabled", async () => {
+ jest.spyOn(GitHubClient.prototype, "createPullRequest").mockImplementation((backport: BackportPullRequest) => {
+ throw new Error(`Mocked error: ${backport.base}`);
+ });
+
+ addProcessArgs([
+ "-tb",
+ "v1, v2, v3",
+ "-pr",
+ "https://codeberg.org/owner/reponame/pulls/2368",
+ "-f",
+ "/tmp/folder",
+ "--bp-branch-name",
+ "custom-failure-head",
+ "--enable-err-notification",
+ ]);
+
+ await expect(() => runner.execute()).rejects.toThrowError("Failure occurred during one of the backports: [Error: Mocked error: v1 ; Error: Mocked error: v2 ; Error: Mocked error: v3]");
+
+ const cwd = "/tmp/folder";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.CODEBERG, undefined, "https://codeberg.org/api/v1");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://codeberg.org/owner/reponame.git", cwd, "v1");
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://codeberg.org/owner/reponame.git", cwd, "v2");
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://codeberg.org/owner/reponame.git", cwd, "v3");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "custom-failure-head-v1");
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "custom-failure-head-v2");
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "custom-failure-head-v3");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "custom-failure-head-v1");
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "custom-failure-head-v2");
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "custom-failure-head-v3");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(3);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "custom-failure-head-v1",
+ base: "v1",
+ title: "[v1] PR Title",
+ body: "**Backport:** https://codeberg.org/owner/reponame/pulls/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ });
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "custom-failure-head-v2",
+ base: "v2",
+ title: "[v2] PR Title",
+ body: "**Backport:** https://codeberg.org/owner/reponame/pulls/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ });
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "custom-failure-head-v3",
+ base: "v3",
+ title: "[v3] PR Title",
+ body: "**Backport:** https://codeberg.org/owner/reponame/pulls/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ });
+ expect(GitHubClient.prototype.createPullRequest).toThrowError();
+ expect(GitHubClient.prototype.createPullRequestComment).toBeCalledTimes(3);
+ expect(GitHubClient.prototype.createPullRequestComment).toBeCalledWith("https://codeberg.org/api/v1/repos/owner/reponame/pulls/2368", "The backport to `v1` failed. Check the latest run for more details.");
+ expect(GitHubClient.prototype.createPullRequestComment).toBeCalledWith("https://codeberg.org/api/v1/repos/owner/reponame/pulls/2368", "The backport to `v2` failed. Check the latest run for more details.");
+ expect(GitHubClient.prototype.createPullRequestComment).toBeCalledWith("https://codeberg.org/api/v1/repos/owner/reponame/pulls/2368", "The backport to `v3` failed. Check the latest run for more details.");
+ });
+
+ test("with some failures and dry run enabled", async () => {
+ jest.spyOn(GitCLIService.prototype, "cherryPick").mockImplementation((cwd: string, sha: string) => {
+ throw new Error(`Forced error: ${sha}`);
+ });
+
+ addProcessArgs([
+ "-tb",
+ "v1, v2, v3",
+ "-pr",
+ "https://codeberg.org/owner/reponame/pulls/2368",
+ "-f",
+ "/tmp/folder",
+ "--bp-branch-name",
+ "custom-failure-head",
+ "--enable-err-notification",
+ "--dry-run",
+ ]);
+
+ await expect(() => runner.execute()).rejects.toThrowError("Failure occurred during one of the backports: [Error: Forced error: 28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc ; Error: Forced error: 28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc ; Error: Forced error: 28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc]");
+
+ const cwd = "/tmp/folder";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.CODEBERG, undefined, "https://codeberg.org/api/v1");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://codeberg.org/owner/reponame.git", cwd, "v1");
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://codeberg.org/owner/reponame.git", cwd, "v2");
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://codeberg.org/owner/reponame.git", cwd, "v3");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "custom-failure-head-v1");
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "custom-failure-head-v2");
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "custom-failure-head-v3");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.cherryPick).toThrowError();
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(0);
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(0);
+ expect(GitHubClient.prototype.createPullRequestComment).toBeCalledTimes(0);
+ });
+});
diff --git a/test/service/runner/cli-github-runner.test.ts b/test/service/runner/cli-github-runner.test.ts
new file mode 100644
index 0000000..53a4505
--- /dev/null
+++ b/test/service/runner/cli-github-runner.test.ts
@@ -0,0 +1,1376 @@
+import ArgsParser from "@bp/service/args/args-parser";
+import Runner from "@bp/service/runner/runner";
+import GitCLIService from "@bp/service/git/git-cli";
+import GitHubClient from "@bp/service/git/github/github-client";
+import CLIArgsParser from "@bp/service/args/cli/cli-args-parser";
+import { addProcessArgs, createTestFile, removeTestFile, resetEnvTokens, resetProcessArgs } from "../../support/utils";
+import { mockGitHubClient } from "../../support/mock/git-client-mock-support";
+import GitClientFactory from "@bp/service/git/git-client-factory";
+import { BackportPullRequest, GitClientType } from "@bp/service/git/git.types";
+import { AuthTokenId } from "@bp/service/configs/configs.types";
+
+const GITHUB_MERGED_PR_W_OVERRIDES_CONFIG_FILE_CONTENT_PATHNAME = "./cli-github-runner-pr-merged-with-overrides.json";
+const GITHUB_MERGED_PR_W_OVERRIDES_CONFIG_FILE_CONTENT = {
+ "dryRun": false,
+ "auth": "my-auth-token",
+ "pullRequest": "https://github.com/owner/reponame/pull/2368",
+ "targetBranch": "target",
+ "gitUser": "Me",
+ "gitEmail": "me@email.com",
+ "title": "New Title",
+ "body": "New Body",
+ "bodyPrefix": "New Body Prefix - ",
+ "bpBranchName": "bp_branch_name",
+ "reviewers": [],
+ "assignees": ["user3", "user4"],
+ "inheritReviewers": false,
+ "labels": ["cli github cherry pick :cherries:"],
+ "inheritLabels": true,
+};
+
+jest.mock("@bp/service/git/git-cli");
+jest.spyOn(GitHubClient.prototype, "createPullRequest");
+jest.spyOn(GitHubClient.prototype, "createPullRequestComment");
+jest.spyOn(GitClientFactory, "getOrCreate");
+
+let parser: ArgsParser;
+let runner: Runner;
+
+beforeAll(() => {
+ // create a temporary file
+ createTestFile(GITHUB_MERGED_PR_W_OVERRIDES_CONFIG_FILE_CONTENT_PATHNAME, JSON.stringify(GITHUB_MERGED_PR_W_OVERRIDES_CONFIG_FILE_CONTENT));
+});
+
+afterAll(() => {
+ // clean up all temporary files
+ removeTestFile(GITHUB_MERGED_PR_W_OVERRIDES_CONFIG_FILE_CONTENT_PATHNAME);
+});
+
+beforeEach(() => {
+ // reset process.env variables
+ resetProcessArgs();
+
+ // reset git env tokens
+ resetEnvTokens();
+
+ // mock octokit
+ mockGitHubClient();
+
+ // create CLI arguments parser
+ parser = new CLIArgsParser();
+
+ // create runner
+ runner = new Runner(parser);
+});
+
+describe("cli runner", () => {
+
+ test("with dry run", async () => {
+ addProcessArgs([
+ "-d",
+ "-tb",
+ "target",
+ "-pr",
+ "https://github.com/owner/reponame/pull/2368"
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITHUB, undefined, "https://api.github.com");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(0);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(0);
+ expect(GitHubClient.prototype.createPullRequestComment).toBeCalledTimes(0);
+ });
+
+ test("overriding author", async () => {
+ addProcessArgs([
+ "-d",
+ "-tb",
+ "target",
+ "-pr",
+ "https://github.com/owner/reponame/pull/2368"
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(0);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(0);
+ });
+
+ test("with relative folder", async () => {
+ addProcessArgs([
+ "-d",
+ "-tb",
+ "target",
+ "-pr",
+ "https://github.com/owner/reponame/pull/2368",
+ "-f",
+ "folder"
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/folder";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITHUB, undefined, "https://api.github.com");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.addRemote).toBeCalledTimes(0);
+ expect(GitCLIService.prototype.addRemote).toBeCalledTimes(0);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(0);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(0);
+ });
+
+ test("with absolute folder", async () => {
+ addProcessArgs([
+ "-d",
+ "-tb",
+ "target",
+ "-pr",
+ "https://github.com/owner/reponame/pull/2368",
+ "-f",
+ "/tmp/folder"
+ ]);
+
+ await runner.execute();
+
+ const cwd = "/tmp/folder";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITHUB, undefined, "https://api.github.com");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(0);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(0);
+ });
+
+ test("without dry run", async () => {
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://github.com/owner/reponame/pull/2368"
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITHUB, undefined, "https://api.github.com");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-target-28f63db",
+ base: "target",
+ title: "[target] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ }
+ );
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(1);
+ });
+
+ test("same owner", async () => {
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://github.com/owner/reponame/pull/8632"
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITHUB, undefined, "https://api.github.com");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(0);
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-target-28f63db",
+ base: "target",
+ title: "[target] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/8632\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ }
+ );
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(1);
+ expect(GitHubClient.prototype.createPullRequestComment).toBeCalledTimes(0);
+ });
+
+ test("closed and not merged pull request", async () => {
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://github.com/owner/reponame/pull/6666"
+ ]);
+
+ await expect(() => runner.execute()).rejects.toThrow("Provided pull request is closed and not merged");
+ });
+
+ test("open pull request simple", async () => {
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://github.com/owner/reponame/pull/4444"
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITHUB, undefined, "https://api.github.com");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-9174896");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/4444/head:pr/4444");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "91748965051fae1330ad58d15cf694e103267c87", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-9174896");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-target-9174896",
+ base: "target",
+ title: "[target] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/4444\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ }
+ );
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(1);
+ });
+
+ test("open pull request with --auto-no-squash", async () => {
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://github.com/owner/reponame/pull/4444",
+ "--auto-no-squash",
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITHUB, undefined, "https://api.github.com");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-0404fb9-11da4e3");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/4444/head:pr/4444");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(2);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "0404fb922ab75c3a8aecad5c97d9af388df04695", undefined, undefined, undefined);
+ expect(GitCLIService.prototype.cherryPick).toHaveBeenLastCalledWith(cwd, "11da4e38aa3e577ffde6d546f1c52e53b04d3151", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-0404fb9-11da4e3");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-target-0404fb9-11da4e3",
+ base: "target",
+ title: "[target] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/4444\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ }
+ );
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(1);
+ });
+
+ test("override backporting pr data", async () => {
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://github.com/owner/reponame/pull/2368",
+ "--title",
+ "New Title",
+ "--body",
+ "New Body",
+ "--body-prefix",
+ "New Body Prefix\\r\\n\\r\\n",
+ "--bp-branch-name",
+ "bp_branch_name",
+ "--reviewers",
+ "user1,user2",
+ "--assignees",
+ "user3,user4",
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITHUB, undefined, "https://api.github.com");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp_branch_name");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp_branch_name");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp_branch_name",
+ base: "target",
+ title: "New Title",
+ body: "New Body Prefix\r\n\r\nNew Body",
+ reviewers: ["user1", "user2"],
+ assignees: ["user3", "user4"],
+ labels: [],
+ comments: [],
+ }
+ );
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(1);
+ });
+
+ test("set empty reviewers", async () => {
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://github.com/owner/reponame/pull/2368",
+ "--title",
+ "New Title",
+ "--body",
+ "New Body",
+ "--body-prefix",
+ "New Body Prefix - ",
+ "--bp-branch-name",
+ "bp_branch_name",
+ "--no-inherit-reviewers",
+ "--assignees",
+ "user3,user4",
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITHUB, undefined, "https://api.github.com");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp_branch_name");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp_branch_name");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp_branch_name",
+ base: "target",
+ title: "New Title",
+ body: "New Body Prefix - New Body",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ labels: [],
+ comments: [],
+ }
+ );
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(1);
+ });
+
+ test("set custom labels with inheritance", async () => {
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://github.com/owner/reponame/pull/2368",
+ "--labels",
+ "cherry-pick :cherries:, backport prod",
+ "--inherit-labels",
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITHUB, undefined, "https://api.github.com");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-target-28f63db",
+ base: "target",
+ title: "[target] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: ["cherry-pick :cherries:", "backport prod"],
+ comments: [],
+ }
+ );
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(1);
+ });
+
+ test("set custom labels without inheritance", async () => {
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://github.com/owner/reponame/pull/2368",
+ "--labels",
+ "first-label, second-label ",
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITHUB, undefined, "https://api.github.com");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-target-28f63db",
+ base: "target",
+ title: "[target] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: ["first-label", "second-label"],
+ comments: [],
+ }
+ );
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(1);
+ });
+
+ test("using config file with overrides", async () => {
+ addProcessArgs([
+ "--config-file",
+ GITHUB_MERGED_PR_W_OVERRIDES_CONFIG_FILE_CONTENT_PATHNAME,
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITHUB, "my-auth-token", "https://api.github.com");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp_branch_name");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp_branch_name");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp_branch_name",
+ base: "target",
+ title: "New Title",
+ body: "New Body Prefix - New Body",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ labels: ["cli github cherry pick :cherries:", "backport prod"],
+ comments: [],
+ }
+ );
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(1);
+ });
+
+ // to check: https://github.com/kiegroup/git-backporting/issues/52
+ test("using github api url instead of html one", async () => {
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://api.github.com/repos/owner/reponame/pulls/2368"
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITHUB, undefined, "https://api.github.com");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-target-28f63db",
+ base: "target",
+ title: "[target] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ }
+ );
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(1);
+ });
+
+ test("multiple commits pr", async () => {
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://github.com/owner/reponame/pull/8632",
+ "--no-squash",
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITHUB, undefined, "https://api.github.com");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-0404fb9-11da4e3");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(0);
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(2);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "0404fb922ab75c3a8aecad5c97d9af388df04695", undefined, undefined, undefined);
+ expect(GitCLIService.prototype.cherryPick).toHaveBeenLastCalledWith(cwd, "11da4e38aa3e577ffde6d546f1c52e53b04d3151", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-0404fb9-11da4e3");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-target-0404fb9-11da4e3",
+ base: "target",
+ title: "[target] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/8632\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ }
+ );
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(1);
+ });
+
+ test("too long bp branch name", async () => {
+ // 260 chars
+ const tooLongBranchName = "too-long-branch-name".repeat(13);
+
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://github.com/owner/reponame/pull/2368",
+ "--bp-branch-name",
+ tooLongBranchName,
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ const truncatedBranch = tooLongBranchName.slice(0, 250);
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITHUB, undefined, "https://api.github.com");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, truncatedBranch);
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, truncatedBranch);
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: truncatedBranch,
+ base: "target",
+ title: "[target] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ }
+ );
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(1);
+ });
+
+ test("multiple commits pr with different strategy", async () => {
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://github.com/owner/reponame/pull/8632",
+ "--no-squash",
+ "--strategy",
+ "ort",
+ "--strategy-option",
+ "find-renames",
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITHUB, undefined, "https://api.github.com");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-0404fb9-11da4e3");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(0);
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(2);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "0404fb922ab75c3a8aecad5c97d9af388df04695", "ort", "find-renames", undefined);
+ expect(GitCLIService.prototype.cherryPick).toHaveBeenLastCalledWith(cwd, "11da4e38aa3e577ffde6d546f1c52e53b04d3151", "ort", "find-renames", undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-0404fb9-11da4e3");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-target-0404fb9-11da4e3",
+ base: "target",
+ title: "[target] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/8632\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ }
+ );
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(1);
+ });
+
+ test("additional pr comments", async () => {
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://github.com/owner/reponame/pull/8632",
+ "--comments",
+ "first comment; second comment",
+ "--body",
+ "New body"
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITHUB, undefined, "https://api.github.com");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(0);
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-target-28f63db",
+ base: "target",
+ title: "[target] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/8632\r\n\r\nNew body",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: ["first comment", "second comment"],
+ }
+ );
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(1);
+ });
+
+ test("with multiple target branches", async () => {
+ addProcessArgs([
+ "-tb",
+ "v1, v2, v3",
+ "-pr",
+ "https://github.com/owner/reponame/pull/2368",
+ "-f",
+ "/tmp/folder"
+ ]);
+
+ await runner.execute();
+
+ const cwd = "/tmp/folder";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITHUB, undefined, "https://api.github.com");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "v1");
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "v2");
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "v3");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-v1-28f63db");
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-v2-28f63db");
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-v3-28f63db");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-v1-28f63db");
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-v2-28f63db");
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-v3-28f63db");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(3);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-v1-28f63db",
+ base: "v1",
+ title: "[v1] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ });
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-v2-28f63db",
+ base: "v2",
+ title: "[v2] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ });
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-v3-28f63db",
+ base: "v3",
+ title: "[v3] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ });
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(3);
+ });
+
+ test("with multiple target branches and multiple bp names", async () => {
+ addProcessArgs([
+ "-tb",
+ "v1, v2, v3",
+ "-pr",
+ "https://github.com/owner/reponame/pull/2368",
+ "-f",
+ "/tmp/folder",
+ "--bp-branch-name",
+ "custom1, custom1, custom2, custom3",
+ ]);
+
+ await runner.execute();
+
+ const cwd = "/tmp/folder";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITHUB, undefined, "https://api.github.com");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "v1");
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "v2");
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "v3");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "custom1");
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "custom2");
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "custom3");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "custom1");
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "custom2");
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "custom3");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(3);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "custom1",
+ base: "v1",
+ title: "[v1] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ });
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "custom2",
+ base: "v2",
+ title: "[v2] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ });
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "custom3",
+ base: "v3",
+ title: "[v3] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ });
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(3);
+ });
+
+ test("with multiple target branches and one failure", async () => {
+ jest.spyOn(GitHubClient.prototype, "createPullRequest").mockImplementation((_backport: BackportPullRequest) => {
+
+ throw new Error("Mocked error");
+ });
+
+ addProcessArgs([
+ "-tb",
+ "v1, v2, v3",
+ "-pr",
+ "https://github.com/owner/reponame/pull/2368",
+ "-f",
+ "/tmp/folder",
+ "--bp-branch-name",
+ "custom-failure-head",
+ ]);
+
+ await expect(() => runner.execute()).rejects.toThrowError("Failure occurred during one of the backports: [Error: Mocked error ; Error: Mocked error ; Error: Mocked error]");
+
+ const cwd = "/tmp/folder";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITHUB, undefined, "https://api.github.com");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "v1");
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "v2");
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "v3");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "custom-failure-head-v1");
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "custom-failure-head-v2");
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "custom-failure-head-v3");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "custom-failure-head-v1");
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "custom-failure-head-v2");
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "custom-failure-head-v3");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(3);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "custom-failure-head-v1",
+ base: "v1",
+ title: "[v1] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ });
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "custom-failure-head-v2",
+ base: "v2",
+ title: "[v2] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ });
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "custom-failure-head-v3",
+ base: "v3",
+ title: "[v3] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ });
+ expect(GitHubClient.prototype.createPullRequest).toThrowError();
+ expect(GitHubClient.prototype.createPullRequestComment).toBeCalledTimes(0);
+ });
+
+ test("auth using GITHUB_TOKEN takes precedence over GIT_TOKEN env variable", async () => {
+ process.env[AuthTokenId.GIT_TOKEN] = "mygittoken";
+ process.env[AuthTokenId.GITHUB_TOKEN] = "mygithubtoken";
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://github.com/owner/reponame/pull/8632"
+ ]);
+
+ await runner.execute();
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITHUB, "mygithubtoken", "https://api.github.com");
+
+ // Not interested in all subsequent calls, already tested in other test cases
+ });
+
+ test("auth arg takes precedence over GITHUB_TOKEN", async () => {
+ process.env[AuthTokenId.GITHUB_TOKEN] = "mygithubtoken";
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://github.com/owner/reponame/pull/8632",
+ "-a",
+ "mytoken"
+ ]);
+
+ await runner.execute();
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITHUB, "mytoken", "https://api.github.com");
+
+ // Not interested in all subsequent calls, already tested in other test cases
+ });
+
+ test("ignore env variables related to other git platforms", async () => {
+ process.env[AuthTokenId.GITLAB_TOKEN] = "mygitlabtoken";
+ process.env[AuthTokenId.CODEBERG_TOKEN] = "mycodebergtoken";
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://github.com/owner/reponame/pull/8632"
+ ]);
+
+ await runner.execute();
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITHUB, undefined, "https://api.github.com");
+
+ // Not interested in all subsequent calls, already tested in other test cases
+ });
+
+ test("extract target branch from label", async () => {
+ addProcessArgs([
+ "--target-branch-pattern",
+ "^backport (?([^ ]+))$",
+ "-pr",
+ "https://github.com/owner/reponame/pull/2368"
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITHUB, undefined, "https://api.github.com");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "prod");
+ });
+
+ test("with multiple target branches, one failure and error notification enabled", async () => {
+ jest.spyOn(GitHubClient.prototype, "createPullRequest").mockImplementation((backport: BackportPullRequest) => {
+ throw new Error(`Mocked error: ${backport.base}`);
+ });
+
+ addProcessArgs([
+ "-tb",
+ "v1, v2, v3",
+ "-pr",
+ "https://github.com/owner/reponame/pull/2368",
+ "-f",
+ "/tmp/folder",
+ "--bp-branch-name",
+ "custom-failure-head",
+ "--enable-err-notification",
+ ]);
+
+ await expect(() => runner.execute()).rejects.toThrowError("Failure occurred during one of the backports: [Error: Mocked error: v1 ; Error: Mocked error: v2 ; Error: Mocked error: v3]");
+
+ const cwd = "/tmp/folder";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITHUB, undefined, "https://api.github.com");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "v1");
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "v2");
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "v3");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "custom-failure-head-v1");
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "custom-failure-head-v2");
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "custom-failure-head-v3");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "custom-failure-head-v1");
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "custom-failure-head-v2");
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "custom-failure-head-v3");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(3);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "custom-failure-head-v1",
+ base: "v1",
+ title: "[v1] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ });
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "custom-failure-head-v2",
+ base: "v2",
+ title: "[v2] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ });
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "custom-failure-head-v3",
+ base: "v3",
+ title: "[v3] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ });
+ expect(GitHubClient.prototype.createPullRequest).toThrowError();
+ expect(GitHubClient.prototype.createPullRequestComment).toBeCalledTimes(3);
+ expect(GitHubClient.prototype.createPullRequestComment).toBeCalledWith("https://api.github.com/repos/owner/reponame/pulls/2368", "The backport to `v1` failed. Check the latest run for more details.");
+ expect(GitHubClient.prototype.createPullRequestComment).toBeCalledWith("https://api.github.com/repos/owner/reponame/pulls/2368", "The backport to `v2` failed. Check the latest run for more details.");
+ expect(GitHubClient.prototype.createPullRequestComment).toBeCalledWith("https://api.github.com/repos/owner/reponame/pulls/2368", "The backport to `v3` failed. Check the latest run for more details.");
+ });
+
+ test("with some failures and dry run enabled", async () => {
+ jest.spyOn(GitCLIService.prototype, "cherryPick").mockImplementation((cwd: string, sha: string) => {
+ throw new Error(`Forced error: ${sha}`);
+ });
+
+ addProcessArgs([
+ "-tb",
+ "v1, v2, v3",
+ "-pr",
+ "https://github.com/owner/reponame/pull/2368",
+ "-f",
+ "/tmp/folder",
+ "--bp-branch-name",
+ "custom-failure-head",
+ "--enable-err-notification",
+ "--dry-run",
+ ]);
+
+ await expect(() => runner.execute()).rejects.toThrowError("Failure occurred during one of the backports: [Error: Forced error: 28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc ; Error: Forced error: 28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc ; Error: Forced error: 28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc]");
+
+ const cwd = "/tmp/folder";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITHUB, undefined, "https://api.github.com");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "v1");
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "v2");
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "v3");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "custom-failure-head-v1");
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "custom-failure-head-v2");
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "custom-failure-head-v3");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.cherryPick).toThrowError();
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(0);
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(0);
+ expect(GitHubClient.prototype.createPullRequestComment).toBeCalledTimes(0);
+ });
+});
diff --git a/test/service/runner/cli-gitlab-runner.test.ts b/test/service/runner/cli-gitlab-runner.test.ts
new file mode 100644
index 0000000..e066fe8
--- /dev/null
+++ b/test/service/runner/cli-gitlab-runner.test.ts
@@ -0,0 +1,705 @@
+import ArgsParser from "@bp/service/args/args-parser";
+import Runner from "@bp/service/runner/runner";
+import GitCLIService from "@bp/service/git/git-cli";
+import GitLabClient from "@bp/service/git/gitlab/gitlab-client";
+import CLIArgsParser from "@bp/service/args/cli/cli-args-parser";
+import { addProcessArgs, createTestFile, removeTestFile, resetEnvTokens, resetProcessArgs } from "../../support/utils";
+import { getAxiosMocked } from "../../support/mock/git-client-mock-support";
+import { MERGED_SQUASHED_MR } from "../../support/mock/gitlab-data";
+import GitClientFactory from "@bp/service/git/git-client-factory";
+import { GitClientType } from "@bp/service/git/git.types";
+import { AuthTokenId } from "@bp/service/configs/configs.types";
+
+const GITLAB_MERGED_PR_COMPLEX_CONFIG_FILE_CONTENT_PATHNAME = "./cli-gitlab-runner-pr-merged-with-overrides.json";
+const GITLAB_MERGED_PR_COMPLEX_CONFIG_FILE_CONTENT = {
+ "dryRun": false,
+ "auth": "my-token",
+ "pullRequest": `https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/${MERGED_SQUASHED_MR.iid}`,
+ "targetBranch": "prod",
+ "gitUser": "Me",
+ "gitEmail": "me@email.com",
+ "title": "New Title",
+ "body": "New Body",
+ "bodyPrefix": `**This is a backport:** https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/${MERGED_SQUASHED_MR.iid}`,
+ "reviewers": [],
+ "assignees": ["user3", "user4"],
+ "inheritReviewers": false,
+ "labels": ["cli gitlab cherry pick :cherries:"],
+ "inheritLabels": true,
+};
+
+jest.mock("axios", () => {
+ return {
+ create: () => ({
+ get: getAxiosMocked,
+ post: () => ({
+ data: {
+ iid: 1, // FIXME: I am not testing this atm
+ }
+ }),
+ put: async () => undefined,
+ }),
+ };
+});
+
+jest.mock("@bp/service/git/git-cli");
+jest.spyOn(GitLabClient.prototype, "createPullRequest");
+jest.spyOn(GitLabClient.prototype, "createPullRequestComment");
+jest.spyOn(GitClientFactory, "getOrCreate");
+
+
+let parser: ArgsParser;
+let runner: Runner;
+
+beforeAll(() => {
+ // create a temporary file
+ createTestFile(GITLAB_MERGED_PR_COMPLEX_CONFIG_FILE_CONTENT_PATHNAME, JSON.stringify(GITLAB_MERGED_PR_COMPLEX_CONFIG_FILE_CONTENT));
+});
+
+afterAll(() => {
+ // clean up all temporary files
+ removeTestFile(GITLAB_MERGED_PR_COMPLEX_CONFIG_FILE_CONTENT_PATHNAME);
+});
+
+beforeEach(() => {
+ // reset process.env variables
+ resetProcessArgs();
+
+ // reset git env tokens
+ resetEnvTokens();
+
+ // create CLI arguments parser
+ parser = new CLIArgsParser();
+
+ // create runner
+ runner = new Runner(parser);
+});
+
+describe("cli runner", () => {
+ test("with dry run", async () => {
+ addProcessArgs([
+ "-d",
+ "-tb",
+ "target",
+ "-pr",
+ "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/2"
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITLAB, undefined, "https://my.gitlab.host.com/api/v4");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://my.gitlab.host.com/superuser/backporting-example.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-9e15674");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "merge-requests/2/head:pr/2");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "9e15674ebd48e05c6e428a1fa31dbb60a778d644", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(0);
+ expect(GitLabClient.prototype.createPullRequest).toBeCalledTimes(0);
+ expect(GitLabClient.prototype.createPullRequestComment).toBeCalledTimes(0);
+ });
+
+ test("dry run with relative folder", async () => {
+ addProcessArgs([
+ "-d",
+ "-tb",
+ "target",
+ "-pr",
+ "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/2",
+ "-f",
+ "folder"
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/folder";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITLAB, undefined, "https://my.gitlab.host.com/api/v4");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://my.gitlab.host.com/superuser/backporting-example.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-9e15674");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "merge-requests/2/head:pr/2");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "9e15674ebd48e05c6e428a1fa31dbb60a778d644", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.addRemote).toBeCalledTimes(0);
+ expect(GitCLIService.prototype.addRemote).toBeCalledTimes(0);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(0);
+ expect(GitLabClient.prototype.createPullRequest).toBeCalledTimes(0);
+ });
+
+ test("without dry run", async () => {
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/2"
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITLAB, undefined, "https://my.gitlab.host.com/api/v4");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://my.gitlab.host.com/superuser/backporting-example.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-9e15674");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "merge-requests/2/head:pr/2");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "9e15674ebd48e05c6e428a1fa31dbb60a778d644", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-9e15674");
+
+ expect(GitLabClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitLabClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "superuser",
+ repo: "backporting-example",
+ head: "bp-target-9e15674",
+ base: "target",
+ title: "[target] Update test.txt opened",
+ body: expect.stringContaining("**Backport:** https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/2"),
+ reviewers: ["superuser"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ }
+ );
+ });
+
+ test("closed and not merged pull request", async () => {
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/3"
+ ]);
+
+ await expect(() => runner.execute()).rejects.toThrow("Provided pull request is closed and not merged");
+ expect(GitLabClient.prototype.createPullRequestComment).toBeCalledTimes(0);
+ });
+
+ test("merged pull request", async () => {
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/1"
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITLAB, undefined, "https://my.gitlab.host.com/api/v4");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://my.gitlab.host.com/superuser/backporting-example.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-ebb1eca");
+
+ // 0 occurrences as the mr is already merged and the owner is the same for
+ // both source and target repositories
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(0);
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "ebb1eca696c42fd067658bd9b5267709f78ef38e", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-ebb1eca");
+
+ expect(GitLabClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitLabClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "superuser",
+ repo: "backporting-example",
+ head: "bp-target-ebb1eca",
+ base: "target",
+ title: "[target] Update test.txt",
+ body: expect.stringContaining("**Backport:** https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/1"),
+ reviewers: ["superuser"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ }
+ );
+ expect(GitLabClient.prototype.createPullRequestComment).toBeCalledTimes(0);
+ });
+
+
+ test("override backporting pr data", async () => {
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/2",
+ "--title",
+ "New Title",
+ "--body",
+ "New Body",
+ "--body-prefix",
+ "New Body Prefix - ",
+ "--bp-branch-name",
+ "bp_branch_name",
+ "--reviewers",
+ "user1,user2",
+ "--assignees",
+ "user3,user4"
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITLAB, undefined, "https://my.gitlab.host.com/api/v4");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://my.gitlab.host.com/superuser/backporting-example.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp_branch_name");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "merge-requests/2/head:pr/2");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "9e15674ebd48e05c6e428a1fa31dbb60a778d644", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp_branch_name");
+
+ expect(GitLabClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitLabClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "superuser",
+ repo: "backporting-example",
+ head: "bp_branch_name",
+ base: "target",
+ title: "New Title",
+ body: "New Body Prefix - New Body",
+ reviewers: ["user1", "user2"],
+ assignees: ["user3", "user4"],
+ labels: [],
+ comments: [],
+ }
+ );
+ });
+
+ test("set empty reviewers", async () => {
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/2",
+ "--title",
+ "New Title",
+ "--body",
+ "New Body",
+ "--body-prefix",
+ "New Body Prefix - ",
+ "--bp-branch-name",
+ "bp_branch_name",
+ "--no-inherit-reviewers",
+ "--assignees",
+ "user3,user4",
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITLAB, undefined, "https://my.gitlab.host.com/api/v4");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://my.gitlab.host.com/superuser/backporting-example.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp_branch_name");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "merge-requests/2/head:pr/2");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "9e15674ebd48e05c6e428a1fa31dbb60a778d644", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp_branch_name");
+
+ expect(GitLabClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitLabClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "superuser",
+ repo: "backporting-example",
+ head: "bp_branch_name",
+ base: "target",
+ title: "New Title",
+ body: "New Body Prefix - New Body",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ labels: [],
+ comments: [],
+ }
+ );
+ });
+
+ test("set custom labels with inheritance", async () => {
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/1",
+ "--labels",
+ "cherry-pick :cherries:, another-label",
+ "--inherit-labels",
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITLAB, undefined, "https://my.gitlab.host.com/api/v4");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://my.gitlab.host.com/superuser/backporting-example.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-ebb1eca");
+
+ // 0 occurrences as the mr is already merged and the owner is the same for
+ // both source and target repositories
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(0);
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "ebb1eca696c42fd067658bd9b5267709f78ef38e", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-ebb1eca");
+
+ expect(GitLabClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitLabClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "superuser",
+ repo: "backporting-example",
+ head: "bp-target-ebb1eca",
+ base: "target",
+ title: "[target] Update test.txt",
+ body: expect.stringContaining("**Backport:** https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/1"),
+ reviewers: ["superuser"],
+ assignees: [],
+ labels: ["cherry-pick :cherries:", "another-label", "backport-prod"],
+ comments: [],
+ }
+ );
+ });
+
+ test("set custom labels without inheritance", async () => {
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/1",
+ "--labels",
+ "cherry-pick :cherries:, another-label",
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITLAB, undefined, "https://my.gitlab.host.com/api/v4");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://my.gitlab.host.com/superuser/backporting-example.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-ebb1eca");
+
+ // 0 occurrences as the mr is already merged and the owner is the same for
+ // both source and target repositories
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(0);
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "ebb1eca696c42fd067658bd9b5267709f78ef38e", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-ebb1eca");
+
+ expect(GitLabClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitLabClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "superuser",
+ repo: "backporting-example",
+ head: "bp-target-ebb1eca",
+ base: "target",
+ title: "[target] Update test.txt",
+ body: expect.stringContaining("**Backport:** https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/1"),
+ reviewers: ["superuser"],
+ assignees: [],
+ labels: ["cherry-pick :cherries:", "another-label"],
+ comments: [],
+ }
+ );
+ });
+
+ test("using config file with overrides", async () => {
+ addProcessArgs([
+ "--config-file",
+ GITLAB_MERGED_PR_COMPLEX_CONFIG_FILE_CONTENT_PATHNAME,
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITLAB, "my-token", "https://my.gitlab.host.com/api/v4");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://my.gitlab.host.com/superuser/backporting-example.git", cwd, "prod");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-prod-ebb1eca");
+
+ // 0 occurrences as the mr is already merged and the owner is the same for
+ // both source and target repositories
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(0);
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "ebb1eca696c42fd067658bd9b5267709f78ef38e", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-prod-ebb1eca");
+
+ expect(GitLabClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitLabClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "superuser",
+ repo: "backporting-example",
+ head: "bp-prod-ebb1eca",
+ base: "prod",
+ title: "New Title",
+ body: expect.stringContaining("**This is a backport:** https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/1"),
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ labels: ["cli gitlab cherry pick :cherries:", "backport-prod"],
+ comments: [],
+ }
+ );
+ });
+
+ test("single commit without squash", async () => {
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/1",
+ "--no-squash",
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITLAB, undefined, "https://my.gitlab.host.com/api/v4");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://my.gitlab.host.com/superuser/backporting-example.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-e4dd336");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "e4dd336a4a20f394df6665994df382fb1d193a11", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-e4dd336");
+
+ expect(GitLabClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitLabClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "superuser",
+ repo: "backporting-example",
+ head: "bp-target-e4dd336",
+ base: "target",
+ title: "[target] Update test.txt",
+ body: expect.stringContaining("**Backport:** https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/1"),
+ reviewers: ["superuser"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ }
+ );
+ });
+
+ test("multiple commits without squash", async () => {
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/2",
+ "--no-squash",
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITLAB, undefined, "https://my.gitlab.host.com/api/v4");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://my.gitlab.host.com/superuser/backporting-example.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-e4dd336-974519f");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "merge-requests/2/head:pr/2");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(2);
+ expect(GitCLIService.prototype.cherryPick).toHaveBeenNthCalledWith(1, cwd, "e4dd336a4a20f394df6665994df382fb1d193a11", undefined, undefined, undefined);
+ expect(GitCLIService.prototype.cherryPick).toHaveBeenNthCalledWith(2, cwd, "974519f65c9e0ed65277cd71026657a09fca05e7", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-e4dd336-974519f");
+
+ expect(GitLabClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitLabClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "superuser",
+ repo: "backporting-example",
+ head: "bp-target-e4dd336-974519f",
+ base: "target",
+ title: "[target] Update test.txt opened",
+ body: expect.stringContaining("**Backport:** https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/2"),
+ reviewers: ["superuser"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ }
+ );
+ });
+
+ test("merged MR with --auto-no-squash", async () => {
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/5",
+ "--auto-no-squash",
+ ]);
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITLAB, undefined, "https://my.gitlab.host.com/api/v4");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://my.gitlab.host.com/superuser/backporting-example.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-e4dd336");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "e4dd336a4a20f394df6665994df382fb1d193a11", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-e4dd336");
+
+ expect(GitLabClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitLabClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "superuser",
+ repo: "backporting-example",
+ head: "bp-target-e4dd336",
+ base: "target",
+ title: "[target] Update test.txt",
+ body: expect.stringContaining("**Backport:** https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/5"),
+ reviewers: ["superuser"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ }
+ );
+ });
+
+ test("auth using GITLAB_TOKEN takes precedence over GIT_TOKEN env variable", async () => {
+ process.env[AuthTokenId.GIT_TOKEN] = "mygittoken";
+ process.env[AuthTokenId.GITLAB_TOKEN] = "mygitlabtoken";
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/2"
+ ]);
+
+ await runner.execute();
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITLAB, "mygitlabtoken", "https://my.gitlab.host.com/api/v4");
+
+ // Not interested in all subsequent calls, already tested in other test cases
+ });
+
+ test("auth arg takes precedence over GITLAB_TOKEN", async () => {
+ process.env[AuthTokenId.GITLAB_TOKEN] = "mygitlabtoken";
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/2",
+ "-a",
+ "mytoken"
+ ]);
+
+ await runner.execute();
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITLAB, "mytoken", "https://my.gitlab.host.com/api/v4");
+
+ // Not interested in all subsequent calls, already tested in other test cases
+ });
+
+ test("ignore env variables related to other git platforms", async () => {
+ process.env[AuthTokenId.GITHUB_TOKEN] = "mygithubtoken";
+ process.env[AuthTokenId.CODEBERG_TOKEN] = "mycodebergtoken";
+ addProcessArgs([
+ "-tb",
+ "target",
+ "-pr",
+ "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/2"
+ ]);
+
+ await runner.execute();
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITLAB, undefined, "https://my.gitlab.host.com/api/v4");
+
+ // Not interested in all subsequent calls, already tested in other test cases
+ });
+});
\ No newline at end of file
diff --git a/test/service/runner/cli-runner.test.ts b/test/service/runner/cli-runner.test.ts
deleted file mode 100644
index f8c232d..0000000
--- a/test/service/runner/cli-runner.test.ts
+++ /dev/null
@@ -1,333 +0,0 @@
-import ArgsParser from "@bp/service/args/args-parser";
-import Runner from "@bp/service/runner/runner";
-import GitCLIService from "@bp/service/git/git-cli";
-import GitHubService from "@bp/service/git/github/github-service";
-import CLIArgsParser from "@bp/service/args/cli/cli-args-parser";
-import { addProcessArgs, resetProcessArgs } from "../../support/utils";
-import { setupMoctokit } from "../../support/moctokit/moctokit-support";
-
-jest.mock("@bp/service/git/git-cli");
-jest.spyOn(GitHubService.prototype, "createPullRequest");
-
-let parser: ArgsParser;
-let runner: Runner;
-
-beforeEach(() => {
- setupMoctokit();
-
- // create CLI arguments parser
- parser = new CLIArgsParser();
-
- // create runner
- runner = new Runner(parser);
-});
-
-afterEach(() => {
- jest.clearAllMocks();
-
- // reset process.env variables
- resetProcessArgs();
-});
-
-describe("cli runner", () => {
- test("with dry run", async () => {
- addProcessArgs([
- "-d",
- "-tb",
- "target",
- "-pr",
- "https://github.com/owner/reponame/pull/2368"
- ]);
-
- await runner.execute();
-
- const cwd = process.cwd() + "/bp";
-
- expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
- expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
-
- expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
- expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc");
-
- expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
- expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
-
- expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
- expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc");
-
- expect(GitCLIService.prototype.push).toBeCalledTimes(0);
- expect(GitHubService.prototype.createPullRequest).toBeCalledTimes(0);
- });
-
- test("overriding author", async () => {
- addProcessArgs([
- "-d",
- "-tb",
- "target",
- "-pr",
- "https://github.com/owner/reponame/pull/2368"
- ]);
-
- await runner.execute();
-
- const cwd = process.cwd() + "/bp";
-
- expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
- expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
-
- expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
- expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc");
-
- expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
- expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
-
- expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
- expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc");
-
- expect(GitCLIService.prototype.push).toBeCalledTimes(0);
- expect(GitHubService.prototype.createPullRequest).toBeCalledTimes(0);
- });
-
- test("with relative folder", async () => {
- addProcessArgs([
- "-d",
- "-tb",
- "target",
- "-pr",
- "https://github.com/owner/reponame/pull/2368",
- "-f",
- "folder"
- ]);
-
- await runner.execute();
-
- const cwd = process.cwd() + "/folder";
-
- expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
- expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
-
- expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
- expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc");
-
- expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
- expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
-
- expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
- expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc");
-
- expect(GitCLIService.prototype.addRemote).toBeCalledTimes(0);
- expect(GitCLIService.prototype.addRemote).toBeCalledTimes(0);
-
- expect(GitCLIService.prototype.push).toBeCalledTimes(0);
- expect(GitHubService.prototype.createPullRequest).toBeCalledTimes(0);
- });
-
- test("with absolute folder", async () => {
- addProcessArgs([
- "-d",
- "-tb",
- "target",
- "-pr",
- "https://github.com/owner/reponame/pull/2368",
- "-f",
- "/tmp/folder"
- ]);
-
- await runner.execute();
-
- const cwd = "/tmp/folder";
-
- expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
- expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
-
- expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
- expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc");
-
- expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
- expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
-
- expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
- expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc");
-
- expect(GitCLIService.prototype.push).toBeCalledTimes(0);
- expect(GitHubService.prototype.createPullRequest).toBeCalledTimes(0);
- });
-
- test("without dry run", async () => {
- addProcessArgs([
- "-tb",
- "target",
- "-pr",
- "https://github.com/owner/reponame/pull/2368"
- ]);
-
- await runner.execute();
-
- const cwd = process.cwd() + "/bp";
-
- expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
- expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
-
- expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
- expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc");
-
- expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
- expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
-
- expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
- expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc");
-
- expect(GitCLIService.prototype.push).toBeCalledTimes(1);
- expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc");
-
- expect(GitHubService.prototype.createPullRequest).toBeCalledTimes(1);
- expect(GitHubService.prototype.createPullRequest).toBeCalledWith({
- owner: "owner",
- repo: "reponame",
- head: "bp-target-28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc",
- base: "target",
- title: "[target] PR Title",
- body: expect.stringContaining("**Backport:** https://github.com/owner/reponame/pull/2368"),
- reviewers: ["gh-user", "that-s-a-user"]
- }
- );
- });
-
- test("same owner", async () => {
- addProcessArgs([
- "-tb",
- "target",
- "-pr",
- "https://github.com/owner/reponame/pull/8632"
- ]);
-
- await runner.execute();
-
- const cwd = process.cwd() + "/bp";
-
- expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
- expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
-
- expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
- expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc");
-
- expect(GitCLIService.prototype.fetch).toBeCalledTimes(0);
-
- expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
- expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc");
-
- expect(GitCLIService.prototype.push).toBeCalledTimes(1);
- expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc");
-
- expect(GitHubService.prototype.createPullRequest).toBeCalledTimes(1);
- expect(GitHubService.prototype.createPullRequest).toBeCalledWith({
- owner: "owner",
- repo: "reponame",
- head: "bp-target-28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc",
- base: "target",
- title: "[target] PR Title",
- body: expect.stringContaining("**Backport:** https://github.com/owner/reponame/pull/8632"),
- reviewers: ["gh-user", "that-s-a-user"]
- }
- );
- });
-
- test("closed and not merged pull request", async () => {
- addProcessArgs([
- "-tb",
- "target",
- "-pr",
- "https://github.com/owner/reponame/pull/6666"
- ]);
-
- expect(async () => await runner.execute()).rejects.toThrow("Provided pull request is closed and not merged!");
- });
-
- test("open pull request", async () => {
- addProcessArgs([
- "-tb",
- "target",
- "-pr",
- "https://github.com/owner/reponame/pull/4444"
- ]);
-
- await runner.execute();
-
- const cwd = process.cwd() + "/bp";
-
- expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
- expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
-
- expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
- expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-91748965051fae1330ad58d15cf694e103267c87");
-
- expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
- expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/4444/head:pr/4444");
-
- expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
- expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "91748965051fae1330ad58d15cf694e103267c87");
-
- expect(GitCLIService.prototype.push).toBeCalledTimes(1);
- expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-91748965051fae1330ad58d15cf694e103267c87");
-
- expect(GitHubService.prototype.createPullRequest).toBeCalledTimes(1);
- expect(GitHubService.prototype.createPullRequest).toBeCalledWith({
- owner: "owner",
- repo: "reponame",
- head: "bp-target-91748965051fae1330ad58d15cf694e103267c87",
- base: "target",
- title: "[target] PR Title",
- body: expect.stringContaining("**Backport:** https://github.com/owner/reponame/pull/4444"),
- reviewers: ["gh-user", "that-s-a-user"]
- }
- );
- });
-
- test("override backporting pr data", async () => {
- addProcessArgs([
- "-tb",
- "target",
- "-pr",
- "https://github.com/owner/reponame/pull/2368",
- "--title",
- "New Title",
- "--body",
- "New Body",
- "--body-prefix",
- "New Body Prefix - ",
- "--bp-branch-name",
- "bp_branch_name",
- ]);
-
- await runner.execute();
-
- const cwd = process.cwd() + "/bp";
-
- expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
- expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
-
- expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
- expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp_branch_name");
-
- expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
- expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
-
- expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
- expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc");
-
- expect(GitCLIService.prototype.push).toBeCalledTimes(1);
- expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp_branch_name");
-
- expect(GitHubService.prototype.createPullRequest).toBeCalledTimes(1);
- expect(GitHubService.prototype.createPullRequest).toBeCalledWith({
- owner: "owner",
- repo: "reponame",
- head: "bp_branch_name",
- base: "target",
- title: "New Title",
- body: "New Body Prefix - New Body",
- reviewers: ["gh-user", "that-s-a-user"]
- }
- );
- });
-});
\ No newline at end of file
diff --git a/test/service/runner/gha-github-runner.test.ts b/test/service/runner/gha-github-runner.test.ts
new file mode 100644
index 0000000..5461b33
--- /dev/null
+++ b/test/service/runner/gha-github-runner.test.ts
@@ -0,0 +1,838 @@
+import ArgsParser from "@bp/service/args/args-parser";
+import Runner from "@bp/service/runner/runner";
+import GitCLIService from "@bp/service/git/git-cli";
+import GitHubClient from "@bp/service/git/github/github-client";
+import GHAArgsParser from "@bp/service/args/gha/gha-args-parser";
+import { createTestFile, removeTestFile, resetEnvTokens, spyGetInput } from "../../support/utils";
+import { mockGitHubClient } from "../../support/mock/git-client-mock-support";
+import GitClientFactory from "@bp/service/git/git-client-factory";
+import { GitClientType } from "@bp/service/git/git.types";
+
+const GITHUB_MERGED_PR_W_OVERRIDES_CONFIG_FILE_CONTENT_PATHNAME = "./gha-github-runner-pr-merged-with-overrides.json";
+const GITHUB_MERGED_PR_W_OVERRIDES_CONFIG_FILE_CONTENT = {
+ "dryRun": false,
+ "auth": "my-auth-token",
+ "pullRequest": "https://github.com/owner/reponame/pull/2368",
+ "targetBranch": "target",
+ "gitUser": "Me",
+ "gitEmail": "me@email.com",
+ "title": "New Title",
+ "body": "New Body",
+ "bodyPrefix": "New Body Prefix - ",
+ "bpBranchName": "bp_branch_name",
+ "reviewers": [],
+ "assignees": ["user3", "user4"],
+ "inheritReviewers": false,
+ "labels": ["gha github cherry pick :cherries:"],
+ "inheritLabels": true,
+};
+
+
+jest.mock("@bp/service/git/git-cli");
+jest.spyOn(GitHubClient.prototype, "createPullRequest");
+jest.spyOn(GitHubClient.prototype, "createPullRequestComment");
+jest.spyOn(GitClientFactory, "getOrCreate");
+
+let parser: ArgsParser;
+let runner: Runner;
+
+beforeAll(() => {
+ // create a temporary file
+ createTestFile(GITHUB_MERGED_PR_W_OVERRIDES_CONFIG_FILE_CONTENT_PATHNAME, JSON.stringify(GITHUB_MERGED_PR_W_OVERRIDES_CONFIG_FILE_CONTENT));
+});
+
+afterAll(() => {
+ // clean up all temporary files
+ removeTestFile(GITHUB_MERGED_PR_W_OVERRIDES_CONFIG_FILE_CONTENT_PATHNAME);
+});
+
+beforeEach(() => {
+ // reset git env tokens
+ resetEnvTokens();
+
+ mockGitHubClient();
+
+ // create GHA arguments parser
+ parser = new GHAArgsParser();
+
+ // create runner
+ runner = new Runner(parser);
+});
+
+describe("gha runner", () => {
+ test("with dry run", async () => {
+ spyGetInput({
+ "dry-run": "true",
+ "target-branch": "target",
+ "pull-request": "https://github.com/owner/reponame/pull/2368"
+ });
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITHUB, undefined, "https://api.github.com");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(0);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(0);
+ expect(GitHubClient.prototype.createPullRequestComment).toBeCalledTimes(0);
+ });
+
+ test("without dry run", async () => {
+ spyGetInput({
+ "target-branch": "target",
+ "pull-request": "https://github.com/owner/reponame/pull/2368"
+ });
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITHUB, undefined, "https://api.github.com");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-target-28f63db",
+ base: "target",
+ title: "[target] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ }
+ );
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(1);
+ });
+
+ test("closed and not merged pull request", async () => {
+ spyGetInput({
+ "target-branch": "target",
+ "pull-request": "https://github.com/owner/reponame/pull/6666"
+ });
+
+ await expect(() => runner.execute()).rejects.toThrow("Provided pull request is closed and not merged");
+ });
+
+ test("open pull request", async () => {
+ spyGetInput({
+ "target-branch": "target",
+ "pull-request": "https://github.com/owner/reponame/pull/4444"
+ });
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITHUB, undefined, "https://api.github.com");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-9174896");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/4444/head:pr/4444");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "91748965051fae1330ad58d15cf694e103267c87", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-9174896");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-target-9174896",
+ base: "target",
+ title: "[target] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/4444\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ }
+ );
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(1);
+ });
+
+ test("override backporting pr data", async () => {
+ spyGetInput({
+ "target-branch": "target",
+ "pull-request": "https://github.com/owner/reponame/pull/2368",
+ "title": "New Title",
+ "body": "New Body",
+ "body-prefix": "New Body Prefix\\r\\n\\r\\n",
+ "bp-branch-name": "bp_branch_name",
+ "reviewers": "user1, user2",
+ "assignees": "user3, user4",
+ });
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITHUB, undefined, "https://api.github.com");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp_branch_name");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp_branch_name");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp_branch_name",
+ base: "target",
+ title: "New Title",
+ body: "New Body Prefix\r\n\r\nNew Body",
+ reviewers: ["user1", "user2"],
+ assignees: ["user3", "user4"],
+ labels: [],
+ comments: [],
+ }
+ );
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(1);
+ });
+
+ test("set empty reviewers", async () => {
+ spyGetInput({
+ "target-branch": "target",
+ "pull-request": "https://github.com/owner/reponame/pull/2368",
+ "title": "New Title",
+ "body": "New Body",
+ "body-prefix": "New Body Prefix - ",
+ "bp-branch-name": "bp_branch_name",
+ "reviewers": "",
+ "assignees": "user3, user4",
+ "no-inherit-reviewers": "true",
+ });
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITHUB, undefined, "https://api.github.com");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp_branch_name");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp_branch_name");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp_branch_name",
+ base: "target",
+ title: "New Title",
+ body: "New Body Prefix - New Body",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ labels: [],
+ comments: [],
+ }
+ );
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(1);
+ });
+
+ test("set custom labels with inheritance", async () => {
+ spyGetInput({
+ "target-branch": "target",
+ "pull-request": "https://github.com/owner/reponame/pull/2368",
+ "labels": "cherry-pick :cherries:, another-label",
+ "inherit-labels": "true",
+ });
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITHUB, undefined, "https://api.github.com");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-target-28f63db",
+ base: "target",
+ title: "[target] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: ["cherry-pick :cherries:", "another-label", "backport prod"],
+ comments: [],
+ }
+ );
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(1);
+ });
+
+ test("set custom labels without inheritance", async () => {
+ spyGetInput({
+ "target-branch": "target",
+ "pull-request": "https://github.com/owner/reponame/pull/2368",
+ "labels": "cherry-pick :cherries:, another-label",
+ "inherit-labels": "false",
+ });
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITHUB, undefined, "https://api.github.com");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-target-28f63db",
+ base: "target",
+ title: "[target] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: ["cherry-pick :cherries:", "another-label"],
+ comments: [],
+ }
+ );
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(1);
+ });
+
+ test("using config file with overrides", async () => {
+ spyGetInput({
+ "config-file": GITHUB_MERGED_PR_W_OVERRIDES_CONFIG_FILE_CONTENT_PATHNAME,
+ });
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITHUB, "my-auth-token", "https://api.github.com");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp_branch_name");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp_branch_name");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp_branch_name",
+ base: "target",
+ title: "New Title",
+ body: "New Body Prefix - New Body",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ labels: ["gha github cherry pick :cherries:", "backport prod"],
+ comments: [],
+ }
+ );
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(1);
+ });
+
+ // to check: https://github.com/kiegroup/git-backporting/issues/52
+ test("using github api url instead of html one", async () => {
+ spyGetInput({
+ "target-branch": "target",
+ "pull-request": "https://api.github.com/repos/owner/reponame/pulls/2368"
+ });
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITHUB, undefined, "https://api.github.com");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-target-28f63db",
+ base: "target",
+ title: "[target] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ }
+ );
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(1);
+ });
+
+ test("multiple commits pr", async () => {
+ spyGetInput({
+ "target-branch": "target",
+ "pull-request": "https://api.github.com/repos/owner/reponame/pulls/8632",
+ "no-squash": "true",
+ });
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITHUB, undefined, "https://api.github.com");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-0404fb9-11da4e3");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(0);
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(2);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "0404fb922ab75c3a8aecad5c97d9af388df04695", undefined, undefined, undefined);
+ expect(GitCLIService.prototype.cherryPick).toHaveBeenLastCalledWith(cwd, "11da4e38aa3e577ffde6d546f1c52e53b04d3151", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-0404fb9-11da4e3");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-target-0404fb9-11da4e3",
+ base: "target",
+ title: "[target] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/8632\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ }
+ );
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(1);
+ });
+
+ test("using github api url and different strategy", async () => {
+ spyGetInput({
+ "target-branch": "target",
+ "pull-request": "https://api.github.com/repos/owner/reponame/pulls/2368",
+ "strategy": "ort",
+ "strategy-option": "ours",
+ });
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITHUB, undefined, "https://api.github.com");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", "ort", "ours", undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-target-28f63db",
+ base: "target",
+ title: "[target] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ }
+ );
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(1);
+ });
+
+ test("using github api url and additional cherry-pick options", async () => {
+ spyGetInput({
+ "target-branch": "target",
+ "pull-request": "https://api.github.com/repos/owner/reponame/pulls/2368",
+ "cherry-pick-options": "-x --allow-empty",
+ });
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITHUB, undefined, "https://api.github.com");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, "-x --allow-empty");
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-target-28f63db",
+ base: "target",
+ title: "[target] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ }
+ );
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(1);
+ });
+
+ test("additional pr comments", async () => {
+ spyGetInput({
+ "target-branch": "target",
+ "pull-request": "https://github.com/owner/reponame/pull/2368",
+ "comments": "first comment; second comment",
+ });
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITHUB, undefined, "https://api.github.com");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-28f63db");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-target-28f63db",
+ base: "target",
+ title: "[target] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: ["first comment", "second comment"],
+ }
+ );
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(1);
+ });
+
+ test("with multiple target branches", async () => {
+ spyGetInput({
+ "target-branch": "v1, v2, v3",
+ "pull-request": "https://github.com/owner/reponame/pull/2368",
+ "folder": "/tmp/folder",
+ });
+
+ await runner.execute();
+
+ const cwd = "/tmp/folder";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITHUB, undefined, "https://api.github.com");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "v1");
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "v2");
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "v3");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-v1-28f63db");
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-v2-28f63db");
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-v3-28f63db");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-v1-28f63db");
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-v2-28f63db");
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-v3-28f63db");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(3);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-v1-28f63db",
+ base: "v1",
+ title: "[v1] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ });
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-v2-28f63db",
+ base: "v2",
+ title: "[v2] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ });
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "bp-v3-28f63db",
+ base: "v3",
+ title: "[v3] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ });
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(3);
+ });
+
+ test("with multiple target branches and single custom bp branch", async () => {
+ spyGetInput({
+ "target-branch": "v1, v2, v3",
+ "pull-request": "https://github.com/owner/reponame/pull/2368",
+ "folder": "/tmp/folder",
+ "bp-branch-name": "custom"
+ });
+
+ await runner.execute();
+
+ const cwd = "/tmp/folder";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITHUB, undefined, "https://api.github.com");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "v1");
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "v2");
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "v3");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "custom-v1");
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "custom-v2");
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "custom-v3");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(3);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "custom-v1");
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "custom-v2");
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "custom-v3");
+
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(3);
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "custom-v1",
+ base: "v1",
+ title: "[v1] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ });
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "custom-v2",
+ base: "v2",
+ title: "[v2] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ });
+ expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "owner",
+ repo: "reponame",
+ head: "custom-v3",
+ base: "v3",
+ title: "[v3] PR Title",
+ body: "**Backport:** https://github.com/owner/reponame/pull/2368\r\n\r\nPlease review and merge",
+ reviewers: ["gh-user", "that-s-a-user"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ });
+ expect(GitHubClient.prototype.createPullRequest).toReturnTimes(3);
+ });
+
+ test("explicitly set git client", async () => {
+ spyGetInput({
+ "target-branch": "target",
+ "pull-request": "https://api.github.com/repos/owner/reponame/pulls/2368",
+ "git-client": "codeberg",
+ });
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.CODEBERG, undefined, "https://api.github.com");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
+ });
+
+});
\ No newline at end of file
diff --git a/test/service/runner/gha-gitlab-runner.test.ts b/test/service/runner/gha-gitlab-runner.test.ts
new file mode 100644
index 0000000..f0f41f6
--- /dev/null
+++ b/test/service/runner/gha-gitlab-runner.test.ts
@@ -0,0 +1,564 @@
+import ArgsParser from "@bp/service/args/args-parser";
+import Runner from "@bp/service/runner/runner";
+import GitCLIService from "@bp/service/git/git-cli";
+import GitLabClient from "@bp/service/git/gitlab/gitlab-client";
+import GHAArgsParser from "@bp/service/args/gha/gha-args-parser";
+import { createTestFile, removeTestFile, resetEnvTokens, spyGetInput } from "../../support/utils";
+import { getAxiosMocked } from "../../support/mock/git-client-mock-support";
+import { MERGED_SQUASHED_MR } from "../../support/mock/gitlab-data";
+import GitClientFactory from "@bp/service/git/git-client-factory";
+import { GitClientType } from "@bp/service/git/git.types";
+
+const GITLAB_MERGED_PR_COMPLEX_CONFIG_FILE_CONTENT_PATHNAME = "./gha-gitlab-runner-pr-merged-with-overrides.json";
+const GITLAB_MERGED_PR_COMPLEX_CONFIG_FILE_CONTENT = {
+ "dryRun": false,
+ "auth": "my-token",
+ "pullRequest": `https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/${MERGED_SQUASHED_MR.iid}`,
+ "targetBranch": "prod",
+ "gitUser": "Me",
+ "gitEmail": "me@email.com",
+ "title": "New Title",
+ "body": "New Body",
+ "bodyPrefix": `**This is a backport:** https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/${MERGED_SQUASHED_MR.iid}`,
+ "reviewers": [],
+ "assignees": ["user3", "user4"],
+ "inheritReviewers": false,
+ "labels": ["gha gitlab cherry pick :cherries:"],
+ "inheritLabels": true,
+};
+
+jest.mock("axios", () => {
+ return {
+ create: () => ({
+ get: getAxiosMocked,
+ post: () => ({
+ data: {
+ iid: 1, // FIXME: I am not testing this atm
+ }
+ }),
+ put: async () => undefined, // make it async so that .catch doesn't throw an error
+ }),
+ };
+});
+
+jest.mock("@bp/service/git/git-cli");
+jest.spyOn(GitLabClient.prototype, "createPullRequest");
+jest.spyOn(GitLabClient.prototype, "createPullRequestComment");
+jest.spyOn(GitClientFactory, "getOrCreate");
+
+let parser: ArgsParser;
+let runner: Runner;
+
+beforeAll(() => {
+ // create a temporary file
+ createTestFile(GITLAB_MERGED_PR_COMPLEX_CONFIG_FILE_CONTENT_PATHNAME, JSON.stringify(GITLAB_MERGED_PR_COMPLEX_CONFIG_FILE_CONTENT));
+});
+
+afterAll(() => {
+ // clean up all temporary files
+ removeTestFile(GITLAB_MERGED_PR_COMPLEX_CONFIG_FILE_CONTENT_PATHNAME);
+});
+
+beforeEach(() => {
+ // reset git env tokens
+ resetEnvTokens();
+
+ // create GHA arguments parser
+ parser = new GHAArgsParser();
+
+ // create runner
+ runner = new Runner(parser);
+});
+
+describe("gha runner", () => {
+ test("with dry run", async () => {
+ spyGetInput({
+ "dry-run": "true",
+ "target-branch": "target",
+ "pull-request": "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/2"
+ });
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITLAB, undefined, "https://my.gitlab.host.com/api/v4");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://my.gitlab.host.com/superuser/backporting-example.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-9e15674");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "merge-requests/2/head:pr/2");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "9e15674ebd48e05c6e428a1fa31dbb60a778d644", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(0);
+ expect(GitLabClient.prototype.createPullRequest).toBeCalledTimes(0);
+ expect(GitLabClient.prototype.createPullRequestComment).toBeCalledTimes(0);
+ });
+
+ test("without dry run", async () => {
+ spyGetInput({
+ "target-branch": "target",
+ "pull-request": "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/2"
+ });
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITLAB, undefined, "https://my.gitlab.host.com/api/v4");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://my.gitlab.host.com/superuser/backporting-example.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-9e15674");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "merge-requests/2/head:pr/2");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "9e15674ebd48e05c6e428a1fa31dbb60a778d644", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-9e15674");
+
+ expect(GitLabClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitLabClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "superuser",
+ repo: "backporting-example",
+ head: "bp-target-9e15674",
+ base: "target",
+ title: "[target] Update test.txt opened",
+ body: expect.stringContaining("**Backport:** https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/2"),
+ reviewers: ["superuser"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ }
+ );
+ });
+
+ test("closed and not merged pull request", async () => {
+ spyGetInput({
+ "target-branch": "target",
+ "pull-request": "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/3"
+ });
+
+ await expect(() => runner.execute()).rejects.toThrow("Provided pull request is closed and not merged");
+ });
+
+ test("merged pull request", async () => {
+ spyGetInput({
+ "target-branch": "target",
+ "pull-request": "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/1"
+ });
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITLAB, undefined, "https://my.gitlab.host.com/api/v4");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://my.gitlab.host.com/superuser/backporting-example.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-ebb1eca");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(0);
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "ebb1eca696c42fd067658bd9b5267709f78ef38e", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-ebb1eca");
+
+ expect(GitLabClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitLabClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "superuser",
+ repo: "backporting-example",
+ head: "bp-target-ebb1eca",
+ base: "target",
+ title: "[target] Update test.txt",
+ body: expect.stringContaining("**Backport:** https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/1"),
+ reviewers: ["superuser"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ }
+ );
+ });
+
+ test("override backporting pr data", async () => {
+ spyGetInput({
+ "target-branch": "target",
+ "pull-request": "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/2",
+ "title": "New Title",
+ "body": "New Body",
+ "body-prefix": "New Body Prefix - ",
+ "bp-branch-name": "bp_branch_name",
+ "reviewers": "user1, user2",
+ "assignees": "user3, user4",
+ });
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITLAB, undefined, "https://my.gitlab.host.com/api/v4");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://my.gitlab.host.com/superuser/backporting-example.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp_branch_name");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "merge-requests/2/head:pr/2");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "9e15674ebd48e05c6e428a1fa31dbb60a778d644", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp_branch_name");
+
+ expect(GitLabClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitLabClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "superuser",
+ repo: "backporting-example",
+ head: "bp_branch_name",
+ base: "target",
+ title: "New Title",
+ body: "New Body Prefix - New Body",
+ reviewers: ["user1", "user2"],
+ assignees: ["user3", "user4"],
+ labels: [],
+ comments: [],
+ }
+ );
+ });
+
+ test("set empty reviewers", async () => {
+ spyGetInput({
+ "target-branch": "target",
+ "pull-request": "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/2",
+ "title": "New Title",
+ "body": "New Body",
+ "body-prefix": "New Body Prefix - ",
+ "bp-branch-name": "bp_branch_name",
+ "reviewers": "",
+ "assignees": "user3, user4",
+ "no-inherit-reviewers": "true",
+ });
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITLAB, undefined, "https://my.gitlab.host.com/api/v4");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://my.gitlab.host.com/superuser/backporting-example.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp_branch_name");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "merge-requests/2/head:pr/2");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "9e15674ebd48e05c6e428a1fa31dbb60a778d644", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp_branch_name");
+
+ expect(GitLabClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitLabClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "superuser",
+ repo: "backporting-example",
+ head: "bp_branch_name",
+ base: "target",
+ title: "New Title",
+ body: "New Body Prefix - New Body",
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ labels: [],
+ comments: [],
+ }
+ );
+ });
+
+ test("set custom labels with inheritance", async () => {
+ spyGetInput({
+ "target-branch": "target",
+ "pull-request": "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/1",
+ "labels": "cherry-pick :cherries:, another-label",
+ "inherit-labels": "true",
+ });
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITLAB, undefined, "https://my.gitlab.host.com/api/v4");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://my.gitlab.host.com/superuser/backporting-example.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-ebb1eca");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(0);
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "ebb1eca696c42fd067658bd9b5267709f78ef38e", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-ebb1eca");
+
+ expect(GitLabClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitLabClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "superuser",
+ repo: "backporting-example",
+ head: "bp-target-ebb1eca",
+ base: "target",
+ title: "[target] Update test.txt",
+ body: expect.stringContaining("**Backport:** https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/1"),
+ reviewers: ["superuser"],
+ assignees: [],
+ labels: ["cherry-pick :cherries:", "another-label", "backport-prod"],
+ comments: [],
+ }
+ );
+ });
+
+ test("set custom labels without inheritance", async () => {
+ spyGetInput({
+ "target-branch": "target",
+ "pull-request": "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/1",
+ "labels": "cherry-pick :cherries:, another-label",
+ });
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITLAB, undefined, "https://my.gitlab.host.com/api/v4");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://my.gitlab.host.com/superuser/backporting-example.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-ebb1eca");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(0);
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "ebb1eca696c42fd067658bd9b5267709f78ef38e", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-ebb1eca");
+
+ expect(GitLabClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitLabClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "superuser",
+ repo: "backporting-example",
+ head: "bp-target-ebb1eca",
+ base: "target",
+ title: "[target] Update test.txt",
+ body: expect.stringContaining("**Backport:** https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/1"),
+ reviewers: ["superuser"],
+ assignees: [],
+ labels: ["cherry-pick :cherries:", "another-label"],
+ comments: [],
+ }
+ );
+ });
+
+ test("using config file with overrides", async () => {
+ spyGetInput({
+ "config-file": GITLAB_MERGED_PR_COMPLEX_CONFIG_FILE_CONTENT_PATHNAME,
+ });
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITLAB, "my-token", "https://my.gitlab.host.com/api/v4");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://my.gitlab.host.com/superuser/backporting-example.git", cwd, "prod");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-prod-ebb1eca");
+
+ // 0 occurrences as the mr is already merged and the owner is the same for
+ // both source and target repositories
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(0);
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "ebb1eca696c42fd067658bd9b5267709f78ef38e", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-prod-ebb1eca");
+
+ expect(GitLabClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitLabClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "superuser",
+ repo: "backporting-example",
+ head: "bp-prod-ebb1eca",
+ base: "prod",
+ title: "New Title",
+ body: expect.stringContaining("**This is a backport:** https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/1"),
+ reviewers: [],
+ assignees: ["user3", "user4"],
+ labels: ["gha gitlab cherry pick :cherries:", "backport-prod"],
+ comments: [],
+ }
+ );
+ });
+
+ test("single commit without squash", async () => {
+ spyGetInput({
+ "target-branch": "target",
+ "pull-request": "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/1",
+ "no-squash": "true",
+ });
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITLAB, undefined, "https://my.gitlab.host.com/api/v4");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://my.gitlab.host.com/superuser/backporting-example.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-e4dd336");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "e4dd336a4a20f394df6665994df382fb1d193a11", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-e4dd336");
+
+ expect(GitLabClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitLabClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "superuser",
+ repo: "backporting-example",
+ head: "bp-target-e4dd336",
+ base: "target",
+ title: "[target] Update test.txt",
+ body: expect.stringContaining("**Backport:** https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/1"),
+ reviewers: ["superuser"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ }
+ );
+ });
+
+ test("multiple commits without squash", async () => {
+ spyGetInput({
+ "target-branch": "target",
+ "pull-request": "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/2",
+ "no-squash": "true",
+ });
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITLAB, undefined, "https://my.gitlab.host.com/api/v4");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://my.gitlab.host.com/superuser/backporting-example.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-e4dd336-974519f");
+
+ expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "merge-requests/2/head:pr/2");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(2);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "e4dd336a4a20f394df6665994df382fb1d193a11", undefined, undefined, undefined);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "974519f65c9e0ed65277cd71026657a09fca05e7", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-e4dd336-974519f");
+
+ expect(GitLabClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitLabClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "superuser",
+ repo: "backporting-example",
+ head: "bp-target-e4dd336-974519f",
+ base: "target",
+ title: "[target] Update test.txt opened",
+ body: expect.stringContaining("**Backport:** https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/2"),
+ reviewers: ["superuser"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ }
+ );
+ });
+
+ test("merged MR with auto-no-squash", async () => {
+ spyGetInput({
+ "target-branch": "target",
+ "pull-request": "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/5",
+ "auto-no-squash": "true",
+ });
+
+ await runner.execute();
+
+ const cwd = process.cwd() + "/bp";
+
+ expect(GitClientFactory.getOrCreate).toBeCalledTimes(1);
+ expect(GitClientFactory.getOrCreate).toBeCalledWith(GitClientType.GITLAB, undefined, "https://my.gitlab.host.com/api/v4");
+
+ expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.clone).toBeCalledWith("https://my.gitlab.host.com/superuser/backporting-example.git", cwd, "target");
+
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-e4dd336");
+
+ expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "e4dd336a4a20f394df6665994df382fb1d193a11", undefined, undefined, undefined);
+
+ expect(GitCLIService.prototype.push).toBeCalledTimes(1);
+ expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-e4dd336");
+
+ expect(GitLabClient.prototype.createPullRequest).toBeCalledTimes(1);
+ expect(GitLabClient.prototype.createPullRequest).toBeCalledWith({
+ owner: "superuser",
+ repo: "backporting-example",
+ head: "bp-target-e4dd336",
+ base: "target",
+ title: "[target] Update test.txt",
+ body: expect.stringContaining("**Backport:** https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/5"),
+ reviewers: ["superuser"],
+ assignees: [],
+ labels: [],
+ comments: [],
+ }
+ );
+ });
+});
\ No newline at end of file
diff --git a/test/service/runner/gha-runner.test.ts b/test/service/runner/gha-runner.test.ts
deleted file mode 100644
index e1abfd0..0000000
--- a/test/service/runner/gha-runner.test.ts
+++ /dev/null
@@ -1,183 +0,0 @@
-import ArgsParser from "@bp/service/args/args-parser";
-import Runner from "@bp/service/runner/runner";
-import GitCLIService from "@bp/service/git/git-cli";
-import GitHubService from "@bp/service/git/github/github-service";
-import GHAArgsParser from "@bp/service/args/gha/gha-args-parser";
-import { spyGetInput } from "../../support/utils";
-import { setupMoctokit } from "../../support/moctokit/moctokit-support";
-
-jest.mock("@bp/service/git/git-cli");
-jest.spyOn(GitHubService.prototype, "createPullRequest");
-
-let parser: ArgsParser;
-let runner: Runner;
-
-beforeEach(() => {
- setupMoctokit();
-
- // create GHA arguments parser
- parser = new GHAArgsParser();
-
- // create runner
- runner = new Runner(parser);
-});
-
-afterEach(() => {
- jest.clearAllMocks();
-});
-
-describe("gha runner", () => {
- test("with dry run", async () => {
- spyGetInput({
- "dry-run": "true",
- "target-branch": "target",
- "pull-request": "https://github.com/owner/reponame/pull/2368"
- });
-
- await runner.execute();
-
- const cwd = process.cwd() + "/bp";
-
- expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
- expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
-
- expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
- expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc");
-
- expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
- expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
-
- expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
- expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc");
-
- expect(GitCLIService.prototype.push).toBeCalledTimes(0);
- expect(GitHubService.prototype.createPullRequest).toBeCalledTimes(0);
- });
-
- test("without dry run", async () => {
- spyGetInput({
- "target-branch": "target",
- "pull-request": "https://github.com/owner/reponame/pull/2368"
- });
-
- await runner.execute();
-
- const cwd = process.cwd() + "/bp";
-
- expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
- expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
-
- expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
- expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc");
-
- expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
- expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
-
- expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
- expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc");
-
- expect(GitCLIService.prototype.push).toBeCalledTimes(1);
- expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc");
-
- expect(GitHubService.prototype.createPullRequest).toBeCalledTimes(1);
- expect(GitHubService.prototype.createPullRequest).toBeCalledWith({
- owner: "owner",
- repo: "reponame",
- head: "bp-target-28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc",
- base: "target",
- title: "[target] PR Title",
- body: expect.stringContaining("**Backport:** https://github.com/owner/reponame/pull/2368"),
- reviewers: ["gh-user", "that-s-a-user"]
- }
- );
- });
-
- test("closed and not merged pull request", async () => {
- spyGetInput({
- "target-branch": "target",
- "pull-request": "https://github.com/owner/reponame/pull/6666"
- });
-
- expect(async () => await runner.execute()).rejects.toThrow("Provided pull request is closed and not merged!");
- });
-
- test("open pull request", async () => {
- spyGetInput({
- "target-branch": "target",
- "pull-request": "https://github.com/owner/reponame/pull/4444"
- });
-
- await runner.execute();
-
- const cwd = process.cwd() + "/bp";
-
- expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
- expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
-
- expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
- expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-target-91748965051fae1330ad58d15cf694e103267c87");
-
- expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
- expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/4444/head:pr/4444");
-
- expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
- expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "91748965051fae1330ad58d15cf694e103267c87");
-
- expect(GitCLIService.prototype.push).toBeCalledTimes(1);
- expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-91748965051fae1330ad58d15cf694e103267c87");
-
- expect(GitHubService.prototype.createPullRequest).toBeCalledTimes(1);
- expect(GitHubService.prototype.createPullRequest).toBeCalledWith({
- owner: "owner",
- repo: "reponame",
- head: "bp-target-91748965051fae1330ad58d15cf694e103267c87",
- base: "target",
- title: "[target] PR Title",
- body: expect.stringContaining("**Backport:** https://github.com/owner/reponame/pull/4444"),
- reviewers: ["gh-user", "that-s-a-user"]
- }
- );
- });
-
- test("override backporting pr data", async () => {
- spyGetInput({
- "target-branch": "target",
- "pull-request": "https://github.com/owner/reponame/pull/2368",
- "title": "New Title",
- "body": "New Body",
- "body-prefix": "New Body Prefix - ",
- "bp-branch-name": "bp_branch_name",
- });
-
- await runner.execute();
-
- const cwd = process.cwd() + "/bp";
-
- expect(GitCLIService.prototype.clone).toBeCalledTimes(1);
- expect(GitCLIService.prototype.clone).toBeCalledWith("https://github.com/owner/reponame.git", cwd, "target");
-
- expect(GitCLIService.prototype.createLocalBranch).toBeCalledTimes(1);
- expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp_branch_name");
-
- expect(GitCLIService.prototype.fetch).toBeCalledTimes(1);
- expect(GitCLIService.prototype.fetch).toBeCalledWith(cwd, "pull/2368/head:pr/2368");
-
- expect(GitCLIService.prototype.cherryPick).toBeCalledTimes(1);
- expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc");
-
- expect(GitCLIService.prototype.push).toBeCalledTimes(1);
- expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp_branch_name");
-
- expect(GitHubService.prototype.createPullRequest).toBeCalledTimes(1);
- expect(GitHubService.prototype.createPullRequest).toBeCalledWith({
- owner: "owner",
- repo: "reponame",
- head: "bp_branch_name",
- base: "target",
- title: "New Title",
- body: "New Body Prefix - New Body",
- reviewers: ["gh-user", "that-s-a-user"]
- }
- );
- });
-});
\ No newline at end of file
diff --git a/test/service/runner/runner-util.test.ts b/test/service/runner/runner-util.test.ts
new file mode 100644
index 0000000..7f7d982
--- /dev/null
+++ b/test/service/runner/runner-util.test.ts
@@ -0,0 +1,19 @@
+import { injectError, injectTargetBranch } from "@bp/service/runner/runner-util";
+
+describe("check runner utilities", () => {
+ test("properly inject error message", () => {
+ expect(injectError("Original message: {{error}}", "to inject")).toStrictEqual("Original message: to inject");
+ });
+
+ test("missing error placeholder in the original message", () => {
+ expect(injectError("Original message: {{wrong}}", "to inject")).toStrictEqual("Original message: {{wrong}}");
+ });
+
+ test("properly inject target branch into message", () => {
+ expect(injectTargetBranch("Original message: {{target-branch}}", "to inject")).toStrictEqual("Original message: to inject");
+ });
+
+ test("missing target branch placeholder in the original message", () => {
+ expect(injectTargetBranch("Original message: {{wrong}}", "to inject")).toStrictEqual("Original message: {{wrong}}");
+ });
+});
\ No newline at end of file
diff --git a/test/support/mock/codeberg-data.ts b/test/support/mock/codeberg-data.ts
new file mode 100644
index 0000000..1781aef
--- /dev/null
+++ b/test/support/mock/codeberg-data.ts
@@ -0,0 +1,2004 @@
+export const CB_TARGET_OWNER = "owner";
+export const CB_SOURCE_OWNER = "fork";
+export const CB_REPO = "reponame";
+export const CB_NOT_FOUND_PR_NUMBER = 1;
+export const CB_NEW_PR_URL = "new_pr_url";
+export const CB_NEW_PR_NUMBER = 9999;
+
+export const CB_MERGED_PR_FIXTURE = {
+ "url": "https://codeberg.org/api/v1/repos/owner/reponame/pulls/2368",
+ "id": 1137188271,
+ "node_id": "PR_kwDOABTq6s5DyB2v",
+ "html_url": "https://codeberg.org/owner/reponame/pulls/2368",
+ "diff_url": "https://codeberg.org/owner/reponame/pulls/2368.diff",
+ "patch_url": "https://codeberg.org/owner/reponame/pulls/2368.patch",
+ "issue_url": "https://codeberg.org/api/v1/repos/owner/reponame/issues/2368",
+ "number": 2368,
+ "state": "closed",
+ "locked": false,
+ "title": "PR Title",
+ "user": {
+ "login": "gh-user",
+ "id": 11995863,
+ "node_id": "MDQ6VXNlcjExOTk1ODYz",
+ "avatar_url": "https://avatars.codebergusercontent.com/u/11995863?v=4",
+ "gravatar_id": "",
+ "url": "https://codeberg.org/api/v1/users/gh-user",
+ "html_url": "https://codeberg.org/gh-user",
+ "followers_url": "https://codeberg.org/api/v1/users/gh-user/followers",
+ "following_url": "https://codeberg.org/api/v1/users/gh-user/following{/other_user}",
+ "gists_url": "https://codeberg.org/api/v1/users/gh-user/gists{/gist_id}",
+ "starred_url": "https://codeberg.org/api/v1/users/gh-user/starred{/owner}{/repo}",
+ "subscriptions_url": "https://codeberg.org/api/v1/users/gh-user/subscriptions",
+ "organizations_url": "https://codeberg.org/api/v1/users/gh-user/orgs",
+ "repos_url": "https://codeberg.org/api/v1/users/gh-user/repos",
+ "events_url": "https://codeberg.org/api/v1/users/gh-user/events{/privacy}",
+ "received_events_url": "https://codeberg.org/api/v1/users/gh-user/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "body": "Please review and merge",
+ "created_at": "2022-11-28T08:43:09Z",
+ "updated_at": "2022-11-28T10:11:53Z",
+ "closed_at": "2022-11-28T10:11:52Z",
+ "merged_at": "2022-11-28T10:11:52Z",
+ "merge_commit_sha": "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc",
+ "assignee": null,
+ "assignees": [
+
+ ],
+ "requested_reviewers": [
+ {
+ "login": "requested-gh-user",
+ "id": 1422582,
+ "node_id": "MDQ6VXNlcjE0MjI1ODI=",
+ "avatar_url": "https://avatars.codebergusercontent.com/u/1422582?v=4",
+ "gravatar_id": "",
+ "url": "https://codeberg.org/api/v1/users/requested-gh-user",
+ "html_url": "https://codeberg.org/requested-gh-user",
+ "followers_url": "https://codeberg.org/api/v1/users/requested-gh-user/followers",
+ "following_url": "https://codeberg.org/api/v1/users/requested-gh-user/following{/other_user}",
+ "gists_url": "https://codeberg.org/api/v1/users/requested-gh-user/gists{/gist_id}",
+ "starred_url": "https://codeberg.org/api/v1/users/requested-gh-user/starred{/owner}{/repo}",
+ "subscriptions_url": "https://codeberg.org/api/v1/users/requested-gh-user/subscriptions",
+ "organizations_url": "https://codeberg.org/api/v1/users/requested-gh-user/orgs",
+ "repos_url": "https://codeberg.org/api/v1/users/requested-gh-user/repos",
+ "events_url": "https://codeberg.org/api/v1/users/requested-gh-user/events{/privacy}",
+ "received_events_url": "https://codeberg.org/api/v1/users/requested-gh-user/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ {
+ "login": "gh-user",
+ "id": 1422582,
+ "node_id": "MDQ6VXNlcjE0MjI1ODI=",
+ "avatar_url": "https://avatars.codebergusercontent.com/u/1422582?v=4",
+ "gravatar_id": "",
+ "url": "https://codeberg.org/api/v1/users/gh-user",
+ "html_url": "https://codeberg.org/gh-user",
+ "followers_url": "https://codeberg.org/api/v1/users/gh-user/followers",
+ "following_url": "https://codeberg.org/api/v1/users/gh-user/following{/other_user}",
+ "gists_url": "https://codeberg.org/api/v1/users/gh-user/gists{/gist_id}",
+ "starred_url": "https://codeberg.org/api/v1/users/gh-user/starred{/owner}{/repo}",
+ "subscriptions_url": "https://codeberg.org/api/v1/users/gh-user/subscriptions",
+ "organizations_url": "https://codeberg.org/api/v1/users/gh-user/orgs",
+ "repos_url": "https://codeberg.org/api/v1/users/gh-user/repos",
+ "events_url": "https://codeberg.org/api/v1/users/gh-user/events{/privacy}",
+ "received_events_url": "https://codeberg.org/api/v1/users/gh-user/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ // Sometimes Codeberg returns null as part of requested_reviewers.
+ null,
+ ],
+ "requested_teams": [
+
+ ],
+ "labels": [
+ {
+ "id": 4901021057,
+ "node_id": "LA_kwDOImgs2354988AAAABJB-lgQ",
+ "url": "https://codeberg.org/api/v1/repos/owner/reponame/labels/backport-prod",
+ "name": "backport prod",
+ "color": "AB975B",
+ "default": false,
+ "description": ""
+ }
+ ],
+ "milestone": null,
+ "draft": false,
+ "commits_url": "https://codeberg.org/api/v1/repos/owner/reponame/pulls/2368/commits",
+ "review_comments_url": "https://codeberg.org/api/v1/repos/owner/reponame/pulls/2368/comments",
+ "review_comment_url": "https://codeberg.org/api/v1/repos/owner/reponame/pulls/comments{/number}",
+ "comments_url": "https://codeberg.org/api/v1/repos/owner/reponame/issues/2368/comments",
+ "statuses_url": "https://codeberg.org/api/v1/repos/owner/reponame/statuses/91748965051fae1330ad58d15cf694e103267c87",
+ "head": {
+ "label": "kiegroup:bump-8.31.x-drools-8.31.0.Final",
+ "ref": "bump-8.31.x-drools-8.31.0.Final",
+ "sha": "91748965051fae1330ad58d15cf694e103267c87",
+ "user": {
+ "login": "kiegroup",
+ "id": 517980,
+ "node_id": "MDEyOk9yZ2FuaXphdGlvbjUxNzk4MA==",
+ "avatar_url": "https://avatars.codebergusercontent.com/u/517980?v=4",
+ "gravatar_id": "",
+ "url": "https://codeberg.org/api/v1/users/kiegroup",
+ "html_url": "https://codeberg.org/kiegroup",
+ "followers_url": "https://codeberg.org/api/v1/users/kiegroup/followers",
+ "following_url": "https://codeberg.org/api/v1/users/kiegroup/following{/other_user}",
+ "gists_url": "https://codeberg.org/api/v1/users/kiegroup/gists{/gist_id}",
+ "starred_url": "https://codeberg.org/api/v1/users/kiegroup/starred{/owner}{/repo}",
+ "subscriptions_url": "https://codeberg.org/api/v1/users/kiegroup/subscriptions",
+ "organizations_url": "https://codeberg.org/api/v1/users/kiegroup/orgs",
+ "repos_url": "https://codeberg.org/api/v1/users/kiegroup/repos",
+ "events_url": "https://codeberg.org/api/v1/users/kiegroup/events{/privacy}",
+ "received_events_url": "https://codeberg.org/api/v1/users/kiegroup/received_events",
+ "type": "Organization",
+ "site_admin": false
+ },
+ "repo": {
+ "id": 1370858,
+ "node_id": "MDEwOlJlcG9zaXRvcnkxMzcwODU4",
+ "name": "reponame",
+ "full_name": "fork/reponame",
+ "private": false,
+ "owner": {
+ "login": "kiegroup",
+ "id": 517980,
+ "node_id": "MDEyOk9yZ2FuaXphdGlvbjUxNzk4MA==",
+ "avatar_url": "https://avatars.codebergusercontent.com/u/517980?v=4",
+ "gravatar_id": "",
+ "url": "https://codeberg.org/api/v1/users/kiegroup",
+ "html_url": "https://codeberg.org/kiegroup",
+ "followers_url": "https://codeberg.org/api/v1/users/kiegroup/followers",
+ "following_url": "https://codeberg.org/api/v1/users/kiegroup/following{/other_user}",
+ "gists_url": "https://codeberg.org/api/v1/users/kiegroup/gists{/gist_id}",
+ "starred_url": "https://codeberg.org/api/v1/users/kiegroup/starred{/owner}{/repo}",
+ "subscriptions_url": "https://codeberg.org/api/v1/users/kiegroup/subscriptions",
+ "organizations_url": "https://codeberg.org/api/v1/users/kiegroup/orgs",
+ "repos_url": "https://codeberg.org/api/v1/users/kiegroup/repos",
+ "events_url": "https://codeberg.org/api/v1/users/kiegroup/events{/privacy}",
+ "received_events_url": "https://codeberg.org/api/v1/users/kiegroup/received_events",
+ "type": "Organization",
+ "site_admin": false
+ },
+ "html_url": "https://codeberg.org/fork/reponame",
+ "description": "AI constraint solver in Java to optimize the vehicle routing problem, employee rostering, task assignment, maintenance scheduling, conference scheduling and other planning problems.",
+ "fork": false,
+ "url": "https://codeberg.org/api/v1/repos/fork/reponame",
+ "forks_url": "https://codeberg.org/api/v1/repos/fork/reponame/forks",
+ "keys_url": "https://codeberg.org/api/v1/repos/fork/reponame/keys{/key_id}",
+ "collaborators_url": "https://codeberg.org/api/v1/repos/fork/reponame/collaborators{/collaborator}",
+ "teams_url": "https://codeberg.org/api/v1/repos/fork/reponame/teams",
+ "hooks_url": "https://codeberg.org/api/v1/repos/fork/reponame/hooks",
+ "issue_events_url": "https://codeberg.org/api/v1/repos/fork/reponame/issues/events{/number}",
+ "events_url": "https://codeberg.org/api/v1/repos/fork/reponame/events",
+ "assignees_url": "https://codeberg.org/api/v1/repos/fork/reponame/assignees{/user}",
+ "branches_url": "https://codeberg.org/api/v1/repos/fork/reponame/branches{/branch}",
+ "tags_url": "https://codeberg.org/api/v1/repos/fork/reponame/tags",
+ "blobs_url": "https://codeberg.org/api/v1/repos/fork/reponame/git/blobs{/sha}",
+ "git_tags_url": "https://codeberg.org/api/v1/repos/fork/reponame/git/tags{/sha}",
+ "git_refs_url": "https://codeberg.org/api/v1/repos/fork/reponame/git/refs{/sha}",
+ "trees_url": "https://codeberg.org/api/v1/repos/fork/reponame/git/trees{/sha}",
+ "statuses_url": "https://codeberg.org/api/v1/repos/fork/reponame/statuses/{sha}",
+ "languages_url": "https://codeberg.org/api/v1/repos/fork/reponame/languages",
+ "stargazers_url": "https://codeberg.org/api/v1/repos/fork/reponame/stargazers",
+ "contributors_url": "https://codeberg.org/api/v1/repos/fork/reponame/contributors",
+ "subscribers_url": "https://codeberg.org/api/v1/repos/fork/reponame/subscribers",
+ "subscription_url": "https://codeberg.org/api/v1/repos/fork/reponame/subscription",
+ "commits_url": "https://codeberg.org/api/v1/repos/fork/reponame/commits{/sha}",
+ "git_commits_url": "https://codeberg.org/api/v1/repos/fork/reponame/git/commits{/sha}",
+ "comments_url": "https://codeberg.org/api/v1/repos/fork/reponame/comments{/number}",
+ "issue_comment_url": "https://codeberg.org/api/v1/repos/fork/reponame/issues/comments{/number}",
+ "contents_url": "https://codeberg.org/api/v1/repos/fork/reponame/contents/{+path}",
+ "compare_url": "https://codeberg.org/api/v1/repos/fork/reponame/compare/{base}...{head}",
+ "merges_url": "https://codeberg.org/api/v1/repos/fork/reponame/merges",
+ "archive_url": "https://codeberg.org/api/v1/repos/fork/reponame/{archive_format}{/ref}",
+ "downloads_url": "https://codeberg.org/api/v1/repos/fork/reponame/downloads",
+ "issues_url": "https://codeberg.org/api/v1/repos/fork/reponame/issues{/number}",
+ "pulls_url": "https://codeberg.org/api/v1/repos/fork/reponame/pulls{/number}",
+ "milestones_url": "https://codeberg.org/api/v1/repos/fork/reponame/milestones{/number}",
+ "notifications_url": "https://codeberg.org/api/v1/repos/fork/reponame/notifications{?since,all,participating}",
+ "labels_url": "https://codeberg.org/api/v1/repos/fork/reponame/labels{/name}",
+ "releases_url": "https://codeberg.org/api/v1/repos/fork/reponame/releases{/id}",
+ "deployments_url": "https://codeberg.org/api/v1/repos/fork/reponame/deployments",
+ "created_at": "2011-02-15T19:38:23Z",
+ "updated_at": "2022-11-28T05:01:47Z",
+ "pushed_at": "2022-11-28T10:50:51Z",
+ "git_url": "git://codeberg.org/fork/reponame.git",
+ "ssh_url": "git@codeberg.org:fork/reponame.git",
+ "clone_url": "https://codeberg.org/fork/reponame.git",
+ "svn_url": "https://codeberg.org/fork/reponame",
+ "homepage": "https://www.reponame.org",
+ "size": 238339,
+ "stargazers_count": 2811,
+ "watchers_count": 2811,
+ "language": "Java",
+ "has_issues": false,
+ "has_projects": false,
+ "has_downloads": true,
+ "has_wiki": false,
+ "has_pages": false,
+ "has_discussions": false,
+ "forks_count": 878,
+ "mirror_url": null,
+ "archived": false,
+ "disabled": false,
+ "open_issues_count": 30,
+ "license": {
+ "key": "apache-2.0",
+ "name": "Apache License 2.0",
+ "spdx_id": "Apache-2.0",
+ "url": "https://codeberg.org/api/v1/licenses/apache-2.0",
+ "node_id": "MDc6TGljZW5zZTI="
+ },
+ "allow_forking": true,
+ "is_template": false,
+ "web_commit_signoff_required": false,
+ "topics": [
+ "artificial-intelligence",
+ "branch-and-bound",
+ "constraint-programming",
+ "constraint-satisfaction-problem",
+ "constraint-solver",
+ "constraints",
+ "employee-rostering",
+ "java",
+ "local-search",
+ "mathematical-optimization",
+ "metaheuristics",
+ "optimization",
+ "rostering",
+ "scheduling",
+ "simulated-annealing",
+ "solver",
+ "tabu-search",
+ "traveling-salesman",
+ "traveling-salesman-problem",
+ "vehicle-routing-problem"
+ ],
+ "visibility": "public",
+ "forks": 878,
+ "open_issues": 30,
+ "watchers": 2811,
+ "default_branch": "main"
+ }
+ },
+ "base": {
+ "label": "kiegroup:8.31.x",
+ "ref": "8.31.x",
+ "sha": "8cfc286765cb01c84a1d62c65519fa8032bfecbd",
+ "user": {
+ "login": "kiegroup",
+ "id": 517980,
+ "node_id": "MDEyOk9yZ2FuaXphdGlvbjUxNzk4MA==",
+ "avatar_url": "https://avatars.codebergusercontent.com/u/517980?v=4",
+ "gravatar_id": "",
+ "url": "https://codeberg.org/api/v1/users/kiegroup",
+ "html_url": "https://codeberg.org/kiegroup",
+ "followers_url": "https://codeberg.org/api/v1/users/kiegroup/followers",
+ "following_url": "https://codeberg.org/api/v1/users/kiegroup/following{/other_user}",
+ "gists_url": "https://codeberg.org/api/v1/users/kiegroup/gists{/gist_id}",
+ "starred_url": "https://codeberg.org/api/v1/users/kiegroup/starred{/owner}{/repo}",
+ "subscriptions_url": "https://codeberg.org/api/v1/users/kiegroup/subscriptions",
+ "organizations_url": "https://codeberg.org/api/v1/users/kiegroup/orgs",
+ "repos_url": "https://codeberg.org/api/v1/users/kiegroup/repos",
+ "events_url": "https://codeberg.org/api/v1/users/kiegroup/events{/privacy}",
+ "received_events_url": "https://codeberg.org/api/v1/users/kiegroup/received_events",
+ "type": "Organization",
+ "site_admin": false
+ },
+ "repo": {
+ "id": 1370858,
+ "node_id": "MDEwOlJlcG9zaXRvcnkxMzcwODU4",
+ "name": "reponame",
+ "full_name": "owner/reponame",
+ "private": false,
+ "owner": {
+ "login": "kiegroup",
+ "id": 517980,
+ "node_id": "MDEyOk9yZ2FuaXphdGlvbjUxNzk4MA==",
+ "avatar_url": "https://avatars.codebergusercontent.com/u/517980?v=4",
+ "gravatar_id": "",
+ "url": "https://codeberg.org/api/v1/users/kiegroup",
+ "html_url": "https://codeberg.org/kiegroup",
+ "followers_url": "https://codeberg.org/api/v1/users/kiegroup/followers",
+ "following_url": "https://codeberg.org/api/v1/users/kiegroup/following{/other_user}",
+ "gists_url": "https://codeberg.org/api/v1/users/kiegroup/gists{/gist_id}",
+ "starred_url": "https://codeberg.org/api/v1/users/kiegroup/starred{/owner}{/repo}",
+ "subscriptions_url": "https://codeberg.org/api/v1/users/kiegroup/subscriptions",
+ "organizations_url": "https://codeberg.org/api/v1/users/kiegroup/orgs",
+ "repos_url": "https://codeberg.org/api/v1/users/kiegroup/repos",
+ "events_url": "https://codeberg.org/api/v1/users/kiegroup/events{/privacy}",
+ "received_events_url": "https://codeberg.org/api/v1/users/kiegroup/received_events",
+ "type": "Organization",
+ "site_admin": false
+ },
+ "html_url": "https://codeberg.org/owner/reponame",
+ "description": "AI constraint solver in Java to optimize the vehicle routing problem, employee rostering, task assignment, maintenance scheduling, conference scheduling and other planning problems.",
+ "fork": false,
+ "url": "https://codeberg.org/api/v1/repos/owner/reponame",
+ "forks_url": "https://codeberg.org/api/v1/repos/owner/reponame/forks",
+ "keys_url": "https://codeberg.org/api/v1/repos/owner/reponame/keys{/key_id}",
+ "collaborators_url": "https://codeberg.org/api/v1/repos/owner/reponame/collaborators{/collaborator}",
+ "teams_url": "https://codeberg.org/api/v1/repos/owner/reponame/teams",
+ "hooks_url": "https://codeberg.org/api/v1/repos/owner/reponame/hooks",
+ "issue_events_url": "https://codeberg.org/api/v1/repos/owner/reponame/issues/events{/number}",
+ "events_url": "https://codeberg.org/api/v1/repos/owner/reponame/events",
+ "assignees_url": "https://codeberg.org/api/v1/repos/owner/reponame/assignees{/user}",
+ "branches_url": "https://codeberg.org/api/v1/repos/owner/reponame/branches{/branch}",
+ "tags_url": "https://codeberg.org/api/v1/repos/owner/reponame/tags",
+ "blobs_url": "https://codeberg.org/api/v1/repos/owner/reponame/git/blobs{/sha}",
+ "git_tags_url": "https://codeberg.org/api/v1/repos/owner/reponame/git/tags{/sha}",
+ "git_refs_url": "https://codeberg.org/api/v1/repos/owner/reponame/git/refs{/sha}",
+ "trees_url": "https://codeberg.org/api/v1/repos/owner/reponame/git/trees{/sha}",
+ "statuses_url": "https://codeberg.org/api/v1/repos/owner/reponame/statuses/{sha}",
+ "languages_url": "https://codeberg.org/api/v1/repos/owner/reponame/languages",
+ "stargazers_url": "https://codeberg.org/api/v1/repos/owner/reponame/stargazers",
+ "contributors_url": "https://codeberg.org/api/v1/repos/owner/reponame/contributors",
+ "subscribers_url": "https://codeberg.org/api/v1/repos/owner/reponame/subscribers",
+ "subscription_url": "https://codeberg.org/api/v1/repos/owner/reponame/subscription",
+ "commits_url": "https://codeberg.org/api/v1/repos/owner/reponame/commits{/sha}",
+ "git_commits_url": "https://codeberg.org/api/v1/repos/owner/reponame/git/commits{/sha}",
+ "comments_url": "https://codeberg.org/api/v1/repos/owner/reponame/comments{/number}",
+ "issue_comment_url": "https://codeberg.org/api/v1/repos/owner/reponame/issues/comments{/number}",
+ "contents_url": "https://codeberg.org/api/v1/repos/owner/reponame/contents/{+path}",
+ "compare_url": "https://codeberg.org/api/v1/repos/owner/reponame/compare/{base}...{head}",
+ "merges_url": "https://codeberg.org/api/v1/repos/owner/reponame/merges",
+ "archive_url": "https://codeberg.org/api/v1/repos/owner/reponame/{archive_format}{/ref}",
+ "downloads_url": "https://codeberg.org/api/v1/repos/owner/reponame/downloads",
+ "issues_url": "https://codeberg.org/api/v1/repos/owner/reponame/issues{/number}",
+ "pulls_url": "https://codeberg.org/api/v1/repos/owner/reponame/pulls{/number}",
+ "milestones_url": "https://codeberg.org/api/v1/repos/owner/reponame/milestones{/number}",
+ "notifications_url": "https://codeberg.org/api/v1/repos/owner/reponame/notifications{?since,all,participating}",
+ "labels_url": "https://codeberg.org/api/v1/repos/owner/reponame/labels{/name}",
+ "releases_url": "https://codeberg.org/api/v1/repos/owner/reponame/releases{/id}",
+ "deployments_url": "https://codeberg.org/api/v1/repos/owner/reponame/deployments",
+ "created_at": "2011-02-15T19:38:23Z",
+ "updated_at": "2022-11-28T05:01:47Z",
+ "pushed_at": "2022-11-28T10:50:51Z",
+ "git_url": "git://codeberg.org/owner/reponame.git",
+ "ssh_url": "git@codeberg.org:owner/reponame.git",
+ "clone_url": "https://codeberg.org/owner/reponame.git",
+ "svn_url": "https://codeberg.org/owner/reponame",
+ "homepage": "https://www.reponame.org",
+ "size": 238339,
+ "stargazers_count": 2811,
+ "watchers_count": 2811,
+ "language": "Java",
+ "has_issues": false,
+ "has_projects": false,
+ "has_downloads": true,
+ "has_wiki": false,
+ "has_pages": false,
+ "has_discussions": false,
+ "forks_count": 878,
+ "mirror_url": null,
+ "archived": false,
+ "disabled": false,
+ "open_issues_count": 30,
+ "license": {
+ "key": "apache-2.0",
+ "name": "Apache License 2.0",
+ "spdx_id": "Apache-2.0",
+ "url": "https://codeberg.org/api/v1/licenses/apache-2.0",
+ "node_id": "MDc6TGljZW5zZTI="
+ },
+ "allow_forking": true,
+ "is_template": false,
+ "web_commit_signoff_required": false,
+ "topics": [
+ "artificial-intelligence",
+ "branch-and-bound",
+ "constraint-programming",
+ "constraint-satisfaction-problem",
+ "constraint-solver",
+ "constraints",
+ "employee-rostering",
+ "java",
+ "local-search",
+ "mathematical-optimization",
+ "metaheuristics",
+ "optimization",
+ "rostering",
+ "scheduling",
+ "simulated-annealing",
+ "solver",
+ "tabu-search",
+ "traveling-salesman",
+ "traveling-salesman-problem",
+ "vehicle-routing-problem"
+ ],
+ "visibility": "public",
+ "forks": 878,
+ "open_issues": 30,
+ "watchers": 2811,
+ "default_branch": "main"
+ }
+ },
+ "_links": {
+ "self": {
+ "href": "https://codeberg.org/api/v1/repos/owner/reponame/pulls/2368"
+ },
+ "html": {
+ "href": "https://codeberg.org/owner/reponame/pulls/2368"
+ },
+ "issue": {
+ "href": "https://codeberg.org/api/v1/repos/owner/reponame/issues/2368"
+ },
+ "comments": {
+ "href": "https://codeberg.org/api/v1/repos/owner/reponame/issues/2368/comments"
+ },
+ "review_comments": {
+ "href": "https://codeberg.org/api/v1/repos/owner/reponame/pulls/2368/comments"
+ },
+ "review_comment": {
+ "href": "https://codeberg.org/api/v1/repos/owner/reponame/pulls/comments{/number}"
+ },
+ "commits": {
+ "href": "https://codeberg.org/api/v1/repos/owner/reponame/pulls/2368/commits"
+ },
+ "statuses": {
+ "href": "https://codeberg.org/api/v1/repos/owner/reponame/statuses/91748965051fae1330ad58d15cf694e103267c87"
+ }
+ },
+ "author_association": "CONTRIBUTOR",
+ "auto_merge": null,
+ "active_lock_reason": null,
+ "merged": true,
+ "mergeable": null,
+ "rebaseable": null,
+ "mergeable_state": "unknown",
+ "merged_by": {
+ "login": "that-s-a-user",
+ "id": 17157711,
+ "node_id": "MDQ6VXNlcjE3MTU3NzEx",
+ "avatar_url": "https://avatars.codebergusercontent.com/u/17157711?v=4",
+ "gravatar_id": "",
+ "url": "https://codeberg.org/api/v1/users/that-s-a-user",
+ "html_url": "https://codeberg.org/that-s-a-user",
+ "followers_url": "https://codeberg.org/api/v1/users/that-s-a-user/followers",
+ "following_url": "https://codeberg.org/api/v1/users/that-s-a-user/following{/other_user}",
+ "gists_url": "https://codeberg.org/api/v1/users/that-s-a-user/gists{/gist_id}",
+ "starred_url": "https://codeberg.org/api/v1/users/that-s-a-user/starred{/owner}{/repo}",
+ "subscriptions_url": "https://codeberg.org/api/v1/users/that-s-a-user/subscriptions",
+ "organizations_url": "https://codeberg.org/api/v1/users/that-s-a-user/orgs",
+ "repos_url": "https://codeberg.org/api/v1/users/that-s-a-user/repos",
+ "events_url": "https://codeberg.org/api/v1/users/that-s-a-user/events{/privacy}",
+ "received_events_url": "https://codeberg.org/api/v1/users/that-s-a-user/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "comments": 0,
+ "review_comments": 0,
+ "maintainer_can_modify": false,
+ "commits": 2,
+ "additions": 2,
+ "deletions": 2,
+ "changed_files": 2
+};
+
+export const CB_OPEN_PR_FIXTURE = {
+ "url": "https://codeberg.org/api/v1/repos/owner/reponame/pulls/4444",
+ "id": 1137188271,
+ "node_id": "PR_kwDOABTq6s5DyB2v",
+ "html_url": "https://codeberg.org/owner/reponame/pulls/4444",
+ "diff_url": "https://codeberg.org/owner/reponame/pulls/4444.diff",
+ "patch_url": "https://codeberg.org/owner/reponame/pulls/4444.patch",
+ "issue_url": "https://codeberg.org/api/v1/repos/owner/reponame/issues/4444",
+ "number": 4444,
+ "state": "open",
+ "locked": false,
+ "title": "PR Title",
+ "user": {
+ "login": "gh-user",
+ "id": 11995863,
+ "node_id": "MDQ6VXNlcjExOTk1ODYz",
+ "avatar_url": "https://avatars.codebergusercontent.com/u/11995863?v=4",
+ "gravatar_id": "",
+ "url": "https://codeberg.org/api/v1/users/gh-user",
+ "html_url": "https://codeberg.org/gh-user",
+ "followers_url": "https://codeberg.org/api/v1/users/gh-user/followers",
+ "following_url": "https://codeberg.org/api/v1/users/gh-user/following{/other_user}",
+ "gists_url": "https://codeberg.org/api/v1/users/gh-user/gists{/gist_id}",
+ "starred_url": "https://codeberg.org/api/v1/users/gh-user/starred{/owner}{/repo}",
+ "subscriptions_url": "https://codeberg.org/api/v1/users/gh-user/subscriptions",
+ "organizations_url": "https://codeberg.org/api/v1/users/gh-user/orgs",
+ "repos_url": "https://codeberg.org/api/v1/users/gh-user/repos",
+ "events_url": "https://codeberg.org/api/v1/users/gh-user/events{/privacy}",
+ "received_events_url": "https://codeberg.org/api/v1/users/gh-user/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "body": "Please review and merge",
+ "created_at": "2022-11-28T08:43:09Z",
+ "updated_at": "2022-11-28T10:11:53Z",
+ "closed_at": "2022-11-28T10:11:52Z",
+ "merged_at": "2022-11-28T10:11:52Z",
+ "merge_commit_sha": "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc",
+ "assignee": null,
+ "assignees": [
+
+ ],
+ "requested_reviewers": [
+ {
+ "login": "gh-user",
+ "id": 1422582,
+ "node_id": "MDQ6VXNlcjE0MjI1ODI=",
+ "avatar_url": "https://avatars.codebergusercontent.com/u/1422582?v=4",
+ "gravatar_id": "",
+ "url": "https://codeberg.org/api/v1/users/gh-user",
+ "html_url": "https://codeberg.org/gh-user",
+ "followers_url": "https://codeberg.org/api/v1/users/gh-user/followers",
+ "following_url": "https://codeberg.org/api/v1/users/gh-user/following{/other_user}",
+ "gists_url": "https://codeberg.org/api/v1/users/gh-user/gists{/gist_id}",
+ "starred_url": "https://codeberg.org/api/v1/users/gh-user/starred{/owner}{/repo}",
+ "subscriptions_url": "https://codeberg.org/api/v1/users/gh-user/subscriptions",
+ "organizations_url": "https://codeberg.org/api/v1/users/gh-user/orgs",
+ "repos_url": "https://codeberg.org/api/v1/users/gh-user/repos",
+ "events_url": "https://codeberg.org/api/v1/users/gh-user/events{/privacy}",
+ "received_events_url": "https://codeberg.org/api/v1/users/gh-user/received_events",
+ "type": "User",
+ "site_admin": false
+ }
+ ],
+ "requested_teams": [
+
+ ],
+ "labels": [
+
+ ],
+ "milestone": null,
+ "draft": false,
+ "commits_url": "https://codeberg.org/api/v1/repos/owner/reponame/pulls/4444/commits",
+ "review_comments_url": "https://codeberg.org/api/v1/repos/owner/reponame/pulls/4444/comments",
+ "review_comment_url": "https://codeberg.org/api/v1/repos/owner/reponame/pulls/comments{/number}",
+ "comments_url": "https://codeberg.org/api/v1/repos/owner/reponame/issues/4444/comments",
+ "statuses_url": "https://codeberg.org/api/v1/repos/owner/reponame/statuses/91748965051fae1330ad58d15cf694e103267c87",
+ "head": {
+ "label": "kiegroup:bump-8.31.x-drools-8.31.0.Final",
+ "ref": "bump-8.31.x-drools-8.31.0.Final",
+ "sha": "91748965051fae1330ad58d15cf694e103267c87",
+ "user": {
+ "login": "kiegroup",
+ "id": 517980,
+ "node_id": "MDEyOk9yZ2FuaXphdGlvbjUxNzk4MA==",
+ "avatar_url": "https://avatars.codebergusercontent.com/u/517980?v=4",
+ "gravatar_id": "",
+ "url": "https://codeberg.org/api/v1/users/kiegroup",
+ "html_url": "https://codeberg.org/kiegroup",
+ "followers_url": "https://codeberg.org/api/v1/users/kiegroup/followers",
+ "following_url": "https://codeberg.org/api/v1/users/kiegroup/following{/other_user}",
+ "gists_url": "https://codeberg.org/api/v1/users/kiegroup/gists{/gist_id}",
+ "starred_url": "https://codeberg.org/api/v1/users/kiegroup/starred{/owner}{/repo}",
+ "subscriptions_url": "https://codeberg.org/api/v1/users/kiegroup/subscriptions",
+ "organizations_url": "https://codeberg.org/api/v1/users/kiegroup/orgs",
+ "repos_url": "https://codeberg.org/api/v1/users/kiegroup/repos",
+ "events_url": "https://codeberg.org/api/v1/users/kiegroup/events{/privacy}",
+ "received_events_url": "https://codeberg.org/api/v1/users/kiegroup/received_events",
+ "type": "Organization",
+ "site_admin": false
+ },
+ "repo": {
+ "id": 1370858,
+ "node_id": "MDEwOlJlcG9zaXRvcnkxMzcwODU4",
+ "name": "reponame",
+ "full_name": "fork/reponame",
+ "private": false,
+ "owner": {
+ "login": "kiegroup",
+ "id": 517980,
+ "node_id": "MDEyOk9yZ2FuaXphdGlvbjUxNzk4MA==",
+ "avatar_url": "https://avatars.codebergusercontent.com/u/517980?v=4",
+ "gravatar_id": "",
+ "url": "https://codeberg.org/api/v1/users/kiegroup",
+ "html_url": "https://codeberg.org/kiegroup",
+ "followers_url": "https://codeberg.org/api/v1/users/kiegroup/followers",
+ "following_url": "https://codeberg.org/api/v1/users/kiegroup/following{/other_user}",
+ "gists_url": "https://codeberg.org/api/v1/users/kiegroup/gists{/gist_id}",
+ "starred_url": "https://codeberg.org/api/v1/users/kiegroup/starred{/owner}{/repo}",
+ "subscriptions_url": "https://codeberg.org/api/v1/users/kiegroup/subscriptions",
+ "organizations_url": "https://codeberg.org/api/v1/users/kiegroup/orgs",
+ "repos_url": "https://codeberg.org/api/v1/users/kiegroup/repos",
+ "events_url": "https://codeberg.org/api/v1/users/kiegroup/events{/privacy}",
+ "received_events_url": "https://codeberg.org/api/v1/users/kiegroup/received_events",
+ "type": "Organization",
+ "site_admin": false
+ },
+ "html_url": "https://codeberg.org/fork/reponame",
+ "description": "AI constraint solver in Java to optimize the vehicle routing problem, employee rostering, task assignment, maintenance scheduling, conference scheduling and other planning problems.",
+ "fork": false,
+ "url": "https://codeberg.org/api/v1/repos/fork/reponame",
+ "forks_url": "https://codeberg.org/api/v1/repos/fork/reponame/forks",
+ "keys_url": "https://codeberg.org/api/v1/repos/fork/reponame/keys{/key_id}",
+ "collaborators_url": "https://codeberg.org/api/v1/repos/fork/reponame/collaborators{/collaborator}",
+ "teams_url": "https://codeberg.org/api/v1/repos/fork/reponame/teams",
+ "hooks_url": "https://codeberg.org/api/v1/repos/fork/reponame/hooks",
+ "issue_events_url": "https://codeberg.org/api/v1/repos/fork/reponame/issues/events{/number}",
+ "events_url": "https://codeberg.org/api/v1/repos/fork/reponame/events",
+ "assignees_url": "https://codeberg.org/api/v1/repos/fork/reponame/assignees{/user}",
+ "branches_url": "https://codeberg.org/api/v1/repos/fork/reponame/branches{/branch}",
+ "tags_url": "https://codeberg.org/api/v1/repos/fork/reponame/tags",
+ "blobs_url": "https://codeberg.org/api/v1/repos/fork/reponame/git/blobs{/sha}",
+ "git_tags_url": "https://codeberg.org/api/v1/repos/fork/reponame/git/tags{/sha}",
+ "git_refs_url": "https://codeberg.org/api/v1/repos/fork/reponame/git/refs{/sha}",
+ "trees_url": "https://codeberg.org/api/v1/repos/fork/reponame/git/trees{/sha}",
+ "statuses_url": "https://codeberg.org/api/v1/repos/fork/reponame/statuses/{sha}",
+ "languages_url": "https://codeberg.org/api/v1/repos/fork/reponame/languages",
+ "stargazers_url": "https://codeberg.org/api/v1/repos/fork/reponame/stargazers",
+ "contributors_url": "https://codeberg.org/api/v1/repos/fork/reponame/contributors",
+ "subscribers_url": "https://codeberg.org/api/v1/repos/fork/reponame/subscribers",
+ "subscription_url": "https://codeberg.org/api/v1/repos/fork/reponame/subscription",
+ "commits_url": "https://codeberg.org/api/v1/repos/fork/reponame/commits{/sha}",
+ "git_commits_url": "https://codeberg.org/api/v1/repos/fork/reponame/git/commits{/sha}",
+ "comments_url": "https://codeberg.org/api/v1/repos/fork/reponame/comments{/number}",
+ "issue_comment_url": "https://codeberg.org/api/v1/repos/fork/reponame/issues/comments{/number}",
+ "contents_url": "https://codeberg.org/api/v1/repos/fork/reponame/contents/{+path}",
+ "compare_url": "https://codeberg.org/api/v1/repos/fork/reponame/compare/{base}...{head}",
+ "merges_url": "https://codeberg.org/api/v1/repos/fork/reponame/merges",
+ "archive_url": "https://codeberg.org/api/v1/repos/fork/reponame/{archive_format}{/ref}",
+ "downloads_url": "https://codeberg.org/api/v1/repos/fork/reponame/downloads",
+ "issues_url": "https://codeberg.org/api/v1/repos/fork/reponame/issues{/number}",
+ "pulls_url": "https://codeberg.org/api/v1/repos/fork/reponame/pulls{/number}",
+ "milestones_url": "https://codeberg.org/api/v1/repos/fork/reponame/milestones{/number}",
+ "notifications_url": "https://codeberg.org/api/v1/repos/fork/reponame/notifications{?since,all,participating}",
+ "labels_url": "https://codeberg.org/api/v1/repos/fork/reponame/labels{/name}",
+ "releases_url": "https://codeberg.org/api/v1/repos/fork/reponame/releases{/id}",
+ "deployments_url": "https://codeberg.org/api/v1/repos/fork/reponame/deployments",
+ "created_at": "2011-02-15T19:38:23Z",
+ "updated_at": "2022-11-28T05:01:47Z",
+ "pushed_at": "2022-11-28T10:50:51Z",
+ "git_url": "git://codeberg.org/fork/reponame.git",
+ "ssh_url": "git@codeberg.org:fork/reponame.git",
+ "clone_url": "https://codeberg.org/fork/reponame.git",
+ "svn_url": "https://codeberg.org/fork/reponame",
+ "homepage": "https://www.reponame.org",
+ "size": 238339,
+ "stargazers_count": 2811,
+ "watchers_count": 2811,
+ "language": "Java",
+ "has_issues": false,
+ "has_projects": false,
+ "has_downloads": true,
+ "has_wiki": false,
+ "has_pages": false,
+ "has_discussions": false,
+ "forks_count": 878,
+ "mirror_url": null,
+ "archived": false,
+ "disabled": false,
+ "open_issues_count": 30,
+ "license": {
+ "key": "apache-2.0",
+ "name": "Apache License 2.0",
+ "spdx_id": "Apache-2.0",
+ "url": "https://codeberg.org/api/v1/licenses/apache-2.0",
+ "node_id": "MDc6TGljZW5zZTI="
+ },
+ "allow_forking": true,
+ "is_template": false,
+ "web_commit_signoff_required": false,
+ "topics": [
+ "artificial-intelligence",
+ "branch-and-bound",
+ "constraint-programming",
+ "constraint-satisfaction-problem",
+ "constraint-solver",
+ "constraints",
+ "employee-rostering",
+ "java",
+ "local-search",
+ "mathematical-optimization",
+ "metaheuristics",
+ "optimization",
+ "rostering",
+ "scheduling",
+ "simulated-annealing",
+ "solver",
+ "tabu-search",
+ "traveling-salesman",
+ "traveling-salesman-problem",
+ "vehicle-routing-problem"
+ ],
+ "visibility": "public",
+ "forks": 878,
+ "open_issues": 30,
+ "watchers": 2811,
+ "default_branch": "main"
+ }
+ },
+ "base": {
+ "label": "kiegroup:8.31.x",
+ "ref": "8.31.x",
+ "sha": "8cfc286765cb01c84a1d62c65519fa8032bfecbd",
+ "user": {
+ "login": "kiegroup",
+ "id": 517980,
+ "node_id": "MDEyOk9yZ2FuaXphdGlvbjUxNzk4MA==",
+ "avatar_url": "https://avatars.codebergusercontent.com/u/517980?v=4",
+ "gravatar_id": "",
+ "url": "https://codeberg.org/api/v1/users/kiegroup",
+ "html_url": "https://codeberg.org/kiegroup",
+ "followers_url": "https://codeberg.org/api/v1/users/kiegroup/followers",
+ "following_url": "https://codeberg.org/api/v1/users/kiegroup/following{/other_user}",
+ "gists_url": "https://codeberg.org/api/v1/users/kiegroup/gists{/gist_id}",
+ "starred_url": "https://codeberg.org/api/v1/users/kiegroup/starred{/owner}{/repo}",
+ "subscriptions_url": "https://codeberg.org/api/v1/users/kiegroup/subscriptions",
+ "organizations_url": "https://codeberg.org/api/v1/users/kiegroup/orgs",
+ "repos_url": "https://codeberg.org/api/v1/users/kiegroup/repos",
+ "events_url": "https://codeberg.org/api/v1/users/kiegroup/events{/privacy}",
+ "received_events_url": "https://codeberg.org/api/v1/users/kiegroup/received_events",
+ "type": "Organization",
+ "site_admin": false
+ },
+ "repo": {
+ "id": 1370858,
+ "node_id": "MDEwOlJlcG9zaXRvcnkxMzcwODU4",
+ "name": "reponame",
+ "full_name": "owner/reponame",
+ "private": false,
+ "owner": {
+ "login": "kiegroup",
+ "id": 517980,
+ "node_id": "MDEyOk9yZ2FuaXphdGlvbjUxNzk4MA==",
+ "avatar_url": "https://avatars.codebergusercontent.com/u/517980?v=4",
+ "gravatar_id": "",
+ "url": "https://codeberg.org/api/v1/users/kiegroup",
+ "html_url": "https://codeberg.org/kiegroup",
+ "followers_url": "https://codeberg.org/api/v1/users/kiegroup/followers",
+ "following_url": "https://codeberg.org/api/v1/users/kiegroup/following{/other_user}",
+ "gists_url": "https://codeberg.org/api/v1/users/kiegroup/gists{/gist_id}",
+ "starred_url": "https://codeberg.org/api/v1/users/kiegroup/starred{/owner}{/repo}",
+ "subscriptions_url": "https://codeberg.org/api/v1/users/kiegroup/subscriptions",
+ "organizations_url": "https://codeberg.org/api/v1/users/kiegroup/orgs",
+ "repos_url": "https://codeberg.org/api/v1/users/kiegroup/repos",
+ "events_url": "https://codeberg.org/api/v1/users/kiegroup/events{/privacy}",
+ "received_events_url": "https://codeberg.org/api/v1/users/kiegroup/received_events",
+ "type": "Organization",
+ "site_admin": false
+ },
+ "html_url": "https://codeberg.org/owner/reponame",
+ "description": "AI constraint solver in Java to optimize the vehicle routing problem, employee rostering, task assignment, maintenance scheduling, conference scheduling and other planning problems.",
+ "fork": false,
+ "url": "https://codeberg.org/api/v1/repos/owner/reponame",
+ "forks_url": "https://codeberg.org/api/v1/repos/owner/reponame/forks",
+ "keys_url": "https://codeberg.org/api/v1/repos/owner/reponame/keys{/key_id}",
+ "collaborators_url": "https://codeberg.org/api/v1/repos/owner/reponame/collaborators{/collaborator}",
+ "teams_url": "https://codeberg.org/api/v1/repos/owner/reponame/teams",
+ "hooks_url": "https://codeberg.org/api/v1/repos/owner/reponame/hooks",
+ "issue_events_url": "https://codeberg.org/api/v1/repos/owner/reponame/issues/events{/number}",
+ "events_url": "https://codeberg.org/api/v1/repos/owner/reponame/events",
+ "assignees_url": "https://codeberg.org/api/v1/repos/owner/reponame/assignees{/user}",
+ "branches_url": "https://codeberg.org/api/v1/repos/owner/reponame/branches{/branch}",
+ "tags_url": "https://codeberg.org/api/v1/repos/owner/reponame/tags",
+ "blobs_url": "https://codeberg.org/api/v1/repos/owner/reponame/git/blobs{/sha}",
+ "git_tags_url": "https://codeberg.org/api/v1/repos/owner/reponame/git/tags{/sha}",
+ "git_refs_url": "https://codeberg.org/api/v1/repos/owner/reponame/git/refs{/sha}",
+ "trees_url": "https://codeberg.org/api/v1/repos/owner/reponame/git/trees{/sha}",
+ "statuses_url": "https://codeberg.org/api/v1/repos/owner/reponame/statuses/{sha}",
+ "languages_url": "https://codeberg.org/api/v1/repos/owner/reponame/languages",
+ "stargazers_url": "https://codeberg.org/api/v1/repos/owner/reponame/stargazers",
+ "contributors_url": "https://codeberg.org/api/v1/repos/owner/reponame/contributors",
+ "subscribers_url": "https://codeberg.org/api/v1/repos/owner/reponame/subscribers",
+ "subscription_url": "https://codeberg.org/api/v1/repos/owner/reponame/subscription",
+ "commits_url": "https://codeberg.org/api/v1/repos/owner/reponame/commits{/sha}",
+ "git_commits_url": "https://codeberg.org/api/v1/repos/owner/reponame/git/commits{/sha}",
+ "comments_url": "https://codeberg.org/api/v1/repos/owner/reponame/comments{/number}",
+ "issue_comment_url": "https://codeberg.org/api/v1/repos/owner/reponame/issues/comments{/number}",
+ "contents_url": "https://codeberg.org/api/v1/repos/owner/reponame/contents/{+path}",
+ "compare_url": "https://codeberg.org/api/v1/repos/owner/reponame/compare/{base}...{head}",
+ "merges_url": "https://codeberg.org/api/v1/repos/owner/reponame/merges",
+ "archive_url": "https://codeberg.org/api/v1/repos/owner/reponame/{archive_format}{/ref}",
+ "downloads_url": "https://codeberg.org/api/v1/repos/owner/reponame/downloads",
+ "issues_url": "https://codeberg.org/api/v1/repos/owner/reponame/issues{/number}",
+ "pulls_url": "https://codeberg.org/api/v1/repos/owner/reponame/pulls{/number}",
+ "milestones_url": "https://codeberg.org/api/v1/repos/owner/reponame/milestones{/number}",
+ "notifications_url": "https://codeberg.org/api/v1/repos/owner/reponame/notifications{?since,all,participating}",
+ "labels_url": "https://codeberg.org/api/v1/repos/owner/reponame/labels{/name}",
+ "releases_url": "https://codeberg.org/api/v1/repos/owner/reponame/releases{/id}",
+ "deployments_url": "https://codeberg.org/api/v1/repos/owner/reponame/deployments",
+ "created_at": "2011-02-15T19:38:23Z",
+ "updated_at": "2022-11-28T05:01:47Z",
+ "pushed_at": "2022-11-28T10:50:51Z",
+ "git_url": "git://codeberg.org/owner/reponame.git",
+ "ssh_url": "git@codeberg.org:owner/reponame.git",
+ "clone_url": "https://codeberg.org/owner/reponame.git",
+ "svn_url": "https://codeberg.org/owner/reponame",
+ "homepage": "https://www.reponame.org",
+ "size": 238339,
+ "stargazers_count": 2811,
+ "watchers_count": 2811,
+ "language": "Java",
+ "has_issues": false,
+ "has_projects": false,
+ "has_downloads": true,
+ "has_wiki": false,
+ "has_pages": false,
+ "has_discussions": false,
+ "forks_count": 878,
+ "mirror_url": null,
+ "archived": false,
+ "disabled": false,
+ "open_issues_count": 30,
+ "license": {
+ "key": "apache-2.0",
+ "name": "Apache License 2.0",
+ "spdx_id": "Apache-2.0",
+ "url": "https://codeberg.org/api/v1/licenses/apache-2.0",
+ "node_id": "MDc6TGljZW5zZTI="
+ },
+ "allow_forking": true,
+ "is_template": false,
+ "web_commit_signoff_required": false,
+ "topics": [
+ "artificial-intelligence",
+ "branch-and-bound",
+ "constraint-programming",
+ "constraint-satisfaction-problem",
+ "constraint-solver",
+ "constraints",
+ "employee-rostering",
+ "java",
+ "local-search",
+ "mathematical-optimization",
+ "metaheuristics",
+ "optimization",
+ "rostering",
+ "scheduling",
+ "simulated-annealing",
+ "solver",
+ "tabu-search",
+ "traveling-salesman",
+ "traveling-salesman-problem",
+ "vehicle-routing-problem"
+ ],
+ "visibility": "public",
+ "forks": 878,
+ "open_issues": 30,
+ "watchers": 2811,
+ "default_branch": "main"
+ }
+ },
+ "_links": {
+ "self": {
+ "href": "https://codeberg.org/api/v1/repos/owner/reponame/pulls/4444"
+ },
+ "html": {
+ "href": "https://codeberg.org/owner/reponame/pulls/4444"
+ },
+ "issue": {
+ "href": "https://codeberg.org/api/v1/repos/owner/reponame/issues/4444"
+ },
+ "comments": {
+ "href": "https://codeberg.org/api/v1/repos/owner/reponame/issues/4444/comments"
+ },
+ "review_comments": {
+ "href": "https://codeberg.org/api/v1/repos/owner/reponame/pulls/4444/comments"
+ },
+ "review_comment": {
+ "href": "https://codeberg.org/api/v1/repos/owner/reponame/pulls/comments{/number}"
+ },
+ "commits": {
+ "href": "https://codeberg.org/api/v1/repos/owner/reponame/pulls/4444/commits"
+ },
+ "statuses": {
+ "href": "https://codeberg.org/api/v1/repos/owner/reponame/statuses/91748965051fae1330ad58d15cf694e103267c87"
+ }
+ },
+ "author_association": "CONTRIBUTOR",
+ "auto_merge": null,
+ "active_lock_reason": null,
+ "merged": null,
+ "mergeable": null,
+ "rebaseable": null,
+ "mergeable_state": "unknown",
+ "merged_by": {},
+ "comments": 0,
+ "review_comments": 0,
+ "maintainer_can_modify": false,
+ "commits": 2,
+ "additions": 2,
+ "deletions": 2,
+ "changed_files": 2
+};
+
+export const CB_NOT_MERGED_PR_FIXTURE = {
+ "url": "https://codeberg.org/api/v1/repos/owner/reponame/pulls/6666",
+ "id": 1137188271,
+ "node_id": "PR_kwDOABTq6s5DyB2v",
+ "html_url": "https://codeberg.org/owner/reponame/pulls/6666",
+ "diff_url": "https://codeberg.org/owner/reponame/pulls/6666.diff",
+ "patch_url": "https://codeberg.org/owner/reponame/pulls/6666.patch",
+ "issue_url": "https://codeberg.org/api/v1/repos/owner/reponame/issues/6666",
+ "number": 6666,
+ "state": "closed",
+ "locked": false,
+ "title": "PR Title",
+ "user": {
+ "login": "gh-user",
+ "id": 11995863,
+ "node_id": "MDQ6VXNlcjExOTk1ODYz",
+ "avatar_url": "https://avatars.codebergusercontent.com/u/11995863?v=4",
+ "gravatar_id": "",
+ "url": "https://codeberg.org/api/v1/users/gh-user",
+ "html_url": "https://codeberg.org/gh-user",
+ "followers_url": "https://codeberg.org/api/v1/users/gh-user/followers",
+ "following_url": "https://codeberg.org/api/v1/users/gh-user/following{/other_user}",
+ "gists_url": "https://codeberg.org/api/v1/users/gh-user/gists{/gist_id}",
+ "starred_url": "https://codeberg.org/api/v1/users/gh-user/starred{/owner}{/repo}",
+ "subscriptions_url": "https://codeberg.org/api/v1/users/gh-user/subscriptions",
+ "organizations_url": "https://codeberg.org/api/v1/users/gh-user/orgs",
+ "repos_url": "https://codeberg.org/api/v1/users/gh-user/repos",
+ "events_url": "https://codeberg.org/api/v1/users/gh-user/events{/privacy}",
+ "received_events_url": "https://codeberg.org/api/v1/users/gh-user/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "body": "Please review and merge",
+ "created_at": "2022-11-28T08:43:09Z",
+ "updated_at": "2022-11-28T10:11:53Z",
+ "closed_at": "2022-11-28T10:11:52Z",
+ "merged_at": "2022-11-28T10:11:52Z",
+ "merge_commit_sha": "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc",
+ "assignee": null,
+ "assignees": [
+
+ ],
+ "requested_reviewers": [
+ {
+ "login": "gh-user",
+ "id": 1422582,
+ "node_id": "MDQ6VXNlcjE0MjI1ODI=",
+ "avatar_url": "https://avatars.codebergusercontent.com/u/1422582?v=4",
+ "gravatar_id": "",
+ "url": "https://codeberg.org/api/v1/users/gh-user",
+ "html_url": "https://codeberg.org/gh-user",
+ "followers_url": "https://codeberg.org/api/v1/users/gh-user/followers",
+ "following_url": "https://codeberg.org/api/v1/users/gh-user/following{/other_user}",
+ "gists_url": "https://codeberg.org/api/v1/users/gh-user/gists{/gist_id}",
+ "starred_url": "https://codeberg.org/api/v1/users/gh-user/starred{/owner}{/repo}",
+ "subscriptions_url": "https://codeberg.org/api/v1/users/gh-user/subscriptions",
+ "organizations_url": "https://codeberg.org/api/v1/users/gh-user/orgs",
+ "repos_url": "https://codeberg.org/api/v1/users/gh-user/repos",
+ "events_url": "https://codeberg.org/api/v1/users/gh-user/events{/privacy}",
+ "received_events_url": "https://codeberg.org/api/v1/users/gh-user/received_events",
+ "type": "User",
+ "site_admin": false
+ }
+ ],
+ "requested_teams": [
+
+ ],
+ "labels": [
+
+ ],
+ "milestone": null,
+ "draft": false,
+ "commits_url": "https://codeberg.org/api/v1/repos/owner/reponame/pulls/6666/commits",
+ "review_comments_url": "https://codeberg.org/api/v1/repos/owner/reponame/pulls/6666/comments",
+ "review_comment_url": "https://codeberg.org/api/v1/repos/owner/reponame/pulls/comments{/number}",
+ "comments_url": "https://codeberg.org/api/v1/repos/owner/reponame/issues/6666/comments",
+ "statuses_url": "https://codeberg.org/api/v1/repos/owner/reponame/statuses/91748965051fae1330ad58d15cf694e103267c87",
+ "head": {
+ "label": "kiegroup:bump-8.31.x-drools-8.31.0.Final",
+ "ref": "bump-8.31.x-drools-8.31.0.Final",
+ "sha": "91748965051fae1330ad58d15cf694e103267c87",
+ "user": {
+ "login": "kiegroup",
+ "id": 517980,
+ "node_id": "MDEyOk9yZ2FuaXphdGlvbjUxNzk4MA==",
+ "avatar_url": "https://avatars.codebergusercontent.com/u/517980?v=4",
+ "gravatar_id": "",
+ "url": "https://codeberg.org/api/v1/users/kiegroup",
+ "html_url": "https://codeberg.org/kiegroup",
+ "followers_url": "https://codeberg.org/api/v1/users/kiegroup/followers",
+ "following_url": "https://codeberg.org/api/v1/users/kiegroup/following{/other_user}",
+ "gists_url": "https://codeberg.org/api/v1/users/kiegroup/gists{/gist_id}",
+ "starred_url": "https://codeberg.org/api/v1/users/kiegroup/starred{/owner}{/repo}",
+ "subscriptions_url": "https://codeberg.org/api/v1/users/kiegroup/subscriptions",
+ "organizations_url": "https://codeberg.org/api/v1/users/kiegroup/orgs",
+ "repos_url": "https://codeberg.org/api/v1/users/kiegroup/repos",
+ "events_url": "https://codeberg.org/api/v1/users/kiegroup/events{/privacy}",
+ "received_events_url": "https://codeberg.org/api/v1/users/kiegroup/received_events",
+ "type": "Organization",
+ "site_admin": false
+ },
+ "repo": {
+ "id": 1370858,
+ "node_id": "MDEwOlJlcG9zaXRvcnkxMzcwODU4",
+ "name": "reponame",
+ "full_name": "fork/reponame",
+ "private": false,
+ "owner": {
+ "login": "kiegroup",
+ "id": 517980,
+ "node_id": "MDEyOk9yZ2FuaXphdGlvbjUxNzk4MA==",
+ "avatar_url": "https://avatars.codebergusercontent.com/u/517980?v=4",
+ "gravatar_id": "",
+ "url": "https://codeberg.org/api/v1/users/kiegroup",
+ "html_url": "https://codeberg.org/kiegroup",
+ "followers_url": "https://codeberg.org/api/v1/users/kiegroup/followers",
+ "following_url": "https://codeberg.org/api/v1/users/kiegroup/following{/other_user}",
+ "gists_url": "https://codeberg.org/api/v1/users/kiegroup/gists{/gist_id}",
+ "starred_url": "https://codeberg.org/api/v1/users/kiegroup/starred{/owner}{/repo}",
+ "subscriptions_url": "https://codeberg.org/api/v1/users/kiegroup/subscriptions",
+ "organizations_url": "https://codeberg.org/api/v1/users/kiegroup/orgs",
+ "repos_url": "https://codeberg.org/api/v1/users/kiegroup/repos",
+ "events_url": "https://codeberg.org/api/v1/users/kiegroup/events{/privacy}",
+ "received_events_url": "https://codeberg.org/api/v1/users/kiegroup/received_events",
+ "type": "Organization",
+ "site_admin": false
+ },
+ "html_url": "https://codeberg.org/fork/reponame",
+ "description": "AI constraint solver in Java to optimize the vehicle routing problem, employee rostering, task assignment, maintenance scheduling, conference scheduling and other planning problems.",
+ "fork": false,
+ "url": "https://codeberg.org/api/v1/repos/fork/reponame",
+ "forks_url": "https://codeberg.org/api/v1/repos/fork/reponame/forks",
+ "keys_url": "https://codeberg.org/api/v1/repos/fork/reponame/keys{/key_id}",
+ "collaborators_url": "https://codeberg.org/api/v1/repos/fork/reponame/collaborators{/collaborator}",
+ "teams_url": "https://codeberg.org/api/v1/repos/fork/reponame/teams",
+ "hooks_url": "https://codeberg.org/api/v1/repos/fork/reponame/hooks",
+ "issue_events_url": "https://codeberg.org/api/v1/repos/fork/reponame/issues/events{/number}",
+ "events_url": "https://codeberg.org/api/v1/repos/fork/reponame/events",
+ "assignees_url": "https://codeberg.org/api/v1/repos/fork/reponame/assignees{/user}",
+ "branches_url": "https://codeberg.org/api/v1/repos/fork/reponame/branches{/branch}",
+ "tags_url": "https://codeberg.org/api/v1/repos/fork/reponame/tags",
+ "blobs_url": "https://codeberg.org/api/v1/repos/fork/reponame/git/blobs{/sha}",
+ "git_tags_url": "https://codeberg.org/api/v1/repos/fork/reponame/git/tags{/sha}",
+ "git_refs_url": "https://codeberg.org/api/v1/repos/fork/reponame/git/refs{/sha}",
+ "trees_url": "https://codeberg.org/api/v1/repos/fork/reponame/git/trees{/sha}",
+ "statuses_url": "https://codeberg.org/api/v1/repos/fork/reponame/statuses/{sha}",
+ "languages_url": "https://codeberg.org/api/v1/repos/fork/reponame/languages",
+ "stargazers_url": "https://codeberg.org/api/v1/repos/fork/reponame/stargazers",
+ "contributors_url": "https://codeberg.org/api/v1/repos/fork/reponame/contributors",
+ "subscribers_url": "https://codeberg.org/api/v1/repos/fork/reponame/subscribers",
+ "subscription_url": "https://codeberg.org/api/v1/repos/fork/reponame/subscription",
+ "commits_url": "https://codeberg.org/api/v1/repos/fork/reponame/commits{/sha}",
+ "git_commits_url": "https://codeberg.org/api/v1/repos/fork/reponame/git/commits{/sha}",
+ "comments_url": "https://codeberg.org/api/v1/repos/fork/reponame/comments{/number}",
+ "issue_comment_url": "https://codeberg.org/api/v1/repos/fork/reponame/issues/comments{/number}",
+ "contents_url": "https://codeberg.org/api/v1/repos/fork/reponame/contents/{+path}",
+ "compare_url": "https://codeberg.org/api/v1/repos/fork/reponame/compare/{base}...{head}",
+ "merges_url": "https://codeberg.org/api/v1/repos/fork/reponame/merges",
+ "archive_url": "https://codeberg.org/api/v1/repos/fork/reponame/{archive_format}{/ref}",
+ "downloads_url": "https://codeberg.org/api/v1/repos/fork/reponame/downloads",
+ "issues_url": "https://codeberg.org/api/v1/repos/fork/reponame/issues{/number}",
+ "pulls_url": "https://codeberg.org/api/v1/repos/fork/reponame/pulls{/number}",
+ "milestones_url": "https://codeberg.org/api/v1/repos/fork/reponame/milestones{/number}",
+ "notifications_url": "https://codeberg.org/api/v1/repos/fork/reponame/notifications{?since,all,participating}",
+ "labels_url": "https://codeberg.org/api/v1/repos/fork/reponame/labels{/name}",
+ "releases_url": "https://codeberg.org/api/v1/repos/fork/reponame/releases{/id}",
+ "deployments_url": "https://codeberg.org/api/v1/repos/fork/reponame/deployments",
+ "created_at": "2011-02-15T19:38:23Z",
+ "updated_at": "2022-11-28T05:01:47Z",
+ "pushed_at": "2022-11-28T10:50:51Z",
+ "git_url": "git://codeberg.org/fork/reponame.git",
+ "ssh_url": "git@codeberg.org:fork/reponame.git",
+ "clone_url": "https://codeberg.org/fork/reponame.git",
+ "svn_url": "https://codeberg.org/fork/reponame",
+ "homepage": "https://www.reponame.org",
+ "size": 238339,
+ "stargazers_count": 2811,
+ "watchers_count": 2811,
+ "language": "Java",
+ "has_issues": false,
+ "has_projects": false,
+ "has_downloads": true,
+ "has_wiki": false,
+ "has_pages": false,
+ "has_discussions": false,
+ "forks_count": 878,
+ "mirror_url": null,
+ "archived": false,
+ "disabled": false,
+ "open_issues_count": 30,
+ "license": {
+ "key": "apache-2.0",
+ "name": "Apache License 2.0",
+ "spdx_id": "Apache-2.0",
+ "url": "https://codeberg.org/api/v1/licenses/apache-2.0",
+ "node_id": "MDc6TGljZW5zZTI="
+ },
+ "allow_forking": true,
+ "is_template": false,
+ "web_commit_signoff_required": false,
+ "topics": [
+ "artificial-intelligence",
+ "branch-and-bound",
+ "constraint-programming",
+ "constraint-satisfaction-problem",
+ "constraint-solver",
+ "constraints",
+ "employee-rostering",
+ "java",
+ "local-search",
+ "mathematical-optimization",
+ "metaheuristics",
+ "optimization",
+ "rostering",
+ "scheduling",
+ "simulated-annealing",
+ "solver",
+ "tabu-search",
+ "traveling-salesman",
+ "traveling-salesman-problem",
+ "vehicle-routing-problem"
+ ],
+ "visibility": "public",
+ "forks": 878,
+ "open_issues": 30,
+ "watchers": 2811,
+ "default_branch": "main"
+ }
+ },
+ "base": {
+ "label": "kiegroup:8.31.x",
+ "ref": "8.31.x",
+ "sha": "8cfc286765cb01c84a1d62c65519fa8032bfecbd",
+ "user": {
+ "login": "kiegroup",
+ "id": 517980,
+ "node_id": "MDEyOk9yZ2FuaXphdGlvbjUxNzk4MA==",
+ "avatar_url": "https://avatars.codebergusercontent.com/u/517980?v=4",
+ "gravatar_id": "",
+ "url": "https://codeberg.org/api/v1/users/kiegroup",
+ "html_url": "https://codeberg.org/kiegroup",
+ "followers_url": "https://codeberg.org/api/v1/users/kiegroup/followers",
+ "following_url": "https://codeberg.org/api/v1/users/kiegroup/following{/other_user}",
+ "gists_url": "https://codeberg.org/api/v1/users/kiegroup/gists{/gist_id}",
+ "starred_url": "https://codeberg.org/api/v1/users/kiegroup/starred{/owner}{/repo}",
+ "subscriptions_url": "https://codeberg.org/api/v1/users/kiegroup/subscriptions",
+ "organizations_url": "https://codeberg.org/api/v1/users/kiegroup/orgs",
+ "repos_url": "https://codeberg.org/api/v1/users/kiegroup/repos",
+ "events_url": "https://codeberg.org/api/v1/users/kiegroup/events{/privacy}",
+ "received_events_url": "https://codeberg.org/api/v1/users/kiegroup/received_events",
+ "type": "Organization",
+ "site_admin": false
+ },
+ "repo": {
+ "id": 1370858,
+ "node_id": "MDEwOlJlcG9zaXRvcnkxMzcwODU4",
+ "name": "reponame",
+ "full_name": "owner/reponame",
+ "private": false,
+ "owner": {
+ "login": "kiegroup",
+ "id": 517980,
+ "node_id": "MDEyOk9yZ2FuaXphdGlvbjUxNzk4MA==",
+ "avatar_url": "https://avatars.codebergusercontent.com/u/517980?v=4",
+ "gravatar_id": "",
+ "url": "https://codeberg.org/api/v1/users/kiegroup",
+ "html_url": "https://codeberg.org/kiegroup",
+ "followers_url": "https://codeberg.org/api/v1/users/kiegroup/followers",
+ "following_url": "https://codeberg.org/api/v1/users/kiegroup/following{/other_user}",
+ "gists_url": "https://codeberg.org/api/v1/users/kiegroup/gists{/gist_id}",
+ "starred_url": "https://codeberg.org/api/v1/users/kiegroup/starred{/owner}{/repo}",
+ "subscriptions_url": "https://codeberg.org/api/v1/users/kiegroup/subscriptions",
+ "organizations_url": "https://codeberg.org/api/v1/users/kiegroup/orgs",
+ "repos_url": "https://codeberg.org/api/v1/users/kiegroup/repos",
+ "events_url": "https://codeberg.org/api/v1/users/kiegroup/events{/privacy}",
+ "received_events_url": "https://codeberg.org/api/v1/users/kiegroup/received_events",
+ "type": "Organization",
+ "site_admin": false
+ },
+ "html_url": "https://codeberg.org/owner/reponame",
+ "description": "AI constraint solver in Java to optimize the vehicle routing problem, employee rostering, task assignment, maintenance scheduling, conference scheduling and other planning problems.",
+ "fork": false,
+ "url": "https://codeberg.org/api/v1/repos/owner/reponame",
+ "forks_url": "https://codeberg.org/api/v1/repos/owner/reponame/forks",
+ "keys_url": "https://codeberg.org/api/v1/repos/owner/reponame/keys{/key_id}",
+ "collaborators_url": "https://codeberg.org/api/v1/repos/owner/reponame/collaborators{/collaborator}",
+ "teams_url": "https://codeberg.org/api/v1/repos/owner/reponame/teams",
+ "hooks_url": "https://codeberg.org/api/v1/repos/owner/reponame/hooks",
+ "issue_events_url": "https://codeberg.org/api/v1/repos/owner/reponame/issues/events{/number}",
+ "events_url": "https://codeberg.org/api/v1/repos/owner/reponame/events",
+ "assignees_url": "https://codeberg.org/api/v1/repos/owner/reponame/assignees{/user}",
+ "branches_url": "https://codeberg.org/api/v1/repos/owner/reponame/branches{/branch}",
+ "tags_url": "https://codeberg.org/api/v1/repos/owner/reponame/tags",
+ "blobs_url": "https://codeberg.org/api/v1/repos/owner/reponame/git/blobs{/sha}",
+ "git_tags_url": "https://codeberg.org/api/v1/repos/owner/reponame/git/tags{/sha}",
+ "git_refs_url": "https://codeberg.org/api/v1/repos/owner/reponame/git/refs{/sha}",
+ "trees_url": "https://codeberg.org/api/v1/repos/owner/reponame/git/trees{/sha}",
+ "statuses_url": "https://codeberg.org/api/v1/repos/owner/reponame/statuses/{sha}",
+ "languages_url": "https://codeberg.org/api/v1/repos/owner/reponame/languages",
+ "stargazers_url": "https://codeberg.org/api/v1/repos/owner/reponame/stargazers",
+ "contributors_url": "https://codeberg.org/api/v1/repos/owner/reponame/contributors",
+ "subscribers_url": "https://codeberg.org/api/v1/repos/owner/reponame/subscribers",
+ "subscription_url": "https://codeberg.org/api/v1/repos/owner/reponame/subscription",
+ "commits_url": "https://codeberg.org/api/v1/repos/owner/reponame/commits{/sha}",
+ "git_commits_url": "https://codeberg.org/api/v1/repos/owner/reponame/git/commits{/sha}",
+ "comments_url": "https://codeberg.org/api/v1/repos/owner/reponame/comments{/number}",
+ "issue_comment_url": "https://codeberg.org/api/v1/repos/owner/reponame/issues/comments{/number}",
+ "contents_url": "https://codeberg.org/api/v1/repos/owner/reponame/contents/{+path}",
+ "compare_url": "https://codeberg.org/api/v1/repos/owner/reponame/compare/{base}...{head}",
+ "merges_url": "https://codeberg.org/api/v1/repos/owner/reponame/merges",
+ "archive_url": "https://codeberg.org/api/v1/repos/owner/reponame/{archive_format}{/ref}",
+ "downloads_url": "https://codeberg.org/api/v1/repos/owner/reponame/downloads",
+ "issues_url": "https://codeberg.org/api/v1/repos/owner/reponame/issues{/number}",
+ "pulls_url": "https://codeberg.org/api/v1/repos/owner/reponame/pulls{/number}",
+ "milestones_url": "https://codeberg.org/api/v1/repos/owner/reponame/milestones{/number}",
+ "notifications_url": "https://codeberg.org/api/v1/repos/owner/reponame/notifications{?since,all,participating}",
+ "labels_url": "https://codeberg.org/api/v1/repos/owner/reponame/labels{/name}",
+ "releases_url": "https://codeberg.org/api/v1/repos/owner/reponame/releases{/id}",
+ "deployments_url": "https://codeberg.org/api/v1/repos/owner/reponame/deployments",
+ "created_at": "2011-02-15T19:38:23Z",
+ "updated_at": "2022-11-28T05:01:47Z",
+ "pushed_at": "2022-11-28T10:50:51Z",
+ "git_url": "git://codeberg.org/owner/reponame.git",
+ "ssh_url": "git@codeberg.org:owner/reponame.git",
+ "clone_url": "https://codeberg.org/owner/reponame.git",
+ "svn_url": "https://codeberg.org/owner/reponame",
+ "homepage": "https://www.reponame.org",
+ "size": 238339,
+ "stargazers_count": 2811,
+ "watchers_count": 2811,
+ "language": "Java",
+ "has_issues": false,
+ "has_projects": false,
+ "has_downloads": true,
+ "has_wiki": false,
+ "has_pages": false,
+ "has_discussions": false,
+ "forks_count": 878,
+ "mirror_url": null,
+ "archived": false,
+ "disabled": false,
+ "open_issues_count": 30,
+ "license": {
+ "key": "apache-2.0",
+ "name": "Apache License 2.0",
+ "spdx_id": "Apache-2.0",
+ "url": "https://codeberg.org/api/v1/licenses/apache-2.0",
+ "node_id": "MDc6TGljZW5zZTI="
+ },
+ "allow_forking": true,
+ "is_template": false,
+ "web_commit_signoff_required": false,
+ "topics": [
+ "artificial-intelligence",
+ "branch-and-bound",
+ "constraint-programming",
+ "constraint-satisfaction-problem",
+ "constraint-solver",
+ "constraints",
+ "employee-rostering",
+ "java",
+ "local-search",
+ "mathematical-optimization",
+ "metaheuristics",
+ "optimization",
+ "rostering",
+ "scheduling",
+ "simulated-annealing",
+ "solver",
+ "tabu-search",
+ "traveling-salesman",
+ "traveling-salesman-problem",
+ "vehicle-routing-problem"
+ ],
+ "visibility": "public",
+ "forks": 878,
+ "open_issues": 30,
+ "watchers": 2811,
+ "default_branch": "main"
+ }
+ },
+ "_links": {
+ "self": {
+ "href": "https://codeberg.org/api/v1/repos/owner/reponame/pulls/6666"
+ },
+ "html": {
+ "href": "https://codeberg.org/owner/reponame/pulls/6666"
+ },
+ "issue": {
+ "href": "https://codeberg.org/api/v1/repos/owner/reponame/issues/6666"
+ },
+ "comments": {
+ "href": "https://codeberg.org/api/v1/repos/owner/reponame/issues/6666/comments"
+ },
+ "review_comments": {
+ "href": "https://codeberg.org/api/v1/repos/owner/reponame/pulls/6666/comments"
+ },
+ "review_comment": {
+ "href": "https://codeberg.org/api/v1/repos/owner/reponame/pulls/comments{/number}"
+ },
+ "commits": {
+ "href": "https://codeberg.org/api/v1/repos/owner/reponame/pulls/6666/commits"
+ },
+ "statuses": {
+ "href": "https://codeberg.org/api/v1/repos/owner/reponame/statuses/91748965051fae1330ad58d15cf694e103267c87"
+ }
+ },
+ "author_association": "CONTRIBUTOR",
+ "auto_merge": null,
+ "active_lock_reason": null,
+ "merged": null,
+ "mergeable": null,
+ "rebaseable": null,
+ "mergeable_state": "unknown",
+ "merged_by": {
+ "login": "that-s-a-user",
+ "id": 17157711,
+ "node_id": "MDQ6VXNlcjE3MTU3NzEx",
+ "avatar_url": "https://avatars.codebergusercontent.com/u/17157711?v=4",
+ "gravatar_id": "",
+ "url": "https://codeberg.org/api/v1/users/that-s-a-user",
+ "html_url": "https://codeberg.org/that-s-a-user",
+ "followers_url": "https://codeberg.org/api/v1/users/that-s-a-user/followers",
+ "following_url": "https://codeberg.org/api/v1/users/that-s-a-user/following{/other_user}",
+ "gists_url": "https://codeberg.org/api/v1/users/that-s-a-user/gists{/gist_id}",
+ "starred_url": "https://codeberg.org/api/v1/users/that-s-a-user/starred{/owner}{/repo}",
+ "subscriptions_url": "https://codeberg.org/api/v1/users/that-s-a-user/subscriptions",
+ "organizations_url": "https://codeberg.org/api/v1/users/that-s-a-user/orgs",
+ "repos_url": "https://codeberg.org/api/v1/users/that-s-a-user/repos",
+ "events_url": "https://codeberg.org/api/v1/users/that-s-a-user/events{/privacy}",
+ "received_events_url": "https://codeberg.org/api/v1/users/that-s-a-user/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "comments": 0,
+ "review_comments": 0,
+ "maintainer_can_modify": false,
+ "commits": 2,
+ "additions": 2,
+ "deletions": 2,
+ "changed_files": 2
+};
+
+export const CB_MULT_COMMITS_PR_FIXTURE = {
+ "url": "https://codeberg.org/api/v1/repos/owner/reponame/pulls/8632",
+ "id": 1137188271,
+ "node_id": "PR_kwDOABTq6s5DyB2v",
+ "html_url": "https://codeberg.org/owner/reponame/pulls/8632",
+ "diff_url": "https://codeberg.org/owner/reponame/pulls/8632.diff",
+ "patch_url": "https://codeberg.org/owner/reponame/pulls/8632.patch",
+ "issue_url": "https://codeberg.org/api/v1/repos/owner/reponame/issues/8632",
+ "number": 8632,
+ "state": "closed",
+ "locked": false,
+ "title": "PR Title",
+ "user": {
+ "login": "gh-user",
+ "id": 11995863,
+ "node_id": "MDQ6VXNlcjExOTk1ODYz",
+ "avatar_url": "https://avatars.codebergusercontent.com/u/11995863?v=4",
+ "gravatar_id": "",
+ "url": "https://codeberg.org/api/v1/users/gh-user",
+ "html_url": "https://codeberg.org/gh-user",
+ "followers_url": "https://codeberg.org/api/v1/users/gh-user/followers",
+ "following_url": "https://codeberg.org/api/v1/users/gh-user/following{/other_user}",
+ "gists_url": "https://codeberg.org/api/v1/users/gh-user/gists{/gist_id}",
+ "starred_url": "https://codeberg.org/api/v1/users/gh-user/starred{/owner}{/repo}",
+ "subscriptions_url": "https://codeberg.org/api/v1/users/gh-user/subscriptions",
+ "organizations_url": "https://codeberg.org/api/v1/users/gh-user/orgs",
+ "repos_url": "https://codeberg.org/api/v1/users/gh-user/repos",
+ "events_url": "https://codeberg.org/api/v1/users/gh-user/events{/privacy}",
+ "received_events_url": "https://codeberg.org/api/v1/users/gh-user/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "body": "Please review and merge",
+ "created_at": "2022-11-28T08:43:09Z",
+ "updated_at": "2022-11-28T10:11:53Z",
+ "closed_at": "2022-11-28T10:11:52Z",
+ "merged_at": "2022-11-28T10:11:52Z",
+ "merge_commit_sha": "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc",
+ "assignee": null,
+ "assignees": [
+
+ ],
+ "requested_reviewers": [
+ {
+ "login": "requested-gh-user",
+ "id": 1422582,
+ "node_id": "MDQ6VXNlcjE0MjI1ODI=",
+ "avatar_url": "https://avatars.codebergusercontent.com/u/1422582?v=4",
+ "gravatar_id": "",
+ "url": "https://codeberg.org/api/v1/users/requested-gh-user",
+ "html_url": "https://codeberg.org/requested-gh-user",
+ "followers_url": "https://codeberg.org/api/v1/users/requested-gh-user/followers",
+ "following_url": "https://codeberg.org/api/v1/users/requested-gh-user/following{/other_user}",
+ "gists_url": "https://codeberg.org/api/v1/users/requested-gh-user/gists{/gist_id}",
+ "starred_url": "https://codeberg.org/api/v1/users/requested-gh-user/starred{/owner}{/repo}",
+ "subscriptions_url": "https://codeberg.org/api/v1/users/requested-gh-user/subscriptions",
+ "organizations_url": "https://codeberg.org/api/v1/users/requested-gh-user/orgs",
+ "repos_url": "https://codeberg.org/api/v1/users/requested-gh-user/repos",
+ "events_url": "https://codeberg.org/api/v1/users/requested-gh-user/events{/privacy}",
+ "received_events_url": "https://codeberg.org/api/v1/users/requested-gh-user/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ {
+ "login": "gh-user",
+ "id": 1422582,
+ "node_id": "MDQ6VXNlcjE0MjI1ODI=",
+ "avatar_url": "https://avatars.codebergusercontent.com/u/1422582?v=4",
+ "gravatar_id": "",
+ "url": "https://codeberg.org/api/v1/users/gh-user",
+ "html_url": "https://codeberg.org/gh-user",
+ "followers_url": "https://codeberg.org/api/v1/users/gh-user/followers",
+ "following_url": "https://codeberg.org/api/v1/users/gh-user/following{/other_user}",
+ "gists_url": "https://codeberg.org/api/v1/users/gh-user/gists{/gist_id}",
+ "starred_url": "https://codeberg.org/api/v1/users/gh-user/starred{/owner}{/repo}",
+ "subscriptions_url": "https://codeberg.org/api/v1/users/gh-user/subscriptions",
+ "organizations_url": "https://codeberg.org/api/v1/users/gh-user/orgs",
+ "repos_url": "https://codeberg.org/api/v1/users/gh-user/repos",
+ "events_url": "https://codeberg.org/api/v1/users/gh-user/events{/privacy}",
+ "received_events_url": "https://codeberg.org/api/v1/users/gh-user/received_events",
+ "type": "User",
+ "site_admin": false
+ }
+ ],
+ "requested_teams": [
+
+ ],
+ "labels": [
+ {
+ "id": 4901021057,
+ "node_id": "LA_kwDOImgs2354988AAAABJB-lgQ",
+ "url": "https://codeberg.org/api/v1/repos/owner/reponame/labels/backport-v1",
+ "name": "backport v1",
+ "color": "AB975B",
+ "default": false,
+ "description": ""
+ },
+ {
+ "id": 4901021057,
+ "node_id": "LA_kwDOImgs2354988AAAABJB-lgQ",
+ "url": "https://codeberg.org/api/v1/repos/owner/reponame/labels/backport-v2",
+ "name": "backport v2",
+ "color": "AB975B",
+ "default": false,
+ "description": ""
+ },
+ {
+ "id": 4901021057,
+ "node_id": "LA_kwDOImgs2354988AAAABJB-lgQ",
+ "url": "https://codeberg.org/api/v1/repos/owner/reponame/labels/backport-v3",
+ "name": "backport v3",
+ "color": "AB975B",
+ "default": false,
+ "description": ""
+ }
+ ],
+ "milestone": null,
+ "draft": false,
+ "commits_url": "https://codeberg.org/api/v1/repos/owner/reponame/pulls/8632/commits",
+ "review_comments_url": "https://codeberg.org/api/v1/repos/owner/reponame/pulls/8632/comments",
+ "review_comment_url": "https://codeberg.org/api/v1/repos/owner/reponame/pulls/comments{/number}",
+ "comments_url": "https://codeberg.org/api/v1/repos/owner/reponame/issues/8632/comments",
+ "statuses_url": "https://codeberg.org/api/v1/repos/owner/reponame/statuses/91748965051fae1330ad58d15cf694e103267c87",
+ "head": {
+ "label": "kiegroup:bump-8.31.x-drools-8.31.0.Final",
+ "ref": "bump-8.31.x-drools-8.31.0.Final",
+ "sha": "91748965051fae1330ad58d15cf694e103267c87",
+ "user": {
+ "login": "kiegroup",
+ "id": 517980,
+ "node_id": "MDEyOk9yZ2FuaXphdGlvbjUxNzk4MA==",
+ "avatar_url": "https://avatars.codebergusercontent.com/u/517980?v=4",
+ "gravatar_id": "",
+ "url": "https://codeberg.org/api/v1/users/kiegroup",
+ "html_url": "https://codeberg.org/kiegroup",
+ "followers_url": "https://codeberg.org/api/v1/users/kiegroup/followers",
+ "following_url": "https://codeberg.org/api/v1/users/kiegroup/following{/other_user}",
+ "gists_url": "https://codeberg.org/api/v1/users/kiegroup/gists{/gist_id}",
+ "starred_url": "https://codeberg.org/api/v1/users/kiegroup/starred{/owner}{/repo}",
+ "subscriptions_url": "https://codeberg.org/api/v1/users/kiegroup/subscriptions",
+ "organizations_url": "https://codeberg.org/api/v1/users/kiegroup/orgs",
+ "repos_url": "https://codeberg.org/api/v1/users/kiegroup/repos",
+ "events_url": "https://codeberg.org/api/v1/users/kiegroup/events{/privacy}",
+ "received_events_url": "https://codeberg.org/api/v1/users/kiegroup/received_events",
+ "type": "Organization",
+ "site_admin": false
+ },
+ "repo": {
+ "id": 1370858,
+ "node_id": "MDEwOlJlcG9zaXRvcnkxMzcwODU4",
+ "name": "reponame",
+ "full_name": "owner/reponame",
+ "private": false,
+ "owner": {
+ "login": "kiegroup",
+ "id": 517980,
+ "node_id": "MDEyOk9yZ2FuaXphdGlvbjUxNzk4MA==",
+ "avatar_url": "https://avatars.codebergusercontent.com/u/517980?v=4",
+ "gravatar_id": "",
+ "url": "https://codeberg.org/api/v1/users/kiegroup",
+ "html_url": "https://codeberg.org/kiegroup",
+ "followers_url": "https://codeberg.org/api/v1/users/kiegroup/followers",
+ "following_url": "https://codeberg.org/api/v1/users/kiegroup/following{/other_user}",
+ "gists_url": "https://codeberg.org/api/v1/users/kiegroup/gists{/gist_id}",
+ "starred_url": "https://codeberg.org/api/v1/users/kiegroup/starred{/owner}{/repo}",
+ "subscriptions_url": "https://codeberg.org/api/v1/users/kiegroup/subscriptions",
+ "organizations_url": "https://codeberg.org/api/v1/users/kiegroup/orgs",
+ "repos_url": "https://codeberg.org/api/v1/users/kiegroup/repos",
+ "events_url": "https://codeberg.org/api/v1/users/kiegroup/events{/privacy}",
+ "received_events_url": "https://codeberg.org/api/v1/users/kiegroup/received_events",
+ "type": "Organization",
+ "site_admin": false
+ },
+ "html_url": "https://codeberg.org/owner/reponame",
+ "description": "AI constraint solver in Java to optimize the vehicle routing problem, employee rostering, task assignment, maintenance scheduling, conference scheduling and other planning problems.",
+ "fork": false,
+ "url": "https://codeberg.org/api/v1/repos/owner/reponame",
+ "forks_url": "https://codeberg.org/api/v1/repos/owner/reponame/forks",
+ "keys_url": "https://codeberg.org/api/v1/repos/owner/reponame/keys{/key_id}",
+ "collaborators_url": "https://codeberg.org/api/v1/repos/owner/reponame/collaborators{/collaborator}",
+ "teams_url": "https://codeberg.org/api/v1/repos/owner/reponame/teams",
+ "hooks_url": "https://codeberg.org/api/v1/repos/owner/reponame/hooks",
+ "issue_events_url": "https://codeberg.org/api/v1/repos/owner/reponame/issues/events{/number}",
+ "events_url": "https://codeberg.org/api/v1/repos/owner/reponame/events",
+ "assignees_url": "https://codeberg.org/api/v1/repos/owner/reponame/assignees{/user}",
+ "branches_url": "https://codeberg.org/api/v1/repos/owner/reponame/branches{/branch}",
+ "tags_url": "https://codeberg.org/api/v1/repos/owner/reponame/tags",
+ "blobs_url": "https://codeberg.org/api/v1/repos/owner/reponame/git/blobs{/sha}",
+ "git_tags_url": "https://codeberg.org/api/v1/repos/owner/reponame/git/tags{/sha}",
+ "git_refs_url": "https://codeberg.org/api/v1/repos/owner/reponame/git/refs{/sha}",
+ "trees_url": "https://codeberg.org/api/v1/repos/owner/reponame/git/trees{/sha}",
+ "statuses_url": "https://codeberg.org/api/v1/repos/owner/reponame/statuses/{sha}",
+ "languages_url": "https://codeberg.org/api/v1/repos/owner/reponame/languages",
+ "stargazers_url": "https://codeberg.org/api/v1/repos/owner/reponame/stargazers",
+ "contributors_url": "https://codeberg.org/api/v1/repos/owner/reponame/contributors",
+ "subscribers_url": "https://codeberg.org/api/v1/repos/owner/reponame/subscribers",
+ "subscription_url": "https://codeberg.org/api/v1/repos/owner/reponame/subscription",
+ "commits_url": "https://codeberg.org/api/v1/repos/owner/reponame/commits{/sha}",
+ "git_commits_url": "https://codeberg.org/api/v1/repos/owner/reponame/git/commits{/sha}",
+ "comments_url": "https://codeberg.org/api/v1/repos/owner/reponame/comments{/number}",
+ "issue_comment_url": "https://codeberg.org/api/v1/repos/owner/reponame/issues/comments{/number}",
+ "contents_url": "https://codeberg.org/api/v1/repos/owner/reponame/contents/{+path}",
+ "compare_url": "https://codeberg.org/api/v1/repos/owner/reponame/compare/{base}...{head}",
+ "merges_url": "https://codeberg.org/api/v1/repos/owner/reponame/merges",
+ "archive_url": "https://codeberg.org/api/v1/repos/owner/reponame/{archive_format}{/ref}",
+ "downloads_url": "https://codeberg.org/api/v1/repos/owner/reponame/downloads",
+ "issues_url": "https://codeberg.org/api/v1/repos/owner/reponame/issues{/number}",
+ "pulls_url": "https://codeberg.org/api/v1/repos/owner/reponame/pulls{/number}",
+ "milestones_url": "https://codeberg.org/api/v1/repos/owner/reponame/milestones{/number}",
+ "notifications_url": "https://codeberg.org/api/v1/repos/owner/reponame/notifications{?since,all,participating}",
+ "labels_url": "https://codeberg.org/api/v1/repos/owner/reponame/labels{/name}",
+ "releases_url": "https://codeberg.org/api/v1/repos/owner/reponame/releases{/id}",
+ "deployments_url": "https://codeberg.org/api/v1/repos/owner/reponame/deployments",
+ "created_at": "2011-02-15T19:38:23Z",
+ "updated_at": "2022-11-28T05:01:47Z",
+ "pushed_at": "2022-11-28T10:50:51Z",
+ "git_url": "git://codeberg.org/owner/reponame.git",
+ "ssh_url": "git@codeberg.org:owner/reponame.git",
+ "clone_url": "https://codeberg.org/owner/reponame.git",
+ "svn_url": "https://codeberg.org/owner/reponame",
+ "homepage": "https://www.reponame.org",
+ "size": 238339,
+ "stargazers_count": 2811,
+ "watchers_count": 2811,
+ "language": "Java",
+ "has_issues": false,
+ "has_projects": false,
+ "has_downloads": true,
+ "has_wiki": false,
+ "has_pages": false,
+ "has_discussions": false,
+ "forks_count": 878,
+ "mirror_url": null,
+ "archived": false,
+ "disabled": false,
+ "open_issues_count": 30,
+ "license": {
+ "key": "apache-2.0",
+ "name": "Apache License 2.0",
+ "spdx_id": "Apache-2.0",
+ "url": "https://codeberg.org/api/v1/licenses/apache-2.0",
+ "node_id": "MDc6TGljZW5zZTI="
+ },
+ "allow_forking": true,
+ "is_template": false,
+ "web_commit_signoff_required": false,
+ "topics": [
+ "artificial-intelligence",
+ "branch-and-bound",
+ "constraint-programming",
+ "constraint-satisfaction-problem",
+ "constraint-solver",
+ "constraints",
+ "employee-rostering",
+ "java",
+ "local-search",
+ "mathematical-optimization",
+ "metaheuristics",
+ "optimization",
+ "rostering",
+ "scheduling",
+ "simulated-annealing",
+ "solver",
+ "tabu-search",
+ "traveling-salesman",
+ "traveling-salesman-problem",
+ "vehicle-routing-problem"
+ ],
+ "visibility": "public",
+ "forks": 878,
+ "open_issues": 30,
+ "watchers": 2811,
+ "default_branch": "main"
+ }
+ },
+ "base": {
+ "label": "kiegroup:8.31.x",
+ "ref": "8.31.x",
+ "sha": "8cfc286765cb01c84a1d62c65519fa8032bfecbd",
+ "user": {
+ "login": "kiegroup",
+ "id": 517980,
+ "node_id": "MDEyOk9yZ2FuaXphdGlvbjUxNzk4MA==",
+ "avatar_url": "https://avatars.codebergusercontent.com/u/517980?v=4",
+ "gravatar_id": "",
+ "url": "https://codeberg.org/api/v1/users/kiegroup",
+ "html_url": "https://codeberg.org/kiegroup",
+ "followers_url": "https://codeberg.org/api/v1/users/kiegroup/followers",
+ "following_url": "https://codeberg.org/api/v1/users/kiegroup/following{/other_user}",
+ "gists_url": "https://codeberg.org/api/v1/users/kiegroup/gists{/gist_id}",
+ "starred_url": "https://codeberg.org/api/v1/users/kiegroup/starred{/owner}{/repo}",
+ "subscriptions_url": "https://codeberg.org/api/v1/users/kiegroup/subscriptions",
+ "organizations_url": "https://codeberg.org/api/v1/users/kiegroup/orgs",
+ "repos_url": "https://codeberg.org/api/v1/users/kiegroup/repos",
+ "events_url": "https://codeberg.org/api/v1/users/kiegroup/events{/privacy}",
+ "received_events_url": "https://codeberg.org/api/v1/users/kiegroup/received_events",
+ "type": "Organization",
+ "site_admin": false
+ },
+ "repo": {
+ "id": 1370858,
+ "node_id": "MDEwOlJlcG9zaXRvcnkxMzcwODU4",
+ "name": "reponame",
+ "full_name": "owner/reponame",
+ "private": false,
+ "owner": {
+ "login": "kiegroup",
+ "id": 517980,
+ "node_id": "MDEyOk9yZ2FuaXphdGlvbjUxNzk4MA==",
+ "avatar_url": "https://avatars.codebergusercontent.com/u/517980?v=4",
+ "gravatar_id": "",
+ "url": "https://codeberg.org/api/v1/users/kiegroup",
+ "html_url": "https://codeberg.org/kiegroup",
+ "followers_url": "https://codeberg.org/api/v1/users/kiegroup/followers",
+ "following_url": "https://codeberg.org/api/v1/users/kiegroup/following{/other_user}",
+ "gists_url": "https://codeberg.org/api/v1/users/kiegroup/gists{/gist_id}",
+ "starred_url": "https://codeberg.org/api/v1/users/kiegroup/starred{/owner}{/repo}",
+ "subscriptions_url": "https://codeberg.org/api/v1/users/kiegroup/subscriptions",
+ "organizations_url": "https://codeberg.org/api/v1/users/kiegroup/orgs",
+ "repos_url": "https://codeberg.org/api/v1/users/kiegroup/repos",
+ "events_url": "https://codeberg.org/api/v1/users/kiegroup/events{/privacy}",
+ "received_events_url": "https://codeberg.org/api/v1/users/kiegroup/received_events",
+ "type": "Organization",
+ "site_admin": false
+ },
+ "html_url": "https://codeberg.org/owner/reponame",
+ "description": "AI constraint solver in Java to optimize the vehicle routing problem, employee rostering, task assignment, maintenance scheduling, conference scheduling and other planning problems.",
+ "fork": false,
+ "url": "https://codeberg.org/api/v1/repos/owner/reponame",
+ "forks_url": "https://codeberg.org/api/v1/repos/owner/reponame/forks",
+ "keys_url": "https://codeberg.org/api/v1/repos/owner/reponame/keys{/key_id}",
+ "collaborators_url": "https://codeberg.org/api/v1/repos/owner/reponame/collaborators{/collaborator}",
+ "teams_url": "https://codeberg.org/api/v1/repos/owner/reponame/teams",
+ "hooks_url": "https://codeberg.org/api/v1/repos/owner/reponame/hooks",
+ "issue_events_url": "https://codeberg.org/api/v1/repos/owner/reponame/issues/events{/number}",
+ "events_url": "https://codeberg.org/api/v1/repos/owner/reponame/events",
+ "assignees_url": "https://codeberg.org/api/v1/repos/owner/reponame/assignees{/user}",
+ "branches_url": "https://codeberg.org/api/v1/repos/owner/reponame/branches{/branch}",
+ "tags_url": "https://codeberg.org/api/v1/repos/owner/reponame/tags",
+ "blobs_url": "https://codeberg.org/api/v1/repos/owner/reponame/git/blobs{/sha}",
+ "git_tags_url": "https://codeberg.org/api/v1/repos/owner/reponame/git/tags{/sha}",
+ "git_refs_url": "https://codeberg.org/api/v1/repos/owner/reponame/git/refs{/sha}",
+ "trees_url": "https://codeberg.org/api/v1/repos/owner/reponame/git/trees{/sha}",
+ "statuses_url": "https://codeberg.org/api/v1/repos/owner/reponame/statuses/{sha}",
+ "languages_url": "https://codeberg.org/api/v1/repos/owner/reponame/languages",
+ "stargazers_url": "https://codeberg.org/api/v1/repos/owner/reponame/stargazers",
+ "contributors_url": "https://codeberg.org/api/v1/repos/owner/reponame/contributors",
+ "subscribers_url": "https://codeberg.org/api/v1/repos/owner/reponame/subscribers",
+ "subscription_url": "https://codeberg.org/api/v1/repos/owner/reponame/subscription",
+ "commits_url": "https://codeberg.org/api/v1/repos/owner/reponame/commits{/sha}",
+ "git_commits_url": "https://codeberg.org/api/v1/repos/owner/reponame/git/commits{/sha}",
+ "comments_url": "https://codeberg.org/api/v1/repos/owner/reponame/comments{/number}",
+ "issue_comment_url": "https://codeberg.org/api/v1/repos/owner/reponame/issues/comments{/number}",
+ "contents_url": "https://codeberg.org/api/v1/repos/owner/reponame/contents/{+path}",
+ "compare_url": "https://codeberg.org/api/v1/repos/owner/reponame/compare/{base}...{head}",
+ "merges_url": "https://codeberg.org/api/v1/repos/owner/reponame/merges",
+ "archive_url": "https://codeberg.org/api/v1/repos/owner/reponame/{archive_format}{/ref}",
+ "downloads_url": "https://codeberg.org/api/v1/repos/owner/reponame/downloads",
+ "issues_url": "https://codeberg.org/api/v1/repos/owner/reponame/issues{/number}",
+ "pulls_url": "https://codeberg.org/api/v1/repos/owner/reponame/pulls{/number}",
+ "milestones_url": "https://codeberg.org/api/v1/repos/owner/reponame/milestones{/number}",
+ "notifications_url": "https://codeberg.org/api/v1/repos/owner/reponame/notifications{?since,all,participating}",
+ "labels_url": "https://codeberg.org/api/v1/repos/owner/reponame/labels{/name}",
+ "releases_url": "https://codeberg.org/api/v1/repos/owner/reponame/releases{/id}",
+ "deployments_url": "https://codeberg.org/api/v1/repos/owner/reponame/deployments",
+ "created_at": "2011-02-15T19:38:23Z",
+ "updated_at": "2022-11-28T05:01:47Z",
+ "pushed_at": "2022-11-28T10:50:51Z",
+ "git_url": "git://codeberg.org/owner/reponame.git",
+ "ssh_url": "git@codeberg.org:owner/reponame.git",
+ "clone_url": "https://codeberg.org/owner/reponame.git",
+ "svn_url": "https://codeberg.org/owner/reponame",
+ "homepage": "https://www.reponame.org",
+ "size": 238339,
+ "stargazers_count": 2811,
+ "watchers_count": 2811,
+ "language": "Java",
+ "has_issues": false,
+ "has_projects": false,
+ "has_downloads": true,
+ "has_wiki": false,
+ "has_pages": false,
+ "has_discussions": false,
+ "forks_count": 878,
+ "mirror_url": null,
+ "archived": false,
+ "disabled": false,
+ "open_issues_count": 30,
+ "license": {
+ "key": "apache-2.0",
+ "name": "Apache License 2.0",
+ "spdx_id": "Apache-2.0",
+ "url": "https://codeberg.org/api/v1/licenses/apache-2.0",
+ "node_id": "MDc6TGljZW5zZTI="
+ },
+ "allow_forking": true,
+ "is_template": false,
+ "web_commit_signoff_required": false,
+ "topics": [
+ "artificial-intelligence",
+ "branch-and-bound",
+ "constraint-programming",
+ "constraint-satisfaction-problem",
+ "constraint-solver",
+ "constraints",
+ "employee-rostering",
+ "java",
+ "local-search",
+ "mathematical-optimization",
+ "metaheuristics",
+ "optimization",
+ "rostering",
+ "scheduling",
+ "simulated-annealing",
+ "solver",
+ "tabu-search",
+ "traveling-salesman",
+ "traveling-salesman-problem",
+ "vehicle-routing-problem"
+ ],
+ "visibility": "public",
+ "forks": 878,
+ "open_issues": 30,
+ "watchers": 2811,
+ "default_branch": "main"
+ }
+ },
+ "_links": {
+ "self": {
+ "href": "https://codeberg.org/api/v1/repos/owner/reponame/pulls/8632"
+ },
+ "html": {
+ "href": "https://codeberg.org/owner/reponame/pulls/8632"
+ },
+ "issue": {
+ "href": "https://codeberg.org/api/v1/repos/owner/reponame/issues/8632"
+ },
+ "comments": {
+ "href": "https://codeberg.org/api/v1/repos/owner/reponame/issues/8632/comments"
+ },
+ "review_comments": {
+ "href": "https://codeberg.org/api/v1/repos/owner/reponame/pulls/8632/comments"
+ },
+ "review_comment": {
+ "href": "https://codeberg.org/api/v1/repos/owner/reponame/pulls/comments{/number}"
+ },
+ "commits": {
+ "href": "https://codeberg.org/api/v1/repos/owner/reponame/pulls/8632/commits"
+ },
+ "statuses": {
+ "href": "https://codeberg.org/api/v1/repos/owner/reponame/statuses/91748965051fae1330ad58d15cf694e103267c87"
+ }
+ },
+ "author_association": "CONTRIBUTOR",
+ "auto_merge": null,
+ "active_lock_reason": null,
+ "merged": true,
+ "mergeable": null,
+ "rebaseable": null,
+ "mergeable_state": "unknown",
+ "merged_by": {
+ "login": "that-s-a-user",
+ "id": 17157711,
+ "node_id": "MDQ6VXNlcjE3MTU3NzEx",
+ "avatar_url": "https://avatars.codebergusercontent.com/u/17157711?v=4",
+ "gravatar_id": "",
+ "url": "https://codeberg.org/api/v1/users/that-s-a-user",
+ "html_url": "https://codeberg.org/that-s-a-user",
+ "followers_url": "https://codeberg.org/api/v1/users/that-s-a-user/followers",
+ "following_url": "https://codeberg.org/api/v1/users/that-s-a-user/following{/other_user}",
+ "gists_url": "https://codeberg.org/api/v1/users/that-s-a-user/gists{/gist_id}",
+ "starred_url": "https://codeberg.org/api/v1/users/that-s-a-user/starred{/owner}{/repo}",
+ "subscriptions_url": "https://codeberg.org/api/v1/users/that-s-a-user/subscriptions",
+ "organizations_url": "https://codeberg.org/api/v1/users/that-s-a-user/orgs",
+ "repos_url": "https://codeberg.org/api/v1/users/that-s-a-user/repos",
+ "events_url": "https://codeberg.org/api/v1/users/that-s-a-user/events{/privacy}",
+ "received_events_url": "https://codeberg.org/api/v1/users/that-s-a-user/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "comments": 0,
+ "review_comments": 0,
+ "maintainer_can_modify": false,
+ "commits": 2,
+ "additions": 2,
+ "deletions": 2,
+ "changed_files": 2
+};
+
+export const CODEBERG_GET_COMMIT = {
+ "parents": [
+ {
+ "sha": "SHA"
+ }
+ ]
+};
+
+export const CB_MULT_COMMITS_PR_COMMITS = [
+ {
+ "sha": "0404fb922ab75c3a8aecad5c97d9af388df04695",
+ "node_id": "C_kwDOImgs99oAKDA0MDRmYjkyMmFiNzVjM2E4YWVjYWQ1Yzk3ZDlhZjM4OGRmMDQ2OTU",
+ "commit": {
+ "author": {
+ "name": "owner",
+ "email": "owner@email.com",
+ "date": "2023-07-06T13:46:30Z"
+ },
+ "committer": {
+ "name": "Codeberg",
+ "email": "noreply@codeberg.org",
+ "date": "2023-07-06T13:46:30Z"
+ },
+ "message": "Update file1.txt",
+ "tree": {
+ "sha": "50be1d7031b02a2ae609f432f2a1e0f818d827b2",
+ "url": "https://codeberg.org/api/v1/repos/owner/reponame/git/trees/50be1d7031b02a2ae609f432f2a1e0f818d827b2"
+ },
+ "url": "https://codeberg.org/api/v1/repos/owner/reponame/git/commits/0404fb922ab75c3a8aecad5c97d9af388df04695",
+ "comment_count": 0,
+ "verification": {
+ "verified": true,
+ "reason": "valid",
+ "signature": "-----BEGIN PGP SIGNATURE-----\n\nno-signature=\n=fivd\n-----END PGP SIGNATURE-----\n",
+ "payload": "tree 50be1d7031b02a2ae609f432f2a1e0f818d827b2\nparent c85b8fcdb741814b3e90e6e5729455cf46ff26ea\nauthor Owner 1688651190 +0200\ncommitter Codeberg 1688651190 +0200\n\nUpdate file1.txt"
+ }
+ },
+ "url": "https://codeberg.org/api/v1/repos/owner/reponame/commits/0404fb922ab75c3a8aecad5c97d9af388df04695",
+ "html_url": "https://codeberg.org/owner/reponame/commit/0404fb922ab75c3a8aecad5c97d9af388df04695",
+ "comments_url": "https://codeberg.org/api/v1/repos/owner/reponame/commits/0404fb922ab75c3a8aecad5c97d9af388df04695/comments",
+ "author": {
+ "login": "owner",
+ "id": 26715795,
+ "node_id": "MDQ6VXNlcjI2NzE1Nzk1",
+ "avatar_url": "https://avatars.codebergusercontent.com/u/26715795?v=4",
+ "gravatar_id": "",
+ "url": "https://codeberg.org/api/v1/users/owner",
+ "html_url": "https://codeberg.org/owner",
+ "followers_url": "https://codeberg.org/api/v1/users/owner/followers",
+ "following_url": "https://codeberg.org/api/v1/users/owner/following{/other_user}",
+ "gists_url": "https://codeberg.org/api/v1/users/owner/gists{/gist_id}",
+ "starred_url": "https://codeberg.org/api/v1/users/owner/starred{/owner}{/repo}",
+ "subscriptions_url": "https://codeberg.org/api/v1/users/owner/subscriptions",
+ "organizations_url": "https://codeberg.org/api/v1/users/owner/orgs",
+ "repos_url": "https://codeberg.org/api/v1/users/owner/repos",
+ "events_url": "https://codeberg.org/api/v1/users/owner/events{/privacy}",
+ "received_events_url": "https://codeberg.org/api/v1/users/owner/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "committer": {
+ "login": "web-flow",
+ "id": 19864447,
+ "node_id": "MDQ6VXNlcjE5ODY0NDQ3",
+ "avatar_url": "https://avatars.codebergusercontent.com/u/19864447?v=4",
+ "gravatar_id": "",
+ "url": "https://codeberg.org/api/v1/users/web-flow",
+ "html_url": "https://codeberg.org/web-flow",
+ "followers_url": "https://codeberg.org/api/v1/users/web-flow/followers",
+ "following_url": "https://codeberg.org/api/v1/users/web-flow/following{/other_user}",
+ "gists_url": "https://codeberg.org/api/v1/users/web-flow/gists{/gist_id}",
+ "starred_url": "https://codeberg.org/api/v1/users/web-flow/starred{/owner}{/repo}",
+ "subscriptions_url": "https://codeberg.org/api/v1/users/web-flow/subscriptions",
+ "organizations_url": "https://codeberg.org/api/v1/users/web-flow/orgs",
+ "repos_url": "https://codeberg.org/api/v1/users/web-flow/repos",
+ "events_url": "https://codeberg.org/api/v1/users/web-flow/events{/privacy}",
+ "received_events_url": "https://codeberg.org/api/v1/users/web-flow/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "parents": [
+ {
+ "sha": "c85b8fcdb741814b3e90e6e5729455cf46ff26ea",
+ "url": "https://codeberg.org/api/v1/repos/owner/reponame/commits/c85b8fcdb741814b3e90e6e5729455cf46ff26ea",
+ "html_url": "https://codeberg.org/owner/reponame/commit/c85b8fcdb741814b3e90e6e5729455cf46ff26ea"
+ }
+ ]
+ },
+ {
+ "sha": "11da4e38aa3e577ffde6d546f1c52e53b04d3151",
+ "node_id": "C_kwDOImgs99oAKDExZGE0ZTM4YWEzZTU3N2ZmZGU2ZDU0NmYxYzUyZTUzYjA0ZDMxNTE",
+ "commit": {
+ "author": {
+ "name": "Owner",
+ "email": "owner@email.com",
+ "date": "2023-07-10T13:23:44Z"
+ },
+ "committer": {
+ "name": "Codeberg",
+ "email": "noreply@codeberg.org",
+ "date": "2023-07-10T13:23:44Z"
+ },
+ "message": "Update file2.txt",
+ "tree": {
+ "sha": "fdd16fb791eef26fd84c3bfa34fd89eb1f7a85be",
+ "url": "https://codeberg.org/api/v1/repos/owner/reponame/git/trees/fdd16fb791eef26fd84c3bfa34fd89eb1f7a85be"
+ },
+ "url": "https://codeberg.org/api/v1/repos/owner/reponame/git/commits/11da4e38aa3e577ffde6d546f1c52e53b04d3151",
+ "comment_count": 0,
+ "verification": {
+ "verified": true,
+ "reason": "valid",
+ "signature": "-----BEGIN PGP SIGNATURE-----\n\nno-signature\n=//hm\n-----END PGP SIGNATURE-----\n",
+ "payload": "tree fdd16fb791eef26fd84c3bfa34fd89eb1f7a85be\nparent 0404fb922ab75c3a8aecad5c97d9af388df04695\nauthor Owner 1688995424 +0200\ncommitter Codeberg 1688995424 +0200\n\nUpdate file2.txt"
+ }
+ },
+ "url": "https://codeberg.org/api/v1/repos/owner/reponame/commits/11da4e38aa3e577ffde6d546f1c52e53b04d3151",
+ "html_url": "https://codeberg.org/owner/reponame/commit/11da4e38aa3e577ffde6d546f1c52e53b04d3151",
+ "comments_url": "https://codeberg.org/api/v1/repos/owner/reponame/commits/11da4e38aa3e577ffde6d546f1c52e53b04d3151/comments",
+ "author": {
+ "login": "owner",
+ "id": 26715795,
+ "node_id": "MDQ6VXNlcjI2NzE1Nzk1",
+ "avatar_url": "https://avatars.codebergusercontent.com/u/26715795?v=4",
+ "gravatar_id": "",
+ "url": "https://codeberg.org/api/v1/users/owner",
+ "html_url": "https://codeberg.org/owner",
+ "followers_url": "https://codeberg.org/api/v1/users/owner/followers",
+ "following_url": "https://codeberg.org/api/v1/users/owner/following{/other_user}",
+ "gists_url": "https://codeberg.org/api/v1/users/owner/gists{/gist_id}",
+ "starred_url": "https://codeberg.org/api/v1/users/owner/starred{/owner}{/repo}",
+ "subscriptions_url": "https://codeberg.org/api/v1/users/owner/subscriptions",
+ "organizations_url": "https://codeberg.org/api/v1/users/owner/orgs",
+ "repos_url": "https://codeberg.org/api/v1/users/owner/repos",
+ "events_url": "https://codeberg.org/api/v1/users/owner/events{/privacy}",
+ "received_events_url": "https://codeberg.org/api/v1/users/owner/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "committer": {
+ "login": "web-flow",
+ "id": 19864447,
+ "node_id": "MDQ6VXNlcjE5ODY0NDQ3",
+ "avatar_url": "https://avatars.codebergusercontent.com/u/19864447?v=4",
+ "gravatar_id": "",
+ "url": "https://codeberg.org/api/v1/users/web-flow",
+ "html_url": "https://codeberg.org/web-flow",
+ "followers_url": "https://codeberg.org/api/v1/users/web-flow/followers",
+ "following_url": "https://codeberg.org/api/v1/users/web-flow/following{/other_user}",
+ "gists_url": "https://codeberg.org/api/v1/users/web-flow/gists{/gist_id}",
+ "starred_url": "https://codeberg.org/api/v1/users/web-flow/starred{/owner}{/repo}",
+ "subscriptions_url": "https://codeberg.org/api/v1/users/web-flow/subscriptions",
+ "organizations_url": "https://codeberg.org/api/v1/users/web-flow/orgs",
+ "repos_url": "https://codeberg.org/api/v1/users/web-flow/repos",
+ "events_url": "https://codeberg.org/api/v1/users/web-flow/events{/privacy}",
+ "received_events_url": "https://codeberg.org/api/v1/users/web-flow/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "parents": [
+ {
+ "sha": "0404fb922ab75c3a8aecad5c97d9af388df04695",
+ "url": "https://codeberg.org/api/v1/repos/owner/reponame/commits/0404fb922ab75c3a8aecad5c97d9af388df04695",
+ "html_url": "https://codeberg.org/owner/reponame/commit/0404fb922ab75c3a8aecad5c97d9af388df04695"
+ }
+ ]
+ }
+];
\ No newline at end of file
diff --git a/test/support/mock/git-client-mock-support.ts b/test/support/mock/git-client-mock-support.ts
new file mode 100644
index 0000000..1a38493
--- /dev/null
+++ b/test/support/mock/git-client-mock-support.ts
@@ -0,0 +1,394 @@
+import LoggerServiceFactory from "@bp/service/logger/logger-service-factory";
+import { Moctokit } from "@kie/mock-github";
+import { TARGET_OWNER, REPO, MERGED_PR_FIXTURE, OPEN_PR_FIXTURE, NOT_MERGED_PR_FIXTURE, NOT_FOUND_PR_NUMBER, MULT_COMMITS_PR_FIXTURE, MULT_COMMITS_PR_COMMITS, NEW_PR_URL, NEW_PR_NUMBER, GITHUB_GET_COMMIT } from "./github-data";
+import { CLOSED_NOT_MERGED_MR, MERGED_SQUASHED_MR, NESTED_NAMESPACE_MR, OPEN_MR, OPEN_PR_COMMITS, PROJECT_EXAMPLE, NESTED_PROJECT_EXAMPLE, SUPERUSER, MERGED_SQUASHED_MR_COMMITS, MERGED_NOT_SQUASHED_MR, MERGED_NOT_SQUASHED_MR_COMMITS } from "./gitlab-data";
+import { CB_TARGET_OWNER, CB_REPO, CB_MERGED_PR_FIXTURE, CB_OPEN_PR_FIXTURE, CB_NOT_MERGED_PR_FIXTURE, CB_NOT_FOUND_PR_NUMBER, CB_MULT_COMMITS_PR_FIXTURE, CB_MULT_COMMITS_PR_COMMITS, CB_NEW_PR_URL, CB_NEW_PR_NUMBER, CODEBERG_GET_COMMIT } from "./codeberg-data";
+
+// high number, for each test we are not expecting
+// to send more than 3 reqs per api endpoint
+const REPEAT = 20;
+
+const logger = LoggerServiceFactory.getLogger();
+
+// AXIOS
+
+export const getAxiosMocked = (url: string) => {
+ let data = undefined;
+
+ // gitlab
+
+ if (url.endsWith("merge_requests/1")) {
+ data = MERGED_SQUASHED_MR;
+ } else if (url.endsWith("merge_requests/2")) {
+ data = OPEN_MR;
+ } else if (url.endsWith("merge_requests/3")) {
+ data = CLOSED_NOT_MERGED_MR;
+ } else if (url.endsWith("merge_requests/4")) {
+ data = NESTED_NAMESPACE_MR;
+ } else if (url.endsWith("merge_requests/5")) {
+ data = MERGED_NOT_SQUASHED_MR;
+ } else if (url.endsWith("projects/76316")) {
+ data = PROJECT_EXAMPLE;
+ } else if (url.endsWith("projects/1645")) {
+ data = NESTED_PROJECT_EXAMPLE;
+ } else if (url.endsWith("users?username=superuser")) {
+ data = [SUPERUSER];
+ } else if (url.endsWith("merge_requests/1/commits")) {
+ data = MERGED_SQUASHED_MR_COMMITS;
+ } else if (url.endsWith("merge_requests/2/commits")) {
+ data = OPEN_PR_COMMITS;
+ } else if (url.endsWith("merge_requests/5/commits")) {
+ data = MERGED_NOT_SQUASHED_MR_COMMITS;
+ }
+
+ return {
+ data,
+ status: data ? 200 : 404,
+ };
+};
+
+export const NEW_GITLAB_MR_ID = 999;
+export const SECOND_NEW_GITLAB_MR_ID = 1000;
+export const postAxiosMocked = async (url: string, data?: {source_branch: string,}) => {
+ let responseData = undefined;
+
+ // gitlab
+
+ if (url.includes("notes")) {
+ // creating comments
+ responseData = {
+ // we do not need the whole response
+ iid: NEW_GITLAB_MR_ID,
+ };
+ } else if (data?.source_branch === "bp-branch") {
+ responseData = {
+ // we do not need the whole response
+ iid: NEW_GITLAB_MR_ID,
+ web_url: "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/" + NEW_GITLAB_MR_ID
+ };
+ } else if (data?.source_branch === "bp-branch-2") {
+ responseData = {
+ // we do not need the whole response
+ iid: SECOND_NEW_GITLAB_MR_ID,
+ web_url: "https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/" + SECOND_NEW_GITLAB_MR_ID
+ };
+ }
+
+ return {
+ data: responseData,
+ status: responseData ? 200 : 404,
+ };
+};
+
+export const putAxiosMocked = async (url: string, _data?: unknown) => {
+ const responseData = undefined;
+
+ // gitlab
+
+ if (url.endsWith(`merge_requests/${NEW_GITLAB_MR_ID}`)) {
+ return {
+ data: {
+ iid: NEW_GITLAB_MR_ID,
+ },
+ status: responseData ? 200 : 404,
+ };
+ }
+
+ throw new Error("Error updating merge request: " + url);
+};
+
+// GITHUB - OCTOKIT
+
+export const mockGitHubClient = (apiUrl = "https://api.github.com"): Moctokit => {
+ logger.debug("Setting up moctokit..");
+
+ const mock = new Moctokit(apiUrl);
+
+ // setup the mock requests here
+
+ // valid requests
+ mock.rest.pulls
+ .get({
+ owner: TARGET_OWNER,
+ repo: REPO,
+ pull_number: MERGED_PR_FIXTURE.number
+ })
+ .reply({
+ status: 200,
+ data: MERGED_PR_FIXTURE
+ });
+
+ mock.rest.pulls
+ .get({
+ owner: TARGET_OWNER,
+ repo: REPO,
+ pull_number: MULT_COMMITS_PR_FIXTURE.number
+ })
+ .reply({
+ status: 200,
+ data: MULT_COMMITS_PR_FIXTURE
+ });
+
+ mock.rest.pulls
+ .get({
+ owner: TARGET_OWNER,
+ repo: REPO,
+ pull_number: OPEN_PR_FIXTURE.number
+ })
+ .reply({
+ status: 200,
+ data: OPEN_PR_FIXTURE
+ });
+
+ mock.rest.pulls
+ .get({
+ owner: TARGET_OWNER,
+ repo: REPO,
+ pull_number: NOT_MERGED_PR_FIXTURE.number
+ })
+ .reply({
+ status: 200,
+ data: NOT_MERGED_PR_FIXTURE
+ });
+
+ mock.rest.pulls
+ .listCommits({
+ owner: TARGET_OWNER,
+ repo: REPO,
+ pull_number: MULT_COMMITS_PR_FIXTURE.number
+ })
+ .reply({
+ status: 200,
+ data: MULT_COMMITS_PR_COMMITS
+ });
+
+ mock.rest.pulls
+ .listCommits({
+ owner: TARGET_OWNER,
+ repo: REPO,
+ pull_number: OPEN_PR_FIXTURE.number
+ })
+ .reply({
+ status: 200,
+ data: MULT_COMMITS_PR_COMMITS
+ });
+
+ mock.rest.pulls
+ .create()
+ .reply({
+ repeat: REPEAT,
+ status: 201,
+ data: {
+ number: NEW_PR_NUMBER,
+ html_url: NEW_PR_URL,
+ }
+ });
+
+ mock.rest.pulls
+ .requestReviewers()
+ .reply({
+ repeat: REPEAT,
+ status: 201,
+ data: MERGED_PR_FIXTURE
+ });
+
+ mock.rest.issues
+ .addAssignees()
+ .reply({
+ repeat: REPEAT,
+ status: 201,
+ data: {}
+ });
+
+ mock.rest.issues
+ .addLabels()
+ .reply({
+ repeat: REPEAT,
+ status: 200,
+ data: {}
+ });
+
+ mock.rest.issues
+ .createComment()
+ .reply({
+ repeat: REPEAT,
+ status: 201,
+ data: {}
+ });
+
+ mock.rest.git
+ .getCommit({
+ owner: TARGET_OWNER,
+ repo: REPO,
+ commit_sha: "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc",
+ })
+ .reply({
+ status: 200,
+ data: GITHUB_GET_COMMIT,
+ });
+
+ // invalid requests
+ mock.rest.pulls
+ .get({
+ owner: TARGET_OWNER,
+ repo: REPO,
+ pull_number: NOT_FOUND_PR_NUMBER
+ })
+ .reply({
+ repeat: REPEAT,
+ status: 404,
+ data: {
+ message: "Not found"
+ }
+ });
+
+ return mock;
+};
+
+// CODEBERG - OCTOKIT
+
+export const mockCodebergClient = (apiUrl = "https://codeberg.org/api/v1"): Moctokit => {
+ logger.debug("Setting up moctokit..");
+
+ const mock = new Moctokit(apiUrl);
+
+ // setup the mock requests here
+
+ // valid requests
+ mock.rest.pulls
+ .get({
+ owner: CB_TARGET_OWNER,
+ repo: CB_REPO,
+ pull_number: CB_MERGED_PR_FIXTURE.number
+ })
+ .reply({
+ status: 200,
+ data: CB_MERGED_PR_FIXTURE
+ });
+
+ mock.rest.pulls
+ .get({
+ owner: CB_TARGET_OWNER,
+ repo: CB_REPO,
+ pull_number: CB_MULT_COMMITS_PR_FIXTURE.number
+ })
+ .reply({
+ status: 200,
+ data: CB_MULT_COMMITS_PR_FIXTURE
+ });
+
+ mock.rest.pulls
+ .get({
+ owner: CB_TARGET_OWNER,
+ repo: CB_REPO,
+ pull_number: CB_OPEN_PR_FIXTURE.number
+ })
+ .reply({
+ status: 200,
+ data: CB_OPEN_PR_FIXTURE
+ });
+
+ mock.rest.pulls
+ .get({
+ owner: CB_TARGET_OWNER,
+ repo: CB_REPO,
+ pull_number: CB_NOT_MERGED_PR_FIXTURE.number
+ })
+ .reply({
+ status: 200,
+ data: CB_NOT_MERGED_PR_FIXTURE
+ });
+
+ mock.rest.pulls
+ .listCommits({
+ owner: CB_TARGET_OWNER,
+ repo: CB_REPO,
+ pull_number: CB_MULT_COMMITS_PR_FIXTURE.number
+ })
+ .reply({
+ status: 200,
+ data: CB_MULT_COMMITS_PR_COMMITS
+ });
+
+ mock.rest.pulls
+ .listCommits({
+ owner: CB_TARGET_OWNER,
+ repo: CB_REPO,
+ pull_number: CB_OPEN_PR_FIXTURE.number
+ })
+ .reply({
+ status: 200,
+ data: CB_MULT_COMMITS_PR_COMMITS
+ });
+
+ mock.rest.pulls
+ .create()
+ .reply({
+ repeat: REPEAT,
+ status: 201,
+ data: {
+ number: CB_NEW_PR_NUMBER,
+ html_url: CB_NEW_PR_URL,
+ }
+ });
+
+ mock.rest.pulls
+ .requestReviewers()
+ .reply({
+ repeat: REPEAT,
+ status: 201,
+ data: CB_MERGED_PR_FIXTURE
+ });
+
+ mock.rest.issues
+ .addAssignees()
+ .reply({
+ repeat: REPEAT,
+ status: 201,
+ data: {}
+ });
+
+ mock.rest.issues
+ .addLabels()
+ .reply({
+ repeat: REPEAT,
+ status: 200,
+ data: {}
+ });
+
+ mock.rest.issues
+ .createComment()
+ .reply({
+ repeat: REPEAT,
+ status: 201,
+ data: {}
+ });
+
+ mock.rest.git
+ .getCommit({
+ owner: CB_TARGET_OWNER,
+ repo: CB_REPO,
+ commit_sha: "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc",
+ })
+ .reply({
+ status: 200,
+ data: CODEBERG_GET_COMMIT,
+ });
+
+ // invalid requests
+ mock.rest.pulls
+ .get({
+ owner: CB_TARGET_OWNER,
+ repo: CB_REPO,
+ pull_number: CB_NOT_FOUND_PR_NUMBER
+ })
+ .reply({
+ repeat: REPEAT,
+ status: 404,
+ data: {
+ message: "Not found"
+ }
+ });
+
+ return mock;
+};
diff --git a/test/support/moctokit/moctokit-data.ts b/test/support/mock/github-data.ts
similarity index 90%
rename from test/support/moctokit/moctokit-data.ts
rename to test/support/mock/github-data.ts
index 9f242b3..0b46741 100644
--- a/test/support/moctokit/moctokit-data.ts
+++ b/test/support/mock/github-data.ts
@@ -1,9 +1,11 @@
-export const targetOwner = "owner";
-export const sourceOwner = "fork";
-export const repo = "reponame";
-export const notFoundPullRequestNumber = 1;
+export const TARGET_OWNER = "owner";
+export const SOURCE_OWNER = "fork";
+export const REPO = "reponame";
+export const NOT_FOUND_PR_NUMBER = 1;
+export const NEW_PR_URL = "new_pr_url";
+export const NEW_PR_NUMBER = 9999;
-export const mergedPullRequestFixture = {
+export const MERGED_PR_FIXTURE = {
"url": "https://api.github.com/repos/owner/reponame/pulls/2368",
"id": 1137188271,
"node_id": "PR_kwDOABTq6s5DyB2v",
@@ -91,7 +93,15 @@ export const mergedPullRequestFixture = {
],
"labels": [
-
+ {
+ "id": 4901021057,
+ "node_id": "LA_kwDOImgs2354988AAAABJB-lgQ",
+ "url": "https://api.github.com/repos/owner/reponame/labels/backport-prod",
+ "name": "backport prod",
+ "color": "AB975B",
+ "default": false,
+ "description": ""
+ }
],
"milestone": null,
"draft": false,
@@ -466,7 +476,7 @@ export const mergedPullRequestFixture = {
"changed_files": 2
};
-export const openPullRequestFixture = {
+export const OPEN_PR_FIXTURE = {
"url": "https://api.github.com/repos/owner/reponame/pulls/4444",
"id": 1137188271,
"node_id": "PR_kwDOABTq6s5DyB2v",
@@ -880,26 +890,7 @@ export const openPullRequestFixture = {
"mergeable": null,
"rebaseable": null,
"mergeable_state": "unknown",
- "merged_by": {
- "login": "that-s-a-user",
- "id": 17157711,
- "node_id": "MDQ6VXNlcjE3MTU3NzEx",
- "avatar_url": "https://avatars.githubusercontent.com/u/17157711?v=4",
- "gravatar_id": "",
- "url": "https://api.github.com/users/that-s-a-user",
- "html_url": "https://github.com/that-s-a-user",
- "followers_url": "https://api.github.com/users/that-s-a-user/followers",
- "following_url": "https://api.github.com/users/that-s-a-user/following{/other_user}",
- "gists_url": "https://api.github.com/users/that-s-a-user/gists{/gist_id}",
- "starred_url": "https://api.github.com/users/that-s-a-user/starred{/owner}{/repo}",
- "subscriptions_url": "https://api.github.com/users/that-s-a-user/subscriptions",
- "organizations_url": "https://api.github.com/users/that-s-a-user/orgs",
- "repos_url": "https://api.github.com/users/that-s-a-user/repos",
- "events_url": "https://api.github.com/users/that-s-a-user/events{/privacy}",
- "received_events_url": "https://api.github.com/users/that-s-a-user/received_events",
- "type": "User",
- "site_admin": false
- },
+ "merged_by": {},
"comments": 0,
"review_comments": 0,
"maintainer_can_modify": false,
@@ -909,7 +900,7 @@ export const openPullRequestFixture = {
"changed_files": 2
};
-export const notMergedPullRequestFixture = {
+export const NOT_MERGED_PR_FIXTURE = {
"url": "https://api.github.com/repos/owner/reponame/pulls/6666",
"id": 1137188271,
"node_id": "PR_kwDOABTq6s5DyB2v",
@@ -1352,7 +1343,7 @@ export const notMergedPullRequestFixture = {
"changed_files": 2
};
-export const sameOwnerPullRequestFixture = {
+export const MULT_COMMITS_PR_FIXTURE = {
"url": "https://api.github.com/repos/owner/reponame/pulls/8632",
"id": 1137188271,
"node_id": "PR_kwDOABTq6s5DyB2v",
@@ -1440,7 +1431,33 @@ export const sameOwnerPullRequestFixture = {
],
"labels": [
-
+ {
+ "id": 4901021057,
+ "node_id": "LA_kwDOImgs2354988AAAABJB-lgQ",
+ "url": "https://api.github.com/repos/owner/reponame/labels/backport-v1",
+ "name": "backport v1",
+ "color": "AB975B",
+ "default": false,
+ "description": ""
+ },
+ {
+ "id": 4901021057,
+ "node_id": "LA_kwDOImgs2354988AAAABJB-lgQ",
+ "url": "https://api.github.com/repos/owner/reponame/labels/backport-v2",
+ "name": "backport v2",
+ "color": "AB975B",
+ "default": false,
+ "description": ""
+ },
+ {
+ "id": 4901021057,
+ "node_id": "LA_kwDOImgs2354988AAAABJB-lgQ",
+ "url": "https://api.github.com/repos/owner/reponame/labels/backport-v3",
+ "name": "backport v3",
+ "color": "AB975B",
+ "default": false,
+ "description": ""
+ }
],
"milestone": null,
"draft": false,
@@ -1813,4 +1830,173 @@ export const sameOwnerPullRequestFixture = {
"additions": 2,
"deletions": 2,
"changed_files": 2
-};
\ No newline at end of file
+};
+
+export const GITHUB_GET_COMMIT = {
+ "parents": [
+ {
+ "sha": "SHA"
+ }
+ ]
+};
+
+export const MULT_COMMITS_PR_COMMITS = [
+ {
+ "sha": "0404fb922ab75c3a8aecad5c97d9af388df04695",
+ "node_id": "C_kwDOImgs99oAKDA0MDRmYjkyMmFiNzVjM2E4YWVjYWQ1Yzk3ZDlhZjM4OGRmMDQ2OTU",
+ "commit": {
+ "author": {
+ "name": "owner",
+ "email": "owner@email.com",
+ "date": "2023-07-06T13:46:30Z"
+ },
+ "committer": {
+ "name": "GitHub",
+ "email": "noreply@github.com",
+ "date": "2023-07-06T13:46:30Z"
+ },
+ "message": "Update file1.txt",
+ "tree": {
+ "sha": "50be1d7031b02a2ae609f432f2a1e0f818d827b2",
+ "url": "https://api.github.com/repos/owner/reponame/git/trees/50be1d7031b02a2ae609f432f2a1e0f818d827b2"
+ },
+ "url": "https://api.github.com/repos/owner/reponame/git/commits/0404fb922ab75c3a8aecad5c97d9af388df04695",
+ "comment_count": 0,
+ "verification": {
+ "verified": true,
+ "reason": "valid",
+ "signature": "-----BEGIN PGP SIGNATURE-----\n\nno-signature=\n=fivd\n-----END PGP SIGNATURE-----\n",
+ "payload": "tree 50be1d7031b02a2ae609f432f2a1e0f818d827b2\nparent c85b8fcdb741814b3e90e6e5729455cf46ff26ea\nauthor Owner 1688651190 +0200\ncommitter GitHub 1688651190 +0200\n\nUpdate file1.txt"
+ }
+ },
+ "url": "https://api.github.com/repos/owner/reponame/commits/0404fb922ab75c3a8aecad5c97d9af388df04695",
+ "html_url": "https://github.com/owner/reponame/commit/0404fb922ab75c3a8aecad5c97d9af388df04695",
+ "comments_url": "https://api.github.com/repos/owner/reponame/commits/0404fb922ab75c3a8aecad5c97d9af388df04695/comments",
+ "author": {
+ "login": "owner",
+ "id": 26715795,
+ "node_id": "MDQ6VXNlcjI2NzE1Nzk1",
+ "avatar_url": "https://avatars.githubusercontent.com/u/26715795?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/owner",
+ "html_url": "https://github.com/owner",
+ "followers_url": "https://api.github.com/users/owner/followers",
+ "following_url": "https://api.github.com/users/owner/following{/other_user}",
+ "gists_url": "https://api.github.com/users/owner/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/owner/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/owner/subscriptions",
+ "organizations_url": "https://api.github.com/users/owner/orgs",
+ "repos_url": "https://api.github.com/users/owner/repos",
+ "events_url": "https://api.github.com/users/owner/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/owner/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "committer": {
+ "login": "web-flow",
+ "id": 19864447,
+ "node_id": "MDQ6VXNlcjE5ODY0NDQ3",
+ "avatar_url": "https://avatars.githubusercontent.com/u/19864447?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/web-flow",
+ "html_url": "https://github.com/web-flow",
+ "followers_url": "https://api.github.com/users/web-flow/followers",
+ "following_url": "https://api.github.com/users/web-flow/following{/other_user}",
+ "gists_url": "https://api.github.com/users/web-flow/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/web-flow/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/web-flow/subscriptions",
+ "organizations_url": "https://api.github.com/users/web-flow/orgs",
+ "repos_url": "https://api.github.com/users/web-flow/repos",
+ "events_url": "https://api.github.com/users/web-flow/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/web-flow/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "parents": [
+ {
+ "sha": "c85b8fcdb741814b3e90e6e5729455cf46ff26ea",
+ "url": "https://api.github.com/repos/owner/reponame/commits/c85b8fcdb741814b3e90e6e5729455cf46ff26ea",
+ "html_url": "https://github.com/owner/reponame/commit/c85b8fcdb741814b3e90e6e5729455cf46ff26ea"
+ }
+ ]
+ },
+ {
+ "sha": "11da4e38aa3e577ffde6d546f1c52e53b04d3151",
+ "node_id": "C_kwDOImgs99oAKDExZGE0ZTM4YWEzZTU3N2ZmZGU2ZDU0NmYxYzUyZTUzYjA0ZDMxNTE",
+ "commit": {
+ "author": {
+ "name": "Owner",
+ "email": "owner@email.com",
+ "date": "2023-07-10T13:23:44Z"
+ },
+ "committer": {
+ "name": "GitHub",
+ "email": "noreply@github.com",
+ "date": "2023-07-10T13:23:44Z"
+ },
+ "message": "Update file2.txt",
+ "tree": {
+ "sha": "fdd16fb791eef26fd84c3bfa34fd89eb1f7a85be",
+ "url": "https://api.github.com/repos/owner/reponame/git/trees/fdd16fb791eef26fd84c3bfa34fd89eb1f7a85be"
+ },
+ "url": "https://api.github.com/repos/owner/reponame/git/commits/11da4e38aa3e577ffde6d546f1c52e53b04d3151",
+ "comment_count": 0,
+ "verification": {
+ "verified": true,
+ "reason": "valid",
+ "signature": "-----BEGIN PGP SIGNATURE-----\n\nno-signature\n=//hm\n-----END PGP SIGNATURE-----\n",
+ "payload": "tree fdd16fb791eef26fd84c3bfa34fd89eb1f7a85be\nparent 0404fb922ab75c3a8aecad5c97d9af388df04695\nauthor Owner 1688995424 +0200\ncommitter GitHub 1688995424 +0200\n\nUpdate file2.txt"
+ }
+ },
+ "url": "https://api.github.com/repos/owner/reponame/commits/11da4e38aa3e577ffde6d546f1c52e53b04d3151",
+ "html_url": "https://github.com/owner/reponame/commit/11da4e38aa3e577ffde6d546f1c52e53b04d3151",
+ "comments_url": "https://api.github.com/repos/owner/reponame/commits/11da4e38aa3e577ffde6d546f1c52e53b04d3151/comments",
+ "author": {
+ "login": "owner",
+ "id": 26715795,
+ "node_id": "MDQ6VXNlcjI2NzE1Nzk1",
+ "avatar_url": "https://avatars.githubusercontent.com/u/26715795?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/owner",
+ "html_url": "https://github.com/owner",
+ "followers_url": "https://api.github.com/users/owner/followers",
+ "following_url": "https://api.github.com/users/owner/following{/other_user}",
+ "gists_url": "https://api.github.com/users/owner/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/owner/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/owner/subscriptions",
+ "organizations_url": "https://api.github.com/users/owner/orgs",
+ "repos_url": "https://api.github.com/users/owner/repos",
+ "events_url": "https://api.github.com/users/owner/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/owner/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "committer": {
+ "login": "web-flow",
+ "id": 19864447,
+ "node_id": "MDQ6VXNlcjE5ODY0NDQ3",
+ "avatar_url": "https://avatars.githubusercontent.com/u/19864447?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/web-flow",
+ "html_url": "https://github.com/web-flow",
+ "followers_url": "https://api.github.com/users/web-flow/followers",
+ "following_url": "https://api.github.com/users/web-flow/following{/other_user}",
+ "gists_url": "https://api.github.com/users/web-flow/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/web-flow/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/web-flow/subscriptions",
+ "organizations_url": "https://api.github.com/users/web-flow/orgs",
+ "repos_url": "https://api.github.com/users/web-flow/repos",
+ "events_url": "https://api.github.com/users/web-flow/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/web-flow/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "parents": [
+ {
+ "sha": "0404fb922ab75c3a8aecad5c97d9af388df04695",
+ "url": "https://api.github.com/repos/owner/reponame/commits/0404fb922ab75c3a8aecad5c97d9af388df04695",
+ "html_url": "https://github.com/owner/reponame/commit/0404fb922ab75c3a8aecad5c97d9af388df04695"
+ }
+ ]
+ }
+];
\ No newline at end of file
diff --git a/test/support/mock/gitlab-data.ts b/test/support/mock/gitlab-data.ts
new file mode 100644
index 0000000..7adcf52
--- /dev/null
+++ b/test/support/mock/gitlab-data.ts
@@ -0,0 +1,1058 @@
+// /api/v4/projects/superuser%2Fbackporting-example/merge_requests/1
+// /api/v4/projects/76316
+
+export const PROJECT_EXAMPLE = {
+ "id":76316,
+ "description":null,
+ "name":"Backporting Example",
+ "name_with_namespace":"Super User / Backporting Example",
+ "path":"backporting-example",
+ "path_with_namespace":"superuser/backporting-example",
+ "created_at":"2023-06-23T13:45:15.121Z",
+ "default_branch":"main",
+ "tag_list":[
+
+ ],
+ "topics":[
+
+ ],
+ "ssh_url_to_repo":"git@my.gitlab.host.com:superuser/backporting-example.git",
+ "http_url_to_repo":"https://my.gitlab.host.com/superuser/backporting-example.git",
+ "web_url":"https://my.gitlab.host.com/superuser/backporting-example",
+ "readme_url":"https://my.gitlab.host.com/superuser/backporting-example/-/blob/main/README.md",
+ "forks_count":0,
+ "avatar_url":null,
+ "star_count":0,
+ "last_activity_at":"2023-06-28T14:05:42.596Z",
+ "namespace":{
+ "id":70747,
+ "name":"Super User",
+ "path":"superuser",
+ "kind":"user",
+ "full_path":"superuser",
+ "parent_id":null,
+ "avatar_url":"/uploads/-/system/user/avatar/14041/avatar.png",
+ "web_url":"https://my.gitlab.host.com/superuser"
+ },
+ "_links":{
+ "self":"https://my.gitlab.host.com/api/v4/projects/76316",
+ "issues":"https://my.gitlab.host.com/api/v4/projects/76316/issues",
+ "merge_requests":"https://my.gitlab.host.com/api/v4/projects/76316/merge_requests",
+ "repo_branches":"https://my.gitlab.host.com/api/v4/projects/76316/repository/branches",
+ "labels":"https://my.gitlab.host.com/api/v4/projects/76316/labels",
+ "events":"https://my.gitlab.host.com/api/v4/projects/76316/events",
+ "members":"https://my.gitlab.host.com/api/v4/projects/76316/members",
+ "cluster_agents":"https://my.gitlab.host.com/api/v4/projects/76316/cluster_agents"
+ },
+ "packages_enabled":true,
+ "empty_repo":false,
+ "archived":false,
+ "visibility":"private",
+ "owner":{
+ "id":14041,
+ "username":"superuser",
+ "name":"Super User",
+ "state":"active",
+ "avatar_url":"https://my.gitlab.host.com/uploads/-/system/user/avatar/14041/avatar.png",
+ "web_url":"https://my.gitlab.host.com/superuser"
+ },
+ "resolve_outdated_diff_discussions":false,
+ "container_expiration_policy":{
+ "cadence":"1d",
+ "enabled":false,
+ "keep_n":10,
+ "older_than":"90d",
+ "name_regex":".*",
+ "name_regex_keep":null,
+ "next_run_at":"2023-06-24T13:45:15.167Z"
+ },
+ "issues_enabled":true,
+ "merge_requests_enabled":true,
+ "wiki_enabled":true,
+ "jobs_enabled":true,
+ "snippets_enabled":true,
+ "container_registry_enabled":true,
+ "service_desk_enabled":false,
+ "service_desk_address":null,
+ "can_create_merge_request_in":true,
+ "issues_access_level":"enabled",
+ "repository_access_level":"enabled",
+ "merge_requests_access_level":"enabled",
+ "forking_access_level":"enabled",
+ "wiki_access_level":"enabled",
+ "builds_access_level":"enabled",
+ "snippets_access_level":"enabled",
+ "pages_access_level":"private",
+ "analytics_access_level":"enabled",
+ "container_registry_access_level":"enabled",
+ "security_and_compliance_access_level":"private",
+ "releases_access_level":"enabled",
+ "environments_access_level":"enabled",
+ "feature_flags_access_level":"enabled",
+ "infrastructure_access_level":"enabled",
+ "monitor_access_level":"enabled",
+ "emails_disabled":null,
+ "shared_runners_enabled":true,
+ "lfs_enabled":true,
+ "creator_id":14041,
+ "import_url":null,
+ "import_type":null,
+ "import_status":"none",
+ "import_error":null,
+ "open_issues_count":0,
+ "description_html":"",
+ "updated_at":"2023-06-28T14:05:42.596Z",
+ "ci_default_git_depth":20,
+ "ci_forward_deployment_enabled":true,
+ "ci_job_token_scope_enabled":false,
+ "ci_separated_caches":true,
+ "ci_allow_fork_pipelines_to_run_in_parent_project":true,
+ "build_git_strategy":"fetch",
+ "keep_latest_artifact":true,
+ "restrict_user_defined_variables":false,
+ "runners_token":"TOKEN",
+ "runner_token_expiration_interval":null,
+ "group_runners_enabled":true,
+ "auto_cancel_pending_pipelines":"enabled",
+ "build_timeout":3600,
+ "auto_devops_enabled":false,
+ "auto_devops_deploy_strategy":"continuous",
+ "ci_config_path":"",
+ "public_jobs":true,
+ "shared_with_groups":[
+
+ ],
+ "only_allow_merge_if_pipeline_succeeds":false,
+ "allow_merge_on_skipped_pipeline":null,
+ "request_access_enabled":true,
+ "only_allow_merge_if_all_discussions_are_resolved":false,
+ "remove_source_branch_after_merge":true,
+ "printing_merge_request_link_enabled":true,
+ "merge_method":"merge",
+ "squash_option":"default_off",
+ "enforce_auth_checks_on_uploads":true,
+ "suggestion_commit_message":null,
+ "merge_commit_template":null,
+ "squash_commit_template":null,
+ "issue_branch_template":null,
+ "autoclose_referenced_issues":true,
+ "approvals_before_merge":0,
+ "mirror":false,
+ "external_authorization_classification_label":null,
+ "marked_for_deletion_at":null,
+ "marked_for_deletion_on":null,
+ "requirements_enabled":false,
+ "requirements_access_level":"enabled",
+ "security_and_compliance_enabled":true,
+ "compliance_frameworks":[
+
+ ],
+ "issues_template":null,
+ "merge_requests_template":null,
+ "merge_pipelines_enabled":false,
+ "merge_trains_enabled":false,
+ "allow_pipeline_trigger_approve_deployment":false,
+ "permissions":{
+ "project_access":{
+ "access_level":50,
+ "notification_level":3
+ },
+ "group_access":null
+ }
+};
+
+export const NESTED_PROJECT_EXAMPLE = {
+ "id":1645,
+ "description":null,
+ "name":"Backporting Example",
+ "name_with_namespace":"Super User / Backporting Example",
+ "path":"backporting-example",
+ "path_with_namespace":"mysuperorg/6/mysuperproduct/mysuperunit/backporting-example",
+ "created_at":"2023-06-23T13:45:15.121Z",
+ "default_branch":"main",
+ "tag_list":[
+
+ ],
+ "topics":[
+
+ ],
+ "ssh_url_to_repo":"git@my.gitlab.host.com:mysuperorg/6/mysuperproduct/mysuperunit/backporting-example.git",
+ "http_url_to_repo":"https://my.gitlab.host.com/mysuperorg/6/mysuperproduct/mysuperunit/backporting-example.git",
+ "web_url":"https://my.gitlab.host.com/mysuperorg/6/mysuperproduct/mysuperunit/backporting-example",
+ "readme_url":"https://my.gitlab.host.com/mysuperorg/6/mysuperproduct/mysuperunit/backporting-example/-/blob/main/README.md",
+ "forks_count":0,
+ "avatar_url":null,
+ "star_count":0,
+ "last_activity_at":"2023-06-28T14:05:42.596Z",
+ "namespace":{
+ "id":70747,
+ "name":"Super User",
+ "path":"superuser",
+ "kind":"user",
+ "full_path":"superuser",
+ "parent_id":null,
+ "avatar_url":"/uploads/-/system/user/avatar/14041/avatar.png",
+ "web_url":"https://my.gitlab.host.com/superuser"
+ },
+ "_links":{
+ "self":"https://my.gitlab.host.com/api/v4/projects/1645",
+ "issues":"https://my.gitlab.host.com/api/v4/projects/1645/issues",
+ "merge_requests":"https://my.gitlab.host.com/api/v4/projects/1645/merge_requests",
+ "repo_branches":"https://my.gitlab.host.com/api/v4/projects/1645/repository/branches",
+ "labels":"https://my.gitlab.host.com/api/v4/projects/1645/labels",
+ "events":"https://my.gitlab.host.com/api/v4/projects/1645/events",
+ "members":"https://my.gitlab.host.com/api/v4/projects/1645/members",
+ "cluster_agents":"https://my.gitlab.host.com/api/v4/projects/1645/cluster_agents"
+ },
+ "packages_enabled":true,
+ "empty_repo":false,
+ "archived":false,
+ "visibility":"private",
+ "owner":{
+ "id":14041,
+ "username":"superuser",
+ "name":"Super User",
+ "state":"active",
+ "avatar_url":"https://my.gitlab.host.com/uploads/-/system/user/avatar/14041/avatar.png",
+ "web_url":"https://my.gitlab.host.com/superuser"
+ },
+ "resolve_outdated_diff_discussions":false,
+ "container_expiration_policy":{
+ "cadence":"1d",
+ "enabled":false,
+ "keep_n":10,
+ "older_than":"90d",
+ "name_regex":".*",
+ "name_regex_keep":null,
+ "next_run_at":"2023-06-24T13:45:15.167Z"
+ },
+ "issues_enabled":true,
+ "merge_requests_enabled":true,
+ "wiki_enabled":true,
+ "jobs_enabled":true,
+ "snippets_enabled":true,
+ "container_registry_enabled":true,
+ "service_desk_enabled":false,
+ "service_desk_address":null,
+ "can_create_merge_request_in":true,
+ "issues_access_level":"enabled",
+ "repository_access_level":"enabled",
+ "merge_requests_access_level":"enabled",
+ "forking_access_level":"enabled",
+ "wiki_access_level":"enabled",
+ "builds_access_level":"enabled",
+ "snippets_access_level":"enabled",
+ "pages_access_level":"private",
+ "analytics_access_level":"enabled",
+ "container_registry_access_level":"enabled",
+ "security_and_compliance_access_level":"private",
+ "releases_access_level":"enabled",
+ "environments_access_level":"enabled",
+ "feature_flags_access_level":"enabled",
+ "infrastructure_access_level":"enabled",
+ "monitor_access_level":"enabled",
+ "emails_disabled":null,
+ "shared_runners_enabled":true,
+ "lfs_enabled":true,
+ "creator_id":14041,
+ "import_url":null,
+ "import_type":null,
+ "import_status":"none",
+ "import_error":null,
+ "open_issues_count":0,
+ "description_html":"",
+ "updated_at":"2023-06-28T14:05:42.596Z",
+ "ci_default_git_depth":20,
+ "ci_forward_deployment_enabled":true,
+ "ci_job_token_scope_enabled":false,
+ "ci_separated_caches":true,
+ "ci_allow_fork_pipelines_to_run_in_parent_project":true,
+ "build_git_strategy":"fetch",
+ "keep_latest_artifact":true,
+ "restrict_user_defined_variables":false,
+ "runners_token":"TOKEN",
+ "runner_token_expiration_interval":null,
+ "group_runners_enabled":true,
+ "auto_cancel_pending_pipelines":"enabled",
+ "build_timeout":3600,
+ "auto_devops_enabled":false,
+ "auto_devops_deploy_strategy":"continuous",
+ "ci_config_path":"",
+ "public_jobs":true,
+ "shared_with_groups":[
+
+ ],
+ "only_allow_merge_if_pipeline_succeeds":false,
+ "allow_merge_on_skipped_pipeline":null,
+ "request_access_enabled":true,
+ "only_allow_merge_if_all_discussions_are_resolved":false,
+ "remove_source_branch_after_merge":true,
+ "printing_merge_request_link_enabled":true,
+ "merge_method":"merge",
+ "squash_option":"default_off",
+ "enforce_auth_checks_on_uploads":true,
+ "suggestion_commit_message":null,
+ "merge_commit_template":null,
+ "squash_commit_template":null,
+ "issue_branch_template":null,
+ "autoclose_referenced_issues":true,
+ "approvals_before_merge":0,
+ "mirror":false,
+ "external_authorization_classification_label":null,
+ "marked_for_deletion_at":null,
+ "marked_for_deletion_on":null,
+ "requirements_enabled":false,
+ "requirements_access_level":"enabled",
+ "security_and_compliance_enabled":true,
+ "compliance_frameworks":[
+
+ ],
+ "issues_template":null,
+ "merge_requests_template":null,
+ "merge_pipelines_enabled":false,
+ "merge_trains_enabled":false,
+ "allow_pipeline_trigger_approve_deployment":false,
+ "permissions":{
+ "project_access":{
+ "access_level":50,
+ "notification_level":3
+ },
+ "group_access":null
+ }
+ };
+
+export const MERGED_SQUASHED_MR = {
+ "id":807106,
+ "iid":1,
+ "project_id":76316,
+ "title":"Update test.txt",
+ "description":"This is the body",
+ "state":"merged",
+ "created_at":"2023-06-28T14:32:40.943Z",
+ "updated_at":"2023-06-28T14:37:12.108Z",
+ "merged_by":{
+ "id":14041,
+ "username":"superuser",
+ "name":"Super User",
+ "state":"active",
+ "avatar_url":"https://my.gitlab.host.com/uploads/-/system/user/avatar/14041/avatar.png",
+ "web_url":"https://my.gitlab.host.com/superuser"
+ },
+ "merge_user":{
+ "id":14041,
+ "username":"superuser",
+ "name":"Super User",
+ "state":"active",
+ "avatar_url":"https://my.gitlab.host.com/uploads/-/system/user/avatar/14041/avatar.png",
+ "web_url":"https://my.gitlab.host.com/superuser"
+ },
+ "merged_at":"2023-06-28T14:37:11.667Z",
+ "closed_by":null,
+ "closed_at":null,
+ "target_branch":"main",
+ "source_branch":"feature",
+ "user_notes_count":0,
+ "upvotes":0,
+ "downvotes":0,
+ "author":{
+ "id":14041,
+ "username":"superuser",
+ "name":"Super User",
+ "state":"active",
+ "avatar_url":"https://my.gitlab.host.com/uploads/-/system/user/avatar/14041/avatar.png",
+ "web_url":"https://my.gitlab.host.com/superuser"
+ },
+ "assignees":[
+ {
+ "id":14041,
+ "username":"superuser",
+ "name":"Super User",
+ "state":"active",
+ "avatar_url":"https://my.gitlab.host.com/uploads/-/system/user/avatar/14041/avatar.png",
+ "web_url":"https://my.gitlab.host.com/superuser"
+ }
+ ],
+ "assignee":{
+ "id":14041,
+ "username":"superuser",
+ "name":"Super User",
+ "state":"active",
+ "avatar_url":"https://my.gitlab.host.com/uploads/-/system/user/avatar/14041/avatar.png",
+ "web_url":"https://my.gitlab.host.com/superuser"
+ },
+ "reviewers":[
+ {
+ "id":1404188,
+ "username":"superuser1",
+ "name":"Super User",
+ "state":"active",
+ "avatar_url":"https://my.gitlab.host.com/uploads/-/system/user/avatar/14041/avatar.png",
+ "web_url":"https://my.gitlab.host.com/superuser"
+ },
+ {
+ "id":1404199,
+ "username":"superuser2",
+ "name":"Super User",
+ "state":"active",
+ "avatar_url":"https://my.gitlab.host.com/uploads/-/system/user/avatar/14041/avatar.png",
+ "web_url":"https://my.gitlab.host.com/superuser"
+ }
+ ],
+ "source_project_id":76316,
+ "target_project_id":76316,
+ "labels":[
+ "backport-prod"
+ ],
+ "draft":false,
+ "work_in_progress":false,
+ "milestone":null,
+ "merge_when_pipeline_succeeds":false,
+ "merge_status":"can_be_merged",
+ "detailed_merge_status":"not_open",
+ "sha":"9e15674ebd48e05c6e428a1fa31dbb60a778d644",
+ "merge_commit_sha":"4d369c3e9a8d1d5b7e56c892a8ab2a7666583ac3",
+ "squash_commit_sha":"ebb1eca696c42fd067658bd9b5267709f78ef38e",
+ "discussion_locked":null,
+ "should_remove_source_branch":true,
+ "force_remove_source_branch":true,
+ "reference":"!2",
+ "references":{
+ "short":"!2",
+ "relative":"!2",
+ "full":"superuser/backporting-example!2"
+ },
+ "web_url":"https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/1",
+ "time_stats":{
+ "time_estimate":0,
+ "total_time_spent":0,
+ "human_time_estimate":null,
+ "human_total_time_spent":null
+ },
+ "squash":true,
+ "squash_on_merge":true,
+ "task_completion_status":{
+ "count":0,
+ "completed_count":0
+ },
+ "has_conflicts":false,
+ "blocking_discussions_resolved":true,
+ "approvals_before_merge":null,
+ "subscribed":true,
+ "changes_count":"1",
+ "latest_build_started_at":null,
+ "latest_build_finished_at":null,
+ "first_deployed_to_production_at":null,
+ "pipeline":null,
+ "head_pipeline":null,
+ "diff_refs":{
+ "base_sha":"2c553a0c4c133a51806badce5fa4842b7253cb3b",
+ "head_sha":"9e15674ebd48e05c6e428a1fa31dbb60a778d644",
+ "start_sha":"2c553a0c4c133a51806badce5fa4842b7253cb3b"
+ },
+ "merge_error":null,
+ "first_contribution":false,
+ "user":{
+ "can_merge":true
+ }
+};
+
+export const OPEN_MR = {
+ "id":807106,
+ "iid":2,
+ "project_id":76316,
+ "title":"Update test.txt opened",
+ "description":"Still opened mr body",
+ "state":"opened",
+ "created_at":"2023-06-28T14:32:40.943Z",
+ "updated_at":"2023-06-28T14:35:56.433Z",
+ "merged_by":null,
+ "merge_user":null,
+ "merged_at":null,
+ "closed_by":null,
+ "closed_at":null,
+ "target_branch":"main",
+ "source_branch":"feature",
+ "user_notes_count":0,
+ "upvotes":0,
+ "downvotes":0,
+ "author":{
+ "id":14041,
+ "username":"superuser",
+ "name":"Super User",
+ "state":"active",
+ "avatar_url":"https://my.gitlab.host.com/uploads/-/system/user/avatar/14041/avatar.png",
+ "web_url":"https://my.gitlab.host.com/superuser"
+ },
+ "assignees":[
+ {
+ "id":14041,
+ "username":"superuser",
+ "name":"Super User",
+ "state":"active",
+ "avatar_url":"https://my.gitlab.host.com/uploads/-/system/user/avatar/14041/avatar.png",
+ "web_url":"https://my.gitlab.host.com/superuser"
+ }
+ ],
+ "assignee":{
+ "id":14041,
+ "username":"superuser",
+ "name":"Super User",
+ "state":"active",
+ "avatar_url":"https://my.gitlab.host.com/uploads/-/system/user/avatar/14041/avatar.png",
+ "web_url":"https://my.gitlab.host.com/superuser"
+ },
+ "reviewers":[
+ {
+ "id":14041,
+ "username":"superuser",
+ "name":"Super User",
+ "state":"active",
+ "avatar_url":"https://my.gitlab.host.com/uploads/-/system/user/avatar/14041/avatar.png",
+ "web_url":"https://my.gitlab.host.com/superuser"
+ }
+ ],
+ "source_project_id":76316,
+ "target_project_id":76316,
+ "labels":[
+
+ ],
+ "draft":false,
+ "work_in_progress":false,
+ "milestone":null,
+ "merge_when_pipeline_succeeds":false,
+ "merge_status":"checking",
+ "detailed_merge_status":"checking",
+ "sha":"9e15674ebd48e05c6e428a1fa31dbb60a778d644",
+ "merge_commit_sha":null,
+ "squash_commit_sha":null,
+ "discussion_locked":null,
+ "should_remove_source_branch":null,
+ "force_remove_source_branch":true,
+ "reference":"!2",
+ "references":{
+ "short":"!2",
+ "relative":"!2",
+ "full":"superuser/backporting-example!2"
+ },
+ "web_url":"https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/2",
+ "time_stats":{
+ "time_estimate":0,
+ "total_time_spent":0,
+ "human_time_estimate":null,
+ "human_total_time_spent":null
+ },
+ "squash":false,
+ "squash_on_merge":false,
+ "task_completion_status":{
+ "count":0,
+ "completed_count":0
+ },
+ "has_conflicts":false,
+ "blocking_discussions_resolved":true,
+ "approvals_before_merge":null,
+ "subscribed":true,
+ "changes_count":"1",
+ "latest_build_started_at":null,
+ "latest_build_finished_at":null,
+ "first_deployed_to_production_at":null,
+ "pipeline":null,
+ "head_pipeline":null,
+ "diff_refs":{
+ "base_sha":"2c553a0c4c133a51806badce5fa4842b7253cb3b",
+ "head_sha":"9e15674ebd48e05c6e428a1fa31dbb60a778d644",
+ "start_sha":"2c553a0c4c133a51806badce5fa4842b7253cb3b"
+ },
+ "merge_error":null,
+ "first_contribution":false,
+ "user":{
+ "can_merge":true
+ }
+};
+
+export const CLOSED_NOT_MERGED_MR = {
+ "id":807191,
+ "iid":3,
+ "project_id":76316,
+ "title":"Update test.txt",
+ "description":"",
+ "state":"closed",
+ "created_at":"2023-06-28T15:44:50.549Z",
+ "updated_at":"2023-06-28T15:44:58.318Z",
+ "merged_by":null,
+ "merge_user":null,
+ "merged_at":null,
+ "closed_by":{
+ "id":14041,
+ "username":"superuser",
+ "name":"Super User",
+ "state":"active",
+ "avatar_url":"https://my.gitlab.host.com/uploads/-/system/user/avatar/14041/avatar.png",
+ "web_url":"https://my.gitlab.host.com/superuser"
+ },
+ "closed_at":"2023-06-28T15:44:58.349Z",
+ "target_branch":"main",
+ "source_branch":"closed",
+ "user_notes_count":0,
+ "upvotes":0,
+ "downvotes":0,
+ "author":{
+ "id":14041,
+ "username":"superuser",
+ "name":"Super User",
+ "state":"active",
+ "avatar_url":"https://my.gitlab.host.com/uploads/-/system/user/avatar/14041/avatar.png",
+ "web_url":"https://my.gitlab.host.com/superuser"
+ },
+ "assignees":[
+ {
+ "id":14041,
+ "username":"superuser",
+ "name":"Super User",
+ "state":"active",
+ "avatar_url":"https://my.gitlab.host.com/uploads/-/system/user/avatar/14041/avatar.png",
+ "web_url":"https://my.gitlab.host.com/superuser"
+ }
+ ],
+ "assignee":{
+ "id":14041,
+ "username":"superuser",
+ "name":"Super User",
+ "state":"active",
+ "avatar_url":"https://my.gitlab.host.com/uploads/-/system/user/avatar/14041/avatar.png",
+ "web_url":"https://my.gitlab.host.com/superuser"
+ },
+ "reviewers":[
+ {
+ "id":14041,
+ "username":"superuser",
+ "name":"Super User",
+ "state":"active",
+ "avatar_url":"https://my.gitlab.host.com/uploads/-/system/user/avatar/14041/avatar.png",
+ "web_url":"https://my.gitlab.host.com/superuser"
+ }
+ ],
+ "source_project_id":76316,
+ "target_project_id":76316,
+ "labels":[
+
+ ],
+ "draft":false,
+ "work_in_progress":false,
+ "milestone":null,
+ "merge_when_pipeline_succeeds":false,
+ "merge_status":"can_be_merged",
+ "detailed_merge_status":"not_open",
+ "sha":"c8ce0ffdd372c2ed89d65f9e3f6f3681e6d16eb3",
+ "merge_commit_sha":null,
+ "squash_commit_sha":null,
+ "discussion_locked":null,
+ "should_remove_source_branch":null,
+ "force_remove_source_branch":true,
+ "reference":"!3",
+ "references":{
+ "short":"!3",
+ "relative":"!3",
+ "full":"superuser/backporting-example!3"
+ },
+ "web_url":"https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/3",
+ "time_stats":{
+ "time_estimate":0,
+ "total_time_spent":0,
+ "human_time_estimate":null,
+ "human_total_time_spent":null
+ },
+ "squash":false,
+ "squash_on_merge":false,
+ "task_completion_status":{
+ "count":0,
+ "completed_count":0
+ },
+ "has_conflicts":false,
+ "blocking_discussions_resolved":true,
+ "approvals_before_merge":null,
+ "subscribed":true,
+ "changes_count":"1",
+ "latest_build_started_at":null,
+ "latest_build_finished_at":null,
+ "first_deployed_to_production_at":null,
+ "pipeline":null,
+ "head_pipeline":null,
+ "diff_refs":{
+ "base_sha":"4d369c3e9a8d1d5b7e56c892a8ab2a7666583ac3",
+ "head_sha":"c8ce0ffdd372c2ed89d65f9e3f6f3681e6d16eb3",
+ "start_sha":"4d369c3e9a8d1d5b7e56c892a8ab2a7666583ac3"
+ },
+ "merge_error":null,
+ "first_contribution":false,
+ "user":{
+ "can_merge":true
+ }
+};
+
+export const MERGED_SQUASHED_MR_COMMITS = [
+ {
+ "id":"e4dd336a4a20f394df6665994df382fb1d193a11",
+ "short_id":"e4dd336a",
+ "created_at":"2023-06-29T09:59:10.000Z",
+ "parent_ids":[
+
+ ],
+ "title":"Add new file",
+ "message":"Add new file",
+ "author_name":"Super User",
+ "author_email":"superuser@email.com",
+ "authored_date":"2023-06-29T09:59:10.000Z",
+ "committer_name":"Super User",
+ "committer_email":"superuser@email.com",
+ "committed_date":"2023-06-29T09:59:10.000Z",
+ "trailers":{
+
+ },
+ "web_url":"https://gitlab.com/superuser/backporting-example/-/commit/e4dd336a4a20f394df6665994df382fb1d193a11"
+ },
+];
+
+export const OPEN_PR_COMMITS = [
+ {
+ "id":"974519f65c9e0ed65277cd71026657a09fca05e7",
+ "short_id":"974519f6",
+ "created_at":"2023-07-10T19:23:04.000Z",
+ "parent_ids":[
+
+ ],
+ "title":"Add another file",
+ "message":"Add another file",
+ "author_name":"Super User",
+ "author_email":"superuser@email.com",
+ "authored_date":"2023-07-10T19:23:04.000Z",
+ "committer_name":"Super User",
+ "committer_email":"superuser@email.com",
+ "committed_date":"2023-07-10T19:23:04.000Z",
+ "trailers":{
+
+ },
+ "web_url":"https://gitlab.com/superuser/backporting-example/-/commit/974519f65c9e0ed65277cd71026657a09fca05e7"
+ },
+ {
+ "id":"e4dd336a4a20f394df6665994df382fb1d193a11",
+ "short_id":"e4dd336a",
+ "created_at":"2023-06-29T09:59:10.000Z",
+ "parent_ids":[
+
+ ],
+ "title":"Add new file",
+ "message":"Add new file",
+ "author_name":"Super User",
+ "author_email":"superuser@email.com",
+ "authored_date":"2023-06-29T09:59:10.000Z",
+ "committer_name":"Super User",
+ "committer_email":"superuser@email.com",
+ "committed_date":"2023-06-29T09:59:10.000Z",
+ "trailers":{
+
+ },
+ "web_url":"https://gitlab.com/superuser/backporting-example/-/commit/e4dd336a4a20f394df6665994df382fb1d193a11"
+ }
+];
+
+export const MERGED_NOT_SQUASHED_MR_COMMITS = [
+ {
+ "id":"e4dd336a4a20f394df6665994df382fb1d193a11",
+ "short_id":"e4dd336a",
+ "created_at":"2023-06-29T09:59:10.000Z",
+ "parent_ids":[
+
+ ],
+ "title":"Add new file",
+ "message":"Add new file",
+ "author_name":"Super User",
+ "author_email":"superuser@email.com",
+ "authored_date":"2023-06-29T09:59:10.000Z",
+ "committer_name":"Super User",
+ "committer_email":"superuser@email.com",
+ "committed_date":"2023-06-29T09:59:10.000Z",
+ "trailers":{
+
+ },
+ "web_url":"https://gitlab.com/superuser/backporting-example/-/commit/e4dd336a4a20f394df6665994df382fb1d193a11"
+ },
+];
+
+export const SUPERUSER = {
+ "id":14041,
+ "username":"superuser",
+ "name":"Super USer",
+ "state":"active",
+ "avatar_url":"https://my.gitlab.host.com/uploads/-/system/user/avatar/14041/avatar.png",
+ "web_url":"https://my.gitlab.host.com/superuser"
+};
+
+export const NESTED_NAMESPACE_MR = {
+ "id":807106,
+ "iid":1,
+ "project_id":1645,
+ "title":"Update test.txt",
+ "description":"This is the body",
+ "state":"merged",
+ "created_at":"2023-06-28T14:32:40.943Z",
+ "updated_at":"2023-06-28T14:37:12.108Z",
+ "merged_by":{
+ "id":14041,
+ "username":"superuser",
+ "name":"Super User",
+ "state":"active",
+ "avatar_url":"https://my.gitlab.host.com/uploads/-/system/user/avatar/14041/avatar.png",
+ "web_url":"https://my.gitlab.host.com/superuser"
+ },
+ "merge_user":{
+ "id":14041,
+ "username":"superuser",
+ "name":"Super User",
+ "state":"active",
+ "avatar_url":"https://my.gitlab.host.com/uploads/-/system/user/avatar/14041/avatar.png",
+ "web_url":"https://my.gitlab.host.com/superuser"
+ },
+ "merged_at":"2023-06-28T14:37:11.667Z",
+ "closed_by":null,
+ "closed_at":null,
+ "target_branch":"main",
+ "source_branch":"feature",
+ "user_notes_count":0,
+ "upvotes":0,
+ "downvotes":0,
+ "author":{
+ "id":14041,
+ "username":"superuser",
+ "name":"Super User",
+ "state":"active",
+ "avatar_url":"https://my.gitlab.host.com/uploads/-/system/user/avatar/14041/avatar.png",
+ "web_url":"https://my.gitlab.host.com/superuser"
+ },
+ "assignees":[
+ {
+ "id":14041,
+ "username":"superuser",
+ "name":"Super User",
+ "state":"active",
+ "avatar_url":"https://my.gitlab.host.com/uploads/-/system/user/avatar/14041/avatar.png",
+ "web_url":"https://my.gitlab.host.com/superuser"
+ }
+ ],
+ "assignee":{
+ "id":14041,
+ "username":"superuser",
+ "name":"Super User",
+ "state":"active",
+ "avatar_url":"https://my.gitlab.host.com/uploads/-/system/user/avatar/14041/avatar.png",
+ "web_url":"https://my.gitlab.host.com/superuser"
+ },
+ "reviewers":[
+ {
+ "id":1404188,
+ "username":"superuser1",
+ "name":"Super User",
+ "state":"active",
+ "avatar_url":"https://my.gitlab.host.com/uploads/-/system/user/avatar/14041/avatar.png",
+ "web_url":"https://my.gitlab.host.com/superuser"
+ },
+ {
+ "id":1404199,
+ "username":"superuser2",
+ "name":"Super User",
+ "state":"active",
+ "avatar_url":"https://my.gitlab.host.com/uploads/-/system/user/avatar/14041/avatar.png",
+ "web_url":"https://my.gitlab.host.com/superuser"
+ }
+ ],
+ "source_project_id":1645,
+ "target_project_id":1645,
+ "labels":[
+ "gitlab-original-label"
+ ],
+ "draft":false,
+ "work_in_progress":false,
+ "milestone":null,
+ "merge_when_pipeline_succeeds":false,
+ "merge_status":"can_be_merged",
+ "detailed_merge_status":"not_open",
+ "sha":"9e15674ebd48e05c6e428a1fa31dbb60a778d644",
+ "merge_commit_sha":"4d369c3e9a8d1d5b7e56c892a8ab2a7666583ac3",
+ "squash_commit_sha":"ebb1eca696c42fd067658bd9b5267709f78ef38e",
+ "discussion_locked":null,
+ "should_remove_source_branch":true,
+ "force_remove_source_branch":true,
+ "reference":"!2",
+ "references":{
+ "short":"!2",
+ "relative":"!2",
+ "full":"superuser/backporting-example!2"
+ },
+ "web_url":"https://my.gitlab.host.com/mysuperorg/6/mysuperproduct/mysuperunit/backporting-example/-/merge_requests/4",
+ "time_stats":{
+ "time_estimate":0,
+ "total_time_spent":0,
+ "human_time_estimate":null,
+ "human_total_time_spent":null
+ },
+ "squash":true,
+ "squash_on_merge":true,
+ "task_completion_status":{
+ "count":0,
+ "completed_count":0
+ },
+ "has_conflicts":false,
+ "blocking_discussions_resolved":true,
+ "approvals_before_merge":null,
+ "subscribed":true,
+ "changes_count":"1",
+ "latest_build_started_at":null,
+ "latest_build_finished_at":null,
+ "first_deployed_to_production_at":null,
+ "pipeline":null,
+ "head_pipeline":null,
+ "diff_refs":{
+ "base_sha":"2c553a0c4c133a51806badce5fa4842b7253cb3b",
+ "head_sha":"9e15674ebd48e05c6e428a1fa31dbb60a778d644",
+ "start_sha":"2c553a0c4c133a51806badce5fa4842b7253cb3b"
+ },
+ "merge_error":null,
+ "first_contribution":false,
+ "user":{
+ "can_merge":true
+ }
+ };
+
+export const MERGED_NOT_SQUASHED_MR = {
+ "id":807106,
+ "iid":1,
+ "project_id":76316,
+ "title":"Update test.txt",
+ "description":"This is the body",
+ "state":"merged",
+ "created_at":"2023-06-28T14:32:40.943Z",
+ "updated_at":"2023-06-28T14:37:12.108Z",
+ "merged_by":{
+ "id":14041,
+ "username":"superuser",
+ "name":"Super User",
+ "state":"active",
+ "avatar_url":"https://my.gitlab.host.com/uploads/-/system/user/avatar/14041/avatar.png",
+ "web_url":"https://my.gitlab.host.com/superuser"
+ },
+ "merge_user":{
+ "id":14041,
+ "username":"superuser",
+ "name":"Super User",
+ "state":"active",
+ "avatar_url":"https://my.gitlab.host.com/uploads/-/system/user/avatar/14041/avatar.png",
+ "web_url":"https://my.gitlab.host.com/superuser"
+ },
+ "merged_at":"2023-06-28T14:37:11.667Z",
+ "closed_by":null,
+ "closed_at":null,
+ "target_branch":"main",
+ "source_branch":"feature",
+ "user_notes_count":0,
+ "upvotes":0,
+ "downvotes":0,
+ "author":{
+ "id":14041,
+ "username":"superuser",
+ "name":"Super User",
+ "state":"active",
+ "avatar_url":"https://my.gitlab.host.com/uploads/-/system/user/avatar/14041/avatar.png",
+ "web_url":"https://my.gitlab.host.com/superuser"
+ },
+ "assignees":[
+ {
+ "id":14041,
+ "username":"superuser",
+ "name":"Super User",
+ "state":"active",
+ "avatar_url":"https://my.gitlab.host.com/uploads/-/system/user/avatar/14041/avatar.png",
+ "web_url":"https://my.gitlab.host.com/superuser"
+ }
+ ],
+ "assignee":{
+ "id":14041,
+ "username":"superuser",
+ "name":"Super User",
+ "state":"active",
+ "avatar_url":"https://my.gitlab.host.com/uploads/-/system/user/avatar/14041/avatar.png",
+ "web_url":"https://my.gitlab.host.com/superuser"
+ },
+ "reviewers":[
+ {
+ "id":1404188,
+ "username":"superuser1",
+ "name":"Super User",
+ "state":"active",
+ "avatar_url":"https://my.gitlab.host.com/uploads/-/system/user/avatar/14041/avatar.png",
+ "web_url":"https://my.gitlab.host.com/superuser"
+ },
+ {
+ "id":1404199,
+ "username":"superuser2",
+ "name":"Super User",
+ "state":"active",
+ "avatar_url":"https://my.gitlab.host.com/uploads/-/system/user/avatar/14041/avatar.png",
+ "web_url":"https://my.gitlab.host.com/superuser"
+ }
+ ],
+ "source_project_id":76316,
+ "target_project_id":76316,
+ "labels":[
+ "backport-prod"
+ ],
+ "draft":false,
+ "work_in_progress":false,
+ "milestone":null,
+ "merge_when_pipeline_succeeds":false,
+ "merge_status":"can_be_merged",
+ "detailed_merge_status":"not_open",
+ "sha":"9e15674ebd48e05c6e428a1fa31dbb60a778d644",
+ "merge_commit_sha":"4d369c3e9a8d1d5b7e56c892a8ab2a7666583ac3",
+ "squash_commit_sha":null,
+ "discussion_locked":null,
+ "should_remove_source_branch":true,
+ "force_remove_source_branch":true,
+ "reference":"!5",
+ "references":{
+ "short":"!5",
+ "relative":"!5",
+ "full":"superuser/backporting-example!5"
+ },
+ "web_url":"https://my.gitlab.host.com/superuser/backporting-example/-/merge_requests/5",
+ "time_stats":{
+ "time_estimate":0,
+ "total_time_spent":0,
+ "human_time_estimate":null,
+ "human_total_time_spent":null
+ },
+ "squash":false,
+ "squash_on_merge":false,
+ "task_completion_status":{
+ "count":0,
+ "completed_count":0
+ },
+ "has_conflicts":false,
+ "blocking_discussions_resolved":true,
+ "approvals_before_merge":null,
+ "subscribed":true,
+ "changes_count":"1",
+ "latest_build_started_at":null,
+ "latest_build_finished_at":null,
+ "first_deployed_to_production_at":null,
+ "pipeline":null,
+ "head_pipeline":null,
+ "diff_refs":{
+ "base_sha":"2c553a0c4c133a51806badce5fa4842b7253cb3b",
+ "head_sha":"9e15674ebd48e05c6e428a1fa31dbb60a778d644",
+ "start_sha":"2c553a0c4c133a51806badce5fa4842b7253cb3b"
+ },
+ "merge_error":null,
+ "first_contribution":false,
+ "user":{
+ "can_merge":true
+ }
+};
\ No newline at end of file
diff --git a/test/support/moctokit/moctokit-support.ts b/test/support/moctokit/moctokit-support.ts
deleted file mode 100644
index 78be900..0000000
--- a/test/support/moctokit/moctokit-support.ts
+++ /dev/null
@@ -1,89 +0,0 @@
-import LoggerServiceFactory from "@bp/service/logger/logger-service-factory";
-import { Moctokit } from "@kie/mock-github";
-import { targetOwner, repo, mergedPullRequestFixture, openPullRequestFixture, notMergedPullRequestFixture, notFoundPullRequestNumber, sameOwnerPullRequestFixture } from "./moctokit-data";
-
-const logger = LoggerServiceFactory.getLogger();
-
-export const setupMoctokit = (): Moctokit => {
- logger.debug("Setting up moctokit.");
-
- const mock = new Moctokit();
-
- // setup the mock requests here
-
- // valid requests
- mock.rest.pulls
- .get({
- owner: targetOwner,
- repo: repo,
- pull_number: mergedPullRequestFixture.number
- })
- .reply({
- status: 200,
- data: mergedPullRequestFixture
- });
-
- mock.rest.pulls
- .get({
- owner: targetOwner,
- repo: repo,
- pull_number: sameOwnerPullRequestFixture.number
- })
- .reply({
- status: 200,
- data: sameOwnerPullRequestFixture
- });
-
- mock.rest.pulls
- .get({
- owner: targetOwner,
- repo: repo,
- pull_number: openPullRequestFixture.number
- })
- .reply({
- status: 200,
- data: openPullRequestFixture
- });
-
- mock.rest.pulls
- .get({
- owner: targetOwner,
- repo: repo,
- pull_number: notMergedPullRequestFixture.number
- })
- .reply({
- status: 200,
- data: notMergedPullRequestFixture
- });
-
- mock.rest.pulls
- .create()
- .reply({
- status: 201,
- data: mergedPullRequestFixture
- });
-
- mock.rest.pulls
- .requestReviewers()
- .reply({
- status: 201,
- data: mergedPullRequestFixture
- });
-
-
- // invalid requests
- mock.rest.pulls
- .get({
- owner: targetOwner,
- repo: repo,
- pull_number: notFoundPullRequestNumber
- })
- .reply({
- status: 404,
- data: {
- message: "Not found"
- }
- });
-
- return mock;
-};
diff --git a/test/support/utils.ts b/test/support/utils.ts
index cacc557..e470906 100644
--- a/test/support/utils.ts
+++ b/test/support/utils.ts
@@ -1,4 +1,6 @@
import * as core from "@actions/core";
+import { AuthTokenId } from "@bp/service/configs/configs.types";
+import * as fs from "fs";
export const addProcessArgs = (args: string[]) => {
process.argv = [...process.argv, ...args];
@@ -8,10 +10,44 @@ export const resetProcessArgs = () => {
process.argv = ["node", "backporting"];
};
+export const resetEnvTokens = () => {
+ delete process.env[AuthTokenId.GITHUB_TOKEN];
+ delete process.env[AuthTokenId.GITLAB_TOKEN];
+ delete process.env[AuthTokenId.CODEBERG_TOKEN];
+ delete process.env[AuthTokenId.GIT_TOKEN];
+};
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export const spyGetInput = (obj: any) => {
const mock = jest.spyOn(core, "getInput");
mock.mockImplementation((name: string) : string => {
- return obj[name];
+ return obj[name] ?? "";
});
+};
+
+/**
+ * Check array equality performing sort on both sides.
+ * DO NOT USE this if ordering matters
+ * @param actual
+ * @param expected
+ */
+export const expectArrayEqual = (actual: unknown[], expected: unknown[]) => {
+ expect(actual.sort()).toEqual(expected.sort());
+};
+
+/**
+ * Create a test file given the full pathname
+ * @param pathname full file pathname e.g, /tmp/dir/filename.json
+ * @param content what must be written in the file
+ */
+export const createTestFile = (pathname: string, content: string) => {
+ fs.writeFileSync(pathname, content);
+};
+
+/**
+ * Remove a file located at pathname
+ * @param pathname full file pathname e.g, /tmp/dir/filename.json
+ */
+export const removeTestFile = (pathname: string) => {
+ fs.rmSync(pathname);
};
\ No newline at end of file