Compare commits

..
29 Commits
Author SHA1 Message Date
Rui Chen 8a0cd651e5 release 3.0.4 (#865)
main / build (push) Canceled after 0s
Signed-off-by: Rui Chen <rui@chenrui.dev>
2026-11-05 09:25:01 -05:00
dependabot[bot] ac01154694 chore(deps): bump the npm group across 1 directory with 4 updates (#864)
Bumps the npm group with 4 updates in the / directory: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node), [@vitest/coverage-v8](https://github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-v8), [prettier](https://github.com/prettier/prettier) and [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest).


Updates `@types/node` from 24.19.1 to 24.19.2
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `@vitest/coverage-v8` from 5.0.3 to 5.0.5
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md)
- [Commits](https://github.com/vitest-dev/vitest/commits/v5.0.5/packages/coverage-v8)

Updates `prettier` from 3.9.9 to 3.9.10
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/3.9.9...3.9.10)

Updates `vitest` from 5.0.3 to 5.0.5
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md)
- [Commits](https://github.com/vitest-dev/vitest/commits/v5.0.5/packages/vitest)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.19.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm
- dependency-name: "@vitest/coverage-v8"
  dependency-version: 5.0.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm
- dependency-name: prettier
  dependency-version: 3.9.10
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm
- dependency-name: vitest
  dependency-version: 5.0.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-11-05 08:58:51 -05:00
dependabot[bot]andRui Chen ca4c9d538c chore(deps): bump minimatch and glob (#862)
* chore(deps): bump minimatch and glob

Bumps [minimatch](https://github.com/isaacs/minimatch) to 11.0.4 and updates ancestor dependency [glob](https://github.com/isaacs/node-glob). These dependencies need to be updated together.


Updates `minimatch` from 10.2.4 to 11.0.4
- [Changelog](https://github.com/isaacs/minimatch/blob/main/changelog.md)
- [Commits](https://github.com/isaacs/minimatch/compare/v10.2.4...v11.0.4)

Updates `glob` from 13.0.6 to 14.0.3
- [Changelog](https://github.com/isaacs/node-glob/blob/main/changelog.md)
- [Commits](https://github.com/isaacs/node-glob/compare/v13.0.6...v14.0.3)

---
updated-dependencies:
- dependency-name: glob
  dependency-version: 14.0.3
  dependency-type: direct:production
- dependency-name: minimatch
  dependency-version: 11.0.4
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

* chore: rebuild dist for glob 14.0.3

Signed-off-by: Rui Chen <rui@chenrui.dev>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: Rui Chen <rui@chenrui.dev>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Rui Chen <rui@chenrui.dev>
2026-11-05 08:54:07 -05:00
dependabot[bot]andRui Chen e4a57aec13 chore(deps): bump undici from 6.29.0 to 6.29.1 (#859)
main / build (push) Canceled after 0s
* chore(deps): bump undici from 6.29.0 to 6.29.1

Bumps [undici](https://github.com/nodejs/undici) from 6.29.0 to 6.29.1.
- [Release notes](https://github.com/nodejs/undici/releases)
- [Commits](https://github.com/nodejs/undici/compare/v6.29.0...v6.29.1)

---
updated-dependencies:
- dependency-name: undici
  dependency-version: 6.29.1
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

* chore: rebuild dist for undici 6.29.1

Signed-off-by: Rui Chen <rui@chenrui.dev>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: Rui Chen <rui@chenrui.dev>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Rui Chen <rui@chenrui.dev>
2026-11-04 23:12:09 -05:00
dependabot[bot] ee55a0ef7d chore(deps): bump vite from 8.3.2 to 8.3.5 (#855)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 8.3.2 to 8.3.5.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v8.3.5/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 8.3.5
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-11-04 23:03:26 -05:00
dependabot[bot] 8d42b221d5 chore(deps): bump actions/setup-node (#853)
Bumps the github-actions group with 1 update: [actions/setup-node](https://github.com/actions/setup-node).


Updates `actions/setup-node` from 7.0.0 to 7.1.0
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/820762786026740c76f36085b0efc47a31fe5020...949feb2413d6458794dcd2491c4babbbce0c15c1)

---
updated-dependencies:
- dependency-name: actions/setup-node
  dependency-version: 7.1.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-11-04 23:03:17 -05:00
dependabot[bot] 6680cc089e chore(deps): bump the npm group with 3 updates (#851)
main / build (push) Has been cancelled
Bumps the npm group with 3 updates: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node), [@vitest/coverage-v8](https://github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-v8) and [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest).


Updates `@types/node` from 24.19.0 to 24.19.1
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `@vitest/coverage-v8` from 5.0.2 to 5.0.3
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md)
- [Commits](https://github.com/vitest-dev/vitest/commits/v5.0.3/packages/coverage-v8)

Updates `vitest` from 5.0.2 to 5.0.3
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md)
- [Commits](https://github.com/vitest-dev/vitest/commits/v5.0.3/packages/vitest)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.19.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm
- dependency-name: "@vitest/coverage-v8"
  dependency-version: 5.0.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm
- dependency-name: vitest
  dependency-version: 5.0.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-10-17 00:15:27 -04:00
dependabot[bot] 4a050bafc0 chore(deps): bump source-map-js from 1.2.1 to 1.2.2 (#850)
Bumps [source-map-js](https://github.com/7rulnik/source-map-js) from 1.2.1 to 1.2.2.
- [Release notes](https://github.com/7rulnik/source-map-js/releases)
- [Changelog](https://github.com/7rulnik/source-map-js/blob/main/CHANGELOG.md)
- [Commits](https://github.com/7rulnik/source-map-js/compare/v1.2.1...v1.2.2)

---
updated-dependencies:
- dependency-name: source-map-js
  dependency-version: 1.2.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-10-17 00:15:20 -04:00
dependabot[bot] b5a645e6d7 chore(deps): bump the npm group with 4 updates (#848)
main / build (push) Has been cancelled
Bumps the npm group with 4 updates: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node), [@vitest/coverage-v8](https://github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-v8), [prettier](https://github.com/prettier/prettier) and [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest).


Updates `@types/node` from 24.13.6 to 24.19.0
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `@vitest/coverage-v8` from 5.0.1 to 5.0.2
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md)
- [Commits](https://github.com/vitest-dev/vitest/commits/v5.0.2/packages/coverage-v8)

Updates `prettier` from 3.9.8 to 3.9.9
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/3.9.8...3.9.9)

Updates `vitest` from 5.0.1 to 5.0.2
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md)
- [Commits](https://github.com/vitest-dev/vitest/commits/v5.0.2/packages/vitest)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.19.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: npm
- dependency-name: "@vitest/coverage-v8"
  dependency-version: 5.0.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm
- dependency-name: prettier
  dependency-version: 3.9.9
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm
- dependency-name: vitest
  dependency-version: 5.0.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-10-06 18:08:37 -04:00
dependabot[bot] d99a5de306 chore(deps): bump brace-expansion from 5.0.9 to 5.0.12 (#846)
Bumps [brace-expansion](https://github.com/juliangruber/brace-expansion) from 5.0.9 to 5.0.12.
- [Release notes](https://github.com/juliangruber/brace-expansion/releases)
- [Commits](https://github.com/juliangruber/brace-expansion/compare/v5.0.9...v5.0.12)

---
updated-dependencies:
- dependency-name: brace-expansion
  dependency-version: 5.0.12
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-10-06 18:08:27 -04:00
dependabot[bot]andRui Chen 4d8ab33c14 chore(deps): bump undici from 6.28.0 to 6.29.0 (#845)
main / build (push) Has been cancelled
* chore(deps): bump undici from 6.28.0 to 6.29.0

Bumps [undici](https://github.com/nodejs/undici) from 6.28.0 to 6.29.0.
- [Release notes](https://github.com/nodejs/undici/releases)
- [Commits](https://github.com/nodejs/undici/compare/v6.28.0...v6.29.0)

---
updated-dependencies:
- dependency-name: undici
  dependency-version: 6.29.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

* update dist/index.js

Signed-off-by: Rui Chen <rui@chenrui.dev>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: Rui Chen <rui@chenrui.dev>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Rui Chen <rui@chenrui.dev>
2026-09-30 08:14:45 -04:00
dependabot[bot] 5969a5da4c chore(deps): bump the npm group with 4 updates (#843)
Bumps the npm group with 4 updates: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node), [@vitest/coverage-v8](https://github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-v8), [prettier](https://github.com/prettier/prettier) and [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest).


Updates `@types/node` from 24.13.4 to 24.13.6
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `@vitest/coverage-v8` from 5.0.0 to 5.0.1
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md)
- [Commits](https://github.com/vitest-dev/vitest/commits/v5.0.1/packages/coverage-v8)

Updates `prettier` from 3.9.6 to 3.9.8
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/3.9.6...3.9.8)

Updates `vitest` from 5.0.0 to 5.0.1
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md)
- [Commits](https://github.com/vitest-dev/vitest/commits/v5.0.1/packages/vitest)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.13.6
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm
- dependency-name: "@vitest/coverage-v8"
  dependency-version: 5.0.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm
- dependency-name: prettier
  dependency-version: 3.9.8
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm
- dependency-name: vitest
  dependency-version: 5.0.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-30 08:13:08 -04:00
dependabot[bot] a4f117a9dd chore(deps): bump the npm group across 1 directory with 3 updates (#842)
main / build (push) Has been cancelled
Bumps the npm group with 3 updates in the / directory: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node), [@vitest/coverage-v8](https://github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-v8) and [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest).


Updates `@types/node` from 24.13.3 to 24.13.4
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `@vitest/coverage-v8` from 4.1.11 to 5.0.0
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md)
- [Commits](https://github.com/vitest-dev/vitest/commits/v5.0.0/packages/coverage-v8)

Updates `vitest` from 4.1.11 to 5.0.0
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md)
- [Commits](https://github.com/vitest-dev/vitest/commits/v5.0.0/packages/vitest)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.13.4
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm
- dependency-name: "@vitest/coverage-v8"
  dependency-version: 5.0.0
  dependency-type: direct:development
  update-type: version-update:semver-major
  dependency-group: npm
- dependency-name: vitest
  dependency-version: 5.0.0
  dependency-type: direct:development
  update-type: version-update:semver-major
  dependency-group: npm
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-09-21 09:36:09 -04:00
Rui Chen efb35369e0 release 3.0.3 (#840)
main / build (push) Has been cancelled
Signed-off-by: Rui Chen <rui@chenrui.dev>
2026-08-29 20:27:42 -04:00
dependabot[bot] 6441963a75 chore(deps): bump the npm group with 2 updates (#839)
Bumps the npm group with 2 updates: [@vitest/coverage-v8](https://github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-v8) and [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest).


Updates `@vitest/coverage-v8` from 4.1.10 to 4.1.11
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.1.11/packages/coverage-v8)

Updates `vitest` from 4.1.10 to 4.1.11
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.1.11/packages/vitest)

---
updated-dependencies:
- dependency-name: "@vitest/coverage-v8"
  dependency-version: 4.1.11
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm
- dependency-name: vitest
  dependency-version: 4.1.11
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-29 20:15:24 -04:00
dependabot[bot] e5ee6bc58a chore(deps): bump esbuild from 0.28.1 to 0.28.2 in the npm group (#837)
main / build (push) Has been cancelled
Bumps the npm group with 1 update: [esbuild](https://github.com/evanw/esbuild).


Updates `esbuild` from 0.28.1 to 0.28.2
- [Release notes](https://github.com/evanw/esbuild/releases)
- [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG.md)
- [Commits](https://github.com/evanw/esbuild/compare/v0.28.1...v0.28.2)

---
updated-dependencies:
- dependency-name: esbuild
  dependency-version: 0.28.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-16 16:38:50 -04:00
dependabot[bot]andRui Chen d1e66170d3 chore(deps): bump undici from 6.27.0 to 6.28.0 (#831)
main / build (push) Has been cancelled
* chore(deps): bump undici from 6.27.0 to 6.28.0

Bumps [undici](https://github.com/nodejs/undici) from 6.27.0 to 6.28.0.
- [Release notes](https://github.com/nodejs/undici/releases)
- [Commits](https://github.com/nodejs/undici/compare/v6.27.0...v6.28.0)

---
updated-dependencies:
- dependency-name: undici
  dependency-version: 6.28.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>

* chore: rebuild dist bundle for undici 6.28.0

Signed-off-by: Rui Chen <rui@chenrui.dev>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: Rui Chen <rui@chenrui.dev>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Rui Chen <rui@chenrui.dev>
2026-08-09 17:55:53 -04:00
dependabot[bot] 64037519ba chore(deps): bump the npm group with 2 updates (#835)
Bumps the npm group with 2 updates: [@octokit/plugin-retry](https://github.com/octokit/plugin-retry.js) and [@octokit/plugin-throttling](https://github.com/octokit/plugin-throttling.js).


Updates `@octokit/plugin-retry` from 8.1.0 to 8.1.1
- [Release notes](https://github.com/octokit/plugin-retry.js/releases)
- [Commits](https://github.com/octokit/plugin-retry.js/compare/v8.1.0...v8.1.1)

Updates `@octokit/plugin-throttling` from 11.0.3 to 11.0.5
- [Release notes](https://github.com/octokit/plugin-throttling.js/releases)
- [Commits](https://github.com/octokit/plugin-throttling.js/compare/v11.0.3...v11.0.5)

---
updated-dependencies:
- dependency-name: "@octokit/plugin-retry"
  dependency-version: 8.1.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: npm
- dependency-name: "@octokit/plugin-throttling"
  dependency-version: 11.0.5
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: npm
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-09 17:52:26 -04:00
dependabot[bot] 7c7184b687 chore(deps): bump postcss from 8.5.19 to 8.5.25 (#833)
Bumps [postcss](https://github.com/postcss/postcss) from 8.5.19 to 8.5.25.
- [Release notes](https://github.com/postcss/postcss/releases)
- [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md)
- [Commits](https://github.com/postcss/postcss/compare/8.5.19...8.5.25)

---
updated-dependencies:
- dependency-name: postcss
  dependency-version: 8.5.25
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-09 17:52:17 -04:00
dependabot[bot] 0f3f0d2943 chore(deps): bump brace-expansion from 5.0.8 to 5.0.9 (#832)
Bumps [brace-expansion](https://github.com/juliangruber/brace-expansion) from 5.0.8 to 5.0.9.
- [Release notes](https://github.com/juliangruber/brace-expansion/releases)
- [Commits](https://github.com/juliangruber/brace-expansion/compare/v5.0.8...v5.0.9)

---
updated-dependencies:
- dependency-name: brace-expansion
  dependency-version: 5.0.9
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-09 17:52:08 -04:00
dependabot[bot] 77fb938f2f chore(deps): bump prettier from 3.9.5 to 3.9.6 in the npm group (#830)
main / build (push) Has been cancelled
Bumps the npm group with 1 update: [prettier](https://github.com/prettier/prettier).


Updates `prettier` from 3.9.5 to 3.9.6
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/3.9.5...3.9.6)

---
updated-dependencies:
- dependency-name: prettier
  dependency-version: 3.9.6
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-03 20:10:11 -04:00
dependabot[bot] 5a6f51711c chore(deps): bump brace-expansion from 5.0.7 to 5.0.8 (#828)
main / build (push) Has been cancelled
Bumps [brace-expansion](https://github.com/juliangruber/brace-expansion) from 5.0.7 to 5.0.8.
- [Release notes](https://github.com/juliangruber/brace-expansion/releases)
- [Commits](https://github.com/juliangruber/brace-expansion/compare/v5.0.7...v5.0.8)

---
updated-dependencies:
- dependency-name: brace-expansion
  dependency-version: 5.0.8
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-29 08:57:07 -04:00
dependabot[bot] a3c91c98f8 chore(deps): bump the github-actions group with 2 updates (#825)
Bumps the github-actions group with 2 updates: [actions/checkout](https://github.com/actions/checkout) and [actions/setup-node](https://github.com/actions/setup-node).


Updates `actions/checkout` from 7.0.0 to 7.0.1
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0...3d3c42e5aac5ba805825da76410c181273ba90b1)

Updates `actions/setup-node` from 6.4.0 to 7.0.0
- [Release notes](https://github.com/actions/setup-node/releases)
- [Commits](https://github.com/actions/setup-node/compare/48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e...820762786026740c76f36085b0efc47a31fe5020)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 7.0.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: github-actions
- dependency-name: actions/setup-node
  dependency-version: 7.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-29 08:53:24 -04:00
dependabot[bot] 5018f9ec04 chore(deps): bump brace-expansion from 5.0.6 to 5.0.7 (#824)
main / build (push) Has been cancelled
Bumps [brace-expansion](https://github.com/juliangruber/brace-expansion) from 5.0.6 to 5.0.7.
- [Release notes](https://github.com/juliangruber/brace-expansion/releases)
- [Commits](https://github.com/juliangruber/brace-expansion/compare/v5.0.6...v5.0.7)

---
updated-dependencies:
- dependency-name: brace-expansion
  dependency-version: 5.0.7
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-22 21:57:13 -04:00
dependabot[bot] c1e290273a chore(deps): bump the npm group with 4 updates (#823)
Bumps the npm group with 4 updates: [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node), [@vitest/coverage-v8](https://github.com/vitest-dev/vitest/tree/HEAD/packages/coverage-v8), [prettier](https://github.com/prettier/prettier) and [vitest](https://github.com/vitest-dev/vitest/tree/HEAD/packages/vitest).


Updates `@types/node` from 24.13.2 to 24.13.3
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

Updates `@vitest/coverage-v8` from 4.1.9 to 4.1.10
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.1.10/packages/coverage-v8)

Updates `prettier` from 3.9.0 to 3.9.5
- [Release notes](https://github.com/prettier/prettier/releases)
- [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md)
- [Commits](https://github.com/prettier/prettier/compare/3.9.0...3.9.5)

Updates `vitest` from 4.1.9 to 4.1.10
- [Release notes](https://github.com/vitest-dev/vitest/releases)
- [Changelog](https://github.com/vitest-dev/vitest/blob/main/docs/releases.md)
- [Commits](https://github.com/vitest-dev/vitest/commits/v4.1.10/packages/vitest)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.13.3
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm
- dependency-name: "@vitest/coverage-v8"
  dependency-version: 4.1.10
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm
- dependency-name: prettier
  dependency-version: 3.9.5
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm
- dependency-name: vitest
  dependency-version: 4.1.10
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: npm
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-22 21:57:04 -04:00
Rui Chen 1c214ab373 fix: safely classify GitHub API errors (#822)
main / build (push) Has been cancelled
* refactor: harden GitHub error classification

Signed-off-by: Rui Chen <rui@chenrui.dev>

* test: define nested GitHub status handling

Signed-off-by: Rui Chen <rui@chenrui.dev>

---------

Signed-off-by: Rui Chen <rui@chenrui.dev>
2026-07-15 11:06:56 -04:00
Rui Chen d100e75a45 docs: mark v2 as unsupported (#821)
main / build (push) Has been cancelled
Signed-off-by: Rui Chen <rui@chenrui.dev>
2026-07-13 13:15:35 -04:00
Rui Chen 81bcd9dd59 test: cover release lookup after tag replacement (#820)
Signed-off-by: Rui Chen <rui@chenrui.dev>
2026-07-13 12:39:38 -04:00
Rui Chen b05950fac2 docs: update the release verification workflow (#819)
Signed-off-by: Rui Chen <rui@chenrui.dev>
2026-07-13 10:53:12 -04:00
12 changed files with 1259 additions and 840 deletions

No files matched your search

+2 -2
View File
@@ -13,9 +13,9 @@ jobs:
build: build:
runs-on: ubuntu-24.04 runs-on: ubuntu-24.04
steps: steps:
- uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0 - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 - uses: actions/setup-node@949feb2413d6458794dcd2491c4babbbce0c15c1 # v7.1.0
with: with:
node-version-file: ".tool-versions" node-version-file: ".tool-versions"
cache: "npm" cache: "npm"
+25 -3
View File
@@ -1,3 +1,22 @@
## 3.0.4
- maintenance release with updated dependencies
## 3.0.3
`3.0.3` is a maintenance release with updated dependencies. It also safely
classifies malformed GitHub API errors to avoid secondary failures (#822).
## What's Changed
### Bug fixes 🐛
* fix: safely classify GitHub API errors by @chenrui333 in https://github.com/softprops/action-gh-release/pull/822
### Other Changes 🔄
* dependency updates
## 3.0.2 ## 3.0.2
`3.0.2` is a patch release focused on release reliability and compatibility. It `3.0.2` is a patch release focused on release reliability and compatibility. It
@@ -38,8 +57,8 @@ claim a reproducible release-creation fix.
`3.0.0` is a major release that moves the action runtime from Node 20 to Node 24. `3.0.0` is a major release that moves the action runtime from Node 20 to Node 24.
Use `v3` on GitHub-hosted runners and self-hosted fleets that already support the Use `v3` on GitHub-hosted runners and self-hosted fleets that already support the
Node 24 Actions runtime. If you still need the last Node 20-compatible line, stay on Node 24 Actions runtime. `v2.6.2` was the final Node 20-compatible release and is
`v2.6.2`. no longer maintained or supported.
## What's Changed ## What's Changed
@@ -47,10 +66,13 @@ Node 24 Actions runtime. If you still need the last Node 20-compatible line, sta
* Move the action runtime and bundle target to Node 24 * Move the action runtime and bundle target to Node 24
* Update `@types/node` to the Node 24 line and allow future Dependabot updates * Update `@types/node` to the Node 24 line and allow future Dependabot updates
* Keep the floating major tag on `v3`; `v2` remains pinned to the latest `2.x` release * Keep the floating major tag on `v3`; freeze `v2` at the final `v2.6.2` release
## 2.6.2 ## 2.6.2
`2.6.2` is the final `v2` release and is no longer maintained or supported. Upgrade
to `v3` for the supported Node 24 runtime and current fixes.
## What's Changed ## What's Changed
### Other Changes 🔄 ### Other Changes 🔄
+5 -2
View File
@@ -39,8 +39,11 @@ Typically usage of this action involves adding a step to a build that
is gated pushes to git tags. You may find `step.if` field helpful in accomplishing this is gated pushes to git tags. You may find `step.if` field helpful in accomplishing this
as it maximizes the reuse value of your workflow for non-tag pushes. as it maximizes the reuse value of your workflow for non-tag pushes.
`v3` requires a GitHub Actions runtime that supports Node 24. If you still need the `v2.6.2` is the final `v2` release and is no longer maintained or supported. It
last Node 20-compatible line, stay on `v2.6.2`. uses the [Node 20 runtime deprecated by GitHub Actions](https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/).
Upgrade to `v3`, which runs on Node 24. If a problem still reproduces on the
latest `v3`, open a new issue with the exact action ref, workflow run URL,
runner, and relevant logs.
Below is a simple example of `step.if` tag gating Below is a simple example of `step.if` tag gating
+23 -10
View File
@@ -23,21 +23,34 @@ Use this checklist when cutting a new `action-gh-release` release.
- `npm run build` - `npm run build`
- `npm test` - `npm test`
5. Commit the release prep. 5. Commit the release prep.
- Use a plain release commit message like `release 3.0.0`. - Use `git commit -s` so the release commit carries a DCO sign-off.
6. Create the annotated tag for the release commit. - Use a plain release commit message like `release X.Y.Z`.
- Example: `git tag -a v3.0.0 -m "v3.0.0"` 6. Push a release branch and open a pull request against `master`.
7. Push the commit and tag. - Wait for required checks and reviews.
- Example: `git push origin master && git push origin v3.0.0` - Do not bypass branch protection or tag an unmerged release branch.
8. Move the floating major tag to the new release tag. 7. After merge, fetch `origin/master` and resolve the exact merged release commit.
- Confirm that commit contains the expected package version and top changelog entry.
- When the PR is squash-merged, do not assume the release branch commit is the release commit.
8. Create and push the full annotated version tag on the merged release commit.
- Example: `git tag -a vX.Y.Z -m "vX.Y.Z" <release-commit>`
- Push only the full version tag first, then wait for its tag-triggered CI to pass.
9. Move the floating major tag to the same merged release commit.
- For the current major line, run `npm run updatetag` to move `v3`. - For the current major line, run `npm run updatetag` to move `v3`.
- Keep `v2` pinned to the latest `2.x` release for consumers that still need the Node 20 runtime. - Do not move `v2`; it is frozen at the final, unsupported `v2.6.2` release.
- Verify the floating tag points at the same commit as the new full tag. - Verify `v3` and the full version tag are annotated and peel to the same commit.
9. Create the GitHub release from the new tag. - Verify `v2` did not move, then wait for the separate `v3` tag-triggered CI run to pass.
10. Create the GitHub release from the full version tag.
- Prefer the release body from [CHANGELOG.md](CHANGELOG.md), then let GitHub append generated notes only if they add value. - Prefer the release body from [CHANGELOG.md](CHANGELOG.md), then let GitHub append generated notes only if they add value.
- Verify the release shows the expected tag, title, notes, and attached artifacts. - Verify the release shows the expected tag, title, notes, draft/prerelease state, and attached artifacts.
11. Run post-release consumer verification in `ruitest2/action-gh-release-test`.
- Run the generic smoke against both the full version tag and `v3`.
- Run regression workflows relevant to the fixes in the release.
- Confirm that every disposable release, tag, discussion, container, volume, and temporary credential was cleaned up.
## Notes ## Notes
- Behavior changes should already have matching updates in [README.md](README.md), [action.yml](action.yml), tests, and `dist/index.js` before release prep begins. - Behavior changes should already have matching updates in [README.md](README.md), [action.yml](action.yml), tests, and `dist/index.js` before release prep begins.
- Docs-only releases still need an intentional changelog entry and version bump decision. - Docs-only releases still need an intentional changelog entry and version bump decision.
- If a release is mainly bug fixes, keep the title and summary patch-oriented; do not bury the actual fixes under dependency noise. - If a release is mainly bug fixes, keep the title and summary patch-oriented; do not bury the actual fixes under dependency noise.
- Do not move the floating major tag or publish the GitHub release until the full
version tag's CI passes.
+501 -21
View File
@@ -149,6 +149,55 @@ describe('github', () => {
expect(pageAfterMatch).not.toHaveBeenCalled(); expect(pageAfterMatch).not.toHaveBeenCalled();
}); });
it.each([
['a top-level 404', { status: 404 }],
['a nested response 404', { response: { status: 404 } }],
[
'an invalid top-level status with a nested response 404',
{ status: '500', response: { status: 404 } },
],
])('uses release-list fallback for %s', async (_name, lookupError) => {
const draftRelease = { ...mockRelease, draft: true };
const allReleases = vi.fn(async function* () {
yield { data: [draftRelease] };
});
const releaser = {
...mockReleaser,
getReleaseByTag: vi.fn().mockRejectedValue(lookupError),
allReleases,
};
await expect(findTagFromReleases(releaser, owner, repo, draftRelease.tag_name)).resolves.toBe(
draftRelease,
);
expect(allReleases).toHaveBeenCalledOnce();
});
it.each([
['a nested response 500', { response: { status: 500 } }],
['a string top-level status', { status: '404' }],
['a string nested response status', { response: { status: '404' } }],
['a status-less object', { reason: 'lookup failed' }],
[
'a numeric top-level 500 with a nested response 404',
{ status: 500, response: { status: 404 } },
],
])('does not use release-list fallback for %s', async (_name, lookupError) => {
const allReleases = vi.fn(async function* () {
yield { data: [mockRelease] };
});
const releaser = {
...mockReleaser,
getReleaseByTag: vi.fn().mockRejectedValue(lookupError),
allReleases,
};
await expect(findTagFromReleases(releaser, owner, repo, mockRelease.tag_name)).rejects.toBe(
lookupError,
);
expect(allReleases).not.toHaveBeenCalled();
});
it('does not exhaust pagination while checking a brand-new tag', async () => { it('does not exhaust pagination while checking a brand-new tag', async () => {
let pagesRead = 0; let pagesRead = 0;
const releaser = { const releaser = {
@@ -346,11 +395,20 @@ describe('github', () => {
expect(request).not.toHaveBeenCalled(); expect(request).not.toHaveBeenCalled();
}); });
it('falls back to release-scoped asset deletion after a standard 404', async () => { it.each([
const deleteReleaseAsset = vi.fn().mockRejectedValue({ {
status: 404, name: 'top-level status',
deletionError: { status: 404, message: 'standard route not found' },
},
{
name: 'nested response status',
deletionError: {
response: { status: 404 },
message: 'standard route not found', message: 'standard route not found',
}); },
},
])('falls back to release-scoped asset deletion after a 404 with $name', async (testCase) => {
const deleteReleaseAsset = vi.fn().mockRejectedValue(testCase.deletionError);
const request = vi.fn().mockResolvedValue({ status: 204 }); const request = vi.fn().mockResolvedValue({ status: 204 });
const releaser = new GitHubReleaser({ const releaser = new GitHubReleaser({
rest: { repos: { deleteReleaseAsset } }, rest: { repos: { deleteReleaseAsset } },
@@ -376,6 +434,30 @@ describe('github', () => {
); );
}); });
it.each([
['a string', 'not found'],
['null', null],
['an arbitrary object', { response: { data: 'not found' } }],
])('does not misclassify %s as a fallback 404', async (_name, deletionError) => {
const request = vi.fn();
const releaser = new GitHubReleaser({
rest: {
repos: { deleteReleaseAsset: vi.fn().mockRejectedValue(deletionError) },
},
request,
} as any);
await expect(
releaser.deleteReleaseAsset({
owner: 'owner',
repo: 'repo',
release_id: 42,
asset_id: 99,
}),
).rejects.toBe(deletionError);
expect(request).not.toHaveBeenCalled();
});
it('does not mask non-404 asset deletion failures', async () => { it('does not mask non-404 asset deletion failures', async () => {
const deletionError = { status: 403, message: 'forbidden' }; const deletionError = { status: 403, message: 'forbidden' };
const request = vi.fn(); const request = vi.fn();
@@ -790,6 +872,83 @@ describe('github', () => {
expect(finalizeReleaseSpy).toHaveBeenCalledTimes(1); expect(finalizeReleaseSpy).toHaveBeenCalledTimes(1);
expect(deleteReleaseSpy).not.toHaveBeenCalled(); expect(deleteReleaseSpy).not.toHaveBeenCalled();
}); });
it('retries malformed tag-rule errors without deleting the draft', async () => {
const finalizeReleaseSpy = vi.fn().mockRejectedValue({
status: 422,
response: {
data: {
errors: [null, 'invalid', { field: 'pre_receive', message: 42 }],
},
},
});
const deleteReleaseSpy = vi.fn();
const releaser = createReleaser({
finalizeRelease: finalizeReleaseSpy,
deleteRelease: deleteReleaseSpy,
});
await expect(
finalizeRelease(
{
...config,
input_draft: false,
},
releaser,
draftRelease,
true,
1,
),
).rejects.toThrow('Too many retries.');
expect(finalizeReleaseSpy).toHaveBeenCalledOnce();
expect(deleteReleaseSpy).not.toHaveBeenCalled();
});
it('finds a valid tag-rule violation after malformed validation entries', async () => {
const finalizeReleaseSpy = vi.fn().mockRejectedValue({
response: {
status: 422,
data: {
errors: [
null,
'invalid',
{
field: 'pre_receive',
message: 'Cannot create ref due to creations being restricted.',
},
],
},
},
});
const deleteReleaseSpy = vi.fn().mockResolvedValue(undefined);
const releaser = createReleaser({
finalizeRelease: finalizeReleaseSpy,
deleteRelease: deleteReleaseSpy,
});
await expect(
finalizeRelease(
{
...config,
input_draft: false,
},
releaser,
draftRelease,
true,
1,
),
).rejects.toThrow(
'Tag creation for v1.0.0 is blocked by repository rules. Deleted draft release 1 to avoid leaving an orphaned draft release.',
);
expect(finalizeReleaseSpy).toHaveBeenCalledOnce();
expect(deleteReleaseSpy).toHaveBeenCalledWith({
owner: 'owner',
repo: 'repo',
release_id: draftRelease.id,
});
});
}); });
describe('error handling', () => { describe('error handling', () => {
@@ -897,6 +1056,52 @@ describe('github', () => {
expect(createRelease).not.toHaveBeenCalled(); expect(createRelease).not.toHaveBeenCalled();
}); });
it.each([
{
name: 'a nested response 404 as repository access failure',
listingError: {
response: { status: 404 },
message: 'Not Found - list-releases',
},
expectAccessError: true,
},
{
name: 'a nested response 500 as the original error',
listingError: {
response: { status: 500 },
message: 'Server Error - list-releases',
},
expectAccessError: false,
},
{
name: 'a status-less object as the original error',
listingError: { reason: 'release listing failed' },
expectAccessError: false,
},
])('classifies a release-list fallback error with $name', async (testCase) => {
const createRelease = vi.fn();
const releaser = createReleaser({
getReleaseByTag: vi.fn().mockRejectedValue({ status: 404 }),
allReleases: async function* () {
throw testCase.listingError;
},
createRelease,
});
const thrown = await release(config, releaser, 1).catch((error) => error);
if (testCase.expectAccessError) {
expect(thrown).toMatchObject({
name: 'ReleaseAccessError',
status: 404,
cause: testCase.listingError,
});
} else {
expect(thrown).toBe(testCase.listingError);
}
expect(createRelease).not.toHaveBeenCalled();
});
it('reports a useful create error without assuming response data exists', async () => { it('reports a useful create error without assuming response data exists', async () => {
const releaseError = { const releaseError = {
status: 403, status: 403,
@@ -917,6 +1122,100 @@ describe('github', () => {
expect(log).not.toHaveBeenCalledWith('undefined'); expect(log).not.toHaveBeenCalledWith('undefined');
}); });
it.each([
{
name: 'a nested response 403',
releaseError: {
response: { status: 403 },
message: 'Resource not accessible by integration',
},
},
{
name: 'a nested response 422 without already_exists',
releaseError: {
response: { status: 422, data: { errors: [{ code: 'invalid' }] } },
message: 'Validation Failed',
},
},
])('does not retry release creation for $name', async (testCase) => {
const createRelease = vi.fn().mockRejectedValue(testCase.releaseError);
const releaser = createReleaser({
getReleaseByTag: vi.fn().mockRejectedValue({ status: 404 }),
createRelease,
allReleases: async function* () {
yield { data: [] };
},
});
await expect(release(config, releaser, 1)).rejects.toBe(testCase.releaseError);
expect(createRelease).toHaveBeenCalledOnce();
});
it('classifies a nested response 404 from release creation without retrying', async () => {
const releaseError = {
response: { status: 404 },
message: 'Not Found - create-a-release',
};
const createRelease = vi.fn().mockRejectedValue(releaseError);
const releaser = createReleaser({
getReleaseByTag: vi.fn().mockRejectedValue({ status: 404 }),
createRelease,
allReleases: async function* () {
yield { data: [] };
},
});
const thrown = await release(config, releaser, 1).catch((error) => error);
expect(thrown).toMatchObject({
name: 'ReleaseCreationError',
status: 404,
cause: releaseError,
});
expect(thrown.message).toContain('GitHub returned 404 while creating the release');
expect(createRelease).toHaveBeenCalledOnce();
});
it.each([
['non-object response data', { status: 422, response: { data: 'invalid' } }],
['missing validation errors', { status: 422, response: { data: {} } }],
['malformed validation errors', { status: 422, response: { data: { errors: [null] } } }],
])('does not retry a permanent 422 with %s', async (_name, releaseError) => {
const createRelease = vi.fn().mockRejectedValue(releaseError);
const releaser = createReleaser({
getReleaseByTag: vi.fn().mockRejectedValue({ status: 404 }),
createRelease,
allReleases: async function* () {
yield { data: [] };
},
});
await expect(release(config, releaser, 1)).rejects.toBe(releaseError);
expect(createRelease).toHaveBeenCalledOnce();
});
it.each([
['a string', 'transport failed'],
['null', null],
['an arbitrary object', { reason: 'transport failed' }],
['a nested response 500', { response: { status: 500 } }],
])(
'retries unclassified release creation failures without secondary TypeErrors when the error is %s',
async (_name, releaseError) => {
const createRelease = vi.fn().mockRejectedValue(releaseError);
const releaser = createReleaser({
getReleaseByTag: vi.fn().mockRejectedValue({ status: 404 }),
createRelease,
allReleases: async function* () {
yield { data: [] };
},
});
await expect(release(config, releaser, 1)).rejects.toThrow('Too many retries.');
expect(createRelease).toHaveBeenCalledOnce();
},
);
it('passes previous_tag_name through when creating a release with generated notes', async () => { it('passes previous_tag_name through when creating a release with generated notes', async () => {
const createReleaseSpy = vi.fn(async () => ({ const createReleaseSpy = vi.fn(async () => ({
data: { data: {
@@ -1063,6 +1362,154 @@ describe('github', () => {
); );
}); });
it('reuses a published prerelease found by listing after direct tag lookup returns 404', async () => {
const existingRelease: Release = {
id: 77,
upload_url: 'existing-upload',
html_url: 'existing-html',
tag_name: 'v1.0.0',
name: 'nightly',
body: 'previous nightly body',
target_commitish: 'old-commit',
draft: false,
prerelease: true,
assets: [{ id: 5, name: 'nightly.zip' }],
};
const updatedRelease: Release = {
...existingRelease,
name: 'updated nightly',
body: 'updated nightly body',
target_commitish: 'new-commit',
};
const createRelease = unexpected('createRelease');
const updateRelease = vi.fn().mockResolvedValue({ data: updatedRelease });
const releaser = createReleaser({
getReleaseByTag: vi.fn().mockRejectedValue({ status: 404 }),
allReleases: async function* () {
yield { data: [existingRelease] };
},
createRelease,
updateRelease,
});
const result = await release(
{
...config,
input_name: 'updated nightly',
input_body: 'updated nightly body',
input_prerelease: true,
input_draft: false,
input_target_commitish: 'new-commit',
},
releaser,
);
expect(result).toEqual({ release: updatedRelease, created: false });
expect(updateRelease).toHaveBeenCalledWith(
expect.objectContaining({
release_id: existingRelease.id,
tag_name: existingRelease.tag_name,
target_commitish: 'new-commit',
draft: false,
prerelease: true,
}),
);
expect(createRelease).not.toHaveBeenCalled();
});
it('creates a replacement after an existing-release update returns a nested response 404', async () => {
const existingRelease: Release = {
id: 41,
upload_url: 'existing-upload',
html_url: 'existing-html',
tag_name: 'v1.0.0',
name: 'existing release',
body: 'existing body',
target_commitish: 'main',
draft: false,
prerelease: false,
assets: [],
};
const replacementRelease: Release = {
...existingRelease,
id: 42,
upload_url: 'replacement-upload',
html_url: 'replacement-html',
name: 'v1.0.0',
body: undefined,
draft: true,
};
const updateError = { response: { status: 404 }, message: 'release disappeared' };
const getReleaseByTag = vi
.fn()
.mockResolvedValueOnce({ data: existingRelease })
.mockResolvedValue({ data: replacementRelease });
const updateRelease = vi.fn().mockRejectedValue(updateError);
const createRelease = vi.fn().mockResolvedValue({ data: replacementRelease });
const releaser = createReleaser({
getReleaseByTag,
updateRelease,
createRelease,
allReleases: async function* () {
yield { data: [replacementRelease] };
},
});
await expect(release(config, releaser, 1)).resolves.toEqual({
release: replacementRelease,
created: true,
});
expect(updateRelease).toHaveBeenCalledOnce();
expect(createRelease).toHaveBeenCalledOnce();
expect(createRelease).toHaveBeenCalledWith({
owner: 'owner',
repo: 'repo',
tag_name: 'v1.0.0',
name: 'v1.0.0',
body: undefined,
draft: true,
prerelease: undefined,
target_commitish: undefined,
discussion_category_name: undefined,
generate_release_notes: false,
make_latest: undefined,
previous_tag_name: undefined,
});
expect(getReleaseByTag).toHaveBeenCalledTimes(2);
});
it.each([
['a nested response 403', { response: { status: 403 }, message: 'forbidden' }],
['a nested response 500', { response: { status: 500 }, message: 'server error' }],
])(
'does not create a replacement after an existing-release update returns %s',
async (_name, updateError) => {
const existingRelease: Release = {
id: 41,
upload_url: 'existing-upload',
html_url: 'existing-html',
tag_name: 'v1.0.0',
name: 'existing release',
body: 'existing body',
target_commitish: 'main',
draft: false,
prerelease: false,
assets: [],
};
const createRelease = vi.fn();
const updateRelease = vi.fn().mockRejectedValue(updateError);
const releaser = createReleaser({
getReleaseByTag: vi.fn().mockResolvedValue({ data: existingRelease }),
updateRelease,
createRelease,
});
await expect(release(config, releaser, 1)).rejects.toBe(updateError);
expect(updateRelease).toHaveBeenCalledOnce();
expect(createRelease).not.toHaveBeenCalled();
},
);
it.each([ it.each([
['an omitted draft input', undefined], ['an omitted draft input', undefined],
['a null-expression draft input', undefined], ['a null-expression draft input', undefined],
@@ -1208,19 +1655,37 @@ describe('github', () => {
expect(uploadReleaseAsset).not.toHaveBeenCalled(); expect(uploadReleaseAsset).not.toHaveBeenCalled();
}); });
it('surfaces an actionable immutable-release error for prerelease uploads', async () => { it.each([
const tempDir = mkdtempSync(join(tmpdir(), 'gh-release-immutable-')); {
const assetPath = join(tempDir, 'draft-false.txt'); name: 'standard release with a nested status',
writeFileSync(assetPath, 'hello'); prerelease: undefined,
uploadError: {
const uploadReleaseAsset = vi.fn().mockRejectedValue({ response: { status: 422 },
message: 'Cannot upload assets to an immutable release.',
},
expected:
'Cannot upload asset draft-false.txt to an immutable release. GitHub only allows asset uploads before a release is published, so upload assets to a draft release before you publish it.',
},
{
name: 'prerelease with response data',
prerelease: true,
uploadError: {
status: 422, status: 422,
response: { response: {
data: { data: {
message: 'Cannot upload assets to an immutable release.', message: 'Cannot upload assets to an immutable release.',
}, },
}, },
}); },
expected:
'Cannot upload asset draft-false.txt to an immutable release. GitHub only allows asset uploads before a release is published, but draft prereleases publish with the release.published event instead of release.prereleased.',
},
])('surfaces an actionable immutable-release error for a $name', async (testCase) => {
const tempDir = mkdtempSync(join(tmpdir(), 'gh-release-immutable-'));
const assetPath = join(tempDir, 'draft-false.txt');
writeFileSync(assetPath, 'hello');
const uploadReleaseAsset = vi.fn().mockRejectedValue(testCase.uploadError);
const mockReleaser: Releaser = { const mockReleaser: Releaser = {
getReleaseByTag: () => Promise.reject('Not implemented'), getReleaseByTag: () => Promise.reject('Not implemented'),
@@ -1237,11 +1702,12 @@ describe('github', () => {
uploadReleaseAsset, uploadReleaseAsset,
}; };
try {
await expect( await expect(
upload( upload(
{ {
...config, ...config,
input_prerelease: true, input_prerelease: testCase.prerelease,
}, },
mockReleaser, mockReleaser,
'https://uploads.github.com/repos/owner/repo/releases/1/assets', 'https://uploads.github.com/repos/owner/repo/releases/1/assets',
@@ -1249,11 +1715,10 @@ describe('github', () => {
[], [],
1, 1,
), ),
).rejects.toThrow( ).rejects.toThrow(testCase.expected);
'Cannot upload asset draft-false.txt to an immutable release. GitHub only allows asset uploads before a release is published, but draft prereleases publish with the release.published event instead of release.prereleased.', } finally {
);
rmSync(tempDir, { recursive: true, force: true }); rmSync(tempDir, { recursive: true, force: true });
}
}); });
it('retries upload after deleting a conflicting renamed asset matched by label', async () => { it('retries upload after deleting a conflicting renamed asset matched by label', async () => {
@@ -1330,7 +1795,24 @@ describe('github', () => {
} }
}); });
it('handles 422 already_exists error gracefully', async () => { it.each([
{
name: 'top-level status',
releaseError: {
status: 422,
response: { data: { errors: [{ code: 'already_exists' }] } },
},
},
{
name: 'nested response status',
releaseError: {
response: {
status: 422,
data: { errors: [{ code: 'already_exists' }] },
},
},
},
])('retries a 422 already_exists race with $name', async (testCase) => {
vi.useFakeTimers(); vi.useFakeTimers();
const existingRelease = { const existingRelease = {
id: 1, id: 1,
@@ -1356,10 +1838,7 @@ describe('github', () => {
}, },
createRelease: () => { createRelease: () => {
createAttempts++; createAttempts++;
return Promise.reject({ return Promise.reject(testCase.releaseError);
status: 422,
response: { data: { errors: [{ code: 'already_exists' }] } },
});
}, },
updateRelease: () => updateRelease: () =>
Promise.resolve({ Promise.resolve({
@@ -1392,6 +1871,7 @@ describe('github', () => {
assert.ok(result); assert.ok(result);
assert.equal(result.release.id, 1); assert.equal(result.release.id, 1);
assert.equal(result.created, false); assert.equal(result.created, false);
expect(createAttempts).toBe(1);
}); });
it('normalizes refs/tags-prefixed input_tag_name values before reusing an existing release', async () => { it('normalizes refs/tags-prefixed input_tag_name values before reusing an existing release', async () => {
+48
View File
@@ -286,6 +286,54 @@ describe('run', () => {
); );
}); });
it('uses the selected moving-tag release ID for upload, finalization, and outputs', async () => {
config = {
...config,
input_tag_name: 'nightly',
input_draft: false,
input_prerelease: true,
input_files: ['nightly.zip'],
};
const selectedRelease: Release = {
...initialRelease,
id: 77,
upload_url: 'https://uploads.example.test/releases/77/assets{?name,label}',
html_url: 'https://example.test/releases/77',
tag_name: 'nightly',
name: 'nightly',
prerelease: true,
};
const publishedRelease: Release = {
...selectedRelease,
draft: false,
};
mocks.release.mockResolvedValue({ release: selectedRelease, created: false });
mocks.paths.mockReturnValue(['nightly.zip']);
mocks.upload.mockResolvedValue({ id: 9 });
mocks.finalizeRelease.mockResolvedValue(publishedRelease);
mocks.listReleaseAssets.mockResolvedValue([{ id: 9, name: 'nightly.zip' }]);
await run();
expect(mocks.upload).toHaveBeenCalledWith(
config,
mocks.releaser,
'https://uploads.example.test/releases/77/assets',
'nightly.zip',
selectedRelease.assets,
77,
);
expect(mocks.finalizeRelease).toHaveBeenCalledWith(
config,
mocks.releaser,
selectedRelease,
false,
);
expect(mocks.listReleaseAssets).toHaveBeenCalledWith(config, mocks.releaser, publishedRelease);
expect(mocks.setOutput).toHaveBeenCalledWith('id', '77');
expect(mocks.setOutput).toHaveBeenCalledWith('url', publishedRelease.html_url);
});
it('leaves an existing draft recoverable when an upload fails', async () => { it('leaves an existing draft recoverable when an upload fails', async () => {
config = { config = {
...config, ...config,
+37 -38
View File
@@ -1,58 +1,57 @@
"use strict";var sb=Object.create;var yp=Object.defineProperty;var rb=Object.getOwnPropertyDescriptor;var ib=Object.getOwnPropertyNames;var ob=Object.getPrototypeOf,nb=Object.prototype.hasOwnProperty;var B=(e,t)=>()=>{try{return t||e((t={exports:{}}).exports,t),t.exports}catch(s){throw t=0,s}};var ab=(e,t,s,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let i of ib(t))!nb.call(e,i)&&i!==s&&yp(e,i,{get:()=>t[i],enumerable:!(r=rb(t,i))||r.enumerable});return e};var Ee=(e,t,s)=>(s=e!=null?sb(ob(e)):{},ab(t||!e||!e.__esModule?yp(s,"default",{value:e,enumerable:!0}):s,e));var Np=B(sr=>{"use strict";var E2=require("net"),ub=require("tls"),aA=require("http"),Fp=require("https"),pb=require("events"),m2=require("assert"),gb=require("util");sr.httpOverHttp=hb;sr.httpsOverHttp=db;sr.httpOverHttps=Eb;sr.httpsOverHttps=mb;function hb(e){var t=new Rt(e);return t.request=aA.request,t}function db(e){var t=new Rt(e);return t.request=aA.request,t.createSocket=Sp,t.defaultPort=443,t}function Eb(e){var t=new Rt(e);return t.request=Fp.request,t}function mb(e){var t=new Rt(e);return t.request=Fp.request,t.createSocket=Sp,t.defaultPort=443,t}function Rt(e){var t=this;t.options=e||{},t.proxyOptions=t.options.proxy||{},t.maxSockets=t.options.maxSockets||aA.Agent.defaultMaxSockets,t.requests=[],t.sockets=[],t.on("free",function(r,i,o,n){for(var a=Up(i,o,n),A=0,c=t.requests.length;A<c;++A){var u=t.requests[A];if(u.host===a.host&&u.port===a.port){t.requests.splice(A,1),u.request.onSocket(r);return}}r.destroy(),t.removeSocket(r)})}gb.inherits(Rt,pb.EventEmitter);Rt.prototype.addRequest=function(t,s,r,i){var o=this,n=AA({request:t},o.options,Up(s,r,i));if(o.sockets.length>=this.maxSockets){o.requests.push(n);return}o.createSocket(n,function(a){a.on("free",A),a.on("close",c),a.on("agentRemove",c),t.onSocket(a);function A(){o.emit("free",a,n)}function c(u){o.removeSocket(a),a.removeListener("free",A),a.removeListener("close",c),a.removeListener("agentRemove",c)}})};Rt.prototype.createSocket=function(t,s){var r=this,i={};r.sockets.push(i);var o=AA({},r.proxyOptions,{method:"CONNECT",path:t.host+":"+t.port,agent:!1,headers:{host:t.host+":"+t.port}});t.localAddress&&(o.localAddress=t.localAddress),o.proxyAuth&&(o.headers=o.headers||{},o.headers["Proxy-Authorization"]="Basic "+new Buffer(o.proxyAuth).toString("base64")),Zt("making CONNECT request");var n=r.request(o);n.useChunkedEncodingByDefault=!1,n.once("response",a),n.once("upgrade",A),n.once("connect",c),n.once("error",u),n.end();function a(l){l.upgrade=!0}function A(l,p,g){process.nextTick(function(){c(l,p,g)})}function c(l,p,g){if(n.removeAllListeners(),p.removeAllListeners(),l.statusCode!==200){Zt("tunneling socket could not be established, statusCode=%d",l.statusCode),p.destroy();var d=new Error("tunneling socket could not be established, statusCode="+l.statusCode);d.code="ECONNRESET",t.request.emit("error",d),r.removeSocket(i);return}if(g.length>0){Zt("got illegal response body from proxy"),p.destroy();var d=new Error("got illegal response body from proxy");d.code="ECONNRESET",t.request.emit("error",d),r.removeSocket(i);return}return Zt("tunneling connection has established"),r.sockets[r.sockets.indexOf(i)]=p,s(p)}function u(l){n.removeAllListeners(),Zt(`tunneling socket could not be established, cause=%s "use strict";var Yb=Object.create;var sg=Object.defineProperty;var Ob=Object.getOwnPropertyDescriptor;var Pb=Object.getOwnPropertyNames;var Jb=Object.getPrototypeOf,Hb=Object.prototype.hasOwnProperty;var Q=(e,t)=>()=>{try{return t||e((t={exports:{}}).exports,t),t.exports}catch(s){throw t=0,s}};var Vb=(e,t,s,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Pb(t))!Hb.call(e,r)&&r!==s&&sg(e,r,{get:()=>t[r],enumerable:!(i=Ob(t,r))||i.enumerable});return e};var Qe=(e,t,s)=>(s=e!=null?Yb(Jb(e)):{},Vb(t||!e||!e.__esModule?sg(s,"default",{value:e,enumerable:!0}):s,e));var pg=Q(oi=>{"use strict";var uY=require("net"),zb=require("tls"),IA=require("http"),cg=require("https"),Zb=require("events"),pY=require("assert"),Kb=require("util");oi.httpOverHttp=Xb;oi.httpsOverHttp=$b;oi.httpOverHttps=ey;oi.httpsOverHttps=ty;function Xb(e){var t=new Ft(e);return t.request=IA.request,t}function $b(e){var t=new Ft(e);return t.request=IA.request,t.createSocket=lg,t.defaultPort=443,t}function ey(e){var t=new Ft(e);return t.request=cg.request,t}function ty(e){var t=new Ft(e);return t.request=cg.request,t.createSocket=lg,t.defaultPort=443,t}function Ft(e){var t=this;t.options=e||{},t.proxyOptions=t.options.proxy||{},t.maxSockets=t.options.maxSockets||IA.Agent.defaultMaxSockets,t.requests=[],t.sockets=[],t.on("free",function(i,r,n,o){for(var a=ug(r,n,o),A=0,c=t.requests.length;A<c;++A){var l=t.requests[A];if(l.host===a.host&&l.port===a.port){t.requests.splice(A,1),l.request.onSocket(i);return}}i.destroy(),t.removeSocket(i)})}Kb.inherits(Ft,Zb.EventEmitter);Ft.prototype.addRequest=function(t,s,i,r){var n=this,o=wA({request:t},n.options,ug(s,i,r));if(n.sockets.length>=this.maxSockets){n.requests.push(o);return}n.createSocket(o,function(a){a.on("free",A),a.on("close",c),a.on("agentRemove",c),t.onSocket(a);function A(){n.emit("free",a,o)}function c(l){n.removeSocket(a),a.removeListener("free",A),a.removeListener("close",c),a.removeListener("agentRemove",c)}})};Ft.prototype.createSocket=function(t,s){var i=this,r={};i.sockets.push(r);var n=wA({},i.proxyOptions,{method:"CONNECT",path:t.host+":"+t.port,agent:!1,headers:{host:t.host+":"+t.port}});t.localAddress&&(n.localAddress=t.localAddress),n.proxyAuth&&(n.headers=n.headers||{},n.headers["Proxy-Authorization"]="Basic "+new Buffer(n.proxyAuth).toString("base64")),Zt("making CONNECT request");var o=i.request(n);o.useChunkedEncodingByDefault=!1,o.once("response",a),o.once("upgrade",A),o.once("connect",c),o.once("error",l),o.end();function a(u){u.upgrade=!0}function A(u,p,h){process.nextTick(function(){c(u,p,h)})}function c(u,p,h){if(o.removeAllListeners(),p.removeAllListeners(),u.statusCode!==200){Zt("tunneling socket could not be established, statusCode=%d",u.statusCode),p.destroy();var d=new Error("tunneling socket could not be established, statusCode="+u.statusCode);d.code="ECONNRESET",t.request.emit("error",d),i.removeSocket(r);return}if(h.length>0){Zt("got illegal response body from proxy"),p.destroy();var d=new Error("got illegal response body from proxy");d.code="ECONNRESET",t.request.emit("error",d),i.removeSocket(r);return}return Zt("tunneling connection has established"),i.sockets[i.sockets.indexOf(r)]=p,s(p)}function l(u){o.removeAllListeners(),Zt(`tunneling socket could not be established, cause=%s
`,l.message,l.stack);var p=new Error("tunneling socket could not be established, cause="+l.message);p.code="ECONNRESET",t.request.emit("error",p),r.removeSocket(i)}};Rt.prototype.removeSocket=function(t){var s=this.sockets.indexOf(t);if(s!==-1){this.sockets.splice(s,1);var r=this.requests.shift();r&&this.createSocket(r,function(i){r.request.onSocket(i)})}};function Sp(e,t){var s=this;Rt.prototype.createSocket.call(s,e,function(r){var i=e.request.getHeader("host"),o=AA({},s.options,{socket:r,servername:i?i.replace(/:.*$/,""):e.host}),n=ub.connect(0,o);s.sockets[s.sockets.indexOf(r)]=n,t(n)})}function Up(e,t,s){return typeof e=="string"?{host:e,port:t,localAddress:s}:e}function AA(e){for(var t=1,s=arguments.length;t<s;++t){var r=arguments[t];if(typeof r=="object")for(var i=Object.keys(r),o=0,n=i.length;o<n;++o){var a=i[o];r[a]!==void 0&&(e[a]=r[a])}}return e}var Zt;process.env.NODE_DEBUG&&/\btunnel\b/.test(process.env.NODE_DEBUG)?Zt=function(){var e=Array.prototype.slice.call(arguments);typeof e[0]=="string"?e[0]="TUNNEL: "+e[0]:e.unshift("TUNNEL:"),console.error.apply(console,e)}:Zt=function(){};sr.debug=Zt});var cA=B((Q2,Gp)=>{Gp.exports=Np()});var z=B((B2,Mp)=>{Mp.exports={kClose:Symbol("close"),kDestroy:Symbol("destroy"),kDispatch:Symbol("dispatch"),kUrl:Symbol("url"),kWriting:Symbol("writing"),kResuming:Symbol("resuming"),kQueue:Symbol("queue"),kConnect:Symbol("connect"),kConnecting:Symbol("connecting"),kKeepAliveDefaultTimeout:Symbol("default keep alive timeout"),kKeepAliveMaxTimeout:Symbol("max keep alive timeout"),kKeepAliveTimeoutThreshold:Symbol("keep alive timeout threshold"),kKeepAliveTimeoutValue:Symbol("keep alive timeout"),kKeepAlive:Symbol("keep alive"),kHeadersTimeout:Symbol("headers timeout"),kBodyTimeout:Symbol("body timeout"),kServerName:Symbol("server name"),kLocalAddress:Symbol("local address"),kHost:Symbol("host"),kNoRef:Symbol("no ref"),kBodyUsed:Symbol("used"),kBody:Symbol("abstracted request body"),kRunning:Symbol("running"),kBlocking:Symbol("blocking"),kPending:Symbol("pending"),kSize:Symbol("size"),kBusy:Symbol("busy"),kQueued:Symbol("queued"),kFree:Symbol("free"),kConnected:Symbol("connected"),kClosed:Symbol("closed"),kNeedDrain:Symbol("need drain"),kReset:Symbol("reset"),kDestroyed:Symbol.for("nodejs.stream.destroyed"),kResume:Symbol("resume"),kOnError:Symbol("on error"),kMaxHeadersSize:Symbol("max headers size"),kRunningIdx:Symbol("running index"),kPendingIdx:Symbol("pending index"),kError:Symbol("error"),kClients:Symbol("clients"),kClient:Symbol("client"),kParser:Symbol("parser"),kOnDestroyed:Symbol("destroy callbacks"),kPipelining:Symbol("pipelining"),kSocket:Symbol("socket"),kHostHeader:Symbol("host header"),kConnector:Symbol("connector"),kStrictContentLength:Symbol("strict content length"),kMaxRedirections:Symbol("maxRedirections"),kMaxRequests:Symbol("maxRequestsPerClient"),kProxy:Symbol("proxy agent options"),kCounter:Symbol("socket request counter"),kInterceptors:Symbol("dispatch interceptors"),kMaxResponseSize:Symbol("max response size"),kHTTP2Session:Symbol("http2Session"),kHTTP2SessionState:Symbol("http2Session state"),kRetryHandlerDefaultRetry:Symbol("retry agent default retry"),kConstruct:Symbol("constructable"),kListeners:Symbol("listeners"),kHTTPContext:Symbol("http context"),kMaxConcurrentStreams:Symbol("max concurrent streams"),kNoProxyAgent:Symbol("no proxy agent"),kHttpProxyAgent:Symbol("http proxy agent"),kHttpsProxyAgent:Symbol("https proxy agent")}});var _=B((C2,Ag)=>{"use strict";var Lp=Symbol.for("undici.error.UND_ERR"),Z=class extends Error{constructor(t){super(t),this.name="UndiciError",this.code="UND_ERR"}static[Symbol.hasInstance](t){return t&&t[Lp]===!0}[Lp]=!0},_p=Symbol.for("undici.error.UND_ERR_CONNECT_TIMEOUT"),lA=class extends Z{constructor(t){super(t),this.name="ConnectTimeoutError",this.message=t||"Connect Timeout Error",this.code="UND_ERR_CONNECT_TIMEOUT"}static[Symbol.hasInstance](t){return t&&t[_p]===!0}[_p]=!0},Yp=Symbol.for("undici.error.UND_ERR_HEADERS_TIMEOUT"),uA=class extends Z{constructor(t){super(t),this.name="HeadersTimeoutError",this.message=t||"Headers Timeout Error",this.code="UND_ERR_HEADERS_TIMEOUT"}static[Symbol.hasInstance](t){return t&&t[Yp]===!0}[Yp]=!0},Op=Symbol.for("undici.error.UND_ERR_HEADERS_OVERFLOW"),pA=class extends Z{constructor(t){super(t),this.name="HeadersOverflowError",this.message=t||"Headers Overflow Error",this.code="UND_ERR_HEADERS_OVERFLOW"}static[Symbol.hasInstance](t){return t&&t[Op]===!0}[Op]=!0},Jp=Symbol.for("undici.error.UND_ERR_BODY_TIMEOUT"),gA=class extends Z{constructor(t){super(t),this.name="BodyTimeoutError",this.message=t||"Body Timeout Error",this.code="UND_ERR_BODY_TIMEOUT"}static[Symbol.hasInstance](t){return t&&t[Jp]===!0}[Jp]=!0},Pp=Symbol.for("undici.error.UND_ERR_RESPONSE_STATUS_CODE"),hA=class extends Z{constructor(t,s,r,i){super(t),this.name="ResponseStatusCodeError",this.message=t||"Response Status Code Error",this.code="UND_ERR_RESPONSE_STATUS_CODE",this.body=i,this.status=s,this. Line truncated `,u.message,u.stack);var p=new Error("tunneling socket could not be established, cause="+u.message);p.code="ECONNRESET",t.request.emit("error",p),i.removeSocket(r)}};Ft.prototype.removeSocket=function(t){var s=this.sockets.indexOf(t);if(s!==-1){this.sockets.splice(s,1);var i=this.requests.shift();i&&this.createSocket(i,function(r){i.request.onSocket(r)})}};function lg(e,t){var s=this;Ft.prototype.createSocket.call(s,e,function(i){var r=e.request.getHeader("host"),n=wA({},s.options,{socket:i,servername:r?r.replace(/:.*$/,""):e.host}),o=zb.connect(0,n);s.sockets[s.sockets.indexOf(i)]=o,t(o)})}function ug(e,t,s){return typeof e=="string"?{host:e,port:t,localAddress:s}:e}function wA(e){for(var t=1,s=arguments.length;t<s;++t){var i=arguments[t];if(typeof i=="object")for(var r=Object.keys(i),n=0,o=r.length;n<o;++n){var a=r[n];i[a]!==void 0&&(e[a]=i[a])}}return e}var Zt;process.env.NODE_DEBUG&&/\btunnel\b/.test(process.env.NODE_DEBUG)?Zt=function(){var e=Array.prototype.slice.call(arguments);typeof e[0]=="string"?e[0]="TUNNEL: "+e[0]:e.unshift("TUNNEL:"),console.error.apply(console,e)}:Zt=function(){};oi.debug=Zt});var bA=Q((hY,gg)=>{gg.exports=pg()});var Z=Q((dY,hg)=>{hg.exports={kClose:Symbol("close"),kDestroy:Symbol("destroy"),kDispatch:Symbol("dispatch"),kUrl:Symbol("url"),kWriting:Symbol("writing"),kResuming:Symbol("resuming"),kQueue:Symbol("queue"),kConnect:Symbol("connect"),kConnecting:Symbol("connecting"),kKeepAliveDefaultTimeout:Symbol("default keep alive timeout"),kKeepAliveMaxTimeout:Symbol("max keep alive timeout"),kKeepAliveTimeoutThreshold:Symbol("keep alive timeout threshold"),kKeepAliveTimeoutValue:Symbol("keep alive timeout"),kKeepAlive:Symbol("keep alive"),kHeadersTimeout:Symbol("headers timeout"),kBodyTimeout:Symbol("body timeout"),kServerName:Symbol("server name"),kLocalAddress:Symbol("local address"),kHost:Symbol("host"),kNoRef:Symbol("no ref"),kBodyUsed:Symbol("used"),kBody:Symbol("abstracted request body"),kRunning:Symbol("running"),kBlocking:Symbol("blocking"),kPending:Symbol("pending"),kSize:Symbol("size"),kBusy:Symbol("busy"),kQueued:Symbol("queued"),kFree:Symbol("free"),kConnected:Symbol("connected"),kClosed:Symbol("closed"),kNeedDrain:Symbol("need drain"),kReset:Symbol("reset"),kDestroyed:Symbol.for("nodejs.stream.destroyed"),kResume:Symbol("resume"),kOnError:Symbol("on error"),kMaxHeadersSize:Symbol("max headers size"),kRunningIdx:Symbol("running index"),kPendingIdx:Symbol("pending index"),kError:Symbol("error"),kClients:Symbol("clients"),kClient:Symbol("client"),kParser:Symbol("parser"),kOnDestroyed:Symbol("destroy callbacks"),kPipelining:Symbol("pipelining"),kSocket:Symbol("socket"),kHostHeader:Symbol("host header"),kConnector:Symbol("connector"),kStrictContentLength:Symbol("strict content length"),kMaxRedirections:Symbol("maxRedirections"),kMaxRequests:Symbol("maxRequestsPerClient"),kProxy:Symbol("proxy agent options"),kCounter:Symbol("socket request counter"),kInterceptors:Symbol("dispatch interceptors"),kMaxResponseSize:Symbol("max response size"),kHTTP2Session:Symbol("http2Session"),kHTTP2SessionState:Symbol("http2Session state"),kRetryHandlerDefaultRetry:Symbol("retry agent default retry"),kConstruct:Symbol("constructable"),kListeners:Symbol("listeners"),kHTTPContext:Symbol("http context"),kMaxConcurrentStreams:Symbol("max concurrent streams"),kNoProxyAgent:Symbol("no proxy agent"),kHttpProxyAgent:Symbol("http proxy agent"),kHttpsProxyAgent:Symbol("https proxy agent")}});var Y=Q((EY,_g)=>{"use strict";var dg=Symbol.for("undici.error.UND_ERR"),K=class extends Error{constructor(t){super(t),this.name="UndiciError",this.code="UND_ERR"}static[Symbol.hasInstance](t){return t&&t[dg]===!0}[dg]=!0},Eg=Symbol.for("undici.error.UND_ERR_CONNECT_TIMEOUT"),yA=class extends K{constructor(t){super(t),this.name="ConnectTimeoutError",this.message=t||"Connect Timeout Error",this.code="UND_ERR_CONNECT_TIMEOUT"}static[Symbol.hasInstance](t){return t&&t[Eg]===!0}[Eg]=!0},mg=Symbol.for("undici.error.UND_ERR_HEADERS_TIMEOUT"),xA=class extends K{constructor(t){super(t),this.name="HeadersTimeoutError",this.message=t||"Headers Timeout Error",this.code="UND_ERR_HEADERS_TIMEOUT"}static[Symbol.hasInstance](t){return t&&t[mg]===!0}[mg]=!0},fg=Symbol.for("undici.error.UND_ERR_HEADERS_OVERFLOW"),vA=class extends K{constructor(t){super(t),this.name="HeadersOverflowError",this.message=t||"Headers Overflow Error",this.code="UND_ERR_HEADERS_OVERFLOW"}static[Symbol.hasInstance](t){return t&&t[fg]===!0}[fg]=!0},Qg=Symbol.for("undici.error.UND_ERR_BODY_TIMEOUT"),kA=class extends K{constructor(t){super(t),this.name="BodyTimeoutError",this.message=t||"Body Timeout Error",this.code="UND_ERR_BODY_TIMEOUT"}static[Symbol.hasInstance](t){return t&&t[Qg]===!0}[Qg]=!0},Bg=Symbol.for("undici.error.UND_ERR_RESPONSE_STATUS_CODE"),DA=class extends K{constructor(t,s,i,r){super(t),this.name="ResponseStatusCodeError",this.message=t||"Response Status Code Error",this.code="UND_ERR_RESPONSE_STATUS_CODE",this.body=r,this.status=s,this. Line truncated
`)||e.includes("\r")||e.includes("\0"))===!1}function Sx(e,t){let{headersList:s}=t,r=(s.get("referrer-policy",!0)??"").split(","),i="";if(r.length>0)for(let o=r.length;o!==0;o--){let n=r[o-1].trim();if(mx.has(n)){i=n;break}}i!==""&&(e.referrerPolicy=i)}function Ux(){return"allowed"}function Nx(){return"success"}function Gx(){return"success"}function Mx(e){let t=null;t=e.mode,e.headersList.set("sec-fetch-mode",t,!0)}function Lx(e){let t=e.origin;if(!(t==="client"||t===void 0)){if(e.responseTainting==="cors"||e.mode==="websocket")e.headersList.append("origin",t,!0);else if(e.method!=="GET"&&e.method!=="HEAD"){switch(e.referrerPolicy){case"no-referrer":t=null;break;case"no-referrer-when-downgrade":case"strict-origin":case"strict-origin-when-cross-origin":e.origin&&nc(e.origin)&&!nc(gi(e))&&(t=null);break;case"same-origin":jo(e,gi(e))||(t=null);break;default:}e.headersList.append("origin",t,!0)}}}function pr(e,t){return e}function _x(e,t,s){return!e?.startTime||e.startTime<t?{domainLookupStartTime:t,domainLookupEndTime:t,connectionStartTime:t,connectionEndTime:t,secureConnectionStartTime:t,ALPNNegotiatedProtocol:e?.ALPNNegotiatedProtocol}:{domainLookupStartTime:pr(e.domainLookupStartTime,s),domainLookupEndTime:pr(e.domainLookupEndTime,s),connectionStartTime:pr(e.connectionStartTime,s),connectionEndTime:pr(e.connectionEndTime,s),secureConnectionStartTime:pr(e.secureConnectionStartTime,s),ALPNNegotiatedProtocol:e.ALPNNegotiatedProtocol}}function Yx(e){return pr(Ix.now(),e)}function Ox(e){return{startTime:e.startTime??0,redirectStartTime:0,redirectEndTime:0,postRedirectStartTime:e.startTime??0,finalServiceWorkerStartTime:0,finalNetworkResponseStartTime:0,finalNetworkRequestStartTime:0,endTime:0,encodedBodySize:0,decodedBodySize:0,finalConnectionTimingInfo:null}}function Ih(){return{referrerPolicy:"strict-origin-when-cross-origin"}}function Jx(e){return{referrerPolicy:e.referrerPolicy}}function Px(e){let t=e.referrerPolicy;ws(t);let s=null;if(e.referrer==="client"){let a=Eh();if(!a||a.origin==="null")return"no-referrer";s=new URL(a)}else e.referrer instanceof URL&&(s=e.referrer);let r=oc(s),i=oc(s,!0);r.toString().length>4096&&(r=i);let o=jo(e,r),n=pi(r)&&!pi(e.url);switch(t){case"origin":return i??oc(s,!0);case"unsafe-url":return r;case"same-origin":return o?i:"no-referrer";case"origin-when-cross-origin":return o?r:i;case"strict-origin-when-cross-origin":{let a=gi(e);return jo(r,a)?r:pi(r)&&!pi(a)?"no-referrer":i}default:return n?"no-referrer":i}}function oc(e,t){return ws(e instanceof URL),e=new URL(e),e.protocol==="file:"||e.protocol==="about:"||e.protocol==="blank:"?"no-referrer":(e.username="",e.password="",e.hash="",t&&(e.pathname="",e.search=""),e)}function pi(e){if(!(e instanceof URL))return!1;if(e.href==="about:blank"||e.href==="about:srcdoc"||e.protocol==="data:"||e.protocol==="file:")return!0;return t(e.origin);function t(s){if(s==null||s==="null")return!1;let r=new URL(s);return!!(r.protocol==="https:"||r.protocol==="wss:"||/^127(?:\.[0-9]+){0,2}\.[0-9]+$|^\[(?:0*:)*?:?0*1\]$/.test(r.hostname)||r.hostname==="localhost"||r.hostname.includes("localhost.")||r.hostname.endsWith(".localhost"))}}function Hx(e,t){if(Wo===void 0)return!0;let s=wh(t);if(s==="no metadata"||s.length===0)return!0;let r=qx(s),i=Wx(s,r);for(let o of i){let n=o.algo,a=o.hash,A=Wo.createHash(n).update(e).digest("base64");if(A[A.length-1]==="="&&(A[A.length-2]==="="?A=A.slice(0,-2):A=A.slice(0,-1)),jx(A,a))return!0}return!1}var Vx=/(?<algo>sha256|sha384|sha512)-((?<hash>[A-Za-z0-9+/]+|[A-Za-z0-9_-]+)={0,2}(?:\s|$)( +[!-~]*)?)?/i;function wh(e){let t=[],s=!0;for(let r of e.split(" ")){s=!1;let i=Vx.exec(r);if(i===null||i.groups===void 0||i.groups.algo===void 0)continue;let o=i.groups.algo.toLowerCase();fh.includes(o)&&t.push(i.groups)}return s===!0?"no metadata":t}function qx(e){let t=e[0].algo;if(t[3]==="5")return t;for(let s=1;s<e.length;++s){let r=e[s];if(r.algo[3]==="5"){t="sha512";break}else{if(t[3]==="3")continue;r.algo[3]==="3"&&(t="sha384")}}return t}function Wx(e,t){if(e.length===1)return e;let s=0;for(let r=0;r<e.length;++r)e[r].algo===t&&(e[s++]=e[r]);return e.length=s,e}function jx(e,t){if(e.length!==t.length)return!1;for(let s=0;s<e.length;++s)if(e[s]!==t[s]){if(e[s]==="+"&&t[s]==="-"||e[s]==="/"&&t[s]==="_")continue;return!1}return!0}function zx(e){}function jo(e,t){return e.origin===t.origin&&e.origin==="null"||e.protocol===t.protocol&&e.hostname===t.hostname&&e.port===t.port}function Zx(){let e,t;return{promise:new Promise((r,i)=>{e=r,t=i}),resolve:e,reject:t}}function Kx(e){return e.controller.state==="aborted"}function Xx(e){return e.controller.state==="aborted"||e.controller.state==="terminated"}function $x(e){return yx[e.toLowerCase()]??e}function ev(e){let t=JSON.stringify(e);if(t===void 0)throw new TypeError("Value is not JSON serializable");return ws(typeof t=="string"),t}var tv=Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()));function bh(e,t,s=0,r=1){class i{#e;#t;#s;constructor(n,a){this.#e=n, Line truncated `)||e.includes("\r")||e.includes("\0"))===!1}function fv(e,t){let{headersList:s}=t,i=(s.get("referrer-policy",!0)??"").split(","),r="";if(i.length>0)for(let n=i.length;n!==0;n--){let o=i[n-1].trim();if(sv.has(o)){r=o;break}}r!==""&&(e.referrerPolicy=r)}function Qv(){return"allowed"}function Bv(){return"success"}function Cv(){return"success"}function Iv(e){let t=null;t=e.mode,e.headersList.set("sec-fetch-mode",t,!0)}function wv(e){let t=e.origin;if(!(t==="client"||t===void 0)){if(e.responseTainting==="cors"||e.mode==="websocket")e.headersList.append("origin",t,!0);else if(e.method!=="GET"&&e.method!=="HEAD"){switch(e.referrerPolicy){case"no-referrer":t=null;break;case"no-referrer-when-downgrade":case"strict-origin":case"strict-origin-when-cross-origin":e.origin&&Bc(e.origin)&&!Bc(mr(e))&&(t=null);break;case"same-origin":io(e,mr(e))||(t=null);break;default:}e.headersList.append("origin",t,!0)}}}function Ei(e,t){return e}function bv(e,t,s){return!e?.startTime||e.startTime<t?{domainLookupStartTime:t,domainLookupEndTime:t,connectionStartTime:t,connectionEndTime:t,secureConnectionStartTime:t,ALPNNegotiatedProtocol:e?.ALPNNegotiatedProtocol}:{domainLookupStartTime:Ei(e.domainLookupStartTime,s),domainLookupEndTime:Ei(e.domainLookupEndTime,s),connectionStartTime:Ei(e.connectionStartTime,s),connectionEndTime:Ei(e.connectionEndTime,s),secureConnectionStartTime:Ei(e.secureConnectionStartTime,s),ALPNNegotiatedProtocol:e.ALPNNegotiatedProtocol}}function yv(e){return Ei(av.now(),e)}function xv(e){return{startTime:e.startTime??0,redirectStartTime:0,redirectEndTime:0,postRedirectStartTime:e.startTime??0,finalServiceWorkerStartTime:0,finalNetworkResponseStartTime:0,finalNetworkRequestStartTime:0,endTime:0,encodedBodySize:0,decodedBodySize:0,finalConnectionTimingInfo:null}}function ed(){return{referrerPolicy:"strict-origin-when-cross-origin"}}function vv(e){return{referrerPolicy:e.referrerPolicy}}function kv(e){let t=e.referrerPolicy;bs(t);let s=null;if(e.referrer==="client"){let a=jh();if(!a||a.origin==="null")return"no-referrer";s=new URL(a)}else e.referrer instanceof URL&&(s=e.referrer);let i=Qc(s),r=Qc(s,!0);i.toString().length>4096&&(i=r);let n=io(e,i),o=Er(i)&&!Er(e.url);switch(t){case"origin":return r??Qc(s,!0);case"unsafe-url":return i;case"same-origin":return n?r:"no-referrer";case"origin-when-cross-origin":return n?i:r;case"strict-origin-when-cross-origin":{let a=mr(e);return io(i,a)?i:Er(i)&&!Er(a)?"no-referrer":r}default:return o?"no-referrer":r}}function Qc(e,t){return bs(e instanceof URL),e=new URL(e),e.protocol==="file:"||e.protocol==="about:"||e.protocol==="blank:"?"no-referrer":(e.username="",e.password="",e.hash="",t&&(e.pathname="",e.search=""),e)}function Er(e){if(!(e instanceof URL))return!1;if(e.href==="about:blank"||e.href==="about:srcdoc"||e.protocol==="data:"||e.protocol==="file:")return!0;return t(e.origin);function t(s){if(s==null||s==="null")return!1;let i=new URL(s);return!!(i.protocol==="https:"||i.protocol==="wss:"||/^127(?:\.[0-9]+){0,2}\.[0-9]+$|^\[(?:0*:)*?:?0*1\]$/.test(i.hostname)||i.hostname==="localhost"||i.hostname.includes("localhost.")||i.hostname.endsWith(".localhost"))}}function Dv(e,t){if(so===void 0)return!0;let s=td(t);if(s==="no metadata"||s.length===0)return!0;let i=Tv(s),r=Sv(s,i);for(let n of r){let o=n.algo,a=n.hash,A=so.createHash(o).update(e).digest("base64");if(A[A.length-1]==="="&&(A[A.length-2]==="="?A=A.slice(0,-2):A=A.slice(0,-1)),Fv(A,a))return!0}return!1}var Rv=/(?<algo>sha256|sha384|sha512)-((?<hash>[A-Za-z0-9+/]+|[A-Za-z0-9_-]+)={0,2}(?:\s|$)( +[!-~]*)?)?/i;function td(e){let t=[],s=!0;for(let i of e.split(" ")){s=!1;let r=Rv.exec(i);if(r===null||r.groups===void 0||r.groups.algo===void 0)continue;let n=r.groups.algo.toLowerCase();Zh.includes(n)&&t.push(r.groups)}return s===!0?"no metadata":t}function Tv(e){let t=e[0].algo;if(t[3]==="5")return t;for(let s=1;s<e.length;++s){let i=e[s];if(i.algo[3]==="5"){t="sha512";break}else{if(t[3]==="3")continue;i.algo[3]==="3"&&(t="sha384")}}return t}function Sv(e,t){if(e.length===1)return e;let s=0;for(let i=0;i<e.length;++i)e[i].algo===t&&(e[s++]=e[i]);return e.length=s,e}function Fv(e,t){if(e.length!==t.length)return!1;for(let s=0;s<e.length;++s)if(e[s]!==t[s]){if(e[s]==="+"&&t[s]==="-"||e[s]==="/"&&t[s]==="_")continue;return!1}return!0}function Uv(e){}function io(e,t){return e.origin===t.origin&&e.origin==="null"||e.protocol===t.protocol&&e.hostname===t.hostname&&e.port===t.port}function Nv(){let e,t;return{promise:new Promise((i,r)=>{e=i,t=r}),resolve:e,reject:t}}function Mv(e){return e.controller.state==="aborted"}function Gv(e){return e.controller.state==="aborted"||e.controller.state==="terminated"}function Lv(e){return lv[e.toLowerCase()]??e}function _v(e){let t=JSON.stringify(e);if(t===void 0)throw new TypeError("Value is not JSON serializable");return bs(typeof t=="string"),t}var Yv=Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()));function sd(e,t,s=0,i=1){class r{#e;#t;#s;constructor(o,a){this.#e=o, Line truncated
`);function Tv(e){for(let t=0;t<e.length;++t)if((e.charCodeAt(t)&-128)!==0)return!1;return!0}function Fv(e){let t=e.length;if(t<27||t>70)return!1;for(let s=0;s<t;++s){let r=e.charCodeAt(s);if(!(r>=48&&r<=57||r>=65&&r<=90||r>=97&&r<=122||r===39||r===45||r===95))return!1}return!0}function Sv(e,t){Zo(t!=="failure"&&t.essence==="multipart/form-data");let s=t.parameters.get("boundary");if(s===void 0)return"failure";let r=Buffer.from(`--${s}`,"utf8"),i=[],o={position:0};for(;e[o.position]===13&&e[o.position+1]===10;)o.position+=2;let n=e.length;for(;e[n-1]===10&&e[n-2]===13;)n-=2;for(n!==e.length&&(e=e.subarray(0,n));;){if(e.subarray(o.position,o.position+r.length).equals(r))o.position+=r.length;else return"failure";if(o.position===e.length-2&&Ko(e,Dv,o)||o.position===e.length-4&&Ko(e,Rv,o))return i;if(e[o.position]!==13||e[o.position+1]!==10)return"failure";o.position+=2;let a=Uv(e,o);if(a==="failure")return"failure";let{name:A,filename:c,contentType:u,encoding:l}=a;o.position+=2;let p;{let d=e.indexOf(r.subarray(2),o.position);if(d===-1)return"failure";p=e.subarray(o.position,d-4),o.position+=p.length,l==="base64"&&(p=Buffer.from(p.toString(),"base64"))}if(e[o.position]!==13||e[o.position+1]!==10)return"failure";o.position+=2;let g;c!==null?(u??="text/plain",Tv(u)||(u=""),g=new vv([p],c,{type:u})):g=Iv(Buffer.from(p)),Zo(Gh(A)),Zo(typeof g=="string"&&Gh(g)||bv(g)),i.push(yv(A,g,c))}}function Uv(e,t){let s=null,r=null,i=null,o=null;for(;;){if(e[t.position]===13&&e[t.position+1]===10)return s===null?"failure":{name:s,filename:r,contentType:i,encoding:o};let n=hr(a=>a!==10&&a!==13&&a!==58,e,t);if(n=gc(n,!0,!0,a=>a===9||a===32),!wv.test(n.toString())||e[t.position]!==58)return"failure";switch(t.position++,hr(a=>a===32||a===9,e,t),Cv(n)){case"content-disposition":{if(s=r=null,!Ko(e,kv,t)||(t.position+=17,s=_h(e,t),s===null))return"failure";if(Ko(e,Lh,t)){let a=t.position+Lh.length;if(e[a]===42&&(t.position+=1,a+=1),e[a]!==61||e[a+1]!==34||(t.position+=12,r=_h(e,t),r===null))return"failure"}break}case"content-type":{let a=hr(A=>A!==10&&A!==13,e,t);a=gc(a,!1,!0,A=>A===9||A===32),i=Mh(a);break}case"content-transfer-encoding":{let a=hr(A=>A!==10&&A!==13,e,t);a=gc(a,!1,!0,A=>A===9||A===32),o=Mh(a);break}default:hr(a=>a!==10&&a!==13,e,t)}if(e[t.position]!==13&&e[t.position+1]!==10)return"failure";t.position+=2}}function _h(e,t){Zo(e[t.position-1]===34);let s=hr(r=>r!==10&&r!==13&&r!==34,e,t);return e[t.position]!==34?null:(t.position++,s=new TextDecoder().decode(s).replace(/%0A/ig,` `);function Ek(e){for(let t=0;t<e.length;++t)if((e.charCodeAt(t)&-128)!==0)return!1;return!0}function mk(e){let t=e.length;if(t<27||t>70)return!1;for(let s=0;s<t;++s){let i=e.charCodeAt(s);if(!(i>=48&&i<=57||i>=65&&i<=90||i>=97&&i<=122||i===39||i===45||i===95))return!1}return!0}function fk(e,t){no(t!=="failure"&&t.essence==="multipart/form-data");let s=t.parameters.get("boundary");if(s===void 0)return"failure";let i=Buffer.from(`--${s}`,"utf8"),r=[],n={position:0};for(;e[n.position]===13&&e[n.position+1]===10;)n.position+=2;let o=e.length;for(;e[o-1]===10&&e[o-2]===13;)o-=2;for(o!==e.length&&(e=e.subarray(0,o));;){if(e.subarray(n.position,n.position+i.length).equals(i))n.position+=i.length;else return"failure";if(n.position===e.length-2&&oo(e,hk,n)||n.position===e.length-4&&oo(e,dk,n))return r;if(e[n.position]!==13||e[n.position+1]!==10)return"failure";n.position+=2;let a=Qk(e,n);if(a==="failure")return"failure";let{name:A,filename:c,contentType:l,encoding:u}=a;n.position+=2;let p;{let d=e.indexOf(i.subarray(2),n.position);if(d===-1)return"failure";p=e.subarray(n.position,d-4),n.position+=p.length,u==="base64"&&(p=Buffer.from(p.toString(),"base64"))}if(e[n.position]!==13||e[n.position+1]!==10)return"failure";n.position+=2;let h;c!==null?(l??="text/plain",Ek(l)||(l=""),h=new pk([p],c,{type:l})):h=ak(Buffer.from(p)),no(hd(A)),no(typeof h=="string"&&hd(h)||ck(h)),r.push(lk(A,h,c))}}function Qk(e,t){let s=null,i=null,r=null,n=null;for(;;){if(e[t.position]===13&&e[t.position+1]===10)return s===null?"failure":{name:s,filename:i,contentType:r,encoding:n};let o=fi(a=>a!==10&&a!==13&&a!==58,e,t);if(o=vc(o,!0,!0,a=>a===9||a===32),!Ak.test(o.toString())||e[t.position]!==58)return"failure";switch(t.position++,fi(a=>a===32||a===9,e,t),ok(o)){case"content-disposition":{if(s=i=null,!oo(e,gk,t)||(t.position+=17,s=md(e,t),s===null))return"failure";if(oo(e,Ed,t)){let a=t.position+Ed.length;if(e[a]===42&&(t.position+=1,a+=1),e[a]!==61||e[a+1]!==34||(t.position+=12,i=md(e,t),i===null))return"failure"}break}case"content-type":{let a=fi(A=>A!==10&&A!==13,e,t);a=vc(a,!1,!0,A=>A===9||A===32),r=dd(a);break}case"content-transfer-encoding":{let a=fi(A=>A!==10&&A!==13,e,t);a=vc(a,!1,!0,A=>A===9||A===32),n=dd(a);break}default:fi(a=>a!==10&&a!==13,e,t)}if(e[t.position]!==13&&e[t.position+1]!==10)return"failure";t.position+=2}}function md(e,t){no(e[t.position-1]===34);let s=fi(i=>i!==10&&i!==13&&i!==34,e,t);return e[t.position]!==34?null:(t.position++,s=new TextDecoder().decode(s).replace(/%0A/ig,`
`).replace(/%0D/ig,"\r").replace(/%22/g,'"'),s)}function hr(e,t,s){let r=s.position;for(;r<t.length&&e(t[r]);)++r;return t.subarray(s.position,s.position=r)}function gc(e,t,s,r){let i=0,o=e.length-1;if(t)for(;i<e.length&&r(e[i]);)i++;if(s)for(;o>0&&r(e[o]);)o--;return i===0&&o===e.length-1?e:e.subarray(i,o+1)}function Ko(e,t,s){if(e.length<t.length)return!1;for(let r=0;r<t.length;r++)if(t[r]!==e[s.position+r])return!1;return!0}Yh.exports={multipartFormDataParser:Sv,validateBoundary:Fv}});var mr=B((q2,Kh)=>{"use strict";var Ei=U(),{ReadableStreamFrom:Nv,isBlobLike:Jh,isReadableStreamLike:Gv,readableStreamClose:Mv,createDeferredPromise:Lv,fullyReadBody:_v,extractMimeType:Yv,utf8DecodeBytes:Vh}=Ne(),{FormData:Ph}=di(),{kState:Er}=Kt(),{webidl:Ov}=he(),{Blob:Jv}=require("node:buffer"),hc=require("node:assert"),{isErrored:qh,isDisturbed:Pv}=require("node:stream"),{isArrayBuffer:Hv}=require("node:util/types"),{serializeAMimeType:Vv}=ke(),{multipartFormDataParser:qv}=Oh(),dc;try{let e=require("node:crypto");dc=t=>e.randomInt(0,t)}catch{dc=e=>Math.floor(Math.random(e))}var Xo=new TextEncoder;function Wv(){}var Wh=globalThis.FinalizationRegistry&&process.version.indexOf("v18")!==0,jh;Wh&&(jh=new FinalizationRegistry(e=>{let t=e.deref();t&&!t.locked&&!Pv(t)&&!qh(t)&&t.cancel("Response object has been garbage collected").catch(Wv)}));function zh(e,t=!1){let s=null;e instanceof ReadableStream?s=e:Jh(e)?s=e.stream():s=new ReadableStream({async pull(A){let c=typeof i=="string"?Xo.encode(i):i;c.byteLength&&A.enqueue(c),queueMicrotask(()=>Mv(A))},start(){},type:"bytes"}),hc(Gv(s));let r=null,i=null,o=null,n=null;if(typeof e=="string")i=e,n="text/plain;charset=UTF-8";else if(e instanceof URLSearchParams)i=e.toString(),n="application/x-www-form-urlencoded;charset=UTF-8";else if(Hv(e))i=new Uint8Array(e.slice());else if(ArrayBuffer.isView(e))i=new Uint8Array(e.buffer.slice(e.byteOffset,e.byteOffset+e.byteLength));else if(Ei.isFormDataLike(e)){let A=`----formdata-undici-0${`${dc(1e11)}`.padStart(11,"0")}`,c=`--${A}\r `).replace(/%0D/ig,"\r").replace(/%22/g,'"'),s)}function fi(e,t,s){let i=s.position;for(;i<t.length&&e(t[i]);)++i;return t.subarray(s.position,s.position=i)}function vc(e,t,s,i){let r=0,n=e.length-1;if(t)for(;r<e.length&&i(e[r]);)r++;if(s)for(;n>0&&i(e[n]);)n--;return r===0&&n===e.length-1?e:e.subarray(r,n+1)}function oo(e,t,s){if(e.length<t.length)return!1;for(let i=0;i<t.length;i++)if(t[i]!==e[s.position+i])return!1;return!0}fd.exports={multipartFormDataParser:fk,validateBoundary:mk}});var Ci=Q((OY,Dd)=>{"use strict";var Br=N(),{ReadableStreamFrom:Bk,isBlobLike:Bd,isReadableStreamLike:Ck,readableStreamClose:Ik,createDeferredPromise:wk,fullyReadBody:bk,extractMimeType:yk,utf8DecodeBytes:wd}=Ge(),{FormData:Cd}=Qr(),{kState:Bi}=Kt(),{webidl:xk}=Ee(),{Blob:vk}=require("node:buffer"),kc=require("node:assert"),{isErrored:bd,isDisturbed:kk}=require("node:stream"),{isArrayBuffer:Dk}=require("node:util/types"),{serializeAMimeType:Rk}=De(),{multipartFormDataParser:Tk}=Qd(),Dc;try{let e=require("node:crypto");Dc=t=>e.randomInt(0,t)}catch{Dc=e=>Math.floor(Math.random(e))}var ao=new TextEncoder;function Sk(){}var yd=globalThis.FinalizationRegistry&&process.version.indexOf("v18")!==0,xd;yd&&(xd=new FinalizationRegistry(e=>{let t=e.deref();t&&!t.locked&&!kk(t)&&!bd(t)&&t.cancel("Response object has been garbage collected").catch(Sk)}));function vd(e,t=!1){let s=null;e instanceof ReadableStream?s=e:Bd(e)?s=e.stream():s=new ReadableStream({async pull(A){let c=typeof r=="string"?ao.encode(r):r;c.byteLength&&A.enqueue(c),queueMicrotask(()=>Ik(A))},start(){},type:"bytes"}),kc(Ck(s));let i=null,r=null,n=null,o=null;if(typeof e=="string")r=e,o="text/plain;charset=UTF-8";else if(e instanceof URLSearchParams)r=e.toString(),o="application/x-www-form-urlencoded;charset=UTF-8";else if(Dk(e))r=new Uint8Array(e.slice());else if(ArrayBuffer.isView(e))r=new Uint8Array(e.buffer.slice(e.byteOffset,e.byteOffset+e.byteLength));else if(Br.isFormDataLike(e)){let A=`----formdata-undici-0${`${Dc(1e11)}`.padStart(11,"0")}`,c=`--${A}\r
Content-Disposition: form-data`;let u=f=>f.replace(/\n/g,"%0A").replace(/\r/g,"%0D").replace(/"/g,"%22"),l=f=>f.replace(/\r?\n|\r/g,`\r Content-Disposition: form-data`;let l=f=>f.replace(/\n/g,"%0A").replace(/\r/g,"%0D").replace(/"/g,"%22"),u=f=>f.replace(/\r?\n|\r/g,`\r
`),p=[],g=new Uint8Array([13,10]);o=0;let d=!1;for(let[f,h]of e)if(typeof h=="string"){let m=Xo.encode(c+`; name="${u(l(f))}"\r `),p=[],h=new Uint8Array([13,10]);n=0;let d=!1;for(let[f,g]of e)if(typeof g=="string"){let m=ao.encode(c+`; name="${l(u(f))}"\r
\r \r
${l(h)}\r ${u(g)}\r
`);p.push(m),o+=m.byteLength}else{let m=Xo.encode(`${c}; name="${u(l(f))}"`+(h.name?`; filename="${u(h.name)}"`:"")+`\r `);p.push(m),n+=m.byteLength}else{let m=ao.encode(`${c}; name="${l(u(f))}"`+(g.name?`; filename="${l(g.name)}"`:"")+`\r
Content-Type: ${h.type||"application/octet-stream"}\r Content-Type: ${g.type||"application/octet-stream"}\r
\r \r
`);p.push(m,h,g),typeof h.size=="number"?o+=m.byteLength+h.size+g.byteLength:d=!0}let E=Xo.encode(`--${A}--\r `);p.push(m,g,h),typeof g.size=="number"?n+=m.byteLength+g.size+h.byteLength:d=!0}let E=ao.encode(`--${A}--\r
`);p.push(E),o+=E.byteLength,d&&(o=null),i=e,r=async function*(){for(let f of p)f.stream?yield*f.stream():yield f},n=`multipart/form-data; boundary=${A}`}else if(Jh(e))i=e,o=e.size,e.type&&(n=e.type);else if(typeof e[Symbol.asyncIterator]=="function"){if(t)throw new TypeError("keepalive");if(Ei.isDisturbed(e)||e.locked)throw new TypeError("Response body object should not be disturbed or locked");s=e instanceof ReadableStream?e:Nv(e)}if((typeof i=="string"||Ei.isBuffer(i))&&(o=Buffer.byteLength(i)),r!=null){let A;s=new ReadableStream({async start(){A=r(e)[Symbol.asyncIterator]()},async pull(c){let{value:u,done:l}=await A.next();if(l)queueMicrotask(()=>{c.close(),c.byobRequest?.respond(0)});else if(!qh(s)){let p=new Uint8Array(u);p.byteLength&&c.enqueue(p)}return c.desiredSize>0},async cancel(c){await A.return()},type:"bytes"})}return[{stream:s,source:i,length:o},n]}function jv(e,t=!1){return e instanceof ReadableStream&&(hc(!Ei.isDisturbed(e),"The body has already been consumed."),hc(!e.locked,"The stream is locked.")),zh(e,t)}function zv(e,t){let[s,r]=t.stream.tee();return t.stream=s,{stream:r,length:t.length,source:t.source}}function Zv(e){if(e.aborted)throw new DOMException("The operation was aborted.","AbortError")}function Kv(e){return{blob(){return dr(this,s=>{let r=Hh(this);return r===null?r="":r&&(r=Vv(r)),new Jv([s],{type:r})},e)},arrayBuffer(){return dr(this,s=>new Uint8Array(s).buffer,e)},text(){return dr(this,Vh,e)},json(){return dr(this,$v,e)},formData(){return dr(this,s=>{let r=Hh(this);if(r!==null)switch(r.essence){case"multipart/form-data":{let i=qv(s,r);if(i==="failure")throw new TypeError("Failed to parse body as FormData.");let o=new Ph;return o[Er]=i,o}case"application/x-www-form-urlencoded":{let i=new URLSearchParams(s.toString()),o=new Ph;for(let[n,a]of i)o.append(n,a);return o}}throw new TypeError('Content-Type was not one of "multipart/form-data" or "application/x-www-form-urlencoded".')},e)},bytes(){return dr(this,s=>new Uint8Array(s),e)}}}function Xv(e){Object.assign(e.prototype,Kv(e))}async function dr(e,t,s){if(Ov.brandCheck(e,s),Zh(e))throw new TypeError("Body is unusable: Body has already been read");Zv(e[Er]);let r=Lv(),i=n=>r.reject(n),o=n=>{try{r.resolve(t(n))}catch(a){i(a)}};return e[Er].body==null?(o(Buffer.allocUnsafe(0)),r.promise):(await _v(e[Er].body,o,i),r.promise)}function Zh(e){let t=e[Er].body;return t!=null&&(t.stream.locked||Ei.isDisturbed(t.stream))}function $v(e){return JSON.parse(Vh(e))}function Hh(e){let t=e[Er].headersList,s=Yv(t);return s==="failure"?null:s}Kh.exports={extractBody:zh,safelyExtractBody:jv,cloneBody:zv,mixinBody:Xv,streamRegistry:jh,hasFinalizationRegistry:Wh,bodyUnusable:Zh}});var gd=B((W2,pd)=>{"use strict";var v=require("node:assert"),D=U(),{channels:Xh}=ir(),Ec=KA(),{RequestContentLengthMismatchError:bs,ResponseContentLengthMismatchError:$h,RequestAbortedError:ad,HeadersTimeoutError:ek,HeadersOverflowError:tk,SocketError:fr,InformationalError:Qr,BodyTimeoutError:sk,HTTPParserError:rk,ResponseExceededMaxSizeError:ik}=_(),{kUrl:Ad,kReset:De,kClient:sn,kParser:W,kBlocking:Qi,kRunning:ie,kPending:cd,kSize:ed,kWriting:Xt,kQueue:rt,kNoRef:mi,kKeepAliveDefaultTimeout:ok,kHostHeader:nk,kPendingIdx:ak,kRunningIdx:je,kError:Ce,kPipelining:rn,kSocket:xs,kKeepAliveTimeoutValue:nn,kMaxHeadersSize:mc,kKeepAliveMaxTimeout:Ak,kKeepAliveTimeoutThreshold:ck,kHeadersTimeout:lk,kBodyTimeout:uk,kStrictContentLength:Bc,kMaxRequests:td,kCounter:pk,kMaxResponseSize:gk,kOnError:sd,kResume:Gt,kHTTPContext:ld}=z(),Ge=jg(),rd=Buffer.alloc(0),$o=Buffer[Symbol.species],en=D.addListener,hk=D.removeAllListeners,vs=Symbol("kIdleSocketValidation"),ys=Symbol("kIdleSocketValidationTimeout"),bc=Symbol("kSocketUsed"),fc;async function dk(){let e=process.env.JEST_WORKER_ID?ec():void 0,t;try{t=await WebAssembly.compile(Kg())}catch{t=await WebAssembly.compile(e||ec())}return await WebAssembly.instantiate(t,{env:{wasm_on_url:(s,r,i)=>0,wasm_on_status:(s,r,i)=>{v($.ptr===s);let o=r-Bt+Qt.byteOffset;return $.onStatus(new $o(Qt.buffer,o,i))||0},wasm_on_message_begin:s=>(v($.ptr===s),$.onMessageBegin()||0),wasm_on_header_field:(s,r,i)=>{v($.ptr===s);let o=r-Bt+Qt.byteOffset;return $.onHeaderField(new $o(Qt.buffer,o,i))||0},wasm_on_header_value:(s,r,i)=>{v($.ptr===s);let o=r-Bt+Qt.byteOffset;return $.onHeaderValue(new $o(Qt.buffer,o,i))||0},wasm_on_headers_complete:(s,r,i,o)=>(v($.ptr===s),$.onHeadersComplete(r,!!i,!!o)||0),wasm_on_body:(s,r,i)=>{v($.ptr===s);let o=r-Bt+Qt.byteOffset;return $.onBody(new $o(Qt.buffer,o,i))||0},wasm_on_message_complete:s=>(v($.ptr===s),$.onMessageComplete()||0)}})}var Qc=null,Cc=dk();Cc.catch();var $=null,Qt=null,tn=0,Bt=null,Ek=0,fi=1,Br=2|fi,on=4|fi,Ic=8|Ek,wc=class{constructor(t,s,{exports:r}){v(Number.isFinite(t[mc])&&t[mc]>0),this.llhttp=r,this.ptr=this.llhttp.llhttp_alloc(Ge.TYPE.RESPONSE),this.client=t,this.socket=s,this.timeout=null,this.timeoutValue=null,this.timeoutType=null,this.statusCode=null,this.statusText="",this.upgrade=!1,this.headers= Line truncated `);p.push(E),n+=E.byteLength,d&&(n=null),r=e,i=async function*(){for(let f of p)f.stream?yield*f.stream():yield f},o=`multipart/form-data; boundary=${A}`}else if(Bd(e))r=e,n=e.size,e.type&&(o=e.type);else if(typeof e[Symbol.asyncIterator]=="function"){if(t)throw new TypeError("keepalive");if(Br.isDisturbed(e)||e.locked)throw new TypeError("Response body object should not be disturbed or locked");s=e instanceof ReadableStream?e:Bk(e)}if((typeof r=="string"||Br.isBuffer(r))&&(n=Buffer.byteLength(r)),i!=null){let A;s=new ReadableStream({async start(){A=i(e)[Symbol.asyncIterator]()},async pull(c){let{value:l,done:u}=await A.next();if(u)queueMicrotask(()=>{c.close(),c.byobRequest?.respond(0)});else if(!bd(s)){let p=new Uint8Array(l);p.byteLength&&c.enqueue(p)}return c.desiredSize>0},async cancel(c){await A.return()},type:"bytes"})}return[{stream:s,source:r,length:n},o]}function Fk(e,t=!1){return e instanceof ReadableStream&&(kc(!Br.isDisturbed(e),"The body has already been consumed."),kc(!e.locked,"The stream is locked.")),vd(e,t)}function Uk(e,t){let[s,i]=t.stream.tee();return t.stream=s,{stream:i,length:t.length,source:t.source}}function Nk(e){if(e.aborted)throw new DOMException("The operation was aborted.","AbortError")}function Mk(e){return{blob(){return Qi(this,s=>{let i=Id(this);return i===null?i="":i&&(i=Rk(i)),new vk([s],{type:i})},e)},arrayBuffer(){return Qi(this,s=>new Uint8Array(s).buffer,e)},text(){return Qi(this,wd,e)},json(){return Qi(this,Lk,e)},formData(){return Qi(this,s=>{let i=Id(this);if(i!==null)switch(i.essence){case"multipart/form-data":{let r=Tk(s,i);if(r==="failure")throw new TypeError("Failed to parse body as FormData.");let n=new Cd;return n[Bi]=r,n}case"application/x-www-form-urlencoded":{let r=new URLSearchParams(s.toString()),n=new Cd;for(let[o,a]of r)n.append(o,a);return n}}throw new TypeError('Content-Type was not one of "multipart/form-data" or "application/x-www-form-urlencoded".')},e)},bytes(){return Qi(this,s=>new Uint8Array(s),e)}}}function Gk(e){Object.assign(e.prototype,Mk(e))}async function Qi(e,t,s){if(xk.brandCheck(e,s),kd(e))throw new TypeError("Body is unusable: Body has already been read");Nk(e[Bi]);let i=wk(),r=o=>i.reject(o),n=o=>{try{i.resolve(t(o))}catch(a){r(a)}};return e[Bi].body==null?(n(Buffer.allocUnsafe(0)),i.promise):(await bk(e[Bi].body,n,r),i.promise)}function kd(e){let t=e[Bi].body;return t!=null&&(t.stream.locked||Br.isDisturbed(t.stream))}function Lk(e){return JSON.parse(wd(e))}function Id(e){let t=e[Bi].headersList,s=yk(t);return s==="failure"?null:s}Dd.exports={extractBody:vd,safelyExtractBody:Fk,cloneBody:Uk,mixinBody:Gk,streamRegistry:xd,hasFinalizationRegistry:yd,bodyUnusable:kd}});var Vd=Q((PY,Hd)=>{"use strict";var D=require("node:assert"),x=N(),{channels:Rd}=Ai(),Rc=uc(),{RequestContentLengthMismatchError:ys,ResponseContentLengthMismatchError:Td,RequestAbortedError:_d,InvalidArgumentError:_k,HeadersTimeoutError:Yk,HeadersOverflowError:Ok,SocketError:Ii,InformationalError:xs,BodyTimeoutError:Pk,HTTPParserError:Jk,ResponseExceededMaxSizeError:Hk}=Y(),{kUrl:Yd,kReset:Re,kClient:uo,kParser:j,kBlocking:wr,kRunning:oe,kPending:Od,kSize:Sd,kWriting:Xt,kQueue:rt,kNoRef:Cr,kKeepAliveDefaultTimeout:Vk,kHostHeader:qk,kPendingIdx:Wk,kRunningIdx:Ke,kError:be,kPipelining:po,kSocket:vs,kKeepAliveTimeoutValue:ho,kMaxHeadersSize:Tc,kKeepAliveMaxTimeout:jk,kKeepAliveTimeoutThreshold:zk,kHeadersTimeout:Zk,kBodyTimeout:Kk,kStrictContentLength:Uc,kMaxRequests:Fd,kCounter:Xk,kMaxResponseSize:$k,kOnError:Ud,kResume:Lt,kHTTPContext:Pd}=Z(),Le=xh(),Nd=Buffer.alloc(0),Ao=Buffer[Symbol.species],co=x.addListener,e0=x.removeAllListeners,ks=Symbol("kIdleSocketValidation"),wi=Symbol("kIdleSocketValidationTimeout"),Lc=Symbol("kSocketUsed"),Sc;async function t0(){let e=process.env.JEST_WORKER_ID?hc():void 0,t;try{t=await WebAssembly.compile(Dh())}catch{t=await WebAssembly.compile(e||hc())}return await WebAssembly.instantiate(t,{env:{wasm_on_url:(s,i,r)=>0,wasm_on_status:(s,i,r)=>{D(ee.ptr===s);let n=i-Qt+ft.byteOffset;return ee.onStatus(new Ao(ft.buffer,n,r))||0},wasm_on_message_begin:s=>(D(ee.ptr===s),ee.onMessageBegin()||0),wasm_on_header_field:(s,i,r)=>{D(ee.ptr===s);let n=i-Qt+ft.byteOffset;return ee.onHeaderField(new Ao(ft.buffer,n,r))||0},wasm_on_header_value:(s,i,r)=>{D(ee.ptr===s);let n=i-Qt+ft.byteOffset;return ee.onHeaderValue(new Ao(ft.buffer,n,r))||0},wasm_on_headers_complete:(s,i,r,n)=>(D(ee.ptr===s),ee.onHeadersComplete(i,!!r,!!n)||0),wasm_on_body:(s,i,r)=>{D(ee.ptr===s);let n=i-Qt+ft.byteOffset;return ee.onBody(new Ao(ft.buffer,n,r))||0},wasm_on_message_complete:s=>(D(ee.ptr===s),ee.onMessageComplete()||0)}})}var Fc=null,Nc=t0();Nc.catch();var ee=null,ft=null,lo=0,Qt=null,s0=0,Ir=1,bi=2|Ir,go=4|Ir,Mc=8|s0,Gc=class{constructor(t,s,{exports:i}){D(Number.isFinite(t[Tc])&&t[Tc]>0),this.llhttp=i,this.ptr=this.llhttp.llhttp_alloc(Le.TYPE.RESPONSE),this.client=t,this.socket=s,this.timeout=null,this.timeoutValue=null,this.timeoutType=null,this.statusCode=null,this.stat Line truncated
`;if(typeof i=="string"?E+=`host: ${i}\r `;if(typeof r=="string"?E+=`host: ${r}\r
`:E+=e[nk],o?E+=`connection: upgrade\r `:E+=e[qk],n?E+=`connection: upgrade\r
upgrade: ${o}\r upgrade: ${n}\r
`:e[rn]&&!g[De]?E+=`connection: keep-alive\r `:e[po]&&!h[Re]?E+=`connection: keep-alive\r
`:E+=`connection: close\r `:E+=`connection: close\r
`,Array.isArray(c))for(let f=0;f<c.length;f+=2){let h=c[f+0],m=c[f+1];if(Array.isArray(m))for(let Q=0;Q<m.length;Q++)E+=`${h}: ${m[Q]}\r `,Array.isArray(c))for(let f=0;f<c.length;f+=2){let g=c[f+0],m=c[f+1];if(Array.isArray(m))for(let B=0;B<m.length;B++)E+=`${g}: ${m[B]}\r
`;else E+=`${h}: ${m}\r `;else E+=`${g}: ${m}\r
`}return Xh.sendHeaders.hasSubscribers&&Xh.sendHeaders.publish({request:t,headers:E,socket:g}),!A||p===0?od(d,null,e,t,g,u,E,l):D.isBuffer(A)?od(d,A,e,t,g,u,E,l):D.isBlobLike(A)?typeof A.stream=="function"?nd(d,A.stream(),e,t,g,u,E,l):wk(d,A,e,t,g,u,E,l):D.isStream(A)?Ik(d,A,e,t,g,u,E,l):D.isIterable(A)?nd(d,A,e,t,g,u,E,l):v(!1),!0}function Ik(e,t,s,r,i,o,n,a){v(o!==0||s[ie]===0,"stream body cannot be pipelined");let A=!1,c=new an({abort:e,socket:i,request:r,contentLength:o,client:s,expectsPayload:a,header:n}),u=function(d){if(!A)try{!c.write(d)&&this.pause&&this.pause()}catch(E){D.destroy(this,E)}},l=function(){A||t.resume&&t.resume()},p=function(){if(queueMicrotask(()=>{t.removeListener("error",g)}),!A){let d=new ad;queueMicrotask(()=>g(d))}},g=function(d){if(!A){if(A=!0,v(i.destroyed||i[Xt]&&s[ie]<=1),i.off("drain",l).off("error",g),t.removeListener("data",u).removeListener("end",g).removeListener("close",p),!d)try{c.end()}catch(E){d=E}c.destroy(d),d&&(d.code!=="UND_ERR_INFO"||d.message!=="reset")?D.destroy(t,d):D.destroy(t)}};t.on("data",u).on("end",g).on("error",g).on("close",p),t.resume&&t.resume(),i.on("drain",l).on("error",g),t.errorEmitted??t.errored?setImmediate(()=>g(t.errored)):(t.endEmitted??t.readableEnded)&&setImmediate(()=>g(null)),(t.closeEmitted??t.closed)&&setImmediate(p)}function od(e,t,s,r,i,o,n,a){try{t?D.isBuffer(t)&&(v(o===t.byteLength,"buffer body must have content length"),i.cork(),i.write(`${n}content-length: ${o}\r `}return Rd.sendHeaders.hasSubscribers&&Rd.sendHeaders.publish({request:t,headers:E,socket:h}),!A||p===0?Gd(d,null,e,t,h,l,E,u):x.isBuffer(A)?Gd(d,A,e,t,h,l,E,u):x.isBlobLike(A)?typeof A.stream=="function"?Ld(d,A.stream(),e,t,h,l,E,u):c0(d,A,e,t,h,l,E,u):x.isStream(A)?A0(d,A,e,t,h,l,E,u):x.isIterable(A)?Ld(d,A,e,t,h,l,E,u):D(!1),!0}function A0(e,t,s,i,r,n,o,a){D(n!==0||s[oe]===0,"stream body cannot be pipelined");let A=!1,c=new Eo({abort:e,socket:r,request:i,contentLength:n,client:s,expectsPayload:a,header:o}),l=function(d){if(!A)try{!c.write(d)&&this.pause&&this.pause()}catch(E){x.destroy(this,E)}},u=function(){A||t.resume&&t.resume()},p=function(){if(queueMicrotask(()=>{t.removeListener("error",h)}),!A){let d=new _d;queueMicrotask(()=>h(d))}},h=function(d){if(!A){if(A=!0,D(r.destroyed||r[Xt]&&s[oe]<=1),r.off("drain",u).off("error",h),t.removeListener("data",l).removeListener("end",h).removeListener("close",p),!d)try{c.end()}catch(E){d=E}c.destroy(d),d&&(d.code!=="UND_ERR_INFO"||d.message!=="reset")?x.destroy(t,d):x.destroy(t)}};t.on("data",l).on("end",h).on("error",h).on("close",p),t.resume&&t.resume(),r.on("drain",u).on("error",h),t.errorEmitted??t.errored?setImmediate(()=>h(t.errored)):(t.endEmitted??t.readableEnded)&&setImmediate(()=>h(null)),(t.closeEmitted??t.closed)&&setImmediate(p)}function Gd(e,t,s,i,r,n,o,a){try{t?x.isBuffer(t)&&(D(n===t.byteLength,"buffer body must have content length"),r.cork(),r.write(`${o}content-length: ${n}\r
\r \r
`,"latin1"),i.write(t),i.uncork(),r.onBodySent(t),!a&&r.reset!==!1&&(i[De]=!0)):o===0?i.write(`${n}content-length: 0\r `,"latin1"),r.write(t),r.uncork(),i.onBodySent(t),!a&&i.reset!==!1&&(r[Re]=!0)):n===0?r.write(`${o}content-length: 0\r
\r \r
`,"latin1"):(v(o===null,"no body must not have content length"),i.write(`${n}\r `,"latin1"):(D(n===null,"no body must not have content length"),r.write(`${o}\r
`,"latin1")),r.onRequestSent(),s[Gt]()}catch(A){e(A)}}async function wk(e,t,s,r,i,o,n,a){v(o===t.size,"blob body must have content length");try{if(o!=null&&o!==t.size)throw new bs;let A=Buffer.from(await t.arrayBuffer());i.cork(),i.write(`${n}content-length: ${o}\r `,"latin1")),i.onRequestSent(),s[Lt]()}catch(A){e(A)}}async function c0(e,t,s,i,r,n,o,a){D(n===t.size,"blob body must have content length");try{if(n!=null&&n!==t.size)throw new ys;let A=Buffer.from(await t.arrayBuffer());r.cork(),r.write(`${o}content-length: ${n}\r
\r \r
`,"latin1"),i.write(A),i.uncork(),r.onBodySent(A),r.onRequestSent(),!a&&r.reset!==!1&&(i[De]=!0),s[Gt]()}catch(A){e(A)}}async function nd(e,t,s,r,i,o,n,a){v(o!==0||s[ie]===0,"iterator body cannot be pipelined");let A=null;function c(){if(A){let p=A;A=null,p()}}let u=()=>new Promise((p,g)=>{v(A===null),i[Ce]?g(i[Ce]):A=p});i.on("close",c).on("drain",c);let l=new an({abort:e,socket:i,request:r,contentLength:o,client:s,expectsPayload:a,header:n});try{for await(let p of t){if(i[Ce])throw i[Ce];l.write(p)||await u()}l.end()}catch(p){l.destroy(p)}finally{i.off("close",c).off("drain",c)}}var an=class{constructor({abort:t,socket:s,request:r,contentLength:i,client:o,expectsPayload:n,header:a}){this.socket=s,this.request=r,this.contentLength=i,this.client=o,this.bytesWritten=0,this.expectsPayload=n,this.header=a,this.abort=t,s[Xt]=!0}write(t){let{socket:s,request:r,contentLength:i,client:o,bytesWritten:n,expectsPayload:a,header:A}=this;if(s[Ce])throw s[Ce];if(s.destroyed)return!1;let c=Buffer.byteLength(t);if(!c)return!0;if(i!==null&&n+c>i){if(o[Bc])throw new bs;process.emitWarning(new bs)}s.cork(),n===0&&(!a&&r.reset!==!1&&(s[De]=!0),i===null?s.write(`${A}transfer-encoding: chunked\r `,"latin1"),r.write(A),r.uncork(),i.onBodySent(A),i.onRequestSent(),!a&&i.reset!==!1&&(r[Re]=!0),s[Lt]()}catch(A){e(A)}}async function Ld(e,t,s,i,r,n,o,a){D(n!==0||s[oe]===0,"iterator body cannot be pipelined");let A=null;function c(){if(A){let p=A;A=null,p()}}let l=()=>new Promise((p,h)=>{D(A===null),r[be]?h(r[be]):A=p});r.on("close",c).on("drain",c);let u=new Eo({abort:e,socket:r,request:i,contentLength:n,client:s,expectsPayload:a,header:o});try{for await(let p of t){if(r[be])throw r[be];u.write(p)||await l()}u.end()}catch(p){u.destroy(p)}finally{r.off("close",c).off("drain",c)}}var Eo=class{constructor({abort:t,socket:s,request:i,contentLength:r,client:n,expectsPayload:o,header:a}){this.socket=s,this.request=i,this.contentLength=r,this.client=n,this.bytesWritten=0,this.expectsPayload=o,this.header=a,this.abort=t,s[Xt]=!0}write(t){let{socket:s,request:i,contentLength:r,client:n,bytesWritten:o,expectsPayload:a,header:A}=this;if(s[be])throw s[be];if(s.destroyed)return!1;let c=Buffer.byteLength(t);if(!c)return!0;if(r!==null&&o+c>r){if(n[Uc])throw new ys;process.emitWarning(new ys)}s.cork(),o===0&&(!a&&i.reset!==!1&&(s[Re]=!0),r===null?s.write(`${A}transfer-encoding: chunked\r
`,"latin1"):s.write(`${A}content-length: ${i}\r `,"latin1"):s.write(`${A}content-length: ${r}\r
\r \r
`,"latin1")),i===null&&s.write(`\r `,"latin1")),r===null&&s.write(`\r
${c.toString(16)}\r ${c.toString(16)}\r
`,"latin1"),this.bytesWritten+=c;let u=s.write(t);return s.uncork(),r.onBodySent(t),u||s[W].timeout&&s[W].timeoutType===Br&&s[W].timeout.refresh&&s[W].timeout.refresh(),u}end(){let{socket:t,contentLength:s,client:r,bytesWritten:i,expectsPayload:o,header:n,request:a}=this;if(a.onRequestSent(),t[Xt]=!1,t[Ce])throw t[Ce];if(!t.destroyed){if(i===0?o?t.write(`${n}content-length: 0\r `,"latin1"),this.bytesWritten+=c;let l=s.write(t);return s.uncork(),i.onBodySent(t),l||s[j].timeout&&s[j].timeoutType===bi&&s[j].timeout.refresh&&s[j].timeout.refresh(),l}end(){let{socket:t,contentLength:s,client:i,bytesWritten:r,expectsPayload:n,header:o,request:a}=this;if(a.onRequestSent(),t[Xt]=!1,t[be])throw t[be];if(!t.destroyed){if(r===0?n?t.write(`${o}content-length: 0\r
\r \r
`,"latin1"):t.write(`${n}\r `,"latin1"):t.write(`${o}\r
`,"latin1"):s===null&&t.write(`\r `,"latin1"):s===null&&t.write(`\r
0\r 0\r
\r \r
`,"latin1"),s!==null&&i!==s){if(r[Bc])throw new bs;process.emitWarning(new bs)}t[W].timeout&&t[W].timeoutType===Br&&t[W].timeout.refresh&&t[W].timeout.refresh(),r[Gt]()}}destroy(t){let{socket:s,client:r,abort:i}=this;s[Xt]=!1,t&&(v(r[ie]<=1,"pipeline should only contain this request"),i(t))}};pd.exports=mk});var Cd=B((j2,Bd)=>{"use strict";var ze=require("node:assert"),{pipeline:bk}=require("node:stream"),G=U(),{RequestContentLengthMismatchError:yc,RequestAbortedError:hd,SocketError:Bi,InformationalError:xc}=_(),{kUrl:An,kReset:ln,kClient:Cr,kRunning:un,kPending:yk,kQueue:$t,kPendingIdx:vc,kRunningIdx:it,kError:nt,kSocket:Ae,kStrictContentLength:xk,kOnError:kc,kMaxConcurrentStreams:Qd,kHTTP2Session:ot,kResume:es,kSize:vk,kHTTPContext:kk}=z(),Mt=Symbol("open streams"),dd,Ed=!1,cn;try{cn=require("node:http2")}catch{cn={constants:{}}}var{constants:{HTTP2_HEADER_AUTHORITY:Dk,HTTP2_HEADER_METHOD:Rk,HTTP2_HEADER_PATH:Tk,HTTP2_HEADER_SCHEME:Fk,HTTP2_HEADER_CONTENT_LENGTH:Sk,HTTP2_HEADER_EXPECT:Uk,HTTP2_HEADER_STATUS:Nk}}=cn;function Gk(e){let t=[];for(let[s,r]of Object.entries(e))if(Array.isArray(r))for(let i of r)t.push(Buffer.from(s),Buffer.from(i));else t.push(Buffer.from(s),Buffer.from(r));return t}async function Mk(e,t){e[Ae]=t,Ed||(Ed=!0,process.emitWarning("H2 support is experimental, expect them to change at any time.",{code:"UNDICI-H2"}));let s=cn.connect(e[An],{createConnection:()=>t,peerMaxConcurrentStreams:e[Qd]});s[Mt]=0,s[Cr]=e,s[Ae]=t,G.addListener(s,"error",_k),G.addListener(s,"frameError",Yk),G.addListener(s,"end",Ok),G.addListener(s,"goaway",Jk),G.addListener(s,"close",function(){let{[Cr]:i}=this,{[Ae]:o}=i,n=this[Ae][nt]||this[nt]||new Bi("closed",G.getSocketInfo(o));if(i[ot]=null,i.destroyed){ze(i[yk]===0);let a=i[$t].splice(i[it]);for(let A=0;A<a.length;A++){let c=a[A];G.errorRequest(i,c,n)}}}),s.unref(),e[ot]=s,t[ot]=s,G.addListener(t,"error",function(i){ze(i.code!=="ERR_TLS_CERT_ALTNAME_INVALID"),this[nt]=i,this[Cr][kc](i)}),G.addListener(t,"end",function(){G.destroy(this,new Bi("other side closed",G.getSocketInfo(this)))}),G.addListener(t,"close",function(){let i=this[nt]||new Bi("closed",G.getSocketInfo(this));e[Ae]=null,this[ot]!=null&&this[ot].destroy(i),e[vc]=e[it],ze(e[un]===0),e.emit("disconnect",e[An],[e],i),e[es]()});let r=!1;return t.on("close",()=>{r=!0}),{version:"h2",defaultPipelining:1/0,write(...i){return Hk(e,...i)},resume(){Lk(e)},destroy(i,o){r?queueMicrotask(o):t.destroy(i).on("close",o)},get destroyed(){return t.destroyed},busy(){return!1}}}function Lk(e){let t=e[Ae];t?.destroyed===!1&&(e[vk]===0&&e[Qd]===0?(t.unref(),e[ot].unref()):(t.ref(),e[ot].ref()))}function _k(e){ze(e.code!=="ERR_TLS_CERT_ALTNAME_INVALID"),this[Ae][nt]=e,this[Cr][kc](e)}function Yk(e,t,s){if(s===0){let r=new xc(`HTTP/2: "frameError" received - type ${e}, code ${t}`);this[Ae][nt]=r,this[Cr][kc](r)}}function Ok(){let e=new Bi("other side closed",G.getSocketInfo(this[Ae]));this.destroy(e),G.destroy(this[Ae],e)}function Jk(e){let t=this[nt]||new Bi(`HTTP/2: "GOAWAY" frame received with code ${e}`,G.getSocketInfo(this)),s=this[Cr];if(s[Ae]=null,s[kk]=null,this[ot]!=null&&(this[ot].destroy(t),this[ot]=null),G.destroy(this[Ae],t),s[it]<s[$t].length){let r=s[$t][s[it]];s[$t][s[it]++]=null,G.errorRequest(s,r,t),s[vc]=s[it]}ze(s[un]===0),s.emit("disconnect",s[An],[s],t),s[es]()}function Pk(e){return e!=="GET"&&e!=="HEAD"&&e!=="OPTIONS"&&e!=="TRACE"&&e!=="CONNECT"}function Hk(e,t){let s=e[ot],{method:r,path:i,host:o,upgrade:n,expectContinue:a,signal:A,headers:c}=t,{body:u}=t;if(n)return G.errorRequest(e,t,new Error("Upgrade not supported for H2")),!1;let l={};for(let C=0;C<c.length;C+=2){let b=c[C+0],N=c[C+1];if(Array.isArray(N))for(let O=0;O<N.length;O++)l[b]?l[b]+=`,${N[O]}`:l[b]=N[O];else l[b]=N}let p,{hostname:g,port:d}=e[An];l[Dk]=o||`${g}${d?`:${d}`:""}`,l[Rk]=r;let E=C=>{t.aborted||t.completed||(C=C||new hd,G.errorRequest(e,t,C),p!=null&&G.destroy(p,C),G.destroy(u,C),e[$t][e[it]++]=null,e[es]())};try{t.onConnect(E)}catch(C){G.errorRequest(e,t,C)}if(t.aborted)return!1;if(r==="CONNECT")return s.ref(),p=s.request(l,{endStream:!1,signal:A}),p.id&&!p.pending?(t.onUpgrade(null,null,p),++s[Mt],e[$t][e[it]++]=null):p.once("ready",()=>{t.onUpgrade(null,null,p),++s[Mt],e[$t][e[it]++]=null}),p.once("close",()=>{s[Mt]-=1,s[Mt]===0&&s.unref()}),!0;l[Tk]=i,l[Fk]="https";let f=r==="PUT"||r==="POST"||r==="PATCH";u&&typeof u.read=="function"&&u.read(0);let h=G.bodyLength(u);if(G.isFormDataLike(u)){dd??=mr().extractBody;let[C,b]=dd(u);l["content-type"]=b,u=C.stream,h=C.length}if(h==null&&(h=t.contentLength),(h===0||!f)&&(h=null),Pk(r)&&h>0&&t.contentLength!=null&&t.contentLength!==h){if(e[xk])return G.errorRequest(e,t,new yc),!1;process.emitWarning(new yc)}h!=null&&(ze(u,"no body must not have content length"),l[Sk]=`${h}`),s.ref();let m=r==="GET"||r==="HEAD"||u===null;return a?(l[Uk]="100-continue",p=s.request(l,{endStream:m,signal:A}),p.once("continue",Q)):(p=s.request(l,{endStream:m,signal:A}),Q()),++s[Mt],p.once("r Line truncated `,"latin1"),s!==null&&r!==s){if(i[Uc])throw new ys;process.emitWarning(new ys)}t[j].timeout&&t[j].timeoutType===bi&&t[j].timeout.refresh&&t[j].timeout.refresh(),i[Lt]()}}destroy(t){let{socket:s,client:i,abort:r}=this;s[Xt]=!1,t&&(D(i[oe]<=1,"pipeline should only contain this request"),r(t))}};Hd.exports=i0});var $d=Q((JY,Xd)=>{"use strict";var Ct=require("node:assert"),{errorMonitor:_c}=require("node:events"),{pipeline:l0}=require("node:stream"),M=N(),{RequestContentLengthMismatchError:Oc,RequestAbortedError:Yc,SocketError:br,InformationalError:mo}=Y(),{kUrl:fo,kReset:Bo,kClient:yi,kRunning:Co,kPending:u0,kQueue:Ds,kPendingIdx:Jc,kRunningIdx:Bt,kError:ot,kSocket:le,kStrictContentLength:p0,kOnError:Hc,kMaxConcurrentStreams:Zd,kHTTP2Session:nt,kResume:es,kSize:g0,kHTTPContext:h0}=Z(),$t=Symbol("open streams"),qd,Wd=!1,Qo;try{Qo=require("node:http2")}catch{Qo={constants:{}}}var{constants:{HTTP2_HEADER_AUTHORITY:d0,HTTP2_HEADER_METHOD:E0,HTTP2_HEADER_PATH:m0,HTTP2_HEADER_SCHEME:f0,HTTP2_HEADER_CONTENT_LENGTH:Q0,HTTP2_HEADER_EXPECT:B0,HTTP2_HEADER_STATUS:Pc}}=Qo;function Kd(e){let t=[];for(let[s,i]of Object.entries(e))if(Array.isArray(i))for(let r of i)t.push(Buffer.from(s),Buffer.from(r));else t.push(Buffer.from(s),Buffer.from(i));return t}function C0(e){let{[Pc]:t,...s}=e;return Kd(s)}async function I0(e,t){e[le]=t,Wd||(Wd=!0,process.emitWarning("H2 support is experimental, expect them to change at any time.",{code:"UNDICI-H2"}));let s=Qo.connect(e[fo],{createConnection:()=>t,peerMaxConcurrentStreams:e[Zd]});s[$t]=0,s[yi]=e,s[le]=t,M.addListener(s,"error",b0),M.addListener(s,"frameError",y0),M.addListener(s,"end",x0),M.addListener(s,"goaway",v0),M.addListener(s,"close",function(){let{[yi]:r}=this,{[le]:n}=r,o=this[le][ot]||this[ot]||new br("closed",M.getSocketInfo(n));if(r[nt]=null,r.destroyed){Ct(r[u0]===0);let a=r[Ds].splice(r[Bt]);for(let A=0;A<a.length;A++){let c=a[A];M.errorRequest(r,c,o)}}}),s.unref(),e[nt]=s,t[nt]=s,M.addListener(t,"error",function(r){this[ot]=r,this[yi][Hc](r)}),M.addListener(t,"end",function(){M.destroy(this,new br("other side closed",M.getSocketInfo(this)))}),M.addListener(t,"close",function(){let r=this[ot]||new br("closed",M.getSocketInfo(this));e[le]=null,this[nt]!=null&&this[nt].destroy(r),e[Jc]=e[Bt],Ct(e[Co]===0),e.emit("disconnect",e[fo],[e],r),e[es]()});let i=!1;return t.on("close",()=>{i=!0}),{version:"h2",defaultPipelining:1/0,write(...r){return D0(e,...r)},resume(){w0(e)},destroy(r,n){i?queueMicrotask(n):t.destroy(r).on("close",n)},get destroyed(){return t.destroyed},busy(){return!1}}}function w0(e){let t=e[le];t?.destroyed===!1&&(e[g0]===0&&e[Zd]===0?(t.unref(),e[nt].unref()):(t.ref(),e[nt].ref()))}function b0(e){this[le][ot]=e,this[yi][Hc](e)}function y0(e,t,s){if(s===0){let i=new mo(`HTTP/2: "frameError" received - type ${e}, code ${t}`);this[le][ot]=i,this[yi][Hc](i)}}function x0(){let e=new br("other side closed",M.getSocketInfo(this[le]));this.destroy(e),M.destroy(this[le],e)}function v0(e){let t=this[ot]||new br(`HTTP/2: "GOAWAY" frame received with code ${e}`,M.getSocketInfo(this)),s=this[yi];if(s[le]=null,s[h0]=null,this[nt]!=null&&(this[nt].destroy(t),this[nt]=null),M.destroy(this[le],t),s[Bt]<s[Ds].length){let i=s[Ds][s[Bt]];s[Ds][s[Bt]++]=null,M.errorRequest(s,i,t),s[Jc]=s[Bt]}Ct(s[Co]===0),s.emit("disconnect",s[fo],[s],t),s[es]()}function k0(e){return e!=="GET"&&e!=="HEAD"&&e!=="OPTIONS"&&e!=="TRACE"&&e!=="CONNECT"}function D0(e,t){let s=e[nt],{method:i,path:r,host:n,upgrade:o,expectContinue:a,signal:A,headers:c}=t,{body:l}=t;if(o)return M.errorRequest(e,t,new Error("Upgrade not supported for H2")),!1;let u={};for(let C=0;C<c.length;C+=2){let b=c[C+0],U=c[C+1];if(Array.isArray(U))for(let G=0;G<U.length;G++)u[b]?u[b]+=`,${U[G]}`:u[b]=U[G];else u[b]=U}let p,{hostname:h,port:d}=e[fo];u[d0]=n||`${h}${d?`:${d}`:""}`,u[E0]=i;let E=C=>{if(!t.aborted){if(t.completed){i==="CONNECT"&&p!=null&&M.destroy(p,C||new Yc);return}C=C||new Yc,M.errorRequest(e,t,C),p!=null&&M.destroy(p,C),M.destroy(l,C),e[Ds][e[Bt]++]=null,e[es]()}};try{t.onConnect(E)}catch(C){M.errorRequest(e,t,C)}if(t.aborted)return!1;if(i==="CONNECT"){s.ref(),p=s.request(u,{endStream:!1,signal:A});let C=!1,b=q=>{C=!0,p.off(_c,U),t.onUpgradeResponse(Number(q[Pc]),q,C0)},U=q=>{C=!0,p.off("response",b),t.onUpgradeError(q)},G=()=>{try{t.onUpgrade(null,null,p)}catch(q){p.off("response",b),E(q);return}t.aborted||(p.off("error",E),p.once(_c,U),e[Ds][e[Bt]++]=null)};return p.once("response",b),p.once("error",E),++s[$t],G(),p.once("close",()=>{!C&&t.completed&&(p.off("response",b),p.off(_c,U),t.onUpgradeError(new mo(`HTTP/2: "stream error" received - code ${p.rstCode}`))),s[$t]-=1,s[$t]===0&&s.unref()}),!0}u[m0]=r,u[f0]="https";let f=i==="PUT"||i==="POST"||i==="PATCH";l&&typeof l.read=="function"&&l.read(0);let g=M.bodyLength(l);if(M.isFormDataLike(l)){qd??=Ci().extractBody;let[C,b]=qd(l);u["content-type"]=b,l=C.stream,g=C.length}if(g==null&&(g=t.contentLength),(g===0||!f)&&(g=null),k0(i)&&g>0&&t.contentLength!=null&& Line truncated
`,this[E0]=A??3e5,this[d0]=i??3e5,this[m0]=m??!0,this[f0]=C,this[Fc]=N,this[ss]=null,this[w0]=ge>-1?ge:-1,this[y0]=jt??100,this[te]=null,this[at]=[],this[_t]=0,this[At]=0,this[bi]=tr=>Uc(this,tr),this[b0]=tr=>Sd(this,tr)}get pipelining(){return this[dn]}set pipelining(t){this[dn]=t,this[bi](!0)}get[vi](){return this[at].length-this[At]}get[xi](){return this[At]-this[_t]}get[yi](){return this[at].length-this[_t]}get[A0](){return!!this[te]&&!this[wr]&&!this[te].destroyed}get[Tc](){return!!(this[te]?.busy(null)||this[yi]>=(Fd(this)||1)||this[vi]>0)}[a0](t){Ud(this),this.once("connect",t)}[I0](t,s){let r=t.origin||this[It].origin,i=new t0(r,t,s);return this[at].push(i),this[Ds]||(ks.bodyLength(i.body)==null&&ks.isIterable(i.body)?(this[Ds]=1,queueMicrotask(()=>Uc(this))):this[bi](!0)),this[Ds]&&this[rs]!==2&&this[Tc]&&(this[rs]=2),this[rs]<2}async[B0](){return new Promise(t=>{this[yi]?this[ss]=t:t(null)})}async[C0](t){return new Promise(s=>{let r=this[at].splice(this[At]);for(let o=0;o<r.length;o++){let n=r[o];ks.errorRequest(this,n,t)}let i=()=>{this[ss]&&(this[ss](),this[ss]=null),s(null)};this[te]?(this[te].destroy(t,i),this[te]=null):queueMicrotask(i),this[bi]()})}},k0=hn();function Sd(e,t){if(e[xi]===0&&t.code!=="UND_ERR_INFO"&&t.code!=="UND_ERR_SOCKET"){Lt(e[At]===e[_t]);let s=e[at].splice(e[_t]);for(let r=0;r<s.length;r++){let i=s[r];ks.errorRequest(e,i,t)}Lt(e[yi]===0)}}async function Ud(e){Lt(!e[wr]),Lt(!e[te]);let{host:t,hostname:s,protocol:r,port:i}=e[It];if(s[0]==="["){let o=s.indexOf("]");Lt(o!==-1);let n=s.substring(1,o);Lt(Td.isIP(n)),s=n}e[wr]=!0,Ir.beforeConnect.hasSubscribers&&Ir.beforeConnect.publish({connectParams:{host:t,hostname:s,protocol:r,port:i,version:e[te]?.version,servername:e[ts],localAddress:e[wi]},connector:e[Ii]});try{let o=await new Promise((n,a)=>{e[Ii]({host:t,hostname:s,protocol:r,port:i,servername:e[ts],localAddress:e[wi]},(A,c)=>{A?a(A):n(c)})});if(e.destroyed){ks.destroy(o.on("error",Dd),new i0);return}Lt(o);try{e[te]=o.alpnProtocol==="h2"?await v0(e,o):await x0(e,o)}catch(n){throw o.destroy().on("error",Dd),n}e[wr]=!1,o[Q0]=0,o[Fc]=e[Fc],o[n0]=e,o[l0]=null,Ir.connected.hasSubscribers&&Ir.connected.publish({connectParams:{host:t,hostname:s,protocol:r,port:i,version:e[te]?.version,servername:e[ts],localAddress:e[wi]},connector:e[Ii],socket:o}),e.emit("connect",e[It],[e])}catch(o){if(e.destroyed)return;if(e[wr]=!1,Ir.connectError.hasSubscribers&&Ir.connectError.publish({connectParams:{host:t,hostname:s,protocol:r,port:i,version:e[te]?.version,servername:e[ts],localAddress:e[wi]},connector:e[Ii],error:o}),o.code==="ERR_TLS_CERT_ALTNAME_INVALID")for(Lt(e[xi]===0);e[vi]>0&&e[at][e[At]].servername===e[ts];){let n=e[at][e[At]++];ks.errorRequest(e,n,o)}else Sd(e,o);e.emit("connectionError",e[It],[e],o)}e[bi]()}function Rd(e){e[rs]=0,e.emit("drain",e[It],[e])}function Uc(e,t){e[Ds]!==2&&(e[Ds]=2,D0(e,t),e[Ds]=0,e[_t]>256&&(e[at].splice(0,e[_t]),e[At]-=e[_t],e[_t]=0))}function D0(e,t){for(;;){if(e.destroyed){Lt(e[vi]===0);return}if(e[ss]&&!e[yi]){e[ss](),e[ss]=null;return}if(e[te]&&e[te].resume(),e[Tc])e[rs]=2;else if(e[rs]===2){t?(e[rs]=1,queueMicrotask(()=>Rd(e))):Rd(e);continue}if(e[vi]===0||e[xi]>=(Fd(e)||1))return;let s=e[at][e[At]];if(e[It].protocol==="https:"&&e[ts]!==s.servername){if(e[xi]>0)return;e[ts]=s.servername,e[te]?.destroy(new r0("servername changed"),()=>{e[te]=null,Uc(e)})}if(e[wr])return;if(!e[te]){Ud(e);return}if(e[te].destroyed||e[te].busy(s))return;!s.aborted&&e[te].write(s)?e[At]++:e[at].splice(e[At],1)}}Nd.exports=Sc});var Nc=B(($2,Gd)=>{"use strict";var En=class{constructor(){this.bottom=0,this.top=0,this.list=new Array(2048),this.next=null}isEmpty(){return this.top===this.bottom}isFull(){return(this.top+1&2047)===this.bottom}push(t){this.list[this.top]=t,this.top=this.top+1&2047}shift(){let t=this.list[this.bottom];return t===void 0?null:(this.list[this.bottom]=void 0,this.bottom=this.bottom+1&2047,t)}};Gd.exports=class{constructor(){this.head=this.tail=new En}isEmpty(){return this.head.isEmpty()}push(t){this.head.isFull()&&(this.head=this.head.next=new En),this.head.push(t)}shift(){let t=this.tail,s=t.shift();return t.isEmpty()&&t.next!==null&&(this.tail=t.next),s}}});var Ld=B((eY,Md)=>{var{kFree:R0,kConnected:T0,kPending:F0,kQueued:S0,kRunning:U0,kSize:N0}=z(),Rs=Symbol("pool"),Gc=class{constructor(t){this[Rs]=t}get connected(){return this[Rs][T0]}get free(){return this[Rs][R0]}get pending(){return this[Rs][F0]}get queued(){return this[Rs][S0]}get running(){return this[Rs][U0]}get size(){return this[Rs][N0]}};Md.exports=Gc});var Jc=B((tY,jd)=>{"use strict";var G0=Ar(),M0=Nc(),{kConnected:Mc,kSize:_d,kRunning:Yd,kPending:Od,kQueued:ki,kBusy:L0,kFree:_0,kUrl:Y0,kClose:O0,kDestroy:J0,kDispatch:P0}=z(),H0=Ld(),Re=Symbol("clients"),Ie=Symbol("needDrain"),Di=Symbol("queue"),Lc=Symbol("closed resolve"),_c=Symbol("onDrain"),Jd=Symbol("onConnect"),Pd=Symbol("onDisconnect"),Hd=Symbol("onConnectionError"),Yc=Symbol("get dispatcher"),qd=Symbol("add client"),Wd=Sym Line truncated `,this[tD]=A??3e5,this[eD]=r??3e5,this[sD]=m??!0,this[iD]=C,this[jc]=U,this[ss]=null,this[AD]=q>-1?q:-1,this[lD]=ze??100,this[ie]=null,this[at]=[],this[Yt]=0,this[At]=0,this[kr]=Bs=>Zc(this,Bs),this[cD]=Bs=>uE(this,Bs)}get pipelining(){return this[yo]}set pipelining(t){this[yo]=t,this[kr](!0)}get[Tr](){return this[at].length-this[At]}get[Rr](){return this[At]-this[Yt]}get[Dr](){return this[at].length-this[Yt]}get[W0](){return!!this[ie]&&!this[vi]&&!this[ie].destroyed}get[Wc](){return!!(this[ie]?.busy(null)||this[Dr]>=(lE(this)||1)||this[Tr]>0)}[q0](t){pE(this),this.once("connect",t)}[aD](t,s){let i=t.origin||this[wt].origin,r=new Y0(i,t,s);return this[at].push(r),this[Ts]||(Rs.bodyLength(r.body)==null&&Rs.isIterable(r.body)?(this[Ts]=1,queueMicrotask(()=>Zc(this))):this[kr](!0)),this[Ts]&&this[is]!==2&&this[Wc]&&(this[is]=2),this[is]<2}async[nD](){return new Promise(t=>{this[Dr]?this[ss]=t:t(null)})}async[oD](t){return new Promise(s=>{let i=this[at].splice(this[At]);for(let n=0;n<i.length;n++){let o=i[n];Rs.errorRequest(this,o,t)}let r=()=>{this[ss]&&(this[ss](),this[ss]=null),s(null)};this[ie]?(this[ie].destroy(t,r),this[ie]=null):queueMicrotask(r),this[kr]()})}},gD=bo();function uE(e,t){if(e[Rr]===0&&t.code!=="UND_ERR_INFO"&&t.code!=="UND_ERR_SOCKET"){_t(e[At]===e[Yt]);let s=e[at].splice(e[Yt]);for(let i=0;i<s.length;i++){let r=s[i];Rs.errorRequest(e,r,t)}_t(e[Dr]===0)}}async function pE(e){_t(!e[vi]),_t(!e[ie]);let{host:t,hostname:s,protocol:i,port:r}=e[wt];if(s[0]==="["){let n=s.indexOf("]");_t(n!==-1);let o=s.substring(1,n);_t(cE.isIP(o)),s=o}e[vi]=!0,xi.beforeConnect.hasSubscribers&&xi.beforeConnect.publish({connectParams:{host:t,hostname:s,protocol:i,port:r,version:e[ie]?.version,servername:e[ts],localAddress:e[vr]},connector:e[xr]});try{let n=await new Promise((o,a)=>{e[xr]({host:t,hostname:s,protocol:i,port:r,servername:e[ts],localAddress:e[vr]},(A,c)=>{A?a(A):o(c)})});if(e.destroyed){Rs.destroy(n.on("error",aE),new J0);return}_t(n);try{e[ie]=n.alpnProtocol==="h2"?await pD(e,n):await uD(e,n)}catch(o){throw n.destroy().on("error",aE),o}e[vi]=!1,n[rD]=0,n[jc]=e[jc],n[V0]=e,n[z0]=null,xi.connected.hasSubscribers&&xi.connected.publish({connectParams:{host:t,hostname:s,protocol:i,port:r,version:e[ie]?.version,servername:e[ts],localAddress:e[vr]},connector:e[xr],socket:n}),e.emit("connect",e[wt],[e])}catch(n){if(e.destroyed)return;if(e[vi]=!1,xi.connectError.hasSubscribers&&xi.connectError.publish({connectParams:{host:t,hostname:s,protocol:i,port:r,version:e[ie]?.version,servername:e[ts],localAddress:e[vr]},connector:e[xr],error:n}),n.code==="ERR_TLS_CERT_ALTNAME_INVALID")for(_t(e[Rr]===0);e[Tr]>0&&e[at][e[At]].servername===e[ts];){let o=e[at][e[At]++];Rs.errorRequest(e,o,n)}else uE(e,n);e.emit("connectionError",e[wt],[e],n)}e[kr]()}function AE(e){e[is]=0,e.emit("drain",e[wt],[e])}function Zc(e,t){e[Ts]!==2&&(e[Ts]=2,hD(e,t),e[Ts]=0,e[Yt]>256&&(e[at].splice(0,e[Yt]),e[At]-=e[Yt],e[Yt]=0))}function hD(e,t){for(;;){if(e.destroyed){_t(e[Tr]===0);return}if(e[ss]&&!e[Dr]){e[ss](),e[ss]=null;return}if(e[ie]&&e[ie].resume(),e[Wc])e[is]=2;else if(e[is]===2){t?(e[is]=1,queueMicrotask(()=>AE(e))):AE(e);continue}if(e[Tr]===0||e[Rr]>=(lE(e)||1))return;let s=e[at][e[At]];if(e[wt].protocol==="https:"&&e[ts]!==s.servername){if(e[Rr]>0)return;e[ts]=s.servername,e[ie]?.destroy(new P0("servername changed"),()=>{e[ie]=null,Zc(e)})}if(e[vi])return;if(!e[ie]){pE(e);return}if(e[ie].destroyed||e[ie].busy(s))return;!s.aborted&&e[ie].write(s)?e[At]++:e[at].splice(e[At],1)}}gE.exports=zc});var Kc=Q((jY,hE)=>{"use strict";var xo=class{constructor(){this.bottom=0,this.top=0,this.list=new Array(2048),this.next=null}isEmpty(){return this.top===this.bottom}isFull(){return(this.top+1&2047)===this.bottom}push(t){this.list[this.top]=t,this.top=this.top+1&2047}shift(){let t=this.list[this.bottom];return t===void 0?null:(this.list[this.bottom]=void 0,this.bottom=this.bottom+1&2047,t)}};hE.exports=class{constructor(){this.head=this.tail=new xo}isEmpty(){return this.head.isEmpty()}push(t){this.head.isFull()&&(this.head=this.head.next=new xo),this.head.push(t)}shift(){let t=this.tail,s=t.shift();return t.isEmpty()&&t.next!==null&&(this.tail=t.next),s}}});var EE=Q((zY,dE)=>{var{kFree:dD,kConnected:ED,kPending:mD,kQueued:fD,kRunning:QD,kSize:BD}=Z(),Ss=Symbol("pool"),Xc=class{constructor(t){this[Ss]=t}get connected(){return this[Ss][ED]}get free(){return this[Ss][dD]}get pending(){return this[Ss][mD]}get queued(){return this[Ss][fD]}get running(){return this[Ss][QD]}get size(){return this[Ss][BD]}};dE.exports=Xc});var rl=Q((ZY,xE)=>{"use strict";var CD=pi(),ID=Kc(),{kConnected:$c,kSize:mE,kRunning:fE,kPending:QE,kQueued:Sr,kBusy:wD,kFree:bD,kUrl:yD,kClose:xD,kDestroy:vD,kDispatch:kD}=Z(),DD=EE(),Te=Symbol("clients"),ye=Symbol("needDrain"),Fr=Symbol("queue"),el=Symbol("closed resolve"),tl=Symbol("onDrain"),BE=Symbol("onConnect"),CE=Symbol("onDisconnect"),IE=Symbol("onConnectionError"),sl=Symbol("get dispatcher"),bE=Symbol("add client"),yE=Symbo Line truncated
${r.count} ${r.noun} ${r.is} pending: ${i.count} ${i.noun} ${i.is} pending:
${t.format(s)} ${t.format(s)}
`.trim())}};ef.exports=Jl});var Un=B((DY,nf)=>{"use strict";var sf=Symbol.for("undici.globalDispatcher.1"),{InvalidArgumentError:ET}=_(),mT=xr();of()===void 0&&rf(new mT);function rf(e){if(!e||typeof e.dispatch!="function")throw new ET("Argument agent must implement Agent");Object.defineProperty(globalThis,sf,{value:e,writable:!0,enumerable:!1,configurable:!1})}function of(){return globalThis[sf]}nf.exports={setGlobalDispatcher:rf,getGlobalDispatcher:of}});var Nn=B((TY,af)=>{"use strict";af.exports=class{#e;constructor(t){if(typeof t!="object"||t===null)throw new TypeError("handler must be an object");this.#e=t}onConnect(...t){return this.#e.onConnect?.(...t)}onError(...t){return this.#e.onError?.(...t)}onUpgrade(...t){return this.#e.onUpgrade?.(...t)}onResponseStarted(...t){return this.#e.onResponseStarted?.(...t)}onHeaders(...t){return this.#e.onHeaders?.(...t)}onData(...t){return this.#e.onData?.(...t)}onComplete(...t){return this.#e.onComplete?.(...t)}onBodySent(...t){return this.#e.onBodySent?.(...t)}}});var cf=B((FY,Af)=>{"use strict";var fT=gn();Af.exports=e=>{let t=e?.maxRedirections;return s=>function(i,o){let{maxRedirections:n=t,...a}=i;if(!n)return s(i,o);let A=new fT(s,n,i,o);return s(a,A)}}});var uf=B((SY,lf)=>{"use strict";var QT=bn();lf.exports=e=>t=>function(r,i){return t(r,new QT({...r,retryOptions:{...e,...r.retryOptions}},{handler:i,dispatch:t}))}});var gf=B((UY,pf)=>{"use strict";var BT=U(),{InvalidArgumentError:CT,RequestAbortedError:IT}=_(),wT=Nn(),Pl=class extends wT{#e=1024*1024;#t=null;#s=!1;#r=!1;#i=0;#o=null;#l=null;constructor({maxSize:t},s){if(super(s),t!=null&&(!Number.isFinite(t)||t<1))throw new CT("maxSize must be a number greater than 0");this.#e=t??this.#e,this.#l=s}onConnect(t){this.#t=t,this.#l.onConnect(this.#A.bind(this))}#A(t){this.#r=!0,this.#o=t}onHeaders(t,s,r,i){let n=BT.parseHeaders(s)["content-length"];if(n!=null&&n>this.#e)throw new IT(`Response size (${n}) larger than maxSize (${this.#e})`);return this.#r?!0:this.#l.onHeaders(t,s,r,i)}onError(t){this.#s||(t=this.#o??t,this.#l.onError(t))}onData(t){return this.#i=this.#i+t.length,this.#i>=this.#e&&(this.#s=!0,this.#r?this.#l.onError(this.#o):this.#l.onComplete([])),!0}onComplete(t){if(!this.#s){if(this.#r){this.#l.onError(this.reason);return}this.#l.onComplete(t)}}};function bT({maxSize:e}={maxSize:1024*1024}){return t=>function(r,i){let{dumpMaxSize:o=e}=r,n=new Pl({maxSize:o},i);return t(r,n)}}pf.exports=bT});var Ef=B((NY,df)=>{"use strict";var{isIP:yT}=require("node:net"),{lookup:xT}=require("node:dns"),vT=Nn(),{InvalidArgumentError:Gr,InformationalError:kT}=_(),hf=Math.pow(2,31)-1,Hl=class{#e=0;#t=0;#s=new Map;dualStack=!0;affinity=null;lookup=null;pick=null;constructor(t){this.#e=t.maxTTL,this.#t=t.maxItems,this.dualStack=t.dualStack,this.affinity=t.affinity,this.lookup=t.lookup??this.#r,this.pick=t.pick??this.#i}get full(){return this.#s.size===this.#t}runLookup(t,s,r){let i=this.#s.get(t.hostname);if(i==null&&this.full){r(null,t.origin);return}let o={affinity:this.affinity,dualStack:this.dualStack,lookup:this.lookup,pick:this.pick,...s.dns,maxTTL:this.#e,maxItems:this.#t};if(i==null)this.lookup(t,o,(n,a)=>{if(n||a==null||a.length===0){r(n??new kT("No DNS entries found"));return}this.setRecords(t,a);let A=this.#s.get(t.hostname),c=this.pick(t,A,o.affinity),u;typeof c.port=="number"?u=`:${c.port}`:t.port!==""?u=`:${t.port}`:u="",r(null,`${t.protocol}//${c.family===6?`[${c.address}]`:c.address}${u}`)});else{let n=this.pick(t,i,o.affinity);if(n==null){this.#s.delete(t.hostname),this.runLookup(t,s,r);return}let a;typeof n.port=="number"?a=`:${n.port}`:t.port!==""?a=`:${t.port}`:a="",r(null,`${t.protocol}//${n.family===6?`[${n.address}]`:n.address}${a}`)}}#r(t,s,r){xT(t.hostname,{all:!0,family:this.dualStack===!1?this.affinity:0,order:"ipv4first"},(i,o)=>{if(i)return r(i);let n=new Map;for(let a of o)n.set(`${a.address}:${a.family}`,a);r(null,n.values())})}#i(t,s,r){let i=null,{records:o,offset:n}=s,a;if(this.dualStack?(r==null&&(n==null||n===hf?(s.offset=0,r=4):(s.offset++,r=(s.offset&1)===1?6:4)),o[r]!=null&&o[r].ips.length>0?a=o[r]:a=o[r===4?6:4]):a=o[r],a==null||a.ips.length===0)return i;a.offset==null||a.offset===hf?a.offset=0:a.offset++;let A=a.offset%a.ips.length;return i=a.ips[A]??null,i==null?i:Date.now()-i.timestamp>i.ttl?(a.ips.splice(A,1),this.pick(t,s,r)):i}setRecords(t,s){let r=Date.now(),i={records:{4:null,6:null}};for(let o of s){o.timestamp=r,typeof o.ttl=="number"?o.ttl=Math.min(o.ttl,this.#e):o.ttl=this.#e;let n=i.records[o.family]??{ips:[]};n.ips.push(o),i.records[o.family]=n}this.#s.set(t.hostname,i)}getHandler(t,s){return new Vl(this,t,s)}},Vl=class extends vT{#e=null;#t=null;#s=null;#r=null;#i=null;constructor(t,{origin:s,handler:r,dispatch:i},o){super(r),this.#i=s,this.#r=r,this.#t={...o},this.#e=t,this.#s=i}onError(t){switch(t.code){case"ETIMEDOUT":case"ECONNREFUSED":{if(this.#e.dualStack){this.#e.runLookup(this.#i,this.#t,(s,r)=>{if(s)return this.#r.onError(s);let i={...this.#t,origin: Line truncated `.trim())}};Uf.exports=ru});var Pr=Q((bO,_f)=>{"use strict";var Mf=Symbol.for("undici.globalDispatcher.1"),{InvalidArgumentError:tS}=Y(),sS=Ri();Lf()===void 0&&Gf(new sS);function Gf(e){if(!e||typeof e.dispatch!="function")throw new tS("Argument agent must implement Agent");Object.defineProperty(globalThis,Mf,{value:e,writable:!0,enumerable:!1,configurable:!1})}function Lf(){return globalThis[Mf]}_f.exports={setGlobalDispatcher:Gf,getGlobalDispatcher:Lf}});var Ho=Q((xO,Yf)=>{"use strict";Yf.exports=class{#e;constructor(t){if(typeof t!="object"||t===null)throw new TypeError("handler must be an object");this.#e=t}onConnect(...t){return this.#e.onConnect?.(...t)}onError(...t){return this.#e.onError?.(...t)}onUpgrade(...t){return this.#e.onUpgrade?.(...t)}onResponseStarted(...t){return this.#e.onResponseStarted?.(...t)}onHeaders(...t){return this.#e.onHeaders?.(...t)}onData(...t){return this.#e.onData?.(...t)}onComplete(...t){return this.#e.onComplete?.(...t)}onBodySent(...t){return this.#e.onBodySent?.(...t)}}});var Pf=Q((vO,Of)=>{"use strict";var iS=wo();Of.exports=e=>{let t=e?.maxRedirections;return s=>function(r,n){let{maxRedirections:o=t,...a}=r;if(!o)return s(r,n);let A=new iS(s,o,r,n);return s(a,A)}}});var Hf=Q((kO,Jf)=>{"use strict";var rS=Uo();Jf.exports=e=>t=>function(i,r){return t(i,new rS({...i,retryOptions:{...e,...i.retryOptions}},{handler:r,dispatch:t}))}});var qf=Q((DO,Vf)=>{"use strict";var nS=N(),{InvalidArgumentError:oS,RequestAbortedError:aS}=Y(),AS=Ho(),nu=class extends AS{#e=1024*1024;#t=null;#s=!1;#r=!1;#i=0;#n=null;#a=null;constructor({maxSize:t},s){if(super(s),t!=null&&(!Number.isFinite(t)||t<1))throw new oS("maxSize must be a number greater than 0");this.#e=t??this.#e,this.#a=s}onConnect(t){this.#t=t,this.#a.onConnect(this.#c.bind(this))}#c(t){this.#r=!0,this.#n=t}onHeaders(t,s,i,r){let o=nS.parseHeaders(s)["content-length"];if(o!=null&&o>this.#e)throw new aS(`Response size (${o}) larger than maxSize (${this.#e})`);return this.#r?!0:this.#a.onHeaders(t,s,i,r)}onError(t){this.#s||(t=this.#n??t,this.#a.onError(t))}onData(t){return this.#i=this.#i+t.length,this.#i>=this.#e&&(this.#s=!0,this.#r?this.#a.onError(this.#n):this.#a.onComplete([])),!0}onComplete(t){if(!this.#s){if(this.#r){this.#a.onError(this.reason);return}this.#a.onComplete(t)}}};function cS({maxSize:e}={maxSize:1024*1024}){return t=>function(i,r){let{dumpMaxSize:n=e}=i,o=new nu({maxSize:n},r);return t(i,o)}}Vf.exports=cS});var zf=Q((RO,jf)=>{"use strict";var{isIP:lS}=require("node:net"),{lookup:uS}=require("node:dns"),pS=Ho(),{InvalidArgumentError:_i,InformationalError:gS}=Y(),Wf=Math.pow(2,31)-1,ou=class{#e=0;#t=0;#s=new Map;dualStack=!0;affinity=null;lookup=null;pick=null;constructor(t){this.#e=t.maxTTL,this.#t=t.maxItems,this.dualStack=t.dualStack,this.affinity=t.affinity,this.lookup=t.lookup??this.#r,this.pick=t.pick??this.#i}get full(){return this.#s.size===this.#t}runLookup(t,s,i){let r=this.#s.get(t.hostname);if(r==null&&this.full){i(null,t.origin);return}let n={affinity:this.affinity,dualStack:this.dualStack,lookup:this.lookup,pick:this.pick,...s.dns,maxTTL:this.#e,maxItems:this.#t};if(r==null)this.lookup(t,n,(o,a)=>{if(o||a==null||a.length===0){i(o??new gS("No DNS entries found"));return}this.setRecords(t,a);let A=this.#s.get(t.hostname),c=this.pick(t,A,n.affinity),l;typeof c.port=="number"?l=`:${c.port}`:t.port!==""?l=`:${t.port}`:l="",i(null,`${t.protocol}//${c.family===6?`[${c.address}]`:c.address}${l}`)});else{let o=this.pick(t,r,n.affinity);if(o==null){this.#s.delete(t.hostname),this.runLookup(t,s,i);return}let a;typeof o.port=="number"?a=`:${o.port}`:t.port!==""?a=`:${t.port}`:a="",i(null,`${t.protocol}//${o.family===6?`[${o.address}]`:o.address}${a}`)}}#r(t,s,i){uS(t.hostname,{all:!0,family:this.dualStack===!1?this.affinity:0,order:"ipv4first"},(r,n)=>{if(r)return i(r);let o=new Map;for(let a of n)o.set(`${a.address}:${a.family}`,a);i(null,o.values())})}#i(t,s,i){let r=null,{records:n,offset:o}=s,a;if(this.dualStack?(i==null&&(o==null||o===Wf?(s.offset=0,i=4):(s.offset++,i=(s.offset&1)===1?6:4)),n[i]!=null&&n[i].ips.length>0?a=n[i]:a=n[i===4?6:4]):a=n[i],a==null||a.ips.length===0)return r;a.offset==null||a.offset===Wf?a.offset=0:a.offset++;let A=a.offset%a.ips.length;return r=a.ips[A]??null,r==null?r:Date.now()-r.timestamp>r.ttl?(a.ips.splice(A,1),this.pick(t,s,i)):r}setRecords(t,s){let i=Date.now(),r={records:{4:null,6:null}};for(let n of s){n.timestamp=i,typeof n.ttl=="number"?n.ttl=Math.min(n.ttl,this.#e):n.ttl=this.#e;let o=r.records[n.family]??{ips:[]};o.ips.push(n),r.records[n.family]=o}this.#s.set(t.hostname,r)}getHandler(t,s){return new au(this,t,s)}},au=class extends pS{#e=null;#t=null;#s=null;#r=null;#i=null;constructor(t,{origin:s,handler:i,dispatch:r},n){super(i),this.#i=s,this.#r=i,this.#t={...n},this.#e=t,this.#s=r}onError(t){switch(t.code){case"ETIMEDOUT":case"ECONNREFUSED":{if(this.#e.dualStack){this.#e.runLookup(this.#i,this.#t,(s,i)=>{if(s)return this.#r.onError(s);let r={...this.#t,origin: Line truncated
${o}`;break;case"retry":zB(o)&&(s[i]=o);break;case"id":ZB(o)&&(s[i]=o);break;case"event":o.length>0&&(s[i]=o);break}}processEvent(t){t.retry&&zB(t.retry)&&(this.state.reconnectionTime=parseInt(t.retry,10)),t.id&&ZB(t.id)&&(this.state.lastEventId=t.id),t.data!==void 0&&this.push({type:t.event||"message",options:{data:t.data,lastEventId:this.state.lastEventId,origin:this.state.origin}})}clearEvent(){this.event={data:void 0,event:void 0,id:void 0,retry:void 0}}};KB.exports={EventSourceStream:Fu}});var nC=B((pO,oC)=>{"use strict";var{pipeline:GN}=require("node:stream"),{fetching:MN}=Ji(),{makeRequest:LN}=_r(),{webidl:Ht}=he(),{EventSourceStream:_N}=XB(),{parseMIMEType:YN}=ke(),{createFastMessageEvent:ON}=Vr(),{isNetworkError:$B}=Yi(),{delay:JN}=Ru(),{kEnumerableProperty:Vs}=U(),{environmentSettingsObject:eC}=Ne(),tC=!1,sC=3e3,so=0,rC=1,ro=2,PN="anonymous",HN="use-credentials",Zr=class e extends EventTarget{#e={open:null,error:null,message:null};#t=null;#s=!1;#r=so;#i=null;#o=null;#l;#A;constructor(t,s={}){super(),Ht.util.markAsUncloneable(this);let r="EventSource constructor";Ht.argumentLengthCheck(arguments,1,r),tC||(tC=!0,process.emitWarning("EventSource is experimental, expect them to change at any time.",{code:"UNDICI-ES"})),t=Ht.converters.USVString(t,r,"url"),s=Ht.converters.EventSourceInitDict(s,r,"eventSourceInitDict"),this.#l=s.dispatcher,this.#A={lastEventId:"",reconnectionTime:sC};let i=eC,o;try{o=new URL(t,i.settingsObject.baseUrl),this.#A.origin=o.origin}catch(A){throw new DOMException(A,"SyntaxError")}this.#t=o.href;let n=PN;s.withCredentials&&(n=HN,this.#s=!0);let a={redirect:"follow",keepalive:!0,mode:"cors",credentials:n==="anonymous"?"same-origin":"omit",referrer:"no-referrer"};a.client=eC.settingsObject,a.headersList=[["accept",{name:"accept",value:"text/event-stream"}]],a.cache="no-store",a.initiator="other",a.urlList=[new URL(this.#t)],this.#i=LN(a),this.#c()}get readyState(){return this.#r}get url(){return this.#t}get withCredentials(){return this.#s}#c(){if(this.#r===ro)return;this.#r=so;let t={request:this.#i,dispatcher:this.#l},s=r=>{$B(r)&&(this.dispatchEvent(new Event("error")),this.close()),this.#u()};t.processResponseEndOfBody=s,t.processResponse=r=>{if($B(r))if(r.aborted){this.close(),this.dispatchEvent(new Event("error"));return}else{this.#u();return}let i=r.headersList.get("content-type",!0),o=i!==null?YN(i):"failure",n=o!=="failure"&&o.essence==="text/event-stream";if(r.status!==200||n===!1){this.close(),this.dispatchEvent(new Event("error"));return}this.#r=rC,this.dispatchEvent(new Event("open")),this.#A.origin=r.urlList[r.urlList.length-1].origin;let a=new _N({eventSourceSettings:this.#A,push:A=>{this.dispatchEvent(ON(A.type,A.options))}});GN(r.body.stream,a,A=>{A?.aborted===!1&&(this.close(),this.dispatchEvent(new Event("error")))})},this.#o=MN(t)}async#u(){this.#r!==ro&&(this.#r=so,this.dispatchEvent(new Event("error")),await JN(this.#A.reconnectionTime),this.#r===so&&(this.#A.lastEventId.length&&this.#i.headersList.set("last-event-id",this.#A.lastEventId,!0),this.#c()))}close(){Ht.brandCheck(this,e),this.#r!==ro&&(this.#r=ro,this.#o.abort(),this.#i=null)}get onopen(){return this.#e.open}set onopen(t){this.#e.open&&this.removeEventListener("open",this.#e.open),typeof t=="function"?(this.#e.open=t,this.addEventListener("open",t)):this.#e.open=null}get onmessage(){return this.#e.message}set onmessage(t){this.#e.message&&this.removeEventListener("message",this.#e.message),typeof t=="function"?(this.#e.message=t,this.addEventListener("message",t)):this.#e.message=null}get onerror(){return this.#e.error}set onerror(t){this.#e.error&&this.removeEventListener("error",this.#e.error),typeof t=="function"?(this.#e.error=t,this.addEventListener("error",t)):this.#e.error=null}},iC={CONNECTING:{__proto__:null,configurable:!1,enumerable:!0,value:so,writable:!1},OPEN:{__proto__:null,configurable:!1,enumerable:!0,value:rC,writable:!1},CLOSED:{__proto__:null,configurable:!1,enumerable:!0,value:ro,writable:!1}};Object.defineProperties(Zr,iC);Object.defineProperties(Zr.prototype,iC);Object.defineProperties(Zr.prototype,{close:Vs,onerror:Vs,onmessage:Vs,onopen:Vs,readyState:Vs,url:Vs,withCredentials:Vs});Ht.converters.EventSourceInitDict=Ht.dictionaryConverter([{key:"withCredentials",converter:Ht.converters.boolean,defaultValue:()=>!1},{key:"dispatcher",converter:Ht.converters.any}]);oC.exports={EventSource:Zr,defaultReconnectionTime:sC}});var wa=B((gO,T)=>{"use strict";var VN=br(),aC=ni(),qN=yr(),WN=rE(),jN=xr(),zN=tl(),ZN=vE(),KN=SE(),AC=_(),Ia=U(),{InvalidArgumentError:Ca}=AC,Kr=Qm(),XN=Ai(),$N=Gl(),eG=tf(),tG=_l(),sG=wl(),rG=bn(),{getGlobalDispatcher:cC,setGlobalDispatcher:iG}=Un(),oG=Nn(),nG=gn(),aG=hn();Object.assign(aC.prototype,Kr);T.exports.Dispatcher=aC;T.exports.Client=VN;T.exports.Pool=qN;T.exports.BalancedPool=WN;T.exports.Agent=jN;T.exports.ProxyAgent=zN;T.exports.EnvHttpProxyAgent=ZN;T.exports.RetryAgent=KN;T.exports.RetryHandler=rG;T.exports.DecoratorHandler=oG;T.exports.Redire Line truncated ${A}`,this.dataLineCount++;return}if(Ra(t,r,kM)){SM(t,n)&&(this.setEventFieldSize("retry",t.length-n),s.retry=t.toString("utf8",n));return}if(Ra(t,r,vM)){FM(t,n)&&(this.setEventFieldSize("id",t.length-n),s.id=t.toString("utf8",n));return}Ra(t,r,xM)&&n<t.length&&(this.setEventFieldSize("event",t.length-n),s.event=t.toString("utf8",n))}setEventFieldSize(t,s){let i=this.eventSize-this.eventFieldSizes[t]+s;if(this.maxEventSize>0&&i>this.maxEventSize)throw Ta();this.eventSize=i,this.eventFieldSizes[t]=s}processEvent(t){t.retry&&BM(t.retry)&&(this.state.reconnectionTime=parseInt(t.retry,10)),t.id&&CM(t.id)&&(this.state.lastEventId=t.id),t.data!==void 0&&this.push({type:t.event||"message",options:{data:t.data,lastEventId:this.state.lastEventId,origin:this.state.origin}})}clearEvent(){this.event.data=void 0,this.event.event=void 0,this.event.id=void 0,this.event.retry=void 0,this.eventSize=0,this.dataLineCount=0,this.eventFieldSizes.data=0,this.eventFieldSizes.event=0,this.eventFieldSizes.id=0,this.eventFieldSizes.retry=0}hasPendingEvent(){return this.event.data!==void 0||this.event.event!==void 0||this.event.id!==void 0||this.event.retry!==void 0}hasCurrentByte(){return this.chunkIndex<this.chunks.length&&this.pos<this.chunks[this.chunkIndex].length}currentByte(){return this.chunks[this.chunkIndex][this.pos]}consumeCurrentByte(){this.advanceCursor(),this.syncLineStartToCursor()}advanceCursor(){for(this.pos++;this.chunkIndex<this.chunks.length&&this.pos>=this.chunks[this.chunkIndex].length;)this.chunkIndex++,this.pos=0}syncLineStartToCursor(){this.lineChunkIndex=this.chunkIndex,this.linePos=this.pos,this.lineLength=0,this.dropConsumedChunks()}dropConsumedChunks(){if(this.lineChunkIndex>0){let t=this.lineChunkIndex;this.chunks.splice(0,t),this.lineChunkIndex=0,this.chunkIndex-=t}this.chunkIndex===this.chunks.length&&(this.chunks.length=0,this.chunkIndex=0,this.pos=0,this.lineChunkIndex=0,this.linePos=0)}readLine(){if(this.lineChunkIndex===this.chunkIndex)return this.chunks[this.chunkIndex].subarray(this.linePos,this.pos);let t=[],s=0;for(let i=this.lineChunkIndex;i<=this.chunkIndex;i++){let r=this.chunks[i],n=i===this.lineChunkIndex?this.linePos:0,o=i===this.chunkIndex?this.pos:r.length,a=r.subarray(n,o);s+=a.length,t.push(a)}return Buffer.concat(t,s)}peekBufferedByte(t){let s=this.lineChunkIndex,i=this.linePos;for(;s<this.chunks.length;){let r=this.chunks[s],n=r.length-i;if(t<n)return r[i+t];t-=n,s++,i=0}}discardLeadingBytes(t){for(;t>0&&this.lineChunkIndex<this.chunks.length;){let i=this.chunks[this.lineChunkIndex].length-this.linePos;t<i?(this.linePos+=t,t=0):(t-=i,this.lineChunkIndex++,this.linePos=0)}this.chunkIndex=this.lineChunkIndex,this.pos=this.linePos,this.dropConsumedChunks()}handleBOM(){let t=this.peekBufferedByte(0),s=this.peekBufferedByte(1),i=this.peekBufferedByte(2);return s===void 0?(t===$i[0]||(this.checkBOM=!1),!0):i===void 0?t===$i[0]&&s===$i[1]?!0:(this.checkBOM=!1,!1):(t===$i[0]&&s===$i[1]&&i===$i[2]&&this.discardLeadingBytes(3),this.checkBOM=!1,!this.hasCurrentByte())}};xC.exports={EventSourceStream:Zu}});var NC=Q((a1,UC)=>{"use strict";var{pipeline:UM}=require("node:stream"),{fetching:NM}=Wr(),{makeRequest:MM}=Pi(),{webidl:Ht}=Ee(),{EventSourceStream:GM}=vC(),{parseMIMEType:LM}=De(),{createFastMessageEvent:_M}=ji(),{isNetworkError:kC}=Vr(),{delay:YM}=zu(),{kEnumerableProperty:js}=N(),{environmentSettingsObject:DC}=Ge(),{getGlobalDispatcher:OM}=Pr(),RC=!1,TC=3e3,cn=0,SC=1,ln=2,PM="anonymous",JM="use-credentials",er=class e extends EventTarget{#e={open:null,error:null,message:null};#t=null;#s=!1;#r=cn;#i=null;#n=null;#a;#c;constructor(t,s={}){super(),Ht.util.markAsUncloneable(this);let i="EventSource constructor";Ht.argumentLengthCheck(arguments,1,i),RC||(RC=!0,process.emitWarning("EventSource is experimental, expect them to change at any time.",{code:"UNDICI-ES"})),t=Ht.converters.USVString(t,i,"url"),s=Ht.converters.EventSourceInitDict(s,i,"eventSourceInitDict"),this.#a=s.dispatcher,this.#c={lastEventId:"",reconnectionTime:TC};let r=DC,n;try{n=new URL(t,r.settingsObject.baseUrl),this.#c.origin=n.origin}catch(A){throw new DOMException(A,"SyntaxError")}this.#t=n.href;let o=PM;s.withCredentials&&(o=JM,this.#s=!0);let a={redirect:"follow",keepalive:!0,mode:"cors",credentials:o==="anonymous"?"same-origin":"omit",referrer:"no-referrer"};a.client=DC.settingsObject,a.headersList=[["accept",{name:"accept",value:"text/event-stream"}]],a.cache="no-store",a.initiator="other",a.urlList=[new URL(this.#t)],this.#i=MM(a),this.#l()}get readyState(){return this.#r}get url(){return this.#t}get withCredentials(){return this.#s}#l(){if(this.#r===ln)return;this.#r=cn;let t={request:this.#i,dispatcher:this.#a},s=i=>{kC(i)&&(this.dispatchEvent(new Event("error")),this.close()),this.#p()};t.processResponseEndOfBody=s,t.processResponse=i=>{if(kC(i))if(i.aborted){this.close(),this.dispatchEvent(new Event("error"));return}else{this.#p();return}let r=i.headersList.get("content-type",!0),n=r!==null?LM(r):"failure",o=n!= Line truncated
`+e.errors.map(t=>` - ${t.message}`).join(` `+e.errors.map(t=>` - ${t.message}`).join(`
`)}var MM=class extends Error{constructor(e,t,s){super(GM(s)),this.request=e,this.headers=t,this.response=s,this.errors=s.errors,this.data=s.data,Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)}name="GraphqlResponseError";errors;data},LM=["method","baseUrl","url","headers","request","query","mediaType","operationName"],_M=["query","method","url"],eI=/\/api\/v3\/?$/;function YM(e,t,s){if(s){if(typeof t=="string"&&"query"in s)return Promise.reject(new Error('[@octokit/graphql] "query" cannot be used as variable name'));for(let n in s)if(_M.includes(n))return Promise.reject(new Error(`[@octokit/graphql] "${n}" cannot be used as variable name`))}let r=typeof t=="string"?Object.assign({query:t},s):t,i=Object.keys(r).reduce((n,a)=>LM.includes(a)?(n[a]=r[a],n):(n.variables||(n.variables={}),n.variables[a]=r[a],n),{}),o=r.baseUrl||e.endpoint.DEFAULTS.baseUrl;return eI.test(o)&&(i.url=o.replace(eI,"/api/graphql")),e(i).then(n=>{if(n.data.errors){let a={};for(let A of Object.keys(n.headers))a[A]=n.headers[A];throw new MM(i,a,n.data)}return n.data.data})}function Wu(e,t){let s=e.defaults(t);return Object.assign((i,o)=>YM(s,i,o),{defaults:Wu.bind(null,s),endpoint:s.endpoint})}var xJ=Wu(lo,{headers:{"user-agent":`octokit-graphql.js/${NM} ${hs()}`},method:"POST",url:"/graphql"});function tI(e){return Wu(e,{method:"POST",url:"/graphql"})}var ju="(?:[a-zA-Z0-9_-]+)",sI="\\.",rI=new RegExp(`^${ju}${sI}${ju}${sI}${ju}$`),OM=rI.test.bind(rI);async function JM(e){let t=OM(e),s=e.startsWith("v1.")||e.startsWith("ghs_"),r=e.startsWith("ghu_");return{type:"token",token:e,tokenType:t?"app":s?"installation":r?"user-to-server":"oauth"}}function PM(e){return e.split(/\./).length===3?`bearer ${e}`:`token ${e}`}async function HM(e,t,s,r){let i=t.endpoint.merge(s,r);return i.headers.authorization=PM(e),t(i)}var iI=function(t){if(!t)throw new Error("[@octokit/auth-token] No token passed to createTokenAuth");if(typeof t!="string")throw new Error("[@octokit/auth-token] Token passed to createTokenAuth is not a string");return t=t.replace(/^(token|bearer) +/i,""),Object.assign(JM.bind(null,t),{hook:HM.bind(null,t)})};var zu="7.0.6";var oI=()=>{},VM=console.warn.bind(console),qM=console.error.bind(console);function WM(e={}){return typeof e.debug!="function"&&(e.debug=oI),typeof e.info!="function"&&(e.info=oI),typeof e.warn!="function"&&(e.warn=VM),typeof e.error!="function"&&(e.error=qM),e}var nI=`octokit-core.js/${zu} ${hs()}`,Ma=class{static VERSION=zu;static defaults(t){return class extends this{constructor(...r){let i=r[0]||{};if(typeof t=="function"){super(t(i));return}super(Object.assign({},t,i,i.userAgent&&t.userAgent?{userAgent:`${i.userAgent} ${t.userAgent}`}:null))}}}static plugins=[];static plugin(...t){let s=this.plugins;return class extends this{static plugins=s.concat(t.filter(i=>!s.includes(i)))}}constructor(t={}){let s=new SC.Collection,r={baseUrl:lo.endpoint.DEFAULTS.baseUrl,headers:{},request:Object.assign({},t.request,{hook:s.bind(null,"request")}),mediaType:{previews:[],format:""}};if(r.headers["user-agent"]=t.userAgent?`${t.userAgent} ${nI}`:nI,t.baseUrl&&(r.baseUrl=t.baseUrl),t.previews&&(r.mediaType.previews=t.previews),t.timeZone&&(r.headers["time-zone"]=t.timeZone),this.request=lo.defaults(r),this.graphql=tI(this.request).defaults(r),this.log=WM(t.log),this.hook=s,t.authStrategy){let{authStrategy:o,...n}=t,a=o(Object.assign({request:this.request,log:this.log,octokit:this,octokitOptions:n},t.auth));s.wrap("request",a.hook),this.auth=a}else if(!t.auth)this.auth=async()=>({type:"unauthenticated"});else{let o=iI(t.auth);s.wrap("request",o.hook),this.auth=o}let i=this.constructor;for(let o=0;o<i.plugins.length;++o)Object.assign(this,i.plugins[o](this,t))}request;graphql;log;hook;auth};var Zu="17.0.0";var jM={actions:{addCustomLabelsToSelfHostedRunnerForOrg:["POST /orgs/{org}/actions/runners/{runner_id}/labels"],addCustomLabelsToSelfHostedRunnerForRepo:["POST /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"],addRepoAccessToSelfHostedRunnerGroupInOrg:["PUT /orgs/{org}/actions/runner-groups/{runner_group_id}/repositories/{repository_id}"],addSelectedRepoToOrgSecret:["PUT /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}"],addSelectedRepoToOrgVariable:["PUT /orgs/{org}/actions/variables/{name}/repositories/{repository_id}"],approveWorkflowRun:["POST /repos/{owner}/{repo}/actions/runs/{run_id}/approve"],cancelWorkflowRun:["POST /repos/{owner}/{repo}/actions/runs/{run_id}/cancel"],createEnvironmentVariable:["POST /repos/{owner}/{repo}/environments/{environment_name}/variables"],createHostedRunnerForOrg:["POST /orgs/{org}/actions/hosted-runners"],createOrUpdateEnvironmentSecret:["PUT /repos/{owner}/{repo}/environments/{environment_name}/secrets/{secret_name}"],createOrUpdateOrgSecret:["PUT /orgs/{org}/actions/secrets/{secret_name}"],createOrUpdateRepoSecret:["PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}"],createOrgVariable:["POST /orgs/{org}/actions/variables"],cre Line truncated `)}var ML=class extends Error{constructor(e,t,s){super(NL(s)),this.request=e,this.headers=t,this.response=s,this.errors=s.errors,this.data=s.data,Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)}name="GraphqlResponseError";errors;data},GL=["method","baseUrl","url","headers","request","query","mediaType","operationName"],LL=["query","method","url"],DI=/\/api\/v3\/?$/;function _L(e,t,s){if(s){if(typeof t=="string"&&"query"in s)return Promise.reject(new Error('[@octokit/graphql] "query" cannot be used as variable name'));for(let o in s)if(LL.includes(o))return Promise.reject(new Error(`[@octokit/graphql] "${o}" cannot be used as variable name`))}let i=typeof t=="string"?Object.assign({query:t},s):t,r=Object.keys(i).reduce((o,a)=>GL.includes(a)?(o[a]=i[a],o):(o.variables||(o.variables={}),o.variables[a]=i[a],o),{}),n=i.baseUrl||e.endpoint.DEFAULTS.baseUrl;return DI.test(n)&&(r.url=n.replace(DI,"/api/graphql")),e(r).then(o=>{if(o.data.errors){let a={};for(let A of Object.keys(o.headers))a[A]=o.headers[A];throw new ML(r,a,o.data)}return o.data.data})}function up(e,t){let s=e.defaults(t);return Object.assign((r,n)=>_L(s,r,n),{defaults:up.bind(null,s),endpoint:s.endpoint})}var CP=up(mn,{headers:{"user-agent":`octokit-graphql.js/${UL} ${hs()}`},method:"POST",url:"/graphql"});function RI(e){return up(e,{method:"POST",url:"/graphql"})}var pp="(?:[a-zA-Z0-9_-]+)",TI="\\.",SI=new RegExp(`^${pp}${TI}${pp}${TI}${pp}$`),YL=SI.test.bind(SI);async function OL(e){let t=YL(e),s=e.startsWith("v1.")||e.startsWith("ghs_"),i=e.startsWith("ghu_");return{type:"token",token:e,tokenType:t?"app":s?"installation":i?"user-to-server":"oauth"}}function PL(e){return e.split(/\./).length===3?`bearer ${e}`:`token ${e}`}async function JL(e,t,s,i){let r=t.endpoint.merge(s,i);return r.headers.authorization=PL(e),t(r)}var FI=function(t){if(!t)throw new Error("[@octokit/auth-token] No token passed to createTokenAuth");if(typeof t!="string")throw new Error("[@octokit/auth-token] Token passed to createTokenAuth is not a string");return t=t.replace(/^(token|bearer) +/i,""),Object.assign(OL.bind(null,t),{hook:JL.bind(null,t)})};var gp="7.0.6";var UI=()=>{},HL=console.warn.bind(console),VL=console.error.bind(console);function qL(e={}){return typeof e.debug!="function"&&(e.debug=UI),typeof e.info!="function"&&(e.info=UI),typeof e.warn!="function"&&(e.warn=HL),typeof e.error!="function"&&(e.error=VL),e}var NI=`octokit-core.js/${gp} ${hs()}`,ja=class{static VERSION=gp;static defaults(t){return class extends this{constructor(...i){let r=i[0]||{};if(typeof t=="function"){super(t(r));return}super(Object.assign({},t,r,r.userAgent&&t.userAgent?{userAgent:`${r.userAgent} ${t.userAgent}`}:null))}}}static plugins=[];static plugin(...t){let s=this.plugins;return class extends this{static plugins=s.concat(t.filter(r=>!s.includes(r)))}}constructor(t={}){let s=new AI.Collection,i={baseUrl:mn.endpoint.DEFAULTS.baseUrl,headers:{},request:Object.assign({},t.request,{hook:s.bind(null,"request")}),mediaType:{previews:[],format:""}};if(i.headers["user-agent"]=t.userAgent?`${t.userAgent} ${NI}`:NI,t.baseUrl&&(i.baseUrl=t.baseUrl),t.previews&&(i.mediaType.previews=t.previews),t.timeZone&&(i.headers["time-zone"]=t.timeZone),this.request=mn.defaults(i),this.graphql=RI(this.request).defaults(i),this.log=qL(t.log),this.hook=s,t.authStrategy){let{authStrategy:n,...o}=t,a=n(Object.assign({request:this.request,log:this.log,octokit:this,octokitOptions:o},t.auth));s.wrap("request",a.hook),this.auth=a}else if(!t.auth)this.auth=async()=>({type:"unauthenticated"});else{let n=FI(t.auth);s.wrap("request",n.hook),this.auth=n}let r=this.constructor;for(let n=0;n<r.plugins.length;++n)Object.assign(this,r.plugins[n](this,t))}request;graphql;log;hook;auth};var hp="17.0.0";var WL={actions:{addCustomLabelsToSelfHostedRunnerForOrg:["POST /orgs/{org}/actions/runners/{runner_id}/labels"],addCustomLabelsToSelfHostedRunnerForRepo:["POST /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"],addRepoAccessToSelfHostedRunnerGroupInOrg:["PUT /orgs/{org}/actions/runner-groups/{runner_group_id}/repositories/{repository_id}"],addSelectedRepoToOrgSecret:["PUT /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}"],addSelectedRepoToOrgVariable:["PUT /orgs/{org}/actions/variables/{name}/repositories/{repository_id}"],approveWorkflowRun:["POST /repos/{owner}/{repo}/actions/runs/{run_id}/approve"],cancelWorkflowRun:["POST /repos/{owner}/{repo}/actions/runs/{run_id}/cancel"],createEnvironmentVariable:["POST /repos/{owner}/{repo}/environments/{environment_name}/variables"],createHostedRunnerForOrg:["POST /orgs/{org}/actions/hosted-runners"],createOrUpdateEnvironmentSecret:["PUT /repos/{owner}/{repo}/environments/{environment_name}/secrets/{secret_name}"],createOrUpdateOrgSecret:["PUT /orgs/{org}/actions/secrets/{secret_name}"],createOrUpdateRepoSecret:["PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}"],createOrgVariable:["POST /orgs/{org}/actions/variables"],cre Line truncated
globstar while`,e,l,t,p,g),this.matchOne(e.slice(l),t.slice(p),s))return this.debug("globstar found match!",l,a,g),!0;if(g==="."||g===".."||!r.dot&&g.charAt(0)==="."){this.debug("dot detected!",e,l,t,p);break}this.debug("globstar swallow a segment, and continue"),l++}return!!(s&&(this.debug(` `)},Y_=class{gen;threads=[];match=!1;runs=[];ids=[];constructor(e){this.gen=e}get dead(){return!this.threads.length&&!this.match&&!this.runs.length}},Uw=(e,t)=>e.ids.length!==t.ids.length||e.runs.length!==t.runs.length||e.ids.some((s,i)=>s!==t.ids[i])?!1:e.runs.every(s=>t.runs.some(i=>i.neg===s.neg&&Uw(i.state,s.state))),tw=e=>({has:new Float64Array(e),seen:new Float64Array(e),gen:0}),Lp=class{dots;dotStart;#e;constructor(e,t,s){this.dots=e,this.dotStart=t,this.#e=s}state(){return new Y_(++this.#e.gen)}done(e){return e.ids=e.threads.map(t=>t.id).sort((t,s)=>t-s),e.match&&e.ids.unshift(Mp.id),e}#t(e,t){let{seen:s}=this.#e;return s[t.id]===e.gen?!1:(s[t.id]=e.gen,!0)}#s(e,t){let{has:s}=this.#e;return s[t.id]===e.gen?!1:(s[t.id]=e.gen,e.threads.push(t),!0)}restricted(e,t){return t&&(this.dots||this.dotStart&&e===0)}add(e,t,s,i){switch(t.t){case"split":if(!this.#t(e,t))return;for(let n of t.out)this.add(e,n,s,i);return;case"neg":if(!this.#t(e,t))return;let r=this.state();return this.add(r,t.sub,s,!1),this.done(r),this.addRun(e,{t:"run",neg:t,state:r},s,i);case"star":if(this.restricted(s,i))return;this.#s(e,t)&&this.add(e,t.next,s,i);return;case"match":e.match=!0;return;default:this.#s(e,t)}}addRun(e,t,s,i){for(let r of e.runs)if(r.neg===t.neg&&Uw(r.state,t.state))return;e.runs.push(t),t.state.match||this.add(e,t.neg.next,s,i)}step(e,t,s,i){let r=this.state();for(let n of e.threads)switch(n.t){case"lit":Jp(n,t)&&this.add(r,n.next,s+1,i);break;case"any":this.restricted(s,i)||this.add(r,n.next,s+1,i);break;case"class":!this.restricted(s,i)&&n.re.test(t)&&this.add(r,n.next,s+1,i);break;case"star":this.restricted(s,i)||this.add(r,n,s+1,i)}if(!this.restricted(s,i))for(let n of e.runs){if(n.state.dead){this.addRun(r,n,s+1,i);continue}let o=this.step(n.state,t,s,!1);this.addRun(r,{t:"run",neg:n.neg,state:o},s+1,i)}return this.done(r)}},Nw=e=>{let t=e.ids.join();if(!e.runs.length)return t;let s=e.runs.map(i=>`${i.neg.id}(${Nw(i.state)})`);return`${t}|${s.sort().join("|")}`},O_=1<<18,P_=class{#e;#t=new Map;#s=0;#r;#i;#n;#a;constructor(e,t){this.#e=e,this.#n=new Lp(!1,!1,t),this.#a=new Lp(!1,!0,t)}#c(e){return{state:e,match:e.match,dead:e.dead,next:new Map}}#l(e){let t=Nw(e),s=this.#t.get(t);if(s)return s;this.#s>O_&&this.#p();let i=this.#c(e);return this.#t.set(t,i),this.#s+=t.length+1,i}#p(){this.#t.clear(),this.#s=0,this.#r=void 0,this.#i=void 0}start(e){if(e){if(this.#i)return this.#i;let s=this.#a.state();return this.#a.add(s,this.#e,0,!0),this.#i=this.#c(this.#a.done(s))}if(this.#r)return this.#r;let t=this.#n.state();return this.#n.add(t,this.#e,0,!0),this.#r=this.#l(this.#n.done(t))}next(e,t){let s=t.charCodeAt(0),i=s<128?void 0:e.next.get(t);if(i)return i;let r=e===this.#i?this.#l(this.#a.step(e.state,t,0,!0)):this.#l(this.#n.step(e.state,t,1,!0));return s<128?(e.ascii||(e.ascii=new Array(128),this.#s+=128),e.ascii[s]=r):e.next.set(t,r),this.#s++,r}},J_=e=>{let t=[];for(let s=e;s.t!=="match";s=s.next){if(s.t==="split"||s.t==="neg")return;t.push(s)}return t},H_=(e,t,s,i)=>{let r=0,n=s,o=-1,a=0;for(;n<i;){let A=e[r];if(A?.t==="star"){o=r++,a=n;continue}let c=t[n];if(A&&(A.t==="any"||A.t==="lit"&&Jp(A,c)||A.t==="class"&&A.re.test(c))){r++,n++;continue}if(o===-1)return!1;r=o+1,n=++a}for(;e[r]?.t==="star";)r++;return r===e.length},Mw=e=>{let t=0,s=0;for(let i of e){let[r,n]=V_(i);t+=r,s+=n}return[t,s]},V_=e=>{if(e.t==="star")return[0,1/0];if(e.t!=="ext")return[1,1];if(e.type==="!")return[0,1/0];let t=e.alts.map(Mw),s=Math.min(...t.map(n=>n[0])),i=Math.max(...t.map(n=>n[1])),r=i===0?0:1/0;return e.type==="@"?[s,i]:e.type==="?"?[0,i]:e.type==="*"?[0,r]:[s,r]},sw=(e,t,s)=>{for(let i=0;i<e.length;i++)if(!Jp(e[i],t[s+i]))return!1;return!0},q_=/[/\ud800-\udfff]/,W_=/[\ud800-\udfff]/,za=e=>W_.test(e)?[...e]:e,iw=e=>{if(e.includes("/"))throw new Error("can only match a single path portion, got: "+e)},rw=class{pattern;options;#e;#t;#s;#r;#i;#n;#a;#c=!1;#l=0;#p=1/0;#u=[];#g=[];#A;#m;#I=!1;#f;#h;constructor(e,t={}){if(e.includes("/"))throw new Error("can only match a single path portion, got pattern: "+e);this.pattern=e,this.options=t;let{nocase:s=!1,noext:i=!1,normalize:r}=t;this.#h=r===!0?"NFC":r||void 0;let n=/^[?*+@]\(\)$/.test(e),o=M_(e,s,i||n,this.#h),[a]=Sw(o,G_(o),0,o.length,!0);this.#h&&(a=Fw(a,this.#h));let[A,c]=L_(a,s);if(this.#e=A,this.#t=c,a.every(l=>l.t==="lit"))this.#i=a.map(l=>l.ch).join(""),s&&(this.#n=Gp(this.#i));else{let l=h=>h.t!=="lit"?void 0:s?{ch:h.ch,re:Gp(h.ch)}:{ch:h.ch};for(let h of a){let d=l(h);if(!d)break;this.#u.push(d)}for(let h=a.length-1;h>=0;h--){let d=l(a[h]);if(!d)break;this.#g.unshift(d)}this.#I=!!(this.#u.length||this.#g.length),s||(this.#A=this.#u.map(h=>h.ch).join(""),this.#m=this.#g.map(h=>h.ch).join("")),this.#a=J_(this.#e)?.slice(this.#u.length,-this.#g.length||void 0),this.#c=!!this.#a?.every(h=>h.t==="star"||h.t==="any");let[u,p]=Mw(a);this.#l=u,this.#p=p}}test(e){return this.#h?(iw(e),this.#C(e.normalize(this.#h))):q_.test(e)?(iw(e),this.#C(e,[...e])):this.#C(e,e)}testUnchecked(e) Line truncated
>>> no match, partial?`,e,l,t,p),l===a))}let d;if(typeof c=="string"?(d=u===c,this.debug("string match",c,u,d)):(d=c.test(u),this.debug("pattern match",c,u,d)),!d)return!1}if(o===a&&n===A)return!0;if(o===a)return s;if(n===A)return o===a-1&&e[o]==="";throw new Error("wtf?")}braceExpand(){return ow(this.pattern,this.options)}parse(e){ja(e);let t=this.options;if(e==="**")return ye;if(e==="")return"";let s,r=null;(s=e.match(WL))?r=t.dot?zL:jL:(s=e.match(ML))?r=(t.nocase?t.dot?OL:YL:t.dot?_L:LL)(s[1]):(s=e.match(ZL))?r=(t.nocase?t.dot?XL:KL:t.dot?$L:e_)(s):(s=e.match(JL))?r=t.dot?HL:PL:(s=e.match(VL))&&(r=qL);let i=ew.fromGlob(e,this.options).toMMPattern();return r&&typeof i=="object"&&Reflect.defineProperty(i,"test",{value:r}),i}makeRe(){if(this.regexp||this.regexp===!1)return this.regexp;let e=this.set;if(!e.length)return this.regexp=!1,this.regexp;let t=this.options,s=t.noglobstar?r_:t.dot?i_:o_,r=new Set(t.nocase?["i"]:[]),i=e.map(a=>{let A=a.map(u=>{if(u instanceof RegExp)for(let l of u.flags.split(""))r.add(l);return typeof u=="string"?l_(u):u===ye?ye:u._src});A.forEach((u,l)=>{let p=A[l+1],g=A[l-1];u!==ye||g===ye||(g===void 0?p!==void 0&&p!==ye?A[l+1]="(?:\\/|"+s+"\\/)?"+p:A[l]=s:p===void 0?A[l-1]=g+"(?:\\/|\\/"+s+")?":p!==ye&&(A[l-1]=g+"(?:\\/|\\/"+s+"\\/)"+p,A[l+1]=ye))});let c=A.filter(u=>u!==ye);if(this.partial&&c.length>=1){let u=[];for(let l=1;l<=c.length;l++)u.push(c.slice(0,l).join("/"));return"(?:"+u.join("|")+")"}return c.join("/")}).join("|"),[o,n]=e.length>1?["(?:",")"]:["",""];i="^"+o+i+n+"$",this.partial&&(i="^(?:\\/|"+o+i.slice(1,-1)+n+")$"),this.negate&&(i="^(?!"+i+").+$");try{this.regexp=new RegExp(i,[...r].join(""))}catch{this.regexp=!1}return this.regexp}slashSplit(e){return this.preserveMultipleSlashes?e.split("/"):this.isWindows&&/^\/\/[^\/]+/.test(e)?["",...e.split(/\/+/)]:e.split(/\/+/)}match(e,t=this.partial){if(this.debug("match",e,this.pattern),this.comment)return!1;if(this.empty)return e==="";if(e==="/"&&t)return!0;let s=this.options;this.isWindows&&(e=e.split("\\").join("/"));let r=this.slashSplit(e);this.debug(this.pattern,"split",r);let i=this.set;this.debug(this.pattern,"set",i);let o=r[r.length-1];if(!o)for(let n=r.length-2;!o&&n>=0;n--)o=r[n];for(let n=0;n<i.length;n++){let a=i[n],A=r;if(s.matchBase&&a.length===1&&(A=[o]),this.matchOne(A,a,t))return s.flipNegate?!0:!this.negate}return s.flipNegate?!1:this.negate}static defaults(e){return xe.defaults(e).Minimatch}};xe.AST=ew;xe.Minimatch=ms;xe.escape=tw;xe.unescape=ri;var u_=typeof performance=="object"&&performance&&typeof performance.now=="function"?performance:Date,aw=new Set,up=typeof process=="object"&&process?process:{},Aw=(e,t,s,r)=>{typeof up.emitWarning=="function"?up.emitWarning(e,t,s,r):console.error(`[${s}] ${t}: ${e}`)},za=globalThis.AbortController,FI=globalThis.AbortSignal;if(typeof za>"u"){FI=class{onabort;_onabort=[];reason;aborted=!1;addEventListener(s,r){this._onabort.push(r)}},za=class{constructor(){t()}signal=new FI;abort(s){if(!this.signal.aborted){this.signal.reason=s,this.signal.aborted=!0;for(let r of this.signal._onabort)r(s);this.signal.onabort?.(s)}}};let e=up.env?.LRU_CACHE_IGNORE_AC_WARNING!=="1",t=()=>{e&&(e=!1,Aw("AbortController is not defined. If using lru-cache in node 14, load an AbortController polyfill from the `node-abort-controller` package. A minimal polyfill is provided for use by LRUCache.fetch(), but it should not be relied upon in other contexts (eg, passing it to other APIs that use AbortController/AbortSignal might have undesirable effects). You may disable this with LRU_CACHE_IGNORE_AC_WARNING=1 in the env.","NO_ABORT_CONTROLLER","ENOTSUP",t))}}var p_=e=>!aw.has(e),Es=e=>e&&e===Math.floor(e)&&e>0&&isFinite(e),cw=e=>Es(e)?e<=Math.pow(2,8)?Uint8Array:e<=Math.pow(2,16)?Uint16Array:e<=Math.pow(2,32)?Uint32Array:e<=Number.MAX_SAFE_INTEGER?qa:null:null,qa=class extends Array{constructor(e){super(e),this.fill(0)}},g_=class Qo{heap;length;static#e=!1;static create(t){let s=cw(t);if(!s)return[];Qo.#e=!0;let r=new Qo(t,s);return Qo.#e=!1,r}constructor(t,s){if(!Qo.#e)throw new TypeError("instantiate Stack using Stack.create(n)");this.heap=new s(t),this.length=0}push(t){this.heap[this.length++]=t}pop(){return this.heap[--this.length]}},Ka=class lw{#e;#t;#s;#r;#i;#o;#l;#A;get perf(){return this.#A}ttl;ttlResolution;ttlAutopurge;updateAgeOnGet;updateAgeOnHas;allowStale;noDisposeOnSet;noUpdateTTL;maxEntrySize;sizeCalculation;noDeleteOnFetchRejection;noDeleteOnStaleGet;allowStaleOnFetchAbort;allowStaleOnFetchRejection;ignoreFetchAbort;#c;#u;#p;#g;#a;#d;#C;#B;#E;#k;#m;#b;#y;#f;#Q;#I;#x;#n;#U;static unsafeExposeInternals(t){return{starts:t.#y,ttls:t.#f,autopurgeTimers:t.#Q,sizes:t.#b,keyMap:t.#p,keyList:t.#g,valList:t.#a,next:t.#d,prev:t.#C,get head(){return t.#B},get tail(){return t.#E},free:t.#k,isBackgroundFetch:s=>t.#h(s),backgroundFetch:(s,r,i,o)=>t.#J(s,r,i,o),moveToTail:s=>t.#G(s),indexes:s=>t.#R(s),rindexes:s=>t.#T(s),isStale:s=>t.#w(s)}}get max(){return this.#e}get maxSize(){return th Line truncated
${i.data.body}`:r.body=i.data.body}return r.body=r.body?this.truncateReleaseNotes(r.body):void 0,r}truncateReleaseNotes(t){return t.substring(0,124999)}async createRelease(t){return this.github.rest.repos.createRelease(await this.prepareReleaseMutation(t))}async updateRelease(t){return this.github.rest.repos.updateRelease(await this.prepareReleaseMutation(t))}async finalizeRelease(t){return await this.github.rest.repos.updateRelease({owner:t.owner,repo:t.repo,release_id:t.release_id,draft:!1,make_latest:t.make_latest,discussion_category_name:t.discussion_category_name})}allReleases(t){let s={per_page:100,...t};return this.github.paginate.iterator(this.github.rest.repos.listReleases.endpoint.merge(s))}async listReleaseAssets(t){return this.github.paginate(this.github.rest.repos.listReleaseAssets,{...t,per_page:100})}async deleteReleaseAsset(t){let{release_id:s,...r}=t;try{await this.github.rest.repos.deleteReleaseAsset(r)}catch(i){if((i?.status??i?.response?.status)!==404)throw i;try{await this.github.request("DELETE /repos/{owner}/{repo}/releases/{release_id}/assets/{asset_id}",t)}catch(n){throw new AggregateError([i,n],`Failed to delete release asset ${t.asset_id}. GitHub endpoint: ${Qs(i)}; release-scoped endpoint: ${Qs(n)}`)}}}async deleteRelease(t){await this.github.rest.repos.deleteRelease(t)}async updateReleaseAsset(t){return await this.github.rest.repos.updateReleaseAsset(t)}async uploadReleaseAsset(t){return this.github.request({method:"POST",url:t.url,headers:{"content-length":`${t.size}`,"content-type":t.mime,authorization:`token ${t.token}`},data:t.data})}},t2=e=>({name:(0,qw.basename)(e),mime:s2(e),size:(0,Pw.statSync)(e).size}),s2=e=>(0,Vw.lookup)(e)||"application/octet-stream",Bp=(e,t)=>t.name===e||t.name===Ow(e)||t.label===e,r2=e=>{let t=e?.status??e?.response?.status,s=e?.request?.url,r=e?.message,i=typeof s=="string"&&(/\/releases\/assets\//.test(s)||/\/releases\/\d+\/assets(?:\?|$)/.test(s));return t===404&&(i||typeof r=="string"&&r.includes("update-a-release-asset"))},i2=e=>{let t=e?.status??e?.response?.status,s=e?.response?.data?.message??e?.message;return t===422&&/immutable release/i.test(String(s))},o2=(e,t)=>t?`Cannot upload asset ${e} to an immutable release. GitHub only allows asset uploads before a release is published, but draft prereleases publish with the release.published event instead of release.prereleased. If you need prereleases with assets on an immutable-release repository, keep the release as a draft with draft: true, then publish it later from that draft and subscribe downstream workflows to release.published.`:`Cannot upload asset ${e} to an immutable release. GitHub only allows asset uploads before a release is published, so upload assets to a draft release before you publish it.`,jw=async(e,t,s,r,i,o)=>{let[n,a]=e.github_repository.split("/"),{name:A,mime:c,size:u}=t2(r),l=i.find(h=>Bp(A,h));if(l){if(e.input_overwrite_files===!1)return console.log(`Asset ${A} already exists and overwrite_files is false...`),null;console.log(`\u267B\uFE0F Deleting previously uploaded asset ${A}...`),await t.deleteReleaseAsset({asset_id:l.id||1,owner:n,repo:a,release_id:o})}console.log(`\u2B06\uFE0F Uploading ${A}...`);let p=new URL(s);p.searchParams.append("name",A);let g=async(h,m=3)=>{if(o!==void 0)for(let Q=1;Q<=m;Q++){let b=(await t.listReleaseAssets({owner:n,repo:a,release_id:o})).find(h);if(b)return b;Q<m&&await new Promise(N=>setTimeout(N,1e3))}},d=async()=>{let h=await(0,Hw.open)(r);try{return await t.uploadReleaseAsset({url:p.toString(),size:u,mime:c,token:e.github_token,data:X_(h)})}finally{await h.close()}},E=async h=>{if(!h.name||h.name===A||!h.id)return h;console.log(`\u270F\uFE0F Restoring asset label to ${A}...`);let m=async Q=>{let{data:C}=await t.updateReleaseAsset({owner:n,repo:a,asset_id:Q,name:h.name,label:A});return C};try{return await m(h.id)}catch(Q){if((Q?.status??Q?.response?.status)===404&&o!==void 0)try{let b=await g(N=>N.id===h.id||N.name===h.name);if(b)return await m(b.id)}catch(b){console.warn(`error refreshing release assets for ${A}: ${b}`)}return console.warn(`error updating release asset label for ${A}: ${Q}`),h}},f=async h=>{let m=h.data;if(h.status!==201)throw new Error(`Failed to upload release asset ${A}. received status code ${h.status} ${r.data.body}`:i.body=r.data.body}return i.body=i.body?this.truncateReleaseNotes(i.body):void 0,i}truncateReleaseNotes(t){return t.substring(0,124999)}async createRelease(t){return this.github.rest.repos.createRelease(await this.prepareReleaseMutation(t))}async updateRelease(t){return this.github.rest.repos.updateRelease(await this.prepareReleaseMutation(t))}async finalizeRelease(t){return await this.github.rest.repos.updateRelease({owner:t.owner,repo:t.repo,release_id:t.release_id,draft:!1,make_latest:t.make_latest,discussion_category_name:t.discussion_category_name})}allReleases(t){let s={per_page:100,...t};return this.github.paginate.iterator(this.github.rest.repos.listReleases.endpoint.merge(s))}async listReleaseAssets(t){return this.github.paginate(this.github.rest.repos.listReleaseAssets,{...t,per_page:100})}async deleteReleaseAsset(t){let{release_id:s,...i}=t;try{await this.github.rest.repos.deleteReleaseAsset(i)}catch(r){if(St(r)!==404)throw r;try{await this.github.request("DELETE /repos/{owner}/{repo}/releases/{release_id}/assets/{asset_id}",t)}catch(n){throw new AggregateError([r,n],`Failed to delete release asset ${t.asset_id}. GitHub endpoint: ${Qs(r)}; release-scoped endpoint: ${Qs(n)}`)}}}async deleteRelease(t){await this.github.rest.repos.deleteRelease(t)}async updateReleaseAsset(t){return await this.github.rest.repos.updateReleaseAsset(t)}async uploadReleaseAsset(t){return this.github.request({method:"POST",url:t.url,headers:{"content-length":`${t.size}`,"content-type":t.mime,authorization:`token ${t.token}`},data:t.data})}},Z2=e=>({name:(0,xb.basename)(e),mime:K2(e),size:(0,wb.statSync)(e).size}),K2=e=>(0,yb.lookup)(e)||"application/octet-stream",Kp=(e,t)=>t.name===e||t.name===Cb(e)||t.label===e,X2=e=>{let t=St(e),s=q2(e),i=kb(e),r=typeof s=="string"&&(/\/releases\/assets\//.test(s)||/\/releases\/\d+\/assets(?:\?|$)/.test(s));return t===404&&(r||typeof i=="string"&&i.includes("update-a-release-asset"))},$2=e=>{let t=St(e),s=vb(e)?.message??kb(e);return t===422&&/immutable release/i.test(String(s))},eY=(e,t)=>t?`Cannot upload asset ${e} to an immutable release. GitHub only allows asset uploads before a release is published, but draft prereleases publish with the release.published event instead of release.prereleased. If you need prereleases with assets on an immutable-release repository, keep the release as a draft with draft: true, then publish it later from that draft and subscribe downstream workflows to release.published.`:`Cannot upload asset ${e} to an immutable release. GitHub only allows asset uploads before a release is published, so upload assets to a draft release before you publish it.`,Sb=async(e,t,s,i,r,n)=>{let[o,a]=e.github_repository.split("/"),{name:A,mime:c,size:l}=Z2(i),u=r.find(g=>Kp(A,g));if(u){if(e.input_overwrite_files===!1)return console.log(`Asset ${A} already exists and overwrite_files is false...`),null;console.log(`\u267B\uFE0F Deleting previously uploaded asset ${A}...`),await t.deleteReleaseAsset({asset_id:u.id||1,owner:o,repo:a,release_id:n})}console.log(`\u2B06\uFE0F Uploading ${A}...`);let p=new URL(s);p.searchParams.append("name",A);let h=async(g,m=3)=>{if(n!==void 0)for(let B=1;B<=m;B++){let b=(await t.listReleaseAssets({owner:o,repo:a,release_id:n})).find(g);if(b)return b;B<m&&await new Promise(U=>setTimeout(U,1e3))}},d=async()=>{let g=await(0,bb.open)(i);try{return await t.uploadReleaseAsset({url:p.toString(),size:l,mime:c,token:e.github_token,data:W2(g)})}finally{await g.close()}},E=async g=>{if(!g.name||g.name===A||!g.id)return g;console.log(`\u270F\uFE0F Restoring asset label to ${A}...`);let m=async B=>{let{data:C}=await t.updateReleaseAsset({owner:o,repo:a,asset_id:B,name:g.name,label:A});return C};try{return await m(g.id)}catch(B){if(St(B)===404&&n!==void 0)try{let b=await h(U=>U.id===g.id||U.name===g.name);if(b)return await m(b.id)}catch(b){console.warn(`error refreshing release assets for ${A}: ${b}`)}return console.warn(`error updating release asset label for ${A}: ${B}`),g}},f=async g=>{let m=g.data;if(g.status!==201)throw new Error(`Failed to upload release asset ${A}. received status code ${g.status}
${m.message} ${m.message}
${JSON.stringify(m.errors)}`);let Q=await E(m);return console.log(`\u2705 Uploaded ${A}`),Q};try{return await f(await d())}catch(h){let m=h?.status??h?.response?.status,Q=h?.response?.data;if(i2(h))throw new Error(o2(A,e.input_prerelease));if(o!==void 0&&r2(h))try{let C=await g(b=>Bp(A,b));if(C)return console.warn(`error updating release asset metadata for ${A}: ${h}. Matching asset is present after refresh; continuing...`),C}catch(C){console.warn(`error refreshing release assets after metadata update failure: ${C}`)}if(e.input_overwrite_files!==!1&&m===422&&Q?.errors?.[0]?.code==="already_exists"&&o!==void 0){console.log(`\u26A0\uFE0F Asset ${A} already exists (race condition), refreshing assets and retrying once...`);let b=(await t.listReleaseAssets({owner:n,repo:a,release_id:o})).find(N=>Bp(A,N));if(b)return await t.deleteReleaseAsset({owner:n,repo:a,release_id:o,asset_id:b.id}),await f(await d())}throw h}},Ip=async(e,t,s=3)=>{if(s<=0)throw console.log("\u274C Too many retries. Aborting..."),new Error("Too many retries.");let[r,i]=e.github_repository.split("/"),o=Qp(e.input_tag_name)||(bo(e.github_ref)?e.github_ref.replace("refs/tags/",""):""),n=e.input_discussion_category_name,a=e.input_generate_release_notes,A=e.input_previous_tag;a&&A&&console.log(`\u{1F4DD} Generating release notes using previous tag ${A}`);let c;try{c=await zw(t,r,i,o,s)}catch(u){if(u.status===404){let l=e2(r,i,u);throw console.log(`\u26A0\uFE0F ${l}`),new Cp(l,u)}throw console.log(`\u26A0\uFE0F Unexpected error fetching GitHub release for tag ${e.github_ref}: ${u}`),u}if(c===void 0)return await Jw(o,e,t,r,i,n,a,s,A);try{let u=c;console.log(`Found release ${u.name} (with id=${u.id})`);let l=u.id,p;e.input_target_commitish&&e.input_target_commitish!==u.target_commitish?(console.log(`Updating commit from "${u.target_commitish}" to "${e.input_target_commitish}"`),p=e.input_target_commitish):p=u.target_commitish;let g=o,d=e.input_name||u.name||o,E=fp(e)||"",f=u.body||"",h;e.input_append_body&&E&&f?h=f+` ${JSON.stringify(m.errors)}`);let B=await E(m);return console.log(`\u2705 Uploaded ${A}`),B};try{return await f(await d())}catch(g){let m=St(g);if($2(g))throw new Error(eY(A,e.input_prerelease));if(n!==void 0&&X2(g))try{let B=await h(C=>Kp(A,C));if(B)return console.warn(`error updating release asset metadata for ${A}: ${g}. Matching asset is present after refresh; continuing...`),B}catch(B){console.warn(`error refreshing release assets after metadata update failure: ${B}`)}if(e.input_overwrite_files!==!1&&m===422&&Rb(g,"already_exists")&&n!==void 0){console.log(`\u26A0\uFE0F Asset ${A} already exists (race condition), refreshing assets and retrying once...`);let C=(await t.listReleaseAssets({owner:o,repo:a,release_id:n})).find(b=>Kp(A,b));if(C)return await t.deleteReleaseAsset({owner:o,repo:a,release_id:n,asset_id:C.id}),await f(await d())}throw g}},$p=async(e,t,s=3)=>{if(s<=0)throw console.log("\u274C Too many retries. Aborting..."),new Error("Too many retries.");let[i,r]=e.github_repository.split("/"),n=Zp(e.input_tag_name)||(Sn(e.github_ref)?e.github_ref.replace("refs/tags/",""):""),o=e.input_discussion_category_name,a=e.input_generate_release_notes,A=e.input_previous_tag;a&&A&&console.log(`\u{1F4DD} Generating release notes using previous tag ${A}`);let c;try{c=await Fb(t,i,r,n,s)}catch(l){if(St(l)===404){let u=z2(i,r,l);throw console.log(`\u26A0\uFE0F ${u}`),new Xp(u,l)}throw console.log(`\u26A0\uFE0F Unexpected error fetching GitHub release for tag ${e.github_ref}: ${l}`),l}if(c===void 0)return await Ib(n,e,t,i,r,o,a,s,A);try{let l=c;console.log(`Found release ${l.name} (with id=${l.id})`);let u=l.id,p;e.input_target_commitish&&e.input_target_commitish!==l.target_commitish?(console.log(`Updating commit from "${l.target_commitish}" to "${e.input_target_commitish}"`),p=e.input_target_commitish):p=l.target_commitish;let h=n,d=e.input_name||l.name||n,E=zp(e)||"",f=l.body||"",g;e.input_append_body&&E&&f?g=f+`
`+E:h=E||f;let m=e.input_prerelease!==void 0?e.input_prerelease:u.prerelease,Q=e.input_make_latest;return{release:(await t.updateRelease({owner:r,repo:i,release_id:l,tag_name:g,target_commitish:p,name:d,body:h,draft:u.draft,prerelease:m,discussion_category_name:n,generate_release_notes:a,make_latest:Q,previous_tag_name:A})).data,created:!1}}catch(u){if(u instanceof sA)throw u;if(u.status!==404)throw console.log(`\u26A0\uFE0F Unexpected error fetching GitHub release for tag ${e.github_ref}: ${u}`),u;return await Jw(o,e,t,r,i,n,a,s,A)}},wp=async(e,t,s,r=!1,i=3)=>{if(e.input_draft===!0||s.draft===!1)return s;if(i<=0)throw console.log("\u274C Too many retries. Aborting..."),new Error("Too many retries.");let[o,n]=e.github_repository.split("/");try{let{data:a}=await t.finalizeRelease({owner:o,repo:n,release_id:s.id,make_latest:e.input_make_latest,discussion_category_name:e.input_discussion_category_name});return a}catch(a){if(console.warn(`error finalizing release: ${a}`),r&&s.draft&&c2(a)){let A=!1;try{console.log(`\u{1F9F9} Deleting draft release ${s.id} for tag ${s.tag_name} because tag creation is blocked by repository rules...`),await t.deleteRelease({owner:o,repo:n,release_id:s.id}),A=!0}catch(u){console.warn(`error deleting orphan draft release ${s.id}: ${u}`)}let c=A?`Deleted draft release ${s.id} to avoid leaving an orphaned draft release.`:`Failed to delete draft release ${s.id}; manual cleanup may still be required.`;throw new Error(`Tag creation for ${s.tag_name} is blocked by repository rules. ${c}`)}return console.log(`retrying... (${i-1} retries remaining)`),wp(e,t,s,r,i-1)}},bp=async(e,t,s,r=3)=>{if(r<=0)throw console.log("\u274C Too many retries. Aborting..."),new Error("Too many retries.");let[i,o]=e.github_repository.split("/");try{return await t.listReleaseAssets({owner:i,repo:o,release_id:s.id})}catch(n){return console.warn(`error listing assets of release: ${n}`),console.log(`retrying... (${r-1} retries remaining)`),bp(e,t,s,r-1)}};async function zw(e,t,s,r,i=1){try{let{data:n}=await e.getReleaseByTag({owner:t,repo:s,tag:r});return n}catch(n){if(n.status!==404)throw n}if(i<=0)return;let o=Math.max(1,i);for(let n=0;n<o;n+=1){let a=await Xw(e,t,s,r),A=$w(a,void 0);if(A)return A;n<o-1&&await Kw(Zw)}}var Zw=1e3,n2=2;async function Kw(e){await new Promise(t=>setTimeout(t,e))}async function Xw(e,t,s,r){let i=[],o=0;for await(let n of e.allReleases({owner:t,repo:s}))if(i.push(...n.data.filter(a=>a.tag_name===r)),o+=1,o>=n2)break;return i}function $w(e,t){return t&&e.some(s=>s.id===t.id)||e.length===0?t:[...e].sort((s,r)=>s.draft!==r.draft?Number(s.draft)-Number(r.draft):s.id-r.id)[0]}async function a2(e,t,s,r,i,o){if(!(o.id===i||!o.draft||o.assets.length>0))try{console.log(`\u{1F9F9} Removing duplicate draft release ${o.id} for tag ${r}...`),await e.deleteRelease({owner:t,repo:s,release_id:o.id})}catch(n){console.warn(`error deleting duplicate release ${o.id}: ${n}`)}}async function A2(e,t,s,r,i,o){let n=Math.max(o,1);for(let a=1;a<=n;a+=1){let A;try{A=await zw(e,t,s,r,0)}catch(l){console.warn(`error reloading release for tag ${r}: ${l}`)}let c=[];try{c=await Xw(e,t,s,r)}catch(l){console.warn(`error listing recent releases for tag ${r}: ${l}`)}let u=$w(c,A);if(u){u.id!==i.id&&console.log(`\u21AA\uFE0F Using release ${u.id} for tag ${r} instead of duplicate draft ${i.id}`);let l=c.find(p=>p.id===i.id);return l&&await a2(e,t,s,r,u.id,l),u}a<n&&(console.log(`Release ${i.id} is not yet discoverable by tag ${r}, retrying... (${n-a} retries remaining)`),await Kw(Zw))}return console.log(`\u26A0\uFE0F Continuing with newly created release ${i.id} because tag ${r} is still not discoverable`),i}async function Jw(e,t,s,r,i,o,n,a,A){let c=e,u=t.input_name||e,l=fp(t),p=t.input_prerelease,g=p===!0?t.input_draft===!0:!0,d=t.input_target_commitish,E=t.input_make_latest,f="";d&&(f=` using commit "${d}"`),console.log(`\u{1F469}\u200D\u{1F3ED} Creating new GitHub release for tag ${c}${f}...`);try{let h=await s.createRelease({owner:r,repo:i,tag_name:c,name:u,body:l,draft:g,prerelease:p,target_commitish:d,discussion_category_name:o,generate_release_notes:n,make_latest:E,previous_tag_name:A}),m=await A2(s,r,i,c,h.data,a);return{release:m,created:m.id===h.data.id}}catch(h){let m=h;switch(console.log(`\u26A0\uFE0F GitHub release failed with status: ${m.status}`),console.log(Qs(h)),m.status){case 403:throw console.log("Skip retry \u2014 your GitHub token/PAT does not have the required permission to create a release"),h;case 404:let Q=$_(r,i,o,h);throw console.log(`Skip retry \u2014 ${Q}`),new sA(Q,h);case 422:if(m.response?.data?.errors?.[0]?.code==="already_exists")console.log("\u26A0\uFE0F Release already exists (race condition detected), retrying to find and update existing release...");else throw console.log("Skip retry - validation failed"),h;break}return console.log(`retrying... (${a-1} retries remaining)`),Ip(t,s,a-1)}}function c2(e){let t=e?.response?.data?.errors;return!Array.isArray(t)||e?.status!==422?!1:t.som Line truncated `+E:g=E||f;let m=e.input_prerelease!==void 0?e.input_prerelease:l.prerelease,B=e.input_make_latest;return{release:(await t.updateRelease({owner:i,repo:r,release_id:u,tag_name:h,target_commitish:p,name:d,body:g,draft:l.draft,prerelease:m,discussion_category_name:o,generate_release_notes:a,make_latest:B,previous_tag_name:A})).data,created:!1}}catch(l){if(l instanceof fA)throw l;if(St(l)!==404)throw console.log(`\u26A0\uFE0F Unexpected error fetching GitHub release for tag ${e.github_ref}: ${l}`),l;return await Ib(n,e,t,i,r,o,a,s,A)}},eg=async(e,t,s,i=!1,r=3)=>{if(e.input_draft===!0||s.draft===!1)return s;if(r<=0)throw console.log("\u274C Too many retries. Aborting..."),new Error("Too many retries.");let[n,o]=e.github_repository.split("/");try{let{data:a}=await t.finalizeRelease({owner:n,repo:o,release_id:s.id,make_latest:e.input_make_latest,discussion_category_name:e.input_discussion_category_name});return a}catch(a){if(console.warn(`error finalizing release: ${a}`),i&&s.draft&&rY(a)){let A=!1;try{console.log(`\u{1F9F9} Deleting draft release ${s.id} for tag ${s.tag_name} because tag creation is blocked by repository rules...`),await t.deleteRelease({owner:n,repo:o,release_id:s.id}),A=!0}catch(l){console.warn(`error deleting orphan draft release ${s.id}: ${l}`)}let c=A?`Deleted draft release ${s.id} to avoid leaving an orphaned draft release.`:`Failed to delete draft release ${s.id}; manual cleanup may still be required.`;throw new Error(`Tag creation for ${s.tag_name} is blocked by repository rules. ${c}`)}return console.log(`retrying... (${r-1} retries remaining)`),eg(e,t,s,i,r-1)}},tg=async(e,t,s,i=3)=>{if(i<=0)throw console.log("\u274C Too many retries. Aborting..."),new Error("Too many retries.");let[r,n]=e.github_repository.split("/");try{return await t.listReleaseAssets({owner:r,repo:n,release_id:s.id})}catch(o){return console.warn(`error listing assets of release: ${o}`),console.log(`retrying... (${i-1} retries remaining)`),tg(e,t,s,i-1)}};async function Fb(e,t,s,i,r=1){try{let{data:o}=await e.getReleaseByTag({owner:t,repo:s,tag:i});return o}catch(o){if(St(o)!==404)throw o}if(r<=0)return;let n=Math.max(1,r);for(let o=0;o<n;o+=1){let a=await Mb(e,t,s,i),A=Gb(a,void 0);if(A)return A;o<n-1&&await Nb(Ub)}}var Ub=1e3,tY=2;async function Nb(e){await new Promise(t=>setTimeout(t,e))}async function Mb(e,t,s,i){let r=[],n=0;for await(let o of e.allReleases({owner:t,repo:s}))if(r.push(...o.data.filter(a=>a.tag_name===i)),n+=1,n>=tY)break;return r}function Gb(e,t){return t&&e.some(s=>s.id===t.id)||e.length===0?t:[...e].sort((s,i)=>s.draft!==i.draft?Number(s.draft)-Number(i.draft):s.id-i.id)[0]}async function sY(e,t,s,i,r,n){if(!(n.id===r||!n.draft||n.assets.length>0))try{console.log(`\u{1F9F9} Removing duplicate draft release ${n.id} for tag ${i}...`),await e.deleteRelease({owner:t,repo:s,release_id:n.id})}catch(o){console.warn(`error deleting duplicate release ${n.id}: ${o}`)}}async function iY(e,t,s,i,r,n){let o=Math.max(n,1);for(let a=1;a<=o;a+=1){let A;try{A=await Fb(e,t,s,i,0)}catch(u){console.warn(`error reloading release for tag ${i}: ${u}`)}let c=[];try{c=await Mb(e,t,s,i)}catch(u){console.warn(`error listing recent releases for tag ${i}: ${u}`)}let l=Gb(c,A);if(l){l.id!==r.id&&console.log(`\u21AA\uFE0F Using release ${l.id} for tag ${i} instead of duplicate draft ${r.id}`);let u=c.find(p=>p.id===r.id);return u&&await sY(e,t,s,i,l.id,u),l}a<o&&(console.log(`Release ${r.id} is not yet discoverable by tag ${i}, retrying... (${o-a} retries remaining)`),await Nb(Ub))}return console.log(`\u26A0\uFE0F Continuing with newly created release ${r.id} because tag ${i} is still not discoverable`),r}async function Ib(e,t,s,i,r,n,o,a,A){let c=e,l=t.input_name||e,u=zp(t),p=t.input_prerelease,h=p===!0?t.input_draft===!0:!0,d=t.input_target_commitish,E=t.input_make_latest,f="";d&&(f=` using commit "${d}"`),console.log(`\u{1F469}\u200D\u{1F3ED} Creating new GitHub release for tag ${c}${f}...`);try{let g=await s.createRelease({owner:i,repo:r,tag_name:c,name:l,body:u,draft:h,prerelease:p,target_commitish:d,discussion_category_name:n,generate_release_notes:o,make_latest:E,previous_tag_name:A}),m=await iY(s,i,r,c,g.data,a);return{release:m,created:m.id===g.data.id}}catch(g){let m=St(g);switch(console.log(`\u26A0\uFE0F GitHub release failed with status: ${m}`),console.log(Qs(g)),m){case 403:throw console.log("Skip retry \u2014 your GitHub token/PAT does not have the required permission to create a release"),g;case 404:let B=j2(i,r,n,g);throw console.log(`Skip retry \u2014 ${B}`),new fA(B,g);case 422:if(Rb(g,"already_exists"))console.log("\u26A0\uFE0F Release already exists (race condition detected), retrying to find and update existing release...");else throw console.log("Skip retry - validation failed"),g;break}return console.log(`retrying... (${a-1} retries remaining)`),$p(t,s,a-1)}}function rY(e){return St(e)!==422?!1:Db(e).some(t=>{let s=Tt(t);return s?.field==="pre_receive"&&typeof s.message=="string"&&s.message.includes( Line truncated
/*! Bundled license information: /*! Bundled license information:
undici/lib/web/fetch/body.js: undici/lib/web/fetch/body.js:
+537 -713
View File
File diff suppressed because it is too large. Load diff
+8 -8
View File
@@ -1,6 +1,6 @@
{ {
"name": "action-gh-release", "name": "action-gh-release",
"version": "3.0.2", "version": "3.0.4",
"private": true, "private": true,
"description": "GitHub Action for creating GitHub Releases", "description": "GitHub Action for creating GitHub Releases",
"main": "lib/main.js", "main": "lib/main.js",
@@ -27,18 +27,18 @@
"dependencies": { "dependencies": {
"@actions/core": "^3.0.1", "@actions/core": "^3.0.1",
"@actions/github": "^9.1.1", "@actions/github": "^9.1.1",
"@octokit/plugin-retry": "^8.1.0", "@octokit/plugin-retry": "^8.1.1",
"@octokit/plugin-throttling": "^11.0.3", "@octokit/plugin-throttling": "^11.0.5",
"glob": "^13.0.6", "glob": "^14.0.3",
"mime-types": "^3.0.2" "mime-types": "^3.0.2"
}, },
"devDependencies": { "devDependencies": {
"@types/mime-types": "^3.0.1", "@types/mime-types": "^3.0.1",
"@types/node": "^24", "@types/node": "^24",
"@vitest/coverage-v8": "^4.1.9", "@vitest/coverage-v8": "^5.0.5",
"esbuild": "^0.28.1", "esbuild": "^0.28.2",
"prettier": "3.9.0", "prettier": "3.9.10",
"typescript": "^7.0.2", "typescript": "^7.0.2",
"vitest": "^4.0.4" "vitest": "^5.0.0"
} }
} }
+68 -38
View File
@@ -9,6 +9,43 @@ type GitHub = InstanceType<typeof GitHub>;
type UploadChunk = ArrayBuffer | Uint8Array<ArrayBufferLike>; type UploadChunk = ArrayBuffer | Uint8Array<ArrayBufferLike>;
type UploadBody = ReadableStream<Uint8Array<ArrayBufferLike>>; type UploadBody = ReadableStream<Uint8Array<ArrayBufferLike>>;
type UnknownRecord = Record<string, unknown>;
const asRecord = (value: unknown): UnknownRecord | undefined =>
typeof value === 'object' && value !== null ? (value as UnknownRecord) : undefined;
const getErrorStatus = (error: unknown): number | undefined => {
const errorRecord = asRecord(error);
if (typeof errorRecord?.status === 'number') {
return errorRecord.status;
}
const response = asRecord(errorRecord?.response);
return typeof response?.status === 'number' ? response.status : undefined;
};
const getResponseData = (error: unknown): UnknownRecord | undefined => {
const response = asRecord(asRecord(error)?.response);
return asRecord(response?.data);
};
const getErrorMessage = (error: unknown): string | undefined => {
const message = asRecord(error)?.message;
return typeof message === 'string' ? message : undefined;
};
const getRequestUrl = (error: unknown): string | undefined => {
const request = asRecord(asRecord(error)?.request);
return typeof request?.url === 'string' ? request.url : undefined;
};
const getValidationErrors = (error: unknown): unknown[] => {
const errors = getResponseData(error)?.errors;
return Array.isArray(errors) ? errors : [];
};
const hasValidationErrorCode = (error: unknown, code: string): boolean =>
asRecord(getValidationErrors(error)[0])?.code === code;
const fileUploadStream = (fileHandle: FileHandle): UploadBody => { const fileUploadStream = (fileHandle: FileHandle): UploadBody => {
const source = fileHandle.readableWebStream() as ReadableStream<UploadChunk>; const source = fileHandle.readableWebStream() as ReadableStream<UploadChunk>;
@@ -278,10 +315,7 @@ export class GitHubReleaser implements Releaser {
try { try {
await this.github.rest.repos.deleteReleaseAsset(githubParams); await this.github.rest.repos.deleteReleaseAsset(githubParams);
} catch (error: unknown) { } catch (error: unknown) {
const status = if (getErrorStatus(error) !== 404) {
(error as { status?: number; response?: { status?: number } })?.status ??
(error as { response?: { status?: number } })?.response?.status;
if (status !== 404) {
throw error; throw error;
} }
@@ -352,10 +386,10 @@ const releaseAssetMatchesName = (
asset: { name: string; label?: string | null }, asset: { name: string; label?: string | null },
): boolean => asset.name === name || asset.name === alignAssetName(name) || asset.label === name; ): boolean => asset.name === name || asset.name === alignAssetName(name) || asset.label === name;
const isReleaseAssetUpdateNotFound = (error: any): boolean => { const isReleaseAssetUpdateNotFound = (error: unknown): boolean => {
const errorStatus = error?.status ?? error?.response?.status; const errorStatus = getErrorStatus(error);
const requestUrl = error?.request?.url; const requestUrl = getRequestUrl(error);
const errorMessage = error?.message; const message = getErrorMessage(error);
const isReleaseAssetRequest = const isReleaseAssetRequest =
typeof requestUrl === 'string' && typeof requestUrl === 'string' &&
(/\/releases\/assets\//.test(requestUrl) || /\/releases\/\d+\/assets(?:\?|$)/.test(requestUrl)); (/\/releases\/assets\//.test(requestUrl) || /\/releases\/\d+\/assets(?:\?|$)/.test(requestUrl));
@@ -363,15 +397,15 @@ const isReleaseAssetUpdateNotFound = (error: any): boolean => {
return ( return (
errorStatus === 404 && errorStatus === 404 &&
(isReleaseAssetRequest || (isReleaseAssetRequest ||
(typeof errorMessage === 'string' && errorMessage.includes('update-a-release-asset'))) (typeof message === 'string' && message.includes('update-a-release-asset')))
); );
}; };
const isImmutableReleaseAssetUploadFailure = (error: any): boolean => { const isImmutableReleaseAssetUploadFailure = (error: unknown): boolean => {
const errorStatus = error?.status ?? error?.response?.status; const errorStatus = getErrorStatus(error);
const errorMessage = error?.response?.data?.message ?? error?.message; const message = getResponseData(error)?.message ?? getErrorMessage(error);
return errorStatus === 422 && /immutable release/i.test(String(errorMessage)); return errorStatus === 422 && /immutable release/i.test(String(message));
}; };
const immutableReleaseAssetUploadMessage = ( const immutableReleaseAssetUploadMessage = (
@@ -480,8 +514,8 @@ export const upload = async (
try { try {
return await updateAssetLabel(uploadedAsset.id); return await updateAssetLabel(uploadedAsset.id);
} catch (error: any) { } catch (error: unknown) {
const errorStatus = error?.status ?? error?.response?.status; const errorStatus = getErrorStatus(error);
if (errorStatus === 404 && releaseId !== undefined) { if (errorStatus === 404 && releaseId !== undefined) {
try { try {
@@ -518,9 +552,8 @@ export const upload = async (
try { try {
return await handleUploadedAsset(await uploadAsset()); return await handleUploadedAsset(await uploadAsset());
} catch (error: any) { } catch (error: unknown) {
const errorStatus = error?.status ?? error?.response?.status; const errorStatus = getErrorStatus(error);
const errorData = error?.response?.data;
if (isImmutableReleaseAssetUploadFailure(error)) { if (isImmutableReleaseAssetUploadFailure(error)) {
throw new Error(immutableReleaseAssetUploadMessage(name, config.input_prerelease)); throw new Error(immutableReleaseAssetUploadMessage(name, config.input_prerelease));
@@ -548,7 +581,7 @@ export const upload = async (
if ( if (
config.input_overwrite_files !== false && config.input_overwrite_files !== false &&
errorStatus === 422 && errorStatus === 422 &&
errorData?.errors?.[0]?.code === 'already_exists' && hasValidationErrorCode(error, 'already_exists') &&
releaseId !== undefined releaseId !== undefined
) { ) {
console.log( console.log(
@@ -603,7 +636,7 @@ export const release = async (
try { try {
_release = await findTagFromReleases(releaser, owner, repo, tag, maxRetries); _release = await findTagFromReleases(releaser, owner, repo, tag, maxRetries);
} catch (error) { } catch (error) {
if (error.status === 404) { if (getErrorStatus(error) === 404) {
const diagnostic = releaseLookup404Message(owner, repo, error); const diagnostic = releaseLookup404Message(owner, repo, error);
console.log(`⚠️ ${diagnostic}`); console.log(`⚠️ ${diagnostic}`);
throw new ReleaseAccessError(diagnostic, error); throw new ReleaseAccessError(diagnostic, error);
@@ -689,7 +722,7 @@ export const release = async (
if (error instanceof ReleaseCreationError) { if (error instanceof ReleaseCreationError) {
throw error; throw error;
} }
if (error.status !== 404) { if (getErrorStatus(error) !== 404) {
console.log( console.log(
`⚠️ Unexpected error fetching GitHub release for tag ${config.github_ref}: ${error}`, `⚠️ Unexpected error fetching GitHub release for tag ${config.github_ref}: ${error}`,
); );
@@ -840,7 +873,7 @@ export async function findTagFromReleases(
const { data: release } = await releaser.getReleaseByTag({ owner, repo, tag }); const { data: release } = await releaser.getReleaseByTag({ owner, repo, tag });
return release; return release;
} catch (error) { } catch (error) {
if (error.status !== 404) { if (getErrorStatus(error) !== 404) {
throw error; throw error;
} }
} }
@@ -1058,15 +1091,12 @@ async function createRelease(
created: canonicalRelease.id === createdRelease.data.id, created: canonicalRelease.id === createdRelease.data.id,
}; };
} catch (error: unknown) { } catch (error: unknown) {
const githubError = error as { const errorStatus = getErrorStatus(error);
status?: number;
response?: { data?: { errors?: Array<{ code?: string }> } };
};
// presume a race with competing matrix runs // presume a race with competing matrix runs
console.log(`⚠️ GitHub release failed with status: ${githubError.status}`); console.log(`⚠️ GitHub release failed with status: ${errorStatus}`);
console.log(errorMessage(error)); console.log(errorMessage(error));
switch (githubError.status) { switch (errorStatus) {
case 403: case 403:
console.log( console.log(
'Skip retry — your GitHub token/PAT does not have the required permission to create a release', 'Skip retry — your GitHub token/PAT does not have the required permission to create a release',
@@ -1080,8 +1110,7 @@ async function createRelease(
case 422: case 422:
// Check if this is a race condition with "already_exists" error // Check if this is a race condition with "already_exists" error
const errorData = githubError.response?.data; if (hasValidationErrorCode(error, 'already_exists')) {
if (errorData?.errors?.[0]?.code === 'already_exists') {
console.log( console.log(
'⚠️ Release already exists (race condition detected), retrying to find and update existing release...', '⚠️ Release already exists (race condition detected), retrying to find and update existing release...',
); );
@@ -1098,16 +1127,17 @@ async function createRelease(
} }
} }
function isTagCreationBlockedError(error: any): boolean { function isTagCreationBlockedError(error: unknown): boolean {
const errors = error?.response?.data?.errors; if (getErrorStatus(error) !== 422) {
if (!Array.isArray(errors) || error?.status !== 422) {
return false; return false;
} }
return errors.some( return getValidationErrors(error).some((validationError) => {
({ field, message }: { field?: string; message?: string }) => const errorRecord = asRecord(validationError);
field === 'pre_receive' && return (
typeof message === 'string' && errorRecord?.field === 'pre_receive' &&
message.includes('creations being restricted'), typeof errorRecord.message === 'string' &&
errorRecord.message.includes('creations being restricted')
); );
});
} }
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"compilerOptions": { "compilerOptions": {
"useUnknownInCatchVariables": false, "useUnknownInCatchVariables": true,
/* Basic Options */ /* Basic Options */
// "incremental": true, /* Enable incremental compilation */ // "incremental": true, /* Enable incremental compilation */
"target": "es2022", "target": "es2022",
+4 -4
View File
@@ -7,10 +7,10 @@ export default defineConfig({
reporter: ['text', 'json-summary', 'lcov'], reporter: ['text', 'json-summary', 'lcov'],
include: ['src/**/*.ts'], include: ['src/**/*.ts'],
thresholds: { thresholds: {
statements: 88, statements: 94,
branches: 83, branches: 90,
functions: 86, functions: 95,
lines: 88, lines: 94,
}, },
}, },
include: ['__tests__/**/*.ts'], include: ['__tests__/**/*.ts'],