diff --git a/.github/ISSUE_TEMPLATE/bug.md b/.github/ISSUE_TEMPLATE/bug.md deleted file mode 100644 index e1581e7..0000000 --- a/.github/ISSUE_TEMPLATE/bug.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -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 deleted file mode 100644 index 2af5c99..0000000 --- a/.github/ISSUE_TEMPLATE/chore.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -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 deleted file mode 100644 index b3b4ea8..0000000 --- a/.github/ISSUE_TEMPLATE/feature.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -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 37f00ed..b1b4695 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,58 +1,20 @@ **Thank you for submitting this pull request** -fixes _(please add the issue ID if it exists)_ +fix _(please add the issue ID if it exists)_ -## Description - +### Referenced pull requests -## 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 27fe954..046dd4a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,15 +13,15 @@ jobs: name: ${{ matrix.os }} - node ${{ matrix.node-version }} strategy: matrix: - node-version: [16, 18, 20] + node-version: [16, 18] os: [ubuntu-latest] - fail-fast: false + fail-fast: true runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v3 - name: Setup Node ${{ matrix.node-version }} - uses: actions/setup-node@v4 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - run: npm ci diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml deleted file mode 100644 index 12de602..0000000 --- a/.github/workflows/coverage.yml +++ /dev/null @@ -1,22 +0,0 @@ -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 index 611d29d..774c068 100644 --- a/.github/workflows/prepare-release.yml +++ b/.github/workflows/prepare-release.yml @@ -19,11 +19,11 @@ jobs: name: Prepare release runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v3 with: fetch-depth: 0 - name: Setup Node - uses: actions/setup-node@v4 + uses: actions/setup-node@v3 with: node-version: 18 - name: Git config diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml index d0dce86..947d54a 100644 --- a/.github/workflows/pull-request.yml +++ b/.github/workflows/pull-request.yml @@ -3,30 +3,22 @@ name: "pull request check" -on: - pull_request: - paths-ignore: - - 'LICENSE*' - - '**.gitignore' - - '**.md' - - '**.txt' - - '.github/ISSUE_TEMPLATE/**' - - '.github/dependabot.yml' +on: pull_request jobs: build: name: ${{ matrix.os }} - node ${{ matrix.node-version }} strategy: matrix: - node-version: [16, 18, 20] + node-version: [16, 18] os: [ubuntu-latest] fail-fast: false runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v3 - name: Setup Node ${{ matrix.node-version }} - uses: actions/setup-node@v4 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - run: npm ci diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index cdfe93f..34c968e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -17,11 +17,11 @@ jobs: name: Release package runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v3 with: fetch-depth: 0 - name: Setup Node - uses: actions/setup-node@v4 + uses: actions/setup-node@v3 with: node-version: 18 - name: Git config diff --git a/.gitignore b/.gitignore index 115c77e..64a72d6 100644 --- a/.gitignore +++ b/.gitignore @@ -11,7 +11,3 @@ report.json .vscode/ build/ .npmrc - -# temporary files created during tests -*test*.json -bp diff --git a/CHANGELOG.md b/CHANGELOG.md index e3a24a6..708c417 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,212 +1,58 @@ # Changelog -## 4.8.5 (2025-04-15) +## [3.1.1](https://github.com/lampajr/backporting/compare/v3.1.0...v3.1.1) (2023-07-06) -* 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) - -## [4.8.4](https://github.com/kiegroup/git-backporting/compare/v4.8.3...v4.8.4) (2024-11-02) - - -### Bug Fixes - -* 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)) - -## [4.8.3](https://github.com/kiegroup/git-backporting/compare/v4.8.2...v4.8.3) (2024-10-10) - - -### 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) +## [3.1.0](https://github.com/lampajr/backporting/compare/v3.0.0...v3.1.0) (2023-07-05) ### Features -* 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)) +* config file as option ([#42](https://github.com/lampajr/backporting/issues/42)) ([5ead31f](https://github.com/lampajr/backporting/commit/5ead31f606b585ecdf7ed2e9de8ebd841b935898)) -## [4.7.1](https://github.com/kiegroup/git-backporting/compare/v4.7.0...v4.7.1) (2024-04-03) +## [3.0.0](https://github.com/lampajr/backporting/compare/v2.2.1...v3.0.0) (2023-07-01) + + +### Features + +* integrate tool with gitlab service ([#39](https://github.com/lampajr/backporting/issues/39)) ([107f5e5](https://github.com/lampajr/backporting/commit/107f5e52d663157145aa14f6cf7fa4d6704cb844)) ### 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)) +* removed 'powered by..' pr body suffix ([6869bec](https://github.com/lampajr/backporting/commit/6869becb3e5979b24f6fe29bf38141e15c1bdc66)) -## [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)) +## [2.2.1](https://github.com/lampajr/backporting/compare/v2.2.0...v2.2.1) (2023-06-27) ### 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)) +* fix gha no-inherit-reviewers input ([8b586cc](https://github.com/lampajr/backporting/commit/8b586ccdfe0e6b90ed41ea8a5eecdbc24893fe25)) -## [4.6.0](https://github.com/kiegroup/git-backporting/compare/v4.5.2...v4.6.0) (2024-03-25) +## [2.2.0](https://github.com/lampajr/backporting/compare/v2.1.0...v2.2.0) (2023-06-22) ### 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)) +* override backporting pr fields ([#38](https://github.com/lampajr/backporting/issues/38)) ([a32e8cd](https://github.com/lampajr/backporting/commit/a32e8cd34c757358668fe8f88f6d1733d3fa8391)) -## [4.5.2](https://github.com/kiegroup/git-backporting/compare/v4.5.1...v4.5.2) (2024-03-08) +## [2.1.0](https://github.com/lampajr/backporting/compare/v2.0.1...v2.1.0) (2023-06-20) -### Improvements -* upgrade to node20 for gha ([c8ede8d](https://github.com/kiegroup/git-backporting/commit/c8ede8d4e2428cb3f4dc2d727f24b37e5781cbb1)) +### Features -## [4.5.1](https://github.com/kiegroup/git-backporting/compare/v4.5.0...v4.5.1) (2024-02-23) +* **issue-17:** override backporting pr data ([#29](https://github.com/lampajr/backporting/issues/29)) ([941beda](https://github.com/lampajr/backporting/commit/941beda208e4a8c1577bd4d39299fbbfbf569c06)) ### 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)) +* gha input parser ([95b35aa](https://github.com/lampajr/backporting/commit/95b35aa4efb86e2bc4990d920feec1ec5c4eb8e4)) -## [4.5.0](https://github.com/kiegroup/git-backporting/compare/v4.4.1...v4.5.0) (2023-12-10) +## [2.0.1](https://github.com/lampajr/backporting/compare/v2.0.0...v2.0.1) (2023-01-05) + +## [2.0.0](https://github.com/lampajr/backporting/compare/v1.0.0...v2.0.0) (2023-01-05) ### 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)) +* 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 diff --git a/README.md b/README.md index cdf9c1a..c555042 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,25 @@

- Git Backporting
+ BPER
+ Git Backporter
:outbox_tray: :inbox_tray:

- - ci checks status + + ci checks status - - npm version + + npm version

--- -**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. +## :tada: BPER v3 is out!! You can backport Gitlab merge requests now :tada: + +--- + +**Git Backporter**, also referenced as **bper**, 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. Table of content @@ -22,15 +27,16 @@ Table of content * **[Who is this tool for](#who-is-this-tool-for)** * **[CLI tool](#cli-tool)** +* **[Supported git services](#supported-git-services)** * **[GitHub action](#github-action)** * **[Future works](#future-works)** -* **[Development](#development)** +* **[Release](#release)** * **[Contributing](#contributing)** * **[License](#license)** ## Who is this tool for? -`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. +`bper` is a 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. @@ -38,23 +44,21 @@ Therefore this tools is for anybody who is working on projects where they have t ## 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 @kie/git-backporting +$ npm install -g @lampajr/bper ``` -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: +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 the simply run the following command: ```bash -$ git-backporting -tb -pr -a +$ bper -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 ***** +$ bper -tb develop -pr https://github.com/lampajr/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. @@ -64,43 +68,6 @@ This is the easiest invocation where you let the tool set / compute most of the * 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 tool comes with some inputs that allow users to override the default behavior, here the full list of available inputs: @@ -109,13 +76,11 @@ This tool comes with some inputs that allow users to override the default behavi |---------------|----------------------|--------------|--------------------------------------------------------------------------------------------------------------------------------------------------------|-------------| | Version | -V, --version | - | Current version of the tool | | | Help | -h, --help | - | Display the help message | | -| 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 | | +| Target Branch | -tb, --target-branch | N | Branch where the changes must be backported to | | +| Pull Request | -pr, --pull-request | N | Original pull request url, the one that must be backported, e.g., https://github.com/lampajr/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 | "" | +| Auth | -a, --auth | N | `GITHUB_TOKEN`, `GITLAB_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 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}" | @@ -124,30 +89,10 @@ This tool comes with some inputs that allow users to override the default behavi | 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 | +| Backport Branch Name | --bp-branch-name | N | Name of the backporting pull request branch | bp-{target-branch}-{sha} | | 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). - -#### Authorization token - -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. +> **NOTE**: `pull request` and `target branch` are *mandatory*, they must be provided as CLI options or as part of the configuration file (if used). #### Configuration file example @@ -161,17 +106,15 @@ This is an example of a configuration file that can be used. "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. +Keep in mind that its structue 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 +## Supported git services -Right now **Git Backporting** supports the following git management services: +Right now **bper** 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 @@ -179,7 +122,7 @@ Right now **Git Backporting** supports the following git management services: 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 Git Backporting +name: Pull Request Backporting using BPer on: workflow_dispatch: @@ -204,7 +147,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Backporting - uses: kiegroup/git-backporting@main + uses: lampajr/backporting@main with: target-branch: ${{ inputs.targetBranch }} pull-request: ${{ inputs.pullRequest }} @@ -217,7 +160,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 Git Backporting +name: Pull Request Backporting using BPer on: pull_request_target: @@ -225,9 +168,6 @@ on: - closed - labeled -env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - jobs: backporting: name: "Backporting" @@ -246,31 +186,30 @@ jobs: runs-on: ubuntu-latest steps: - name: Backporting - uses: kiegroup/git-backporting@main + uses: lampajr/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). ## Future works -**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: +**BPer** is still in development mode, this means that there are still many future works and extension. I'll try to summarize the most important ones: -- Provide a way to backport single commit (or a set of them) if no original pull request is present. +- 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 Bitbucket) to make it as generic as possible. - Integrate it into other CI/CD services like gitlab CI. - Provide some reusable *GitHub* workflows. -## Development - -### Package release +## 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 +### Automated release The first step is to prepare the changes for the next release, this is done by running: @@ -291,7 +230,7 @@ After that you should just push the new branch and open the pull request. 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 +### 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` @@ -308,7 +247,7 @@ Every change must be submitted through a *GitHub* pull request (PR). Backporting > **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/kiegroup/git-backporting). +1. Fork it (https://github.com/lampajr/backporting). 2. Create your feature branch: (git checkout -b feature). @@ -320,8 +259,6 @@ Every change must be submitted through a *GitHub* pull request (PR). Backporting > **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 -Git backporting open source project is licensed under the [MIT](./LICENSE) license. +Backporting (BPer) open source project is licensed under the [MIT](./LICENSE) license. \ No newline at end of file diff --git a/action.yml b/action.yml index d468e9e..56ab98d 100644 --- a/action.yml +++ b/action.yml @@ -1,122 +1,56 @@ 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" + description: "URL of the pull request to backport, e.g., https://github.com/lampajr/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 (?([^ ]+))$" + description: "Branch where the pull request must be backported to" required: false config-file: - description: > - Path to a file containing the json configuration for this tool, - the object must match the Args interface + 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), - if not provided will look for existing env variables like GITHUB_TOKEN + description: "GITHUB_TOKEN or a `repo` scoped Personal Access Token (PAT)" default: ${{ github.token }} required: false - git-client: - description: > - Git client type , if not set it is infered from pull-request - required: false git-user: - description: Local git user name + description: "Local git user name" default: "GitHub" required: false git-email: - description: Local git user 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 title. Default is the original PR title prefixed by the target branch" required: false body: - description: > - Backporting PR body. Default is the original PR body + description: "Backporting PR body. Default is the original PR body prefixed by `backport: `" + required: false + body-prefix: + description: "Backporting PR body prefix. Default is `backport: `" required: false bp-branch-name: - description: > - Comma separated list of backporting PR branch names. - Default is auto-generated from commit and target branches + description: "Backporting PR branch name. Default is auto-generated from commit" required: false reviewers: - description: > - Comma separated list of reviewers for the backporting pull request + 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 + 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 + description: "Considered only if reviewers is empty, if true keep reviewers as empty list, otherwise inherit from original pull request" required: false default: "false" runs: - using: node20 + using: node16 main: dist/gha/index.js branding: diff --git a/dist/cli/index.js b/dist/cli/index.js index 61bd8fd..275eabd 100755 --- a/dist/cli/index.js +++ b/dist/cli/index.js @@ -39,21 +39,16 @@ class ArgsParser { } 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"); + if (!args.pullRequest || !args.targetBranch) { + throw new Error("Missing option: pull request and target branch 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), @@ -63,15 +58,6 @@ class ArgsParser { 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), }; } } @@ -109,7 +95,7 @@ var __importStar = (this && this.__importStar) || function (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; +exports.readConfigFile = exports.parseArgs = void 0; const fs = __importStar(__nccwpck_require__(7147)); /** * Parse the input configuation string as json object and @@ -131,40 +117,6 @@ function readConfigFile(pathToFile) { 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; /***/ }), @@ -182,37 +134,31 @@ const args_parser_1 = __importDefault(__nccwpck_require__(3025)); const commander_1 = __nccwpck_require__(4379); const package_json_1 = __nccwpck_require__(6625); const args_utils_1 = __nccwpck_require__(8048); +function commaSeparatedList(value, _prev) { + // remove all whitespaces + const cleanedValue = value.trim(); + return cleanedValue !== "" ? cleanedValue.replace(/\s/g, "").split(",") : []; +} 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) - .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("-tb, --target-branch ", "branch where changes must be backported to.") + .option("-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") - .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("-a, --auth ", "git service authentication string, e.g., github token.") + .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 ", "backport pr branch name, default auto-generated by the commit.") + .option("--reviewers ", "comma separated list of reviewers for the backporting pull request.", commaSeparatedList) + .option("--assignees ", "comma separated list of assignees for the backporting pull request.", commaSeparatedList) .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"); + .option("-cf, --config-file ", "configuration file containing all valid options, the json must match Args interface."); } readArgs() { const opts = this.getCommand() @@ -229,9 +175,7 @@ class CLIArgsParser extends args_parser_1.default { 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, @@ -241,15 +185,6 @@ class CLIArgsParser extends args_parser_1.default { 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; @@ -283,11 +218,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 throw an error + // if PR is closed and not merged log a warning 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); } @@ -295,30 +230,6 @@ 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: @@ -330,9 +241,7 @@ 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 configs_types_1 = __nccwpck_require__(4753); const git_client_factory_1 = __importDefault(__nccwpck_require__(8550)); class PullRequestConfigsParser extends configs_parser_1.default { constructor() { @@ -341,81 +250,30 @@ class PullRequestConfigsParser extends configs_parser_1.default { } async parse(args) { let pr; - if (args.autoNoSquash) { - args.squash = undefined; - } try { - pr = await this.gitClient.getPullRequestFromUrl(args.pullRequest, args.squash); + pr = await this.gitClient.getPullRequestFromUrl(args.pullRequest); } 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, folder: `${folder.startsWith("/") ? "" : process.cwd() + "/"}${args.folder ?? this.getDefaultFolder()}`, - mergeStrategy: args.strategy, - mergeStrategyOption: args.strategyOption, - cherryPickOptions: args.cherryPickOptions, + targetBranch: args.targetBranch, originalPullRequest: pr, - backportPullRequests: this.generateBackportPullRequestsData(pr, args, targetBranches, bpBranchNames), + backportPullRequest: this.getDefaultBackportPullRequest(pr, args), 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 @@ -423,7 +281,7 @@ class PullRequestConfigsParser extends configs_parser_1.default { * @param targetBranch target branch where the backport should be applied * @returns {GitPullRequest} */ - generateBackportPullRequestsData(originalPullRequest, args, targetBranches, bpBranchNames) { + getDefaultBackportPullRequest(originalPullRequest, args) { const reviewers = args.reviewers ?? []; if (reviewers.length == 0 && args.inheritReviewers) { // inherit only if args.reviewers is empty and args.inheritReviewers set to true @@ -433,42 +291,17 @@ class PullRequestConfigsParser extends configs_parser_1.default { } } const bodyPrefix = args.bodyPrefix ?? `**Backport:** ${originalPullRequest.htmlUrl}\r\n\r\n`; - 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")) ?? [], - }; - }); + const body = args.body ?? `${originalPullRequest.body}`; + return { + author: args.gitUser ?? this.gitClient.getDefaultGitUser(), + title: args.title ?? `[${args.targetBranch}] ${originalPullRequest.title}`, + body: `${bodyPrefix}${body}`, + reviewers: [...new Set(reviewers)], + assignees: [...new Set(args.assignees)], + targetRepo: originalPullRequest.targetRepo, + sourceRepo: originalPullRequest.targetRepo, + branchName: args.bpBranchName, + }; } } exports["default"] = PullRequestConfigsParser; @@ -509,12 +342,11 @@ class GitCLIService { } /** * Update the provided remote URL by adding the auth token if not empty - * @param remoteURL remote link, e.g., https://github.com/kiegroup/git-backporting-example.git + * @param remoteURL remote link, e.g., https://github.com/lampajr/backporting-example.git */ remoteWithAuth(remoteURL) { - if (this.auth) { - // Anything will work as a username. - return remoteURL.replace("://", `://token:${this.auth}@`); + if (this.auth && this.gitData.user) { + return remoteURL.replace("://", `://${this.gitData.user}:${this.auth}@`); } // return remote as it is return remoteURL; @@ -535,22 +367,13 @@ 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; } - 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"]); + else { + this.logger.warn(`Folder ${to} already exist. Won't clone`); } - // 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 @@ -558,7 +381,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); } /** @@ -568,7 +391,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)); } /** @@ -578,7 +401,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"]); } /** @@ -586,38 +409,9 @@ class GitCLIService { * @param cwd repository in which the sha should be cherry picked to * @param sha commit 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; + 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]); } /** * Push a branch to a remote @@ -626,7 +420,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"); @@ -656,10 +450,9 @@ const gitlab_client_1 = __importDefault(__nccwpck_require__(4077)); * Singleton git service factory class */ 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"); + throw new Error("You must call `getOrCreate` method first!"); } return GitClientFactory.instance; } @@ -670,7 +463,7 @@ class GitClientFactory { */ static getOrCreate(type, authToken, apiUrl) { if (GitClientFactory.instance) { - GitClientFactory.logger.warn("Git service already initialized"); + GitClientFactory.logger.warn("Git service already initialized!"); return GitClientFactory.instance; } this.logger.debug(`Setting up ${type} client: apiUrl=${apiUrl}, token=****`); @@ -681,17 +474,13 @@ class GitClientFactory { 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.logger.warn("Resetting git service!"); GitClientFactory.instance = undefined; } } @@ -702,18 +491,13 @@ GitClientFactory.logger = logger_service_factory_1.default.getLogger(); /***/ }), /***/ 9080: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { +/***/ ((__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)); +exports.inferGitApiUrl = exports.inferGitClient = void 0; 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"; /** @@ -730,9 +514,6 @@ const inferGitClient = (prUrl) => { 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; @@ -745,74 +526,12 @@ exports.inferGitClient = inferGitClient; 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)) { + if (baseUrl.includes(PUBLIC_GITHUB_URL)) { 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; /***/ }), @@ -828,7 +547,6 @@ var GitClientType; (function (GitClientType) { GitClientType["GITHUB"] = "github"; GitClientType["GITLAB"] = "gitlab"; - GitClientType["CODEBERG"] = "codeberg"; })(GitClientType = exports.GitClientType || (exports.GitClientType = {})); var GitRepoState; (function (GitRepoState) { @@ -850,80 +568,39 @@ 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 GitHubClient { - constructor(token, apiUrl, isForCodeberg = false) { + constructor(token, apiUrl) { this.apiUrl = apiUrl; - this.isForCodeberg = isForCodeberg; this.logger = logger_service_factory_1.default.getLogger(); 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 getDefaultGitUser() { - return this.apiUrl.includes(git_types_1.GitClientType.CODEBERG.toString()) ? "Codeberg" : "GitHub"; + return "GitHub"; } getDefaultGitEmail() { return "noreply@github.com"; } - async getPullRequest(owner, repo, prNumber, squash) { - this.logger.debug(`Fetching pull request ${owner}/${repo}/${prNumber}`); + async getPullRequest(owner, repo, prNumber) { + this.logger.info(`Getting pull request ${owner}/${repo}/${prNumber}.`); const { data } = await this.octokit.rest.pulls.get({ owner: owner, repo: repo, - pull_number: prNumber, + pull_number: prNumber }); - 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); + return this.mapper.mapPullRequest(data); } - async getPullRequestFromUrl(prUrl, squash) { + async getPullRequestFromUrl(prUrl) { const { owner, project, id } = this.extractPullRequestData(prUrl); - return this.getPullRequest(owner, project, id, squash); + return this.getPullRequest(owner, project, id); } // 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, @@ -931,68 +608,38 @@ class GitHubClient { 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) { - 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}`))); + try { + await 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({ + try { + await this.octokit.issues.addAssignees({ owner: backport.owner, repo: backport.repo, 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"); + assignees: backport.assignees, + }); + } + catch (error) { + this.logger.error(`Error setting assignees: ${error}`); } - commentUrl = data.url; } - catch (error) { - this.logger.error(`Error creating comment on pull request ${prUrl}: ${error}`); - } - return commentUrl; + return data.html_url; } // UTILS /** @@ -1030,7 +677,7 @@ class GitHubMapper { return git_types_1.GitRepoState.CLOSED; } } - async mapPullRequest(pr, commits) { + async mapPullRequest(pr) { return { number: pr.number, author: pr.user.login, @@ -1041,20 +688,15 @@ class GitHubMapper { 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) ?? [], + reviewers: pr.requested_reviewers.filter(r => "login" in r).map((r => r?.login)), + assignees: pr.assignees.filter(r => "login" in r).map(r => r.login), 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), + // if pr is open use latest commit sha otherwise use merge_commit_sha + commits: pr.state === "open" ? [pr.head.sha] : [pr.merge_commit_sha] }; } - 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], @@ -1092,9 +734,10 @@ const rest_1 = __nccwpck_require__(5375); class OctokitFactory { static getOctokit(token, apiUrl) { if (!OctokitFactory.octokit) { + OctokitFactory.logger.info("Creating octokit instance."); OctokitFactory.octokit = new rest_1.Octokit({ auth: token, - userAgent: "kiegroup/git-backporting", + userAgent: "lampajr/backporting", baseUrl: apiUrl }); } @@ -1116,8 +759,6 @@ 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)); @@ -1130,7 +771,7 @@ class GitLabClient { baseURL: this.apiUrl, headers: { Authorization: token ? `Bearer ${token}` : "", - "User-Agent": "kiegroup/git-backporting", + "User-Agent": "lampajr/backporting", }, httpsAgent: new https_1.default.Agent({ rejectUnauthorized @@ -1138,9 +779,6 @@ class GitLabClient { }); this.mapper = new gitlab_mapper_1.default(this.client); } - getClientType() { - return git_types_1.GitClientType.GITLAB; - } getDefaultGitUser() { return "Gitlab"; } @@ -1148,36 +786,19 @@ class GitLabClient { return "noreply@gitlab.com"; } // READ - // example: /api/v4/projects/%2Fbackporting-example/merge_requests/1 - async getPullRequest(namespace, repo, mrNumber, squash) { + // example: /api/v4/projects/alampare%2Fbackporting-example/merge_requests/1 + async getPullRequest(namespace, repo, mrNumber) { 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); + const { data } = await this.client.get(`/projects/${projectId}/merge_requests/${mrNumber}`); + return this.mapper.mapPullRequest(data); } - getPullRequestFromUrl(mrUrl, squash) { + getPullRequestFromUrl(mrUrl) { const { namespace, project, id } = this.extractMergeRequestData(mrUrl); - return this.getPullRequest(namespace, project, id, squash); + return this.getPullRequest(namespace, project, id); } // 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 projectId = this.getProjectId(backport.owner, backport.repo); const { data } = await this.client.post(`/projects/${projectId}/merge_requests`, { @@ -1189,73 +810,54 @@ class GitLabClient { 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(() => { + const reviewerIds = []; + for (const r of backport.reviewers) { + try { + this.logger.debug("Retrieving user: " + r); + const user = await this.getUser(r); + reviewerIds.push(user.id); + } + catch (error) { 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}`); + if (reviewerIds.length > 0) { + try { + this.logger.info("Setting reviewers: " + reviewerIds); + await 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); + } } - return commentUrl; + // assignees + const assigneeIds = []; + for (const a of backport.assignees) { + try { + this.logger.debug("Retrieving user: " + a); + const user = await this.getUser(a); + assigneeIds.push(user.id); + } + catch (error) { + this.logger.warn(`Failed to retrieve assignee ${a}`); + } + } + if (assigneeIds.length > 0) { + try { + this.logger.info("Setting assignees: " + assigneeIds); + await 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); + } + } + return mr.web_url; } - // UTILS /** * Retrieve a gitlab user given its username * @param username @@ -1274,21 +876,15 @@ class GitLabClient { } /** * Extract repository namespace, project and mr number from the merge request url - * example: //backporting-example/-/merge_requests/1 + * example: /alampare/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); + const elems = mrUrl.replace("/-/", "/").split("/"); return { - namespace: namespace, + namespace: elems[elems.length - 4], project: elems[elems.length - 3], id: parseInt(mrUrl.substring(mrUrl.lastIndexOf("/") + 1, mrUrl.length)), }; @@ -1327,7 +923,8 @@ class GitLabMapper { return git_types_1.GitRepoState.LOCKED; } } - async mapPullRequest(mr, commits) { + async mapPullRequest(mr) { + // throw new Error("Method not implemented."); return { number: mr.iid, author: mr.author.username, @@ -1340,19 +937,14 @@ class GitLabMapper { 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) + nCommits: 1, + // if mr is merged, use merge_commit_sha otherwise use sha + // what is the difference between sha and diff_refs.head_sha? + commits: this.isMerged(mr) ? [mr.squash_commit_sha ? mr.squash_commit_sha : mr.merge_commit_sha] : [mr.sha] }; } - 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 { @@ -1400,34 +992,22 @@ class ConsoleLoggerService { 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", this.fromContext(message)); + this.logger.log("[TRACE]", message); } debug(message) { if (this.verbose) { - this.logger.log("DEBUG", this.fromContext(message)); + this.logger.log("[DEBUG]", message); } } info(message) { - this.logger.log("INFO", this.fromContext(message)); + this.logger.log("[INFO]", message); } warn(message) { - this.logger.log("WARN", this.fromContext(message)); + this.logger.log("[WARN]", message); } error(message) { - this.logger.log("ERROR", this.fromContext(message)); - } - fromContext(msg) { - return this.context ? `[${this.context}] ${msg}` : msg; + this.logger.log("[ERROR]", message); } } exports["default"] = ConsoleLoggerService; @@ -1473,7 +1053,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); class Logger { log(prefix, ...str) { // eslint-disable-next-line no-console - console.log.apply(console, [`[${prefix.padEnd(5)}]`, ...str]); + console.log.apply(console, [prefix, ...str]); } emptyLine() { this.log("", ""); @@ -1482,39 +1062,6 @@ 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: @@ -1532,7 +1079,6 @@ 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 */ @@ -1547,12 +1093,12 @@ class Runner { async run() { 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); } } @@ -1563,105 +1109,60 @@ 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 - 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); + const gitClientType = (0, git_util_1.inferGitClient)(args.pullRequest); + // right now the apiVersion is set to v4 + const apiUrl = (0, git_util_1.inferGitApiUrl)(args.pullRequest); + const gitApi = git_client_factory_1.default.getOrCreate(gitClientType, args.auth, 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 backportPRs = configs.backportPullRequests; + const originalPR = configs.originalPullRequest; + const backportPR = configs.backportPullRequest; // start local git operations 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 this.logger.debug("Cloning repo.."); - await git.gitCli.clone(configs.originalPullRequest.targetRepo.cloneUrl, configs.folder, backportPR.base); + await git.clone(configs.originalPullRequest.targetRepo.cloneUrl, configs.folder, configs.targetBranch); // 5. create new branch from target one and checkout this.logger.debug("Creating local branch.."); - await git.gitCli.createLocalBranch(configs.folder, backportPR.head); + const backportBranch = backportPR.branchName ?? `bp-${configs.targetBranch}-${originalPR.commits.join("-")}`; + await git.createLocalBranch(configs.folder, backportBranch); // 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") { 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}`); + const prefix = gitClientType === git_types_1.GitClientType.GITHUB ? "pull" : "merge-requests"; // default is for gitlab + await git.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.gitCli.cherryPick(configs.folder, sha, configs.mergeStrategy, configs.mergeStrategyOption, configs.cherryPickOptions); + await git.cherryPick(configs.folder, sha); } + const backport = { + owner: originalPR.targetRepo.owner, + repo: originalPR.targetRepo.project, + head: backportBranch, + base: configs.targetBranch, + title: backportPR.title, + body: backportPR.body, + reviewers: backportPR.reviewers, + assignees: backportPR.assignees, + }; if (!configs.dryRun) { // 8. push the new branch to origin - await git.gitCli.push(configs.folder, backportPR.head); + await git.push(configs.folder, backportBranch); // 9. create pull request new branch -> target branch (using octokit) - const prUrl = await git.gitClientApi.createPullRequest(backportPR); + const prUrl = await gitApi.createPullRequest(backport); this.logger.info(`Pull request created: ${prUrl}`); } else { - this.logger.warn("Pull request creation and remote push skipped"); - this.logger.info(`${JSON.stringify(backportPR, null, 2)}`); + this.logger.warn("Pull request creation and remote push skipped!"); + this.logger.info(`${JSON.stringify(backport, null, 2)}`); } - this.logger.clearContext(); } } exports["default"] = Runner; @@ -6096,30 +5597,6 @@ 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); @@ -6129,20 +5606,19 @@ events.forEach(function (event) { }; }); -// Error types with codes var InvalidUrlError = createErrorType( "ERR_INVALID_URL", "Invalid URL", TypeError ); +// Error types with codes var RedirectionError = createErrorType( "ERR_FR_REDIRECTION_FAILURE", "Redirected request failed" ); var TooManyRedirectsError = createErrorType( "ERR_FR_TOO_MANY_REDIRECTS", - "Maximum number of redirects exceeded", - RedirectionError + "Maximum number of redirects exceeded" ); var MaxBodyLengthExceededError = createErrorType( "ERR_FR_MAX_BODY_LENGTH_EXCEEDED", @@ -6153,9 +5629,6 @@ var WriteAfterEndError = createErrorType( "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 @@ -6177,13 +5650,7 @@ function RedirectableRequest(options, 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 })); - } + self._processResponse(response); }; // Perform the first request @@ -6192,17 +5659,10 @@ function RedirectableRequest(options, responseCallback) { RedirectableRequest.prototype = Object.create(Writable.prototype); RedirectableRequest.prototype.abort = function () { - destroyRequest(this._currentRequest); - this._currentRequest.abort(); + abortRequest(this._currentRequest); 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 @@ -6315,7 +5775,6 @@ RedirectableRequest.prototype.setTimeout = function (msecs, callback) { self.removeListener("abort", clearTimer); self.removeListener("error", clearTimer); self.removeListener("response", clearTimer); - self.removeListener("close", clearTimer); if (callback) { self.removeListener("timeout", callback); } @@ -6342,7 +5801,6 @@ RedirectableRequest.prototype.setTimeout = function (msecs, callback) { this.on("abort", clearTimer); this.on("error", clearTimer); this.on("response", clearTimer); - this.on("close", clearTimer); return this; }; @@ -6401,7 +5859,8 @@ RedirectableRequest.prototype._performRequest = function () { var protocol = this._options.protocol; var nativeProtocol = this._options.nativeProtocols[protocol]; if (!nativeProtocol) { - throw new TypeError("Unsupported protocol " + protocol); + this.emit("error", new TypeError("Unsupported protocol " + protocol)); + return; } // If specified, use the agent corresponding to the protocol @@ -6493,14 +5952,15 @@ RedirectableRequest.prototype._processResponse = function (response) { } // The response is a redirect, so abort the current request - destroyRequest(this._currentRequest); + abortRequest(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(); + this.emit("error", new TooManyRedirectsError()); + return; } // Store the request headers if applicable @@ -6534,24 +5994,34 @@ RedirectableRequest.prototype._processResponse = function (response) { 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 currentUrlParts = url.parse(this._currentUrl); var currentHost = currentHostHeader || currentUrlParts.host; var currentUrl = /^\w+:/.test(location) ? this._currentUrl : url.format(Object.assign(currentUrlParts, { host: currentHost })); + // Determine the URL of the redirection + var redirectUrl; + try { + redirectUrl = url.resolve(currentUrl, location); + } + catch (cause) { + this.emit("error", new RedirectionError({ cause: cause })); + return; + } + // Create the redirected request - var redirectUrl = resolveUrl(location, currentUrl); - debug("redirecting to", redirectUrl.href); + debug("redirecting to", redirectUrl); this._isRedirect = true; - spreadUrlObject(redirectUrl, this._options); + var redirectUrlParts = url.parse(redirectUrl); + Object.assign(this._options, redirectUrlParts); // 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); + if (redirectUrlParts.protocol !== currentUrlParts.protocol && + redirectUrlParts.protocol !== "https:" || + redirectUrlParts.host !== currentHost && + !isSubdomain(redirectUrlParts.host, currentHost)) { + removeMatchingHeaders(/^(?:authorization|cookie)$/i, this._options.headers); } // Evaluate the beforeRedirect callback @@ -6565,12 +6035,23 @@ RedirectableRequest.prototype._processResponse = function (response) { method: method, headers: requestHeaders, }; - beforeRedirect(this._options, responseDetails, requestDetails); + try { + beforeRedirect(this._options, responseDetails, requestDetails); + } + catch (err) { + this.emit("error", err); + return; + } this._sanitizeOptions(this._options); } // Perform the redirected request - this._performRequest(); + try { + this._performRequest(); + } + catch (cause) { + this.emit("error", new RedirectionError({ cause: cause })); + } }; // Wraps the key/value object of protocols with redirect functionality @@ -6590,16 +6071,27 @@ function wrap(protocols) { // Executes a request, following redirects function request(input, options, callback) { - // Parse parameters, ensuring that input is an object - if (isURL(input)) { - input = spreadUrlObject(input); + // Parse parameters + if (isString(input)) { + var parsed; + try { + parsed = urlToOptions(new URL(input)); + } + catch (err) { + /* istanbul ignore next */ + parsed = url.parse(input); + } + if (!isString(parsed.protocol)) { + throw new InvalidUrlError({ input }); + } + input = parsed; } - else if (isString(input)) { - input = spreadUrlObject(parseUrl(input)); + else if (URL && (input instanceof URL)) { + input = urlToOptions(input); } else { callback = options; - options = validateUrl(input); + options = input; input = { protocol: protocol }; } if (isFunction(options)) { @@ -6638,57 +6130,27 @@ function wrap(protocols) { return exports; } +/* istanbul ignore next */ function noop() { /* empty */ } -function parseUrl(input) { - var parsed; - /* istanbul ignore else */ - if (useNativeURL) { - parsed = new URL(input); +// from https://github.com/nodejs/node/blob/master/lib/internal/url.js +function urlToOptions(urlObject) { + var options = { + protocol: urlObject.protocol, + hostname: urlObject.hostname.startsWith("[") ? + /* istanbul ignore next */ + urlObject.hostname.slice(1, -1) : + urlObject.hostname, + hash: urlObject.hash, + search: urlObject.search, + pathname: urlObject.pathname, + path: urlObject.pathname + urlObject.search, + href: urlObject.href, + }; + if (urlObject.port !== "") { + options.port = Number(urlObject.port); } - 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; + return options; } function removeMatchingHeaders(regex, headers) { @@ -6714,25 +6176,17 @@ function createErrorType(code, message, baseClass) { // 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, - }, - }); + CustomError.prototype.constructor = CustomError; + CustomError.prototype.name = "Error [" + code + "]"; return CustomError; } -function destroyRequest(request, error) { +function abortRequest(request) { for (var event of events) { request.removeListener(event, eventHandlers[event]); } request.on("error", noop); - request.destroy(error); + request.abort(); } function isSubdomain(subdomain, domain) { @@ -6753,10 +6207,6 @@ 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; @@ -16268,14 +15718,6 @@ module.exports = require("child_process"); /***/ }), -/***/ 6113: -/***/ ((module) => { - -"use strict"; -module.exports = require("crypto"); - -/***/ }), - /***/ 2361: /***/ ((module) => { @@ -19644,11 +19086,10 @@ exports.suggestSimilar = suggestSimilar; /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -/*! Axios v1.8.4 Copyright (c) 2025 Matt Zabriskie and contributors */ +// Axios v1.4.0 Copyright (c) 2023 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); @@ -19657,20 +19098,19 @@ 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); +const EventEmitter = __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); +const EventEmitter__default = /*#__PURE__*/_interopDefaultLegacy(EventEmitter); function bind(fn, thisArg) { return function wrap() { @@ -19885,8 +19325,6 @@ const isFormData = (thing) => { */ 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 * @@ -20218,9 +19656,8 @@ const reduceDescriptors = (obj, reducer) => { const reducedDescriptors = {}; forEach(descriptors, (descriptor, name) => { - let ret; - if ((ret = reducer(descriptor, name, obj)) !== false) { - reducedDescriptors[name] = ret || descriptor; + if (reducer(descriptor, name, obj) !== false) { + reducedDescriptors[name] = descriptor; } }); @@ -20275,7 +19712,28 @@ const toObjectSet = (arrayOrString, delimiter) => { const noop = () => {}; const toFiniteNumber = (value, defaultValue) => { - return value != null && Number.isFinite(value = +value) ? value : defaultValue; + value = +value; + return Number.isFinite(value) ? value : defaultValue; +}; + +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; + while (size--) { + str += alphabet[Math.random() * length|0]; + } + + return str; }; /** @@ -20325,37 +19783,7 @@ 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 = { +const utils = { isArray, isArrayBuffer, isBuffer, @@ -20366,10 +19794,6 @@ const utils$1 = { isBoolean, isObject, isPlainObject, - isReadableStream, - isRequest, - isResponse, - isHeaders, isUndefined, isDate, isFile, @@ -20405,12 +19829,12 @@ const utils$1 = { findKey, global: _global, isContextDefined, + ALPHABET, + generateString, isSpecCompliantForm, toJSONObject, isAsyncFn, - isThenable, - setImmediate: _setImmediate, - asap + isThenable }; /** @@ -20438,13 +19862,10 @@ function AxiosError(message, code, config, request, response) { code && (this.code = code); config && (this.config = config); request && (this.request = request); - if (response) { - this.response = response; - this.status = response.status ? response.status : null; - } + response && (this.response = response); } -utils$1.inherits(AxiosError, Error, { +utils.inherits(AxiosError, Error, { toJSON: function toJSON() { return { // Standard @@ -20459,9 +19880,9 @@ utils$1.inherits(AxiosError, Error, { columnNumber: this.columnNumber, stack: this.stack, // Axios - config: utils$1.toJSONObject(this.config), + config: utils.toJSONObject(this.config), code: this.code, - status: this.status + status: this.response && this.response.status ? this.response.status : null }; } }); @@ -20494,7 +19915,7 @@ Object.defineProperty(prototype$1, 'isAxiosError', {value: true}); AxiosError.from = (error, code, config, request, response, customProps) => { const axiosError = Object.create(prototype$1); - utils$1.toFlatObject(error, axiosError, function filter(obj) { + utils.toFlatObject(error, axiosError, function filter(obj) { return obj !== Error.prototype; }, prop => { return prop !== 'isAxiosError'; @@ -20519,7 +19940,7 @@ AxiosError.from = (error, code, config, request, response, customProps) => { * @returns {boolean} */ function isVisitable(thing) { - return utils$1.isPlainObject(thing) || utils$1.isArray(thing); + return utils.isPlainObject(thing) || utils.isArray(thing); } /** @@ -20530,7 +19951,7 @@ function isVisitable(thing) { * @returns {string} the key without the brackets. */ function removeBrackets(key) { - return utils$1.endsWith(key, '[]') ? key.slice(0, -2) : key; + return utils.endsWith(key, '[]') ? key.slice(0, -2) : key; } /** @@ -20559,10 +19980,10 @@ function renderKey(path, key, dots) { * @returns {boolean} */ function isFlatArray(arr) { - return utils$1.isArray(arr) && !arr.some(isVisitable); + return utils.isArray(arr) && !arr.some(isVisitable); } -const predicates = utils$1.toFlatObject(utils$1, {}, null, function filter(prop) { +const predicates = utils.toFlatObject(utils, {}, null, function filter(prop) { return /^is[A-Z]/.test(prop); }); @@ -20590,7 +20011,7 @@ const predicates = utils$1.toFlatObject(utils$1, {}, null, function filter(prop) * @returns */ function toFormData(obj, formData, options) { - if (!utils$1.isObject(obj)) { + if (!utils.isObject(obj)) { throw new TypeError('target must be an object'); } @@ -20598,13 +20019,13 @@ function toFormData(obj, formData, options) { formData = formData || new (FormData__default["default"] || FormData)(); // eslint-disable-next-line no-param-reassign - options = utils$1.toFlatObject(options, { + options = utils.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]); + return !utils.isUndefined(source[option]); }); const metaTokens = options.metaTokens; @@ -20613,24 +20034,24 @@ function toFormData(obj, formData, options) { const dots = options.dots; const indexes = options.indexes; const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob; - const useBlob = _Blob && utils$1.isSpecCompliantForm(formData); + const useBlob = _Blob && utils.isSpecCompliantForm(formData); - if (!utils$1.isFunction(visitor)) { + if (!utils.isFunction(visitor)) { throw new TypeError('visitor must be a function'); } function convertValue(value) { if (value === null) return ''; - if (utils$1.isDate(value)) { + if (utils.isDate(value)) { return value.toISOString(); } - if (!useBlob && utils$1.isBlob(value)) { + if (!useBlob && utils.isBlob(value)) { throw new AxiosError('Blob is not supported. Use a Buffer instead.'); } - if (utils$1.isArrayBuffer(value) || utils$1.isTypedArray(value)) { + if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) { return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value); } @@ -20651,20 +20072,20 @@ function toFormData(obj, formData, options) { let arr = value; if (value && !path && typeof value === 'object') { - if (utils$1.endsWith(key, '{}')) { + if (utils.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)) + (utils.isArray(value) && isFlatArray(value)) || + ((utils.isFileList(value) || utils.endsWith(key, '[]')) && (arr = utils.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( + !(utils.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) @@ -20692,7 +20113,7 @@ function toFormData(obj, formData, options) { }); function build(value, path) { - if (utils$1.isUndefined(value)) return; + if (utils.isUndefined(value)) return; if (stack.indexOf(value) !== -1) { throw Error('Circular reference detected in ' + path.join('.')); @@ -20700,9 +20121,9 @@ function toFormData(obj, formData, options) { 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 + utils.forEach(value, function each(el, key) { + const result = !(utils.isUndefined(el) || el === null) && visitor.call( + formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers ); if (result === true) { @@ -20713,7 +20134,7 @@ function toFormData(obj, formData, options) { stack.pop(); } - if (!utils$1.isObject(obj)) { + if (!utils.isObject(obj)) { throw new TypeError('data must be an object'); } @@ -20798,7 +20219,7 @@ function encode(val) { * * @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 + * @param {?object} options * * @returns {string} The formatted url */ @@ -20810,12 +20231,6 @@ function buildURL(url, params, options) { const _encode = options && options.encode || encode; - if (utils$1.isFunction(options)) { - options = { - serialize: options - }; - } - const serializeFn = options && options.serialize; let serializedParams; @@ -20823,7 +20238,7 @@ function buildURL(url, params, options) { if (serializeFn) { serializedParams = serializeFn(params, options); } else { - serializedParams = utils$1.isURLSearchParams(params) ? + serializedParams = utils.isURLSearchParams(params) ? params.toString() : new AxiosURLSearchParams(params, options).toString(_encode); } @@ -20898,7 +20313,7 @@ class InterceptorManager { * @returns {void} */ forEach(fn) { - utils$1.forEach(this.handlers, function forEachHandler(h) { + utils.forEach(this.handlers, function forEachHandler(h) { if (h !== null) { fn(h); } @@ -20916,103 +20331,20 @@ const transitionalDefaults = { 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 = { +const platform = { 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)) { + if (utils.isBuffer(value)) { this.append(key, value.toString('base64')); return false; } @@ -21034,7 +20366,7 @@ function parsePropPath(name) { // foo.x.y.z // foo-x-y-z // foo x y z - return utils$1.matchAll(/\w+|\[(\w*)]/g, name).map(match => { + return utils.matchAll(/\w+|\[(\w*)]/g, name).map(match => { return match[0] === '[]' ? '' : match[1] || match[0]; }); } @@ -21069,15 +20401,12 @@ function arrayToObject(arr) { 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; + name = !name && utils.isArray(target) ? target.length : name; if (isLast) { - if (utils$1.hasOwnProp(target, name)) { + if (utils.hasOwnProp(target, name)) { target[name] = [target[name], value]; } else { target[name] = value; @@ -21086,23 +20415,23 @@ function formDataToJSON(formData) { return !isNumericKey; } - if (!target[name] || !utils$1.isObject(target[name])) { + if (!target[name] || !utils.isObject(target[name])) { target[name] = []; } const result = buildPath(path, value, target[name], index); - if (result && utils$1.isArray(target[name])) { + if (result && utils.isArray(target[name])) { target[name] = arrayToObject(target[name]); } return !isNumericKey; } - if (utils$1.isFormData(formData) && utils$1.isFunction(formData.entries)) { + if (utils.isFormData(formData) && utils.isFunction(formData.entries)) { const obj = {}; - utils$1.forEachEntry(formData, (name, value) => { + utils.forEachEntry(formData, (name, value) => { buildPath(parsePropPath(name), value, obj, 0); }); @@ -21112,6 +20441,10 @@ function formDataToJSON(formData) { return null; } +const DEFAULT_CONTENT_TYPE = { + 'Content-Type': undefined +}; + /** * It takes a string, tries to parse it, and if it fails, it returns the stringified version * of the input @@ -21123,10 +20456,10 @@ function formDataToJSON(formData) { * @returns {string} A stringified version of the rawValue. */ function stringifySafely(rawValue, parser, encoder) { - if (utils$1.isString(rawValue)) { + if (utils.isString(rawValue)) { try { (parser || JSON.parse)(rawValue); - return utils$1.trim(rawValue); + return utils.trim(rawValue); } catch (e) { if (e.name !== 'SyntaxError') { throw e; @@ -21141,36 +20474,38 @@ const defaults = { transitional: transitionalDefaults, - adapter: ['xhr', 'http', 'fetch'], + adapter: ['xhr', 'http'], transformRequest: [function transformRequest(data, headers) { const contentType = headers.getContentType() || ''; const hasJSONContentType = contentType.indexOf('application/json') > -1; - const isObjectPayload = utils$1.isObject(data); + const isObjectPayload = utils.isObject(data); - if (isObjectPayload && utils$1.isHTMLForm(data)) { + if (isObjectPayload && utils.isHTMLForm(data)) { data = new FormData(data); } - const isFormData = utils$1.isFormData(data); + const isFormData = utils.isFormData(data); if (isFormData) { + if (!hasJSONContentType) { + return data; + } 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) + if (utils.isArrayBuffer(data) || + utils.isBuffer(data) || + utils.isStream(data) || + utils.isFile(data) || + utils.isBlob(data) ) { return data; } - if (utils$1.isArrayBufferView(data)) { + if (utils.isArrayBufferView(data)) { return data.buffer; } - if (utils$1.isURLSearchParams(data)) { + if (utils.isURLSearchParams(data)) { headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false); return data.toString(); } @@ -21182,7 +20517,7 @@ const defaults = { return toURLEncodedForm(data, this.formSerializer).toString(); } - if ((isFileList = utils$1.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) { + if ((isFileList = utils.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) { const _FormData = this.env && this.env.FormData; return toFormData( @@ -21206,11 +20541,7 @@ const defaults = { 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)) { + if (data && utils.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) { const silentJSONParsing = transitional && transitional.silentJSONParsing; const strictJSONParsing = !silentJSONParsing && JSONRequested; @@ -21252,21 +20583,24 @@ const defaults = { headers: { common: { - 'Accept': 'application/json, text/plain, */*', - 'Content-Type': undefined + 'Accept': 'application/json, text/plain, */*' } } }; -utils$1.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], (method) => { +utils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) { defaults.headers[method] = {}; }); +utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { + defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE); +}); + 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([ +const ignoreDuplicateOf = utils.toObjectSet([ 'age', 'authorization', 'content-length', 'content-type', 'etag', 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since', 'last-modified', 'location', 'max-forwards', 'proxy-authorization', @@ -21327,7 +20661,7 @@ function normalizeValue(value) { return value; } - return utils$1.isArray(value) ? value.map(normalizeValue) : String(value); + return utils.isArray(value) ? value.map(normalizeValue) : String(value); } function parseTokens(str) { @@ -21345,7 +20679,7 @@ function parseTokens(str) { const isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim()); function matchHeaderValue(context, value, header, filter, isHeaderNameFilter) { - if (utils$1.isFunction(filter)) { + if (utils.isFunction(filter)) { return filter.call(this, value, header); } @@ -21353,13 +20687,13 @@ function matchHeaderValue(context, value, header, filter, isHeaderNameFilter) { value = header; } - if (!utils$1.isString(value)) return; + if (!utils.isString(value)) return; - if (utils$1.isString(filter)) { + if (utils.isString(filter)) { return value.indexOf(filter) !== -1; } - if (utils$1.isRegExp(filter)) { + if (utils.isRegExp(filter)) { return filter.test(value); } } @@ -21372,7 +20706,7 @@ function formatHeader(header) { } function buildAccessors(obj, header) { - const accessorName = utils$1.toCamelCase(' ' + header); + const accessorName = utils.toCamelCase(' ' + header); ['get', 'set', 'has'].forEach(methodName => { Object.defineProperty(obj, methodName + accessorName, { @@ -21399,7 +20733,7 @@ class AxiosHeaders { throw new Error('header name must be a non-empty string'); } - const key = utils$1.findKey(self, lHeader); + const key = utils.findKey(self, lHeader); if(!key || self[key] === undefined || _rewrite === true || (_rewrite === undefined && self[key] !== false)) { self[key || _header] = normalizeValue(_value); @@ -21407,16 +20741,12 @@ class AxiosHeaders { } const setHeaders = (headers, _rewrite) => - utils$1.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite)); + utils.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite)); - if (utils$1.isPlainObject(header) || header instanceof this.constructor) { + if (utils.isPlainObject(header) || header instanceof this.constructor) { setHeaders(header, valueOrRewrite); - } else if(utils$1.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) { + } else if(utils.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); } @@ -21428,7 +20758,7 @@ class AxiosHeaders { header = normalizeHeader(header); if (header) { - const key = utils$1.findKey(this, header); + const key = utils.findKey(this, header); if (key) { const value = this[key]; @@ -21441,11 +20771,11 @@ class AxiosHeaders { return parseTokens(value); } - if (utils$1.isFunction(parser)) { + if (utils.isFunction(parser)) { return parser.call(this, value, key); } - if (utils$1.isRegExp(parser)) { + if (utils.isRegExp(parser)) { return parser.exec(value); } @@ -21458,7 +20788,7 @@ class AxiosHeaders { header = normalizeHeader(header); if (header) { - const key = utils$1.findKey(this, header); + const key = utils.findKey(this, header); return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher))); } @@ -21474,7 +20804,7 @@ class AxiosHeaders { _header = normalizeHeader(_header); if (_header) { - const key = utils$1.findKey(self, _header); + const key = utils.findKey(self, _header); if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) { delete self[key]; @@ -21484,7 +20814,7 @@ class AxiosHeaders { } } - if (utils$1.isArray(header)) { + if (utils.isArray(header)) { header.forEach(deleteHeader); } else { deleteHeader(header); @@ -21513,8 +20843,8 @@ class AxiosHeaders { const self = this; const headers = {}; - utils$1.forEach(this, (value, header) => { - const key = utils$1.findKey(headers, header); + utils.forEach(this, (value, header) => { + const key = utils.findKey(headers, header); if (key) { self[key] = normalizeValue(value); @@ -21543,8 +20873,8 @@ class AxiosHeaders { 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); + utils.forEach(this, (value, header) => { + value != null && value !== false && (obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value); }); return obj; @@ -21591,7 +20921,7 @@ class AxiosHeaders { } } - utils$1.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header); + utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header); return this; } @@ -21599,18 +20929,8 @@ class AxiosHeaders { 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); +utils.freezeMethods(AxiosHeaders.prototype); +utils.freezeMethods(AxiosHeaders); const AxiosHeaders$1 = AxiosHeaders; @@ -21628,7 +20948,7 @@ function transformData(fns, response) { const headers = AxiosHeaders$1.from(context.headers); let data = context.data; - utils$1.forEach(fns, function transform(fn) { + utils.forEach(fns, function transform(fn) { data = fn.call(config, data, headers.normalize(), response ? response.status : undefined); }); @@ -21656,7 +20976,7 @@ function CanceledError(message, config, request) { this.name = 'CanceledError'; } -utils$1.inherits(CanceledError, AxiosError, { +utils.inherits(CanceledError, AxiosError, { __CANCEL__: true }); @@ -21708,7 +21028,7 @@ function isAbsoluteURL(url) { */ function combineURLs(baseURL, relativeURL) { return relativeURL - ? baseURL.replace(/\/?\/$/, '') + '/' + relativeURL.replace(/^\/+/, '') + ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '') : baseURL; } @@ -21722,15 +21042,14 @@ function combineURLs(baseURL, relativeURL) { * * @returns {string} The combined full path */ -function buildFullPath(baseURL, requestedURL, allowAbsoluteUrls) { - let isRelativeUrl = !isAbsoluteURL(requestedURL); - if (baseURL && (isRelativeUrl || allowAbsoluteUrls == false)) { +function buildFullPath(baseURL, requestedURL) { + if (baseURL && !isAbsoluteURL(requestedURL)) { return combineURLs(baseURL, requestedURL); } return requestedURL; } -const VERSION = "1.8.4"; +const VERSION = "1.4.0"; function parseProtocol(url) { const match = /^([-+\w]{1,25})(:?\/\/|:)/.exec(url); @@ -21785,11 +21104,93 @@ function fromDataURI(uri, asBlob, options) { throw new AxiosError('Unsupported protocol ' + protocol, AxiosError.ERR_NOT_SUPPORT); } +/** + * Throttle decorator + * @param {Function} fn + * @param {Number} freq + * @return {Function} + */ +function throttle(fn, freq) { + let timestamp = 0; + const threshold = 1000 / freq; + let timer = null; + return function throttled(force, args) { + const now = Date.now(); + if (force || now - timestamp > threshold) { + if (timer) { + clearTimeout(timer); + timer = null; + } + timestamp = now; + return fn.apply(null, args); + } + if (!timer) { + timer = setTimeout(() => { + timer = null; + timestamp = Date.now(); + return fn.apply(null, args); + }, threshold - (now - timestamp)); + } + }; +} + +/** + * 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; + }; +} + const kInternals = Symbol('internals'); class AxiosTransformStream extends stream__default["default"].Transform{ constructor(options) { - options = utils$1.toFlatObject(options, { + options = utils.toFlatObject(options, { maxRate: 0, chunkSize: 64 * 1024, minChunkSize: 100, @@ -21797,15 +21198,19 @@ class AxiosTransformStream extends stream__default["default"].Transform{ ticksRate: 2, samplesCount: 15 }, null, (prop, source) => { - return !utils$1.isUndefined(source[prop]); + return !utils.isUndefined(source[prop]); }); super({ readableHighWaterMark: options.chunkSize }); + const self = this; + const internals = this[kInternals] = { + length: options.length, timeWindow: options.timeWindow, + ticksRate: options.ticksRate, chunkSize: options.chunkSize, maxRate: options.maxRate, minChunkSize: options.minChunkSize, @@ -21817,6 +21222,8 @@ class AxiosTransformStream extends stream__default["default"].Transform{ onReadCallback: null }; + const _speedometer = speedometer(internals.ticksRate * options.samplesCount, internals.timeWindow); + this.on('newListener', event => { if (event === 'progress') { if (!internals.isCaptured) { @@ -21824,6 +21231,38 @@ class AxiosTransformStream extends stream__default["default"].Transform{ } } }); + + let bytesNotified = 0; + + internals.updateProgress = throttle(function throttledHandler() { + const totalBytes = internals.length; + const bytesTransferred = internals.bytesSeen; + const progressBytes = bytesTransferred - bytesNotified; + if (!progressBytes || self.destroyed) return; + + const rate = _speedometer(progressBytes); + + bytesNotified = bytesTransferred; + + process.nextTick(() => { + self.emit('progress', { + 'loaded': bytesTransferred, + 'total': totalBytes, + 'progress': totalBytes ? (bytesTransferred / totalBytes) : undefined, + 'bytes': progressBytes, + 'rate': rate ? rate : undefined, + 'estimated': rate && totalBytes && bytesTransferred <= totalBytes ? + (totalBytes - bytesTransferred) / rate : undefined + }); + }); + }, internals.ticksRate); + + const onFinish = () => { + internals.updateProgress(true); + }; + + this.once('end', onFinish); + this.once('error', onFinish); } _read(size) { @@ -21837,6 +21276,7 @@ class AxiosTransformStream extends stream__default["default"].Transform{ } _transform(chunk, encoding, callback) { + const self = this; const internals = this[kInternals]; const maxRate = internals.maxRate; @@ -21848,14 +21288,16 @@ class AxiosTransformStream extends stream__default["default"].Transform{ const bytesThreshold = (maxRate / divider); const minChunkSize = internals.minChunkSize !== false ? Math.max(internals.minChunkSize, bytesThreshold * 0.01) : 0; - const pushChunk = (_chunk, _callback) => { + function pushChunk(_chunk, _callback) { const bytes = Buffer.byteLength(_chunk); internals.bytesSeen += bytes; internals.bytes += bytes; - internals.isCaptured && this.emit('progress', internals.bytesSeen); + if (internals.isCaptured) { + internals.updateProgress(); + } - if (this.push(_chunk)) { + if (self.push(_chunk)) { process.nextTick(_callback); } else { internals.onReadCallback = () => { @@ -21863,7 +21305,7 @@ class AxiosTransformStream extends stream__default["default"].Transform{ process.nextTick(_callback); }; } - }; + } const transformChunk = (_chunk, _callback) => { const chunkSize = Buffer.byteLength(_chunk); @@ -21920,6 +21362,11 @@ class AxiosTransformStream extends stream__default["default"].Transform{ } }); } + + setLength(length) { + this[kInternals].length = +length; + return this; + } } const AxiosTransformStream$1 = AxiosTransformStream; @@ -21940,9 +21387,9 @@ const readBlob = async function* (blob) { const readBlob$1 = readBlob; -const BOUNDARY_ALPHABET = platform.ALPHABET.ALPHA_DIGIT + '-_'; +const BOUNDARY_ALPHABET = utils.ALPHABET.ALPHA_DIGIT + '-_'; -const textEncoder = typeof TextEncoder === 'function' ? new TextEncoder() : new util__default["default"].TextEncoder(); +const textEncoder = new util.TextEncoder(); const CRLF = '\r\n'; const CRLF_BYTES = textEncoder.encode(CRLF); @@ -21951,7 +21398,7 @@ const CRLF_BYTES_COUNT = 2; class FormDataPart { constructor(name, value) { const {escapeName} = this.constructor; - const isStringValue = utils$1.isString(value); + const isStringValue = utils.isString(value); let headers = `Content-Disposition: form-data; name="${escapeName(name)}"${ !isStringValue && value.name ? `; filename="${escapeName(value.name)}"` : '' @@ -21978,7 +21425,7 @@ class FormDataPart { const {value} = this; - if(utils$1.isTypedArray(value)) { + if(utils.isTypedArray(value)) { yield value; } else { yield* readBlob$1(value); @@ -22000,10 +21447,10 @@ const formDataToStream = (form, headersHandler, options) => { const { tag = 'form-data-boundary', size = 25, - boundary = tag + '-' + platform.generateString(size, BOUNDARY_ALPHABET) + boundary = tag + '-' + utils.generateString(size, BOUNDARY_ALPHABET) } = options || {}; - if(!utils$1.isFormData(form)) { + if(!utils.isFormData(form)) { throw TypeError('FormData instance required'); } @@ -22023,7 +21470,7 @@ const formDataToStream = (form, headersHandler, options) => { contentLength += boundaryBytes.byteLength * parts.length; - contentLength = utils$1.toFiniteNumber(contentLength); + contentLength = utils.toFiniteNumber(contentLength); const computedHeaders = { 'Content-Type': `multipart/form-data; boundary=${boundary}` @@ -22073,7 +21520,7 @@ class ZlibHeaderTransformStream extends stream__default["default"].Transform { const ZlibHeaderTransformStream$1 = ZlibHeaderTransformStream; const callbackify = (fn, reducer) => { - return utils$1.isAsyncFn(fn) ? function (...args) { + return utils.isAsyncFn(fn) ? function (...args) { const cb = args.pop(); fn.apply(this, args).then((value) => { try { @@ -22087,142 +21534,6 @@ const callbackify = (fn, reducer) => { 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 @@ -22233,7 +21544,7 @@ const brotliOptions = { finishFlush: zlib__default["default"].constants.BROTLI_OPERATION_FLUSH }; -const isBrotliSupported = utils$1.isFunction(zlib__default["default"].createBrotliDecompress); +const isBrotliSupported = utils.isFunction(zlib__default["default"].createBrotliDecompress); const {http: httpFollow, https: httpsFollow} = followRedirects__default["default"]; @@ -22243,14 +21554,6 @@ 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. @@ -22259,12 +21562,12 @@ const flushOnFinish = (stream, [throttled, flush]) => { * * @returns {Object} */ -function dispatchBeforeRedirect(options, responseDetails) { +function dispatchBeforeRedirect(options) { if (options.beforeRedirects.proxy) { options.beforeRedirects.proxy(options); } if (options.beforeRedirects.config) { - options.beforeRedirects.config(options, responseDetails); + options.beforeRedirects.config(options); } } @@ -22280,7 +21583,7 @@ function dispatchBeforeRedirect(options, responseDetails) { function setProxy(options, configProxy, location) { let proxy = configProxy; if (!proxy && proxy !== false) { - const proxyUrl = proxyFromEnv__default["default"].getProxyForUrl(location); + const proxyUrl = proxyFromEnv.getProxyForUrl(location); if (proxyUrl) { proxy = new URL(proxyUrl); } @@ -22321,7 +21624,7 @@ function setProxy(options, configProxy, location) { }; } -const isHttpAdapterSupported = typeof process !== 'undefined' && utils$1.kindOf(process) === 'process'; +const isHttpAdapterSupported = typeof process !== 'undefined' && utils.kindOf(process) === 'process'; // temporary hotfix @@ -22350,18 +21653,6 @@ const wrapAsync = (asyncExecutor) => { }) }; -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) { @@ -22372,24 +21663,19 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) { 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); - }); - }; + if (lookup && utils.isAsyncFn(lookup)) { + lookup = callbackify$1(lookup, (entry) => { + if(utils.isString(entry)) { + entry = [entry, entry.indexOf('.') < 0 ? 6 : 4]; + } else if (!utils.isArray(entry)) { + throw new TypeError('lookup async function must return an array [ip: string, family: number]]') + } + return entry; + }); } // temporary internal emitter until the AxiosRequest class will be implemented - const emitter = new events.EventEmitter(); + const emitter = new EventEmitter__default["default"](); const onFinished = () => { if (config.cancelToken) { @@ -22425,8 +21711,8 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) { } // Parse url - const fullPath = buildFullPath(config.baseURL, config.url, config.allowAbsoluteUrls); - const parsed = new URL(fullPath, platform.hasBrowserEnv ? platform.origin : undefined); + const fullPath = buildFullPath(config.baseURL, config.url); + const parsed = new URL(fullPath, 'http://localhost'); const protocol = parsed.protocol || supportedProtocols[0]; if (protocol === 'data:') { @@ -22453,7 +21739,7 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) { convertedData = convertedData.toString(responseEncoding); if (!responseEncoding || responseEncoding === 'utf8') { - convertedData = utils$1.stripBOM(convertedData); + convertedData = utils.stripBOM(convertedData); } } else if (responseType === 'stream') { convertedData = stream__default["default"].Readable.from(convertedData); @@ -22484,13 +21770,14 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) { // Only set header if it hasn't been set in config headers.set('User-Agent', 'axios/' + VERSION, false); - const {onUploadProgress, onDownloadProgress} = config; + const onDownloadProgress = config.onDownloadProgress; + const onUploadProgress = config.onUploadProgress; const maxRate = config.maxRate; let maxUploadRate = undefined; let maxDownloadRate = undefined; // support for spec compliant FormData objects - if (utils$1.isSpecCompliantForm(data)) { + if (utils.isSpecCompliantForm(data)) { const userBoundary = headers.getContentType(/boundary=([-_\w\d]{10,70})/i); data = formDataToStream$1(data, (formHeaders) => { @@ -22500,7 +21787,7 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) { 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)) { + } else if (utils.isFormData(data) && utils.isFunction(data.getHeaders)) { headers.set(data.getHeaders()); if (!headers.hasContentLength()) { @@ -22511,14 +21798,14 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) { } catch (e) { } } - } else if (utils$1.isBlob(data) || utils$1.isFile(data)) { + } else if (utils.isBlob(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)) { + } else if (data && !utils.isStream(data)) { + if (Buffer.isBuffer(data)) ; else if (utils.isArrayBuffer(data)) { data = Buffer.from(new Uint8Array(data)); - } else if (utils$1.isString(data)) { + } else if (utils.isString(data)) { data = Buffer.from(data, 'utf-8'); } else { return reject(new AxiosError( @@ -22540,9 +21827,9 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) { } } - const contentLength = utils$1.toFiniteNumber(headers.getContentLength()); + const contentLength = utils.toFiniteNumber(headers.getContentLength()); - if (utils$1.isArray(maxRate)) { + if (utils.isArray(maxRate)) { maxUploadRate = maxRate[0]; maxDownloadRate = maxRate[1]; } else { @@ -22550,21 +21837,20 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) { } if (data && (onUploadProgress || maxUploadRate)) { - if (!utils$1.isStream(data)) { + if (!utils.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); + length: contentLength, + maxRate: utils.toFiniteNumber(maxUploadRate) + })], utils.noop); - onUploadProgress && data.on('progress', flushOnFinish( - data, - progressEventDecorator( - contentLength, - progressEventReducer(asyncDecorator(onUploadProgress), false, 3) - ) - )); + onUploadProgress && data.on('progress', progress => { + onUploadProgress(Object.assign(progress, { + upload: true + })); + }); } // HTTP basic authentication @@ -22612,17 +21898,15 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) { auth, protocol, family, + lookup, 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.hostname = parsed.hostname; options.port = parsed.port; setProxy(options, config.proxy, protocol + '//' + parsed.hostname + (parsed.port ? ':' + parsed.port : '') + options.path); } @@ -22663,18 +21947,17 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) { const responseLength = +res.headers['content-length']; - if (onDownloadProgress || maxDownloadRate) { + if (onDownloadProgress) { const transformStream = new AxiosTransformStream$1({ - maxRate: utils$1.toFiniteNumber(maxDownloadRate) + length: utils.toFiniteNumber(responseLength), + maxRate: utils.toFiniteNumber(maxDownloadRate) }); - onDownloadProgress && transformStream.on('progress', flushOnFinish( - transformStream, - progressEventDecorator( - responseLength, - progressEventReducer(asyncDecorator(onDownloadProgress), true, 3) - ) - )); + onDownloadProgress && transformStream.on('progress', progress => { + onDownloadProgress(Object.assign(progress, { + download: true + })); + }); streams.push(transformStream); } @@ -22693,7 +21976,7 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) { delete res.headers['content-encoding']; } - switch ((res.headers['content-encoding'] || '').toLowerCase()) { + switch (res.headers['content-encoding']) { /*eslint default-case:0*/ case 'gzip': case 'x-gzip': @@ -22722,7 +22005,7 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) { } } - responseStream = streams.length > 1 ? stream__default["default"].pipeline(streams, utils$1.noop) : streams[0]; + responseStream = streams.length > 1 ? stream__default["default"].pipeline(streams, utils.noop) : streams[0]; const offListeners = stream__default["default"].finished(responseStream, () => { offListeners(); @@ -22764,7 +22047,7 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) { } const err = new AxiosError( - 'stream has been aborted', + 'maxContentLength size of ' + config.maxContentLength + ' exceeded', AxiosError.ERR_BAD_RESPONSE, config, lastRequest @@ -22784,12 +22067,12 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) { if (responseType !== 'arraybuffer') { responseData = responseData.toString(responseEncoding); if (!responseEncoding || responseEncoding === 'utf8') { - responseData = utils$1.stripBOM(responseData); + responseData = utils.stripBOM(responseData); } } response.data = responseData; } catch (err) { - return reject(AxiosError.from(err, null, config, response.request, response)); + reject(AxiosError.from(err, null, config, response.request, response)); } settle(resolve, reject, response); }); @@ -22826,7 +22109,7 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) { // 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)) { + if (isNaN(timeout)) { reject(new AxiosError( 'error trying to parse `config.timeout` to int', AxiosError.ERR_BAD_OPTION_VALUE, @@ -22861,7 +22144,7 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) { // Send the request - if (utils$1.isStream(data)) { + if (utils.isStream(data)) { let ended = false; let errored = false; @@ -22887,235 +22170,187 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) { }); }; -const isURLSameOrigin = platform.hasStandardBrowserEnv ? ((origin, isMSIE) => (url) => { - url = new URL(url, platform.origin); +const cookies = platform.isStandardBrowserEnv ? - 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; +// Standard browser envs support document.cookie + (function standardBrowserEnv() { + return { + write: function write(name, value, expires, path, domain, secure) { + const cookie = []; + cookie.push(name + '=' + encodeURIComponent(value)); -const cookies = platform.hasStandardBrowserEnv ? + if (utils.isNumber(expires)) { + cookie.push('expires=' + new Date(expires).toGMTString()); + } - // Standard browser envs support document.cookie - { - write(name, value, expires, path, domain, secure) { - const cookie = [name + '=' + encodeURIComponent(value)]; + if (utils.isString(path)) { + cookie.push('path=' + path); + } - utils$1.isNumber(expires) && cookie.push('expires=' + new Date(expires).toGMTString()); + if (utils.isString(domain)) { + cookie.push('domain=' + domain); + } - utils$1.isString(path) && cookie.push('path=' + path); + if (secure === true) { + cookie.push('secure'); + } - utils$1.isString(domain) && cookie.push('domain=' + domain); + document.cookie = cookie.join('; '); + }, - secure === true && cookie.push('secure'); + read: function read(name) { + const match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)')); + return (match ? decodeURIComponent(match[3]) : null); + }, - 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); + remove: function remove(name) { + this.write(name, '', Date.now() - 86400000); } - } - } + }; + })() : - return newConfig; -}; +// Non standard browser env (web workers, react-native) lack needed support. + (function nonStandardBrowserEnv() { + return { + write: function write() {}, + read: function read() { return null; }, + remove: function remove() {} + }; + })(); + +const isURLSameOrigin = platform.isStandardBrowserEnv ? + +// Standard browser envs have full support of the APIs needed to test +// whether the request URL is of the same origin as current location. + (function standardBrowserEnv() { + const msie = /(msie|trident)/i.test(navigator.userAgent); + const urlParsingNode = document.createElement('a'); + let originURL; + + /** + * Parse a URL to discover it's components + * + * @param {String} url The URL to be parsed + * @returns {Object} + */ + function resolveURL(url) { + let href = url; + + if (msie) { + // IE needs attribute set twice to normalize properties + urlParsingNode.setAttribute('href', href); + href = urlParsingNode.href; + } + + urlParsingNode.setAttribute('href', href); + + // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils + return { + href: urlParsingNode.href, + protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '', + host: urlParsingNode.host, + search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '', + hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '', + hostname: urlParsingNode.hostname, + port: urlParsingNode.port, + pathname: (urlParsingNode.pathname.charAt(0) === '/') ? + urlParsingNode.pathname : + '/' + urlParsingNode.pathname + }; + } + + originURL = resolveURL(window.location.href); + + /** + * Determine if a URL shares the same origin as the current location + * + * @param {String} requestURL The URL to test + * @returns {boolean} True if URL shares the same origin, otherwise false + */ + return function isURLSameOrigin(requestURL) { + const parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL; + return (parsed.protocol === originURL.protocol && + parsed.host === originURL.host); + }; + })() : + + // Non standard browser envs (web workers, react-native) lack needed support. + (function nonStandardBrowserEnv() { + return function isURLSameOrigin() { + return true; + }; + })(); + +function progressEventReducer(listener, isDownloadStream) { + let bytesNotified = 0; + const _speedometer = speedometer(50, 250); + + return 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 + }; + + data[isDownloadStream ? 'download' : 'upload'] = true; + + listener(data); + }; +} 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 requestData = config.data; + const requestHeaders = AxiosHeaders$1.from(config.headers).normalize(); + const responseType = config.responseType; let onCanceled; - let uploadThrottled, downloadThrottled; - let flushUpload, flushDownload; - function done() { - flushUpload && flushUpload(); // flush events - flushDownload && flushDownload(); // flush events + if (config.cancelToken) { + config.cancelToken.unsubscribe(onCanceled); + } - _config.cancelToken && _config.cancelToken.unsubscribe(onCanceled); + if (config.signal) { + config.signal.removeEventListener('abort', onCanceled); + } + } - _config.signal && _config.signal.removeEventListener('abort', onCanceled); + if (utils.isFormData(requestData)) { + if (platform.isStandardBrowserEnv || platform.isStandardBrowserWebWorkerEnv) { + requestHeaders.setContentType(false); // Let the browser set it + } else { + requestHeaders.setContentType('multipart/form-data;', false); // mobile/desktop app frameworks + } } let request = new XMLHttpRequest(); - request.open(_config.method.toUpperCase(), _config.url, true); + // HTTP basic authentication + if (config.auth) { + const username = config.auth.username || ''; + const password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : ''; + requestHeaders.set('Authorization', 'Basic ' + btoa(username + ':' + password)); + } + + const fullPath = buildFullPath(config.baseURL, config.url); + + request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true); // Set the request timeout in MS - request.timeout = _config.timeout; + request.timeout = config.timeout; function onloadend() { if (!request) { @@ -23195,10 +22430,10 @@ const xhrAdapter = isXHRAdapterSupported && function (config) { // 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; + 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, @@ -23210,42 +22445,50 @@ const xhrAdapter = isXHRAdapterSupported && function (config) { request = null; }; + // 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.isStandardBrowserEnv) { + // Add xsrf header + const xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) + && config.xsrfCookieName && cookies.read(config.xsrfCookieName); + + if (xsrfValue) { + requestHeaders.set(config.xsrfHeaderName, xsrfValue); + } + } + // 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) { + utils.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; + if (!utils.isUndefined(config.withCredentials)) { + request.withCredentials = !!config.withCredentials; } // Add responseType to request if needed if (responseType && responseType !== 'json') { - request.responseType = _config.responseType; + request.responseType = config.responseType; } // Handle progress if needed - if (onDownloadProgress) { - ([downloadThrottled, flushDownload] = progressEventReducer(onDownloadProgress, true)); - request.addEventListener('progress', downloadThrottled); + if (typeof config.onDownloadProgress === 'function') { + request.addEventListener('progress', progressEventReducer(config.onDownloadProgress, true)); } // 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 (typeof config.onUploadProgress === 'function' && request.upload) { + request.upload.addEventListener('progress', progressEventReducer(config.onUploadProgress)); } - if (_config.cancelToken || _config.signal) { + if (config.cancelToken || config.signal) { // Handle cancellation // eslint-disable-next-line func-names onCanceled = cancel => { @@ -23257,13 +22500,13 @@ const xhrAdapter = isXHRAdapterSupported && function (config) { request = null; }; - _config.cancelToken && _config.cancelToken.subscribe(onCanceled); - if (_config.signal) { - _config.signal.aborted ? onCanceled() : _config.signal.addEventListener('abort', onCanceled); + config.cancelToken && config.cancelToken.subscribe(onCanceled); + if (config.signal) { + config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled); } } - const protocol = parseProtocol(_config.url); + const protocol = parseProtocol(fullPath); if (protocol && platform.protocols.indexOf(protocol) === -1) { reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config)); @@ -23276,364 +22519,13 @@ const xhrAdapter = isXHRAdapterSupported && function (config) { }); }; -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 + xhr: xhrAdapter }; -utils$1.forEach(knownAdapters, (fn, value) => { - if (fn) { +utils.forEach(knownAdapters, (fn, value) => { + if(fn) { try { Object.defineProperty(fn, 'name', {value}); } catch (e) { @@ -23643,58 +22535,40 @@ utils$1.forEach(knownAdapters, (fn, 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]; + adapters = utils.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) { + if((adapter = utils.isString(nameOrAdapter) ? knownAdapters[nameOrAdapter.toLowerCase()] : nameOrAdapter)) { 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') + if (adapter === false) { + throw new AxiosError( + `Adapter ${nameOrAdapter} is not supported by the environment`, + 'ERR_NOT_SUPPORT' ); + } - 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' + throw new Error( + utils.hasOwnProp(knownAdapters, nameOrAdapter) ? + `Adapter '${nameOrAdapter}' is not available in the build` : + `Unknown adapter '${nameOrAdapter}'` ); } + if (!utils.isFunction(adapter)) { + throw new TypeError('adapter is not a function'); + } + return adapter; }, adapters: knownAdapters @@ -23773,6 +22647,107 @@ function dispatchRequest(config) { }); } +const headersToObject = (thing) => thing instanceof AxiosHeaders$1 ? thing.toJSON() : 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, caseless) { + if (utils.isPlainObject(target) && utils.isPlainObject(source)) { + return utils.merge.call({caseless}, target, source); + } else if (utils.isPlainObject(source)) { + return utils.merge({}, source); + } else if (utils.isArray(source)) { + return source.slice(); + } + return source; + } + + // eslint-disable-next-line consistent-return + function mergeDeepProperties(a, b, caseless) { + if (!utils.isUndefined(b)) { + return getMergedValue(a, b, caseless); + } else if (!utils.isUndefined(a)) { + return getMergedValue(undefined, a, caseless); + } + } + + // eslint-disable-next-line consistent-return + function valueFromConfig2(a, b) { + if (!utils.isUndefined(b)) { + return getMergedValue(undefined, b); + } + } + + // eslint-disable-next-line consistent-return + function defaultToConfig2(a, b) { + if (!utils.isUndefined(b)) { + return getMergedValue(undefined, b); + } else if (!utils.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, + 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) => mergeDeepProperties(headersToObject(a), headersToObject(b), true) + }; + + utils.forEach(Object.keys(Object.assign({}, config1, config2)), function computeConfigValue(prop) { + const merge = mergeMap[prop] || mergeDeepProperties; + const configValue = merge(config1[prop], config2[prop], prop); + (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue); + }); + + return config; +} + const validators$1 = {}; // eslint-disable-next-line func-names @@ -23822,14 +22797,6 @@ validators$1.transitional = function transitional(validator, version, message) { }; }; -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 * @@ -23894,34 +22861,7 @@ class Axios { * * @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) { + request(configOrUrl, config) { /*eslint no-param-reassign:0*/ // Allow for axios('example/url'[, config]) a la fetch API if (typeof configOrUrl === 'string') { @@ -23944,7 +22884,7 @@ class Axios { } if (paramsSerializer != null) { - if (utils$1.isFunction(paramsSerializer)) { + if (utils.isFunction(paramsSerializer)) { config.paramsSerializer = { serialize: paramsSerializer }; @@ -23956,28 +22896,18 @@ class Axios { } } - // 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(); + let contextHeaders; + // Flatten headers - let contextHeaders = headers && utils$1.merge( + contextHeaders = headers && utils.merge( headers.common, headers[config.method] ); - headers && utils$1.forEach( + contextHeaders && utils.forEach( ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'], (method) => { delete headers[method]; @@ -24058,13 +22988,13 @@ class Axios { getUri(config) { config = mergeConfig(this.defaults, config); - const fullPath = buildFullPath(config.baseURL, config.url, config.allowAbsoluteUrls); + const fullPath = buildFullPath(config.baseURL, config.url); return buildURL(fullPath, config.params, config.paramsSerializer); } } // Provide aliases for supported request methods -utils$1.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) { +utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) { /*eslint func-names:0*/ Axios.prototype[method] = function(url, config) { return this.request(mergeConfig(config || {}, { @@ -24075,7 +23005,7 @@ utils$1.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoDa }; }); -utils$1.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { +utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { /*eslint func-names:0*/ function generateHTTPMethod(isForm) { @@ -24198,20 +23128,6 @@ class CancelToken { } } - 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`. @@ -24265,7 +23181,7 @@ function spread(callback) { * @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); + return utils.isObject(payload) && (payload.isAxiosError === true); } const HttpStatusCode = { @@ -24352,10 +23268,10 @@ function createInstance(defaultConfig) { const instance = bind(Axios$1.prototype.request, context); // Copy axios.prototype to instance - utils$1.extend(instance, Axios$1.prototype, context, {allOwnKeys: true}); + utils.extend(instance, Axios$1.prototype, context, {allOwnKeys: true}); // Copy context to instance - utils$1.extend(instance, context, null, {allOwnKeys: true}); + utils.extend(instance, context, null, {allOwnKeys: true}); // Factory for creating new instances instance.create = function create(instanceConfig) { @@ -24399,9 +23315,7 @@ axios.mergeConfig = mergeConfig; axios.AxiosHeaders = AxiosHeaders$1; -axios.formToJSON = thing => formDataToJSON(utils$1.isHTMLForm(thing) ? new FormData(thing) : thing); - -axios.getAdapter = adapters.getAdapter; +axios.formToJSON = thing => formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing); axios.HttpStatusCode = HttpStatusCode$1; @@ -24417,7 +23331,7 @@ module.exports = axios; /***/ ((module) => { "use strict"; -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"}}'); +module.exports = JSON.parse('{"name":"@lampajr/bper","version":"3.1.1","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","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"},"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","@gitbeaker/rest":"^39.1.0","@kie/mock-github":"^1.1.0","@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.0.0","jest-sonar-reporter":"^2.0.0","release-it":"^15.6.0","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","@octokit/webhooks-types":"^6.8.0"},"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"}}'); /***/ }), diff --git a/dist/gha/index.js b/dist/gha/index.js index b477378..dfe5967 100755 --- a/dist/gha/index.js +++ b/dist/gha/index.js @@ -39,21 +39,16 @@ class ArgsParser { } 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"); + if (!args.pullRequest || !args.targetBranch) { + throw new Error("Missing option: pull request and target branch 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), @@ -63,15 +58,6 @@ class ArgsParser { 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), }; } } @@ -109,7 +95,7 @@ var __importStar = (this && this.__importStar) || function (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; +exports.readConfigFile = exports.parseArgs = void 0; const fs = __importStar(__nccwpck_require__(7147)); /** * Parse the input configuation string as json object and @@ -131,40 +117,6 @@ function readConfigFile(pathToFile) { 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; /***/ }), @@ -182,39 +134,46 @@ 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 { + /** + * 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; + } + getAsCommaSeparatedList(key) { + // trim the value + const value = ((0, core_1.getInput)(key) ?? "").trim(); + return value !== "" ? value.replace(/\s/g, "").split(",") : undefined; + } + getAsBooleanOrDefault(key) { + const value = (0, core_1.getInput)(key).trim(); + return value !== "" ? value.toLowerCase() === "true" : undefined; + } readArgs() { - const configFile = (0, args_utils_1.getOrUndefined)((0, core_1.getInput)("config-file")); + const configFile = this.getOrUndefined("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")), + dryRun: this.getAsBooleanOrDefault("dry-run"), + auth: this.getOrUndefined("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")), + targetBranch: (0, core_1.getInput)("target-branch"), + folder: this.getOrUndefined("folder"), + gitUser: this.getOrUndefined("git-user"), + gitEmail: this.getOrUndefined("git-email"), + title: this.getOrUndefined("title"), + body: this.getOrUndefined("body"), + bodyPrefix: this.getOrUndefined("body-prefix"), + bpBranchName: this.getOrUndefined("bp-branch-name"), + reviewers: this.getAsCommaSeparatedList("reviewers"), + assignees: this.getAsCommaSeparatedList("assignees"), + inheritReviewers: !this.getAsBooleanOrDefault("no-inherit-reviewers"), }; } return args; @@ -248,11 +207,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 throw an error + // if PR is closed and not merged log a warning 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); } @@ -260,30 +219,6 @@ 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: @@ -295,9 +230,7 @@ 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 configs_types_1 = __nccwpck_require__(4753); const git_client_factory_1 = __importDefault(__nccwpck_require__(8550)); class PullRequestConfigsParser extends configs_parser_1.default { constructor() { @@ -306,81 +239,30 @@ class PullRequestConfigsParser extends configs_parser_1.default { } async parse(args) { let pr; - if (args.autoNoSquash) { - args.squash = undefined; - } try { - pr = await this.gitClient.getPullRequestFromUrl(args.pullRequest, args.squash); + pr = await this.gitClient.getPullRequestFromUrl(args.pullRequest); } 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, folder: `${folder.startsWith("/") ? "" : process.cwd() + "/"}${args.folder ?? this.getDefaultFolder()}`, - mergeStrategy: args.strategy, - mergeStrategyOption: args.strategyOption, - cherryPickOptions: args.cherryPickOptions, + targetBranch: args.targetBranch, originalPullRequest: pr, - backportPullRequests: this.generateBackportPullRequestsData(pr, args, targetBranches, bpBranchNames), + backportPullRequest: this.getDefaultBackportPullRequest(pr, args), 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 @@ -388,7 +270,7 @@ class PullRequestConfigsParser extends configs_parser_1.default { * @param targetBranch target branch where the backport should be applied * @returns {GitPullRequest} */ - generateBackportPullRequestsData(originalPullRequest, args, targetBranches, bpBranchNames) { + getDefaultBackportPullRequest(originalPullRequest, args) { const reviewers = args.reviewers ?? []; if (reviewers.length == 0 && args.inheritReviewers) { // inherit only if args.reviewers is empty and args.inheritReviewers set to true @@ -398,42 +280,17 @@ class PullRequestConfigsParser extends configs_parser_1.default { } } const bodyPrefix = args.bodyPrefix ?? `**Backport:** ${originalPullRequest.htmlUrl}\r\n\r\n`; - 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")) ?? [], - }; - }); + const body = args.body ?? `${originalPullRequest.body}`; + return { + author: args.gitUser ?? this.gitClient.getDefaultGitUser(), + title: args.title ?? `[${args.targetBranch}] ${originalPullRequest.title}`, + body: `${bodyPrefix}${body}`, + reviewers: [...new Set(reviewers)], + assignees: [...new Set(args.assignees)], + targetRepo: originalPullRequest.targetRepo, + sourceRepo: originalPullRequest.targetRepo, + branchName: args.bpBranchName, + }; } } exports["default"] = PullRequestConfigsParser; @@ -474,12 +331,11 @@ class GitCLIService { } /** * Update the provided remote URL by adding the auth token if not empty - * @param remoteURL remote link, e.g., https://github.com/kiegroup/git-backporting-example.git + * @param remoteURL remote link, e.g., https://github.com/lampajr/backporting-example.git */ remoteWithAuth(remoteURL) { - if (this.auth) { - // Anything will work as a username. - return remoteURL.replace("://", `://token:${this.auth}@`); + if (this.auth && this.gitData.user) { + return remoteURL.replace("://", `://${this.gitData.user}:${this.auth}@`); } // return remote as it is return remoteURL; @@ -500,22 +356,13 @@ 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; } - 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"]); + else { + this.logger.warn(`Folder ${to} already exist. Won't clone`); } - // 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 @@ -523,7 +370,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); } /** @@ -533,7 +380,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)); } /** @@ -543,7 +390,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"]); } /** @@ -551,38 +398,9 @@ class GitCLIService { * @param cwd repository in which the sha should be cherry picked to * @param sha commit 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; + 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]); } /** * Push a branch to a remote @@ -591,7 +409,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"); @@ -621,10 +439,9 @@ const gitlab_client_1 = __importDefault(__nccwpck_require__(4077)); * Singleton git service factory class */ 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"); + throw new Error("You must call `getOrCreate` method first!"); } return GitClientFactory.instance; } @@ -635,7 +452,7 @@ class GitClientFactory { */ static getOrCreate(type, authToken, apiUrl) { if (GitClientFactory.instance) { - GitClientFactory.logger.warn("Git service already initialized"); + GitClientFactory.logger.warn("Git service already initialized!"); return GitClientFactory.instance; } this.logger.debug(`Setting up ${type} client: apiUrl=${apiUrl}, token=****`); @@ -646,17 +463,13 @@ class GitClientFactory { 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.logger.warn("Resetting git service!"); GitClientFactory.instance = undefined; } } @@ -667,18 +480,13 @@ GitClientFactory.logger = logger_service_factory_1.default.getLogger(); /***/ }), /***/ 9080: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { +/***/ ((__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)); +exports.inferGitApiUrl = exports.inferGitClient = void 0; 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"; /** @@ -695,9 +503,6 @@ const inferGitClient = (prUrl) => { 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; @@ -710,74 +515,12 @@ exports.inferGitClient = inferGitClient; 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)) { + if (baseUrl.includes(PUBLIC_GITHUB_URL)) { 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; /***/ }), @@ -793,7 +536,6 @@ var GitClientType; (function (GitClientType) { GitClientType["GITHUB"] = "github"; GitClientType["GITLAB"] = "gitlab"; - GitClientType["CODEBERG"] = "codeberg"; })(GitClientType = exports.GitClientType || (exports.GitClientType = {})); var GitRepoState; (function (GitRepoState) { @@ -815,80 +557,39 @@ 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 GitHubClient { - constructor(token, apiUrl, isForCodeberg = false) { + constructor(token, apiUrl) { this.apiUrl = apiUrl; - this.isForCodeberg = isForCodeberg; this.logger = logger_service_factory_1.default.getLogger(); 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 getDefaultGitUser() { - return this.apiUrl.includes(git_types_1.GitClientType.CODEBERG.toString()) ? "Codeberg" : "GitHub"; + return "GitHub"; } getDefaultGitEmail() { return "noreply@github.com"; } - async getPullRequest(owner, repo, prNumber, squash) { - this.logger.debug(`Fetching pull request ${owner}/${repo}/${prNumber}`); + async getPullRequest(owner, repo, prNumber) { + this.logger.info(`Getting pull request ${owner}/${repo}/${prNumber}.`); const { data } = await this.octokit.rest.pulls.get({ owner: owner, repo: repo, - pull_number: prNumber, + pull_number: prNumber }); - 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); + return this.mapper.mapPullRequest(data); } - async getPullRequestFromUrl(prUrl, squash) { + async getPullRequestFromUrl(prUrl) { const { owner, project, id } = this.extractPullRequestData(prUrl); - return this.getPullRequest(owner, project, id, squash); + return this.getPullRequest(owner, project, id); } // 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, @@ -896,68 +597,38 @@ class GitHubClient { 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) { - 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}`))); + try { + await 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({ + try { + await this.octokit.issues.addAssignees({ owner: backport.owner, repo: backport.repo, 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"); + assignees: backport.assignees, + }); + } + catch (error) { + this.logger.error(`Error setting assignees: ${error}`); } - commentUrl = data.url; } - catch (error) { - this.logger.error(`Error creating comment on pull request ${prUrl}: ${error}`); - } - return commentUrl; + return data.html_url; } // UTILS /** @@ -995,7 +666,7 @@ class GitHubMapper { return git_types_1.GitRepoState.CLOSED; } } - async mapPullRequest(pr, commits) { + async mapPullRequest(pr) { return { number: pr.number, author: pr.user.login, @@ -1006,20 +677,15 @@ class GitHubMapper { 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) ?? [], + reviewers: pr.requested_reviewers.filter(r => "login" in r).map((r => r?.login)), + assignees: pr.assignees.filter(r => "login" in r).map(r => r.login), 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), + // if pr is open use latest commit sha otherwise use merge_commit_sha + commits: pr.state === "open" ? [pr.head.sha] : [pr.merge_commit_sha] }; } - 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], @@ -1057,9 +723,10 @@ const rest_1 = __nccwpck_require__(5375); class OctokitFactory { static getOctokit(token, apiUrl) { if (!OctokitFactory.octokit) { + OctokitFactory.logger.info("Creating octokit instance."); OctokitFactory.octokit = new rest_1.Octokit({ auth: token, - userAgent: "kiegroup/git-backporting", + userAgent: "lampajr/backporting", baseUrl: apiUrl }); } @@ -1081,8 +748,6 @@ 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)); @@ -1095,7 +760,7 @@ class GitLabClient { baseURL: this.apiUrl, headers: { Authorization: token ? `Bearer ${token}` : "", - "User-Agent": "kiegroup/git-backporting", + "User-Agent": "lampajr/backporting", }, httpsAgent: new https_1.default.Agent({ rejectUnauthorized @@ -1103,9 +768,6 @@ class GitLabClient { }); this.mapper = new gitlab_mapper_1.default(this.client); } - getClientType() { - return git_types_1.GitClientType.GITLAB; - } getDefaultGitUser() { return "Gitlab"; } @@ -1113,36 +775,19 @@ class GitLabClient { return "noreply@gitlab.com"; } // READ - // example: /api/v4/projects/%2Fbackporting-example/merge_requests/1 - async getPullRequest(namespace, repo, mrNumber, squash) { + // example: /api/v4/projects/alampare%2Fbackporting-example/merge_requests/1 + async getPullRequest(namespace, repo, mrNumber) { 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); + const { data } = await this.client.get(`/projects/${projectId}/merge_requests/${mrNumber}`); + return this.mapper.mapPullRequest(data); } - getPullRequestFromUrl(mrUrl, squash) { + getPullRequestFromUrl(mrUrl) { const { namespace, project, id } = this.extractMergeRequestData(mrUrl); - return this.getPullRequest(namespace, project, id, squash); + return this.getPullRequest(namespace, project, id); } // 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 projectId = this.getProjectId(backport.owner, backport.repo); const { data } = await this.client.post(`/projects/${projectId}/merge_requests`, { @@ -1154,73 +799,54 @@ class GitLabClient { 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(() => { + const reviewerIds = []; + for (const r of backport.reviewers) { + try { + this.logger.debug("Retrieving user: " + r); + const user = await this.getUser(r); + reviewerIds.push(user.id); + } + catch (error) { 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}`); + if (reviewerIds.length > 0) { + try { + this.logger.info("Setting reviewers: " + reviewerIds); + await 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); + } } - return commentUrl; + // assignees + const assigneeIds = []; + for (const a of backport.assignees) { + try { + this.logger.debug("Retrieving user: " + a); + const user = await this.getUser(a); + assigneeIds.push(user.id); + } + catch (error) { + this.logger.warn(`Failed to retrieve assignee ${a}`); + } + } + if (assigneeIds.length > 0) { + try { + this.logger.info("Setting assignees: " + assigneeIds); + await 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); + } + } + return mr.web_url; } - // UTILS /** * Retrieve a gitlab user given its username * @param username @@ -1239,21 +865,15 @@ class GitLabClient { } /** * Extract repository namespace, project and mr number from the merge request url - * example: //backporting-example/-/merge_requests/1 + * example: /alampare/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); + const elems = mrUrl.replace("/-/", "/").split("/"); return { - namespace: namespace, + namespace: elems[elems.length - 4], project: elems[elems.length - 3], id: parseInt(mrUrl.substring(mrUrl.lastIndexOf("/") + 1, mrUrl.length)), }; @@ -1292,7 +912,8 @@ class GitLabMapper { return git_types_1.GitRepoState.LOCKED; } } - async mapPullRequest(mr, commits) { + async mapPullRequest(mr) { + // throw new Error("Method not implemented."); return { number: mr.iid, author: mr.author.username, @@ -1305,19 +926,14 @@ class GitLabMapper { 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) + nCommits: 1, + // if mr is merged, use merge_commit_sha otherwise use sha + // what is the difference between sha and diff_refs.head_sha? + commits: this.isMerged(mr) ? [mr.squash_commit_sha ? mr.squash_commit_sha : mr.merge_commit_sha] : [mr.sha] }; } - 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 { @@ -1365,34 +981,22 @@ class ConsoleLoggerService { 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", this.fromContext(message)); + this.logger.log("[TRACE]", message); } debug(message) { if (this.verbose) { - this.logger.log("DEBUG", this.fromContext(message)); + this.logger.log("[DEBUG]", message); } } info(message) { - this.logger.log("INFO", this.fromContext(message)); + this.logger.log("[INFO]", message); } warn(message) { - this.logger.log("WARN", this.fromContext(message)); + this.logger.log("[WARN]", message); } error(message) { - this.logger.log("ERROR", this.fromContext(message)); - } - fromContext(msg) { - return this.context ? `[${this.context}] ${msg}` : msg; + this.logger.log("[ERROR]", message); } } exports["default"] = ConsoleLoggerService; @@ -1438,7 +1042,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); class Logger { log(prefix, ...str) { // eslint-disable-next-line no-console - console.log.apply(console, [`[${prefix.padEnd(5)}]`, ...str]); + console.log.apply(console, [prefix, ...str]); } emptyLine() { this.log("", ""); @@ -1447,39 +1051,6 @@ 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: @@ -1497,7 +1068,6 @@ 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 */ @@ -1512,12 +1082,12 @@ class Runner { async run() { 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); } } @@ -1528,105 +1098,60 @@ 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 - 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); + const gitClientType = (0, git_util_1.inferGitClient)(args.pullRequest); + // right now the apiVersion is set to v4 + const apiUrl = (0, git_util_1.inferGitApiUrl)(args.pullRequest); + const gitApi = git_client_factory_1.default.getOrCreate(gitClientType, args.auth, 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 backportPRs = configs.backportPullRequests; + const originalPR = configs.originalPullRequest; + const backportPR = configs.backportPullRequest; // start local git operations 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 this.logger.debug("Cloning repo.."); - await git.gitCli.clone(configs.originalPullRequest.targetRepo.cloneUrl, configs.folder, backportPR.base); + await git.clone(configs.originalPullRequest.targetRepo.cloneUrl, configs.folder, configs.targetBranch); // 5. create new branch from target one and checkout this.logger.debug("Creating local branch.."); - await git.gitCli.createLocalBranch(configs.folder, backportPR.head); + const backportBranch = backportPR.branchName ?? `bp-${configs.targetBranch}-${originalPR.commits.join("-")}`; + await git.createLocalBranch(configs.folder, backportBranch); // 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") { 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}`); + const prefix = gitClientType === git_types_1.GitClientType.GITHUB ? "pull" : "merge-requests"; // default is for gitlab + await git.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.gitCli.cherryPick(configs.folder, sha, configs.mergeStrategy, configs.mergeStrategyOption, configs.cherryPickOptions); + await git.cherryPick(configs.folder, sha); } + const backport = { + owner: originalPR.targetRepo.owner, + repo: originalPR.targetRepo.project, + head: backportBranch, + base: configs.targetBranch, + title: backportPR.title, + body: backportPR.body, + reviewers: backportPR.reviewers, + assignees: backportPR.assignees, + }; if (!configs.dryRun) { // 8. push the new branch to origin - await git.gitCli.push(configs.folder, backportPR.head); + await git.push(configs.folder, backportBranch); // 9. create pull request new branch -> target branch (using octokit) - const prUrl = await git.gitClientApi.createPullRequest(backportPR); + const prUrl = await gitApi.createPullRequest(backport); this.logger.info(`Pull request created: ${prUrl}`); } else { - this.logger.warn("Pull request creation and remote push skipped"); - this.logger.info(`${JSON.stringify(backportPR, null, 2)}`); + this.logger.warn("Pull request creation and remote push skipped!"); + this.logger.info(`${JSON.stringify(backport, null, 2)}`); } - this.logger.clearContext(); } } exports["default"] = Runner; @@ -7822,30 +7347,6 @@ 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); @@ -7855,20 +7356,19 @@ events.forEach(function (event) { }; }); -// Error types with codes var InvalidUrlError = createErrorType( "ERR_INVALID_URL", "Invalid URL", TypeError ); +// Error types with codes var RedirectionError = createErrorType( "ERR_FR_REDIRECTION_FAILURE", "Redirected request failed" ); var TooManyRedirectsError = createErrorType( "ERR_FR_TOO_MANY_REDIRECTS", - "Maximum number of redirects exceeded", - RedirectionError + "Maximum number of redirects exceeded" ); var MaxBodyLengthExceededError = createErrorType( "ERR_FR_MAX_BODY_LENGTH_EXCEEDED", @@ -7879,9 +7379,6 @@ var WriteAfterEndError = createErrorType( "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 @@ -7903,13 +7400,7 @@ function RedirectableRequest(options, 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 })); - } + self._processResponse(response); }; // Perform the first request @@ -7918,17 +7409,10 @@ function RedirectableRequest(options, responseCallback) { RedirectableRequest.prototype = Object.create(Writable.prototype); RedirectableRequest.prototype.abort = function () { - destroyRequest(this._currentRequest); - this._currentRequest.abort(); + abortRequest(this._currentRequest); 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 @@ -8041,7 +7525,6 @@ RedirectableRequest.prototype.setTimeout = function (msecs, callback) { self.removeListener("abort", clearTimer); self.removeListener("error", clearTimer); self.removeListener("response", clearTimer); - self.removeListener("close", clearTimer); if (callback) { self.removeListener("timeout", callback); } @@ -8068,7 +7551,6 @@ RedirectableRequest.prototype.setTimeout = function (msecs, callback) { this.on("abort", clearTimer); this.on("error", clearTimer); this.on("response", clearTimer); - this.on("close", clearTimer); return this; }; @@ -8127,7 +7609,8 @@ RedirectableRequest.prototype._performRequest = function () { var protocol = this._options.protocol; var nativeProtocol = this._options.nativeProtocols[protocol]; if (!nativeProtocol) { - throw new TypeError("Unsupported protocol " + protocol); + this.emit("error", new TypeError("Unsupported protocol " + protocol)); + return; } // If specified, use the agent corresponding to the protocol @@ -8219,14 +7702,15 @@ RedirectableRequest.prototype._processResponse = function (response) { } // The response is a redirect, so abort the current request - destroyRequest(this._currentRequest); + abortRequest(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(); + this.emit("error", new TooManyRedirectsError()); + return; } // Store the request headers if applicable @@ -8260,24 +7744,34 @@ RedirectableRequest.prototype._processResponse = function (response) { 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 currentUrlParts = url.parse(this._currentUrl); var currentHost = currentHostHeader || currentUrlParts.host; var currentUrl = /^\w+:/.test(location) ? this._currentUrl : url.format(Object.assign(currentUrlParts, { host: currentHost })); + // Determine the URL of the redirection + var redirectUrl; + try { + redirectUrl = url.resolve(currentUrl, location); + } + catch (cause) { + this.emit("error", new RedirectionError({ cause: cause })); + return; + } + // Create the redirected request - var redirectUrl = resolveUrl(location, currentUrl); - debug("redirecting to", redirectUrl.href); + debug("redirecting to", redirectUrl); this._isRedirect = true; - spreadUrlObject(redirectUrl, this._options); + var redirectUrlParts = url.parse(redirectUrl); + Object.assign(this._options, redirectUrlParts); // 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); + if (redirectUrlParts.protocol !== currentUrlParts.protocol && + redirectUrlParts.protocol !== "https:" || + redirectUrlParts.host !== currentHost && + !isSubdomain(redirectUrlParts.host, currentHost)) { + removeMatchingHeaders(/^(?:authorization|cookie)$/i, this._options.headers); } // Evaluate the beforeRedirect callback @@ -8291,12 +7785,23 @@ RedirectableRequest.prototype._processResponse = function (response) { method: method, headers: requestHeaders, }; - beforeRedirect(this._options, responseDetails, requestDetails); + try { + beforeRedirect(this._options, responseDetails, requestDetails); + } + catch (err) { + this.emit("error", err); + return; + } this._sanitizeOptions(this._options); } // Perform the redirected request - this._performRequest(); + try { + this._performRequest(); + } + catch (cause) { + this.emit("error", new RedirectionError({ cause: cause })); + } }; // Wraps the key/value object of protocols with redirect functionality @@ -8316,16 +7821,27 @@ function wrap(protocols) { // Executes a request, following redirects function request(input, options, callback) { - // Parse parameters, ensuring that input is an object - if (isURL(input)) { - input = spreadUrlObject(input); + // Parse parameters + if (isString(input)) { + var parsed; + try { + parsed = urlToOptions(new URL(input)); + } + catch (err) { + /* istanbul ignore next */ + parsed = url.parse(input); + } + if (!isString(parsed.protocol)) { + throw new InvalidUrlError({ input }); + } + input = parsed; } - else if (isString(input)) { - input = spreadUrlObject(parseUrl(input)); + else if (URL && (input instanceof URL)) { + input = urlToOptions(input); } else { callback = options; - options = validateUrl(input); + options = input; input = { protocol: protocol }; } if (isFunction(options)) { @@ -8364,57 +7880,27 @@ function wrap(protocols) { return exports; } +/* istanbul ignore next */ function noop() { /* empty */ } -function parseUrl(input) { - var parsed; - /* istanbul ignore else */ - if (useNativeURL) { - parsed = new URL(input); +// from https://github.com/nodejs/node/blob/master/lib/internal/url.js +function urlToOptions(urlObject) { + var options = { + protocol: urlObject.protocol, + hostname: urlObject.hostname.startsWith("[") ? + /* istanbul ignore next */ + urlObject.hostname.slice(1, -1) : + urlObject.hostname, + hash: urlObject.hash, + search: urlObject.search, + pathname: urlObject.pathname, + path: urlObject.pathname + urlObject.search, + href: urlObject.href, + }; + if (urlObject.port !== "") { + options.port = Number(urlObject.port); } - 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; + return options; } function removeMatchingHeaders(regex, headers) { @@ -8440,25 +7926,17 @@ function createErrorType(code, message, baseClass) { // 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, - }, - }); + CustomError.prototype.constructor = CustomError; + CustomError.prototype.name = "Error [" + code + "]"; return CustomError; } -function destroyRequest(request, error) { +function abortRequest(request) { for (var event of events) { request.removeListener(event, eventHandlers[event]); } request.on("error", noop); - request.destroy(error); + request.abort(); } function isSubdomain(subdomain, domain) { @@ -8479,10 +7957,6 @@ 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; @@ -19044,11 +18518,10 @@ module.exports = require("zlib"); /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { "use strict"; -/*! Axios v1.8.4 Copyright (c) 2025 Matt Zabriskie and contributors */ +// Axios v1.4.0 Copyright (c) 2023 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); @@ -19057,20 +18530,19 @@ 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); +const EventEmitter = __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); +const EventEmitter__default = /*#__PURE__*/_interopDefaultLegacy(EventEmitter); function bind(fn, thisArg) { return function wrap() { @@ -19285,8 +18757,6 @@ const isFormData = (thing) => { */ 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 * @@ -19618,9 +19088,8 @@ const reduceDescriptors = (obj, reducer) => { const reducedDescriptors = {}; forEach(descriptors, (descriptor, name) => { - let ret; - if ((ret = reducer(descriptor, name, obj)) !== false) { - reducedDescriptors[name] = ret || descriptor; + if (reducer(descriptor, name, obj) !== false) { + reducedDescriptors[name] = descriptor; } }); @@ -19675,7 +19144,28 @@ const toObjectSet = (arrayOrString, delimiter) => { const noop = () => {}; const toFiniteNumber = (value, defaultValue) => { - return value != null && Number.isFinite(value = +value) ? value : defaultValue; + value = +value; + return Number.isFinite(value) ? value : defaultValue; +}; + +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; + while (size--) { + str += alphabet[Math.random() * length|0]; + } + + return str; }; /** @@ -19725,37 +19215,7 @@ 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 = { +const utils = { isArray, isArrayBuffer, isBuffer, @@ -19766,10 +19226,6 @@ const utils$1 = { isBoolean, isObject, isPlainObject, - isReadableStream, - isRequest, - isResponse, - isHeaders, isUndefined, isDate, isFile, @@ -19805,12 +19261,12 @@ const utils$1 = { findKey, global: _global, isContextDefined, + ALPHABET, + generateString, isSpecCompliantForm, toJSONObject, isAsyncFn, - isThenable, - setImmediate: _setImmediate, - asap + isThenable }; /** @@ -19838,13 +19294,10 @@ function AxiosError(message, code, config, request, response) { code && (this.code = code); config && (this.config = config); request && (this.request = request); - if (response) { - this.response = response; - this.status = response.status ? response.status : null; - } + response && (this.response = response); } -utils$1.inherits(AxiosError, Error, { +utils.inherits(AxiosError, Error, { toJSON: function toJSON() { return { // Standard @@ -19859,9 +19312,9 @@ utils$1.inherits(AxiosError, Error, { columnNumber: this.columnNumber, stack: this.stack, // Axios - config: utils$1.toJSONObject(this.config), + config: utils.toJSONObject(this.config), code: this.code, - status: this.status + status: this.response && this.response.status ? this.response.status : null }; } }); @@ -19894,7 +19347,7 @@ Object.defineProperty(prototype$1, 'isAxiosError', {value: true}); AxiosError.from = (error, code, config, request, response, customProps) => { const axiosError = Object.create(prototype$1); - utils$1.toFlatObject(error, axiosError, function filter(obj) { + utils.toFlatObject(error, axiosError, function filter(obj) { return obj !== Error.prototype; }, prop => { return prop !== 'isAxiosError'; @@ -19919,7 +19372,7 @@ AxiosError.from = (error, code, config, request, response, customProps) => { * @returns {boolean} */ function isVisitable(thing) { - return utils$1.isPlainObject(thing) || utils$1.isArray(thing); + return utils.isPlainObject(thing) || utils.isArray(thing); } /** @@ -19930,7 +19383,7 @@ function isVisitable(thing) { * @returns {string} the key without the brackets. */ function removeBrackets(key) { - return utils$1.endsWith(key, '[]') ? key.slice(0, -2) : key; + return utils.endsWith(key, '[]') ? key.slice(0, -2) : key; } /** @@ -19959,10 +19412,10 @@ function renderKey(path, key, dots) { * @returns {boolean} */ function isFlatArray(arr) { - return utils$1.isArray(arr) && !arr.some(isVisitable); + return utils.isArray(arr) && !arr.some(isVisitable); } -const predicates = utils$1.toFlatObject(utils$1, {}, null, function filter(prop) { +const predicates = utils.toFlatObject(utils, {}, null, function filter(prop) { return /^is[A-Z]/.test(prop); }); @@ -19990,7 +19443,7 @@ const predicates = utils$1.toFlatObject(utils$1, {}, null, function filter(prop) * @returns */ function toFormData(obj, formData, options) { - if (!utils$1.isObject(obj)) { + if (!utils.isObject(obj)) { throw new TypeError('target must be an object'); } @@ -19998,13 +19451,13 @@ function toFormData(obj, formData, options) { formData = formData || new (FormData__default["default"] || FormData)(); // eslint-disable-next-line no-param-reassign - options = utils$1.toFlatObject(options, { + options = utils.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]); + return !utils.isUndefined(source[option]); }); const metaTokens = options.metaTokens; @@ -20013,24 +19466,24 @@ function toFormData(obj, formData, options) { const dots = options.dots; const indexes = options.indexes; const _Blob = options.Blob || typeof Blob !== 'undefined' && Blob; - const useBlob = _Blob && utils$1.isSpecCompliantForm(formData); + const useBlob = _Blob && utils.isSpecCompliantForm(formData); - if (!utils$1.isFunction(visitor)) { + if (!utils.isFunction(visitor)) { throw new TypeError('visitor must be a function'); } function convertValue(value) { if (value === null) return ''; - if (utils$1.isDate(value)) { + if (utils.isDate(value)) { return value.toISOString(); } - if (!useBlob && utils$1.isBlob(value)) { + if (!useBlob && utils.isBlob(value)) { throw new AxiosError('Blob is not supported. Use a Buffer instead.'); } - if (utils$1.isArrayBuffer(value) || utils$1.isTypedArray(value)) { + if (utils.isArrayBuffer(value) || utils.isTypedArray(value)) { return useBlob && typeof Blob === 'function' ? new Blob([value]) : Buffer.from(value); } @@ -20051,20 +19504,20 @@ function toFormData(obj, formData, options) { let arr = value; if (value && !path && typeof value === 'object') { - if (utils$1.endsWith(key, '{}')) { + if (utils.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)) + (utils.isArray(value) && isFlatArray(value)) || + ((utils.isFileList(value) || utils.endsWith(key, '[]')) && (arr = utils.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( + !(utils.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) @@ -20092,7 +19545,7 @@ function toFormData(obj, formData, options) { }); function build(value, path) { - if (utils$1.isUndefined(value)) return; + if (utils.isUndefined(value)) return; if (stack.indexOf(value) !== -1) { throw Error('Circular reference detected in ' + path.join('.')); @@ -20100,9 +19553,9 @@ function toFormData(obj, formData, options) { 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 + utils.forEach(value, function each(el, key) { + const result = !(utils.isUndefined(el) || el === null) && visitor.call( + formData, el, utils.isString(key) ? key.trim() : key, path, exposedHelpers ); if (result === true) { @@ -20113,7 +19566,7 @@ function toFormData(obj, formData, options) { stack.pop(); } - if (!utils$1.isObject(obj)) { + if (!utils.isObject(obj)) { throw new TypeError('data must be an object'); } @@ -20198,7 +19651,7 @@ function encode(val) { * * @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 + * @param {?object} options * * @returns {string} The formatted url */ @@ -20210,12 +19663,6 @@ function buildURL(url, params, options) { const _encode = options && options.encode || encode; - if (utils$1.isFunction(options)) { - options = { - serialize: options - }; - } - const serializeFn = options && options.serialize; let serializedParams; @@ -20223,7 +19670,7 @@ function buildURL(url, params, options) { if (serializeFn) { serializedParams = serializeFn(params, options); } else { - serializedParams = utils$1.isURLSearchParams(params) ? + serializedParams = utils.isURLSearchParams(params) ? params.toString() : new AxiosURLSearchParams(params, options).toString(_encode); } @@ -20298,7 +19745,7 @@ class InterceptorManager { * @returns {void} */ forEach(fn) { - utils$1.forEach(this.handlers, function forEachHandler(h) { + utils.forEach(this.handlers, function forEachHandler(h) { if (h !== null) { fn(h); } @@ -20316,103 +19763,20 @@ const transitionalDefaults = { 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 = { +const platform = { 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)) { + if (utils.isBuffer(value)) { this.append(key, value.toString('base64')); return false; } @@ -20434,7 +19798,7 @@ function parsePropPath(name) { // foo.x.y.z // foo-x-y-z // foo x y z - return utils$1.matchAll(/\w+|\[(\w*)]/g, name).map(match => { + return utils.matchAll(/\w+|\[(\w*)]/g, name).map(match => { return match[0] === '[]' ? '' : match[1] || match[0]; }); } @@ -20469,15 +19833,12 @@ function arrayToObject(arr) { 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; + name = !name && utils.isArray(target) ? target.length : name; if (isLast) { - if (utils$1.hasOwnProp(target, name)) { + if (utils.hasOwnProp(target, name)) { target[name] = [target[name], value]; } else { target[name] = value; @@ -20486,23 +19847,23 @@ function formDataToJSON(formData) { return !isNumericKey; } - if (!target[name] || !utils$1.isObject(target[name])) { + if (!target[name] || !utils.isObject(target[name])) { target[name] = []; } const result = buildPath(path, value, target[name], index); - if (result && utils$1.isArray(target[name])) { + if (result && utils.isArray(target[name])) { target[name] = arrayToObject(target[name]); } return !isNumericKey; } - if (utils$1.isFormData(formData) && utils$1.isFunction(formData.entries)) { + if (utils.isFormData(formData) && utils.isFunction(formData.entries)) { const obj = {}; - utils$1.forEachEntry(formData, (name, value) => { + utils.forEachEntry(formData, (name, value) => { buildPath(parsePropPath(name), value, obj, 0); }); @@ -20512,6 +19873,10 @@ function formDataToJSON(formData) { return null; } +const DEFAULT_CONTENT_TYPE = { + 'Content-Type': undefined +}; + /** * It takes a string, tries to parse it, and if it fails, it returns the stringified version * of the input @@ -20523,10 +19888,10 @@ function formDataToJSON(formData) { * @returns {string} A stringified version of the rawValue. */ function stringifySafely(rawValue, parser, encoder) { - if (utils$1.isString(rawValue)) { + if (utils.isString(rawValue)) { try { (parser || JSON.parse)(rawValue); - return utils$1.trim(rawValue); + return utils.trim(rawValue); } catch (e) { if (e.name !== 'SyntaxError') { throw e; @@ -20541,36 +19906,38 @@ const defaults = { transitional: transitionalDefaults, - adapter: ['xhr', 'http', 'fetch'], + adapter: ['xhr', 'http'], transformRequest: [function transformRequest(data, headers) { const contentType = headers.getContentType() || ''; const hasJSONContentType = contentType.indexOf('application/json') > -1; - const isObjectPayload = utils$1.isObject(data); + const isObjectPayload = utils.isObject(data); - if (isObjectPayload && utils$1.isHTMLForm(data)) { + if (isObjectPayload && utils.isHTMLForm(data)) { data = new FormData(data); } - const isFormData = utils$1.isFormData(data); + const isFormData = utils.isFormData(data); if (isFormData) { + if (!hasJSONContentType) { + return data; + } 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) + if (utils.isArrayBuffer(data) || + utils.isBuffer(data) || + utils.isStream(data) || + utils.isFile(data) || + utils.isBlob(data) ) { return data; } - if (utils$1.isArrayBufferView(data)) { + if (utils.isArrayBufferView(data)) { return data.buffer; } - if (utils$1.isURLSearchParams(data)) { + if (utils.isURLSearchParams(data)) { headers.setContentType('application/x-www-form-urlencoded;charset=utf-8', false); return data.toString(); } @@ -20582,7 +19949,7 @@ const defaults = { return toURLEncodedForm(data, this.formSerializer).toString(); } - if ((isFileList = utils$1.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) { + if ((isFileList = utils.isFileList(data)) || contentType.indexOf('multipart/form-data') > -1) { const _FormData = this.env && this.env.FormData; return toFormData( @@ -20606,11 +19973,7 @@ const defaults = { 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)) { + if (data && utils.isString(data) && ((forcedJSONParsing && !this.responseType) || JSONRequested)) { const silentJSONParsing = transitional && transitional.silentJSONParsing; const strictJSONParsing = !silentJSONParsing && JSONRequested; @@ -20652,21 +20015,24 @@ const defaults = { headers: { common: { - 'Accept': 'application/json, text/plain, */*', - 'Content-Type': undefined + 'Accept': 'application/json, text/plain, */*' } } }; -utils$1.forEach(['delete', 'get', 'head', 'post', 'put', 'patch'], (method) => { +utils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) { defaults.headers[method] = {}; }); +utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { + defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE); +}); + 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([ +const ignoreDuplicateOf = utils.toObjectSet([ 'age', 'authorization', 'content-length', 'content-type', 'etag', 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since', 'last-modified', 'location', 'max-forwards', 'proxy-authorization', @@ -20727,7 +20093,7 @@ function normalizeValue(value) { return value; } - return utils$1.isArray(value) ? value.map(normalizeValue) : String(value); + return utils.isArray(value) ? value.map(normalizeValue) : String(value); } function parseTokens(str) { @@ -20745,7 +20111,7 @@ function parseTokens(str) { const isValidHeaderName = (str) => /^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(str.trim()); function matchHeaderValue(context, value, header, filter, isHeaderNameFilter) { - if (utils$1.isFunction(filter)) { + if (utils.isFunction(filter)) { return filter.call(this, value, header); } @@ -20753,13 +20119,13 @@ function matchHeaderValue(context, value, header, filter, isHeaderNameFilter) { value = header; } - if (!utils$1.isString(value)) return; + if (!utils.isString(value)) return; - if (utils$1.isString(filter)) { + if (utils.isString(filter)) { return value.indexOf(filter) !== -1; } - if (utils$1.isRegExp(filter)) { + if (utils.isRegExp(filter)) { return filter.test(value); } } @@ -20772,7 +20138,7 @@ function formatHeader(header) { } function buildAccessors(obj, header) { - const accessorName = utils$1.toCamelCase(' ' + header); + const accessorName = utils.toCamelCase(' ' + header); ['get', 'set', 'has'].forEach(methodName => { Object.defineProperty(obj, methodName + accessorName, { @@ -20799,7 +20165,7 @@ class AxiosHeaders { throw new Error('header name must be a non-empty string'); } - const key = utils$1.findKey(self, lHeader); + const key = utils.findKey(self, lHeader); if(!key || self[key] === undefined || _rewrite === true || (_rewrite === undefined && self[key] !== false)) { self[key || _header] = normalizeValue(_value); @@ -20807,16 +20173,12 @@ class AxiosHeaders { } const setHeaders = (headers, _rewrite) => - utils$1.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite)); + utils.forEach(headers, (_value, _header) => setHeader(_value, _header, _rewrite)); - if (utils$1.isPlainObject(header) || header instanceof this.constructor) { + if (utils.isPlainObject(header) || header instanceof this.constructor) { setHeaders(header, valueOrRewrite); - } else if(utils$1.isString(header) && (header = header.trim()) && !isValidHeaderName(header)) { + } else if(utils.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); } @@ -20828,7 +20190,7 @@ class AxiosHeaders { header = normalizeHeader(header); if (header) { - const key = utils$1.findKey(this, header); + const key = utils.findKey(this, header); if (key) { const value = this[key]; @@ -20841,11 +20203,11 @@ class AxiosHeaders { return parseTokens(value); } - if (utils$1.isFunction(parser)) { + if (utils.isFunction(parser)) { return parser.call(this, value, key); } - if (utils$1.isRegExp(parser)) { + if (utils.isRegExp(parser)) { return parser.exec(value); } @@ -20858,7 +20220,7 @@ class AxiosHeaders { header = normalizeHeader(header); if (header) { - const key = utils$1.findKey(this, header); + const key = utils.findKey(this, header); return !!(key && this[key] !== undefined && (!matcher || matchHeaderValue(this, this[key], key, matcher))); } @@ -20874,7 +20236,7 @@ class AxiosHeaders { _header = normalizeHeader(_header); if (_header) { - const key = utils$1.findKey(self, _header); + const key = utils.findKey(self, _header); if (key && (!matcher || matchHeaderValue(self, self[key], key, matcher))) { delete self[key]; @@ -20884,7 +20246,7 @@ class AxiosHeaders { } } - if (utils$1.isArray(header)) { + if (utils.isArray(header)) { header.forEach(deleteHeader); } else { deleteHeader(header); @@ -20913,8 +20275,8 @@ class AxiosHeaders { const self = this; const headers = {}; - utils$1.forEach(this, (value, header) => { - const key = utils$1.findKey(headers, header); + utils.forEach(this, (value, header) => { + const key = utils.findKey(headers, header); if (key) { self[key] = normalizeValue(value); @@ -20943,8 +20305,8 @@ class AxiosHeaders { 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); + utils.forEach(this, (value, header) => { + value != null && value !== false && (obj[header] = asStrings && utils.isArray(value) ? value.join(', ') : value); }); return obj; @@ -20991,7 +20353,7 @@ class AxiosHeaders { } } - utils$1.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header); + utils.isArray(header) ? header.forEach(defineAccessor) : defineAccessor(header); return this; } @@ -20999,18 +20361,8 @@ class AxiosHeaders { 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); +utils.freezeMethods(AxiosHeaders.prototype); +utils.freezeMethods(AxiosHeaders); const AxiosHeaders$1 = AxiosHeaders; @@ -21028,7 +20380,7 @@ function transformData(fns, response) { const headers = AxiosHeaders$1.from(context.headers); let data = context.data; - utils$1.forEach(fns, function transform(fn) { + utils.forEach(fns, function transform(fn) { data = fn.call(config, data, headers.normalize(), response ? response.status : undefined); }); @@ -21056,7 +20408,7 @@ function CanceledError(message, config, request) { this.name = 'CanceledError'; } -utils$1.inherits(CanceledError, AxiosError, { +utils.inherits(CanceledError, AxiosError, { __CANCEL__: true }); @@ -21108,7 +20460,7 @@ function isAbsoluteURL(url) { */ function combineURLs(baseURL, relativeURL) { return relativeURL - ? baseURL.replace(/\/?\/$/, '') + '/' + relativeURL.replace(/^\/+/, '') + ? baseURL.replace(/\/+$/, '') + '/' + relativeURL.replace(/^\/+/, '') : baseURL; } @@ -21122,15 +20474,14 @@ function combineURLs(baseURL, relativeURL) { * * @returns {string} The combined full path */ -function buildFullPath(baseURL, requestedURL, allowAbsoluteUrls) { - let isRelativeUrl = !isAbsoluteURL(requestedURL); - if (baseURL && (isRelativeUrl || allowAbsoluteUrls == false)) { +function buildFullPath(baseURL, requestedURL) { + if (baseURL && !isAbsoluteURL(requestedURL)) { return combineURLs(baseURL, requestedURL); } return requestedURL; } -const VERSION = "1.8.4"; +const VERSION = "1.4.0"; function parseProtocol(url) { const match = /^([-+\w]{1,25})(:?\/\/|:)/.exec(url); @@ -21185,11 +20536,93 @@ function fromDataURI(uri, asBlob, options) { throw new AxiosError('Unsupported protocol ' + protocol, AxiosError.ERR_NOT_SUPPORT); } +/** + * Throttle decorator + * @param {Function} fn + * @param {Number} freq + * @return {Function} + */ +function throttle(fn, freq) { + let timestamp = 0; + const threshold = 1000 / freq; + let timer = null; + return function throttled(force, args) { + const now = Date.now(); + if (force || now - timestamp > threshold) { + if (timer) { + clearTimeout(timer); + timer = null; + } + timestamp = now; + return fn.apply(null, args); + } + if (!timer) { + timer = setTimeout(() => { + timer = null; + timestamp = Date.now(); + return fn.apply(null, args); + }, threshold - (now - timestamp)); + } + }; +} + +/** + * 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; + }; +} + const kInternals = Symbol('internals'); class AxiosTransformStream extends stream__default["default"].Transform{ constructor(options) { - options = utils$1.toFlatObject(options, { + options = utils.toFlatObject(options, { maxRate: 0, chunkSize: 64 * 1024, minChunkSize: 100, @@ -21197,15 +20630,19 @@ class AxiosTransformStream extends stream__default["default"].Transform{ ticksRate: 2, samplesCount: 15 }, null, (prop, source) => { - return !utils$1.isUndefined(source[prop]); + return !utils.isUndefined(source[prop]); }); super({ readableHighWaterMark: options.chunkSize }); + const self = this; + const internals = this[kInternals] = { + length: options.length, timeWindow: options.timeWindow, + ticksRate: options.ticksRate, chunkSize: options.chunkSize, maxRate: options.maxRate, minChunkSize: options.minChunkSize, @@ -21217,6 +20654,8 @@ class AxiosTransformStream extends stream__default["default"].Transform{ onReadCallback: null }; + const _speedometer = speedometer(internals.ticksRate * options.samplesCount, internals.timeWindow); + this.on('newListener', event => { if (event === 'progress') { if (!internals.isCaptured) { @@ -21224,6 +20663,38 @@ class AxiosTransformStream extends stream__default["default"].Transform{ } } }); + + let bytesNotified = 0; + + internals.updateProgress = throttle(function throttledHandler() { + const totalBytes = internals.length; + const bytesTransferred = internals.bytesSeen; + const progressBytes = bytesTransferred - bytesNotified; + if (!progressBytes || self.destroyed) return; + + const rate = _speedometer(progressBytes); + + bytesNotified = bytesTransferred; + + process.nextTick(() => { + self.emit('progress', { + 'loaded': bytesTransferred, + 'total': totalBytes, + 'progress': totalBytes ? (bytesTransferred / totalBytes) : undefined, + 'bytes': progressBytes, + 'rate': rate ? rate : undefined, + 'estimated': rate && totalBytes && bytesTransferred <= totalBytes ? + (totalBytes - bytesTransferred) / rate : undefined + }); + }); + }, internals.ticksRate); + + const onFinish = () => { + internals.updateProgress(true); + }; + + this.once('end', onFinish); + this.once('error', onFinish); } _read(size) { @@ -21237,6 +20708,7 @@ class AxiosTransformStream extends stream__default["default"].Transform{ } _transform(chunk, encoding, callback) { + const self = this; const internals = this[kInternals]; const maxRate = internals.maxRate; @@ -21248,14 +20720,16 @@ class AxiosTransformStream extends stream__default["default"].Transform{ const bytesThreshold = (maxRate / divider); const minChunkSize = internals.minChunkSize !== false ? Math.max(internals.minChunkSize, bytesThreshold * 0.01) : 0; - const pushChunk = (_chunk, _callback) => { + function pushChunk(_chunk, _callback) { const bytes = Buffer.byteLength(_chunk); internals.bytesSeen += bytes; internals.bytes += bytes; - internals.isCaptured && this.emit('progress', internals.bytesSeen); + if (internals.isCaptured) { + internals.updateProgress(); + } - if (this.push(_chunk)) { + if (self.push(_chunk)) { process.nextTick(_callback); } else { internals.onReadCallback = () => { @@ -21263,7 +20737,7 @@ class AxiosTransformStream extends stream__default["default"].Transform{ process.nextTick(_callback); }; } - }; + } const transformChunk = (_chunk, _callback) => { const chunkSize = Buffer.byteLength(_chunk); @@ -21320,6 +20794,11 @@ class AxiosTransformStream extends stream__default["default"].Transform{ } }); } + + setLength(length) { + this[kInternals].length = +length; + return this; + } } const AxiosTransformStream$1 = AxiosTransformStream; @@ -21340,9 +20819,9 @@ const readBlob = async function* (blob) { const readBlob$1 = readBlob; -const BOUNDARY_ALPHABET = platform.ALPHABET.ALPHA_DIGIT + '-_'; +const BOUNDARY_ALPHABET = utils.ALPHABET.ALPHA_DIGIT + '-_'; -const textEncoder = typeof TextEncoder === 'function' ? new TextEncoder() : new util__default["default"].TextEncoder(); +const textEncoder = new util.TextEncoder(); const CRLF = '\r\n'; const CRLF_BYTES = textEncoder.encode(CRLF); @@ -21351,7 +20830,7 @@ const CRLF_BYTES_COUNT = 2; class FormDataPart { constructor(name, value) { const {escapeName} = this.constructor; - const isStringValue = utils$1.isString(value); + const isStringValue = utils.isString(value); let headers = `Content-Disposition: form-data; name="${escapeName(name)}"${ !isStringValue && value.name ? `; filename="${escapeName(value.name)}"` : '' @@ -21378,7 +20857,7 @@ class FormDataPart { const {value} = this; - if(utils$1.isTypedArray(value)) { + if(utils.isTypedArray(value)) { yield value; } else { yield* readBlob$1(value); @@ -21400,10 +20879,10 @@ const formDataToStream = (form, headersHandler, options) => { const { tag = 'form-data-boundary', size = 25, - boundary = tag + '-' + platform.generateString(size, BOUNDARY_ALPHABET) + boundary = tag + '-' + utils.generateString(size, BOUNDARY_ALPHABET) } = options || {}; - if(!utils$1.isFormData(form)) { + if(!utils.isFormData(form)) { throw TypeError('FormData instance required'); } @@ -21423,7 +20902,7 @@ const formDataToStream = (form, headersHandler, options) => { contentLength += boundaryBytes.byteLength * parts.length; - contentLength = utils$1.toFiniteNumber(contentLength); + contentLength = utils.toFiniteNumber(contentLength); const computedHeaders = { 'Content-Type': `multipart/form-data; boundary=${boundary}` @@ -21473,7 +20952,7 @@ class ZlibHeaderTransformStream extends stream__default["default"].Transform { const ZlibHeaderTransformStream$1 = ZlibHeaderTransformStream; const callbackify = (fn, reducer) => { - return utils$1.isAsyncFn(fn) ? function (...args) { + return utils.isAsyncFn(fn) ? function (...args) { const cb = args.pop(); fn.apply(this, args).then((value) => { try { @@ -21487,142 +20966,6 @@ const callbackify = (fn, reducer) => { 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 @@ -21633,7 +20976,7 @@ const brotliOptions = { finishFlush: zlib__default["default"].constants.BROTLI_OPERATION_FLUSH }; -const isBrotliSupported = utils$1.isFunction(zlib__default["default"].createBrotliDecompress); +const isBrotliSupported = utils.isFunction(zlib__default["default"].createBrotliDecompress); const {http: httpFollow, https: httpsFollow} = followRedirects__default["default"]; @@ -21643,14 +20986,6 @@ 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. @@ -21659,12 +20994,12 @@ const flushOnFinish = (stream, [throttled, flush]) => { * * @returns {Object} */ -function dispatchBeforeRedirect(options, responseDetails) { +function dispatchBeforeRedirect(options) { if (options.beforeRedirects.proxy) { options.beforeRedirects.proxy(options); } if (options.beforeRedirects.config) { - options.beforeRedirects.config(options, responseDetails); + options.beforeRedirects.config(options); } } @@ -21680,7 +21015,7 @@ function dispatchBeforeRedirect(options, responseDetails) { function setProxy(options, configProxy, location) { let proxy = configProxy; if (!proxy && proxy !== false) { - const proxyUrl = proxyFromEnv__default["default"].getProxyForUrl(location); + const proxyUrl = proxyFromEnv.getProxyForUrl(location); if (proxyUrl) { proxy = new URL(proxyUrl); } @@ -21721,7 +21056,7 @@ function setProxy(options, configProxy, location) { }; } -const isHttpAdapterSupported = typeof process !== 'undefined' && utils$1.kindOf(process) === 'process'; +const isHttpAdapterSupported = typeof process !== 'undefined' && utils.kindOf(process) === 'process'; // temporary hotfix @@ -21750,18 +21085,6 @@ const wrapAsync = (asyncExecutor) => { }) }; -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) { @@ -21772,24 +21095,19 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) { 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); - }); - }; + if (lookup && utils.isAsyncFn(lookup)) { + lookup = callbackify$1(lookup, (entry) => { + if(utils.isString(entry)) { + entry = [entry, entry.indexOf('.') < 0 ? 6 : 4]; + } else if (!utils.isArray(entry)) { + throw new TypeError('lookup async function must return an array [ip: string, family: number]]') + } + return entry; + }); } // temporary internal emitter until the AxiosRequest class will be implemented - const emitter = new events.EventEmitter(); + const emitter = new EventEmitter__default["default"](); const onFinished = () => { if (config.cancelToken) { @@ -21825,8 +21143,8 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) { } // Parse url - const fullPath = buildFullPath(config.baseURL, config.url, config.allowAbsoluteUrls); - const parsed = new URL(fullPath, platform.hasBrowserEnv ? platform.origin : undefined); + const fullPath = buildFullPath(config.baseURL, config.url); + const parsed = new URL(fullPath, 'http://localhost'); const protocol = parsed.protocol || supportedProtocols[0]; if (protocol === 'data:') { @@ -21853,7 +21171,7 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) { convertedData = convertedData.toString(responseEncoding); if (!responseEncoding || responseEncoding === 'utf8') { - convertedData = utils$1.stripBOM(convertedData); + convertedData = utils.stripBOM(convertedData); } } else if (responseType === 'stream') { convertedData = stream__default["default"].Readable.from(convertedData); @@ -21884,13 +21202,14 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) { // Only set header if it hasn't been set in config headers.set('User-Agent', 'axios/' + VERSION, false); - const {onUploadProgress, onDownloadProgress} = config; + const onDownloadProgress = config.onDownloadProgress; + const onUploadProgress = config.onUploadProgress; const maxRate = config.maxRate; let maxUploadRate = undefined; let maxDownloadRate = undefined; // support for spec compliant FormData objects - if (utils$1.isSpecCompliantForm(data)) { + if (utils.isSpecCompliantForm(data)) { const userBoundary = headers.getContentType(/boundary=([-_\w\d]{10,70})/i); data = formDataToStream$1(data, (formHeaders) => { @@ -21900,7 +21219,7 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) { 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)) { + } else if (utils.isFormData(data) && utils.isFunction(data.getHeaders)) { headers.set(data.getHeaders()); if (!headers.hasContentLength()) { @@ -21911,14 +21230,14 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) { } catch (e) { } } - } else if (utils$1.isBlob(data) || utils$1.isFile(data)) { + } else if (utils.isBlob(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)) { + } else if (data && !utils.isStream(data)) { + if (Buffer.isBuffer(data)) ; else if (utils.isArrayBuffer(data)) { data = Buffer.from(new Uint8Array(data)); - } else if (utils$1.isString(data)) { + } else if (utils.isString(data)) { data = Buffer.from(data, 'utf-8'); } else { return reject(new AxiosError( @@ -21940,9 +21259,9 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) { } } - const contentLength = utils$1.toFiniteNumber(headers.getContentLength()); + const contentLength = utils.toFiniteNumber(headers.getContentLength()); - if (utils$1.isArray(maxRate)) { + if (utils.isArray(maxRate)) { maxUploadRate = maxRate[0]; maxDownloadRate = maxRate[1]; } else { @@ -21950,21 +21269,20 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) { } if (data && (onUploadProgress || maxUploadRate)) { - if (!utils$1.isStream(data)) { + if (!utils.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); + length: contentLength, + maxRate: utils.toFiniteNumber(maxUploadRate) + })], utils.noop); - onUploadProgress && data.on('progress', flushOnFinish( - data, - progressEventDecorator( - contentLength, - progressEventReducer(asyncDecorator(onUploadProgress), false, 3) - ) - )); + onUploadProgress && data.on('progress', progress => { + onUploadProgress(Object.assign(progress, { + upload: true + })); + }); } // HTTP basic authentication @@ -22012,17 +21330,15 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) { auth, protocol, family, + lookup, 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.hostname = parsed.hostname; options.port = parsed.port; setProxy(options, config.proxy, protocol + '//' + parsed.hostname + (parsed.port ? ':' + parsed.port : '') + options.path); } @@ -22063,18 +21379,17 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) { const responseLength = +res.headers['content-length']; - if (onDownloadProgress || maxDownloadRate) { + if (onDownloadProgress) { const transformStream = new AxiosTransformStream$1({ - maxRate: utils$1.toFiniteNumber(maxDownloadRate) + length: utils.toFiniteNumber(responseLength), + maxRate: utils.toFiniteNumber(maxDownloadRate) }); - onDownloadProgress && transformStream.on('progress', flushOnFinish( - transformStream, - progressEventDecorator( - responseLength, - progressEventReducer(asyncDecorator(onDownloadProgress), true, 3) - ) - )); + onDownloadProgress && transformStream.on('progress', progress => { + onDownloadProgress(Object.assign(progress, { + download: true + })); + }); streams.push(transformStream); } @@ -22093,7 +21408,7 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) { delete res.headers['content-encoding']; } - switch ((res.headers['content-encoding'] || '').toLowerCase()) { + switch (res.headers['content-encoding']) { /*eslint default-case:0*/ case 'gzip': case 'x-gzip': @@ -22122,7 +21437,7 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) { } } - responseStream = streams.length > 1 ? stream__default["default"].pipeline(streams, utils$1.noop) : streams[0]; + responseStream = streams.length > 1 ? stream__default["default"].pipeline(streams, utils.noop) : streams[0]; const offListeners = stream__default["default"].finished(responseStream, () => { offListeners(); @@ -22164,7 +21479,7 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) { } const err = new AxiosError( - 'stream has been aborted', + 'maxContentLength size of ' + config.maxContentLength + ' exceeded', AxiosError.ERR_BAD_RESPONSE, config, lastRequest @@ -22184,12 +21499,12 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) { if (responseType !== 'arraybuffer') { responseData = responseData.toString(responseEncoding); if (!responseEncoding || responseEncoding === 'utf8') { - responseData = utils$1.stripBOM(responseData); + responseData = utils.stripBOM(responseData); } } response.data = responseData; } catch (err) { - return reject(AxiosError.from(err, null, config, response.request, response)); + reject(AxiosError.from(err, null, config, response.request, response)); } settle(resolve, reject, response); }); @@ -22226,7 +21541,7 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) { // 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)) { + if (isNaN(timeout)) { reject(new AxiosError( 'error trying to parse `config.timeout` to int', AxiosError.ERR_BAD_OPTION_VALUE, @@ -22261,7 +21576,7 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) { // Send the request - if (utils$1.isStream(data)) { + if (utils.isStream(data)) { let ended = false; let errored = false; @@ -22287,235 +21602,187 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) { }); }; -const isURLSameOrigin = platform.hasStandardBrowserEnv ? ((origin, isMSIE) => (url) => { - url = new URL(url, platform.origin); +const cookies = platform.isStandardBrowserEnv ? - 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; +// Standard browser envs support document.cookie + (function standardBrowserEnv() { + return { + write: function write(name, value, expires, path, domain, secure) { + const cookie = []; + cookie.push(name + '=' + encodeURIComponent(value)); -const cookies = platform.hasStandardBrowserEnv ? + if (utils.isNumber(expires)) { + cookie.push('expires=' + new Date(expires).toGMTString()); + } - // Standard browser envs support document.cookie - { - write(name, value, expires, path, domain, secure) { - const cookie = [name + '=' + encodeURIComponent(value)]; + if (utils.isString(path)) { + cookie.push('path=' + path); + } - utils$1.isNumber(expires) && cookie.push('expires=' + new Date(expires).toGMTString()); + if (utils.isString(domain)) { + cookie.push('domain=' + domain); + } - utils$1.isString(path) && cookie.push('path=' + path); + if (secure === true) { + cookie.push('secure'); + } - utils$1.isString(domain) && cookie.push('domain=' + domain); + document.cookie = cookie.join('; '); + }, - secure === true && cookie.push('secure'); + read: function read(name) { + const match = document.cookie.match(new RegExp('(^|;\\s*)(' + name + ')=([^;]*)')); + return (match ? decodeURIComponent(match[3]) : null); + }, - 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); + remove: function remove(name) { + this.write(name, '', Date.now() - 86400000); } - } - } + }; + })() : - return newConfig; -}; +// Non standard browser env (web workers, react-native) lack needed support. + (function nonStandardBrowserEnv() { + return { + write: function write() {}, + read: function read() { return null; }, + remove: function remove() {} + }; + })(); + +const isURLSameOrigin = platform.isStandardBrowserEnv ? + +// Standard browser envs have full support of the APIs needed to test +// whether the request URL is of the same origin as current location. + (function standardBrowserEnv() { + const msie = /(msie|trident)/i.test(navigator.userAgent); + const urlParsingNode = document.createElement('a'); + let originURL; + + /** + * Parse a URL to discover it's components + * + * @param {String} url The URL to be parsed + * @returns {Object} + */ + function resolveURL(url) { + let href = url; + + if (msie) { + // IE needs attribute set twice to normalize properties + urlParsingNode.setAttribute('href', href); + href = urlParsingNode.href; + } + + urlParsingNode.setAttribute('href', href); + + // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils + return { + href: urlParsingNode.href, + protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '', + host: urlParsingNode.host, + search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '', + hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '', + hostname: urlParsingNode.hostname, + port: urlParsingNode.port, + pathname: (urlParsingNode.pathname.charAt(0) === '/') ? + urlParsingNode.pathname : + '/' + urlParsingNode.pathname + }; + } + + originURL = resolveURL(window.location.href); + + /** + * Determine if a URL shares the same origin as the current location + * + * @param {String} requestURL The URL to test + * @returns {boolean} True if URL shares the same origin, otherwise false + */ + return function isURLSameOrigin(requestURL) { + const parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL; + return (parsed.protocol === originURL.protocol && + parsed.host === originURL.host); + }; + })() : + + // Non standard browser envs (web workers, react-native) lack needed support. + (function nonStandardBrowserEnv() { + return function isURLSameOrigin() { + return true; + }; + })(); + +function progressEventReducer(listener, isDownloadStream) { + let bytesNotified = 0; + const _speedometer = speedometer(50, 250); + + return 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 + }; + + data[isDownloadStream ? 'download' : 'upload'] = true; + + listener(data); + }; +} 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 requestData = config.data; + const requestHeaders = AxiosHeaders$1.from(config.headers).normalize(); + const responseType = config.responseType; let onCanceled; - let uploadThrottled, downloadThrottled; - let flushUpload, flushDownload; - function done() { - flushUpload && flushUpload(); // flush events - flushDownload && flushDownload(); // flush events + if (config.cancelToken) { + config.cancelToken.unsubscribe(onCanceled); + } - _config.cancelToken && _config.cancelToken.unsubscribe(onCanceled); + if (config.signal) { + config.signal.removeEventListener('abort', onCanceled); + } + } - _config.signal && _config.signal.removeEventListener('abort', onCanceled); + if (utils.isFormData(requestData)) { + if (platform.isStandardBrowserEnv || platform.isStandardBrowserWebWorkerEnv) { + requestHeaders.setContentType(false); // Let the browser set it + } else { + requestHeaders.setContentType('multipart/form-data;', false); // mobile/desktop app frameworks + } } let request = new XMLHttpRequest(); - request.open(_config.method.toUpperCase(), _config.url, true); + // HTTP basic authentication + if (config.auth) { + const username = config.auth.username || ''; + const password = config.auth.password ? unescape(encodeURIComponent(config.auth.password)) : ''; + requestHeaders.set('Authorization', 'Basic ' + btoa(username + ':' + password)); + } + + const fullPath = buildFullPath(config.baseURL, config.url); + + request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true); // Set the request timeout in MS - request.timeout = _config.timeout; + request.timeout = config.timeout; function onloadend() { if (!request) { @@ -22595,10 +21862,10 @@ const xhrAdapter = isXHRAdapterSupported && function (config) { // 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; + 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, @@ -22610,42 +21877,50 @@ const xhrAdapter = isXHRAdapterSupported && function (config) { request = null; }; + // 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.isStandardBrowserEnv) { + // Add xsrf header + const xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) + && config.xsrfCookieName && cookies.read(config.xsrfCookieName); + + if (xsrfValue) { + requestHeaders.set(config.xsrfHeaderName, xsrfValue); + } + } + // 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) { + utils.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; + if (!utils.isUndefined(config.withCredentials)) { + request.withCredentials = !!config.withCredentials; } // Add responseType to request if needed if (responseType && responseType !== 'json') { - request.responseType = _config.responseType; + request.responseType = config.responseType; } // Handle progress if needed - if (onDownloadProgress) { - ([downloadThrottled, flushDownload] = progressEventReducer(onDownloadProgress, true)); - request.addEventListener('progress', downloadThrottled); + if (typeof config.onDownloadProgress === 'function') { + request.addEventListener('progress', progressEventReducer(config.onDownloadProgress, true)); } // 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 (typeof config.onUploadProgress === 'function' && request.upload) { + request.upload.addEventListener('progress', progressEventReducer(config.onUploadProgress)); } - if (_config.cancelToken || _config.signal) { + if (config.cancelToken || config.signal) { // Handle cancellation // eslint-disable-next-line func-names onCanceled = cancel => { @@ -22657,13 +21932,13 @@ const xhrAdapter = isXHRAdapterSupported && function (config) { request = null; }; - _config.cancelToken && _config.cancelToken.subscribe(onCanceled); - if (_config.signal) { - _config.signal.aborted ? onCanceled() : _config.signal.addEventListener('abort', onCanceled); + config.cancelToken && config.cancelToken.subscribe(onCanceled); + if (config.signal) { + config.signal.aborted ? onCanceled() : config.signal.addEventListener('abort', onCanceled); } } - const protocol = parseProtocol(_config.url); + const protocol = parseProtocol(fullPath); if (protocol && platform.protocols.indexOf(protocol) === -1) { reject(new AxiosError('Unsupported protocol ' + protocol + ':', AxiosError.ERR_BAD_REQUEST, config)); @@ -22676,364 +21951,13 @@ const xhrAdapter = isXHRAdapterSupported && function (config) { }); }; -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 + xhr: xhrAdapter }; -utils$1.forEach(knownAdapters, (fn, value) => { - if (fn) { +utils.forEach(knownAdapters, (fn, value) => { + if(fn) { try { Object.defineProperty(fn, 'name', {value}); } catch (e) { @@ -23043,58 +21967,40 @@ utils$1.forEach(knownAdapters, (fn, 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]; + adapters = utils.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) { + if((adapter = utils.isString(nameOrAdapter) ? knownAdapters[nameOrAdapter.toLowerCase()] : nameOrAdapter)) { 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') + if (adapter === false) { + throw new AxiosError( + `Adapter ${nameOrAdapter} is not supported by the environment`, + 'ERR_NOT_SUPPORT' ); + } - 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' + throw new Error( + utils.hasOwnProp(knownAdapters, nameOrAdapter) ? + `Adapter '${nameOrAdapter}' is not available in the build` : + `Unknown adapter '${nameOrAdapter}'` ); } + if (!utils.isFunction(adapter)) { + throw new TypeError('adapter is not a function'); + } + return adapter; }, adapters: knownAdapters @@ -23173,6 +22079,107 @@ function dispatchRequest(config) { }); } +const headersToObject = (thing) => thing instanceof AxiosHeaders$1 ? thing.toJSON() : 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, caseless) { + if (utils.isPlainObject(target) && utils.isPlainObject(source)) { + return utils.merge.call({caseless}, target, source); + } else if (utils.isPlainObject(source)) { + return utils.merge({}, source); + } else if (utils.isArray(source)) { + return source.slice(); + } + return source; + } + + // eslint-disable-next-line consistent-return + function mergeDeepProperties(a, b, caseless) { + if (!utils.isUndefined(b)) { + return getMergedValue(a, b, caseless); + } else if (!utils.isUndefined(a)) { + return getMergedValue(undefined, a, caseless); + } + } + + // eslint-disable-next-line consistent-return + function valueFromConfig2(a, b) { + if (!utils.isUndefined(b)) { + return getMergedValue(undefined, b); + } + } + + // eslint-disable-next-line consistent-return + function defaultToConfig2(a, b) { + if (!utils.isUndefined(b)) { + return getMergedValue(undefined, b); + } else if (!utils.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, + 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) => mergeDeepProperties(headersToObject(a), headersToObject(b), true) + }; + + utils.forEach(Object.keys(Object.assign({}, config1, config2)), function computeConfigValue(prop) { + const merge = mergeMap[prop] || mergeDeepProperties; + const configValue = merge(config1[prop], config2[prop], prop); + (utils.isUndefined(configValue) && merge !== mergeDirectKeys) || (config[prop] = configValue); + }); + + return config; +} + const validators$1 = {}; // eslint-disable-next-line func-names @@ -23222,14 +22229,6 @@ validators$1.transitional = function transitional(validator, version, message) { }; }; -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 * @@ -23294,34 +22293,7 @@ class Axios { * * @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) { + request(configOrUrl, config) { /*eslint no-param-reassign:0*/ // Allow for axios('example/url'[, config]) a la fetch API if (typeof configOrUrl === 'string') { @@ -23344,7 +22316,7 @@ class Axios { } if (paramsSerializer != null) { - if (utils$1.isFunction(paramsSerializer)) { + if (utils.isFunction(paramsSerializer)) { config.paramsSerializer = { serialize: paramsSerializer }; @@ -23356,28 +22328,18 @@ class Axios { } } - // 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(); + let contextHeaders; + // Flatten headers - let contextHeaders = headers && utils$1.merge( + contextHeaders = headers && utils.merge( headers.common, headers[config.method] ); - headers && utils$1.forEach( + contextHeaders && utils.forEach( ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'], (method) => { delete headers[method]; @@ -23458,13 +22420,13 @@ class Axios { getUri(config) { config = mergeConfig(this.defaults, config); - const fullPath = buildFullPath(config.baseURL, config.url, config.allowAbsoluteUrls); + const fullPath = buildFullPath(config.baseURL, config.url); return buildURL(fullPath, config.params, config.paramsSerializer); } } // Provide aliases for supported request methods -utils$1.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) { +utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) { /*eslint func-names:0*/ Axios.prototype[method] = function(url, config) { return this.request(mergeConfig(config || {}, { @@ -23475,7 +22437,7 @@ utils$1.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoDa }; }); -utils$1.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { +utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) { /*eslint func-names:0*/ function generateHTTPMethod(isForm) { @@ -23598,20 +22560,6 @@ class CancelToken { } } - 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`. @@ -23665,7 +22613,7 @@ function spread(callback) { * @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); + return utils.isObject(payload) && (payload.isAxiosError === true); } const HttpStatusCode = { @@ -23752,10 +22700,10 @@ function createInstance(defaultConfig) { const instance = bind(Axios$1.prototype.request, context); // Copy axios.prototype to instance - utils$1.extend(instance, Axios$1.prototype, context, {allOwnKeys: true}); + utils.extend(instance, Axios$1.prototype, context, {allOwnKeys: true}); // Copy context to instance - utils$1.extend(instance, context, null, {allOwnKeys: true}); + utils.extend(instance, context, null, {allOwnKeys: true}); // Factory for creating new instances instance.create = function create(instanceConfig) { @@ -23799,9 +22747,7 @@ axios.mergeConfig = mergeConfig; axios.AxiosHeaders = AxiosHeaders$1; -axios.formToJSON = thing => formDataToJSON(utils$1.isHTMLForm(thing) ? new FormData(thing) : thing); - -axios.getAdapter = adapters.getAdapter; +axios.formToJSON = thing => formDataToJSON(utils.isHTMLForm(thing) ? new FormData(thing) : thing); axios.HttpStatusCode = HttpStatusCode$1; diff --git a/examples/on-pr-merge/automated-workflow.yaml b/examples/on-pr-merge/automated-workflow.yaml deleted file mode 100644 index 751bbb5..0000000 --- a/examples/on-pr-merge/automated-workflow.yaml +++ /dev/null @@ -1,53 +0,0 @@ -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 deleted file mode 100644 index a30b31f..0000000 --- a/examples/on-pr-merge/pr-merge-event.json +++ /dev/null @@ -1,79 +0,0 @@ -{ - "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 deleted file mode 100644 index 126f680..0000000 --- a/mise.toml +++ /dev/null @@ -1,2 +0,0 @@ -[tools] -node = "20" diff --git a/package-lock.json b/package-lock.json index 6ff2d33..671b5a1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { - "name": "@kie/git-backporting", - "version": "4.8.5", + "name": "@lampajr/bper", + "version": "3.1.1", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "@kie/git-backporting", - "version": "4.8.5", + "name": "@lampajr/bper", + "version": "3.1.1", "license": "MIT", "dependencies": { "@actions/core": "^1.10.0", @@ -18,7 +18,7 @@ "simple-git": "^3.15.1" }, "bin": { - "git-backporting": "dist/cli/index.js" + "bper": "dist/cli/index.js" }, "devDependencies": { "@commitlint/cli": "^17.4.0", @@ -26,7 +26,7 @@ "@gitbeaker/rest": "^39.1.0", "@kie/mock-github": "^1.1.0", "@octokit/webhooks-types": "^6.8.0", - "@release-it/conventional-changelog": "^10.0.0", + "@release-it/conventional-changelog": "^5.1.1", "@types/fs-extra": "^9.0.13", "@types/jest": "^29.2.4", "@types/node": "^18.11.17", @@ -37,7 +37,7 @@ "husky": "^8.0.2", "jest": "^29.0.0", "jest-sonar-reporter": "^2.0.0", - "release-it": "^19.0.2", + "release-it": "^15.6.0", "semver": "^7.3.8", "ts-jest": "^29.0.0", "ts-node": "^10.8.1", @@ -86,14 +86,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@babel/highlight": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -145,21 +143,21 @@ "dev": true }, "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz", + "integrity": "sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==", "dev": true, "dependencies": { - "@babel/types": "^7.23.0", + "@babel/types": "^7.22.5", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -197,9 +195,9 @@ } }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -212,22 +210,22 @@ "dev": true }, "node_modules/@babel/helper-environment-visitor": { - "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==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "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==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", "dev": true, "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -298,9 +296,9 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "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==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz", + "integrity": "sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==", "dev": true, "dependencies": { "@babel/types": "^7.22.5" @@ -310,18 +308,18 @@ } }, "node_modules/@babel/helper-string-parser": { - "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==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -337,26 +335,109 @@ } }, "node_modules/@babel/helpers": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz", - "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.5.tgz", + "integrity": "sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==", "dev": true, "dependencies": { - "@babel/template": "^7.27.0", - "@babel/types": "^7.27.0" + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/parser": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.0.tgz", - "integrity": "sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==", + "node_modules/@babel/highlight": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", "dev": true, "dependencies": { - "@babel/types": "^7.27.0" + "@babel/helper-validator-identifier": "^7.22.5", + "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.22.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz", + "integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==", + "dev": true, "bin": { "parser": "bin/babel-parser.js" }, @@ -542,33 +623,33 @@ } }, "node_modules/@babel/template": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", - "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.26.2", - "@babel/parser": "^7.27.0", - "@babel/types": "^7.27.0" + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.5.tgz", + "integrity": "sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==", "dev": true, "dependencies": { - "@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/code-frame": "^7.22.5", + "@babel/generator": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", "@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", + "@babel/helper-split-export-declaration": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -586,13 +667,14 @@ } }, "node_modules/@babel/types": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", - "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" }, "engines": { "node": ">=6.9.0" @@ -973,6 +1055,21 @@ "node": ">=18.0.0" } }, + "node_modules/@gitbeaker/core/node_modules/qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/@gitbeaker/requester-utils": { "version": "39.1.0", "resolved": "https://registry.npmjs.org/@gitbeaker/requester-utils/-/requester-utils-39.1.0.tgz", @@ -986,6 +1083,21 @@ "node": ">=18.0.0" } }, + "node_modules/@gitbeaker/requester-utils/node_modules/qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/@gitbeaker/rest": { "version": "39.1.0", "resolved": "https://registry.npmjs.org/@gitbeaker/rest/-/rest-39.1.0.tgz", @@ -1033,360 +1145,19 @@ "dev": true }, "node_modules/@hutson/parse-repository-url": { - "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==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", + "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==", "dev": true, - "license": "Apache-2.0", "engines": { - "node": ">=10.13.0" + "node": ">=6.9.0" } }, - "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/@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/@istanbuljs/load-nyc-config": { "version": "1.1.0", @@ -1900,99 +1671,77 @@ "node": ">= 8" } }, - "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": { - "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", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.2.tgz", + "integrity": "sha512-pq7CwIMV1kmzkFTimdwjAINCXKTajZErLB4wMLYapR2nuB/Jpr66+05wOTZMSCBXP6n4DdDWT2W19Bm17vU69Q==", + "dependencies": { + "@octokit/types": "^8.0.0" + }, "engines": { - "node": ">= 18" + "node": ">= 14" } }, "node_modules/@octokit/core": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.5.tgz", - "integrity": "sha512-vvmsN0r7rguA+FySiCsbaTTobSftpIDIpPW81trAmsv9TGxg3YCujAxRYp/Uy8xmDgYCzzgulG62H7KYUFmeIg==", - "license": "MIT", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.4.tgz", + "integrity": "sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==", "dependencies": { - "@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" + "@octokit/auth-token": "^3.0.0", + "@octokit/graphql": "^5.0.0", + "@octokit/request": "^6.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" }, "engines": { - "node": ">= 18" + "node": ">= 14" } }, - "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/@octokit/openapi-types": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", + "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" }, - "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/core/node_modules/@octokit/types": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", + "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "dependencies": { + "@octokit/openapi-types": "^18.0.0" + } }, "node_modules/@octokit/endpoint": { - "version": "10.1.4", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.4.tgz", - "integrity": "sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==", - "license": "MIT", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.3.tgz", + "integrity": "sha512-57gRlb28bwTsdNXq+O3JTQ7ERmBTuik9+LelgcLIVfYwf235VHbN9QNo4kXExtp/h8T423cR5iJThKtFYxC7Lw==", "dependencies": { - "@octokit/types": "^14.0.0", - "universal-user-agent": "^7.0.2" + "@octokit/types": "^8.0.0", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" }, "engines": { - "node": ">= 18" + "node": ">= 14" } }, - "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": "8.2.2", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.2.2.tgz", - "integrity": "sha512-Yi8hcoqsrXGdt0yObxbebHXFOiUA+2v3n53epuOg1QUgOB6c4XzvisBNVXJSl8RYA5KrDuSL2yq9Qmqe5N0ryA==", - "license": "MIT", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.4.tgz", + "integrity": "sha512-amO1M5QUQgYQo09aStR/XO7KAl13xpigcy/kI8/N1PnZYSS69fgte+xA4+c2DISKqUZfsh0wwjc2FaCt99L41A==", "dependencies": { - "@octokit/request": "^9.2.3", - "@octokit/types": "^14.0.0", - "universal-user-agent": "^7.0.0" + "@octokit/request": "^6.0.0", + "@octokit/types": "^8.0.0", + "universal-user-agent": "^6.0.0" }, "engines": { - "node": ">= 18" + "node": ">= 14" } }, - "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": "25.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.0.0.tgz", - "integrity": "sha512-FZvktFu7HfOIJf2BScLKIEYjDsw6RKc7rBJCdvCTfKsVnx2GEB/Nbzjr29DUdb7vQhlzS/j8qDzdditP0OC6aw==", - "license": "MIT" + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-14.0.0.tgz", + "integrity": "sha512-HNWisMYlR8VCnNurDU6os2ikx0s0VyEjDYHNS/h4cgb8DeOxQ0n72HyinUtdDVxJhFy3FWLGl0DJhfEWk3P5Iw==" }, "node_modules/@octokit/openapi-types-ghec": { "version": "14.0.0", @@ -2058,39 +1807,34 @@ } }, "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", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.2.tgz", + "integrity": "sha512-6VDqgj0HMc2FUX2awIs+sM6OwLgwHvAi4KCK3mT2H2IKRt6oH9d0fej5LluF5mck1lRR/rFWN0YIDSYXYSylbw==", "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" + "@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" }, "engines": { - "node": ">= 18" + "node": ">= 14" } }, "node_modules/@octokit/request-error": { - "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", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.2.tgz", + "integrity": "sha512-WMNOFYrSaX8zXWoJg9u/pKgWPo94JXilMLb2VManNOby9EZxrQaBe/QSC4a1TzpAlpxofg2X/jMnCyZgL6y7eg==", "dependencies": { - "@octokit/types": "^14.0.0" + "@octokit/types": "^8.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" }, "engines": { - "node": ">= 18" + "node": ">= 14" } }, - "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": "18.12.0", "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.12.0.tgz", @@ -2180,13 +1924,18 @@ "@octokit/openapi-types": "^12.11.0" } }, + "node_modules/@octokit/tsconfig": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@octokit/tsconfig/-/tsconfig-1.0.2.tgz", + "integrity": "sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==", + "dev": true + }, "node_modules/@octokit/types": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.0.0.tgz", - "integrity": "sha512-VVmZP0lEhbo2O1pdq63gZFiGCKkm8PPp8AUOijlwPO6hojEVjspA0MWKP7E4hbvGxzFKNqKr6p0IYtOH/Wf/zA==", - "license": "MIT", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-8.2.1.tgz", + "integrity": "sha512-8oWMUji8be66q2B9PmEIUyQm00VPDPun07umUWSaCwxmeaquFBro4Hcc3ruVoDo3zkQyZBlRvhIMEYS3pBhanw==", "dependencies": { - "@octokit/openapi-types": "^25.0.0" + "@octokit/openapi-types": "^14.0.0" } }, "node_modules/@octokit/webhooks-types": { @@ -2195,38 +1944,47 @@ "integrity": "sha512-Yq46asTPdEyrroCSBLRvcwNBsztiDHHvJ3+//2PhVbLSKp6kkj7NkjA3fyrpCrdlANj8REZSfus60v96EmlxCA==", "dev": true }, - "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==", + "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==", "dev": true, - "license": "MIT", - "engines": { - "node": "^20.9.0 || >=22.0.0", - "npm": ">=10.8.2" + "dependencies": { + "graceful-fs": "4.2.10" }, - "funding": { - "url": "https://github.com/phun-ky/typeof?sponsor=1" + "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" + }, + "engines": { + "node": ">=12" } }, "node_modules/@release-it/conventional-changelog": { - "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==", + "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==", "dev": true, - "license": "MIT", "dependencies": { "concat-stream": "^2.0.0", - "conventional-changelog": "^6.0.0", - "conventional-recommended-bump": "^10.0.0", - "git-semver-tags": "^8.0.0", - "semver": "^7.6.3" + "conventional-changelog": "^3.1.25", + "conventional-recommended-bump": "^6.1.0", + "semver": "7.3.8" }, "engines": { - "node": "^20.9.0 || >=22.0.0" + "node": ">=14" }, "peerDependencies": { - "release-it": "^18.0.0 || ^19.0.0" + "release-it": "^15.4.1" } }, "node_modules/@sinclair/typebox": { @@ -2235,6 +1993,18 @@ "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": "3.0.0", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", @@ -2253,12 +2023,17 @@ "@sinonjs/commons": "^3.0.0" } }, - "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==", + "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==", "dev": true, - "license": "MIT" + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } }, "node_modules/@tsconfig/node10": { "version": "1.0.9", @@ -2343,6 +2118,12 @@ "@types/node": "*" } }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", + "dev": true + }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", @@ -2396,18 +2177,10 @@ "dev": true }, "node_modules/@types/normalize-package-data": { - "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" + "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 }, "node_modules/@types/prettier": { "version": "2.7.3", @@ -2416,11 +2189,10 @@ "dev": true }, "node_modules/@types/semver": { - "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" + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true }, "node_modules/@types/stack-utils": { "version": "2.0.1", @@ -2686,15 +2458,16 @@ "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, - "license": "MIT" + "dev": true }, "node_modules/agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", "dev": true, - "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, "engines": { "node": ">= 14" } @@ -2715,6 +2488,15 @@ "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", @@ -2812,6 +2594,25 @@ "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", @@ -2826,7 +2627,6 @@ "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" }, @@ -2835,18 +2635,16 @@ } }, "node_modules/ast-types/node_modules/tslib": { - "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" + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==", + "dev": true }, "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" } @@ -2856,12 +2654,24 @@ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, + "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/axios": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", - "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", "dependencies": { - "follow-redirects": "^1.15.6", + "follow-redirects": "^1.15.0", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -2963,12 +2773,31 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, - "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==", + "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==", + "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/basic-ftp": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.3.tgz", + "integrity": "sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==", "dev": true, - "license": "MIT", "engines": { "node": ">=10.0.0" } @@ -2978,6 +2807,15 @@ "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==" }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, "node_modules/binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", @@ -2987,22 +2825,33 @@ "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.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "dev": true, "dependencies": { "bytes": "3.1.2", - "content-type": "~1.0.5", + "content-type": "~1.0.4", "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.13.0", - "raw-body": "2.5.2", + "qs": "6.11.0", + "raw-body": "2.5.1", "type-is": "~1.6.18", "unpipe": "1.0.0" }, @@ -3026,6 +2875,155 @@ "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/bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, + "dependencies": { + "big-integer": "^1.6.44" + }, + "engines": { + "node": ">= 5.10.0" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -3037,12 +3035,12 @@ } }, "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "dependencies": { - "fill-range": "^7.1.1" + "fill-range": "^7.0.1" }, "engines": { "node": ">=8" @@ -3101,6 +3099,30 @@ "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", @@ -3108,16 +3130,15 @@ "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==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", "dev": true, - "license": "MIT", "dependencies": { - "run-applescript": "^7.0.0" + "run-applescript": "^5.0.0" }, "engines": { - "node": ">=18" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3132,89 +3153,41 @@ "node": ">= 0.8" } }, - "node_modules/c12": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/c12/-/c12-3.0.3.tgz", - "integrity": "sha512-uC3MacKBb0Z15o5QWCHvHWj5Zv34pGQj9P+iXKSpTuSGFS0KKhUWf4t9AJ+gWjYOdmWCPEGpEzm8sS0iqbpo1w==", + "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==", "dev": true, - "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 - } + "engines": { + "node": ">=14.16" } }, - "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==", + "node_modules/cacheable-request": { + "version": "10.2.12", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.12.tgz", + "integrity": "sha512-qtWGB5kn2OLjx47pYUkWicyOpK1vy9XZhq8yRTXOy+KAmjjESSRLx6SiExnnaGGUP1NM6/vmygMu0fGylNh9tw==", "dev": true, - "license": "MIT", "dependencies": { - "readdirp": "^4.0.1" + "@types/http-cache-semantics": "^4.0.1", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.2", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" }, "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "node": ">=14.16" } }, - "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": { + "node_modules/call-bind": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dev": true, "dependencies": { - "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" + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3304,8 +3277,7 @@ "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true, - "license": "MIT" + "dev": true }, "node_modules/chokidar": { "version": "3.5.3", @@ -3355,44 +3327,41 @@ "node": ">=8" } }, - "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, - "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": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "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==", "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^5.0.0" - }, "engines": { - "node": ">=18" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", + "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" }, @@ -3401,11 +3370,10 @@ } }, "node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "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==", "dev": true, - "license": "ISC", "engines": { "node": ">= 12" } @@ -3424,6 +3392,15 @@ "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", @@ -3501,7 +3478,6 @@ "engines": [ "node >= 6.0" ], - "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -3509,21 +3485,60 @@ "typedarray": "^0.0.6" } }, - "node_modules/confbox": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", - "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", + "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==", "dev": true, - "license": "MIT" + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } }, - "node_modules/consola": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", + "node_modules/configstore": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", + "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", "dev": true, - "license": "MIT", + "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" + }, "engines": { - "node": "^14.18.0 || >=16.10.0" + "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_modules/content-disposition": { @@ -3539,35 +3554,34 @@ } }, "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", "dev": true, "engines": { "node": ">= 0.6" } }, "node_modules/conventional-changelog": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-6.0.0.tgz", - "integrity": "sha512-tuUH8H/19VjtD9Ig7l6TQRh+Z0Yt0NZ6w/cCkkyzUbGQTnUEmKfGtkC9gGfVgCfOL1Rzno5NgNF4KY8vR+Jo3w==", + "version": "3.1.25", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.25.tgz", + "integrity": "sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==", "dev": true, - "license": "MIT", "dependencies": { - "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" + "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" }, "engines": { - "node": ">=18" + "node": ">=10" } }, "node_modules/conventional-changelog-angular": { @@ -3584,23 +3598,27 @@ } }, "node_modules/conventional-changelog-atom": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-5.0.0.tgz", - "integrity": "sha512-WfzCaAvSCFPkznnLgLnfacRAzjgqjLUjvf3MftfsJzQdDICqkOOpcMtdJF3wTerxSpv2IAAjX8doM3Vozqle3g==", + "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, - "license": "ISC", + "dependencies": { + "q": "^1.5.1" + }, "engines": { - "node": ">=18" + "node": ">=10" } }, "node_modules/conventional-changelog-codemirror": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-5.0.0.tgz", - "integrity": "sha512-8gsBDI5Y3vrKUCxN6Ue8xr6occZ5nsDEc4C7jO/EovFGozx8uttCAyfhRrvoUAWi2WMm3OmYs+0mPJU7kQdYWQ==", + "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, - "license": "ISC", + "dependencies": { + "q": "^1.5.1" + }, "engines": { - "node": ">=18" + "node": ">=10" } }, "node_modules/conventional-changelog-conventionalcommits": { @@ -3618,314 +3636,299 @@ } }, "node_modules/conventional-changelog-core": { - "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==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz", + "integrity": "sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==", "dev": true, - "license": "MIT", "dependencies": { - "@hutson/parse-repository-url": "^5.0.0", "add-stream": "^1.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" + "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" }, "engines": { - "node": ">=18" + "node": ">=10" } }, - "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==", + "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==", "dev": true, - "license": "MIT", "dependencies": { - "@types/semver": "^7.5.5", - "semver": "^7.5.2" + "locate-path": "^2.0.0" }, "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-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": ">=4" } }, "node_modules/conventional-changelog-core/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==", + "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==", "dev": true, - "license": "ISC", "dependencies": { - "lru-cache": "^10.0.1" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=4" } }, - "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==", + "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==", "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" + "dependencies": { + "p-try": "^1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=4" } }, - "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==", + "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==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "hosted-git-info": "^7.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" + "p-limit": "^1.1.0" }, "engines": { - "node": "^16.14.0 || >=18.0.0" + "node": ">=4" } }, - "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==", + "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, - "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.26.2", - "index-to-position": "^1.1.0", - "type-fest": "^4.39.1" + "pify": "^3.0.0" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "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" } }, "node_modules/conventional-changelog-core/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==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", "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" + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "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==", + "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, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "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_modules/conventional-changelog-ember": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-5.0.0.tgz", - "integrity": "sha512-RPflVfm5s4cSO33GH/Ey26oxhiC67akcxSKL8CLRT3kQX2W3dbE19sSOM56iFqUJYEwv9mD9r6k79weWe1urfg==", + "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, - "license": "ISC", + "dependencies": { + "q": "^1.5.1" + }, "engines": { - "node": ">=18" + "node": ">=10" } }, "node_modules/conventional-changelog-eslint": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-6.0.0.tgz", - "integrity": "sha512-eiUyULWjzq+ybPjXwU6NNRflApDWlPEQEHvI8UAItYW/h22RKkMnOAtfCZxMmrcMO1OKUWtcf2MxKYMWe9zJuw==", + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.9.tgz", + "integrity": "sha512-6NpUCMgU8qmWmyAMSZO5NrRd7rTgErjrm4VASam2u5jrZS0n38V7Y9CzTtLT2qwz5xEChDR4BduoWIr8TfwvXA==", "dev": true, - "license": "ISC", + "dependencies": { + "q": "^1.5.1" + }, "engines": { - "node": ">=18" + "node": ">=10" } }, "node_modules/conventional-changelog-express": { - "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==", + "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, - "license": "ISC", + "dependencies": { + "q": "^1.5.1" + }, "engines": { - "node": ">=18" + "node": ">=10" } }, "node_modules/conventional-changelog-jquery": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-6.0.0.tgz", - "integrity": "sha512-2kxmVakyehgyrho2ZHBi90v4AHswkGzHuTaoH40bmeNqUt20yEkDOSpw8HlPBfvEQBwGtbE+5HpRwzj6ac2UfA==", + "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, - "license": "ISC", + "dependencies": { + "q": "^1.5.1" + }, "engines": { - "node": ">=18" + "node": ">=10" } }, "node_modules/conventional-changelog-jshint": { - "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==", + "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==", "dev": true, - "license": "ISC", "dependencies": { - "compare-func": "^2.0.0" + "compare-func": "^2.0.0", + "q": "^1.5.1" }, "engines": { - "node": ">=18" + "node": ">=10" } }, "node_modules/conventional-changelog-preset-loader": { - "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==", + "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==", "dev": true, - "license": "MIT", "engines": { - "node": ">=18" + "node": ">=10" } }, "node_modules/conventional-changelog-writer": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-8.0.1.tgz", - "integrity": "sha512-hlqcy3xHred2gyYg/zXSMXraY2mjAYYo0msUCpK+BGyaVJMFCKWVXPIHiaacGO2GGp13kvHWXFhYmxT4QQqW3Q==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", + "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", "dev": true, - "license": "MIT", "dependencies": { - "conventional-commits-filter": "^5.0.0", + "conventional-commits-filter": "^2.0.7", + "dateformat": "^3.0.0", "handlebars": "^4.7.7", - "meow": "^13.0.0", - "semver": "^7.5.2" + "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" }, "bin": { - "conventional-changelog-writer": "dist/cli/index.js" + "conventional-changelog-writer": "cli.js" }, "engines": { - "node": ">=18" + "node": ">=10" } }, - "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==", + "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==", "dev": true, - "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" + "bin": { + "semver": "bin/semver.js" } }, "node_modules/conventional-changelog/node_modules/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==", + "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==", "dev": true, - "license": "ISC", "dependencies": { - "compare-func": "^2.0.0" + "compare-func": "^2.0.0", + "lodash": "^4.17.15", + "q": "^1.5.1" }, "engines": { - "node": ">=18" + "node": ">=10" } }, "node_modules/conventional-commits-filter": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-5.0.0.tgz", - "integrity": "sha512-tQMagCOC59EVgNZcC5zl7XqO30Wki9i9J3acbUvkaosCT6JX3EeFwJD7Qqp4MCikRnzS18WXV3BLIQ66ytu6+Q==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", + "integrity": "sha512-ASS9SamOP4TbCClsRHxIHXRfcGCnIoQqkvAzCSbZzTFLfcTqJVugB0agRgsEELsqaeWgsXv513eS116wnlSSPA==", "dev": true, - "license": "MIT", + "dependencies": { + "lodash.ismatch": "^4.4.0", + "modify-values": "^1.0.0" + }, "engines": { - "node": ">=18" + "node": ">=10" } }, "node_modules/conventional-commits-parser": { @@ -3949,78 +3952,25 @@ } }, "node_modules/conventional-recommended-bump": { - "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": { - "@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": "dist/cli/index.js" - }, - "engines": { - "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==", + "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz", + "integrity": "sha512-uiApbSiNGM/kkdL9GTOLAqC4hbptObFo4wW2QRyHsKciGAfQuLU1ShZ1BIVI/+K2BE/W1AWYQMCXAsv4dyKPaw==", "dev": true, - "license": "MIT", "dependencies": { - "meow": "^13.0.0" + "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" }, "bin": { - "conventional-commits-parser": "dist/cli/index.js" + "conventional-recommended-bump": "cli.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": ">=10" } }, "node_modules/convert-source-map": { @@ -4030,9 +3980,9 @@ "dev": true }, "node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", "dev": true, "engines": { "node": ">= 0.6" @@ -4044,6 +3994,12 @@ "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.2.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz", @@ -4085,9 +4041,9 @@ "dev": true }, "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "dependencies": { "path-key": "^3.1.0", @@ -4098,6 +4054,33 @@ "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", @@ -4108,15 +4091,23 @@ } }, "node_modules/data-uri-to-buffer": { - "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==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-5.0.1.tgz", + "integrity": "sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 14" } }, + "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_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -4167,12 +4158,48 @@ "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", @@ -4189,41 +4216,32 @@ } }, "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==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", "dev": true, - "license": "MIT", "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" }, "engines": { - "node": ">=18" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "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": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-lazy-prop": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", "dev": true, - "license": "MIT", + "dependencies": { + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" + }, "engines": { "node": ">=12" }, @@ -4231,23 +4249,175 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/defu": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", - "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "node_modules/default-browser/node_modules/execa": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", + "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", "dev": true, - "license": "MIT" + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "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" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/default-browser/node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/default-browser/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/default-browser/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/default-browser/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/default-browser/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/default-browser/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/default-browser/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_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + }, + "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==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/define-lazy-prop": { + "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, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "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==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-4.0.4.tgz", + "integrity": "sha512-MTZdZsuNxSBL92rsjx3VFWe57OpRlikyLbcx2B5Dmdv6oScqpMrvpY7zHLMymrUxo3U5+suPUMsNgW/+SZB1lg==", "dev": true, - "license": "MIT", "dependencies": { "ast-types": "^0.13.4", - "escodegen": "^2.1.0", - "esprima": "^4.0.1" + "escodegen": "^1.14.3", + "esprima": "^4.0.1", + "vm2": "^3.9.19" }, "engines": { "node": ">= 14" @@ -4275,13 +4445,6 @@ "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", @@ -4355,32 +4518,11 @@ "node": ">=8" } }, - "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/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/ee-first": { "version": "1.1.1", @@ -4413,9 +4555,9 @@ "dev": true }, "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "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" @@ -4430,34 +4572,105 @@ "is-arrayish": "^0.2.1" } }, - "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, - "engines": { - "node": ">= 0.4" - } - }, - "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==", + "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==", "dev": true, "dependencies": { - "es-errors": "^1.3.0" + "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==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/escalade": { @@ -4469,6 +4682,18 @@ "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", @@ -4488,35 +4713,76 @@ } }, "node_modules/escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "esprima": "^4.0.1", - "estraverse": "^5.2.0", - "esutils": "^2.0.2" + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" }, "bin": { "escodegen": "bin/escodegen.js", "esgenerate": "bin/esgenerate.js" }, "engines": { - "node": ">=6.0" + "node": ">=4.0" }, "optionalDependencies": { "source-map": "~0.6.1" } }, - "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==", + "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==", "dev": true, - "license": "BSD-2-Clause", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, "engines": { - "node": ">=4.0" + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha512-oCOQ8AIC2ciLy/sE2ehafRBleBgDLvzGhBRRev87sP7ovnbvQfqpc3XFI0DhHey2OfVoNV91W+GPC6B3540/5Q==", + "dev": true, + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + }, + "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_modules/eslint": { @@ -4758,19 +5024,6 @@ "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", @@ -4829,37 +5082,37 @@ } }, "node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "dev": true, "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.3", + "body-parser": "1.20.1", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.7.1", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~2.0.0", + "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.3.1", + "finalhandler": "1.2.0", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", + "merge-descriptors": "1.0.1", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", + "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.13.0", + "qs": "6.11.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", + "send": "0.18.0", + "serve-static": "1.15.0", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -4868,10 +5121,6 @@ }, "engines": { "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" } }, "node_modules/express/node_modules/debug": { @@ -4889,19 +5138,11 @@ "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", @@ -4911,22 +5152,6 @@ "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", @@ -4934,17 +5159,16 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "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.8" + "micromatch": "^4.0.4" }, "engines": { "node": ">=8.6.0" @@ -4992,6 +5216,57 @@ "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", @@ -5005,9 +5280,9 @@ } }, "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" @@ -5017,13 +5292,13 @@ } }, "node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dev": true, "dependencies": { "debug": "2.6.9", - "encodeurl": "~2.0.0", + "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -5065,19 +5340,6 @@ "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", @@ -5098,9 +5360,9 @@ "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==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "funding": [ { "type": "individual", @@ -5116,6 +5378,15 @@ } } }, + "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": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", @@ -5129,6 +5400,27 @@ "node": ">= 6" } }, + "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, + "engines": { + "node": ">= 14.17" + } + }, + "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, + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -5181,9 +5473,33 @@ } }, "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "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==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5207,38 +5523,15 @@ "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.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", "dev": true, "dependencies": { - "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" + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5253,17 +5546,106 @@ "node": ">=8.0.0" } }, - "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==", + "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==", "dev": true, "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" + "@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" }, "engines": { - "node": ">= 0.4" + "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_modules/get-stream": { @@ -5278,37 +5660,67 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-uri": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.4.tgz", - "integrity": "sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==", + "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": "6.0.1", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.1.tgz", + "integrity": "sha512-7ZqONUVqaabogsYNWlYj0t3YZaL6dhuEueZXGF+/YVmf6dHmaFg8/6psJKqhx9QykIDKzpGcy2cn4oV4YC7V/Q==", "dev": true, - "license": "MIT", "dependencies": { "basic-ftp": "^5.0.2", - "data-uri-to-buffer": "^6.0.2", - "debug": "^4.3.4" + "data-uri-to-buffer": "^5.0.1", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" }, "engines": { "node": ">= 14" } }, - "node_modules/giget": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/giget/-/giget-2.0.0.tgz", - "integrity": "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==", + "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==", "dev": true, - "license": "MIT", "dependencies": { - "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" + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" }, - "bin": { - "giget": "dist/cli.mjs" + "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" } }, "node_modules/git-raw-commits": { @@ -5330,99 +5742,70 @@ "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": "8.0.0", - "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-8.0.0.tgz", - "integrity": "sha512-N7YRIklvPH3wYWAR2vysaqGLPRcpwQ0GKdlqTiVN5w1UmCdaeY3K8s6DMKRCh54DDdzyt/OAB6C8jgVtb7Y2Fg==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-4.1.1.tgz", + "integrity": "sha512-OWyMt5zBe7xFs8vglMmhM9lRQzCWL3WjHtxNNfJTMngGym7pC1kh8sP6jevfydJ6LP3ZvGxfb6ABYgPUM0mtsA==", "dev": true, - "license": "MIT", "dependencies": { - "@conventional-changelog/git-client": "^1.0.0", - "meow": "^13.0.0" + "meow": "^8.0.0", + "semver": "^6.0.0" }, "bin": { - "git-semver-tags": "src/cli.js" + "git-semver-tags": "cli.js" }, "engines": { - "node": ">=18" + "node": ">=10" } }, - "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==", + "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==", "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": { - "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" + "semver": "bin/semver.js" } }, "node_modules/git-up": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-8.1.1.tgz", - "integrity": "sha512-FDenSF3fVqBYSaJoYy1KSc2wosx0gCvKP+c+PRBht7cAaiCeQlBtfBDX9vgnNOHmdePlSFITVcn4pFfcgNvx3g==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", + "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", "dev": true, - "license": "MIT", "dependencies": { "is-ssh": "^1.4.0", - "parse-url": "^9.2.0" + "parse-url": "^8.1.0" } }, "node_modules/git-url-parse": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-16.1.0.tgz", - "integrity": "sha512-cPLz4HuK86wClEW7iDdeAKcCVlWXmrLpb2L+G9goW0Z1dtpNS6BXXSOckUTlJT/LDQViE1QZKstNORzHsLnobw==", + "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==", "dev": true, - "license": "MIT", "dependencies": { - "git-up": "^8.1.0" + "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" } }, "node_modules/glob": { @@ -5484,6 +5867,21 @@ "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", @@ -5505,22 +5903,46 @@ } }, "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, - "engines": { - "node": ">= 0.4" + "dependencies": { + "get-intrinsic": "^1.1.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/got": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", + "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "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.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" + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, "node_modules/grapheme-splitter": { "version": "1.0.4", @@ -5529,14 +5951,13 @@ "dev": true }, "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", "dev": true, - "license": "MIT", "dependencies": { "minimist": "^1.2.5", - "neo-async": "^2.6.2", + "neo-async": "^2.6.0", "source-map": "^0.6.1", "wordwrap": "^1.0.0" }, @@ -5571,6 +5992,15 @@ "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", @@ -5580,10 +6010,22 @@ "node": ">=8" } }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "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" @@ -5592,16 +6034,43 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "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==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "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==", "dev": true, "dependencies": { - "function-bind": "^1.1.2" + "has-symbols": "^1.0.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": { @@ -5622,6 +6091,12 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -5639,11 +6114,10 @@ } }, "node_modules/http-proxy-agent": { - "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==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", + "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", "dev": true, - "license": "MIT", "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -5652,19 +6126,43 @@ "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": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.0.tgz", + "integrity": "sha512-0euwPCRyAPSgGdzD1IVN9nJYHtBhJwb6XPfbpQcYbPCwrBidX6GzxmchnaF4sfF/jPb74Ojx5g4yTg3sixlyPw==", "dev": true, - "license": "MIT", "dependencies": { - "agent-base": "^7.1.2", + "agent-base": "^7.0.2", "debug": "4" }, "engines": { @@ -5707,10 +6205,30 @@ "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.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.1.tgz", + "integrity": "sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==", "dev": true, "engines": { "node": ">= 4" @@ -5732,6 +6250,15 @@ "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", @@ -5769,19 +6296,6 @@ "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", @@ -5805,52 +6319,212 @@ "dev": true }, "node_modules/inquirer": { - "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==", + "version": "9.2.6", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.6.tgz", + "integrity": "sha512-y71l237eJJKS4rl7sQcEUiMhrR0pB/ZnRMMTxLpjJhWL4hdWCT03a6jJnC1w6qIPSRZWEozuieGt3v7XaEJYFw==", "dev": true, - "license": "MIT", "dependencies": { - "@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", + "chalk": "^5.2.0", + "cli-cursor": "^3.1.0", + "cli-width": "^4.0.0", + "external-editor": "^3.0.3", + "figures": "^5.0.0", + "lodash": "^4.17.21", + "mute-stream": "1.0.0", + "ora": "^5.4.1", "run-async": "^3.0.0", - "rxjs": "^7.8.2" + "rxjs": "^7.8.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "through": "^2.3.6", + "wrap-ansi": "^6.0.1" }, "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "node": ">=14.18.0" } }, - "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==", + "node_modules/inquirer/node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", "dev": true, - "license": "MIT", "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, - "engines": { - "node": ">= 12" + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" } }, - "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==", + "node_modules/inquirer/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "dev": true, - "license": "BSD-3-Clause" + "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.1.13" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "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/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inquirer/node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inquirer/node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inquirer/node_modules/ora/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/inquirer/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, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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 }, "node_modules/ipaddr.js": { "version": "1.9.1", @@ -5861,12 +6535,53 @@ "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", @@ -5879,6 +6594,46 @@ "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", @@ -5891,12 +6646,26 @@ "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": "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" }, @@ -5951,7 +6720,6 @@ "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": { "is-docker": "^3.0.0" }, @@ -5965,12 +6733,51 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "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==", + "dev": true, + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "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" }, @@ -5978,6 +6785,39 @@ "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", @@ -5987,6 +6827,21 @@ "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", @@ -6022,12 +6877,48 @@ "node": ">=0.10.0" } }, - "node_modules/is-ssh": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.1.tgz", - "integrity": "sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg==", + "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==", "dev": true, - "license": "MIT", "dependencies": { "protocols": "^2.0.1" } @@ -6044,6 +6935,36 @@ "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", @@ -6056,35 +6977,97 @@ "node": ">=0.10.0" } }, - "node_modules/is-unicode-supported": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", - "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "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, - "license": "MIT", + "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": ">=18" + "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==", + "dev": true, + "engines": { + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "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==", + "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==", "dev": true, - "license": "MIT", "dependencies": { - "is-inside-container": "^1.0.0" + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": ">=16" + "node": ">=8" + } + }, + "node_modules/is-wsl/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==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "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", @@ -6092,11 +7075,10 @@ "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==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-6.0.0.tgz", + "integrity": "sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==", "dev": true, - "license": "MIT", "dependencies": { "lodash.capitalize": "^4.2.1", "lodash.escaperegexp": "^4.1.2", @@ -6105,7 +7087,7 @@ "lodash.uniqby": "^4.7.0" }, "engines": { - "node": "^18.17 || >=20.6.1" + "node": ">=10.13" } }, "node_modules/istanbul-lib-coverage": { @@ -6134,9 +7116,9 @@ } }, "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -6183,6 +7165,28 @@ "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.5.0", "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz", @@ -6753,16 +7757,6 @@ "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", @@ -6791,13 +7785,6 @@ "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", @@ -6810,6 +7797,18 @@ "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", @@ -6882,6 +7881,15 @@ "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", @@ -6900,6 +7908,21 @@ "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", @@ -6928,6 +7951,52 @@ "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", @@ -6959,23 +8028,13 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==", - "dev": true, - "license": "MIT" + "dev": true }, "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" + "dev": true }, "node_modules/lodash.isfunction": { "version": "3.0.9", @@ -6983,6 +8042,12 @@ "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", @@ -6993,8 +8058,7 @@ "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" + "dev": true }, "node_modules/lodash.kebabcase": { "version": "4.1.1", @@ -7042,8 +8106,7 @@ "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" + "dev": true }, "node_modules/lodash.upperfirst": { "version": "4.3.1", @@ -7052,28 +8115,26 @@ "dev": true }, "node_modules/log-symbols": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", - "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", + "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", "dev": true, - "license": "MIT", "dependencies": { - "chalk": "^5.3.0", - "is-unicode-supported": "^1.3.0" + "chalk": "^5.0.0", + "is-unicode-supported": "^1.1.0" }, "engines": { - "node": ">=18" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/log-symbols/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, - "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -7081,14 +8142,13 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "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==", + "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==", "dev": true, - "license": "MIT", "engines": { - "node": ">=12" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -7107,11 +8167,10 @@ } }, "node_modules/macos-release": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-3.3.0.tgz", - "integrity": "sha512-tPJQ1HeyiU2vRruNGhZ+VleWuMQRro8iFtJxYgnS4NQe+EukKF6aGiIT+7flZhISAt2iaXBCfFGvAyif7/f8nQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-3.2.0.tgz", + "integrity": "sha512-fSErXALFNsnowREYZ49XCdOHF8wOPWuFOGQrAhP7x5J/BqQv+B02cNsTykGpDgRVx43EKg++6ANmTaGTtW+hUA==", "dev": true, - "license": "MIT", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -7135,9 +8194,9 @@ } }, "node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -7170,15 +8229,6 @@ "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", @@ -7235,13 +8285,10 @@ } }, "node_modules/merge-descriptors": { - "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" - } + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "dev": true }, "node_modules/merge-stream": { "version": "2.0.0", @@ -7268,12 +8315,12 @@ } }, "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "dependencies": { - "braces": "^3.0.3", + "braces": "^3.0.2", "picomatch": "^2.3.1" }, "engines": { @@ -7320,14 +8367,13 @@ "node": ">=6" } }, - "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==", + "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==", "dev": true, - "license": "MIT", "engines": { - "node": ">=18" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -7377,19 +8423,27 @@ "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": "2.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", - "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", "dev": true, - "license": "ISC", "engines": { - "node": "^18.17.0 || >=20.5.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/mylas": { @@ -7430,15 +8484,13 @@ "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, - "license": "MIT" + "dev": true }, "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" } @@ -7448,7 +8500,6 @@ "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" }, @@ -7464,7 +8515,6 @@ "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" }, @@ -7487,6 +8537,25 @@ "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", @@ -7506,13 +8575,6 @@ } } }, - "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", @@ -7549,6 +8611,18 @@ "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", @@ -7561,38 +8635,35 @@ "node": ">=8" } }, - "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==", + "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, - "license": "MIT", - "dependencies": { - "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" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "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==", + "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, - "license": "MIT" + "engines": { + "node": ">= 0.4" + } }, - "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==", + "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==", "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, "engines": { "node": ">= 0.4" }, @@ -7600,13 +8671,6 @@ "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", @@ -7643,19 +8707,18 @@ } }, "node_modules/open": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/open/-/open-10.1.2.tgz", - "integrity": "sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", "dev": true, - "license": "MIT", "dependencies": { - "default-browser": "^5.2.1", + "default-browser": "^4.0.0", "define-lazy-prop": "^3.0.0", "is-inside-container": "^1.0.0", - "is-wsl": "^3.1.0" + "is-wsl": "^2.2.0" }, "engines": { - "node": ">=18" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -7679,35 +8742,33 @@ } }, "node_modules/ora": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", - "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-6.3.1.tgz", + "integrity": "sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ==", "dev": true, - "license": "MIT", "dependencies": { - "chalk": "^5.3.0", - "cli-cursor": "^5.0.0", - "cli-spinners": "^2.9.2", + "chalk": "^5.0.0", + "cli-cursor": "^4.0.0", + "cli-spinners": "^2.6.1", "is-interactive": "^2.0.0", - "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" + "is-unicode-supported": "^1.1.0", + "log-symbols": "^5.1.0", + "stdin-discarder": "^0.1.0", + "strip-ansi": "^7.0.1", + "wcwidth": "^1.0.1" }, "engines": { - "node": ">=18" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/ora/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, - "license": "MIT", "engines": { "node": ">=12" }, @@ -7716,11 +8777,10 @@ } }, "node_modules/ora/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, - "license": "MIT", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -7728,26 +8788,32 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "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==", + "node_modules/ora/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==", "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" + "restore-cursor": "^4.0.0" }, "engines": { - "node": ">=18" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/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==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -7758,7 +8824,6 @@ "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" }, @@ -7770,17 +8835,16 @@ } }, "node_modules/os-name": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-6.0.0.tgz", - "integrity": "sha512-bv608E0UX86atYi2GMGjDe0vF/X1TJjemNS8oEW6z22YW1Rc3QykSYoGfkQbX0zZX9H0ZB6CQP/3GTf1I5hURg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-5.1.0.tgz", + "integrity": "sha512-YEIoAnM6zFmzw3PQ201gCVCIWbXNyKObGlVvpAVvraAeOHnlYVKFssbA/riRX5R40WA6kKrZ7Dr7dWzO3nKSeQ==", "dev": true, - "license": "MIT", "dependencies": { - "macos-release": "^3.2.0", - "windows-release": "^6.0.0" + "macos-release": "^3.1.0", + "windows-release": "^5.0.1" }, "engines": { - "node": ">=18" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -7791,11 +8855,19 @@ "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", @@ -7836,39 +8908,55 @@ } }, "node_modules/pac-proxy-agent": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", - "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-6.0.3.tgz", + "integrity": "sha512-5Hr1KgPDoc21Vn3rsXBirwwDnF/iac1jN/zkpsOYruyT+ZgsUhUOgVwq3v9+ukjZd/yGm/0nzO1fDfl7rkGoHQ==", "dev": true, - "license": "MIT", "dependencies": { - "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.1.2", + "agent-base": "^7.0.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" + "https-proxy-agent": "^7.0.0", + "pac-resolver": "^6.0.1", + "socks-proxy-agent": "^8.0.1" }, "engines": { "node": ">= 14" } }, "node_modules/pac-resolver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", - "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-6.0.2.tgz", + "integrity": "sha512-EQpuJ2ifOjpZY5sg1Q1ZeAxvtLwR7Mj3RgY8cysPGbsRu3RBXyJFWxnMus9PScjxya/0LzvVDxNh/gl0eXBU4w==", "dev": true, - "license": "MIT", "dependencies": { - "degenerator": "^5.0.0", + "degenerator": "^4.0.4", + "ip": "^1.1.8", "netmask": "^2.0.2" }, "engines": { "node": ">= 14" } }, + "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_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -7900,27 +8988,21 @@ } }, "node_modules/parse-path": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.1.0.tgz", - "integrity": "sha512-EuCycjZtfPcjWk7KTksnJ5xPMvWGA/6i4zrLYhRG0hGvC3GPU/jGUj3Cy+ZR0v30duV3e23R95T1lE2+lsndSw==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz", + "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", "dev": true, - "license": "MIT", "dependencies": { "protocols": "^2.0.0" } }, "node_modules/parse-url": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-9.2.0.tgz", - "integrity": "sha512-bCgsFI+GeGWPAvAiUv63ZorMeif3/U0zaXABGJbOWt5OH2KCaPHF6S+0ok4aqM9RuIPGyZdx9tR9l13PsW4AYQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", + "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", "dev": true, - "license": "MIT", "dependencies": { - "@types/parse-path": "^7.0.0", "parse-path": "^7.0.0" - }, - "engines": { - "node": ">=14.13.0" } }, "node_modules/parseurl": { @@ -7966,9 +9048,9 @@ "dev": true }, "node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", "dev": true }, "node_modules/path-type": { @@ -7980,20 +9062,6 @@ "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", @@ -8012,6 +9080,15 @@ "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.6", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", @@ -8085,18 +9162,6 @@ "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", @@ -8141,6 +9206,32 @@ "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", @@ -8163,12 +9254,17 @@ "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.2", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.2.tgz", - "integrity": "sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==", - "dev": true, - "license": "MIT" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", + "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==", + "dev": true }, "node_modules/proxy-addr": { "version": "2.0.7", @@ -8184,20 +9280,19 @@ } }, "node_modules/proxy-agent": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", - "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.2.1.tgz", + "integrity": "sha512-OIbBKlRAT+ycCm6wAYIzMwPejzRtjy8F3QiDX0eKOA3e4pe3U9F/IvzcHP42bmgQxVv97juG+J8/gx+JIeCX/Q==", "dev": true, - "license": "MIT", "dependencies": { - "agent-base": "^7.1.2", + "agent-base": "^7.0.2", "debug": "^4.3.4", - "http-proxy-agent": "^7.0.1", - "https-proxy-agent": "^7.0.6", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.1.0", + "pac-proxy-agent": "^6.0.3", "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.5" + "socks-proxy-agent": "^8.0.1" }, "engines": { "node": ">= 14" @@ -8208,7 +9303,6 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, - "license": "ISC", "engines": { "node": ">=12" } @@ -8227,6 +9321,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==", + "dev": true, + "dependencies": { + "escape-goat": "^4.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/pure-rand": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", @@ -8254,12 +9363,12 @@ } }, "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dev": true, "dependencies": { - "side-channel": "^1.0.6" + "side-channel": "^1.0.4" }, "engines": { "node": ">=0.6" @@ -8313,9 +9422,9 @@ } }, "node_modules/raw-body": { - "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==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "dev": true, "dependencies": { "bytes": "3.1.2", @@ -8327,15 +9436,28 @@ "node": ">= 0.8" } }, - "node_modules/rc9": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz", - "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==", + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, - "license": "MIT", "dependencies": { - "defu": "^6.1.4", - "destr": "^2.0.3" + "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" } }, "node_modules/react-is": { @@ -8344,110 +9466,6 @@ "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", @@ -8560,9 +9578,9 @@ } }, "node_modules/read-pkg/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "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" @@ -8603,6 +9621,18 @@ "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", @@ -8616,6 +9646,23 @@ "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", @@ -8628,171 +9675,355 @@ "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/release-it": { - "version": "19.0.2", - "resolved": "https://registry.npmjs.org/release-it/-/release-it-19.0.2.tgz", - "integrity": "sha512-tGRCcKeXNOMrK9Qe+ZIgQiMlQgjV8PLxZjTq1XGlCk5u1qPgx+Pps0i8HIt667FDt0wLjFtvn5o9ItpitKnVUA==", + "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, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/webpro" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/webpro" - } - ], - "license": "MIT", "dependencies": { - "@nodeutils/defaults-deep": "1.1.0", - "@octokit/rest": "21.1.1", - "@phun-ky/typeof": "1.2.8", + "@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.11.0", + "resolved": "https://registry.npmjs.org/release-it/-/release-it-15.11.0.tgz", + "integrity": "sha512-lZwoGEnKYKwGnfxxlA7vtR7vvozPrOSsIgQaHO4bgQ5ARbG3IA6Dmo0IVusv6nR1KmnjH70QIeNAgsWs6Ji/tw==", + "dev": true, + "dependencies": { + "@iarna/toml": "2.2.5", + "@octokit/rest": "19.0.11", "async-retry": "1.3.3", - "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", + "chalk": "5.2.0", + "cosmiconfig": "8.1.3", + "execa": "7.1.1", + "git-url-parse": "13.1.0", + "globby": "13.1.4", + "got": "12.6.1", + "inquirer": "9.2.6", + "is-ci": "3.0.1", + "issue-parser": "6.0.0", + "lodash": "4.17.21", + "mime-types": "2.1.35", "new-github-release-url": "2.0.0", - "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", + "node-fetch": "3.3.1", + "open": "9.1.0", + "ora": "6.3.1", + "os-name": "5.1.0", + "promise.allsettled": "1.0.6", + "proxy-agent": "6.2.1", + "semver": "7.5.1", + "shelljs": "0.8.5", + "update-notifier": "6.0.2", "url-join": "5.0.0", - "wildcard-match": "5.1.4", + "wildcard-match": "5.1.2", "yargs-parser": "21.1.1" }, "bin": { "release-it": "bin/release-it.js" }, "engines": { - "node": "^20.12.0 || >=22.0.0" + "node": ">=14.9" } }, "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, - "license": "MIT" + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", + "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==", + "dev": true }, "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==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz", + "integrity": "sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==", "dev": true, - "license": "MIT", "dependencies": { - "@octokit/types": "^13.10.0" + "@octokit/tsconfig": "^1.0.2", + "@octokit/types": "^9.2.3" }, "engines": { - "node": ">= 18" + "node": ">= 14" }, "peerDependencies": { - "@octokit/core": ">=6" - } - }, - "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, - "license": "MIT", - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@octokit/core": ">=6" + "@octokit/core": ">=4" } }, "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==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.2.3.tgz", + "integrity": "sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA==", "dev": true, - "license": "MIT", "dependencies": { - "@octokit/types": "^13.10.0" + "@octokit/types": "^10.0.0" }, "engines": { - "node": ">= 18" + "node": ">= 14" }, "peerDependencies": { - "@octokit/core": ">=6" + "@octokit/core": ">=3" + } + }, + "node_modules/release-it/node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz", + "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==", + "dev": true, + "dependencies": { + "@octokit/openapi-types": "^18.0.0" } }, "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==", + "version": "19.0.11", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.11.tgz", + "integrity": "sha512-m2a9VhaP5/tUw8FwfnW2ICXlXpLPIqxtg3XcAiGMLj/Xhw3RSBfZ8le/466ktO1Gcjr8oXudGnHhxV1TXJgFxw==", "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" + "@octokit/core": "^4.2.1", + "@octokit/plugin-paginate-rest": "^6.1.2", + "@octokit/plugin-request-log": "^1.0.4", + "@octokit/plugin-rest-endpoint-methods": "^7.1.2" }, "engines": { - "node": ">= 18" + "node": ">= 14" } }, "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==", + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", + "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", "dev": true, - "license": "MIT", "dependencies": { - "@octokit/openapi-types": "^24.2.0" + "@octokit/openapi-types": "^18.0.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==", + "node_modules/release-it/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, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", "engines": { - "node": ">=8" + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "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==", + "node_modules/release-it/node_modules/cosmiconfig": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz", + "integrity": "sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==", "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/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", - "dev": true, - "license": "MIT", "dependencies": { - "mime-db": "^1.54.0" + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" }, "engines": { - "node": ">= 0.6" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + } + }, + "node_modules/release-it/node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/release-it/node_modules/execa": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", + "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "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" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/release-it/node_modules/globby": { + "version": "13.1.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", + "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", + "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" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/release-it/node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true, + "engines": { + "node": ">=14.18.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.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.1.tgz", + "integrity": "sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==", + "dev": true, + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "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/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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_modules/require-directory": { @@ -8830,6 +10061,12 @@ "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", @@ -8881,50 +10118,32 @@ "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==", + "dev": true, + "dependencies": { + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "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==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, - "license": "MIT", "dependencies": { - "onetime": "^7.0.0", - "signal-exit": "^4.1.0" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" }, "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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": { - "mimic-function": "^5.0.0" - }, - "engines": { - "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": ">=8" } }, "node_modules/retry": { @@ -8932,7 +10151,6 @@ "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } @@ -8963,13 +10181,15 @@ } }, "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==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", "dev": true, - "license": "MIT", + "dependencies": { + "execa": "^5.0.0" + }, "engines": { - "node": ">=18" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -8980,7 +10200,6 @@ "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" } @@ -9009,21 +10228,19 @@ } }, "node_modules/rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, - "license": "Apache-2.0", "dependencies": { "tslib": "^2.1.0" } }, "node_modules/rxjs/node_modules/tslib": { - "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" + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==", + "dev": true }, "node_modules/safe-buffer": { "version": "5.2.1", @@ -9045,6 +10262,20 @@ } ] }, + "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", @@ -9052,11 +10283,13 @@ "dev": true }, "node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, - "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { "semver": "bin/semver.js" }, @@ -9064,10 +10297,25 @@ "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.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dev": true, "dependencies": { "debug": "2.6.9", @@ -9103,15 +10351,6 @@ "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", @@ -9119,15 +10358,15 @@ "dev": true }, "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dev": true, "dependencies": { - "encodeurl": "~2.0.0", + "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.19.0" + "send": "0.18.0" }, "engines": { "node": ">= 0.8.0" @@ -9160,73 +10399,32 @@ "node": ">=8" } }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dev": true, + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, "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==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "dev": true, "dependencies": { - "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": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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": { - "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" + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9272,42 +10470,45 @@ "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.8.4", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", - "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", "dev": true, - "license": "MIT", "dependencies": { - "ip-address": "^9.0.5", + "ip": "^2.0.0", "smart-buffer": "^4.2.0" }, "engines": { - "node": ">= 10.0.0", + "node": ">= 10.13.0", "npm": ">= 3.0.0" } }, "node_modules/socks-proxy-agent": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", - "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.1.tgz", + "integrity": "sha512-59EjPbbgg8U3x62hhKOFVAmySQUcfRQ4C7Q/D5sEHnZTQRrQlNKINks44DMR1gwXp0p4LaVIeccX2KHTTcHVqQ==", "dev": true, - "license": "MIT", "dependencies": { - "agent-base": "^7.1.2", + "agent-base": "^7.0.1", "debug": "^4.3.4", - "socks": "^2.8.3" + "socks": "^2.7.1" }, "engines": { "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", @@ -9359,6 +10560,18 @@ "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", @@ -9405,13 +10618,15 @@ } }, "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==", + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.1.0.tgz", + "integrity": "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==", "dev": true, - "license": "MIT", + "dependencies": { + "bl": "^5.0.0" + }, "engines": { - "node": ">=18" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -9453,6 +10668,34 @@ "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", @@ -9575,56 +10818,16 @@ "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==", + "node_modules/titleize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", "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" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/tmp": { @@ -9632,7 +10835,6 @@ "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" }, @@ -9646,6 +10848,15 @@ "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", @@ -9733,6 +10944,21 @@ } } }, + "node_modules/ts-jest/node_modules/semver": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/ts-node": { "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", @@ -9891,12 +11117,34 @@ "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, - "license": "MIT" + "dependencies": { + "is-typedarray": "^1.0.0" + } }, "node_modules/typescript": { "version": "4.9.4", @@ -9912,11 +11160,10 @@ } }, "node_modules/uglify-js": { - "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==", + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", "dev": true, - "license": "BSD-2-Clause", "optional": true, "bin": { "uglifyjs": "bin/uglifyjs" @@ -9925,24 +11172,31 @@ "node": ">=0.8.0" } }, - "node_modules/undici": { - "version": "6.21.2", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.2.tgz", - "integrity": "sha512-uROZWze0R0itiAKVPsYhFov9LxrPMHLMEQFszeI2gCN6bnIIZ8twzBCJcN2LJrBBLfrP0t1FW0g+JmKVl8Vk1g==", + "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==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=18.17" + "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" } }, - "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==", + "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==", "dev": true, - "license": "MIT", + "dependencies": { + "crypto-random-string": "^4.0.0" + }, "engines": { - "node": ">=18" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -9970,6 +11224,15 @@ "node": ">= 0.8" } }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/update-browserslist-db": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", @@ -10000,6 +11263,46 @@ "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", @@ -10014,7 +11317,6 @@ "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" } @@ -10087,6 +11389,22 @@ "node": ">= 0.8" } }, + "node_modules/vm2": { + "version": "3.9.19", + "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.19.tgz", + "integrity": "sha512-J637XF0DHDMV57R6JyVsTak7nIL8gy5KH4r1HiwWLf/4GBbb5MKL5y7LpmF4A8E2nR6XmzpmMFQ7V7ppPTmUQg==", + "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", @@ -10096,6 +11414,24 @@ "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", @@ -10125,110 +11461,120 @@ "node": ">= 8" } }, - "node_modules/wildcard-match": { - "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==", + "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, - "license": "ISC" + "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 }, "node_modules/windows-release": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-6.0.1.tgz", - "integrity": "sha512-MS3BzG8QK33dAyqwxfYJCJ03arkwKaddUOvvnnlFdXLudflsQF6I8yAxrLBeQk4yO8wjdH/+ax0YzxJEDrOftg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-5.1.1.tgz", + "integrity": "sha512-NMD00arvqcq2nwqc5Q6KtrSRHK+fVD31erE5FEMahAw5PmVCgD7MUXodq3pdZSUkqA9Cda2iWx6s1XYwiJWRmw==", "dev": true, - "license": "MIT", "dependencies": { - "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" + "execa": "^5.1.1" }, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" @@ -10237,67 +11583,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "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": ">=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, - "license": "MIT" + "dev": true }, "node_modules/wrap-ansi": { "version": "7.0.0", @@ -10340,12 +11630,33 @@ "integrity": "sha512-UmFXIPU+9Eg3E9m/728Bii0lAIuoc+6nbrNUKaRPJOFp91ih44qqGlWtxMB6kXFrRD6po+86ksHM5XHCfk6iPw==", "dev": true }, + "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/xml": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", "dev": true }, + "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", @@ -10408,19 +11719,6 @@ "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": { @@ -10458,14 +11756,12 @@ } }, "@babel/code-frame": { - "version": "7.26.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", - "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.25.9", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@babel/highlight": "^7.22.5" } }, "@babel/compat-data": { @@ -10504,20 +11800,20 @@ "dev": true }, "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, "@babel/generator": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz", - "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz", + "integrity": "sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==", "dev": true, "requires": { - "@babel/types": "^7.23.0", + "@babel/types": "^7.22.5", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -10546,9 +11842,9 @@ } }, "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, "yallist": { @@ -10560,19 +11856,19 @@ } }, "@babel/helper-environment-visitor": { - "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==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", "dev": true }, "@babel/helper-function-name": { - "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==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", "dev": true, "requires": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" } }, "@babel/helper-hoist-variables": { @@ -10625,24 +11921,24 @@ } }, "@babel/helper-split-export-declaration": { - "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==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz", + "integrity": "sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==", "dev": true, "requires": { "@babel/types": "^7.22.5" } }, "@babel/helper-string-parser": { - "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==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "dev": true }, "@babel/helper-validator-identifier": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", - "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", "dev": true }, "@babel/helper-validator-option": { @@ -10652,23 +11948,90 @@ "dev": true }, "@babel/helpers": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.0.tgz", - "integrity": "sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.5.tgz", + "integrity": "sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==", "dev": true, "requires": { - "@babel/template": "^7.27.0", - "@babel/types": "^7.27.0" + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" + } + }, + "@babel/highlight": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.22.5", + "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/parser": { - "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" - } + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz", + "integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==", + "dev": true }, "@babel/plugin-syntax-async-generators": { "version": "7.8.4", @@ -10797,30 +12160,30 @@ } }, "@babel/template": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", - "integrity": "sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", "dev": true, "requires": { - "@babel/code-frame": "^7.26.2", - "@babel/parser": "^7.27.0", - "@babel/types": "^7.27.0" + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" } }, "@babel/traverse": { - "version": "7.23.2", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz", - "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.5.tgz", + "integrity": "sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==", "dev": true, "requires": { - "@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/code-frame": "^7.22.5", + "@babel/generator": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", "@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", + "@babel/helper-split-export-declaration": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -10834,13 +12197,14 @@ } }, "@babel/types": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.0.tgz", - "integrity": "sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.25.9", - "@babel/helper-validator-identifier": "^7.25.9" + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" } }, "@bcoe/v8-coverage": { @@ -11143,6 +12507,17 @@ "@gitbeaker/requester-utils": "^39.1.0", "qs": "^6.11.1", "xcase": "^2.0.1" + }, + "dependencies": { + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + } } }, "@gitbeaker/requester-utils": { @@ -11153,6 +12528,17 @@ "requires": { "qs": "^6.11.1", "xcase": "^2.0.1" + }, + "dependencies": { + "qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + } } }, "@gitbeaker/rest": { @@ -11189,189 +12575,17 @@ "dev": true }, "@hutson/parse-repository-url": { - "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==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-3.0.2.tgz", + "integrity": "sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==", "dev": true }, - "@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==", + "@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 }, - "@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", @@ -11782,83 +12996,67 @@ "fastq": "^1.6.0" } }, - "@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, + "@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==", "requires": { - "lodash": "^4.15.0" + "@octokit/types": "^8.0.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": "6.1.5", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-6.1.5.tgz", - "integrity": "sha512-vvmsN0r7rguA+FySiCsbaTTobSftpIDIpPW81trAmsv9TGxg3YCujAxRYp/Uy8xmDgYCzzgulG62H7KYUFmeIg==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.4.tgz", + "integrity": "sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==", "requires": { - "@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" + "@octokit/auth-token": "^3.0.0", + "@octokit/graphql": "^5.0.0", + "@octokit/request": "^6.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.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==" + "@octokit/openapi-types": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", + "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==" }, - "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/types": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", + "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "requires": { + "@octokit/openapi-types": "^18.0.0" + } } } }, "@octokit/endpoint": { - "version": "10.1.4", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-10.1.4.tgz", - "integrity": "sha512-OlYOlZIsfEVZm5HCSR8aSg02T2lbUWOsCQoPKfTXJwDzcHQBrVBGdGXb89dv2Kw2ToZaRtudp8O3ZIYoaOjKlA==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.3.tgz", + "integrity": "sha512-57gRlb28bwTsdNXq+O3JTQ7ERmBTuik9+LelgcLIVfYwf235VHbN9QNo4kXExtp/h8T423cR5iJThKtFYxC7Lw==", "requires": { - "@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/types": "^8.0.0", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" } }, "@octokit/graphql": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-8.2.2.tgz", - "integrity": "sha512-Yi8hcoqsrXGdt0yObxbebHXFOiUA+2v3n53epuOg1QUgOB6c4XzvisBNVXJSl8RYA5KrDuSL2yq9Qmqe5N0ryA==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.4.tgz", + "integrity": "sha512-amO1M5QUQgYQo09aStR/XO7KAl13xpigcy/kI8/N1PnZYSS69fgte+xA4+c2DISKqUZfsh0wwjc2FaCt99L41A==", "requires": { - "@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/request": "^6.0.0", + "@octokit/types": "^8.0.0", + "universal-user-agent": "^6.0.0" } }, "@octokit/openapi-types": { - "version": "25.0.0", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-25.0.0.tgz", - "integrity": "sha512-FZvktFu7HfOIJf2BScLKIEYjDsw6RKc7rBJCdvCTfKsVnx2GEB/Nbzjr29DUdb7vQhlzS/j8qDzdditP0OC6aw==" + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-14.0.0.tgz", + "integrity": "sha512-HNWisMYlR8VCnNurDU6os2ikx0s0VyEjDYHNS/h4cgb8DeOxQ0n72HyinUtdDVxJhFy3FWLGl0DJhfEWk3P5Iw==" }, "@octokit/openapi-types-ghec": { "version": "14.0.0", @@ -11920,30 +13118,26 @@ } }, "@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==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.2.tgz", + "integrity": "sha512-6VDqgj0HMc2FUX2awIs+sM6OwLgwHvAi4KCK3mT2H2IKRt6oH9d0fej5LluF5mck1lRR/rFWN0YIDSYXYSylbw==", "requires": { - "@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/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/request-error": { - "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==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.2.tgz", + "integrity": "sha512-WMNOFYrSaX8zXWoJg9u/pKgWPo94JXilMLb2VManNOby9EZxrQaBe/QSC4a1TzpAlpxofg2X/jMnCyZgL6y7eg==", "requires": { - "@octokit/types": "^14.0.0" + "@octokit/types": "^8.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" } }, "@octokit/rest": { @@ -12037,12 +13231,18 @@ } } }, + "@octokit/tsconfig": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@octokit/tsconfig/-/tsconfig-1.0.2.tgz", + "integrity": "sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==", + "dev": true + }, "@octokit/types": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-14.0.0.tgz", - "integrity": "sha512-VVmZP0lEhbo2O1pdq63gZFiGCKkm8PPp8AUOijlwPO6hojEVjspA0MWKP7E4hbvGxzFKNqKr6p0IYtOH/Wf/zA==", + "version": "8.2.1", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-8.2.1.tgz", + "integrity": "sha512-8oWMUji8be66q2B9PmEIUyQm00VPDPun07umUWSaCwxmeaquFBro4Hcc3ruVoDo3zkQyZBlRvhIMEYS3pBhanw==", "requires": { - "@octokit/openapi-types": "^25.0.0" + "@octokit/openapi-types": "^14.0.0" } }, "@octokit/webhooks-types": { @@ -12051,23 +13251,35 @@ "integrity": "sha512-Yq46asTPdEyrroCSBLRvcwNBsztiDHHvJ3+//2PhVbLSKp6kkj7NkjA3fyrpCrdlANj8REZSfus60v96EmlxCA==", "dev": true }, - "@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 + "@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" + } }, "@release-it/conventional-changelog": { - "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==", + "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==", "dev": true, "requires": { "concat-stream": "^2.0.0", - "conventional-changelog": "^6.0.0", - "conventional-recommended-bump": "^10.0.0", - "git-semver-tags": "^8.0.0", - "semver": "^7.6.3" + "conventional-changelog": "^3.1.25", + "conventional-recommended-bump": "^6.1.0", + "semver": "7.3.8" } }, "@sinclair/typebox": { @@ -12076,6 +13288,12 @@ "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", "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==", + "dev": true + }, "@sinonjs/commons": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", @@ -12094,11 +13312,14 @@ "@sinonjs/commons": "^3.0.0" } }, - "@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 + "@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" + } }, "@tsconfig/node10": { "version": "1.0.9", @@ -12183,6 +13404,12 @@ "@types/node": "*" } }, + "@types/http-cache-semantics": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", + "dev": true + }, "@types/istanbul-lib-coverage": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", @@ -12236,15 +13463,9 @@ "dev": true }, "@types/normalize-package-data": { - "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==", + "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 }, "@types/prettier": { @@ -12254,9 +13475,9 @@ "dev": true }, "@types/semver": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.0.tgz", - "integrity": "sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==", + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", "dev": true }, "@types/stack-utils": { @@ -12420,10 +13641,13 @@ "dev": true }, "agent-base": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", - "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", - "dev": true + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dev": true, + "requires": { + "debug": "^4.3.4" + } }, "ajv": { "version": "8.11.2", @@ -12437,6 +13661,15 @@ "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", @@ -12509,6 +13742,19 @@ "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", @@ -12525,9 +13771,9 @@ }, "dependencies": { "tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==", "dev": true } } @@ -12546,12 +13792,18 @@ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, + "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 + }, "axios": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", - "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", "requires": { - "follow-redirects": "^1.15.6", + "follow-redirects": "^1.15.0", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -12632,10 +13884,16 @@ "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==", + "dev": true + }, "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==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.3.tgz", + "integrity": "sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==", "dev": true }, "before-after-hook": { @@ -12643,28 +13901,45 @@ "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==" }, + "big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true + }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "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.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "dev": true, "requires": { "bytes": "3.1.2", - "content-type": "~1.0.5", + "content-type": "~1.0.4", "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.13.0", - "raw-body": "2.5.2", + "qs": "6.11.0", + "raw-body": "2.5.1", "type-is": "~1.6.18", "unpipe": "1.0.0" }, @@ -12686,6 +13961,100 @@ } } }, + "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" + } + } + } + }, + "bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, + "requires": { + "big-integer": "^1.6.44" + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -12697,12 +14066,12 @@ } }, "braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { - "fill-range": "^7.1.1" + "fill-range": "^7.0.1" } }, "browserslist": { @@ -12735,6 +14104,16 @@ "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", @@ -12742,12 +14121,12 @@ "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==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", "dev": true, "requires": { - "run-applescript": "^7.0.0" + "run-applescript": "^5.0.0" } }, "bytes": { @@ -12756,61 +14135,35 @@ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true }, - "c12": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/c12/-/c12-3.0.3.tgz", - "integrity": "sha512-uC3MacKBb0Z15o5QWCHvHWj5Zv34pGQj9P+iXKSpTuSGFS0KKhUWf4t9AJ+gWjYOdmWCPEGpEzm8sS0iqbpo1w==", + "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.12", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.12.tgz", + "integrity": "sha512-qtWGB5kn2OLjx47pYUkWicyOpK1vy9XZhq8yRTXOy+KAmjjESSRLx6SiExnnaGGUP1NM6/vmygMu0fGylNh9tw==", "dev": true, "requires": { - "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 - } + "@types/http-cache-semantics": "^4.0.1", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.2", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" } }, - "call-bind-apply-helpers": { + "call-bind": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dev": true, "requires": { - "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" + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" } }, "callsites": { @@ -12897,40 +14250,37 @@ "integrity": "sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog==", "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" - } - }, "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-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==", + "dev": true + }, "cli-cursor": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", - "integrity": "sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, "requires": { - "restore-cursor": "^5.0.0" + "restore-cursor": "^3.1.0" } }, "cli-spinners": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", - "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", + "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", "dev": true }, "cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "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==", "dev": true }, "cliui": { @@ -12944,6 +14294,12 @@ "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", @@ -13012,17 +14368,51 @@ "typedarray": "^0.0.6" } }, - "confbox": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", - "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", - "dev": true + "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" + } }, - "consola": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", - "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" + } + } + } }, "content-disposition": { "version": "0.5.4", @@ -13034,46 +14424,39 @@ } }, "content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", "dev": true }, "conventional-changelog": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-6.0.0.tgz", - "integrity": "sha512-tuUH8H/19VjtD9Ig7l6TQRh+Z0Yt0NZ6w/cCkkyzUbGQTnUEmKfGtkC9gGfVgCfOL1Rzno5NgNF4KY8vR+Jo3w==", + "version": "3.1.25", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.25.tgz", + "integrity": "sha512-ryhi3fd1mKf3fSjbLXOfK2D06YwKNic1nC9mWqybBHdObPd8KJ2vjaXZfYj1U23t+V8T8n0d7gwnc9XbIdFbyQ==", "dev": true, "requires": { - "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" + "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" }, "dependencies": { - "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" - } - }, "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==", + "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==", "dev": true, "requires": { - "compare-func": "^2.0.0" + "compare-func": "^2.0.0", + "lodash": "^4.17.15", + "q": "^1.5.1" } } } @@ -13089,16 +14472,22 @@ } }, "conventional-changelog-atom": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-5.0.0.tgz", - "integrity": "sha512-WfzCaAvSCFPkznnLgLnfacRAzjgqjLUjvf3MftfsJzQdDICqkOOpcMtdJF3wTerxSpv2IAAjX8doM3Vozqle3g==", - "dev": true + "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" + } }, "conventional-changelog-codemirror": { - "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 + "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" + } }, "conventional-changelog-conventionalcommits": { "version": "5.0.0", @@ -13112,180 +14501,226 @@ } }, "conventional-changelog-core": { - "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==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-4.2.4.tgz", + "integrity": "sha512-gDVS+zVJHE2v4SLc6B0sLsPiloR0ygU7HaDW14aNJE1v4SlqJPILPl/aJC7YdtRE4CybBf8gDwObBvKha8Xlyg==", "dev": true, "requires": { - "@hutson/parse-repository-url": "^5.0.0", "add-stream": "^1.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" + "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" }, "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==", + "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==", "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" - } - }, - "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" + "locate-path": "^2.0.0" } }, "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==", + "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 }, - "meow": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", - "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "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==", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "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==", "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==", + "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 + }, + "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, "requires": { - "hosted-git-info": "^7.0.0", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4" + "pify": "^3.0.0" } }, - "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" - } + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true }, "read-pkg": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-9.0.1.tgz", - "integrity": "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", "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" + "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" + } + } } }, - "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==", + "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==", "dev": true } } }, "conventional-changelog-ember": { - "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": "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": "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": "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": "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==", + "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": { - "compare-func": "^2.0.0" + "q": "^1.5.1" + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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==", + "dev": true, + "requires": { + "compare-func": "^2.0.0", + "q": "^1.5.1" } }, "conventional-changelog-preset-loader": { - "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==", + "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==", "dev": true }, "conventional-changelog-writer": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-8.0.1.tgz", - "integrity": "sha512-hlqcy3xHred2gyYg/zXSMXraY2mjAYYo0msUCpK+BGyaVJMFCKWVXPIHiaacGO2GGp13kvHWXFhYmxT4QQqW3Q==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-5.0.1.tgz", + "integrity": "sha512-5WsuKUfxW7suLblAbFnxAcrvf6r+0b7GvNaWUwUIk0bXMnENP/PEieGKVUQrjPqwPT4o3EPAASBXiY6iHooLOQ==", "dev": true, "requires": { - "conventional-commits-filter": "^5.0.0", + "conventional-commits-filter": "^2.0.7", + "dateformat": "^3.0.0", "handlebars": "^4.7.7", - "meow": "^13.0.0", - "semver": "^7.5.2" + "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" }, "dependencies": { - "meow": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", - "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, "conventional-commits-filter": { - "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 + "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" + } }, "conventional-commits-parser": { "version": "3.2.4", @@ -13302,43 +14737,19 @@ } }, "conventional-recommended-bump": { - "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==", + "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==", "dev": true, "requires": { - "@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 - } + "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" } }, "convert-source-map": { @@ -13348,9 +14759,9 @@ "dev": true }, "cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", "dev": true }, "cookie-signature": { @@ -13359,6 +14770,12 @@ "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.2.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz", @@ -13385,9 +14802,9 @@ "dev": true }, "cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { "path-key": "^3.1.0", @@ -13395,6 +14812,23 @@ "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", @@ -13402,9 +14836,15 @@ "dev": true }, "data-uri-to-buffer": { - "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==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-5.0.1.tgz", + "integrity": "sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg==", + "dev": true + }, + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", "dev": true }, "debug": { @@ -13439,12 +14879,35 @@ } } }, + "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", @@ -13458,19 +14921,107 @@ "dev": true }, "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==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", "dev": true, "requires": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" + }, + "dependencies": { + "execa": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", + "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "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" + } + }, + "human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "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.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 + }, + "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 + } } }, "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==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", + "dev": true, + "requires": { + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" + } + }, + "defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "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==", "dev": true }, "define-lazy-prop": { @@ -13479,21 +15030,26 @@ "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", "dev": true }, - "defu": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", - "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", - "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" + } }, "degenerator": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", - "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-4.0.4.tgz", + "integrity": "sha512-MTZdZsuNxSBL92rsjx3VFWe57OpRlikyLbcx2B5Dmdv6oScqpMrvpY7zHLMymrUxo3U5+suPUMsNgW/+SZB1lg==", "dev": true, "requires": { "ast-types": "^0.13.4", - "escodegen": "^2.1.0", - "esprima": "^4.0.1" + "escodegen": "^1.14.3", + "esprima": "^4.0.1", + "vm2": "^3.9.19" } }, "delayed-stream": { @@ -13512,12 +15068,6 @@ "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", @@ -13569,23 +15119,12 @@ "is-obj": "^2.0.0" } }, - "dotenv": { - "version": "16.5.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz", - "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==", + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "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", @@ -13611,9 +15150,9 @@ "dev": true }, "encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "dev": true }, "error-ex": { @@ -13625,25 +15164,87 @@ "is-arrayish": "^0.2.1" } }, - "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-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-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==", + "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": { - "es-errors": "^1.3.0" + "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==", + "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-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, + "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" } }, "escalade": { @@ -13652,6 +15253,12 @@ "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", @@ -13665,22 +15272,56 @@ "dev": true }, "escodegen": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", - "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", "dev": true, "requires": { "esprima": "^4.0.1", - "estraverse": "^5.2.0", + "estraverse": "^4.2.0", "esutils": "^2.0.2", + "optionator": "^0.8.1", "source-map": "~0.6.1" }, "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "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.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha512-oCOQ8AIC2ciLy/sE2ehafRBleBgDLvzGhBRRev87sP7ovnbvQfqpc3XFI0DhHey2OfVoNV91W+GPC6B3540/5Q==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + } + }, + "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 + }, + "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" + } } } }, @@ -13863,12 +15504,6 @@ "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", @@ -13912,37 +15547,37 @@ } }, "express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "dev": true, "requires": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.3", + "body-parser": "1.20.1", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.7.1", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~2.0.0", + "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.3.1", + "finalhandler": "1.2.0", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", + "merge-descriptors": "1.0.1", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", + "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.13.0", + "qs": "6.11.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", + "send": "0.18.0", + "serve-static": "1.15.0", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -13967,12 +15602,6 @@ } } }, - "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", @@ -13984,11 +15613,6 @@ "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", @@ -13996,16 +15620,16 @@ "dev": true }, "fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", "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.8" + "micromatch": "^4.0.4" }, "dependencies": { "glob-parent": { @@ -14049,6 +15673,34 @@ "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", @@ -14059,22 +15711,22 @@ } }, "fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dev": true, "requires": { "to-regex-range": "^5.0.1" } }, "finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dev": true, "requires": { "debug": "2.6.9", - "encodeurl": "~2.0.0", + "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -14109,12 +15761,6 @@ "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", @@ -14132,9 +15778,18 @@ "dev": true }, "follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==" + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + }, + "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" + } }, "form-data": { "version": "4.0.0", @@ -14146,6 +15801,21 @@ "mime-types": "^2.1.12" } }, + "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, + "requires": { + "fetch-blob": "^3.1.2" + } + }, "forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -14182,9 +15852,27 @@ "optional": true }, "function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "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==", "dev": true }, "gensync": { @@ -14199,28 +15887,15 @@ "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.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", "dev": true, "requires": { - "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" + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" } }, "get-package-type": { @@ -14229,14 +15904,96 @@ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true }, - "get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "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==", "dev": true, "requires": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" + "@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 + } } }, "get-stream": { @@ -14245,29 +16002,54 @@ "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==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, "get-uri": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.4.tgz", - "integrity": "sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.1.tgz", + "integrity": "sha512-7ZqONUVqaabogsYNWlYj0t3YZaL6dhuEueZXGF+/YVmf6dHmaFg8/6psJKqhx9QykIDKzpGcy2cn4oV4YC7V/Q==", "dev": true, "requires": { "basic-ftp": "^5.0.2", - "data-uri-to-buffer": "^6.0.2", - "debug": "^4.3.4" - } - }, - "giget": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/giget/-/giget-2.0.0.tgz", - "integrity": "sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==", - "dev": true, - "requires": { - "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" + "data-uri-to-buffer": "^5.0.1", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" + }, + "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 + } } }, "git-raw-commits": { @@ -14283,62 +16065,60 @@ "through2": "^4.0.0" } }, - "git-semver-tags": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-8.0.0.tgz", - "integrity": "sha512-N7YRIklvPH3wYWAR2vysaqGLPRcpwQ0GKdlqTiVN5w1UmCdaeY3K8s6DMKRCh54DDdzyt/OAB6C8jgVtb7Y2Fg==", + "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": { - "@conventional-changelog/git-client": "^1.0.0", - "meow": "^13.0.0" + "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==", + "dev": true, + "requires": { + "meow": "^8.0.0", + "semver": "^6.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, - "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==", + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } }, "git-up": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/git-up/-/git-up-8.1.1.tgz", - "integrity": "sha512-FDenSF3fVqBYSaJoYy1KSc2wosx0gCvKP+c+PRBht7cAaiCeQlBtfBDX9vgnNOHmdePlSFITVcn4pFfcgNvx3g==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", + "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", "dev": true, "requires": { "is-ssh": "^1.4.0", - "parse-url": "^9.2.0" + "parse-url": "^8.1.0" } }, "git-url-parse": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-16.1.0.tgz", - "integrity": "sha512-cPLz4HuK86wClEW7iDdeAKcCVlWXmrLpb2L+G9goW0Z1dtpNS6BXXSOckUTlJT/LDQViE1QZKstNORzHsLnobw==", + "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==", "dev": true, "requires": { - "git-up": "^8.1.0" + "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" } }, "glob": { @@ -14382,6 +16162,15 @@ "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", @@ -14397,15 +16186,37 @@ } }, "gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true + "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.6.1", + "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", + "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", + "dev": true, + "requires": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "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" + } }, "graceful-fs": { - "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==" + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, "grapheme-splitter": { "version": "1.0.4", @@ -14414,13 +16225,13 @@ "dev": true }, "handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", "dev": true, "requires": { "minimist": "^1.2.5", - "neo-async": "^2.6.2", + "neo-async": "^2.6.0", "source-map": "^0.6.1", "uglify-js": "^3.1.4", "wordwrap": "^1.0.0" @@ -14441,27 +16252,54 @@ "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-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true - }, - "hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "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": { - "function-bind": "^1.1.2" + "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==", + "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==", + "dev": true, + "requires": { + "has-symbols": "^1.0.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", @@ -14477,6 +16315,12 @@ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, + "http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, "http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", @@ -14491,27 +16335,45 @@ } }, "http-proxy-agent": { - "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==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", + "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", "dev": true, "requires": { "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": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.0.tgz", + "integrity": "sha512-0euwPCRyAPSgGdzD1IVN9nJYHtBhJwb6XPfbpQcYbPCwrBidX6GzxmchnaF4sfF/jPb74Ojx5g4yTg3sixlyPw==", "dev": true, "requires": { - "agent-base": "^7.1.2", + "agent-base": "^7.0.2", "debug": "4" } }, @@ -14536,10 +16398,16 @@ "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.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.1.tgz", + "integrity": "sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==", "dev": true }, "import-fresh": { @@ -14552,6 +16420,12 @@ "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", @@ -14574,12 +16448,6 @@ "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", @@ -14603,50 +16471,195 @@ "dev": true }, "inquirer": { - "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==", + "version": "9.2.6", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.6.tgz", + "integrity": "sha512-y71l237eJJKS4rl7sQcEUiMhrR0pB/ZnRMMTxLpjJhWL4hdWCT03a6jJnC1w6qIPSRZWEozuieGt3v7XaEJYFw==", "dev": true, "requires": { - "@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", + "chalk": "^5.2.0", + "cli-cursor": "^3.1.0", + "cli-width": "^4.0.0", + "external-editor": "^3.0.3", + "figures": "^5.0.0", + "lodash": "^4.17.21", + "mute-stream": "1.0.0", + "ora": "^5.4.1", "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" + "rxjs": "^7.8.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "through": "^2.3.6", + "wrap-ansi": "^6.0.1" }, "dependencies": { - "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==", + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true + }, + "is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "requires": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "dependencies": { + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + } + } + }, + "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" + } } } }, + "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", @@ -14656,6 +16669,31 @@ "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", @@ -14665,6 +16703,15 @@ "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": "3.0.0", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", @@ -14707,18 +16754,72 @@ "is-docker": "^3.0.0" } }, + "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==", + "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-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 }, + "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", @@ -14742,10 +16843,35 @@ "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.1", - "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.1.tgz", - "integrity": "sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", + "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", "dev": true, "requires": { "protocols": "^2.0.1" @@ -14757,6 +16883,24 @@ "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", @@ -14766,21 +16910,69 @@ "text-extensions": "^1.0.0" } }, - "is-unicode-supported": { - "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-wsl": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", - "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "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": { - "is-inside-container": "^1.0.0" + "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==", + "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==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + }, + "dependencies": { + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + } + } + }, + "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", @@ -14788,9 +16980,9 @@ "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==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-6.0.0.tgz", + "integrity": "sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==", "dev": true, "requires": { "lodash.capitalize": "^4.2.1", @@ -14820,9 +17012,9 @@ }, "dependencies": { "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } @@ -14859,6 +17051,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.5.0", "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz", @@ -15297,12 +17505,6 @@ } } }, - "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", @@ -15324,18 +17526,24 @@ "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", @@ -15391,6 +17599,15 @@ "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", @@ -15403,6 +17620,15 @@ "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", @@ -15425,6 +17651,42 @@ "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", @@ -15458,18 +17720,18 @@ "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", @@ -15537,29 +17799,29 @@ "dev": true }, "log-symbols": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-6.0.0.tgz", - "integrity": "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", + "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", "dev": true, "requires": { - "chalk": "^5.3.0", - "is-unicode-supported": "^1.3.0" + "chalk": "^5.0.0", + "is-unicode-supported": "^1.1.0" }, "dependencies": { "chalk": { - "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==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "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", @@ -15570,9 +17832,9 @@ } }, "macos-release": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-3.3.0.tgz", - "integrity": "sha512-tPJQ1HeyiU2vRruNGhZ+VleWuMQRro8iFtJxYgnS4NQe+EukKF6aGiIT+7flZhISAt2iaXBCfFGvAyif7/f8nQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-3.2.0.tgz", + "integrity": "sha512-fSErXALFNsnowREYZ49XCdOHF8wOPWuFOGQrAhP7x5J/BqQv+B02cNsTykGpDgRVx43EKg++6ANmTaGTtW+hUA==", "dev": true }, "make-dir": { @@ -15585,9 +17847,9 @@ }, "dependencies": { "semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } @@ -15613,12 +17875,6 @@ "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", @@ -15659,9 +17915,9 @@ } }, "merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", "dev": true }, "merge-stream": { @@ -15683,12 +17939,12 @@ "dev": true }, "micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dev": true, "requires": { - "braces": "^3.0.3", + "braces": "^3.0.2", "picomatch": "^2.3.1" } }, @@ -15717,10 +17973,10 @@ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, - "mimic-function": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz", - "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "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==", "dev": true }, "min-indent": { @@ -15755,15 +18011,21 @@ "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": "2.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", - "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", "dev": true }, "mylas": { @@ -15831,6 +18093,12 @@ "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", @@ -15839,12 +18107,6 @@ "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", @@ -15875,6 +18137,12 @@ "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", @@ -15884,39 +18152,30 @@ "path-key": "^3.0.0" } }, - "nypm": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.6.0.tgz", - "integrity": "sha512-mn8wBFV9G9+UFHIrq+pZ2r2zL4aPau/by3kJb3cM7+5tQHMt6HGQB8FDIeKFYp8o0D2pnH6nVsO88N4AmUxIWg==", + "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==", "dev": true, "requires": { - "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 - } + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" } }, - "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", @@ -15944,15 +18203,15 @@ } }, "open": { - "version": "10.1.2", - "resolved": "https://registry.npmjs.org/open/-/open-10.1.2.tgz", - "integrity": "sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", "dev": true, "requires": { - "default-browser": "^5.2.1", + "default-browser": "^4.0.0", "define-lazy-prop": "^3.0.0", "is-inside-container": "^1.0.0", - "is-wsl": "^3.1.0" + "is-wsl": "^2.2.0" } }, "optionator": { @@ -15970,49 +18229,51 @@ } }, "ora": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/ora/-/ora-8.2.0.tgz", - "integrity": "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-6.3.1.tgz", + "integrity": "sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ==", "dev": true, "requires": { - "chalk": "^5.3.0", - "cli-cursor": "^5.0.0", - "cli-spinners": "^2.9.2", + "chalk": "^5.0.0", + "cli-cursor": "^4.0.0", + "cli-spinners": "^2.6.1", "is-interactive": "^2.0.0", - "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" + "is-unicode-supported": "^1.1.0", + "log-symbols": "^5.1.0", + "stdin-discarder": "^0.1.0", + "strip-ansi": "^7.0.1", + "wcwidth": "^1.0.1" }, "dependencies": { "ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true }, "chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "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==", + "cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", "dev": true, "requires": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" + "restore-cursor": "^4.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==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" } }, "strip-ansi": { @@ -16027,13 +18288,13 @@ } }, "os-name": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/os-name/-/os-name-6.0.0.tgz", - "integrity": "sha512-bv608E0UX86atYi2GMGjDe0vF/X1TJjemNS8oEW6z22YW1Rc3QykSYoGfkQbX0zZX9H0ZB6CQP/3GTf1I5hURg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-5.1.0.tgz", + "integrity": "sha512-YEIoAnM6zFmzw3PQ201gCVCIWbXNyKObGlVvpAVvraAeOHnlYVKFssbA/riRX5R40WA6kKrZ7Dr7dWzO3nKSeQ==", "dev": true, "requires": { - "macos-release": "^3.2.0", - "windows-release": "^6.0.0" + "macos-release": "^3.1.0", + "windows-release": "^5.0.1" } }, "os-tmpdir": { @@ -16042,6 +18303,12 @@ "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", @@ -16067,31 +18334,43 @@ "dev": true }, "pac-proxy-agent": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz", - "integrity": "sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-6.0.3.tgz", + "integrity": "sha512-5Hr1KgPDoc21Vn3rsXBirwwDnF/iac1jN/zkpsOYruyT+ZgsUhUOgVwq3v9+ukjZd/yGm/0nzO1fDfl7rkGoHQ==", "dev": true, "requires": { - "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.1.2", + "agent-base": "^7.0.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" + "https-proxy-agent": "^7.0.0", + "pac-resolver": "^6.0.1", + "socks-proxy-agent": "^8.0.1" } }, "pac-resolver": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", - "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-6.0.2.tgz", + "integrity": "sha512-EQpuJ2ifOjpZY5sg1Q1ZeAxvtLwR7Mj3RgY8cysPGbsRu3RBXyJFWxnMus9PScjxya/0LzvVDxNh/gl0eXBU4w==", "dev": true, "requires": { - "degenerator": "^5.0.0", + "degenerator": "^4.0.4", + "ip": "^1.1.8", "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", @@ -16114,21 +18393,20 @@ } }, "parse-path": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.1.0.tgz", - "integrity": "sha512-EuCycjZtfPcjWk7KTksnJ5xPMvWGA/6i4zrLYhRG0hGvC3GPU/jGUj3Cy+ZR0v30duV3e23R95T1lE2+lsndSw==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz", + "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", "dev": true, "requires": { "protocols": "^2.0.0" } }, "parse-url": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-9.2.0.tgz", - "integrity": "sha512-bCgsFI+GeGWPAvAiUv63ZorMeif3/U0zaXABGJbOWt5OH2KCaPHF6S+0ok4aqM9RuIPGyZdx9tR9l13PsW4AYQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", + "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", "dev": true, "requires": { - "@types/parse-path": "^7.0.0", "parse-path": "^7.0.0" } }, @@ -16163,9 +18441,9 @@ "dev": true }, "path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", "dev": true }, "path-type": { @@ -16174,18 +18452,6 @@ "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", @@ -16198,6 +18464,12 @@ "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.6", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", @@ -16252,17 +18524,6 @@ } } }, - "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", @@ -16297,6 +18558,26 @@ } } }, + "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", @@ -16313,10 +18594,16 @@ "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.2", - "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.2.tgz", - "integrity": "sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", + "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==", "dev": true }, "proxy-addr": { @@ -16330,19 +18617,19 @@ } }, "proxy-agent": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", - "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.2.1.tgz", + "integrity": "sha512-OIbBKlRAT+ycCm6wAYIzMwPejzRtjy8F3QiDX0eKOA3e4pe3U9F/IvzcHP42bmgQxVv97juG+J8/gx+JIeCX/Q==", "dev": true, "requires": { - "agent-base": "^7.1.2", + "agent-base": "^7.0.2", "debug": "^4.3.4", - "http-proxy-agent": "^7.0.1", - "https-proxy-agent": "^7.0.6", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.1.0", + "pac-proxy-agent": "^6.0.3", "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.5" + "socks-proxy-agent": "^8.0.1" }, "dependencies": { "lru-cache": { @@ -16364,6 +18651,15 @@ "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", @@ -16377,12 +18673,12 @@ "dev": true }, "qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dev": true, "requires": { - "side-channel": "^1.0.6" + "side-channel": "^1.0.4" } }, "queue-lit": { @@ -16410,9 +18706,9 @@ "dev": true }, "raw-body": { - "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==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "dev": true, "requires": { "bytes": "3.1.2", @@ -16421,14 +18717,24 @@ "unpipe": "1.0.0" } }, - "rc9": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz", - "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==", + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, "requires": { - "defu": "^6.1.4", - "destr": "^2.0.3" + "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 + } } }, "react-is": { @@ -16437,75 +18743,6 @@ "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", @@ -16537,9 +18774,9 @@ } }, "semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, "type-fest": { @@ -16626,6 +18863,15 @@ "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", @@ -16636,117 +18882,260 @@ "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 }, - "release-it": { - "version": "19.0.2", - "resolved": "https://registry.npmjs.org/release-it/-/release-it-19.0.2.tgz", - "integrity": "sha512-tGRCcKeXNOMrK9Qe+ZIgQiMlQgjV8PLxZjTq1XGlCk5u1qPgx+Pps0i8HIt667FDt0wLjFtvn5o9ItpitKnVUA==", + "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": { - "@nodeutils/defaults-deep": "1.1.0", - "@octokit/rest": "21.1.1", - "@phun-ky/typeof": "1.2.8", + "@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.11.0", + "resolved": "https://registry.npmjs.org/release-it/-/release-it-15.11.0.tgz", + "integrity": "sha512-lZwoGEnKYKwGnfxxlA7vtR7vvozPrOSsIgQaHO4bgQ5ARbG3IA6Dmo0IVusv6nR1KmnjH70QIeNAgsWs6Ji/tw==", + "dev": true, + "requires": { + "@iarna/toml": "2.2.5", + "@octokit/rest": "19.0.11", "async-retry": "1.3.3", - "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", + "chalk": "5.2.0", + "cosmiconfig": "8.1.3", + "execa": "7.1.1", + "git-url-parse": "13.1.0", + "globby": "13.1.4", + "got": "12.6.1", + "inquirer": "9.2.6", + "is-ci": "3.0.1", + "issue-parser": "6.0.0", + "lodash": "4.17.21", + "mime-types": "2.1.35", "new-github-release-url": "2.0.0", - "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", + "node-fetch": "3.3.1", + "open": "9.1.0", + "ora": "6.3.1", + "os-name": "5.1.0", + "promise.allsettled": "1.0.6", + "proxy-agent": "6.2.1", + "semver": "7.5.1", + "shelljs": "0.8.5", + "update-notifier": "6.0.2", "url-join": "5.0.0", - "wildcard-match": "5.1.4", + "wildcard-match": "5.1.2", "yargs-parser": "21.1.1" }, "dependencies": { "@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==", + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", + "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==", "dev": true }, "@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==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz", + "integrity": "sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==", "dev": true, "requires": { - "@octokit/types": "^13.10.0" + "@octokit/tsconfig": "^1.0.2", + "@octokit/types": "^9.2.3" } }, - "@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==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.2.3.tgz", + "integrity": "sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA==", "dev": true, "requires": { - "@octokit/types": "^13.10.0" + "@octokit/types": "^10.0.0" + }, + "dependencies": { + "@octokit/types": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz", + "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==", + "dev": true, + "requires": { + "@octokit/openapi-types": "^18.0.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==", + "version": "19.0.11", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.11.tgz", + "integrity": "sha512-m2a9VhaP5/tUw8FwfnW2ICXlXpLPIqxtg3XcAiGMLj/Xhw3RSBfZ8le/466ktO1Gcjr8oXudGnHhxV1TXJgFxw==", "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/core": "^4.2.1", + "@octokit/plugin-paginate-rest": "^6.1.2", + "@octokit/plugin-request-log": "^1.0.4", + "@octokit/plugin-rest-endpoint-methods": "^7.1.2" } }, "@octokit/types": { - "version": "13.10.0", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.10.0.tgz", - "integrity": "sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==", + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", + "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", "dev": true, "requires": { - "@octokit/openapi-types": "^24.2.0" + "@octokit/openapi-types": "^18.0.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==", + "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 }, - "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 - }, - "mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", + "cosmiconfig": { + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.1.3.tgz", + "integrity": "sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw==", "dev": true, "requires": { - "mime-db": "^1.54.0" + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" } + }, + "data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "dev": true + }, + "execa": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", + "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "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" + } + }, + "globby": { + "version": "13.1.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", + "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", + "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": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "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.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.1.tgz", + "integrity": "sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==", + "dev": true, + "requires": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + } + }, + "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 + }, + "semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "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 } } }, @@ -16773,6 +19162,12 @@ "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", @@ -16811,31 +19206,23 @@ "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", "dev": true }, - "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==", + "responselike": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", "dev": true, "requires": { - "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 - } + "lowercase-keys": "^3.0.0" + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" } }, "retry": { @@ -16860,10 +19247,13 @@ } }, "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 + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "dev": true, + "requires": { + "execa": "^5.0.0" + } }, "run-async": { "version": "3.0.0", @@ -16881,18 +19271,18 @@ } }, "rxjs": { - "version": "7.8.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", - "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", "dev": true, "requires": { "tslib": "^2.1.0" }, "dependencies": { "tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==", "dev": true } } @@ -16903,6 +19293,17 @@ "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", @@ -16910,15 +19311,27 @@ "dev": true }, "semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", - "dev": true + "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" + } }, "send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dev": true, "requires": { "debug": "2.6.9", @@ -16953,12 +19366,6 @@ } } }, - "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", @@ -16968,15 +19375,15 @@ } }, "serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dev": true, "requires": { - "encodeurl": "~2.0.0", + "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.19.0" + "send": "0.18.0" } }, "setprototypeof": { @@ -17000,52 +19407,26 @@ "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==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, "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==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "dev": true, "requires": { - "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-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": { - "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" + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" } }, "signal-exit": { @@ -17083,24 +19464,32 @@ "dev": true }, "socks": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.4.tgz", - "integrity": "sha512-D3YaD0aRxR3mEcqnidIs7ReYJFVzWdd6fXJYUM8ixcQcJRGTka/b3saV0KflYhyVJXKhb947GndU35SxYNResQ==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", "dev": true, "requires": { - "ip-address": "^9.0.5", + "ip": "^2.0.0", "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": "8.0.5", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", - "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.1.tgz", + "integrity": "sha512-59EjPbbgg8U3x62hhKOFVAmySQUcfRQ4C7Q/D5sEHnZTQRrQlNKINks44DMR1gwXp0p4LaVIeccX2KHTTcHVqQ==", "dev": true, "requires": { - "agent-base": "^7.1.2", + "agent-base": "^7.0.1", "debug": "^4.3.4", - "socks": "^2.8.3" + "socks": "^2.7.1" } }, "source-map": { @@ -17151,6 +19540,15 @@ "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", @@ -17190,10 +19588,13 @@ "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 + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.1.0.tgz", + "integrity": "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==", + "dev": true, + "requires": { + "bl": "^5.0.0" + } }, "string_decoder": { "version": "1.3.0", @@ -17225,6 +19626,28 @@ "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", @@ -17314,37 +19737,12 @@ "readable-stream": "3" } }, - "tinyexec": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.1.tgz", - "integrity": "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==", + "titleize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", "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", @@ -17360,6 +19758,12 @@ "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", @@ -17406,6 +19810,17 @@ "make-error": "1.x", "semver": "^7.5.3", "yargs-parser": "^21.0.1" + }, + "dependencies": { + "semver": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } } }, "ts-node": { @@ -17513,12 +19928,32 @@ "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", @@ -17526,23 +19961,32 @@ "dev": true }, "uglify-js": { - "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==", + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", "dev": true, "optional": true }, - "undici": { - "version": "6.21.2", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.21.2.tgz", - "integrity": "sha512-uROZWze0R0itiAKVPsYhFov9LxrPMHLMEQFszeI2gCN6bnIIZ8twzBCJcN2LJrBBLfrP0t1FW0g+JmKVl8Vk1g==", - "dev": 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" + } }, - "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 + "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" + } }, "universal-user-agent": { "version": "6.0.0", @@ -17560,6 +20004,12 @@ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true }, + "untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true + }, "update-browserslist-db": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", @@ -17570,6 +20020,36 @@ "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", @@ -17643,6 +20123,16 @@ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", "dev": true }, + "vm2": { + "version": "3.9.19", + "resolved": "https://registry.npmjs.org/vm2/-/vm2-3.9.19.tgz", + "integrity": "sha512-J637XF0DHDMV57R6JyVsTak7nIL8gy5KH4r1HiwWLf/4GBbb5MKL5y7LpmF4A8E2nR6XmzpmMFQ7V7ppPTmUQg==", + "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", @@ -17652,6 +20142,21 @@ "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", @@ -17675,98 +20180,89 @@ "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.4", - "resolved": "https://registry.npmjs.org/wildcard-match/-/wildcard-match-5.1.4.tgz", - "integrity": "sha512-wldeCaczs8XXq7hj+5d/F38JE2r7EXgb6WQDM84RVwxy81T/sxB5e9+uZLK9Q9oNz1mlvjut+QtvgaOQFPVq/g==", + "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 }, "windows-release": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-6.0.1.tgz", - "integrity": "sha512-MS3BzG8QK33dAyqwxfYJCJ03arkwKaddUOvvnnlFdXLudflsQF6I8yAxrLBeQk4yO8wjdH/+ax0YzxJEDrOftg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-5.1.1.tgz", + "integrity": "sha512-NMD00arvqcq2nwqc5Q6KtrSRHK+fVD31erE5FEMahAw5PmVCgD7MUXodq3pdZSUkqA9Cda2iWx6s1XYwiJWRmw==", "dev": true, "requires": { - "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 - } + "execa": "^5.1.1" } }, "wordwrap": { @@ -17807,12 +20303,24 @@ "integrity": "sha512-UmFXIPU+9Eg3E9m/728Bii0lAIuoc+6nbrNUKaRPJOFp91ih44qqGlWtxMB6kXFrRD6po+86ksHM5XHCfk6iPw==", "dev": true }, + "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 + }, "xml": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==", "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", @@ -17857,12 +20365,6 @@ "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 ddaaf60..b138bc1 100644 --- a/package.json +++ b/package.json @@ -1,20 +1,17 @@ { - "name": "@kie/git-backporting", - "version": "4.8.5", - "description": "Git backporting is a tool to execute automatic pull request git backporting.", + "name": "@lampajr/bper", + "version": "3.1.1", + "description": "BPer is a tool to execute automatic git backporting.", "author": "", "license": "MIT", "private": false, "main": "./dist/gha/index.js", "bin": { - "git-backporting": "./dist/cli/index.js" + "bper": "./dist/cli/index.js" }, "files": [ "dist/cli/index.js" ], - "publishConfig": { - "access": "public" - }, "scripts": { "prepare": "husky install", "clean": "rm -rf ./build ./dist", @@ -23,7 +20,7 @@ "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": "jest", "test:report": "npm test -- --coverage --testResultsProcessor=jest-sonar-reporter", "lint": "eslint . --ext .ts", "lint:fix": "npm run lint -- --fix", @@ -36,26 +33,24 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/kiegroup/git-backporting.git" + "url": "git+https://github.com/lampajr/backporting.git" }, "keywords": [ "backporting", "pull-requests", - "merge-requests", "github-action", "cherry-pick" ], "bugs": { - "url": "https://github.com/kiegroup/git-backporting/issues" + "url": "https://github.com/lampajr/backporting/issues" }, - "homepage": "https://github.com/kiegroup/git-backporting#readme", + "homepage": "https://github.com/lampajr/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", + "@release-it/conventional-changelog": "^5.1.1", "@types/fs-extra": "^9.0.13", "@types/jest": "^29.2.4", "@types/node": "^18.11.17", @@ -66,13 +61,14 @@ "husky": "^8.0.2", "jest": "^29.0.0", "jest-sonar-reporter": "^2.0.0", - "release-it": "^19.0.2", + "release-it": "^15.6.0", "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" + "typescript": "^4.9.3", + "@octokit/webhooks-types": "^6.8.0" }, "dependencies": { "@actions/core": "^1.10.0", diff --git a/src/service/args/args-parser.ts b/src/service/args/args-parser.ts index 344b3ec..e2bddb9 100644 --- a/src/service/args/args-parser.ts +++ b/src/service/args/args-parser.ts @@ -16,22 +16,17 @@ export default abstract class ArgsParser { 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"); + if (!args.pullRequest || !args.targetBranch) { + throw new Error("Missing option: pull request and target branch 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), @@ -41,15 +36,6 @@ export default abstract class ArgsParser { 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 index d270a14..b449fd4 100644 --- a/src/service/args/args-utils.ts +++ b/src/service/args/args-utils.ts @@ -19,38 +19,4 @@ export function parseArgs(configFileContent: string): 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 78d56f1..6279136 100644 --- a/src/service/args/args.types.ts +++ b/src/service/args/args.types.ts @@ -1,32 +1,19 @@ /** - * Tool's input arguments interface + * Input arguments */ export interface Args { - // 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 + targetBranch: string, // branch on the target repo where the change should be backported to 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 - 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 ` - // 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 + bpBranchName?: string, // backport pr branch name, default computed from commit 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 d7728ae..1e90cd8 100644 --- a/src/service/args/cli/cli-args-parser.ts +++ b/src/service/args/cli/cli-args-parser.ts @@ -2,7 +2,13 @@ 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"; +import { readConfigFile } from "@bp/service/args/args-utils"; + +function commaSeparatedList(value: string, _prev: unknown): string[] { + // remove all whitespaces + const cleanedValue: string = value.trim(); + return cleanedValue !== "" ? cleanedValue.replace(/\s/g, "").split(",") : []; +} export default class CLIArgsParser extends ArgsParser { @@ -10,32 +16,21 @@ export default class CLIArgsParser extends ArgsParser { return new Command(name) .version(version) .description(description) - .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("-tb, --target-branch ", "branch where changes must be backported to.") + .option("-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") - .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("-a, --auth ", "git service authentication string, e.g., github token.") + .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 ", "backport pr branch name, default auto-generated by the commit.") + .option("--reviewers ", "comma separated list of reviewers for the backporting pull request.", commaSeparatedList) + .option("--assignees ", "comma separated list of assignees for the backporting pull request.", commaSeparatedList) .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"); + .option("-cf, --config-file ", "configuration file containing all valid options, the json must match Args interface."); } readArgs(): Args { @@ -53,9 +48,7 @@ export default class CLIArgsParser extends ArgsParser { 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, @@ -65,15 +58,6 @@ export default class CLIArgsParser extends ArgsParser { 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, }; } diff --git a/src/service/args/gha/gha-args-parser.ts b/src/service/args/gha/gha-args-parser.ts index 2bb516f..74debbd 100644 --- a/src/service/args/gha/gha-args-parser.ts +++ b/src/service/args/gha/gha-args-parser.ts @@ -1,43 +1,53 @@ 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"; +import { readConfigFile } from "@bp/service/args/args-utils"; 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 + */ + public getOrUndefined(key: string): string | undefined { + const value = getInput(key); + return value !== "" ? value : undefined; + } + + public getAsCommaSeparatedList(key: string): string[] | undefined { + // trim the value + const value: string = (getInput(key) ?? "").trim(); + return value !== "" ? value.replace(/\s/g, "").split(",") : undefined; + } + + private getAsBooleanOrDefault(key: string): boolean | undefined { + const value = getInput(key).trim(); + return value !== "" ? value.toLowerCase() === "true" : undefined; + } + readArgs(): Args { - const configFile = getOrUndefined(getInput("config-file")); + const configFile = this.getOrUndefined("config-file"); let args: Args; if (configFile) { args = readConfigFile(configFile); } else { args = { - dryRun: getAsBooleanOrUndefined(getInput("dry-run")), - auth: getOrUndefined(getInput("auth")), + dryRun: this.getAsBooleanOrDefault("dry-run"), + auth: this.getOrUndefined("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")), + targetBranch: getInput("target-branch"), + folder: this.getOrUndefined("folder"), + gitUser: this.getOrUndefined("git-user"), + gitEmail: this.getOrUndefined("git-email"), + title: this.getOrUndefined("title"), + body: this.getOrUndefined("body"), + bodyPrefix: this.getOrUndefined("body-prefix"), + bpBranchName: this.getOrUndefined("bp-branch-name"), + reviewers: this.getAsCommaSeparatedList("reviewers"), + assignees: this.getAsCommaSeparatedList("assignees"), + inheritReviewers: !this.getAsBooleanOrDefault("no-inherit-reviewers"), }; } diff --git a/src/service/configs/configs-parser.ts b/src/service/configs/configs-parser.ts index 5b901cb..e21ed08 100644 --- a/src/service/configs/configs-parser.ts +++ b/src/service/configs/configs-parser.ts @@ -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 throw an error + // if PR is closed and not merged log a warning 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 85dd1f9..ff28a78 100644 --- a/src/service/configs/configs.types.ts +++ b/src/service/configs/configs.types.ts @@ -1,20 +1,12 @@ -import { BackportPullRequest, GitPullRequest } from "@bp/service/git/git.types"; - -export const MESSAGE_ERROR_PLACEHOLDER = "{{error}}"; -export const MESSAGE_TARGET_BRANCH_PLACEHOLDER = "{{target-branch}}"; +import { GitPullRequest } from "@bp/service/git/git.types"; 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 */ @@ -23,21 +15,8 @@ export interface Configs { auth?: string, git: LocalGit, folder: string, - mergeStrategy?: string, // cherry-pick merge strategy - mergeStrategyOption?: string, // cherry-pick merge strategy option - cherryPickOptions?: string, // additional cherry-pick options + targetBranch: string, originalPullRequest: GitPullRequest, - backportPullRequests: BackportPullRequest[], - errorNotification: ErrorNotification, + backportPullRequest: GitPullRequest, } -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 cb483bd..f54ba5e 100644 --- a/src/service/configs/pullrequest/pr-configs-parser.ts +++ b/src/service/configs/pullrequest/pr-configs-parser.ts @@ -1,10 +1,9 @@ -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, MESSAGE_TARGET_BRANCH_PLACEHOLDER } from "@bp/service/configs/configs.types"; +import { Configs } 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"; +import { GitPullRequest } from "@bp/service/git/git.types"; export default class PullRequestConfigsParser extends ConfigsParser { @@ -16,12 +15,9 @@ export default class PullRequestConfigsParser extends ConfigsParser { } public async parse(args: Args): Promise { - let pr: GitPullRequest; - if (args.autoNoSquash) { - args.squash = undefined; - } + let pr: GitPullRequest; try { - pr = await this.gitClient.getPullRequestFromUrl(args.pullRequest, args.squash); + pr = await this.gitClient.getPullRequestFromUrl(args.pullRequest); } catch(error) { this.logger.error("Something went wrong retrieving pull request"); throw error; @@ -29,40 +25,17 @@ export default class PullRequestConfigsParser extends ConfigsParser { 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, // this has been already pre-processed before parsing configs + auth: args.auth, folder: `${folder.startsWith("/") ? "" : process.cwd() + "/"}${args.folder ?? this.getDefaultFolder()}`, - mergeStrategy: args.strategy, - mergeStrategyOption: args.strategyOption, - cherryPickOptions: args.cherryPickOptions, + targetBranch: args.targetBranch, originalPullRequest: pr, - backportPullRequests: this.generateBackportPullRequestsData(pr, args, targetBranches, bpBranchNames), + backportPullRequest: this.getDefaultBackportPullRequest(pr, args), git: { user: args.gitUser ?? this.gitClient.getDefaultGitUser(), email: args.gitEmail ?? this.gitClient.getDefaultGitEmail(), - }, - errorNotification: { - enabled: args.enableErrorNotification ?? false, - message: this.getDefaultErrorComment(), - }, + } }; } @@ -70,38 +43,6 @@ 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 @@ -109,13 +50,7 @@ export default class PullRequestConfigsParser extends ConfigsParser { * @param targetBranch target branch where the backport should be applied * @returns {GitPullRequest} */ - private generateBackportPullRequestsData( - originalPullRequest: GitPullRequest, - args: Args, - targetBranches: string[], - bpBranchNames: string[] - ): BackportPullRequest[] { - + private getDefaultBackportPullRequest(originalPullRequest: GitPullRequest, args: Args): GitPullRequest { const reviewers = args.reviewers ?? []; if (reviewers.length == 0 && args.inheritReviewers) { // inherit only if args.reviewers is empty and args.inheritReviewers set to true @@ -126,45 +61,17 @@ export default class PullRequestConfigsParser extends ConfigsParser { } const bodyPrefix = args.bodyPrefix ?? `**Backport:** ${originalPullRequest.htmlUrl}\r\n\r\n`; - const body = bodyPrefix + (args.body ?? `${originalPullRequest.body}`); + const body = 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: 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[]; + return { + author: args.gitUser ?? this.gitClient.getDefaultGitUser(), + title: args.title ?? `[${args.targetBranch}] ${originalPullRequest.title}`, + body: `${bodyPrefix}${body}`, + reviewers: [...new Set(reviewers)], + assignees: [...new Set(args.assignees)], + targetRepo: originalPullRequest.targetRepo, + sourceRepo: originalPullRequest.targetRepo, + branchName: args.bpBranchName, + }; } } \ No newline at end of file diff --git a/src/service/git/git-cli.ts b/src/service/git/git-cli.ts index d7fc7e6..0061fd5 100644 --- a/src/service/git/git-cli.ts +++ b/src/service/git/git-cli.ts @@ -32,12 +32,11 @@ export default class GitCLIService { /** * Update the provided remote URL by adding the auth token if not empty - * @param remoteURL remote link, e.g., https://github.com/kiegroup/git-backporting-example.git + * @param remoteURL remote link, e.g., https://github.com/lampajr/backporting-example.git */ private remoteWithAuth(remoteURL: string): string { - if (this.auth) { - // Anything will work as a username. - return remoteURL.replace("://", `://token:${this.auth}@`); + if (this.auth && this.gitData.user) { + return remoteURL.replace("://", `://${this.gitData.user}:${this.auth}@`); } // return remote as it is @@ -61,25 +60,12 @@ 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]); - 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); } /** @@ -88,7 +74,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); } @@ -99,7 +85,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)); } @@ -110,7 +96,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"]); } @@ -119,40 +105,9 @@ 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, 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; + 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]); } /** @@ -162,7 +117,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 index 7b38308..890863a 100644 --- a/src/service/git/git-client-factory.ts +++ b/src/service/git/git-client-factory.ts @@ -13,10 +13,9 @@ 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"); + throw new Error("You must call `getOrCreate` method first!"); } return GitClientFactory.instance; @@ -30,7 +29,7 @@ export default class GitClientFactory { public static getOrCreate(type: GitClientType, authToken: string | undefined, apiUrl: string): GitClient { if (GitClientFactory.instance) { - GitClientFactory.logger.warn("Git service already initialized"); + GitClientFactory.logger.warn("Git service already initialized!"); return GitClientFactory.instance; } @@ -43,9 +42,6 @@ export default class GitClientFactory { 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}`); } @@ -53,9 +49,8 @@ export default class GitClientFactory { return GitClientFactory.instance; } - // this is used for testing purposes public static reset(): void { - GitClientFactory.logger.warn("Resetting git service"); + 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 index 93190d9..c1ff0ea 100644 --- a/src/service/git/git-client.ts +++ b/src/service/git/git-client.ts @@ -1,4 +1,4 @@ -import { BackportPullRequest, GitClientType, GitPullRequest } from "@bp/service/git/git.types"; +import { BackportPullRequest, GitPullRequest } from "@bp/service/git/git.types"; /** * Git management service interface, which provides a common API for interacting @@ -6,11 +6,6 @@ import { BackportPullRequest, GitClientType, GitPullRequest } from "@bp/service/ */ export default interface GitClient { - /** - * @returns {GitClientType} specific git client enum type - */ - getClientType(): GitClientType - // READ getDefaultGitUser(): string; @@ -22,18 +17,16 @@ import { BackportPullRequest, GitClientType, GitPullRequest } from "@bp/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; + getPullRequest(owner: string, repo: string, prNumber: number): 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; + getPullRequestFromUrl(prUrl: string): Promise; // WRITE @@ -43,12 +36,4 @@ import { BackportPullRequest, GitClientType, GitPullRequest } from "@bp/service/ * @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 index 5658f14..7ae88c2 100644 --- a/src/service/git/git-mapper.ts +++ b/src/service/git/git-mapper.ts @@ -10,7 +10,6 @@ export default interface GitResponseMapper { mapPullRequest( pr: PR, - commits?: string[], ): Promise; mapGitState(state: S): GitRepoState; diff --git a/src/service/git/git-util.ts b/src/service/git/git-util.ts index 4e649b5..e7be7ad 100644 --- a/src/service/git/git-util.ts +++ b/src/service/git/git-util.ts @@ -1,6 +1,4 @@ -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"; @@ -18,8 +16,6 @@ export const inferGitClient = (prUrl: string): GitClientType => { 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}`); @@ -35,70 +31,9 @@ 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)) { + if (baseUrl.includes(PUBLIC_GITHUB_URL)) { 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 868440c..9a4da4d 100644 --- a/src/service/git/git.types.ts +++ b/src/service/git/git.types.ts @@ -1,7 +1,7 @@ export interface GitPullRequest { number?: number, author: string, - url: string, + url?: string, htmlUrl?: string, state?: GitRepoState, merged?: boolean, @@ -10,11 +10,10 @@ export interface GitPullRequest { body: string, reviewers: string[], assignees: string[], - labels: string[], targetRepo: GitRepository, sourceRepo: GitRepository, - nCommits: number, // number of commits in the pr - commits: string[], // merge commit or last one + nCommits?: number, // number of commits in the pr + commits?: string[], // merge commit or last one branchName?: string, } @@ -33,15 +32,12 @@ export interface BackportPullRequest { body: string, // pr body reviewers: string[], // pr list of reviewers assignees: string[], // pr list of assignees - labels: string[], // pr list of assigned labels - comments: string[], // pr list of additional comments - // branchName?: string, + branchName?: string, } export enum GitClientType { GITHUB = "github", GITLAB = "gitlab", - CODEBERG = "codeberg", } export enum GitRepoState { diff --git a/src/service/git/github/github-client.ts b/src/service/git/github/github-client.ts index 9802ef5..6f79c0c 100644 --- a/src/service/git/github/github-client.ts +++ b/src/service/git/github/github-client.ts @@ -1,6 +1,5 @@ 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 { 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"; @@ -12,89 +11,46 @@ 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) { + constructor(token: string | undefined, apiUrl: string) { 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"; + return "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}`); + 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, + 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); + return this.mapper.mapPullRequest(data as PullRequest); } - async getPullRequestFromUrl(prUrl: string, squash: boolean | undefined): Promise { + async getPullRequestFromUrl(prUrl: string): Promise { const { owner, project, id } = this.extractPullRequestData(prUrl); - return this.getPullRequest(owner, project, id, squash); + return this.getPullRequest(owner, project, id); } // WRITE async createPullRequest(backport: BackportPullRequest): Promise { - 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({ @@ -103,89 +59,42 @@ export default class GitHubClient implements GitClient { 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 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({ + 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}`)) - ); + }); + } catch (error) { + this.logger.error(`Error requesting reviewers: ${error}`); + } } if (backport.assignees.length > 0) { - promises.push( - this.octokit.issues.addAssignees({ + try { + await 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}`)) - ); + }); + } 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 /** diff --git a/src/service/git/github/github-mapper.ts b/src/service/git/github/github-mapper.ts index f501b5d..6e33b9f 100644 --- a/src/service/git/github/github-mapper.ts +++ b/src/service/git/github/github-mapper.ts @@ -13,7 +13,7 @@ export default class GitHubMapper implements GitResponseMapper { + async mapPullRequest(pr: PullRequest): Promise { return { number: pr.number, author: pr.user.login, @@ -24,22 +24,16 @@ export default class GitHubMapper implements GitResponseMapper 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) ?? [], + reviewers: pr.requested_reviewers.filter(r => "login" in r).map((r => (r as User)?.login)), + assignees: pr.assignees.filter(r => "login" in r).map(r => r.login), 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), + // 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] }; } - 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], diff --git a/src/service/git/github/octokit-factory.ts b/src/service/git/github/octokit-factory.ts index 7792ed6..cad08d9 100644 --- a/src/service/git/github/octokit-factory.ts +++ b/src/service/git/github/octokit-factory.ts @@ -12,9 +12,10 @@ export default class OctokitFactory { 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: "kiegroup/git-backporting", + userAgent: "lampajr/backporting", baseUrl: apiUrl }); } diff --git a/src/service/git/gitlab/gitlab-client.ts b/src/service/git/gitlab/gitlab-client.ts index 6d17ccf..5a76da6 100644 --- a/src/service/git/gitlab/gitlab-client.ts +++ b/src/service/git/gitlab/gitlab-client.ts @@ -1,9 +1,8 @@ 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 { GitPullRequest, BackportPullRequest } from "@bp/service/git/git.types"; import LoggerServiceFactory from "@bp/service/logger/logger-service-factory"; -import { CommitSchema, MergeRequestSchema, UserSchema } from "@gitbeaker/rest"; +import { MergeRequestSchema, UserSchema } from "@gitbeaker/rest"; import GitLabMapper from "@bp/service/git/gitlab/gitlab-mapper"; import axios, { Axios } from "axios"; import https from "https"; @@ -22,7 +21,7 @@ export default class GitLabClient implements GitClient { baseURL: this.apiUrl, headers: { Authorization: token ? `Bearer ${token}` : "", - "User-Agent": "kiegroup/git-backporting", + "User-Agent": "lampajr/backporting", }, httpsAgent: new https.Agent({ rejectUnauthorized @@ -31,10 +30,6 @@ export default class GitLabClient implements GitClient { this.mapper = new GitLabMapper(this.client); } - getClientType(): GitClientType { - return GitClientType.GITLAB; - } - getDefaultGitUser(): string { return "Gitlab"; } @@ -45,42 +40,23 @@ export default class GitLabClient implements GitClient { // READ - // example: /api/v4/projects/%2Fbackporting-example/merge_requests/1 - async getPullRequest(namespace: string, repo: string, mrNumber: number, squash: boolean | undefined): Promise { + // example: /api/v4/projects/alampare%2Fbackporting-example/merge_requests/1 + async getPullRequest(namespace: string, repo: string, mrNumber: number): 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}`); + const { data } = await this.client.get(`/projects/${projectId}/merge_requests/${mrNumber}`); - 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); + return this.mapper.mapPullRequest(data as MergeRequestSchema); } - getPullRequestFromUrl(mrUrl: string, squash: boolean | undefined): Promise { + getPullRequestFromUrl(mrUrl: string): Promise { const { namespace, project, id } = this.extractMergeRequestData(mrUrl); - return this.getPullRequest(namespace, project, id, squash); + return this.getPullRequest(namespace, project, id); } // WRITE async createPullRequest(backport: BackportPullRequest): Promise { - 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 projectId = this.getProjectId(backport.owner, backport.repo); @@ -95,97 +71,56 @@ export default class GitLabClient implements GitClient { }); 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; - } - ); - })); + const reviewerIds: number[] = []; + for(const r of backport.reviewers) { + try { + this.logger.debug("Retrieving user: " + r); + const user = await this.getUser(r); + reviewerIds.push(user.id); + } catch(error) { + this.logger.warn(`Failed to retrieve reviewer ${r}`); + } + } if (reviewerIds.length > 0) { - this.logger.info("Setting reviewers: " + reviewerIds); - promises.push( - this.client.put(`/projects/${projectId}/merge_requests/${mr.iid}`, { + try { + this.logger.info("Setting reviewers: " + reviewerIds); + await 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)) - ); + }); + } 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; - } - ); - })); + const assigneeIds: number[] = []; + for(const a of backport.assignees) { + try { + this.logger.debug("Retrieving user: " + a); + const user = await this.getUser(a); + assigneeIds.push(user.id); + } catch(error) { + this.logger.warn(`Failed to retrieve assignee ${a}`); + } + } if (assigneeIds.length > 0) { - this.logger.info("Setting assignees: " + assigneeIds); - promises.push( - this.client.put(`/projects/${projectId}/merge_requests/${mr.iid}`, { + try { + this.logger.info("Setting assignees: " + assigneeIds); + await 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)) - ); + }); + } 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 @@ -209,24 +144,15 @@ export default class GitLabClient implements GitClient { /** * Extract repository namespace, project and mr number from the merge request url - * example: //backporting-example/-/merge_requests/1 + * example: /alampare/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); - + const elems: string[] = mrUrl.replace("/-/", "/").split("/"); return { - namespace: namespace, + namespace: elems[elems.length - 4], project: elems[elems.length - 3], id: parseInt(mrUrl.substring(mrUrl.lastIndexOf("/") + 1, mrUrl.length)), }; diff --git a/src/service/git/gitlab/gitlab-mapper.ts b/src/service/git/gitlab/gitlab-mapper.ts index 9efe2a0..4aa4291 100644 --- a/src/service/git/gitlab/gitlab-mapper.ts +++ b/src/service/git/gitlab/gitlab-mapper.ts @@ -24,7 +24,8 @@ export default class GitLabMapper implements GitResponseMapper { + async mapPullRequest(mr: MergeRequestSchema): Promise { + // throw new Error("Method not implemented."); return { number: mr.iid, author: mr.author.username, @@ -37,20 +38,14 @@ export default class GitLabMapper implements GitResponseMapper 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) + nCommits: 1, // info not present on mr + // if mr is merged, use merge_commit_sha otherwise use sha + // what is the difference between sha and diff_refs.head_sha? + commits: this.isMerged(mr) ? [mr.squash_commit_sha ? mr.squash_commit_sha : mr.merge_commit_sha as string] : [mr.sha] }; } - - 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); diff --git a/src/service/logger/console-logger-service.ts b/src/service/logger/console-logger-service.ts index 6de8020..3a313eb 100644 --- a/src/service/logger/console-logger-service.ts +++ b/src/service/logger/console-logger-service.ts @@ -5,48 +5,32 @@ export default class ConsoleLoggerService implements LoggerService { private readonly logger: Logger; private readonly verbose: boolean; - private context?: string; 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", this.fromContext(message)); + this.logger.log("[TRACE]", message); } debug(message: string): void { if (this.verbose) { - this.logger.log("DEBUG", this.fromContext(message)); + this.logger.log("[DEBUG]", message); } } info(message: string): void { - this.logger.log("INFO", this.fromContext(message)); + this.logger.log("[INFO]", message); } warn(message: string): void { - this.logger.log("WARN", this.fromContext(message)); + this.logger.log("[WARN]", message); } error(message: string): void { - this.logger.log("ERROR", this.fromContext(message)); + this.logger.log("[ERROR]", 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 477da94..34b1895 100644 --- a/src/service/logger/logger-service.ts +++ b/src/service/logger/logger-service.ts @@ -3,12 +3,6 @@ */ 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 18f76e5..f058525 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.padEnd(5)}]`, ...str]); + console.log.apply(console, [prefix, ...str]); } emptyLine() { diff --git a/src/service/runner/runner-util.ts b/src/service/runner/runner-util.ts deleted file mode 100644 index 2d5bd2a..0000000 --- a/src/service/runner/runner-util.ts +++ /dev/null @@ -1,22 +0,0 @@ -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 4df541d..2bb4e1f 100644 --- a/src/service/runner/runner.ts +++ b/src/service/runner/runner.ts @@ -8,14 +8,7 @@ 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; -} +import { inferGitClient, inferGitApiUrl } from "@bp/service/git/git-util"; /** * Main runner implementation, it implements the core logic flow @@ -37,13 +30,13 @@ export default class Runner { 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); } } @@ -57,118 +50,70 @@ 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 - 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); + const gitClientType: GitClientType = inferGitClient(args.pullRequest); + // right now the apiVersion is set to v4 + const apiUrl = inferGitApiUrl(args.pullRequest); + const gitApi: GitClient = GitClientFactory.getOrCreate(gitClientType, args.auth, apiUrl); // 3. parse configs this.logger.debug("Parsing configs.."); - args.auth = token; // override auth const configs: Configs = await new PullRequestConfigsParser().parseAndValidate(args); - const backportPRs: BackportPullRequest[] = configs.backportPullRequests; + const originalPR: GitPullRequest = configs.originalPullRequest; + const backportPR: GitPullRequest = configs.backportPullRequest; // start local git operations 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 this.logger.debug("Cloning repo.."); - await git.gitCli.clone(configs.originalPullRequest.targetRepo.cloneUrl, configs.folder, backportPR.base); + await git.clone(configs.originalPullRequest.targetRepo.cloneUrl, configs.folder, configs.targetBranch); // 5. create new branch from target one and checkout this.logger.debug("Creating local branch.."); - await git.gitCli.createLocalBranch(configs.folder, backportPR.head); + const backportBranch = backportPR.branchName ?? `bp-${configs.targetBranch}-${originalPR.commits!.join("-")}`; + await git.createLocalBranch(configs.folder, backportBranch); // 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") { - 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}`); + this.logger.debug("Fetching pull request remote.."); + const prefix = gitClientType === GitClientType.GITHUB ? "pull" : "merge-requests"; // default is for gitlab + await git.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.gitCli.cherryPick(configs.folder, sha, configs.mergeStrategy, configs.mergeStrategyOption, configs.cherryPickOptions); + for (const sha of originalPR.commits!) { + await git.cherryPick(configs.folder, sha); } + 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, + assignees: backportPR.assignees, + }; + if (!configs.dryRun) { // 8. push the new branch to origin - await git.gitCli.push(configs.folder, backportPR.head); + await git.push(configs.folder, backportBranch); // 9. create pull request new branch -> target branch (using octokit) - const prUrl = await git.gitClientApi.createPullRequest(backportPR); + const prUrl = await gitApi.createPullRequest(backport); this.logger.info(`Pull request created: ${prUrl}`); } else { - this.logger.warn("Pull request creation and remote push skipped"); - this.logger.info(`${JSON.stringify(backportPR, null, 2)}`); + this.logger.warn("Pull request creation and remote push skipped!"); + this.logger.info(`${JSON.stringify(backport, null, 2)}`); } - - this.logger.clearContext(); } -} + +} \ No newline at end of file diff --git a/test/service/args/args-utils.test.ts b/test/service/args/args-utils.test.ts index 508e5d7..57f5f30 100644 --- a/test/service/args/args-utils.test.ts +++ b/test/service/args/args-utils.test.ts @@ -1,6 +1,5 @@ -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"; +import { parseArgs, readConfigFile } from "@bp/service/args/args-utils"; +import { createTestFile, removeTestFile } from "../../support/utils"; const RANDOM_CONFIG_FILE_CONTENT_PATHNAME = "./args-utils-test-random-config-file.json"; const RANDOM_CONFIG_FILE_CONTENT = { @@ -40,39 +39,4 @@ describe("args utils test suite", () => { 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 31d4c15..ff09dd0 100644 --- a/test/service/args/cli/cli-args-parser.test.ts +++ b/test/service/args/cli/cli-args-parser.test.ts @@ -15,7 +15,6 @@ const RANDOM_CONFIG_FILE_CONTENT = { "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", @@ -25,8 +24,6 @@ const RANDOM_CONFIG_FILE_CONTENT = { "reviewers": ["reviewer1", "reviewer2"], "assignees": ["assignee1", "assignee2"], "inheritReviewers": true, - "labels": ["cherry-pick :cherries:"], - "inheritLabels": true, }; describe("cli args parser", () => { @@ -45,11 +42,11 @@ describe("cli args parser", () => { }); beforeEach(() => { - // reset process.env variables - resetProcessArgs(); - // create a fresh new instance every time parser = new CLIArgsParser(); + + // reset process.env variables + resetProcessArgs(); }); test("valid execution [default, short]", () => { @@ -63,7 +60,6 @@ describe("cli args parser", () => { 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); @@ -76,14 +72,6 @@ describe("cli args parser", () => { 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]", () => { @@ -95,7 +83,6 @@ describe("cli args parser", () => { 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); @@ -108,14 +95,6 @@ describe("cli args parser", () => { 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]", () => { @@ -129,7 +108,6 @@ describe("cli args parser", () => { 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); @@ -142,12 +120,6 @@ describe("cli args parser", () => { 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]", () => { @@ -159,7 +131,6 @@ describe("cli args parser", () => { 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); @@ -172,12 +143,6 @@ describe("cli args parser", () => { 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]", () => { @@ -198,7 +163,6 @@ describe("cli args parser", () => { const args: Args = parser.parse(); expect(args.dryRun).toEqual(true); expect(args.auth).toEqual("bearer-token"); - expect(args.gitClient).toEqual(undefined); expect(args.gitUser).toEqual("Me"); expect(args.gitEmail).toEqual("me@email.com"); expect(args.folder).toEqual(undefined); @@ -211,12 +175,6 @@ describe("cli args parser", () => { 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]", () => { @@ -228,8 +186,6 @@ describe("cli args parser", () => { "target", "--pull-request", "https://localhost/whatever/pulls/1", - "--git-client", - "codeberg", "--git-user", "Me", "--git-email", @@ -247,15 +203,11 @@ describe("cli args parser", () => { "--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.gitClient).toEqual("codeberg"); expect(args.gitUser).toEqual("Me"); expect(args.gitEmail).toEqual("me@email.com"); expect(args.folder).toEqual(undefined); @@ -268,12 +220,6 @@ describe("cli args parser", () => { 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", () => { @@ -285,7 +231,6 @@ describe("cli args parser", () => { 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"); @@ -298,12 +243,6 @@ describe("cli args parser", () => { 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", () => { @@ -317,8 +256,6 @@ describe("cli args parser", () => { "target", "--pull-request", "https://localhost/whatever/pulls/1", - "--git-client", - "github", "--git-user", "Me", "--git-email", @@ -336,15 +273,11 @@ describe("cli args parser", () => { "--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"); @@ -357,185 +290,5 @@ describe("cli args parser", () => { 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 9039a55..130f7d5 100644 --- a/test/service/args/gha/gha-args-parser.test.ts +++ b/test/service/args/gha/gha-args-parser.test.ts @@ -24,8 +24,6 @@ const RANDOM_CONFIG_FILE_CONTENT = { "reviewers": ["reviewer1", "reviewer2"], "assignees": ["assignee1", "assignee2"], "inheritReviewers": true, - "labels": ["cherry-pick :cherries:"], - "inheritLabels": true, }; describe("gha args parser", () => { @@ -48,6 +46,30 @@ describe("gha args parser", () => { parser = new GHAArgsParser(); }); + afterEach(() => { + jest.clearAllMocks(); + }); + + test("getOrUndefined", () => { + spyGetInput({ + "present": "value", + "empty": "", + }); + expect(parser.getOrUndefined("empty")).toStrictEqual(undefined); + expect(parser.getOrUndefined("present")).toStrictEqual("value"); + }); + + test("getAsCommaSeparatedList", () => { + spyGetInput({ + "present": "value1, value2 , value3", + "empty": "", + "blank": " ", + }); + expectArrayEqual(parser.getAsCommaSeparatedList("present")!, ["value1", "value2", "value3"]); + expect(parser.getAsCommaSeparatedList("empty")).toStrictEqual(undefined); + expect(parser.getAsCommaSeparatedList("blank")).toStrictEqual(undefined); + }); + test("valid execution [default]", () => { spyGetInput({ "target-branch": "target", @@ -67,12 +89,6 @@ describe("gha args parser", () => { 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]", () => { @@ -90,8 +106,6 @@ describe("gha args parser", () => { "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(); @@ -109,12 +123,6 @@ describe("gha args parser", () => { 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", () => { @@ -137,12 +145,6 @@ describe("gha args parser", () => { 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", () => { @@ -161,8 +163,6 @@ describe("gha args parser", () => { "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(); @@ -180,154 +180,5 @@ describe("gha args parser", () => { 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 deleted file mode 100644 index 138a1b0..0000000 --- a/test/service/configs/pullrequest/github-pr-configs-parser-multiple.test.ts +++ /dev/null @@ -1,493 +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 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 index 369695e..5f5d8ae 100644 --- a/test/service/configs/pullrequest/github-pr-configs-parser.test.ts +++ b/test/service/configs/pullrequest/github-pr-configs-parser.test.ts @@ -5,22 +5,20 @@ 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 { mergedPullRequestFixture, openPullRequestFixture, notMergedPullRequestFixture, repo, targetOwner } 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}`, + "pullRequest": `https://github.com/${targetOwner}/${repo}/pull/${mergedPullRequestFixture.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}`, + "pullRequest": `https://github.com/${targetOwner}/${repo}/pull/${mergedPullRequestFixture.number}`, "targetBranch": "prod", "gitUser": "Me", "gitEmail": "me@email.com", @@ -30,19 +28,13 @@ const GITHUB_MERGED_PR_COMPLEX_CONFIG_FILE_CONTENT = { "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}`; + 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 argsParser: CLIArgsParser; let configParser: PullRequestConfigsParser; @@ -63,20 +55,24 @@ describe("github pull request config parser", () => { }); beforeEach(() => { + mockGitHubClient("http://localhost/api/v3"); + // 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(); }); + afterEach(() => { + jest.clearAllMocks(); + }); + test("parse configs from pull request", async () => { const args: Args = { dryRun: false, + auth: "", pullRequest: mergedPRUrl, targetBranch: "prod", gitUser: "GitHub", @@ -88,17 +84,13 @@ describe("github pull request config parser", () => { 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.auth).toEqual(""); + expect(configs.targetBranch).toEqual("prod"); expect(configs.folder).toEqual(process.cwd() + "/bp"); expect(configs.originalPullRequest).toEqual({ number: 2368, @@ -112,7 +104,6 @@ describe("github pull request config parser", () => { body: "Please review and merge", reviewers: ["requested-gh-user", "gh-user"], assignees: [], - labels: ["backport prod"], targetRepo: { owner: "owner", project: "reponame", @@ -126,22 +117,25 @@ describe("github pull request config parser", () => { 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", + expect(configs.backportPullRequest).toEqual({ + author: "GitHub", + url: undefined, + htmlUrl: undefined, + 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." + 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, }); }); @@ -163,6 +157,7 @@ describe("github pull request config parser", () => { expect(configs.dryRun).toEqual(true); expect(configs.auth).toEqual("whatever"); + expect(configs.targetBranch).toEqual("prod"); expect(configs.folder).toEqual("/tmp/test"); expect(configs.git).toEqual({ user: "GitHub", @@ -185,13 +180,9 @@ describe("github pull request config parser", () => { 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.targetBranch).toEqual("prod"); expect(configs.git).toEqual({ user: "GitHub", email: "noreply@github.com" @@ -208,7 +199,6 @@ describe("github pull request config parser", () => { body: "Please review and merge", reviewers: ["gh-user"], assignees: [], - labels: [], targetRepo: { owner: "owner", project: "reponame", @@ -221,7 +211,8 @@ describe("github pull request config parser", () => { }, bpBranchName: undefined, nCommits: 2, - commits: ["0404fb922ab75c3a8aecad5c97d9af388df04695", "11da4e38aa3e577ffde6d546f1c52e53b04d3151"], + // taken from head.sha + commits: ["91748965051fae1330ad58d15cf694e103267c87"] }); }); @@ -238,10 +229,11 @@ describe("github pull request config parser", () => { inheritReviewers: true, }; - await expect(() => configParser.parseAndValidate(args)).rejects.toThrow("Provided pull request is closed and not merged"); + expect(async () => await configParser.parseAndValidate(args)).rejects.toThrow("Provided pull request is closed and not merged!"); }); - test("override backport pr data inheriting reviewers", async () => { + + test("override backport pr data inherting reviewers", async () => { const args: Args = { dryRun: false, auth: "", @@ -255,22 +247,17 @@ describe("github pull request config parser", () => { 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.targetBranch).toEqual("prod"); expect(configs.folder).toEqual(process.cwd() + "/bp"); expect(configs.originalPullRequest).toEqual({ number: 2368, @@ -284,7 +271,6 @@ describe("github pull request config parser", () => { body: "Please review and merge", reviewers: ["requested-gh-user", "gh-user"], assignees: [], - labels: ["backport prod"], targetRepo: { owner: "owner", project: "reponame", @@ -299,60 +285,25 @@ describe("github pull request config parser", () => { nCommits: 2, commits: ["28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc"], }); - expect(configs.backportPullRequests.length).toEqual(1); - expect(configs.backportPullRequests[0]).toEqual({ - owner: "owner", - repo: "reponame", - head: "custom-branch", - base: "prod", + expect(configs.backportPullRequest).toEqual({ + author: "Me", + url: undefined, + htmlUrl: undefined, 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: [], + 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, }); }); @@ -374,17 +325,13 @@ describe("github pull request config parser", () => { 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.targetBranch).toEqual("prod"); expect(configs.folder).toEqual(process.cwd() + "/bp"); expect(configs.originalPullRequest).toEqual({ number: 2368, @@ -398,7 +345,6 @@ describe("github pull request config parser", () => { body: "Please review and merge", reviewers: ["requested-gh-user", "gh-user"], assignees: [], - labels: ["backport prod"], targetRepo: { owner: "owner", project: "reponame", @@ -413,18 +359,25 @@ describe("github pull request config parser", () => { 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", + expect(configs.backportPullRequest).toEqual({ + author: "Me", + url: undefined, + htmlUrl: undefined, title: "New Title", body: "New Body Prefix -New Body", reviewers: ["user1", "user2"], assignees: ["user3", "user4"], - labels: [], - comments: [], + 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, }); }); @@ -446,17 +399,13 @@ describe("github pull request config parser", () => { 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.targetBranch).toEqual("prod"); expect(configs.folder).toEqual(process.cwd() + "/bp"); expect(configs.originalPullRequest).toEqual({ number: 2368, @@ -470,7 +419,6 @@ describe("github pull request config parser", () => { body: "Please review and merge", reviewers: ["requested-gh-user", "gh-user"], assignees: [], - labels: ["backport prod"], targetRepo: { owner: "owner", project: "reponame", @@ -485,92 +433,25 @@ describe("github pull request config parser", () => { 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", + expect(configs.backportPullRequest).toEqual({ + author: "Me", + url: undefined, + htmlUrl: undefined, 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", + owner: "owner", project: "reponame", - cloneUrl: "https://github.com/fork/reponame.git" + cloneUrl: "https://github.com/owner/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: [], }); }); @@ -583,17 +464,13 @@ describe("github pull request config parser", () => { 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.targetBranch).toEqual("prod"); expect(configs.folder).toEqual(process.cwd() + "/bp"); expect(configs.originalPullRequest).toEqual({ number: 2368, @@ -607,7 +484,6 @@ describe("github pull request config parser", () => { body: "Please review and merge", reviewers: ["requested-gh-user", "gh-user"], assignees: [], - labels: ["backport prod"], targetRepo: { owner: "owner", project: "reponame", @@ -621,18 +497,25 @@ describe("github pull request config parser", () => { 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", + expect(configs.backportPullRequest).toEqual({ + author: "GitHub", + url: undefined, + htmlUrl: undefined, 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: [], + 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, }); }); @@ -645,17 +528,13 @@ describe("github pull request config parser", () => { 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.targetBranch).toEqual("prod"); expect(configs.folder).toEqual(process.cwd() + "/bp"); expect(configs.originalPullRequest).toEqual({ number: 2368, @@ -669,7 +548,6 @@ describe("github pull request config parser", () => { body: "Please review and merge", reviewers: ["requested-gh-user", "gh-user"], assignees: [], - labels: ["backport prod"], targetRepo: { owner: "owner", project: "reponame", @@ -684,66 +562,14 @@ describe("github pull request config parser", () => { 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", + expect(configs.backportPullRequest).toEqual({ + author: "Me", + url: undefined, + htmlUrl: undefined, 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", @@ -754,215 +580,7 @@ describe("github pull request config parser", () => { 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 deleted file mode 100644 index 140c343..0000000 --- a/test/service/configs/pullrequest/gitlab-pr-configs-parser-multiple.test.ts +++ /dev/null @@ -1,353 +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 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 index bbaaf98..6049da5 100644 --- a/test/service/configs/pullrequest/gitlab-pr-configs-parser.test.ts +++ b/test/service/configs/pullrequest/gitlab-pr-configs-parser.test.ts @@ -6,9 +6,7 @@ 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"; +import { createTestFile, removeTestFile, spyGetInput } from "../../../support/utils"; 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 = { @@ -30,12 +28,8 @@ const GITLAB_MERGED_PR_COMPLEX_CONFIG_FILE_CONTENT = { "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 { @@ -70,13 +64,14 @@ describe("gitlab merge request config parser", () => { }); beforeEach(() => { - // reset env tokens - resetEnvTokens(); - argsParser = new GHAArgsParser(); configParser = new PullRequestConfigsParser(); }); + afterEach(() => { + jest.clearAllMocks(); + }); + test("parse configs from merge request", async () => { const args: Args = { dryRun: false, @@ -88,22 +83,17 @@ describe("gitlab merge request config parser", () => { 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.targetBranch).toEqual("prod"); expect(configs.folder).toEqual(process.cwd() + "/bp"); expect(configs.originalPullRequest).toEqual({ number: 1, @@ -117,7 +107,6 @@ describe("gitlab merge request config parser", () => { body: "This is the body", reviewers: ["superuser1", "superuser2"], assignees: ["superuser"], - labels: ["backport-prod"], targetRepo: { owner: "superuser", project: "backporting-example", @@ -131,22 +120,25 @@ describe("gitlab merge request config parser", () => { 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", + expect(configs.backportPullRequest).toEqual({ + author: "Gitlab", + url: undefined, + htmlUrl: undefined, 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." + 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, }); }); @@ -163,18 +155,13 @@ describe("gitlab merge request config parser", () => { 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.targetBranch).toEqual("prod"); expect(configs.folder).toEqual("/tmp/test"); expect(configs.git).toEqual({ user: "Gitlab", @@ -193,18 +180,13 @@ describe("gitlab merge request config parser", () => { 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.targetBranch).toEqual("prod"); expect(configs.git).toEqual({ user: "Gitlab", email: "noreply@gitlab.com" @@ -221,7 +203,6 @@ describe("gitlab merge request config parser", () => { body: "Still opened mr body", reviewers: ["superuser"], assignees: ["superuser"], - labels: [], targetRepo: { owner: "superuser", project: "backporting-example", @@ -250,13 +231,12 @@ describe("gitlab merge request config parser", () => { reviewers: [], assignees: [], inheritReviewers: true, - squash: true, }; - await expect(() => configParser.parseAndValidate(args)).rejects.toThrow("Provided pull request is closed and not merged"); + expect(async () => await configParser.parseAndValidate(args)).rejects.toThrow("Provided pull request is closed and not merged!"); }); - test("override backport pr data inheriting reviewers", async () => { + test("override backport pr data inherting reviewers", async () => { const args: Args = { dryRun: false, auth: "", @@ -270,22 +250,17 @@ describe("gitlab merge request config parser", () => { 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.targetBranch).toEqual("prod"); expect(configs.folder).toEqual(process.cwd() + "/bp"); expect(configs.originalPullRequest).toEqual({ number: 1, @@ -299,7 +274,6 @@ describe("gitlab merge request config parser", () => { body: "This is the body", reviewers: ["superuser1", "superuser2"], assignees: ["superuser"], - labels: ["backport-prod"], targetRepo: { owner: "superuser", project: "backporting-example", @@ -313,18 +287,25 @@ describe("gitlab merge request config parser", () => { 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", + expect(configs.backportPullRequest).toEqual({ + author: "Me", + url: undefined, + htmlUrl: undefined, title: "New Title", body: "New Body Prefix -New Body", reviewers: ["superuser"], assignees: [], - labels: [], - comments: [], + 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, }); }); @@ -342,22 +323,17 @@ describe("gitlab merge request config parser", () => { 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.targetBranch).toEqual("prod"); expect(configs.folder).toEqual(process.cwd() + "/bp"); expect(configs.originalPullRequest).toEqual({ number: 1, @@ -371,7 +347,6 @@ describe("gitlab merge request config parser", () => { body: "This is the body", reviewers: ["superuser1", "superuser2"], assignees: ["superuser"], - labels: ["backport-prod"], targetRepo: { owner: "superuser", project: "backporting-example", @@ -385,18 +360,25 @@ describe("gitlab merge request config parser", () => { 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", + expect(configs.backportPullRequest).toEqual({ + author: "Me", + url: undefined, + htmlUrl: undefined, title: "New Title", body: "New Body Prefix -New Body", reviewers: ["user1", "user2"], assignees: ["user3", "user4"], - labels: [], - comments: [], + 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, }); }); @@ -414,22 +396,17 @@ describe("gitlab merge request config parser", () => { 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.targetBranch).toEqual("prod"); expect(configs.folder).toEqual(process.cwd() + "/bp"); expect(configs.originalPullRequest).toEqual({ number: 1, @@ -443,7 +420,6 @@ describe("gitlab merge request config parser", () => { body: "This is the body", reviewers: ["superuser1", "superuser2"], assignees: ["superuser"], - labels: ["backport-prod"], targetRepo: { owner: "superuser", project: "backporting-example", @@ -457,257 +433,14 @@ describe("gitlab merge request config parser", () => { 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", + expect(configs.backportPullRequest).toEqual({ + author: "Me", + url: undefined, + htmlUrl: undefined, 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", @@ -719,57 +452,88 @@ describe("gitlab merge request config parser", () => { 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", + }); + + + 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(configs.dryRun).toEqual(false); + expect(configs.git).toEqual({ + user: "Gitlab", + email: "noreply@gitlab.com" + }); + expect(configs.auth).toEqual(undefined); + expect(configs.targetBranch).toEqual("prod"); + 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"], + 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.backportPullRequest).toEqual({ + author: "Gitlab", + url: undefined, + htmlUrl: undefined, + 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: [], + 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, }); }); - 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, - }; + 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(""); + expect(configs.auth).toEqual("my-token"); + expect(configs.targetBranch).toEqual("prod"); expect(configs.folder).toEqual(process.cwd() + "/bp"); expect(configs.originalPullRequest).toEqual({ number: 1, @@ -783,7 +547,6 @@ describe("gitlab merge request config parser", () => { body: "This is the body", reviewers: ["superuser1", "superuser2"], assignees: ["superuser"], - labels: ["backport-prod"], targetRepo: { owner: "superuser", project: "backporting-example", @@ -797,68 +560,14 @@ describe("gitlab merge request config parser", () => { 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", + expect(configs.backportPullRequest).toEqual({ + author: "Me", + url: undefined, + htmlUrl: undefined, 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", @@ -869,43 +578,7 @@ describe("gitlab merge request config parser", () => { 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.", + bpBranchName: undefined, }); }); }); \ 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 8c71609..04c069f 100644 --- a/test/service/git/git-cli.test.ts +++ b/test/service/git/git-cli.test.ts @@ -114,31 +114,4 @@ 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 index df64e40..0d05ea3 100644 --- a/test/service/git/git-client-factory.test.ts +++ b/test/service/git/git-client-factory.test.ts @@ -20,11 +20,6 @@ describe("git client factory test", () => { 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(); @@ -36,10 +31,4 @@ describe("git client factory test", () => { 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 index 9a90936..af5a561 100644 --- a/test/service/git/git-util.test.ts +++ b/test/service/git/git-util.test.ts @@ -1,4 +1,4 @@ -import { inferGitApiUrl, inferGitClient, inferSquash } from "@bp/service/git/git-util"; +import { inferGitApiUrl, inferGitClient } from "@bp/service/git/git-util"; import { GitClientType } from "@bp/service/git/git.types"; describe("check git utilities", () => { @@ -23,42 +23,15 @@ describe("check git utilities", () => { 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); + expect(inferGitClient("https://github.com/superuser/backporting-example/-/merge_requests/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", ()=> { + 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); - }); -}); +}); \ No newline at end of file diff --git a/test/service/git/github/github-client.test.ts b/test/service/git/github/github-client.test.ts index 35a4d5c..093ce07 100644 --- a/test/service/git/github/github-client.test.ts +++ b/test/service/git/github/github-client.test.ts @@ -1,7 +1,7 @@ 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 { mergedPullRequestFixture, repo, targetOwner } from "../../../support/mock/github-data"; import { mockGitHubClient } from "../../../support/mock/git-client-mock-support"; describe("github service", () => { @@ -22,7 +22,7 @@ describe("github service", () => { }); test("get pull request: success", async () => { - const res: GitPullRequest = await gitClient.getPullRequest(TARGET_OWNER, REPO, MERGED_PR_FIXTURE.number, true); + const res: GitPullRequest = await gitClient.getPullRequest(targetOwner, repo, mergedPullRequestFixture.number); expect(res.sourceRepo).toEqual({ owner: "fork", project: "reponame", diff --git a/test/service/git/gitlab/gitlab-client.test.ts b/test/service/git/gitlab/gitlab-client.test.ts index 38deda1..686ba2e 100644 --- a/test/service/git/gitlab/gitlab-client.test.ts +++ b/test/service/git/gitlab/gitlab-client.test.ts @@ -29,9 +29,13 @@ describe("github service", () => { GitClientFactory.reset(); gitClient = GitClientFactory.getOrCreate(GitClientType.GITLAB, "whatever", "apiUrl") as GitLabClient; }); - + + afterEach(() => { + jest.clearAllMocks(); + }); + test("get merged pull request", async () => { - const res: GitPullRequest = await gitClient.getPullRequest("superuser", "backporting-example", 1, true); + const res: GitPullRequest = await gitClient.getPullRequest("superuser", "backporting-example", 1); // check content expect(res.sourceRepo).toEqual({ @@ -56,7 +60,7 @@ describe("github service", () => { }); test("get open pull request", async () => { - const res: GitPullRequest = await gitClient.getPullRequest("superuser", "backporting-example", 2, true); + const res: GitPullRequest = await gitClient.getPullRequest("superuser", "backporting-example", 2); expect(res.sourceRepo).toEqual({ owner: "superuser", project: "backporting-example", @@ -88,8 +92,6 @@ describe("github service", () => { head: "bp-branch", reviewers: [], assignees: [], - labels: [], - comments: [], }; const url: string = await gitClient.createPullRequest(backport); @@ -119,8 +121,6 @@ describe("github service", () => { head: "bp-branch", reviewers: ["superuser", "invalid"], assignees: [], - labels: [], - comments: [], }; const url: string = await gitClient.createPullRequest(backport); @@ -155,8 +155,6 @@ describe("github service", () => { head: "bp-branch", reviewers: [], assignees: ["superuser", "invalid"], - labels: [], - comments: [], }; const url: string = await gitClient.createPullRequest(backport); @@ -191,8 +189,6 @@ describe("github service", () => { head: "bp-branch-2", reviewers: ["superuser", "invalid"], assignees: [], - labels: [], - comments: [], }; const url: string = await gitClient.createPullRequest(backport); @@ -227,8 +223,6 @@ describe("github service", () => { head: "bp-branch-2", reviewers: [], assignees: ["superuser", "invalid"], - labels: [], - comments: [], }; const url: string = await gitClient.createPullRequest(backport); @@ -252,100 +246,4 @@ describe("github service", () => { 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 deleted file mode 100644 index 653dea5..0000000 --- a/test/service/runner/cli-codeberg-runner.test.ts +++ /dev/null @@ -1,1376 +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 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 index 53a4505..0b7a752 100644 --- a/test/service/runner/cli-github-runner.test.ts +++ b/test/service/runner/cli-github-runner.test.ts @@ -3,11 +3,8 @@ 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 { addProcessArgs, createTestFile, removeTestFile, 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 = { @@ -24,14 +21,10 @@ const GITHUB_MERGED_PR_W_OVERRIDES_CONFIG_FILE_CONTENT = { "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; @@ -47,13 +40,6 @@ afterAll(() => { }); beforeEach(() => { - // reset process.env variables - resetProcessArgs(); - - // reset git env tokens - resetEnvTokens(); - - // mock octokit mockGitHubClient(); // create CLI arguments parser @@ -63,6 +49,13 @@ beforeEach(() => { runner = new Runner(parser); }); +afterEach(() => { + jest.clearAllMocks(); + + // reset process.env variables + resetProcessArgs(); +}); + describe("cli runner", () => { test("with dry run", async () => { @@ -78,24 +71,20 @@ describe("cli runner", () => { 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.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", undefined, undefined, undefined); + expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc"); expect(GitCLIService.prototype.push).toBeCalledTimes(0); expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(0); - expect(GitHubClient.prototype.createPullRequestComment).toBeCalledTimes(0); }); test("overriding author", async () => { @@ -115,13 +104,13 @@ describe("cli runner", () => { 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.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", undefined, undefined, undefined); + expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc"); expect(GitCLIService.prototype.push).toBeCalledTimes(0); expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(0); @@ -142,20 +131,17 @@ describe("cli runner", () => { 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.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", undefined, undefined, undefined); + expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc"); expect(GitCLIService.prototype.addRemote).toBeCalledTimes(0); expect(GitCLIService.prototype.addRemote).toBeCalledTimes(0); @@ -179,20 +165,17 @@ describe("cli runner", () => { 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.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", undefined, undefined, undefined); + expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc"); expect(GitCLIService.prototype.push).toBeCalledTimes(0); expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(0); @@ -210,39 +193,33 @@ describe("cli runner", () => { 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.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", undefined, undefined, undefined); + expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc"); expect(GitCLIService.prototype.push).toBeCalledTimes(1); - expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-28f63db"); + expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc"); expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(1); expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({ owner: "owner", repo: "reponame", - head: "bp-target-28f63db", + head: "bp-target-28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", base: "target", title: "[target] PR Title", - body: "**Backport:** https://github.com/owner/reponame/pull/2368\r\n\r\nPlease review and merge", + body: expect.stringContaining("**Backport:** https://github.com/owner/reponame/pull/2368"), reviewers: ["gh-user", "that-s-a-user"], assignees: [], - labels: [], - comments: [], } ); - expect(GitHubClient.prototype.createPullRequest).toReturnTimes(1); }); test("same owner", async () => { @@ -257,39 +234,32 @@ describe("cli runner", () => { 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.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", undefined, undefined, undefined); + expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc"); expect(GitCLIService.prototype.push).toBeCalledTimes(1); - expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-28f63db"); + expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc"); expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(1); expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({ owner: "owner", repo: "reponame", - head: "bp-target-28f63db", + head: "bp-target-28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", base: "target", title: "[target] PR Title", - body: "**Backport:** https://github.com/owner/reponame/pull/8632\r\n\r\nPlease review and merge", + body: expect.stringContaining("**Backport:** https://github.com/owner/reponame/pull/8632"), 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 () => { @@ -300,10 +270,10 @@ describe("cli runner", () => { "https://github.com/owner/reponame/pull/6666" ]); - await expect(() => runner.execute()).rejects.toThrow("Provided pull request is closed and not merged"); + expect(async () => await runner.execute()).rejects.toThrow("Provided pull request is closed and not merged!"); }); - test("open pull request simple", async () => { + test("open pull request", async () => { addProcessArgs([ "-tb", "target", @@ -315,88 +285,33 @@ describe("cli runner", () => { 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.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", undefined, undefined, undefined); + expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "91748965051fae1330ad58d15cf694e103267c87"); expect(GitCLIService.prototype.push).toBeCalledTimes(1); - expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-9174896"); + expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-91748965051fae1330ad58d15cf694e103267c87"); expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(1); expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({ owner: "owner", repo: "reponame", - head: "bp-target-9174896", + head: "bp-target-91748965051fae1330ad58d15cf694e103267c87", base: "target", title: "[target] PR Title", - body: "**Backport:** https://github.com/owner/reponame/pull/4444\r\n\r\nPlease review and merge", + body: expect.stringContaining("**Backport:** https://github.com/owner/reponame/pull/4444"), 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 () => { @@ -410,22 +325,19 @@ describe("cli runner", () => { "--body", "New Body", "--body-prefix", - "New Body Prefix\\r\\n\\r\\n", + "New Body Prefix - ", "--bp-branch-name", "bp_branch_name", "--reviewers", "user1,user2", "--assignees", - "user3,user4", + "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"); @@ -436,7 +348,7 @@ describe("cli runner", () => { 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.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc"); expect(GitCLIService.prototype.push).toBeCalledTimes(1); expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp_branch_name"); @@ -448,14 +360,11 @@ describe("cli runner", () => { head: "bp_branch_name", base: "target", title: "New Title", - body: "New Body Prefix\r\n\r\nNew Body", + body: "New Body Prefix - New Body", reviewers: ["user1", "user2"], assignees: ["user3", "user4"], - labels: [], - comments: [], } ); - expect(GitHubClient.prototype.createPullRequest).toReturnTimes(1); }); test("set empty reviewers", async () => { @@ -481,9 +390,6 @@ describe("cli runner", () => { 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"); @@ -494,7 +400,7 @@ describe("cli runner", () => { 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.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc"); expect(GitCLIService.prototype.push).toBeCalledTimes(1); expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp_branch_name"); @@ -509,110 +415,8 @@ describe("cli runner", () => { 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 () => { @@ -625,9 +429,6 @@ describe("cli runner", () => { 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"); @@ -638,7 +439,7 @@ describe("cli runner", () => { 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.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc"); expect(GitCLIService.prototype.push).toBeCalledTimes(1); expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp_branch_name"); @@ -653,724 +454,7 @@ describe("cli runner", () => { 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); - }); -}); +}); \ No newline at end of file diff --git a/test/service/runner/cli-gitlab-runner.test.ts b/test/service/runner/cli-gitlab-runner.test.ts index e066fe8..c8b9292 100644 --- a/test/service/runner/cli-gitlab-runner.test.ts +++ b/test/service/runner/cli-gitlab-runner.test.ts @@ -3,12 +3,9 @@ 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 { addProcessArgs, createTestFile, removeTestFile, 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 = { @@ -24,8 +21,6 @@ const GITLAB_MERGED_PR_COMPLEX_CONFIG_FILE_CONTENT = { "reviewers": [], "assignees": ["user3", "user4"], "inheritReviewers": false, - "labels": ["cli gitlab cherry pick :cherries:"], - "inheritLabels": true, }; jest.mock("axios", () => { @@ -37,15 +32,13 @@ jest.mock("axios", () => { iid: 1, // FIXME: I am not testing this atm } }), - put: async () => undefined, + put: jest.fn(), }), }; }); jest.mock("@bp/service/git/git-cli"); jest.spyOn(GitLabClient.prototype, "createPullRequest"); -jest.spyOn(GitLabClient.prototype, "createPullRequestComment"); -jest.spyOn(GitClientFactory, "getOrCreate"); let parser: ArgsParser; @@ -62,12 +55,6 @@ afterAll(() => { }); beforeEach(() => { - // reset process.env variables - resetProcessArgs(); - - // reset git env tokens - resetEnvTokens(); - // create CLI arguments parser parser = new CLIArgsParser(); @@ -75,7 +62,15 @@ beforeEach(() => { runner = new Runner(parser); }); +afterEach(() => { + jest.clearAllMocks(); + + // reset process.env variables + resetProcessArgs(); +}); + describe("cli runner", () => { + test("with dry run", async () => { addProcessArgs([ "-d", @@ -89,24 +84,20 @@ describe("cli runner", () => { 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.createLocalBranch).toBeCalledWith(cwd, "bp-target-9e15674ebd48e05c6e428a1fa31dbb60a778d644"); 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.cherryPick).toBeCalledWith(cwd, "9e15674ebd48e05c6e428a1fa31dbb60a778d644"); 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 () => { @@ -124,20 +115,17 @@ describe("cli runner", () => { 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.createLocalBranch).toBeCalledWith(cwd, "bp-target-9e15674ebd48e05c6e428a1fa31dbb60a778d644"); 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.cherryPick).toBeCalledWith(cwd, "9e15674ebd48e05c6e428a1fa31dbb60a778d644"); expect(GitCLIService.prototype.addRemote).toBeCalledTimes(0); expect(GitCLIService.prototype.addRemote).toBeCalledTimes(0); @@ -158,36 +146,31 @@ describe("cli runner", () => { 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.createLocalBranch).toBeCalledWith(cwd, "bp-target-9e15674ebd48e05c6e428a1fa31dbb60a778d644"); 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.cherryPick).toBeCalledWith(cwd, "9e15674ebd48e05c6e428a1fa31dbb60a778d644"); expect(GitCLIService.prototype.push).toBeCalledTimes(1); - expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-9e15674"); + expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-9e15674ebd48e05c6e428a1fa31dbb60a778d644"); expect(GitLabClient.prototype.createPullRequest).toBeCalledTimes(1); expect(GitLabClient.prototype.createPullRequest).toBeCalledWith({ owner: "superuser", repo: "backporting-example", - head: "bp-target-9e15674", + head: "bp-target-9e15674ebd48e05c6e428a1fa31dbb60a778d644", 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: [], } ); }); @@ -200,8 +183,7 @@ describe("cli runner", () => { "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); + expect(async () => await runner.execute()).rejects.toThrow("Provided pull request is closed and not merged!"); }); test("merged pull request", async () => { @@ -216,40 +198,34 @@ describe("cli runner", () => { 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.createLocalBranch).toBeCalledWith(cwd, "bp-target-ebb1eca696c42fd067658bd9b5267709f78ef38e"); // 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.cherryPick).toBeCalledWith(cwd, "ebb1eca696c42fd067658bd9b5267709f78ef38e"); expect(GitCLIService.prototype.push).toBeCalledTimes(1); - expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-ebb1eca"); + expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-ebb1eca696c42fd067658bd9b5267709f78ef38e"); expect(GitLabClient.prototype.createPullRequest).toBeCalledTimes(1); expect(GitLabClient.prototype.createPullRequest).toBeCalledWith({ owner: "superuser", repo: "backporting-example", - head: "bp-target-ebb1eca", + head: "bp-target-ebb1eca696c42fd067658bd9b5267709f78ef38e", 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); }); @@ -277,9 +253,6 @@ describe("cli runner", () => { 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"); @@ -290,7 +263,7 @@ describe("cli runner", () => { 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.cherryPick).toBeCalledWith(cwd, "9e15674ebd48e05c6e428a1fa31dbb60a778d644"); expect(GitCLIService.prototype.push).toBeCalledTimes(1); expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp_branch_name"); @@ -305,8 +278,6 @@ describe("cli runner", () => { body: "New Body Prefix - New Body", reviewers: ["user1", "user2"], assignees: ["user3", "user4"], - labels: [], - comments: [], } ); }); @@ -334,9 +305,6 @@ describe("cli runner", () => { 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"); @@ -347,7 +315,7 @@ describe("cli runner", () => { 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.cherryPick).toBeCalledWith(cwd, "9e15674ebd48e05c6e428a1fa31dbb60a778d644"); expect(GitCLIService.prototype.push).toBeCalledTimes(1); expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp_branch_name"); @@ -362,107 +330,6 @@ describe("cli runner", () => { 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: [], } ); }); @@ -477,229 +344,33 @@ describe("cli runner", () => { 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"); + expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-prod-ebb1eca696c42fd067658bd9b5267709f78ef38e"); // 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.cherryPick).toBeCalledWith(cwd, "ebb1eca696c42fd067658bd9b5267709f78ef38e"); expect(GitCLIService.prototype.push).toBeCalledTimes(1); - expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-prod-ebb1eca"); + expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-prod-ebb1eca696c42fd067658bd9b5267709f78ef38e"); expect(GitLabClient.prototype.createPullRequest).toBeCalledTimes(1); expect(GitLabClient.prototype.createPullRequest).toBeCalledWith({ owner: "superuser", repo: "backporting-example", - head: "bp-prod-ebb1eca", + head: "bp-prod-ebb1eca696c42fd067658bd9b5267709f78ef38e", 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/gha-github-runner.test.ts b/test/service/runner/gha-github-runner.test.ts index 5461b33..ab2236e 100644 --- a/test/service/runner/gha-github-runner.test.ts +++ b/test/service/runner/gha-github-runner.test.ts @@ -3,10 +3,8 @@ 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 { createTestFile, removeTestFile, 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 = { @@ -23,15 +21,11 @@ const GITHUB_MERGED_PR_W_OVERRIDES_CONFIG_FILE_CONTENT = { "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; @@ -47,9 +41,6 @@ afterAll(() => { }); beforeEach(() => { - // reset git env tokens - resetEnvTokens(); - mockGitHubClient(); // create GHA arguments parser @@ -59,6 +50,10 @@ beforeEach(() => { runner = new Runner(parser); }); +afterEach(() => { + jest.clearAllMocks(); +}); + describe("gha runner", () => { test("with dry run", async () => { spyGetInput({ @@ -71,24 +66,20 @@ describe("gha runner", () => { 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.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", undefined, undefined, undefined); + expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc"); expect(GitCLIService.prototype.push).toBeCalledTimes(0); expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(0); - expect(GitHubClient.prototype.createPullRequestComment).toBeCalledTimes(0); }); test("without dry run", async () => { @@ -101,39 +92,33 @@ describe("gha runner", () => { 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.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", undefined, undefined, undefined); + expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc"); expect(GitCLIService.prototype.push).toBeCalledTimes(1); - expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-28f63db"); + expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc"); expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(1); expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({ owner: "owner", repo: "reponame", - head: "bp-target-28f63db", + head: "bp-target-28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc", base: "target", title: "[target] PR Title", - body: "**Backport:** https://github.com/owner/reponame/pull/2368\r\n\r\nPlease review and merge", + body: expect.stringContaining("**Backport:** https://github.com/owner/reponame/pull/2368"), reviewers: ["gh-user", "that-s-a-user"], assignees: [], - labels: [], - comments: [], } ); - expect(GitHubClient.prototype.createPullRequest).toReturnTimes(1); }); test("closed and not merged pull request", async () => { @@ -142,7 +127,7 @@ describe("gha runner", () => { "pull-request": "https://github.com/owner/reponame/pull/6666" }); - await expect(() => runner.execute()).rejects.toThrow("Provided pull request is closed and not merged"); + expect(async () => await runner.execute()).rejects.toThrow("Provided pull request is closed and not merged!"); }); test("open pull request", async () => { @@ -155,39 +140,33 @@ describe("gha runner", () => { 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.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", undefined, undefined, undefined); + expect(GitCLIService.prototype.cherryPick).toBeCalledWith(cwd, "91748965051fae1330ad58d15cf694e103267c87"); expect(GitCLIService.prototype.push).toBeCalledTimes(1); - expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-9174896"); + expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-91748965051fae1330ad58d15cf694e103267c87"); expect(GitHubClient.prototype.createPullRequest).toBeCalledTimes(1); expect(GitHubClient.prototype.createPullRequest).toBeCalledWith({ owner: "owner", repo: "reponame", - head: "bp-target-9174896", + head: "bp-target-91748965051fae1330ad58d15cf694e103267c87", base: "target", title: "[target] PR Title", - body: "**Backport:** https://github.com/owner/reponame/pull/4444\r\n\r\nPlease review and merge", + body: expect.stringContaining("**Backport:** https://github.com/owner/reponame/pull/4444"), reviewers: ["gh-user"], assignees: [], - labels: [], - comments: [], } ); - expect(GitHubClient.prototype.createPullRequest).toReturnTimes(1); }); test("override backporting pr data", async () => { @@ -196,7 +175,7 @@ describe("gha runner", () => { "pull-request": "https://github.com/owner/reponame/pull/2368", "title": "New Title", "body": "New Body", - "body-prefix": "New Body Prefix\\r\\n\\r\\n", + "body-prefix": "New Body Prefix - ", "bp-branch-name": "bp_branch_name", "reviewers": "user1, user2", "assignees": "user3, user4", @@ -206,9 +185,6 @@ describe("gha runner", () => { 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"); @@ -219,7 +195,7 @@ describe("gha runner", () => { 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.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc"); expect(GitCLIService.prototype.push).toBeCalledTimes(1); expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp_branch_name"); @@ -231,14 +207,11 @@ describe("gha runner", () => { head: "bp_branch_name", base: "target", title: "New Title", - body: "New Body Prefix\r\n\r\nNew Body", + body: "New Body Prefix - New Body", reviewers: ["user1", "user2"], assignees: ["user3", "user4"], - labels: [], - comments: [], } ); - expect(GitHubClient.prototype.createPullRequest).toReturnTimes(1); }); test("set empty reviewers", async () => { @@ -258,9 +231,6 @@ describe("gha runner", () => { 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"); @@ -271,7 +241,7 @@ describe("gha runner", () => { 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.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc"); expect(GitCLIService.prototype.push).toBeCalledTimes(1); expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp_branch_name"); @@ -286,105 +256,8 @@ describe("gha runner", () => { 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 () => { @@ -396,9 +269,6 @@ describe("gha runner", () => { 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"); @@ -409,7 +279,7 @@ describe("gha runner", () => { 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.cherryPick).toBeCalledWith(cwd, "28f63db774185f4ec4b57cd9aaeb12dbfb4c9ecc"); expect(GitCLIService.prototype.push).toBeCalledTimes(1); expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp_branch_name"); @@ -424,415 +294,7 @@ describe("gha runner", () => { 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 index f0f41f6..0443342 100644 --- a/test/service/runner/gha-gitlab-runner.test.ts +++ b/test/service/runner/gha-gitlab-runner.test.ts @@ -3,11 +3,9 @@ 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 { createTestFile, removeTestFile, 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 = { @@ -23,8 +21,6 @@ const GITLAB_MERGED_PR_COMPLEX_CONFIG_FILE_CONTENT = { "reviewers": [], "assignees": ["user3", "user4"], "inheritReviewers": false, - "labels": ["gha gitlab cherry pick :cherries:"], - "inheritLabels": true, }; jest.mock("axios", () => { @@ -36,15 +32,13 @@ jest.mock("axios", () => { iid: 1, // FIXME: I am not testing this atm } }), - put: async () => undefined, // make it async so that .catch doesn't throw an error + put: jest.fn(), }), }; }); 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; @@ -60,9 +54,6 @@ afterAll(() => { }); beforeEach(() => { - // reset git env tokens - resetEnvTokens(); - // create GHA arguments parser parser = new GHAArgsParser(); @@ -70,6 +61,10 @@ beforeEach(() => { runner = new Runner(parser); }); +afterEach(() => { + jest.clearAllMocks(); +}); + describe("gha runner", () => { test("with dry run", async () => { spyGetInput({ @@ -82,24 +77,20 @@ describe("gha runner", () => { 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.createLocalBranch).toBeCalledWith(cwd, "bp-target-9e15674ebd48e05c6e428a1fa31dbb60a778d644"); 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.cherryPick).toBeCalledWith(cwd, "9e15674ebd48e05c6e428a1fa31dbb60a778d644"); expect(GitCLIService.prototype.push).toBeCalledTimes(0); expect(GitLabClient.prototype.createPullRequest).toBeCalledTimes(0); - expect(GitLabClient.prototype.createPullRequestComment).toBeCalledTimes(0); }); test("without dry run", async () => { @@ -112,36 +103,31 @@ describe("gha runner", () => { 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.createLocalBranch).toBeCalledWith(cwd, "bp-target-9e15674ebd48e05c6e428a1fa31dbb60a778d644"); 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.cherryPick).toBeCalledWith(cwd, "9e15674ebd48e05c6e428a1fa31dbb60a778d644"); expect(GitCLIService.prototype.push).toBeCalledTimes(1); - expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-9e15674"); + expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-9e15674ebd48e05c6e428a1fa31dbb60a778d644"); expect(GitLabClient.prototype.createPullRequest).toBeCalledTimes(1); expect(GitLabClient.prototype.createPullRequest).toBeCalledWith({ owner: "superuser", repo: "backporting-example", - head: "bp-target-9e15674", + head: "bp-target-9e15674ebd48e05c6e428a1fa31dbb60a778d644", 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: [], } ); }); @@ -152,7 +138,7 @@ describe("gha runner", () => { "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"); + expect(async () => await runner.execute()).rejects.toThrow("Provided pull request is closed and not merged!"); }); test("merged pull request", async () => { @@ -165,35 +151,30 @@ describe("gha runner", () => { 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.createLocalBranch).toBeCalledWith(cwd, "bp-target-ebb1eca696c42fd067658bd9b5267709f78ef38e"); 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.cherryPick).toBeCalledWith(cwd, "ebb1eca696c42fd067658bd9b5267709f78ef38e"); expect(GitCLIService.prototype.push).toBeCalledTimes(1); - expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-ebb1eca"); + expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-target-ebb1eca696c42fd067658bd9b5267709f78ef38e"); expect(GitLabClient.prototype.createPullRequest).toBeCalledTimes(1); expect(GitLabClient.prototype.createPullRequest).toBeCalledWith({ owner: "superuser", repo: "backporting-example", - head: "bp-target-ebb1eca", + head: "bp-target-ebb1eca696c42fd067658bd9b5267709f78ef38e", 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: [], } ); }); @@ -214,9 +195,6 @@ describe("gha runner", () => { 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"); @@ -227,7 +205,7 @@ describe("gha runner", () => { 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.cherryPick).toBeCalledWith(cwd, "9e15674ebd48e05c6e428a1fa31dbb60a778d644"); expect(GitCLIService.prototype.push).toBeCalledTimes(1); expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp_branch_name"); @@ -242,8 +220,6 @@ describe("gha runner", () => { body: "New Body Prefix - New Body", reviewers: ["user1", "user2"], assignees: ["user3", "user4"], - labels: [], - comments: [], } ); }); @@ -265,9 +241,6 @@ describe("gha runner", () => { 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"); @@ -278,7 +251,7 @@ describe("gha runner", () => { 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.cherryPick).toBeCalledWith(cwd, "9e15674ebd48e05c6e428a1fa31dbb60a778d644"); expect(GitCLIService.prototype.push).toBeCalledTimes(1); expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp_branch_name"); @@ -293,97 +266,6 @@ describe("gha runner", () => { 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: [], } ); }); @@ -397,167 +279,32 @@ describe("gha runner", () => { 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"); + expect(GitCLIService.prototype.createLocalBranch).toBeCalledWith(cwd, "bp-prod-ebb1eca696c42fd067658bd9b5267709f78ef38e"); // 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.cherryPick).toBeCalledWith(cwd, "ebb1eca696c42fd067658bd9b5267709f78ef38e"); expect(GitCLIService.prototype.push).toBeCalledTimes(1); - expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-prod-ebb1eca"); + expect(GitCLIService.prototype.push).toBeCalledWith(cwd, "bp-prod-ebb1eca696c42fd067658bd9b5267709f78ef38e"); expect(GitLabClient.prototype.createPullRequest).toBeCalledTimes(1); expect(GitLabClient.prototype.createPullRequest).toBeCalledWith({ owner: "superuser", repo: "backporting-example", - head: "bp-prod-ebb1eca", + head: "bp-prod-ebb1eca696c42fd067658bd9b5267709f78ef38e", 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: [], } ); }); diff --git a/test/service/runner/runner-util.test.ts b/test/service/runner/runner-util.test.ts deleted file mode 100644 index 7f7d982..0000000 --- a/test/service/runner/runner-util.test.ts +++ /dev/null @@ -1,19 +0,0 @@ -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 deleted file mode 100644 index 1781aef..0000000 --- a/test/support/mock/codeberg-data.ts +++ /dev/null @@ -1,2004 +0,0 @@ -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 index 1a38493..7b4c987 100644 --- a/test/support/mock/git-client-mock-support.ts +++ b/test/support/mock/git-client-mock-support.ts @@ -1,12 +1,7 @@ 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; +import { targetOwner, repo, mergedPullRequestFixture, openPullRequestFixture, notMergedPullRequestFixture, notFoundPullRequestNumber, sameOwnerPullRequestFixture } from "./github-data"; +import { CLOSED_NOT_MERGED_MR, MERGED_SQUASHED_MR, OPEN_MR, PROJECT_EXAMPLE, SUPERUSER} from "./gitlab-data"; const logger = LoggerServiceFactory.getLogger(); @@ -23,22 +18,10 @@ export const getAxiosMocked = (url: string) => { 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 { @@ -49,24 +32,18 @@ export const getAxiosMocked = (url: string) => { 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,}) => { +export const postAxiosMocked = (_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") { + 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") { + } if (data?.source_branch === "bp-branch-2") { responseData = { // we do not need the whole response iid: SECOND_NEW_GITLAB_MR_ID, @@ -80,7 +57,7 @@ export const postAxiosMocked = async (url: string, data?: {source_branch: string }; }; -export const putAxiosMocked = async (url: string, _data?: unknown) => { +export const putAxiosMocked = (url: string, _data?: unknown) => { const responseData = undefined; // gitlab @@ -100,7 +77,7 @@ export const putAxiosMocked = async (url: string, _data?: unknown) => { // GITHUB - OCTOKIT export const mockGitHubClient = (apiUrl = "https://api.github.com"): Moctokit => { - logger.debug("Setting up moctokit.."); + logger.debug("Setting up moctokit."); const mock = new Moctokit(apiUrl); @@ -109,286 +86,83 @@ export const mockGitHubClient = (apiUrl = "https://api.github.com"): Moctokit => // valid requests mock.rest.pulls .get({ - owner: TARGET_OWNER, - repo: REPO, - pull_number: MERGED_PR_FIXTURE.number + owner: targetOwner, + repo: repo, + pull_number: mergedPullRequestFixture.number }) .reply({ status: 200, - data: MERGED_PR_FIXTURE + data: mergedPullRequestFixture }); mock.rest.pulls - .get({ - owner: TARGET_OWNER, - repo: REPO, - pull_number: MULT_COMMITS_PR_FIXTURE.number - }) - .reply({ - status: 200, - data: MULT_COMMITS_PR_FIXTURE - }); + .get({ + owner: targetOwner, + repo: repo, + pull_number: sameOwnerPullRequestFixture.number + }) + .reply({ + status: 200, + data: sameOwnerPullRequestFixture + }); mock.rest.pulls .get({ - owner: TARGET_OWNER, - repo: REPO, - pull_number: OPEN_PR_FIXTURE.number + owner: targetOwner, + repo: repo, + pull_number: openPullRequestFixture.number }) .reply({ status: 200, - data: OPEN_PR_FIXTURE + data: openPullRequestFixture }); mock.rest.pulls - .get({ - owner: TARGET_OWNER, - repo: REPO, - pull_number: NOT_MERGED_PR_FIXTURE.number - }) - .reply({ - status: 200, - data: NOT_MERGED_PR_FIXTURE - }); + .get({ + owner: targetOwner, + repo: repo, + pull_number: notMergedPullRequestFixture.number + }) + .reply({ + status: 200, + data: notMergedPullRequestFixture + }); - 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, - } + data: mergedPullRequestFixture }); mock.rest.pulls .requestReviewers() .reply({ - repeat: REPEAT, status: 201, - data: MERGED_PR_FIXTURE + data: mergedPullRequestFixture }); 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 + owner: targetOwner, + repo: repo, + pull_number: notFoundPullRequestNumber }) .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/mock/github-data.ts b/test/support/mock/github-data.ts index 0b46741..fc13e32 100644 --- a/test/support/mock/github-data.ts +++ b/test/support/mock/github-data.ts @@ -1,11 +1,9 @@ -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 targetOwner = "owner"; +export const sourceOwner = "fork"; +export const repo = "reponame"; +export const notFoundPullRequestNumber = 1; -export const MERGED_PR_FIXTURE = { +export const mergedPullRequestFixture = { "url": "https://api.github.com/repos/owner/reponame/pulls/2368", "id": 1137188271, "node_id": "PR_kwDOABTq6s5DyB2v", @@ -93,15 +91,7 @@ export const MERGED_PR_FIXTURE = { ], "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, @@ -476,7 +466,7 @@ export const MERGED_PR_FIXTURE = { "changed_files": 2 }; -export const OPEN_PR_FIXTURE = { +export const openPullRequestFixture = { "url": "https://api.github.com/repos/owner/reponame/pulls/4444", "id": 1137188271, "node_id": "PR_kwDOABTq6s5DyB2v", @@ -900,7 +890,7 @@ export const OPEN_PR_FIXTURE = { "changed_files": 2 }; -export const NOT_MERGED_PR_FIXTURE = { +export const notMergedPullRequestFixture = { "url": "https://api.github.com/repos/owner/reponame/pulls/6666", "id": 1137188271, "node_id": "PR_kwDOABTq6s5DyB2v", @@ -1343,7 +1333,7 @@ export const NOT_MERGED_PR_FIXTURE = { "changed_files": 2 }; -export const MULT_COMMITS_PR_FIXTURE = { +export const sameOwnerPullRequestFixture = { "url": "https://api.github.com/repos/owner/reponame/pulls/8632", "id": 1137188271, "node_id": "PR_kwDOABTq6s5DyB2v", @@ -1431,33 +1421,7 @@ export const MULT_COMMITS_PR_FIXTURE = { ], "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, @@ -1830,173 +1794,4 @@ export const MULT_COMMITS_PR_FIXTURE = { "additions": 2, "deletions": 2, "changed_files": 2 -}; - -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 +}; \ No newline at end of file diff --git a/test/support/mock/gitlab-data.ts b/test/support/mock/gitlab-data.ts index 7adcf52..ea68947 100644 --- a/test/support/mock/gitlab-data.ts +++ b/test/support/mock/gitlab-data.ts @@ -110,7 +110,7 @@ export const PROJECT_EXAMPLE = { "build_git_strategy":"fetch", "keep_latest_artifact":true, "restrict_user_defined_variables":false, - "runners_token":"TOKEN", + "runners_token":"GR13489419z7QQ54AUgJaNMFD5asU", "runner_token_expiration_interval":null, "group_runners_enabled":true, "auto_cancel_pending_pipelines":"enabled", @@ -161,166 +161,6 @@ export const PROJECT_EXAMPLE = { } }; -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, @@ -401,7 +241,7 @@ export const MERGED_SQUASHED_MR = { "source_project_id":76316, "target_project_id":76316, "labels":[ - "backport-prod" + ], "draft":false, "work_in_progress":false, @@ -689,95 +529,6 @@ export const CLOSED_NOT_MERGED_MR = { } }; -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", @@ -786,273 +537,3 @@ export const SUPERUSER = { "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/utils.ts b/test/support/utils.ts index e470906..693610d 100644 --- a/test/support/utils.ts +++ b/test/support/utils.ts @@ -1,5 +1,4 @@ import * as core from "@actions/core"; -import { AuthTokenId } from "@bp/service/configs/configs.types"; import * as fs from "fs"; export const addProcessArgs = (args: string[]) => { @@ -10,13 +9,6 @@ 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");