From 920a0f1281d1e668f05feea4a49535513011aec0 Mon Sep 17 00:00:00 2001 From: Jim Myhrberg Date: Sat, 15 Aug 2026 19:48:44 +0000 Subject: [PATCH 1/2] ci: automate extension releases --- .github/workflows/ci.yml | 158 +- .github/workflows/semantic-pr.yml | 68 + .vscodeignore | 1 + AGENTS.md | 10 + CHANGELOG.md | 24 +- README.md | 5 +- docs/architecture.md | 27 +- docs/plans/004-semantic-release-automation.md | 431 ++++ docs/releases.md | 88 + docs/testing.md | 9 + eslint.config.mts | 2 +- mise.toml | 12 + package.json | 16 +- pnpm-lock.yaml | 2265 ++++++++++++++++- release.config.mjs | 1 + scripts/lib/checksum.mts | 31 + scripts/lib/package-contract.mts | 85 + scripts/lib/package.mts | 115 + scripts/lib/release-config.mts | 66 + scripts/lib/release.mts | 48 + scripts/package.mts | 32 +- scripts/prepare-release.mts | 25 + scripts/release.mts | 16 + test/manifest.test.mts | 1 + test/package-content.test.mts | 54 +- test/release.test.mts | 256 ++ test/workflows.test.mts | 100 + tsconfig.tooling.json | 1 + 28 files changed, 3843 insertions(+), 104 deletions(-) create mode 100644 .github/workflows/semantic-pr.yml create mode 100644 docs/plans/004-semantic-release-automation.md create mode 100644 docs/releases.md create mode 100644 release.config.mjs create mode 100644 scripts/lib/checksum.mts create mode 100644 scripts/lib/package-contract.mts create mode 100644 scripts/lib/package.mts create mode 100644 scripts/lib/release-config.mts create mode 100644 scripts/lib/release.mts create mode 100644 scripts/prepare-release.mts create mode 100644 scripts/release.mts create mode 100644 test/release.test.mts create mode 100644 test/workflows.test.mts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e345a91..310d81d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,8 +10,8 @@ permissions: contents: read concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true + group: ${{ github.workflow }}-${{ github.event_name == 'push' && github.ref == 'refs/heads/main' && 'main-release' || github.ref }} + cancel-in-progress: ${{ github.event_name == 'pull_request' }} jobs: validate: @@ -114,3 +114,157 @@ jobs: - name: Run web compatibility contract run: mise run test:web:stable + + release: + name: Release + if: github.event_name == 'push' && github.ref == 'refs/heads/main' + needs: + - validate + - desktop-host + - web-host + runs-on: ubuntu-latest + timeout-minutes: 20 + outputs: + released: ${{ steps.semantic-release.outputs.released }} + version: ${{ steps.semantic-release.outputs.version }} + git_tag: ${{ steps.semantic-release.outputs.git_tag }} + vsix_path: ${{ steps.semantic-release.outputs.vsix_path }} + checksum_path: ${{ steps.semantic-release.outputs.checksum_path }} + steps: + - name: Check out complete release history + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + fetch-depth: 0 + persist-credentials: false + + - name: Install locked tools + uses: jdx/mise-action@3c2e0cf82a5b2e5249f0d3635a4d83d0ae861518 # v4.2.5 + with: + install: true + version: '2026.8.4' + + - name: Install locked dependencies + run: mise run setup + + - name: Create release bot token + id: release-token + uses: actions/create-github-app-token@bcd2ba49218906704ab6c1aa796996da409d3eb1 # v3.2.0 + with: + client-id: ${{ vars.RELEASE_BOT_CLIENT_ID }} + private-key: ${{ secrets.RELEASE_BOT_PRIVATE_KEY }} + permission-contents: write + permission-issues: write + + - name: Run Semantic Release + id: semantic-release + env: + GITHUB_TOKEN: ${{ steps.release-token.outputs.token }} + run: mise run release + + - name: Upload immutable release package + if: steps.semantic-release.outputs.released == 'true' + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 + with: + name: release-${{ steps.semantic-release.outputs.version }} + path: artifacts/ + if-no-files-found: error + retention-days: 7 + + publish-vscode: + name: Publish to Visual Studio Marketplace + if: needs.release.outputs.released == 'true' + needs: release + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - name: Check out repository + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false + + - name: Install locked tools + uses: jdx/mise-action@3c2e0cf82a5b2e5249f0d3635a4d83d0ae861518 # v4.2.5 + with: + install: true + version: '2026.8.4' + + - name: Install locked dependencies + run: mise run setup + + - name: Download immutable release package + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: release-${{ needs.release.outputs.version }} + path: artifacts + + - name: Verify and publish VSIX + env: + VERSION: ${{ needs.release.outputs.version }} + VSCE_PAT: ${{ secrets.VSCE_PAT }} + VSIX_PATH: ${{ needs.release.outputs.vsix_path }} + run: | # zizmor: ignore[use-trusted-publishing] PAT publishing + (cd artifacts && sha256sum --check "jimeh.better-markdown-preview-${VERSION}.vsix.sha256") + pnpm exec vsce publish --packagePath "$VSIX_PATH" + + publish-openvsx: + name: Publish to Open VSX + if: needs.release.outputs.released == 'true' + needs: release + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - name: Check out repository + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + with: + persist-credentials: false + + - name: Install locked tools + uses: jdx/mise-action@3c2e0cf82a5b2e5249f0d3635a4d83d0ae861518 # v4.2.5 + with: + install: true + version: '2026.8.4' + + - name: Install locked dependencies + run: mise run setup + + - name: Download immutable release package + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: release-${{ needs.release.outputs.version }} + path: artifacts + + - name: Verify and publish VSIX + env: + OVSX_PAT: ${{ secrets.OVSX_PAT }} + VERSION: ${{ needs.release.outputs.version }} + VSIX_PATH: ${{ needs.release.outputs.vsix_path }} + run: | # zizmor: ignore[use-trusted-publishing] PAT publishing + (cd artifacts && sha256sum --check "jimeh.better-markdown-preview-${VERSION}.vsix.sha256") + pnpm exec ovsx publish "$VSIX_PATH" + + upload-github-release: + name: Attach GitHub Release assets + if: needs.release.outputs.released == 'true' + needs: release + permissions: + contents: write + runs-on: ubuntu-latest + timeout-minutes: 5 + steps: + - name: Download immutable release package + uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 + with: + name: release-${{ needs.release.outputs.version }} + path: artifacts + + - name: Verify and attach release assets + env: + CHECKSUM_PATH: ${{ needs.release.outputs.checksum_path }} + GH_TOKEN: ${{ github.token }} + GIT_TAG: ${{ needs.release.outputs.git_tag }} + VERSION: ${{ needs.release.outputs.version }} + VSIX_PATH: ${{ needs.release.outputs.vsix_path }} + run: | + (cd artifacts && sha256sum --check "jimeh.better-markdown-preview-${VERSION}.vsix.sha256") + gh release view "$GIT_TAG" + gh release upload "$GIT_TAG" "$VSIX_PATH" "$CHECKSUM_PATH" --clobber diff --git a/.github/workflows/semantic-pr.yml b/.github/workflows/semantic-pr.yml new file mode 100644 index 0000000..cb51f01 --- /dev/null +++ b/.github/workflows/semantic-pr.yml @@ -0,0 +1,68 @@ +name: semantic-pr + +on: # zizmor: ignore[dangerous-triggers] metadata-only PR title check + # No checkout or untrusted code execution. + pull_request_target: + types: + - opened + - edited + - reopened + - synchronize + +permissions: + pull-requests: write + +concurrency: + group: semantic-pr-${{ github.event.pull_request.number }} + cancel-in-progress: true + +jobs: + validate-title: + name: Validate PR title + runs-on: ubuntu-latest + timeout-minutes: 5 + steps: + - id: lint_pr_title + uses: amannn/action-semantic-pull-request@48f256284bd46cdaab1048c3721360e808335d50 # v6.1.1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + types: | + build + chore + ci + docs + feat + fix + perf + refactor + revert + style + test + subjectPattern: ^(?![A-Z]).+$ + subjectPatternError: The subject must start with a lowercase character. + + - name: Comment on invalid PR title + if: always() && (steps.lint_pr_title.outputs.error_message != null) + uses: marocchino/sticky-pull-request-comment@5770ad5eb8f42dd2c4f34da00c94c5381e49af88 # v3.0.5 + with: + header: pr-title-lint-error + message: | + Hey there and thank you for opening this pull request! + + We require pull request titles to follow the + [Conventional Commits specification](https://www.conventionalcommits.org/en/v1.0.0/) + and it looks like your proposed title needs to be adjusted. + + Details: + + ``` + ${{ steps.lint_pr_title.outputs.error_message }} + ``` + + - name: Remove PR title lint comment + if: ${{ steps.lint_pr_title.outputs.error_message == null }} + uses: marocchino/sticky-pull-request-comment@5770ad5eb8f42dd2c4f34da00c94c5381e49af88 # v3.0.5 + with: + header: pr-title-lint-error + delete: true diff --git a/.vscodeignore b/.vscodeignore index 318faf7..00fbb8c 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -25,6 +25,7 @@ mise.lock mise.toml pnpm-lock.yaml pnpm-workspace.yaml +release.config.mjs vsc-extension-quickstart.md **/tsconfig.json **/tsconfig.*.json diff --git a/AGENTS.md b/AGENTS.md index 3c406c4..f01cd0e 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -98,6 +98,16 @@ VSCE accepts only `ui` and `workspace` in `extensionKind`. Web-host eligibility comes from the manifest's `browser` entry point; do not add a synthetic `web` extension kind. +`@semantic-release/release-notes-generator` 14.1.1 is compatible with +`conventional-changelog-conventionalcommits` 9.3.1. Version 10 uses a newer +writer contract and silently produced release headings without commit entries; +retain the executable release-notes contract when upgrading either package. + +VSCE's positional package version calls `npm version` unless both +`--no-git-tag-version` and `--no-update-package-json` are supplied. Release +packaging must keep those flags because Semantic Release has already modified +the transient changelog and the tracked manifest must stay at `0.0.0`. + GitHub Actions must declare restricted permissions and pin every action to a full commit SHA. `mise run ci:workflows` enforces syntax, security posture, and pin freshness. diff --git a/CHANGELOG.md b/CHANGELOG.md index b08d88b..bb178bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,24 +1,4 @@ # Changelog -All notable changes to Better Markdown Preview will be documented here. - -## [Unreleased] - -- Scaffold the behavior-free desktop and web extension foundation. -- Add the repository validation, test, packaging, and CI harness. -- Enhance the built-in Markdown preview with GFM, alerts, footnotes, definition - lists, TOML frontmatter, responsive columns, and local Mermaid diagrams. -- Add a theme-aware document layout, responsive table of contents, and rich - native-highlighted code-fence presentation. -- Support the desktop Extension Host and a browser-compatible web bundle with - focused parser, DOM lifecycle, Extension Host, and packaged-artifact - validation. -- Add default-on settings for each optional rendering feature, the table of - contents, smooth navigation, and the Mermaid zoom and pan viewer. -- Animate table-of-contents navigation while respecting reduced-motion - preferences, and soften the Mermaid viewer backdrop. -- Compact list indentation, align task checkboxes with ordinary list markers, - remove the rectangular ToC focus treatment, and match the mobile ToC backdrop - to the Mermaid viewer. -- Render TOML and YAML frontmatter as expanded, collapsible, - syntax-highlighted code without delimiter lines. +Release history is available in +[GitHub Releases](https://github.com/jimeh/vscode-better-markdown-preview/releases). diff --git a/README.md b/README.md index 31f7db1..ba8f4ab 100644 --- a/README.md +++ b/README.md @@ -125,10 +125,13 @@ are: - `mise run test:web:stable` exercises stable VS Code for the Web in Chromium after `mise run test:hosts:prepare`. - `mise run package:validate` builds and inspects the VSIX. +- `mise run release:check` exercises versioning, notes, outputs, and workflow + contracts without publishing. - `mise run verify` runs the intended-final-head local gate. See [Architecture](docs/architecture.md) and [Testing](docs/testing.md) for the -contracts those commands enforce. +contracts those commands enforce. See [Releases](docs/releases.md) for the +automated versioning, publication, and recovery contract. ## License diff --git a/docs/architecture.md b/docs/architecture.md index 3f6d241..acd38cf 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -110,10 +110,26 @@ explicit ESM `.mts` files. Node 24 executes these files through native type stripping, while `tsconfig.tooling.json` independently applies strict NodeNext, no-emit checking and restricts the files to erasable TypeScript syntax. -`.vscode-test.mjs` is the sole JavaScript compatibility exception because -`@vscode/test-cli` 0.0.15 discovers `.json`, `.js`, `.cjs`, and `.mjs` configs -but not `.mts`. Reusable version and invocation logic remains in checked `.mts` -helpers rather than the compatibility file. +JavaScript compatibility files are kept as thin discovery shims when an +external tool cannot discover `.mts`. `@vscode/test-cli` 0.0.15 discovers +`.vscode-test.mjs`, while Semantic Release discovers `release.config.mjs`. +Reusable host and release policy remains in strictly checked `.mts` helpers +rather than either compatibility file. + +## Release Boundary + +The tracked extension version is the development placeholder `0.0.0`. +Semantic Release owns version selection from squash commit messages and passes +the selected version to the repository's VSCE packaging helper; it does not +edit or commit the manifest. Release preparation runs after all source and host +gates, injects the version only into the VSIX, checks the complete archive and +transient current-release changelog, and produces a SHA-256 file. + +Visual Studio Marketplace, Open VSX, and GitHub Release publication are +independent consumers of that one immutable artifact. Publisher jobs never +rebuild it and receive only their own credential. GitHub Releases are the +cumulative changelog authority; see [Releases](releases.md) for operational +policy and recovery. ## Public Contracts @@ -128,3 +144,6 @@ and shipped artifacts describe the current implementation. The rendering contract is recorded in `docs/plans/002-renderer-implementation.md`. + +The automated release contract is recorded in +`docs/plans/004-semantic-release-automation.md`. diff --git a/docs/plans/004-semantic-release-automation.md b/docs/plans/004-semantic-release-automation.md new file mode 100644 index 0000000..978bfb9 --- /dev/null +++ b/docs/plans/004-semantic-release-automation.md @@ -0,0 +1,431 @@ +# Semantic Release Automation Plan + +## Objective + +Make every release-worthy commit that lands in `main` eligible for an +unattended release after the repository's complete CI contract passes. Derive +the version and release notes from Conventional Commits, produce one validated +VSIX, and publish that exact artifact to the Visual Studio Marketplace, Open +VSX, and the corresponding GitHub Release. + +The initial automated release will be `v1.0.0`. The workflow must require no +release pull request, manual version selection, or routine maintainer action. + +Canonical references: + +- [Semantic Release](https://github.com/semantic-release/semantic-release) +- [Semantic Release GitHub Actions guidance](https://semantic-release.gitbook.io/semantic-release/recipes/ci-configurations/github-actions) +- [vscode-actionlint publication workflow](https://github.com/jimeh/vscode-actionlint/blob/main/.github/workflows/ci.yml) +- [vscode-glaze publication workflow](https://github.com/jimeh/vscode-glaze/blob/main/.github/workflows/ci.yml) +- [tmux-chroma semantic PR workflow](https://github.com/jimeh/tmux-chroma/blob/main/.github/workflows/semantic-pr.yml) +- [Hucode semantic PR workflow](https://github.com/jimeh/hucode/blob/main/.github/workflows/semantic-pr.yml) + +## Settled Decisions + +- Use the `semantic-release` package, not Release Please. Releases happen from + `main` without a release PR. +- Run Semantic Release only after the exact pushed revision passes validation, + the desktop engine-floor and stable host contracts, and the stable web-host + contract. +- Allow the first untagged release to use Semantic Release's native `v1.0.0` + bootstrap. Do not create a synthetic baseline tag. +- Treat Git tags, GitHub Releases, and marketplace versions as the published + version sources of truth. Do not commit release versions back into + `package.json`. +- Do not push generated release commits into `main`. In particular, do not use + `@semantic-release/git` or `@semantic-release/npm`. +- Replace the current hand-authored changelog with a release-managed shell. + Generate the current release's changelog in the release workspace before + packaging, but do not commit it. GitHub Releases provide the cumulative + historical record. +- Build one VSIX, validate it, checksum it, and fan out that exact artifact to + all three publication targets. +- Keep publication targets independently retryable and restrict each job to the + minimum credentials it needs. +- Use the repository's GitHub App for tag and GitHub Release creation through + `RELEASE_BOT_CLIENT_ID` and `RELEASE_BOT_PRIVATE_KEY`. +- Use a separate semantic pull-request-title workflow. It is metadata-only, + executes no pull-request code, and gives actionable sticky feedback. +- `docs` commits are release-worthy patch changes and appear in release notes. +- Require squash merging with the validated PR title as the squash commit + title, so the commit analyzed on `main` has the same semantic contract that + passed PR validation. +- Keep pull-request CI cancelable, but serialize `main` workflows and never + cancel an in-progress release. + +## Release Semantics + +The release analyzer and PR-title validator must accept the same Conventional +Commit vocabulary: + +- `feat`: minor release. +- `fix`, `perf`, and `revert`: patch release. +- `docs`: patch release and visible `Documentation` release-note section. +- Any accepted type carrying `!` or a `BREAKING CHANGE:` footer: major release. +- `build`, `chore`, `ci`, `refactor`, `style`, and `test`: accepted but not + release-worthy unless they carry a breaking-change marker. + +Scopes remain optional and unconstrained. The subject must not start with an +uppercase letter. Runtime dependency changes that should reach users must use a +release-worthy title such as `fix(deps): ...`; development-only dependency work +may remain `chore(deps-dev): ...`. + +The release-notes configuration must explicitly keep documentation visible +while hiding non-user-facing maintenance sections. Do not assume the +`conventionalcommits` preset's default presentation: its default documentation +section is hidden. + +## End-to-End Workflow + +```mermaid +flowchart TD + A[Pull request] --> B[Semantic PR title check] + A --> C[Pull request CI] + B --> D[Squash merge using PR title] + C --> D + D --> E[main push CI] + E --> F[Validate and prepare hosts] + F --> G[Desktop floor and stable] + F --> H[Web stable] + G --> I[Semantic Release] + H --> I + I -->|no release-worthy commits| J[Successful no-op] + I -->|new release| K[Versioned VSIX plus SHA-256] + K --> L[Actions artifact] + K --> M[Git tag and GitHub Release] + L --> N[VS Marketplace] + L --> O[Open VSX] + L --> P[GitHub Release assets] +``` + +### Main and pull-request CI + +- Preserve the existing `validate`, desktop-host matrix, and web-host jobs as + the authoritative source and host compatibility evidence. +- Add a `release` job that runs only for pushes to `main` and needs both host + consumers. Their dependency on `validate` makes the complete graph a release + prerequisite without repeating broad validation. +- Change workflow concurrency so pull-request runs may cancel superseded runs, + while `main` runs sharing the same branch concurrency group queue instead of + canceling one another. +- The release job checks out the event SHA with complete Git history and tags. + It must never replace the tested SHA with a later `main` head. + +### Semantic Release lifecycle + +Add a typed `release.config.mjs` or `release.config.mts` supported by Semantic +Release and the repository's tooling typecheck. Configure: + +- Release branch: `main` only. +- Tag format: `v${version}`. +- `@semantic-release/commit-analyzer` with the Conventional Commits preset and + an explicit `docs` patch rule. +- `@semantic-release/release-notes-generator` with sections matching the + release contract above. +- `@semantic-release/changelog` with `CHANGELOG.md` and an exact + `# Changelog` title. +- `@semantic-release/exec` to call the repository-owned release packaging task + with `${nextRelease.version}`. +- `@semantic-release/github` to create the tag-associated GitHub Release and + publish the generated notes. Disable routine success comments and release + labels; retain a durable failure issue if the App's issue permission is + available. + +Add a small typed runner around Semantic Release's JavaScript API. It must: + +- Return a successful `released=false` result when no release-worthy commits + exist. +- Emit `released`, `version`, and `git_tag` step outputs after a successful + release. +- Fail without fabricating outputs when Semantic Release throws. +- Never print credentials or token-bearing repository URLs. + +Do not add a release action wrapper when the repository-owned runner can expose +the required outputs with less indirection. + +## Changelog Contract + +Replace the existing manually curated `Unreleased` content with: + +```markdown +# Changelog + +Release history is available in +[GitHub Releases](https://github.com/jimeh/vscode-better-markdown-preview/releases). +``` + +The configured title allows `@semantic-release/changelog` to insert release +notes without duplicating the heading. On the first run, Semantic Release has no +prior release tag, so `v1.0.0` notes are generated from the existing +Conventional Commit history. On later runs, the workspace changelog contains +the current release's changes since the previous tag. + +The generated file is deliberately transient: + +- It is included in the validated and published VSIX. +- It is not pushed back to `main`. +- GitHub Releases retain the cumulative release history. +- A later requirement for a committed cumulative changelog must be handled as a + separate design change; do not introduce release commits implicitly. + +## Versioned Packaging Contract + +Keep a valid development placeholder version such as `0.0.0` in the tracked +extension manifest. Extend the repository-owned packaging path rather than +creating a second VSIX builder: + +- `scripts/package.mts` accepts an optional explicit semantic version. +- Normal local packaging uses the tracked development version. +- Release packaging invokes `vsce package --no-dependencies`. +- VSCE receives `--no-git-tag-version` and `--no-update-package-json`, so it + injects the version into the archive without rejecting the transient + changelog or modifying the tracked manifest. +- The release filename is + `jimeh.better-markdown-preview-.vsix`. +- Clear or reject stale matching release artifacts before packaging so a glob + cannot publish an older VSIX. +- Generate + `jimeh.better-markdown-preview-.vsix.sha256` from the final bytes. +- Add discoverable Mise tasks for release preparation and its focused check. + +The release preparation task must build once and then assert: + +- The VSIX exists under the exact expected filename. +- Its embedded `extension/package.json` version equals the calculated release + version. +- Its complete runtime inventory matches the package-content contract. +- Its generated changelog contains the release version and does not contain the + old hand-authored `Unreleased` list. +- The checksum file names the same VSIX and verifies successfully. + +Do not rerun desktop or web host tests after version injection: the exact source +revision already passed those hosts, while the release-specific behavioral +boundary is the produced archive and embedded metadata. + +## Artifact Publication + +Upload the VSIX and checksum together as a short-retention, SHA-bound Actions +artifact after Semantic Release reports `released=true`. Downstream publication +jobs consume only that artifact; they must not rebuild or mutate it. + +Use the fan-out behavior established in vscode-actionlint and vscode-glaze, +implemented as separate jobs so permissions remain narrow: + +### Visual Studio Marketplace + +- Map only `secrets.VSCE_PAT` into the publish step. +- Publish the downloaded VSIX with the locked `@vscode/vsce` tool and + `--packagePath`. +- Keep the command isolated so PAT authentication can later move to Microsoft's + Entra credential flow without redesigning release orchestration. + +### Open VSX + +- Add and lock `ovsx` as a reviewed development dependency. +- Map only `secrets.OVSX_PAT` into the publish step. +- Publish the same downloaded VSIX; do not let `ovsx` repackage the checkout. + +### GitHub Release assets + +- Grant `contents: write` only to this job. +- Upload the VSIX and checksum to the exact tag emitted by Semantic Release. +- Fail if the tag or GitHub Release is missing instead of creating an unrelated + fallback release. + +Set no marketplace secrets at workflow or job scope where another target could +inherit them. All three targets must fail visibly and independently. + +## GitHub App Authentication + +Create a repository-scoped installation token immediately before Semantic +Release using the SHA-pinned official `actions/create-github-app-token` action: + +- Client ID: `${{ vars.RELEASE_BOT_CLIENT_ID }}`. +- Private key: `${{ secrets.RELEASE_BOT_PRIVATE_KEY }}`. +- Required repository permission: Metadata read and Contents write. +- Optional repository permission: Issues write, solely for durable release + failure issues. + +Pass the installation token to Semantic Release without persisting checkout +credentials. No branch write or ruleset bypass is needed because the workflow +does not create a release commit. + +## Semantic Pull-Request Workflow + +Add `.github/workflows/semantic-pr.yml` using the current conventions shared by +the user's repositories: + +- Event: `pull_request_target` with `opened`, `edited`, `reopened`, and + `synchronize` activity types. +- Document the `zizmor` dangerous-trigger exception as a metadata-only check. +- Do not check out the repository or execute pull-request-controlled code. +- Permission: `pull-requests: write` only. +- Timeout: five minutes. +- Pin `amannn/action-semantic-pull-request` v6.1.1 to + `48f256284bd46cdaab1048c3721360e808335d50`. +- Pin `marocchino/sticky-pull-request-comment` v3.0.5 to + `5770ad5eb8f42dd2c4f34da00c94c5381e49af88`. +- Configure the complete accepted type list explicitly rather than inheriting + action defaults. +- Enforce a subject that does not start with an uppercase letter. +- Post a sticky Conventional Commit explanation plus the validator's exact + error when invalid. +- Delete that sticky comment after the title becomes valid. +- Give the job the stable display name `Validate PR title` for use as a required + repository check. +- Add workflow-level concurrency keyed by pull-request number and cancel stale + title-check runs. + +The semantic workflow accepts maintenance types even when they do not create a +release. Its responsibility is syntactic validity; the Semantic Release config +owns release impact. + +## Repository Settings + +The current repository permits squash merges, merge commits, and rebases, and +its squash-title setting may use the original commit title. Those settings must +be tightened separately from the code change: + +- Allow squash merging only. +- Set the squash commit title to `PR_TITLE`. +- Use the PR body as the squash message if `BREAKING CHANGE:` footers should be + preserved; `type!:` titles remain the simplest breaking-change signal. +- Add a `main` ruleset that requires pull requests and the existing CI checks. +- Require the stable `Validate PR title` check. +- Record the exact emitted CI check names from a real pull-request run before + making them required, especially matrix-expanded host names. +- Consider a `v*` tag ruleset that prevents tag updates and deletion while + allowing the release GitHub App to create tags. + +Repository rules must be applied only after the new workflows have produced +their first successful checks, avoiding an impossible required-check state. + +## Failure Recovery + +- No release-worthy commits: Semantic Release exits successfully, produces no + tag or release, and all publish jobs skip. +- Validation or host failure: the release job does not run. +- Release preparation failure: no tag or marketplace publication occurs. +- Semantic Release failure after tagging: surface the failed job and durable + failure issue; diagnose the existing tag/release before retrying rather than + forcing a new version. +- One publication target fails: use GitHub's **Re-run failed jobs** operation so + successful targets are not republished and the original Actions artifact and + release outputs remain bound to the same workflow attempt. +- Do not use **Re-run all jobs** as registry recovery after a tag exists; + Semantic Release will correctly see no new release and downstream outputs + will not describe the existing one. +- A manual publication recovery command must always use the existing GitHub + Release asset and verify its checksum before publishing. It must never rebuild + the tagged source opportunistically. +- Keep the Actions artifact long enough for ordinary transient-registry retry, + and document the retention duration in release operations guidance. + +Publication across three external services cannot be transactional. The design +therefore optimizes for one immutable input, visible partial failure, and +independent retry rather than pretending all destinations can commit atomically. + +## Verification Strategy + +### Focused automated contracts + +- Import or inspect the release configuration and assert: + - only `main` is a release branch; + - tags use `v${version}`; + - `docs` yields a patch release; + - `feat` yields minor, `fix` yields patch, and a breaking marker yields major; + - maintenance-only commits yield no release; and + - documentation appears in generated notes while hidden maintenance types do + not. +- Exercise release packaging with a representative version such as `1.2.3` and + confirm that exact version appears in the filename, embedded manifest, + generated changelog, and checksum reference. +- Confirm the package-content test ran by name and still checks the full runtime + archive rather than only the newly added release metadata. +- Add Node contract coverage for release-runner outputs on release and no-op + results without invoking external publication. +- Validate semantic PR workflow triggers, permissions, action pins, explicit + types, lowercase-subject policy, comment cleanup, and absence of checkout. + +### Repository gates + +- Run formatting, lint, tooling/product/host-runner typechecks, focused tests, + package validation, and `mise run ci:workflows` during implementation. +- Run `mise run verify` on the intended final head. +- Confirm `actionlint`, `zizmor`, and `pinact` accept both workflows and every + action remains pinned to a full commit SHA. +- Confirm the working tree contains no generated release artifact after normal + cleanup and all output paths remain ignored. + +### First-release evidence + +After the setup change lands and `main` CI passes, observe the unattended first +release through completion: + +- Semantic Release selects `1.0.0` from the untagged history. +- `v1.0.0` points at the exact tested source revision. +- GitHub Release notes and the packaged changelog reflect existing release-worthy + commit history, including documentation. +- The GitHub Release contains the VSIX and checksum. +- The checksum matches the uploaded VSIX. +- Visual Studio Marketplace and Open VSX both report version `1.0.0`. +- The workflow concludes successfully with no release commit pushed to `main`. + +The first live publication is necessary integration evidence because PR CI must +not exercise real marketplace credentials or publish disposable versions. + +## Closure Matrix + +| Observable or risk | Evidence | +| --- | --- | +| Invalid PR titles cannot satisfy policy | Semantic PR workflow fixtures and real required check | +| Validated title reaches `main` unchanged | Squash-only repository setting with `PR_TITLE` | +| Documentation triggers a release | Commit-analyzer contract for `docs` to patch | +| Documentation appears in notes | Release-note generator contract | +| Maintenance changes remain no-ops | Analyzer no-release fixtures | +| Release waits for the complete source gate | Workflow dependency inspection and a main run | +| Superseding pushes cannot cancel publication | Concurrency contract and workflow-policy test | +| Calculated version reaches the archive | Representative-version VSIX inspection | +| Generated changelog has no old boilerplate | Packaged changelog assertion | +| All targets consume identical bytes | One Actions artifact plus checksum verification | +| Marketplace credentials stay isolated | Step-level environment and job-permission inspection | +| GitHub Release assets are recoverable | VSIX plus checksum attached to emitted tag | +| Workflows meet repository security policy | `mise run ci:workflows` | +| Existing extension behavior remains sound | `mise run verify` on the final head | +| First release is actually available | GitHub, VS Marketplace, and Open VSX version checks | + +## Implementation Order + +1. Add locked Semantic Release, Conventional Changelog, and Open VSX tooling. +2. Add the release configuration and focused semantic/version-note contracts. +3. Replace the changelog body with the GitHub Releases pointer used as the + release-managed heading. +4. Extend packaging for explicit versions, deterministic names, checksum + generation, and embedded-version assertions. +5. Add the typed Semantic Release runner and discoverable Mise tasks. +6. Add the semantic PR workflow and its static contracts. +7. Extend CI with safe main concurrency, gated Semantic Release, artifact + upload, and three independent publication jobs. +8. Update architecture, testing, and contributor-facing release documentation. +9. Run focused checks followed by `mise run verify` on the intended final head. +10. Merge the setup only when the first unattended `v1.0.0` publication is + intended, then observe and verify all three destinations. +11. After successful workflow check names exist, apply the squash and required + check repository settings. + +## Non-goals + +- Release Please, release pull requests, or a manual release approval gate. +- npm registry publication. +- Pre-release branches or Marketplace pre-release channels. +- Maintenance release branches. +- Platform-specific VSIX variants; the extension remains one universal VSIX. +- Committed release-version or changelog-update commits. +- Automatic retry loops that can duplicate a successful external publication. +- Changing extension behavior, preview rendering, VS Code engine support, or + existing test coverage policy. + +## Unresolved Questions + +None. The accepted design makes `docs` release-worthy, starts at `v1.0.0`, uses +transient generated changelogs, and requires squash-only PR-title preservation. diff --git a/docs/releases.md b/docs/releases.md new file mode 100644 index 0000000..25f0419 --- /dev/null +++ b/docs/releases.md @@ -0,0 +1,88 @@ +# Releases + +Every release-worthy squash commit that reaches `main` is released after the +same CI run passes repository validation plus desktop-floor, desktop-stable, +and web-stable host tests. There is no release pull request or manual approval +step. + +## Version and Notes Policy + +Pull request titles become squash commit messages and must follow Conventional +Commits. Semantic Release maps them as follows: + +| Commit | Release | +| --------------------------------------------------- | ------- | +| `feat` | minor | +| `fix`, `perf`, `revert` | patch | +| `docs` | patch | +| `BREAKING CHANGE` or `type!` | major | +| `build`, `chore`, `ci`, `refactor`, `style`, `test` | none | + +Breaking changes override the ordinary type. Use `fix(deps)` for runtime +dependency updates that should release and `chore(deps-dev)` for development +dependency updates that should not. + +The tracked `package.json` stays at the valid development placeholder `0.0.0`. +Semantic Release calculates the real version and passes it directly to VSCE, +so the packaged extension manifest contains the released version. + +The tracked changelog is an honest pointer to GitHub Releases. During release, +Semantic Release temporarily prepends the current release notes before building +the VSIX. The published VSIX therefore contains the current release entry plus +the GitHub Releases link; cumulative history lives in GitHub Releases. The +temporary changelog and version are not committed back to `main`. + +With no prior `v*` tag, the first successful release is `v1.0.0` and its notes +cover the existing release-worthy Conventional Commit history. + +## Publication Flow + +The release job builds and validates one +`jimeh.better-markdown-preview-.vsix`, then creates its SHA-256 file. +Semantic Release creates the tag and GitHub Release. A seven-day Actions +artifact carries the immutable pair to three independent jobs: + +- Visual Studio Marketplace, authenticated only with `VSCE_PAT`. +- Open VSX, authenticated only with `OVSX_PAT`. +- The matching GitHub Release, using the workflow token to attach both files. + +Each consumer verifies the checksum before publishing and never rebuilds the +VSIX. + +## Required Repository Configuration + +Before merging the release setup, confirm the GitHub App identified by +`RELEASE_BOT_CLIENT_ID` and `RELEASE_BOT_PRIVATE_KEY` is installed on this +repository with Metadata read, Contents write, and Issues write permissions. +Issues write is used only for Semantic Release's durable failure report. + +Configure GitHub pull requests to allow squash merges only and set the default +squash commit title to **Pull request title**. This preserves the title already +validated by the `Validate PR title` check as the commit Semantic Release reads. + +After the new workflows have run once and their check names exist, protect +`main` and require: + +- `Validate PR title` +- `Validate and prepare hosts` +- `Desktop host (1.125.0 floor)` +- `Desktop host (stable)` +- `Web host (stable Chromium)` + +The release and publication jobs are post-merge effects, so they are not branch +protection requirements. + +## Failure Recovery + +If a publisher fails after the GitHub Release exists, use **Re-run failed +jobs**. Do not re-run all jobs: Semantic Release will correctly treat the +existing tag as already released, leaving no new release outputs for the +publisher jobs. + +For manual recovery after the seven-day Actions artifact expires, download the +VSIX and checksum from the existing GitHub Release, verify the checksum, and +publish that exact VSIX. Never rebuild a tagged release for one destination. + +If the release job fails after creating a tag, inspect the existing tag and +GitHub Release before retrying. Do not delete or move a published tag merely to +force another Semantic Release run. diff --git a/docs/testing.md b/docs/testing.md index def21ae..b7f4431 100644 --- a/docs/testing.md +++ b/docs/testing.md @@ -18,6 +18,8 @@ Use the narrowest task that proves the behavior under development: stable VS Code for the Web under headless Chromium. - `mise run package:validate` produces a VSIX and asserts its exact runtime contents. +- `mise run release:check` exercises semantic version selection, release-note + visibility, runner outputs, and workflow orchestration without publishing. - `mise run ci:workflows` validates workflow syntax, security, and action pins. `mise run check` is the fast handoff gate: formatting, lint, all TypeScript @@ -110,3 +112,10 @@ artifacts, and run their narrow compatibility consumer. This gives clean-environment evidence for the pushed revision without running the complete repository gate in every host job. + +On a `main` push, Semantic Release runs only after all three host jobs pass. +Release preparation then supplies the calculated version to VSCE, reuses the +exact package inventory contract, checks the generated current-release +changelog, and verifies the checksum. Publication jobs download that one +revision-bound artifact and independently publish it to both extension +registries and the matching GitHub Release. diff --git a/eslint.config.mts b/eslint.config.mts index bfc7a71..8b8165e 100644 --- a/eslint.config.mts +++ b/eslint.config.mts @@ -15,7 +15,7 @@ export default [ ], }, { - files: ['.vscode-test.mjs'], + files: ['.vscode-test.mjs', 'release.config.mjs'], languageOptions: { ecmaVersion: 2022, globals: globals.node, diff --git a/mise.toml b/mise.toml index 8cf796d..f89d0fe 100644 --- a/mise.toml +++ b/mise.toml @@ -103,6 +103,18 @@ run = "pnpm run package" description = "Package and inspect the VSIX contents" run = ["mise run package", "pnpm run test:package"] +[tasks."release:check"] +description = "Check semantic versioning, release output, and workflow contracts" +run = "node --test test/release.test.mts test/workflows.test.mts" + +[tasks."release:package"] +description = "Build and verify the versioned VSIX and checksum for Semantic Release" +run = "pnpm run release:package" + +[tasks.release] +description = "Run Semantic Release for the current CI revision" +run = "pnpm run release" + [tasks."ci:workflows"] description = "Check workflow syntax, security, and action pins" run = ["actionlint", "zizmor --offline .", "pinact run --check"] diff --git a/package.json b/package.json index 3f924c7..2a44999 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "better-markdown-preview", "displayName": "Better Markdown Preview", "description": "A better, theme-aware Markdown preview for Visual Studio Code.", - "version": "0.0.1", + "version": "0.0.0", "publisher": "jimeh", "license": "MIT", "repository": { @@ -140,7 +140,7 @@ "typecheck:web-tests": "tsc --noEmit --project tsconfig.web-tests.json", "typecheck:tooling": "tsc --noEmit --project tsconfig.tooling.json", "test": "pnpm run test:contracts && pnpm run test:unit", - "test:contracts": "node --test test/commands.test.mts test/harness.test.mts test/manifest.test.mts test/presentation.test.mts", + "test:contracts": "node --test test/commands.test.mts test/harness.test.mts test/manifest.test.mts test/presentation.test.mts test/release.test.mts test/workflows.test.mts", "test:unit": "vitest run", "test:coverage": "vitest run --coverage", "build:host-runners": "pnpm run compile-tests && node esbuild.mts --target=web-test", @@ -150,12 +150,19 @@ "test:web:stable": "node scripts/run-web-tests.mts", "test:extension": "pnpm run test:hosts:prepare && pnpm run test:desktop:floor && pnpm run test:desktop:stable", "test:package": "node --test test/package-content.test.mts", - "package": "node scripts/package.mts" + "package": "node scripts/package.mts", + "release": "node scripts/release.mts", + "release:package": "node scripts/prepare-release.mts" }, "packageManager": "pnpm@11.21.0", "devDependencies": { "@eslint/js": "^10.0.1", "@resvg/resvg-js": "^2.6.2", + "@semantic-release/changelog": "7.0.0", + "@semantic-release/commit-analyzer": "13.0.1", + "@semantic-release/exec": "7.1.0", + "@semantic-release/github": "12.0.9", + "@semantic-release/release-notes-generator": "14.1.1", "@types/markdown-it": "14.1.2", "@types/markdown-it-footnote": "3.0.4", "@types/mocha": "^10.0.10", @@ -166,6 +173,7 @@ "@vscode/test-electron": "^3.1.0", "@vscode/test-web": "0.0.81", "@vscode/vsce": "^3.9.2", + "conventional-changelog-conventionalcommits": "9.3.1", "esbuild": "^0.28.2", "eslint": "^10.8.1", "fflate": "^0.8.3", @@ -175,7 +183,9 @@ "markdown-it": "14.3.0", "markdownlint-cli2": "0.23.2", "npm-run-all": "^4.1.5", + "ovsx": "1.1.1", "prettier": "^3.9.6", + "semantic-release": "25.0.9", "typescript": "^6.0.3", "typescript-eslint": "^8.67.0", "vitest": "4.1.10" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f7f5fde..dffbfae 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -41,6 +41,21 @@ importers: '@resvg/resvg-js': specifier: ^2.6.2 version: 2.6.2 + '@semantic-release/changelog': + specifier: 7.0.0 + version: 7.0.0(semantic-release@25.0.9(supports-color@8.1.1)(typescript@6.0.3)) + '@semantic-release/commit-analyzer': + specifier: 13.0.1 + version: 13.0.1(semantic-release@25.0.9(supports-color@8.1.1)(typescript@6.0.3))(supports-color@8.1.1) + '@semantic-release/exec': + specifier: 7.1.0 + version: 7.1.0(semantic-release@25.0.9(supports-color@8.1.1)(typescript@6.0.3))(supports-color@8.1.1) + '@semantic-release/github': + specifier: 12.0.9 + version: 12.0.9(semantic-release@25.0.9(supports-color@8.1.1)(typescript@6.0.3))(supports-color@8.1.1) + '@semantic-release/release-notes-generator': + specifier: 14.1.1 + version: 14.1.1(semantic-release@25.0.9(supports-color@8.1.1)(typescript@6.0.3))(supports-color@8.1.1) '@types/markdown-it': specifier: 14.1.2 version: 14.1.2 @@ -71,6 +86,9 @@ importers: '@vscode/vsce': specifier: ^3.9.2 version: 3.9.2(supports-color@8.1.1) + conventional-changelog-conventionalcommits: + specifier: 9.3.1 + version: 9.3.1 esbuild: specifier: ^0.28.2 version: 0.28.2 @@ -98,9 +116,15 @@ importers: npm-run-all: specifier: ^4.1.5 version: 4.1.5 + ovsx: + specifier: 1.1.1 + version: 1.1.1(@types/node@24.13.3)(debug@4.4.3(supports-color@8.1.1))(supports-color@8.1.1) prettier: specifier: ^3.9.6 version: 3.9.6 + semantic-release: + specifier: 25.0.9 + version: 25.0.9(supports-color@8.1.1)(typescript@6.0.3) typescript: specifier: ^6.0.3 version: 6.0.3 @@ -113,6 +137,18 @@ importers: packages: + '@actions/core@3.0.1': + resolution: {integrity: sha512-a6d/Nwahm9fliVGRhdhofo40HjHQasUPusmc7vBfyky+7Z+P2A1J68zyFVaNcEclc/Se+eO595oAr5nwEIoIUA==} + + '@actions/exec@3.0.0': + resolution: {integrity: sha512-6xH/puSoNBXb72VPlZVm7vQ+svQpFyA96qdDBvhB8eNZOE8LtPf9L4oAsfzK/crCL8YZ+19fKYVnM63Sl+Xzlw==} + + '@actions/http-client@4.0.1': + resolution: {integrity: sha512-+Nvd1ImaOZBSoPbsUtEhv+1z99H12xzncCkz0a3RuehINE81FZSe2QTj3uvAPTcJX/SCzUQHQ0D1GrPMbrPitg==} + + '@actions/io@3.0.2': + resolution: {integrity: sha512-nRBchcMM+QK1pdjO7/idu86rbJI5YHUKCvKs0KxnSYbVe3F51UfGxuZX4Qy/fWlp6l7gWFwIkrOzN+oUK03kfw==} + '@antfu/install-pkg@1.1.0': resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} @@ -197,6 +233,19 @@ packages: '@chevrotain/types@11.1.2': resolution: {integrity: sha512-U+HFai5+zmJCkK86QsaJtoITlboZHBqrVketcO2ROv865xfCMSFpELQoz1GkX5GzME8pTa+3kbKrZHQtI0gdbw==} + '@colors/colors@1.5.0': + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} + + '@emnapi/core@1.11.3': + resolution: {integrity: sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg==} + + '@emnapi/runtime@1.11.3': + resolution: {integrity: sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==} + + '@emnapi/wasi-threads@1.2.3': + resolution: {integrity: sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g==} + '@esbuild/aix-ppc64@0.28.2': resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==} engines: {node: '>=18'} @@ -418,6 +467,140 @@ packages: '@iconify/utils@3.1.4': resolution: {integrity: sha512-b1S7B1k9ohZ+iNTi2ATxbRYG9fTrJmUT0rc46bvVnNxqNRGW7dyo/vRREwyniI5IRN2RSJHDcm+s3BjWrSAjHw==} + '@inquirer/ansi@1.0.2': + resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==} + engines: {node: '>=18'} + + '@inquirer/checkbox@4.3.2': + resolution: {integrity: sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/confirm@5.1.21': + resolution: {integrity: sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/core@10.3.2': + resolution: {integrity: sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/editor@4.2.23': + resolution: {integrity: sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/expand@4.0.23': + resolution: {integrity: sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/external-editor@1.0.3': + resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/figures@1.0.15': + resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==} + engines: {node: '>=18'} + + '@inquirer/input@4.3.1': + resolution: {integrity: sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/number@3.0.23': + resolution: {integrity: sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/password@4.0.23': + resolution: {integrity: sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/prompts@7.10.1': + resolution: {integrity: sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/rawlist@4.1.11': + resolution: {integrity: sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/search@3.2.2': + resolution: {integrity: sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/select@4.4.2': + resolution: {integrity: sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/type@3.0.10': + resolution: {integrity: sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -449,6 +632,181 @@ packages: '@mermaid-js/parser@1.2.0': resolution: {integrity: sha512-oYPyv8A4As1yH5Bx+04iQEQxXuIQDe0GKCNSRgao6z8AM9jixXIfP0vsppRLvGf+nKIOb9/LdpWA4YuJiVvESA==} + '@napi-rs/keyring-darwin-arm64@1.3.0': + resolution: {integrity: sha512-pl76hJvdYUBn6I24bXiOBMA9nbDapo3I5B+f3OorjDU4dUMSypXeKbOVehJe8fhgTiH24flMyTS3aAIy43xegQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@napi-rs/keyring-darwin-x64@1.3.0': + resolution: {integrity: sha512-YcJtEV5LA3cvA4z3BurgxH5IhTsW1JfIvcAAcqcecwk06Si9F9NqkxbZVIfDwQ8oRHgaBmT3zZJnLAotCrVahw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@napi-rs/keyring-freebsd-x64@1.3.0': + resolution: {integrity: sha512-vlLf31TGhfRAaxLDBhg8b89ss0HHD/lyNmL5F3UjSaz5CUXElsJmKYq9fqA/B+cZKUEUcLHHGhF0I/CqcFdaVw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@napi-rs/keyring-linux-arm-gnueabihf@1.3.0': + resolution: {integrity: sha512-KiWdMMu/Inz/bHHIAGrnF7r54FZDYXuHO6UFF/rhIrshUsxbMG1Rl9lEymNtqqsVo927G0VYcb02FzWQ3iBQRQ==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@napi-rs/keyring-linux-arm64-gnu@1.3.0': + resolution: {integrity: sha512-eyKGpY40lm9Jvs1aD294XRH4y7+TlJM0YVAryZeXA6TX0mb4gMkxVXwSQv7MCwgah7raeUd0dKUb4BPAYIgcMg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@napi-rs/keyring-linux-arm64-musl@1.3.0': + resolution: {integrity: sha512-iIK6JWHXAJqDrEyLY3TmswwloVyt2vj+04TZnew+uSJ9gnDO8EwRbp3/iw3LpWaXiDO7VomGO6y8I0Id8uBZSw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@napi-rs/keyring-linux-riscv64-gnu@1.3.0': + resolution: {integrity: sha512-/PGqrwn6EwgtK6vccASSXJRfOSP4vN1F4ASsIQ+7MdrK6hNvAJ1FZPrIuD5gGGdxezo3F++To2Wq7DbuGIeuNQ==} + engines: {node: '>= 10'} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@napi-rs/keyring-linux-x64-gnu@1.3.0': + resolution: {integrity: sha512-2PDK1WKWTu9lBGq9VvNEkSlQD3O7YwVpmnyN2M3cy4v7NJ/8gDMd9GXv3G+FVXN13uhp4gnnPBS+ScefmEeD2A==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@napi-rs/keyring-linux-x64-musl@1.3.0': + resolution: {integrity: sha512-oJ2HkX8YUo46QBkn0pG+HuIKQNqr523q6vBobCn+P95s4C4K6/kLBqHY/1bg5J4ap31DzsznhnFKcfBNBsjCnw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@napi-rs/keyring-win32-arm64-msvc@1.3.0': + resolution: {integrity: sha512-tOd3c/uAaeoE4ycVlmAdSvygz0Zt3zdca6Y7gokBeIbaRDWpjDIUOpU3MvML59XAaqyuKGsVVu0F/DZb1lHPmw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@napi-rs/keyring-win32-ia32-msvc@1.3.0': + resolution: {integrity: sha512-sPSqeAFZMGqP1R++M2JTza7GQJJ/TpCo6JU6Vcd4jnebvOaEDs9b7eipakU1PJdSvhpC2yXMCNRk9gXfrhuwHQ==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@napi-rs/keyring-win32-x64-msvc@1.3.0': + resolution: {integrity: sha512-4DnCWXwDc0HRKwyRlG5y0VhKZW2tNRQfKKfyj6IX/KWfDNyq9hn4n+GL1auyDcOO/v8PwnhmYo2+rOOqCkvvOg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@napi-rs/keyring@1.3.0': + resolution: {integrity: sha512-WrOw/bcXm0f9qHkumlT1QlArXSTWqaY9sunsDpOk+yCCorCKMxvWT/a3xko4EYHVdeZoh00yI2TydXn6eyICDA==} + engines: {node: '>= 10'} + + '@napi-rs/wasm-runtime@0.2.12': + resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} + + '@node-rs/crc32-android-arm-eabi@1.10.6': + resolution: {integrity: sha512-vZAMuJXm3TpWPOkkhxdrofWDv+Q+I2oO7ucLRbXyAPmXFNDhHtBxbO1rk9Qzz+M3eep8ieS4/+jCL1Q0zacNMQ==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + + '@node-rs/crc32-android-arm64@1.10.6': + resolution: {integrity: sha512-Vl/JbjCinCw/H9gEpZveWCMjxjcEChDcDBM8S4hKay5yyoRCUHJPuKr4sjVDBeOm+1nwU3oOm6Ca8dyblwp4/w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@node-rs/crc32-darwin-arm64@1.10.6': + resolution: {integrity: sha512-kARYANp5GnmsQiViA5Qu74weYQ3phOHSYQf0G+U5wB3NB5JmBHnZcOc46Ig21tTypWtdv7u63TaltJQE41noyg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@node-rs/crc32-darwin-x64@1.10.6': + resolution: {integrity: sha512-Q99bevJVMfLTISpkpKBlXgtPUItrvTWKFyiqoKH5IvscZmLV++NH4V13Pa17GTBmv9n18OwzgQY4/SRq6PQNVA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@node-rs/crc32-freebsd-x64@1.10.6': + resolution: {integrity: sha512-66hpawbNjrgnS9EDMErta/lpaqOMrL6a6ee+nlI2viduVOmRZWm9Rg9XdGTK/+c4bQLdtC6jOd+Kp4EyGRYkAg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@node-rs/crc32-linux-arm-gnueabihf@1.10.6': + resolution: {integrity: sha512-E8Z0WChH7X6ankbVm8J/Yym19Cq3otx6l4NFPS6JW/cWdjv7iw+Sps2huSug+TBprjbcEA+s4TvEwfDI1KScjg==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@node-rs/crc32-linux-arm64-gnu@1.10.6': + resolution: {integrity: sha512-LmWcfDbqAvypX0bQjQVPmQGazh4dLiVklkgHxpV4P0TcQ1DT86H/SWpMBMs/ncF8DGuCQ05cNyMv1iddUDugoQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@node-rs/crc32-linux-arm64-musl@1.10.6': + resolution: {integrity: sha512-k8ra/bmg0hwRrIEE8JL1p32WfaN9gDlUUpQRWsbxd1WhjqvXea7kKO6K4DwVxyxlPhBS9Gkb5Urq7Y4mXANzaw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@node-rs/crc32-linux-x64-gnu@1.10.6': + resolution: {integrity: sha512-IfjtqcuFK7JrSZ9mlAFhb83xgium30PguvRjIMI45C3FJwu18bnLk1oR619IYb/zetQT82MObgmqfKOtgemEKw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@node-rs/crc32-linux-x64-musl@1.10.6': + resolution: {integrity: sha512-LbFYsA5M9pNunOweSt6uhxenYQF94v3bHDAQRPTQ3rnjn+mK6IC7YTAYoBjvoJP8lVzcvk9hRj8wp4Jyh6Y80g==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [musl] + + '@node-rs/crc32-wasm32-wasi@1.10.6': + resolution: {integrity: sha512-KaejdLgHMPsRaxnM+OG9L9XdWL2TabNx80HLdsCOoX9BVhEkfh39OeahBo8lBmidylKbLGMQoGfIKDjq0YMStw==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@node-rs/crc32-win32-arm64-msvc@1.10.6': + resolution: {integrity: sha512-x50AXiSxn5Ccn+dCjLf1T7ZpdBiV1Sp5aC+H2ijhJO4alwznvXgWbopPRVhbp2nj0i+Gb6kkDUEyU+508KAdGQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@node-rs/crc32-win32-ia32-msvc@1.10.6': + resolution: {integrity: sha512-DpDxQLaErJF9l36aghe1Mx+cOnYLKYo6qVPqPL9ukJ5rAGLtCdU0C+Zoi3gs9ySm8zmbFgazq/LvmsZYU42aBw==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@node-rs/crc32-win32-x64-msvc@1.10.6': + resolution: {integrity: sha512-5B1vXosIIBw1m2Rcnw62IIfH7W9s9f7H7Ma0rRuhT8HR4Xh8QCgw6NJSI2S2MCngsGktYnAhyUvs81b7efTyQw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@node-rs/crc32@1.10.6': + resolution: {integrity: sha512-+llXfqt+UzgoDzT9of5vPQPGqTAVCohU74I9zIBkNo5TH6s2P31DFJOGsJQKN207f0GHnYv5pV3wh3BCY/un/A==} + engines: {node: '>= 10'} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -461,6 +819,60 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@octokit/auth-token@6.0.0': + resolution: {integrity: sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==} + engines: {node: '>= 20'} + + '@octokit/core@7.0.7': + resolution: {integrity: sha512-DcB0M3KFgr9ECI328lhBMVsyFT2DnmNucSBTqEN3exyNKUzkkpUSCHmTRcunF41Eou2TIQKW4seewri8ON9bSA==} + engines: {node: '>= 20'} + + '@octokit/endpoint@11.0.4': + resolution: {integrity: sha512-f1cOWoHPmxryJFknxbtDdjODWfV8A9tc8Aae6ermXPNgHFZ/x91AtHIz4gicEjL8hkJiip+u21QHJORfBv/qiA==} + engines: {node: '>= 20'} + + '@octokit/graphql@9.0.4': + resolution: {integrity: sha512-5s15CCiY8XXQ+FG+b1YQcl6Z2FA++nwAz/tg2VUrTmnMncP+2nnGUEYANImdnxsA2Fnq+Mbl7hDjUTw7cFAwcg==} + engines: {node: '>= 20'} + + '@octokit/openapi-types@27.0.0': + resolution: {integrity: sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA==} + + '@octokit/openapi-types@28.0.0': + resolution: {integrity: sha512-0rFyLuyHvIj6uuZWuDslxkowFYdPXoNIkeAv4b27dzm2Tf4vGWXnPsMcxs7d65kLdMERgP3wc1AEPlqMz8e1cQ==} + + '@octokit/plugin-paginate-rest@14.0.0': + resolution: {integrity: sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw==} + engines: {node: '>= 20'} + peerDependencies: + '@octokit/core': '>=6' + + '@octokit/plugin-retry@8.1.1': + resolution: {integrity: sha512-VCVvZ/R1+u3WuiBWpNavZ0mY4aaJNAsENrpBP9aLSR2QyOpQgd7DhM5j4AW7z4MQpnJYgwBPf0XqPQoNBRdQwg==} + engines: {node: '>= 20'} + peerDependencies: + '@octokit/core': '>=7' + + '@octokit/plugin-throttling@11.0.5': + resolution: {integrity: sha512-LIdrkrUv+DWbKeg/49rGuFJ3SU0d3hUS+B4MhNZLepBoNUFXms8Ic9edJjrlx+zycqJHjrMRudVpVb/bAXM2Lw==} + engines: {node: '>= 20'} + peerDependencies: + '@octokit/core': ^7.0.0 + + '@octokit/request-error@7.1.1': + resolution: {integrity: sha512-+eaY7G2VVpSf2pc5Gn1+mph837V/d/TYTJAgWL9Tb0ogGYcpN3IlAVFgjL+Vv93F/sevrxkvsYCedtpLdcFLzA==} + engines: {node: '>= 20'} + + '@octokit/request@10.0.13': + resolution: {integrity: sha512-v2269YxL9Yf+x3d+gRI63FP0vFQEiWgLyBzxe/Y+0yFDg2B/Tzf5dhh9VNfccVAQnfcfwQWyk/y6Bn7rUXXs7A==} + engines: {node: '>= 20'} + + '@octokit/types@16.0.0': + resolution: {integrity: sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==} + + '@octokit/types@17.0.0': + resolution: {integrity: sha512-ByP1v7YL5SMveFPP7+sj0/ZuWCOOg/Chs4NafOMpq6WNIM/hdGY0S7C0TCGDBWu1aGmOxmUIhMx3cO+IdwYZ1Q==} + '@oxc-project/types@0.142.0': resolution: {integrity: sha512-7W+2q5AKQVU36fkaryontrHn3YDt1RyUYXatw9i5H8ocYe2sPKSFB6eS8WNPeRKiN1qAWWZUPm7gwFzJGrccqQ==} @@ -472,6 +884,18 @@ packages: resolution: {integrity: sha512-DU/t4TSqHvAc+uFMt972forQYqBTh/ul7lZ8U81HYGyxnf6vSPPz9NzuE0OR3x/elqvvGm+n4gcny+QSKT+FDw==} engines: {node: '>=20'} + '@pnpm/config.env-replace@1.1.0': + resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} + engines: {node: '>=12.22.0'} + + '@pnpm/network.ca-file@1.0.2': + resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} + engines: {node: '>=12.22.0'} + + '@pnpm/npm-conf@3.0.3': + resolution: {integrity: sha512-//0sR/cow/s4ICQaYoAobOl4aU8cjU6x/V24V7XkKotb9+O+3zySIYp146vpaobYHnxa4pZX8NkV54Z5AwbDKA==} + engines: {node: '>=12'} + '@resvg/resvg-js-android-arm-eabi@2.6.2': resolution: {integrity: sha512-FrJibrAk6v29eabIPgcTUMPXiEz8ssrAk7TXxsiZzww9UTQ1Z5KAbFJs+Z0Ez+VZTYgnE5IQJqBcoSiMebtPHA==} engines: {node: '>= 10'} @@ -645,6 +1069,9 @@ packages: '@rolldown/pluginutils@1.0.1': resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + '@secretlint/config-creator@10.2.2': resolution: {integrity: sha512-BynOBe7Hn3LJjb3CqCHZjeNB09s/vgf0baBaHVw67w7gHF0d25c3ZsZ5+vv8TgwSchRdUCRrbbcq5i2B1fJ2QQ==} engines: {node: '>=20.0.0'} @@ -690,6 +1117,54 @@ packages: resolution: {integrity: sha512-Nqc90v4lWCXyakD6xNyNACBJNJ0tNCwj2WNk/7ivyacYHxiITVgmLUFXTBOeCdy79iz6HtN9Y31uw/jbLrdOAg==} engines: {node: '>=20.0.0'} + '@semantic-release/changelog@7.0.0': + resolution: {integrity: sha512-TNPyag5db24o7jWjre7UwKB4EcL8oJxbRhnDQ7hmZRAYqzreAc6PgdxQuU3pppp5xQinYtiumL0iG8SSKvnlzg==} + engines: {node: ^22.22.2 || >=24.15} + peerDependencies: + semantic-release: '>=20.1.0' + + '@semantic-release/commit-analyzer@13.0.1': + resolution: {integrity: sha512-wdnBPHKkr9HhNhXOhZD5a2LNl91+hs8CC2vsAVYxtZH3y0dV3wKn+uZSN61rdJQZ8EGxzWB3inWocBHV9+u/CQ==} + engines: {node: '>=20.8.1'} + peerDependencies: + semantic-release: '>=20.1.0' + + '@semantic-release/error@4.0.0': + resolution: {integrity: sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==} + engines: {node: '>=18'} + + '@semantic-release/exec@7.1.0': + resolution: {integrity: sha512-4ycZ2atgEUutspPZ2hxO6z8JoQt4+y/kkHvfZ1cZxgl9WKJId1xPj+UadwInj+gMn2Gsv+fLnbrZ4s+6tK2TFQ==} + engines: {node: '>=20.8.1'} + peerDependencies: + semantic-release: '>=24.1.0' + + '@semantic-release/github@12.0.9': + resolution: {integrity: sha512-ODIqb0V3QqndipryEEiaBxUQCFjvv7Oese5Dt4omMGa60YRNEW0Sx3K+zri0uac2Y6S9nOlMehciWIzvvRCTGQ==} + engines: {node: ^22.14.0 || >= 24.10.0} + peerDependencies: + semantic-release: '>=24.1.0' + + '@semantic-release/npm@13.1.5': + resolution: {integrity: sha512-Hq5UxzoatN3LHiq2rTsWS54nCdqJHlsssGERCo8WlvdfFA9LoN0vO+OuKVSjtNapIc/S8C2LBj206wKLHg62mg==} + engines: {node: ^22.14.0 || >= 24.10.0} + peerDependencies: + semantic-release: '>=20.1.0' + + '@semantic-release/release-notes-generator@14.1.1': + resolution: {integrity: sha512-Pbd2e2XRMUD0OxehHpgd5/YghsE76cddkRHSoDvKLK+OCy4Ewxn49rWR631MEUU01lgwF/uyVXvbnVuu6+Z6VA==} + engines: {node: '>=20.8.1'} + peerDependencies: + semantic-release: '>=20.1.0' + + '@simple-libs/stream-utils@1.2.0': + resolution: {integrity: sha512-KxXvfapcixpz6rVEB6HPjOUZT22yN6v0vI0urQSk1L8MlEWPDFCZkhw2xmkyoTGYeFw7tWTZd7e3lVzRZRN/EA==} + engines: {node: '>=18'} + + '@sindresorhus/is@4.6.0': + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + '@sindresorhus/merge-streams@2.3.0': resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} engines: {node: '>=18'} @@ -717,6 +1192,9 @@ packages: '@textlint/types@15.8.0': resolution: {integrity: sha512-Anhc6y5736YIsvqae0U6k0YmB2M/QVHkEeOv2aydAn/WIkdI69dCOiDbe3/+RagS3qstFTSFWJzNRA2lUjv19w==} + '@tybys/wasm-util@0.10.3': + resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} + '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} @@ -1075,6 +1553,14 @@ packages: resolution: {integrity: sha512-TQf59BsZnytt8GdJKLPfUZ54g/iaUL2OWDSFCCvMOhsHduDQxO8xC4PNeyIkVcA5KwL2phPSv0douC0fgWzmnA==} engines: {node: '>= 20'} + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + + aggregate-error@5.0.0: + resolution: {integrity: sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==} + engines: {node: '>=18'} + ajv@6.15.0: resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} @@ -1105,13 +1591,22 @@ packages: resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} engines: {node: '>=12'} + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + argv-formatter@1.0.0: + resolution: {integrity: sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==} + array-buffer-byte-length@1.0.2: resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} + array-ify@1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + arraybuffer.prototype.slice@1.0.4: resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} @@ -1200,6 +1695,9 @@ packages: resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} engines: {node: '>= 0.8'} + before-after-hook@4.0.0: + resolution: {integrity: sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==} + binaryextensions@6.11.0: resolution: {integrity: sha512-sXnYK/Ij80TO3lcqZVV2YgfKN5QjUWIRk/XSm2J/4bd/lPko3lvk0O4ZppH6m+6hB2/GTu+ptNwVFe1xh+QLQw==} engines: {node: '>=4'} @@ -1210,6 +1708,9 @@ packages: boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + bottleneck@2.19.5: + resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==} + boundary@2.0.0: resolution: {integrity: sha512-rJKn5ooC9u8q13IMCrW0RSp31pxBCHE3y9V/tp3TdWSLf8Em3p6Di4NBpfzbJge9YjjFEsD0RtFEjtvHL5VyEA==} @@ -1275,6 +1776,10 @@ packages: resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + camelcase@6.3.0: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} @@ -1295,6 +1800,10 @@ packages: resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + character-entities-legacy@3.0.0: resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} @@ -1304,6 +1813,9 @@ packages: character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + chardet@2.2.0: + resolution: {integrity: sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==} + cheerio-select@2.1.0: resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} @@ -1322,14 +1834,41 @@ packages: chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + ci-info@2.0.0: + resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} + + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + clean-stack@5.3.0: + resolution: {integrity: sha512-9ngPTOhYGQqNVSfeJkYXHmF7AGWp4/nN5D/QqNQs3Dvxd1Kk/WpjHfNujKHYUQ/5CoGyOyFNoWSPk5afzP0QVg==} + engines: {node: '>=14.16'} + cli-cursor@5.0.0: resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} engines: {node: '>=18'} + cli-highlight@2.1.11: + resolution: {integrity: sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==} + engines: {node: '>=8.0.0', npm: '>=5.0.0'} + hasBin: true + cli-spinners@2.9.2: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} + cli-table3@0.6.5: + resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} + engines: {node: 10.* || >= 12.*} + + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} @@ -1363,6 +1902,10 @@ packages: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} engines: {node: '>=18'} + commander@6.2.1: + resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} + engines: {node: '>= 6'} + commander@7.2.0: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} engines: {node: '>= 10'} @@ -1371,9 +1914,15 @@ packages: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} + compare-func@2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + content-disposition@1.0.1: resolution: {integrity: sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==} engines: {node: '>=18'} @@ -1386,6 +1935,32 @@ packages: resolution: {integrity: sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==} engines: {node: '>=18'} + conventional-changelog-angular@8.3.1: + resolution: {integrity: sha512-6gfI3otXK5Ph5DfCOI1dblr+kN3FAm5a97hYoQkqNZxOaYa5WKfXH+AnpsmS+iUH2mgVC2Cg2Qw9m5OKcmNrIg==} + engines: {node: '>=18'} + + conventional-changelog-conventionalcommits@9.3.1: + resolution: {integrity: sha512-dTYtpIacRpcZgrvBYvBfArMmK2xvIpv2TaxM0/ZI5CBtNUzvF2x0t15HsbRABWprS6UPmvj+PzHVjSx4qAVKyw==} + engines: {node: '>=18'} + + conventional-changelog-writer@8.4.0: + resolution: {integrity: sha512-HHBFkk1EECxxmCi4CTu091iuDpQv5/OavuCUAuZmrkWpmYfyD816nom1CvtfXJ/uYfAAjavgHvXHX291tSLK8g==} + engines: {node: '>=18'} + hasBin: true + + conventional-commits-filter@5.0.0: + resolution: {integrity: sha512-tQMagCOC59EVgNZcC5zl7XqO30Wki9i9J3acbUvkaosCT6JX3EeFwJD7Qqp4MCikRnzS18WXV3BLIQ66ytu6+Q==} + engines: {node: '>=18'} + + conventional-commits-parser@6.4.0: + resolution: {integrity: sha512-tvRg7FIBNlyPzjdG8wWRlPHQJJHI7DylhtRGeU9Lq+JuoPh5BKpPRX83ZdLrvXuOSu5Eo/e7SzOQhU4Hd2Miuw==} + engines: {node: '>=18'} + hasBin: true + + convert-hrtime@5.0.0: + resolution: {integrity: sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==} + engines: {node: '>=12'} + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -1402,6 +1977,20 @@ packages: cose-base@2.2.0: resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==} + cosmiconfig@9.0.2: + resolution: {integrity: sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + cross-keychain@1.1.0: + resolution: {integrity: sha512-244DWNdGepLKD5vEn3reZqwzZFiE/LD4U+XV9IaXQbtIXKvQkf0VkRaOj/9vPYauPdR12PSGB3U0cE7jJi3WTQ==} + engines: {node: '>=18'} + hasBin: true + cross-spawn@6.0.6: resolution: {integrity: sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==} engines: {node: '>=4.8'} @@ -1410,6 +1999,10 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + crypto-random-string@4.0.0: + resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} + engines: {node: '>=12'} + css-select@5.2.2: resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==} @@ -1691,6 +2284,10 @@ packages: resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} engines: {node: '>=0.3.1'} + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dom-serializer@2.0.0: resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} @@ -1707,10 +2304,17 @@ packages: domutils@3.2.2: resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} + duplexer2@0.1.4: + resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} + duplexify@3.7.1: resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} @@ -1736,6 +2340,9 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + emojilib@2.4.0: + resolution: {integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==} + encodeurl@2.0.0: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} @@ -1762,6 +2369,14 @@ packages: resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} engines: {node: '>=0.12'} + env-ci@11.2.0: + resolution: {integrity: sha512-D5kWfzkmaOQDioPmiviWAVtKmpPT4/iJmMVQxWxMPJTFyTkdc5JQUfc5iXEeWxcOdsYTKSAiA/Age4NUOqKsRA==} + engines: {node: ^18.17 || >=20.6.1} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + environment@1.1.0: resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} engines: {node: '>=18'} @@ -1823,6 +2438,10 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + eslint-scope@9.1.2: resolution: {integrity: sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} @@ -1871,6 +2490,14 @@ packages: events-universal@1.0.1: resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + execa@9.6.1: + resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} + engines: {node: ^18.19.0 || >=20.5.0} + expand-template@2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} @@ -1913,6 +2540,14 @@ packages: fflate@0.8.3: resolution: {integrity: sha512-tbZNuJrLwGUp3zshBtdy4W+ORxZuIh8a5ilyIEQDC5rY1f3U20JMry0Ll3WBzU58EZKsEuJFXhb5gwv8CsPvgA==} + figures@2.0.0: + resolution: {integrity: sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==} + engines: {node: '>=4'} + + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} + file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} @@ -1921,10 +2556,22 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} + find-up-simple@1.0.1: + resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} + engines: {node: '>=18'} + + find-up@2.1.0: + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: '>=4'} + find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} + find-versions@6.0.0: + resolution: {integrity: sha512-2kCCtc+JvcZ86IGAz3Z2Y0A1baIz9fL31pH/0S1IqZr9Iwnjq8izfPtrCyQKO6TLMPELLsQMre7VDqeIKCsHkA==} + engines: {node: '>=18'} + flat-cache@4.0.1: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} @@ -1936,6 +2583,15 @@ packages: flatted@3.4.4: resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==} + follow-redirects@1.16.0: + resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + for-each@0.3.5: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} @@ -1972,6 +2628,10 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + function-timeout@1.0.2: + resolution: {integrity: sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==} + engines: {node: '>=18'} + function.prototype.name@1.2.0: resolution: {integrity: sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==} engines: {node: '>= 0.4'} @@ -1999,10 +2659,25 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} + get-symbol-description@1.1.0: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} + git-log-parser@1.2.1: + resolution: {integrity: sha512-PI+sPDvHXNPl5WNOErAK05s3j0lgwUzMN6o8cyQrDaKfT3qd7TmNJKeXX+SknI5I0QhG5fVPAEwSY4tRGDtYoQ==} + github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} @@ -2043,6 +2718,9 @@ packages: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} + graceful-fs@4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -2053,6 +2731,11 @@ packages: hachure-fill@0.5.2: resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==} + handlebars@4.7.9: + resolution: {integrity: sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==} + engines: {node: '>=0.4.7'} + hasBin: true + happy-dom@20.11.2: resolution: {integrity: sha512-7MB+bJLkxu3SowAfBJbjW+c55kNz5tkR45gu2qzrxznezhLeN5YIlJbwUgSzlGc+qWoZ8Ykg71H5ezz69xixrw==} engines: {node: '>=20.0.0'} @@ -2092,6 +2775,13 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true + highlight.js@10.7.3: + resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} + + hook-std@4.0.0: + resolution: {integrity: sha512-IHI4bEVOt3vRUDJ+bFA9VUJlo7SzvFARPNLw75pqSmAOP2HmTWfFJtPvLBrDrlgjEYXY9zs7SFdHPQaJShkSCQ==} + engines: {node: '>=20'} + hosted-git-info@2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} @@ -2103,6 +2793,10 @@ packages: resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} engines: {node: ^16.14.0 || >=18.0.0} + hosted-git-info@9.0.3: + resolution: {integrity: sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg==} + engines: {node: ^20.17.0 || >=22.9.0} + html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} @@ -2141,10 +2835,22 @@ packages: resolution: {integrity: sha512-ag87y7cJJ9/3+GxFr8Oy4O5faDsGRGnBGsJj/YjOSsSx/5eadKLYTMPlzuR6obgoCDDm0abAAZitXXQkMOPSpA==} engines: {node: '>= 20'} + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + human-signals@8.0.1: + resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} + engines: {node: '>=18.18.0'} + iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} + iconv-lite@0.7.3: + resolution: {integrity: sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==} + engines: {node: '>=0.10.0'} + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -2159,6 +2865,14 @@ packages: immediate@3.0.6: resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + import-fresh@3.3.1: + resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} + engines: {node: '>=6'} + + import-from-esm@2.0.0: + resolution: {integrity: sha512-YVt14UZCgsX1vZQ3gKjkWVdBdHQ6eu3MPU1TBgL1H5orXe2+jWD006WCPPtOuwlQm10NuzOW5WawiF1Q9veW8g==} + engines: {node: '>=18.20'} + import-meta-resolve@4.2.0: resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} @@ -2166,6 +2880,14 @@ packages: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + indent-string@5.0.0: + resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} + engines: {node: '>=12'} + index-to-position@1.2.0: resolution: {integrity: sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==} engines: {node: '>=18'} @@ -2219,6 +2941,10 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} + is-ci@2.0.0: + resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} + hasBin: true + is-core-module@2.16.2: resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} engines: {node: '>= 0.4'} @@ -2282,6 +3008,10 @@ packages: resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} engines: {node: '>=12'} + is-it-type@5.1.3: + resolution: {integrity: sha512-AX2uU0HW+TxagTgQXOJY7+2fbFHemC7YFBwN1XqD8qQMKdtfbOC8OC3fUb4s5NU59a3662Dzwto8tWDdZYRXxg==} + engines: {node: '>=12'} + is-map@2.0.3: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} @@ -2298,6 +3028,10 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} + is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + is-path-inside@3.0.3: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} @@ -2310,6 +3044,10 @@ packages: resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} engines: {node: '>=8'} + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + is-regex@1.2.1: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} @@ -2322,6 +3060,14 @@ packages: resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==} engines: {node: '>= 0.4'} + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} + is-string@1.1.1: resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} engines: {node: '>= 0.4'} @@ -2371,6 +3117,10 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + issue-parser@7.0.2: + resolution: {integrity: sha512-7atWPjhGEIX3JEtMrOYd8TKzboYlq+5sNbdl9POiLYOI14G5HZiQbZP0Xj5EZdrufQVXfJlpTV0hys0CuxwxZw==} + engines: {node: ^18.17 || >=20.6.1} + istanbul-lib-coverage@3.2.2: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} @@ -2390,6 +3140,10 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + java-properties@1.0.2: + resolution: {integrity: sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==} + engines: {node: '>= 0.6.0'} + jiti@2.7.0: resolution: {integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==} hasBin: true @@ -2414,6 +3168,9 @@ packages: json-parse-better-errors@1.0.2: resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -2423,6 +3180,9 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json-with-bigint@3.5.10: + resolution: {integrity: sha512-Vcx+JVNEBts/xfcoCS69sKrOhOk/3TVlvlT+XzUOefVKnnrbYSCKpDCm10pohsJFtsJVYnwa/cXRZ4eElzaM6w==} + json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -2581,6 +3341,9 @@ packages: resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==} engines: {node: '>= 12.0.0'} + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + linkify-it@5.0.2: resolution: {integrity: sha512-ONTm2jCMAVZjgQa/Fy1kScXsuOoF5NPTsoFBdE1KVIZ2vAh/r9+Bqo+0jINCBYnavTPQZz38QzFTme79ENoN3Q==} @@ -2591,6 +3354,10 @@ packages: resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} engines: {node: '>=4'} + locate-path@2.0.0: + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} + locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -2598,6 +3365,12 @@ packages: lodash-es@4.18.1: resolution: {integrity: sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==} + lodash.capitalize@4.2.1: + resolution: {integrity: sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==} + + lodash.escaperegexp@4.1.2: + resolution: {integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==} + lodash.includes@4.3.0: resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} @@ -2622,6 +3395,9 @@ packages: lodash.truncate@4.4.2: resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} + lodash.uniqby@4.7.0: + resolution: {integrity: sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==} + lodash@4.18.1: resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} @@ -2650,6 +3426,10 @@ packages: magicast@0.5.4: resolution: {integrity: sha512-llBEhWm1SacoRwgHUoQJYtwp4PBLF4faQi5TCpIGyGs9n4y5+juI0tDgyKIfpqxckRHaHzouUEph3THklWh03w==} + make-asynchronous@1.1.0: + resolution: {integrity: sha512-ayF7iT+44LXdxJLTrTd3TLQpFDDvPCBxXxbv+pMUSuHA5Q8zyAfwkRP6aHHwNVFBUFWtxAHqwNJxF8vMZLAbVg==} + engines: {node: '>=18'} + make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} engines: {node: '>=10'} @@ -2686,6 +3466,17 @@ packages: resolution: {integrity: sha512-qHKeU2E1bdyNAT077go2FVTNXvYcktN5IHtF6XyeD1l0PClxzSp2tUApAV14ORI8DGX4H9bNKZEzelZp4qn8IA==} engines: {node: '>=22'} + marked-terminal@7.3.0: + resolution: {integrity: sha512-t4rBvPsHc57uE/2nJOLmMbZCQ4tgAccAED3ngXQqW6g+TxA488JzJ+FK3lQkzBQOI1mRV/r/Kq+1ZlJ4D0owQw==} + engines: {node: '>=16.0.0'} + peerDependencies: + marked: '>=1 <16' + + marked@15.0.12: + resolution: {integrity: sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==} + engines: {node: '>= 18'} + hasBin: true + marked@16.4.2: resolution: {integrity: sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==} engines: {node: '>= 20'} @@ -2706,6 +3497,17 @@ packages: resolution: {integrity: sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==} engines: {node: '>= 0.10.0'} + meow@13.2.0: + resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} + engines: {node: '>=18'} + + meow@14.1.0: + resolution: {integrity: sha512-EDYo6VlmtnumlcBCbh1gLJ//9jvM/ndXHfVXIFrZVr6fGcwTUyCTFNTLCKuY3ffbK8L/+3Mzqnd58RojiZqHVw==} + engines: {node: '>=20'} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -2813,6 +3615,15 @@ packages: engines: {node: '>=4'} hasBin: true + mime@4.1.0: + resolution: {integrity: sha512-X5ju04+cAzsojXKes0B/S4tcYtFAJ6tTMuSPBEn9CPGlrWr8Fiw7qYeLT0XyH80HSoAoqWCaz+MWKh22P7G1cw==} + engines: {node: '>=16'} + hasBin: true + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + mimic-function@5.0.1: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} @@ -2860,6 +3671,13 @@ packages: mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + mute-stream@2.0.0: + resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} + engines: {node: ^18.17.0 || >=20.5.0} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + nanoid@3.3.18: resolution: {integrity: sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -2875,6 +3693,12 @@ packages: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + nerf-dart@1.0.0: + resolution: {integrity: sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==} + nice-try@1.0.5: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} @@ -2885,6 +3709,10 @@ packages: node-addon-api@4.3.0: resolution: {integrity: sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==} + node-emoji@2.2.0: + resolution: {integrity: sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==} + engines: {node: '>=18'} + node-sarif-builder@3.4.0: resolution: {integrity: sha512-tGnJW6OKRii9u/b2WiUViTJS+h7Apxx17qsMUjsUeNDiMMX5ZFf8F8Fcz7PAQ6omvOxHZtvDTmOYKJQwmfpjeg==} engines: {node: '>=20'} @@ -2896,14 +3724,105 @@ packages: resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} engines: {node: ^16.14.0 || >=18.0.0} + normalize-package-data@8.0.0: + resolution: {integrity: sha512-RWk+PI433eESQ7ounYxIp67CYuVsS1uYSonX3kA6ps/3LWfjVQa/ptEg6Y3T6uAMq1mWpX9PQ+qx+QaHpsc7gQ==} + engines: {node: ^20.17.0 || >=22.9.0} + + normalize-url@9.0.1: + resolution: {integrity: sha512-ARftfC5HdUNu9jJeL8pHj8debUIHA2b91FizCoMzY4lG6dDX13jdvTK0TBe24IBDRf2HvJSzzwEPvmbkQWHRSg==} + engines: {node: '>=20'} + npm-run-all@4.1.5: resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} engines: {node: '>= 4'} hasBin: true + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + npm-run-path@6.0.0: + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + engines: {node: '>=18'} + + npm@11.19.0: + resolution: {integrity: sha512-SDd/hHg3KqHE5Ht2NHWxNYNtqCQ2pXAPLl6OtQhPyED5PHsRfrOtO199MZTIG2cQoQ1ZRI9t28shrD+2cr3AAw==} + engines: {node: ^20.17.0 || >=22.9.0} + hasBin: true + bundledDependencies: + - '@isaacs/string-locale-compare' + - '@npmcli/arborist' + - '@npmcli/config' + - '@npmcli/fs' + - '@npmcli/map-workspaces' + - '@npmcli/metavuln-calculator' + - '@npmcli/package-json' + - '@npmcli/promise-spawn' + - '@npmcli/redact' + - '@npmcli/run-script' + - '@sigstore/tuf' + - abbrev + - archy + - cacache + - chalk + - ci-info + - fastest-levenshtein + - fs-minipass + - glob + - graceful-fs + - hosted-git-info + - ini + - init-package-json + - is-cidr + - json-parse-even-better-errors + - libnpmaccess + - libnpmdiff + - libnpmexec + - libnpmfund + - libnpmorg + - libnpmpack + - libnpmpublish + - libnpmsearch + - libnpmteam + - libnpmversion + - make-fetch-happen + - minimatch + - minipass + - minipass-pipeline + - ms + - node-gyp + - nopt + - npm-audit-report + - npm-install-checks + - npm-package-arg + - npm-pick-manifest + - npm-profile + - npm-registry-fetch + - npm-user-validate + - p-map + - pacote + - parse-conflict-json + - proc-log + - qrcode-terminal + - read + - semver + - spdx-expression-parse + - ssri + - supports-color + - tar + - text-table + - tiny-relative-date + - treeverse + - validate-npm-package-name + - which + nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + object-inspect@1.13.4: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} @@ -2931,6 +3850,10 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + onetime@7.0.0: resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} engines: {node: '>=18'} @@ -2947,14 +3870,39 @@ packages: resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==} engines: {node: '>=18'} + ovsx@1.1.1: + resolution: {integrity: sha512-tklsCzvGVWKlM91Vc9U8tNnaQ+XacPJ12SWHjDaHGUJB49oMhoAULsJGeefhHebPvvckbcWbKqKIXODMZah5SA==} + engines: {node: '>= 20'} + hasBin: true + own-keys@1.0.2: resolution: {integrity: sha512-19YVAg7T+WTrxggPukVq7DjTv6+PJ867TmhCvBsYwmbFCsZd344rq2Ld1p0wo8f8Qrrhgp82c6FJRqdXWtSEhg==} engines: {node: '>= 0.4'} + p-each-series@3.0.0: + resolution: {integrity: sha512-lastgtAdoH9YaLyDa5i5z64q+kzOcQHsQ5SsZJD3q0VEyI8mq872S3geuNbRUQLVAE9siMfgKrpj7MloKFHruw==} + engines: {node: '>=12'} + + p-event@6.0.1: + resolution: {integrity: sha512-Q6Bekk5wpzW5qIyUP4gdMEujObYstZl6DMMOSenwBvV0BlE5LkDwkjs5yHbZmdCEq2o4RJx4tE1vwxFVf2FG1w==} + engines: {node: '>=16.17'} + + p-filter@4.1.0: + resolution: {integrity: sha512-37/tPdZ3oJwHaS3gNJdenCDB3Tz26i9sjhnguBtvN0vYlRIiDNnvTWkuh+0hETV9rLPdJ3rlL3yVOYPIAnM8rw==} + engines: {node: '>=18'} + + p-limit@1.3.0: + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} + p-locate@2.0.0: + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} + p-locate@5.0.0: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} @@ -2963,6 +3911,18 @@ packages: resolution: {integrity: sha512-I4Prw6ivkd6p8PiYR1tXASOAOBzIJwu0TB7fqaX0c/8c3QAehNYmX57EijyGGGBt3c/BIowGwV03RVBtXvHEVg==} engines: {node: '>=18'} + p-reduce@3.0.0: + resolution: {integrity: sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q==} + engines: {node: '>=12'} + + p-timeout@6.1.4: + resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} + engines: {node: '>=14.16'} + + p-try@1.0.0: + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} @@ -2975,6 +3935,10 @@ packages: pako@1.0.11: resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + parse-entities@4.0.2: resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} @@ -2982,19 +3946,36 @@ packages: resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} engines: {node: '>=4'} + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + parse-json@8.3.0: resolution: {integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==} engines: {node: '>=18'} + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} + parse-semver@1.1.1: resolution: {integrity: sha512-Eg1OuNntBMH0ojvEKSrvDSnwLmvVuUOSdylH/pSCPNMIspLlweJyIWXCE+k/5hm3cj/EBUYwmWkjhBALNP4LXQ==} + parse5-htmlparser2-tree-adapter@6.0.1: + resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} + parse5-htmlparser2-tree-adapter@7.1.0: resolution: {integrity: sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==} parse5-parser-stream@7.1.2: resolution: {integrity: sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==} + parse5@5.1.1: + resolution: {integrity: sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==} + + parse5@6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + parse5@7.3.0: resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==} @@ -3005,6 +3986,10 @@ packages: path-data-parser@0.1.0: resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==} + path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -3021,6 +4006,10 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -3039,6 +4028,10 @@ packages: resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} engines: {node: '>=4'} + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + path-type@6.0.0: resolution: {integrity: sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==} engines: {node: '>=18'} @@ -3072,6 +4065,10 @@ packages: resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} engines: {node: '>=4'} + pkg-conf@2.1.0: + resolution: {integrity: sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==} + engines: {node: '>=4'} + playwright-core@1.62.1: resolution: {integrity: sha512-wPYSwEBJY9GHraISXqyqtx0na0LpO3XEX7jNDhntbex7tzUS7kLnZsOlFruFJB4Hi/rhDMjXGqHewDZ68nYZVw==} engines: {node: '>=20'} @@ -3118,9 +4115,16 @@ packages: engines: {node: '>=14'} hasBin: true + pretty-ms@9.3.0: + resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} + engines: {node: '>=18'} + process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + proxy-agent-negotiate@1.1.0: resolution: {integrity: sha512-N8IBcM3UgCVzz2L2Lqv8DVntDnnC8/hiV4nEDUPkqq72TPUgYWjQc+bdZlBPZK9LzPAvOY//gAt0S0DApoOXWQ==} engines: {node: '>= 20'} @@ -3161,6 +4165,18 @@ packages: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true + read-package-up@11.0.0: + resolution: {integrity: sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==} + engines: {node: '>=18'} + + read-package-up@12.0.0: + resolution: {integrity: sha512-Q5hMVBYur/eQNWDdbF4/Wqqr9Bjvtrw2kjGxxBbKLbx8bVCL8gcArjTy8zDUuLGQicftpMuU0riQNcAsbtOVsw==} + engines: {node: '>=20'} + + read-pkg@10.1.0: + resolution: {integrity: sha512-I8g2lArQiP78ll51UeMZojewtYgIRCKCWqZEgOO8c/uefTI+XDXvCSXu3+YNUaTNvZzobrL5+SqHjBrByRRTdg==} + engines: {node: '>=20'} + read-pkg@3.0.0: resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} engines: {node: '>=4'} @@ -3196,6 +4212,10 @@ packages: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} + registry-auth-token@5.1.1: + resolution: {integrity: sha512-P7B4+jq8DeD2nMsAcdfaqHbssgHtZ7Z5+++a5ask90fvmJ8p5je4mOa+wzu+DB4vQ5tdJV/xywY+UnVFeQLV5Q==} + engines: {node: '>=14'} + require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -3204,6 +4224,14 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + resolve-path@1.4.0: resolution: {integrity: sha512-i1xevIst/Qa+nA9olDxLWnLk8YZbi8R/7JPbCMcgyWaFR6bKWaexgJgEB5oc2PKMjYdrHynyz0NY+if+H98t1w==} engines: {node: '>= 0.8'} @@ -3272,6 +4300,15 @@ packages: engines: {node: '>=20.0.0'} hasBin: true + semantic-release@25.0.9: + resolution: {integrity: sha512-bxve7csK0/Txr++CkfrmV+X1r4jqiSOw2WsSad9E2S68R+ZfLBwDn8IceM8WfiOmKQIHgsQc1cNA8Dzg7U75pg==} + engines: {node: ^22.14.0 || >= 24.10.0} + hasBin: true + + semver-regex@4.0.5: + resolution: {integrity: sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==} + engines: {node: '>=12'} + semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true @@ -3349,12 +4386,24 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + signale@1.4.0: + resolution: {integrity: sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==} + engines: {node: '>=6'} + simple-concat@1.0.1: resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} simple-get@4.0.1: resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + simple-invariant@2.0.1: + resolution: {integrity: sha512-1sbhsxqI+I2tqlmjbz99GXNmZtr6tKIyEgGGnJw/MKGblalqk/XoOYYFJlBzTKZCxx8kLaD3FD5s9BEEjx5Pyg==} + engines: {node: '>=10'} + + skin-tone@2.0.0: + resolution: {integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==} + engines: {node: '>=8'} + slash@5.1.0: resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} engines: {node: '>=14.16'} @@ -3375,6 +4424,13 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + spawn-error-forwarder@1.0.0: + resolution: {integrity: sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==} + spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} @@ -3387,6 +4443,9 @@ packages: spdx-license-ids@3.0.23: resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} + split2@1.0.0: + resolution: {integrity: sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==} + stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -3409,6 +4468,9 @@ packages: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} + stream-combiner2@1.1.1: + resolution: {integrity: sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==} + stream-shift@1.0.3: resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} @@ -3469,6 +4531,14 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-final-newline@4.0.0: + resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} + engines: {node: '>=18'} + strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} @@ -3483,6 +4553,10 @@ packages: stylis@4.4.0: resolution: {integrity: sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==} + super-regex@1.1.0: + resolution: {integrity: sha512-WHkws2ZflZe41zj6AolvvmaTrWds/VuyeYr9iPVv/oQeaIoVxMKaushfFWpOGDT+GuBrM/sVqF8KUCYQlSSTdQ==} + engines: {node: '>=18'} + supports-color@10.2.2: resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} engines: {node: '>=18'} @@ -3511,6 +4585,10 @@ packages: resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} engines: {node: '>=10.0.0'} + tagged-tag@1.0.0: + resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} + engines: {node: '>=20'} + tapable@2.3.3: resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} @@ -3531,6 +4609,14 @@ packages: teex@1.0.1: resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} + temp-dir@3.0.0: + resolution: {integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==} + engines: {node: '>=14.16'} + + tempy@3.2.0: + resolution: {integrity: sha512-d79HhZya5Djd7am0q+W4RTsSU+D/aJzM+4Y4AGJGuGlgM2L6sx5ZvOYTmZjqPhrDrV6xJTtRSm1JCLj6V6LHLQ==} + engines: {node: '>=14.16'} + terminal-link@4.0.0: resolution: {integrity: sha512-lk+vH+MccxNqgVqSnkMVKx4VLJfnLjDBGzH16JVZjKE2DoxP57s6/vt6JmXV5I3jBcfGrxNrYtC+mPtU7WJztA==} engines: {node: '>=18'} @@ -3549,9 +4635,20 @@ packages: resolution: {integrity: sha512-tXJwSr9355kFJI3lbCkPpUH5cP8/M0GGy2xLO34aZCjMXBaK3SoPnZwr/oWmo1FdCnELcs4npdCIOFtq9W3ruQ==} engines: {node: '>=4'} + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + time-span@5.1.0: + resolution: {integrity: sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==} + engines: {node: '>=12'} + tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -3579,6 +4676,10 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} + traverse@0.6.8: + resolution: {integrity: sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==} + engines: {node: '>= 0.4'} + ts-api-utils@2.5.0: resolution: {integrity: sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==} engines: {node: '>=18.12'} @@ -3607,10 +4708,22 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} + type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + type-fest@4.41.0: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} + type-fest@5.8.0: + resolution: {integrity: sha512-YGYEVz3Fm5iy/AybuA0oyNFq7H4CgQNfRp/qfe8nurE1kuCeNm3/vfm9X4Mtl+qLyaKJUh5xrFZwogr41SMjYA==} + engines: {node: '>=20'} + type-is@2.1.0: resolution: {integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==} engines: {node: '>= 18'} @@ -3652,6 +4765,11 @@ packages: uc.micro@3.0.0: resolution: {integrity: sha512-U3PppEkleoTnIfi8BozMx3yju3qc/L6SwqWo2Sw+54PX+PX0q9I+r1Um5HCmqD7n9VDX5/v3vQH/AjA6deDdtw==} + uglify-js@3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} + engines: {node: '>=0.8.0'} + hasBin: true + unbox-primitive@1.1.0: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} @@ -3665,10 +4783,18 @@ packages: undici-types@8.3.0: resolution: {integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==} + undici@6.28.0: + resolution: {integrity: sha512-LIY910g9TI13YS95lrMFrs8Rm/u/irgHeTWoKCoteeJ04CUJ92eEfj0rVn+7VKMPBpUPiUoBKfhNyLI23EE/KA==} + engines: {node: '>=18.17'} + undici@7.29.0: resolution: {integrity: sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==} engines: {node: '>=20.18.1'} + unicode-emoji-modifier-base@1.0.0: + resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} + engines: {node: '>=4'} + unicorn-magic@0.1.0: resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} engines: {node: '>=18'} @@ -3681,6 +4807,13 @@ packages: resolution: {integrity: sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==} engines: {node: '>=20'} + unique-string@3.0.0: + resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} + engines: {node: '>=12'} + + universal-user-agent@7.0.3: + resolution: {integrity: sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==} + universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} @@ -3691,6 +4824,10 @@ packages: url-join@4.0.1: resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} + url-join@5.0.0: + resolution: {integrity: sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -3800,6 +4937,9 @@ packages: vscode-uri@3.1.0: resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==} + web-worker@1.5.0: + resolution: {integrity: sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==} + whatwg-encoding@3.1.1: resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} engines: {node: '>=18'} @@ -3847,9 +4987,16 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + workerpool@9.3.4: resolution: {integrity: sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==} + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -3900,6 +5047,10 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} @@ -3912,6 +5063,10 @@ packages: resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} engines: {node: '>=10'} + yargs@16.2.2: + resolution: {integrity: sha512-Nt9ZJjXTv5R8MHbqby/wXQ6Gi0Bb3TcYZkR1bzuL4yB2OxWPkXknz513gEF0GoA6tn00UpbPvERW8rzCuWCA6w==} + engines: {node: '>=10'} + yargs@17.7.3: resolution: {integrity: sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==} engines: {node: '>=12'} @@ -3920,6 +5075,10 @@ packages: resolution: {integrity: sha512-2rAgRKu54VsHkqI0/tYkmluGXHD4KW7yZoycuqDQ15QOTnc2VVfy0nN/1eMhnQLO00A+dwtK20xuCnc1YGeUyg==} engines: {node: ^20.19.0 || ^22.12.0 || >=23} + yauzl-promise@4.0.0: + resolution: {integrity: sha512-/HCXpyHXJQQHvFq9noqrjfa/WpQC2XYs3vI7tBiAi4QiIU1knvYhZGaO1QPjwIVMdqflxbmwgMXtYeaRiAE0CA==} + engines: {node: '>=16'} + yauzl@3.4.0: resolution: {integrity: sha512-jIH9yLR9wqr0wOS0TpBvo/g/2UgZH5qePVbjgRliiF0BYvOZyaBknKsF+x9Iht0O6sqgnB93rCICdOZFecJuDw==} engines: {node: '>=12'} @@ -3931,8 +5090,32 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + yoctocolors-cjs@2.1.3: + resolution: {integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==} + engines: {node: '>=18'} + + yoctocolors@2.2.0: + resolution: {integrity: sha512-xYqdZFUK/VYazNl/oCDYN+3WloWQwMfZxBoiNt6qNyk+xfOdi598muWE42rNZFp1kNOiqW936q5RhUdnpqElSg==} + engines: {node: '>=18'} + snapshots: + '@actions/core@3.0.1': + dependencies: + '@actions/exec': 3.0.0 + '@actions/http-client': 4.0.1 + + '@actions/exec@3.0.0': + dependencies: + '@actions/io': 3.0.2 + + '@actions/http-client@4.0.1': + dependencies: + tunnel: 0.0.6 + undici: 6.28.0 + + '@actions/io@3.0.2': {} + '@antfu/install-pkg@1.1.0': dependencies: package-manager-detector: 1.8.0 @@ -4051,6 +5234,25 @@ snapshots: '@chevrotain/types@11.1.2': {} + '@colors/colors@1.5.0': + optional: true + + '@emnapi/core@1.11.3': + dependencies: + '@emnapi/wasi-threads': 1.2.3 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.11.3': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.3': + dependencies: + tslib: 2.8.1 + optional: true + '@esbuild/aix-ppc64@0.28.2': optional: true @@ -4187,6 +5389,131 @@ snapshots: '@iconify/types': 2.0.0 import-meta-resolve: 4.2.0 + '@inquirer/ansi@1.0.2': {} + + '@inquirer/checkbox@4.3.2(@types/node@24.13.3)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@24.13.3) + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@24.13.3) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 24.13.3 + + '@inquirer/confirm@5.1.21(@types/node@24.13.3)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@24.13.3) + '@inquirer/type': 3.0.10(@types/node@24.13.3) + optionalDependencies: + '@types/node': 24.13.3 + + '@inquirer/core@10.3.2(@types/node@24.13.3)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@24.13.3) + cli-width: 4.1.0 + mute-stream: 2.0.0 + signal-exit: 4.1.0 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 24.13.3 + + '@inquirer/editor@4.2.23(@types/node@24.13.3)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@24.13.3) + '@inquirer/external-editor': 1.0.3(@types/node@24.13.3) + '@inquirer/type': 3.0.10(@types/node@24.13.3) + optionalDependencies: + '@types/node': 24.13.3 + + '@inquirer/expand@4.0.23(@types/node@24.13.3)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@24.13.3) + '@inquirer/type': 3.0.10(@types/node@24.13.3) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 24.13.3 + + '@inquirer/external-editor@1.0.3(@types/node@24.13.3)': + dependencies: + chardet: 2.2.0 + iconv-lite: 0.7.3 + optionalDependencies: + '@types/node': 24.13.3 + + '@inquirer/figures@1.0.15': {} + + '@inquirer/input@4.3.1(@types/node@24.13.3)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@24.13.3) + '@inquirer/type': 3.0.10(@types/node@24.13.3) + optionalDependencies: + '@types/node': 24.13.3 + + '@inquirer/number@3.0.23(@types/node@24.13.3)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@24.13.3) + '@inquirer/type': 3.0.10(@types/node@24.13.3) + optionalDependencies: + '@types/node': 24.13.3 + + '@inquirer/password@4.0.23(@types/node@24.13.3)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@24.13.3) + '@inquirer/type': 3.0.10(@types/node@24.13.3) + optionalDependencies: + '@types/node': 24.13.3 + + '@inquirer/prompts@7.10.1(@types/node@24.13.3)': + dependencies: + '@inquirer/checkbox': 4.3.2(@types/node@24.13.3) + '@inquirer/confirm': 5.1.21(@types/node@24.13.3) + '@inquirer/editor': 4.2.23(@types/node@24.13.3) + '@inquirer/expand': 4.0.23(@types/node@24.13.3) + '@inquirer/input': 4.3.1(@types/node@24.13.3) + '@inquirer/number': 3.0.23(@types/node@24.13.3) + '@inquirer/password': 4.0.23(@types/node@24.13.3) + '@inquirer/rawlist': 4.1.11(@types/node@24.13.3) + '@inquirer/search': 3.2.2(@types/node@24.13.3) + '@inquirer/select': 4.4.2(@types/node@24.13.3) + optionalDependencies: + '@types/node': 24.13.3 + + '@inquirer/rawlist@4.1.11(@types/node@24.13.3)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@24.13.3) + '@inquirer/type': 3.0.10(@types/node@24.13.3) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 24.13.3 + + '@inquirer/search@3.2.2(@types/node@24.13.3)': + dependencies: + '@inquirer/core': 10.3.2(@types/node@24.13.3) + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@24.13.3) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 24.13.3 + + '@inquirer/select@4.4.2(@types/node@24.13.3)': + dependencies: + '@inquirer/ansi': 1.0.2 + '@inquirer/core': 10.3.2(@types/node@24.13.3) + '@inquirer/figures': 1.0.15 + '@inquirer/type': 3.0.10(@types/node@24.13.3) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + '@types/node': 24.13.3 + + '@inquirer/type@3.0.10(@types/node@24.13.3)': + optionalDependencies: + '@types/node': 24.13.3 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -4225,6 +5552,126 @@ snapshots: dependencies: '@chevrotain/types': 11.1.2 + '@napi-rs/keyring-darwin-arm64@1.3.0': + optional: true + + '@napi-rs/keyring-darwin-x64@1.3.0': + optional: true + + '@napi-rs/keyring-freebsd-x64@1.3.0': + optional: true + + '@napi-rs/keyring-linux-arm-gnueabihf@1.3.0': + optional: true + + '@napi-rs/keyring-linux-arm64-gnu@1.3.0': + optional: true + + '@napi-rs/keyring-linux-arm64-musl@1.3.0': + optional: true + + '@napi-rs/keyring-linux-riscv64-gnu@1.3.0': + optional: true + + '@napi-rs/keyring-linux-x64-gnu@1.3.0': + optional: true + + '@napi-rs/keyring-linux-x64-musl@1.3.0': + optional: true + + '@napi-rs/keyring-win32-arm64-msvc@1.3.0': + optional: true + + '@napi-rs/keyring-win32-ia32-msvc@1.3.0': + optional: true + + '@napi-rs/keyring-win32-x64-msvc@1.3.0': + optional: true + + '@napi-rs/keyring@1.3.0': + optionalDependencies: + '@napi-rs/keyring-darwin-arm64': 1.3.0 + '@napi-rs/keyring-darwin-x64': 1.3.0 + '@napi-rs/keyring-freebsd-x64': 1.3.0 + '@napi-rs/keyring-linux-arm-gnueabihf': 1.3.0 + '@napi-rs/keyring-linux-arm64-gnu': 1.3.0 + '@napi-rs/keyring-linux-arm64-musl': 1.3.0 + '@napi-rs/keyring-linux-riscv64-gnu': 1.3.0 + '@napi-rs/keyring-linux-x64-gnu': 1.3.0 + '@napi-rs/keyring-linux-x64-musl': 1.3.0 + '@napi-rs/keyring-win32-arm64-msvc': 1.3.0 + '@napi-rs/keyring-win32-ia32-msvc': 1.3.0 + '@napi-rs/keyring-win32-x64-msvc': 1.3.0 + optional: true + + '@napi-rs/wasm-runtime@0.2.12': + dependencies: + '@emnapi/core': 1.11.3 + '@emnapi/runtime': 1.11.3 + '@tybys/wasm-util': 0.10.3 + optional: true + + '@node-rs/crc32-android-arm-eabi@1.10.6': + optional: true + + '@node-rs/crc32-android-arm64@1.10.6': + optional: true + + '@node-rs/crc32-darwin-arm64@1.10.6': + optional: true + + '@node-rs/crc32-darwin-x64@1.10.6': + optional: true + + '@node-rs/crc32-freebsd-x64@1.10.6': + optional: true + + '@node-rs/crc32-linux-arm-gnueabihf@1.10.6': + optional: true + + '@node-rs/crc32-linux-arm64-gnu@1.10.6': + optional: true + + '@node-rs/crc32-linux-arm64-musl@1.10.6': + optional: true + + '@node-rs/crc32-linux-x64-gnu@1.10.6': + optional: true + + '@node-rs/crc32-linux-x64-musl@1.10.6': + optional: true + + '@node-rs/crc32-wasm32-wasi@1.10.6': + dependencies: + '@napi-rs/wasm-runtime': 0.2.12 + optional: true + + '@node-rs/crc32-win32-arm64-msvc@1.10.6': + optional: true + + '@node-rs/crc32-win32-ia32-msvc@1.10.6': + optional: true + + '@node-rs/crc32-win32-x64-msvc@1.10.6': + optional: true + + '@node-rs/crc32@1.10.6': + optionalDependencies: + '@node-rs/crc32-android-arm-eabi': 1.10.6 + '@node-rs/crc32-android-arm64': 1.10.6 + '@node-rs/crc32-darwin-arm64': 1.10.6 + '@node-rs/crc32-darwin-x64': 1.10.6 + '@node-rs/crc32-freebsd-x64': 1.10.6 + '@node-rs/crc32-linux-arm-gnueabihf': 1.10.6 + '@node-rs/crc32-linux-arm64-gnu': 1.10.6 + '@node-rs/crc32-linux-arm64-musl': 1.10.6 + '@node-rs/crc32-linux-x64-gnu': 1.10.6 + '@node-rs/crc32-linux-x64-musl': 1.10.6 + '@node-rs/crc32-wasm32-wasi': 1.10.6 + '@node-rs/crc32-win32-arm64-msvc': 1.10.6 + '@node-rs/crc32-win32-ia32-msvc': 1.10.6 + '@node-rs/crc32-win32-x64-msvc': 1.10.6 + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -4237,6 +5684,72 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 + '@octokit/auth-token@6.0.0': {} + + '@octokit/core@7.0.7': + dependencies: + '@octokit/auth-token': 6.0.0 + '@octokit/graphql': 9.0.4 + '@octokit/request': 10.0.13 + '@octokit/request-error': 7.1.1 + '@octokit/types': 17.0.0 + before-after-hook: 4.0.0 + universal-user-agent: 7.0.3 + + '@octokit/endpoint@11.0.4': + dependencies: + '@octokit/types': 17.0.0 + universal-user-agent: 7.0.3 + + '@octokit/graphql@9.0.4': + dependencies: + '@octokit/request': 10.0.13 + '@octokit/types': 17.0.0 + universal-user-agent: 7.0.3 + + '@octokit/openapi-types@27.0.0': {} + + '@octokit/openapi-types@28.0.0': {} + + '@octokit/plugin-paginate-rest@14.0.0(@octokit/core@7.0.7)': + dependencies: + '@octokit/core': 7.0.7 + '@octokit/types': 16.0.0 + + '@octokit/plugin-retry@8.1.1(@octokit/core@7.0.7)': + dependencies: + '@octokit/core': 7.0.7 + '@octokit/request-error': 7.1.1 + '@octokit/types': 17.0.0 + bottleneck: 2.19.5 + + '@octokit/plugin-throttling@11.0.5(@octokit/core@7.0.7)': + dependencies: + '@octokit/core': 7.0.7 + '@octokit/types': 17.0.0 + bottleneck: 2.19.5 + + '@octokit/request-error@7.1.1': + dependencies: + '@octokit/types': 17.0.0 + + '@octokit/request@10.0.13': + dependencies: + '@octokit/endpoint': 11.0.4 + '@octokit/request-error': 7.1.1 + '@octokit/types': 17.0.0 + content-type: 2.0.0 + json-with-bigint: 3.5.10 + universal-user-agent: 7.0.3 + + '@octokit/types@16.0.0': + dependencies: + '@octokit/openapi-types': 27.0.0 + + '@octokit/types@17.0.0': + dependencies: + '@octokit/openapi-types': 28.0.0 + '@oxc-project/types@0.142.0': {} '@pkgjs/parseargs@0.11.0': @@ -4246,6 +5759,18 @@ snapshots: dependencies: playwright-core: 1.62.1 + '@pnpm/config.env-replace@1.1.0': {} + + '@pnpm/network.ca-file@1.0.2': + dependencies: + graceful-fs: 4.2.10 + + '@pnpm/npm-conf@3.0.3': + dependencies: + '@pnpm/config.env-replace': 1.1.0 + '@pnpm/network.ca-file': 1.0.2 + config-chain: 1.1.13 + '@resvg/resvg-js-android-arm-eabi@2.6.2': optional: true @@ -4341,6 +5866,8 @@ snapshots: '@rolldown/pluginutils@1.0.1': {} + '@sec-ant/readable-stream@0.4.1': {} + '@secretlint/config-creator@10.2.2': dependencies: '@secretlint/types': 10.2.2 @@ -4415,6 +5942,102 @@ snapshots: '@secretlint/types@10.2.2': {} + '@semantic-release/changelog@7.0.0(semantic-release@25.0.9(supports-color@8.1.1)(typescript@6.0.3))': + dependencies: + '@semantic-release/error': 4.0.0 + aggregate-error: 5.0.0 + lodash-es: 4.18.1 + semantic-release: 25.0.9(supports-color@8.1.1)(typescript@6.0.3) + + '@semantic-release/commit-analyzer@13.0.1(semantic-release@25.0.9(supports-color@8.1.1)(typescript@6.0.3))(supports-color@8.1.1)': + dependencies: + conventional-changelog-angular: 8.3.1 + conventional-changelog-writer: 8.4.0 + conventional-commits-filter: 5.0.0 + conventional-commits-parser: 6.4.0 + debug: 4.4.3(supports-color@8.1.1) + import-from-esm: 2.0.0(supports-color@8.1.1) + lodash-es: 4.18.1 + micromatch: 4.0.8 + semantic-release: 25.0.9(supports-color@8.1.1)(typescript@6.0.3) + transitivePeerDependencies: + - supports-color + + '@semantic-release/error@4.0.0': {} + + '@semantic-release/exec@7.1.0(semantic-release@25.0.9(supports-color@8.1.1)(typescript@6.0.3))(supports-color@8.1.1)': + dependencies: + '@semantic-release/error': 4.0.0 + aggregate-error: 3.1.0 + debug: 4.4.3(supports-color@8.1.1) + execa: 9.6.1 + lodash-es: 4.18.1 + parse-json: 8.3.0 + semantic-release: 25.0.9(supports-color@8.1.1)(typescript@6.0.3) + transitivePeerDependencies: + - supports-color + + '@semantic-release/github@12.0.9(semantic-release@25.0.9(supports-color@8.1.1)(typescript@6.0.3))(supports-color@8.1.1)': + dependencies: + '@octokit/core': 7.0.7 + '@octokit/plugin-paginate-rest': 14.0.0(@octokit/core@7.0.7) + '@octokit/plugin-retry': 8.1.1(@octokit/core@7.0.7) + '@octokit/plugin-throttling': 11.0.5(@octokit/core@7.0.7) + '@semantic-release/error': 4.0.0 + aggregate-error: 5.0.0 + debug: 4.4.3(supports-color@8.1.1) + dir-glob: 3.0.1 + http-proxy-agent: 9.1.0(supports-color@8.1.1) + https-proxy-agent: 9.1.0(supports-color@8.1.1) + issue-parser: 7.0.2 + lodash-es: 4.18.1 + mime: 4.1.0 + p-filter: 4.1.0 + semantic-release: 25.0.9(supports-color@8.1.1)(typescript@6.0.3) + tinyglobby: 0.2.17 + undici: 7.29.0 + url-join: 5.0.0 + transitivePeerDependencies: + - kerberos + - supports-color + + '@semantic-release/npm@13.1.5(semantic-release@25.0.9(supports-color@8.1.1)(typescript@6.0.3))': + dependencies: + '@actions/core': 3.0.1 + '@semantic-release/error': 4.0.0 + aggregate-error: 5.0.0 + env-ci: 11.2.0 + execa: 9.6.1 + fs-extra: 11.4.0 + lodash-es: 4.18.1 + nerf-dart: 1.0.0 + normalize-url: 9.0.1 + npm: 11.19.0 + rc: 1.2.8 + read-pkg: 10.1.0 + registry-auth-token: 5.1.1 + semantic-release: 25.0.9(supports-color@8.1.1)(typescript@6.0.3) + semver: 7.8.5 + tempy: 3.2.0 + + '@semantic-release/release-notes-generator@14.1.1(semantic-release@25.0.9(supports-color@8.1.1)(typescript@6.0.3))(supports-color@8.1.1)': + dependencies: + conventional-changelog-angular: 8.3.1 + conventional-changelog-writer: 8.4.0 + conventional-commits-filter: 5.0.0 + conventional-commits-parser: 6.4.0 + debug: 4.4.3(supports-color@8.1.1) + import-from-esm: 2.0.0(supports-color@8.1.1) + lodash-es: 4.18.1 + read-package-up: 11.0.0 + semantic-release: 25.0.9(supports-color@8.1.1)(typescript@6.0.3) + transitivePeerDependencies: + - supports-color + + '@simple-libs/stream-utils@1.2.0': {} + + '@sindresorhus/is@4.6.0': {} + '@sindresorhus/merge-streams@2.3.0': {} '@sindresorhus/merge-streams@4.0.0': {} @@ -4449,6 +6072,11 @@ snapshots: dependencies: '@textlint/ast-node-types': 15.8.0 + '@tybys/wasm-util@0.10.3': + dependencies: + tslib: 2.8.1 + optional: true + '@types/chai@5.2.3': dependencies: '@types/deep-eql': 4.0.2 @@ -4928,6 +6556,16 @@ snapshots: agent-base@9.0.0: {} + aggregate-error@3.1.0: + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + + aggregate-error@5.0.0: + dependencies: + clean-stack: 5.3.0 + indent-string: 5.0.0 + ajv@6.15.0: dependencies: fast-deep-equal: 3.1.3 @@ -4960,13 +6598,19 @@ snapshots: ansi-styles@6.2.3: {} + any-promise@1.3.0: {} + argparse@2.0.1: {} + argv-formatter@1.0.0: {} + array-buffer-byte-length@1.0.2: dependencies: call-bound: 1.0.4 is-array-buffer: 3.0.5 + array-ify@1.0.0: {} + arraybuffer.prototype.slice@1.0.4: dependencies: array-buffer-byte-length: 1.0.2 @@ -5042,6 +6686,8 @@ snapshots: dependencies: safe-buffer: 5.1.2 + before-after-hook@4.0.0: {} + binaryextensions@6.11.0: dependencies: editions: 6.22.0 @@ -5055,6 +6701,8 @@ snapshots: boolbase@1.0.0: {} + bottleneck@2.19.5: {} + boundary@2.0.0: {} brace-expansion@1.1.18: @@ -5131,6 +6779,8 @@ snapshots: call-bind-apply-helpers: 1.0.2 get-intrinsic: 1.3.0 + callsites@3.1.0: {} + camelcase@6.3.0: {} chai@6.2.2: {} @@ -5148,12 +6798,16 @@ snapshots: chalk@5.6.2: {} + char-regex@1.0.2: {} + character-entities-legacy@3.0.0: {} character-entities@2.0.2: {} character-reference-invalid@2.0.1: {} + chardet@2.2.0: {} + cheerio-select@2.1.0: dependencies: boolbase: 1.0.0 @@ -5188,12 +6842,43 @@ snapshots: chownr@1.1.4: optional: true + ci-info@2.0.0: {} + + clean-stack@2.2.0: {} + + clean-stack@5.3.0: + dependencies: + escape-string-regexp: 5.0.0 + cli-cursor@5.0.0: dependencies: restore-cursor: 5.1.0 + cli-highlight@2.1.11: + dependencies: + chalk: 4.1.2 + highlight.js: 10.7.3 + mz: 2.7.0 + parse5: 5.1.1 + parse5-htmlparser2-tree-adapter: 6.0.1 + yargs: 16.2.2 + cli-spinners@2.9.2: {} + cli-table3@0.6.5: + dependencies: + string-width: 4.2.3 + optionalDependencies: + '@colors/colors': 1.5.0 + + cli-width@4.1.0: {} + + cliui@7.0.4: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + cliui@8.0.1: dependencies: string-width: 4.2.3 @@ -5226,18 +6911,55 @@ snapshots: commander@12.1.0: {} + commander@6.2.1: {} + commander@7.2.0: {} commander@8.3.0: {} + compare-func@2.0.0: + dependencies: + array-ify: 1.0.0 + dot-prop: 5.3.0 + concat-map@0.0.1: {} + config-chain@1.1.13: + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + content-disposition@1.0.1: {} content-type@1.0.5: {} content-type@2.0.0: {} + conventional-changelog-angular@8.3.1: + dependencies: + compare-func: 2.0.0 + + conventional-changelog-conventionalcommits@9.3.1: + dependencies: + compare-func: 2.0.0 + + conventional-changelog-writer@8.4.0: + dependencies: + '@simple-libs/stream-utils': 1.2.0 + conventional-commits-filter: 5.0.0 + handlebars: 4.7.9 + meow: 13.2.0 + semver: 7.8.5 + + conventional-commits-filter@5.0.0: {} + + conventional-commits-parser@6.4.0: + dependencies: + '@simple-libs/stream-utils': 1.2.0 + meow: 13.2.0 + + convert-hrtime@5.0.0: {} + convert-source-map@2.0.0: {} cookies@0.9.1: @@ -5255,6 +6977,24 @@ snapshots: dependencies: layout-base: 2.0.1 + cosmiconfig@9.0.2(typescript@6.0.3): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.1 + js-yaml: 4.3.1 + parse-json: 5.2.0 + optionalDependencies: + typescript: 6.0.3 + + cross-keychain@1.1.0(@types/node@24.13.3): + dependencies: + '@inquirer/prompts': 7.10.1(@types/node@24.13.3) + meow: 14.1.0 + optionalDependencies: + '@napi-rs/keyring': 1.3.0 + transitivePeerDependencies: + - '@types/node' + cross-spawn@6.0.6: dependencies: nice-try: 1.0.5 @@ -5269,6 +7009,10 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 + crypto-random-string@4.0.0: + dependencies: + type-fest: 1.4.0 + css-select@5.2.2: dependencies: boolbase: 1.0.0 @@ -5514,8 +7258,7 @@ snapshots: deep-equal@1.0.1: {} - deep-extend@0.6.0: - optional: true + deep-extend@0.6.0: {} deep-is@0.1.4: {} @@ -5564,6 +7307,10 @@ snapshots: diff@8.0.4: {} + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + dom-serializer@2.0.0: dependencies: domelementtype: 2.3.0 @@ -5586,12 +7333,20 @@ snapshots: domelementtype: 2.3.0 domhandler: 5.0.3 + dot-prop@5.3.0: + dependencies: + is-obj: 2.0.0 + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 es-errors: 1.3.0 gopd: 1.2.0 + duplexer2@0.1.4: + dependencies: + readable-stream: 2.3.8 + duplexify@3.7.1: dependencies: end-of-stream: 1.4.5 @@ -5617,6 +7372,8 @@ snapshots: emoji-regex@9.2.2: {} + emojilib@2.4.0: {} + encodeurl@2.0.0: {} encoding-sniffer@0.2.1: @@ -5639,6 +7396,13 @@ snapshots: entities@7.0.1: {} + env-ci@11.2.0: + dependencies: + execa: 8.0.1 + java-properties: 1.0.2 + + env-paths@2.2.1: {} + environment@1.1.0: {} error-ex@1.3.4: @@ -5774,6 +7538,8 @@ snapshots: escape-string-regexp@4.0.0: {} + escape-string-regexp@5.0.0: {} + eslint-scope@9.1.2: dependencies: '@types/esrecurse': 4.3.1 @@ -5850,6 +7616,33 @@ snapshots: transitivePeerDependencies: - bare-abort-controller + execa@8.0.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + + execa@9.6.1: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + cross-spawn: 7.0.6 + figures: 6.1.0 + get-stream: 9.0.1 + human-signals: 8.0.1 + is-plain-obj: 4.1.0 + is-stream: 4.0.1 + npm-run-path: 6.0.0 + pretty-ms: 9.3.0 + signal-exit: 4.1.0 + strip-final-newline: 4.0.0 + yoctocolors: 2.2.0 + expand-template@2.0.3: optional: true @@ -5883,6 +7676,14 @@ snapshots: fflate@0.8.3: {} + figures@2.0.0: + dependencies: + escape-string-regexp: 1.0.5 + + figures@6.1.0: + dependencies: + is-unicode-supported: 2.1.0 + file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -5891,11 +7692,22 @@ snapshots: dependencies: to-regex-range: 5.0.1 + find-up-simple@1.0.1: {} + + find-up@2.1.0: + dependencies: + locate-path: 2.0.0 + find-up@5.0.0: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 + find-versions@6.0.0: + dependencies: + semver-regex: 4.0.5 + super-regex: 1.1.0 + flat-cache@4.0.1: dependencies: flatted: 3.4.4 @@ -5905,6 +7717,10 @@ snapshots: flatted@3.4.4: {} + follow-redirects@1.16.0(debug@4.4.3(supports-color@8.1.1)): + optionalDependencies: + debug: 4.4.3(supports-color@8.1.1) + for-each@0.3.5: dependencies: is-callable: 1.2.7 @@ -5941,6 +7757,8 @@ snapshots: function-bind@1.1.2: {} + function-timeout@1.0.2: {} + function.prototype.name@1.2.0: dependencies: call-bind: 1.0.9 @@ -5979,12 +7797,30 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.2 + get-stream@6.0.1: {} + + get-stream@8.0.1: {} + + get-stream@9.0.1: + dependencies: + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 + get-symbol-description@1.1.0: dependencies: call-bound: 1.0.4 es-errors: 1.3.0 get-intrinsic: 1.3.0 + git-log-parser@1.2.1: + dependencies: + argv-formatter: 1.0.0 + spawn-error-forwarder: 1.0.0 + split2: 1.0.0 + stream-combiner2: 1.1.1 + through2: 2.0.5 + traverse: 0.6.8 + github-from-package@0.0.0: optional: true @@ -6038,6 +7874,8 @@ snapshots: gopd@1.2.0: {} + graceful-fs@4.2.10: {} + graceful-fs@4.2.11: {} gunzip-maybe@1.4.2: @@ -6051,6 +7889,15 @@ snapshots: hachure-fill@0.5.2: {} + handlebars@4.7.9: + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.3 + happy-dom@20.11.2: dependencies: '@types/node': 26.2.0 @@ -6090,6 +7937,10 @@ snapshots: he@1.2.0: {} + highlight.js@10.7.3: {} + + hook-std@4.0.0: {} + hosted-git-info@2.8.9: {} hosted-git-info@4.1.0: @@ -6100,6 +7951,10 @@ snapshots: dependencies: lru-cache: 10.4.3 + hosted-git-info@9.0.3: + dependencies: + lru-cache: 11.5.2 + html-escaper@2.0.2: {} htmlparser2@10.1.0: @@ -6169,10 +8024,18 @@ snapshots: - kerberos - supports-color + human-signals@5.0.0: {} + + human-signals@8.0.1: {} + iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 + iconv-lite@0.7.3: + dependencies: + safer-buffer: 2.1.2 + ieee754@1.2.1: optional: true @@ -6182,18 +8045,33 @@ snapshots: immediate@3.0.6: {} + import-fresh@3.3.1: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-from-esm@2.0.0(supports-color@8.1.1): + dependencies: + debug: 4.4.3(supports-color@8.1.1) + import-meta-resolve: 4.2.0 + transitivePeerDependencies: + - supports-color + import-meta-resolve@4.2.0: {} imurmurhash@0.1.4: {} + indent-string@4.0.0: {} + + indent-string@5.0.0: {} + index-to-position@1.2.0: {} inherits@2.0.3: {} inherits@2.0.4: {} - ini@1.3.8: - optional: true + ini@1.3.8: {} internal-slot@1.1.0: dependencies: @@ -6239,6 +8117,10 @@ snapshots: is-callable@1.2.7: {} + is-ci@2.0.0: + dependencies: + ci-info: 2.0.0 + is-core-module@2.16.2: dependencies: hasown: 2.0.4 @@ -6294,6 +8176,10 @@ snapshots: is-interactive@2.0.0: {} + is-it-type@5.1.3: + dependencies: + globalthis: 1.0.4 + is-map@2.0.3: {} is-negative-zero@2.0.3: {} @@ -6305,12 +8191,16 @@ snapshots: is-number@7.0.0: {} + is-obj@2.0.0: {} + is-path-inside@3.0.3: {} is-path-inside@4.0.0: {} is-plain-obj@2.1.0: {} + is-plain-obj@4.1.0: {} + is-regex@1.2.1: dependencies: call-bound: 1.0.4 @@ -6324,6 +8214,10 @@ snapshots: dependencies: call-bound: 1.0.4 + is-stream@3.0.0: {} + + is-stream@4.0.1: {} + is-string@1.1.1: dependencies: call-bound: 1.0.4 @@ -6366,6 +8260,14 @@ snapshots: isexe@2.0.0: {} + issue-parser@7.0.2: + dependencies: + lodash.capitalize: 4.2.1 + lodash.escaperegexp: 4.1.2 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.uniqby: 4.7.0 + istanbul-lib-coverage@3.2.2: {} istanbul-lib-report@3.0.1: @@ -6391,6 +8293,8 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 + java-properties@1.0.2: {} + jiti@2.7.0: {} js-tokens@10.0.0: {} @@ -6409,12 +8313,16 @@ snapshots: json-parse-better-errors@1.0.2: {} + json-parse-even-better-errors@2.3.1: {} + json-schema-traverse@0.4.1: {} json-schema-traverse@1.0.0: {} json-stable-stringify-without-jsonify@1.0.1: {} + json-with-bigint@3.5.10: {} + json5@2.2.3: {} jsonc-parser@3.3.1: {} @@ -6593,6 +8501,8 @@ snapshots: lightningcss-win32-arm64-msvc: 1.33.0 lightningcss-win32-x64-msvc: 1.33.0 + lines-and-columns@1.2.4: {} + linkify-it@5.0.2: dependencies: uc.micro: 2.1.0 @@ -6608,12 +8518,21 @@ snapshots: pify: 3.0.0 strip-bom: 3.0.0 + locate-path@2.0.0: + dependencies: + p-locate: 2.0.0 + path-exists: 3.0.0 + locate-path@6.0.0: dependencies: p-locate: 5.0.0 lodash-es@4.18.1: {} + lodash.capitalize@4.2.1: {} + + lodash.escaperegexp@4.1.2: {} + lodash.includes@4.3.0: {} lodash.isboolean@3.0.3: {} @@ -6630,6 +8549,8 @@ snapshots: lodash.truncate@4.4.2: {} + lodash.uniqby@4.7.0: {} + lodash@4.18.1: {} log-symbols@4.1.0: @@ -6660,6 +8581,12 @@ snapshots: '@babel/types': 7.29.8 source-map-js: 1.2.1 + make-asynchronous@1.1.0: + dependencies: + p-event: 6.0.1 + type-fest: 4.41.0 + web-worker: 1.5.0 + make-dir@4.0.0: dependencies: semver: 7.8.5 @@ -6715,6 +8642,19 @@ snapshots: transitivePeerDependencies: - supports-color + marked-terminal@7.3.0(marked@15.0.12): + dependencies: + ansi-escapes: 7.3.0 + ansi-regex: 6.2.2 + chalk: 5.6.2 + cli-highlight: 2.1.11 + cli-table3: 0.6.5 + marked: 15.0.12 + node-emoji: 2.2.0 + supports-hyperlinks: 3.2.0 + + marked@15.0.12: {} + marked@16.4.2: {} math-intrinsics@1.1.0: {} @@ -6725,6 +8665,12 @@ snapshots: memorystream@0.3.1: {} + meow@13.2.0: {} + + meow@14.1.0: {} + + merge-stream@2.0.0: {} + merge2@1.4.1: {} mermaid@11.16.1: @@ -6942,6 +8888,10 @@ snapshots: mime@1.6.0: {} + mime@4.1.0: {} + + mimic-fn@4.0.0: {} + mimic-function@5.0.1: {} mimic-response@3.1.0: @@ -7006,6 +8956,14 @@ snapshots: mute-stream@0.0.8: {} + mute-stream@2.0.0: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + nanoid@3.3.18: {} napi-build-utils@2.0.0: @@ -7015,6 +8973,10 @@ snapshots: negotiator@0.6.3: {} + neo-async@2.6.2: {} + + nerf-dart@1.0.0: {} + nice-try@1.0.5: {} node-abi@3.94.0: @@ -7025,6 +8987,13 @@ snapshots: node-addon-api@4.3.0: optional: true + node-emoji@2.2.0: + dependencies: + '@sindresorhus/is': 4.6.0 + char-regex: 1.0.2 + emojilib: 2.4.0 + skin-tone: 2.0.0 + node-sarif-builder@3.4.0: dependencies: '@types/sarif': 2.1.7 @@ -7043,6 +9012,14 @@ snapshots: semver: 7.8.5 validate-npm-package-license: 3.0.4 + normalize-package-data@8.0.0: + dependencies: + hosted-git-info: 9.0.3 + semver: 7.8.5 + validate-npm-package-license: 3.0.4 + + normalize-url@9.0.1: {} + npm-run-all@4.1.5: dependencies: ansi-styles: 3.2.1 @@ -7055,10 +9032,23 @@ snapshots: shell-quote: 1.10.0 string.prototype.padend: 3.1.6 + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + npm-run-path@6.0.0: + dependencies: + path-key: 4.0.0 + unicorn-magic: 0.3.0 + + npm@11.19.0: {} + nth-check@2.1.1: dependencies: boolbase: 1.0.0 + object-assign@4.1.1: {} + object-inspect@1.13.4: {} object-keys@1.1.1: {} @@ -7084,6 +9074,10 @@ snapshots: dependencies: wrappy: 1.0.2 + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + onetime@7.0.0: dependencies: mimic-function: 5.0.1 @@ -7116,6 +9110,23 @@ snapshots: string-width: 7.2.0 strip-ansi: 7.2.0 + ovsx@1.1.1(@types/node@24.13.3)(debug@4.4.3(supports-color@8.1.1))(supports-color@8.1.1): + dependencies: + '@inquirer/prompts': 7.10.1(@types/node@24.13.3) + '@vscode/vsce': 3.9.2(supports-color@8.1.1) + commander: 6.2.1 + cross-keychain: 1.1.0(@types/node@24.13.3) + follow-redirects: 1.16.0(debug@4.4.3(supports-color@8.1.1)) + is-ci: 2.0.0 + leven: 3.1.0 + semver: 7.8.5 + tmp: 0.2.7 + yauzl-promise: 4.0.0 + transitivePeerDependencies: + - '@types/node' + - debug + - supports-color + own-keys@1.0.2: dependencies: call-bound: 1.0.4 @@ -7123,16 +9134,40 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 + p-each-series@3.0.0: {} + + p-event@6.0.1: + dependencies: + p-timeout: 6.1.4 + + p-filter@4.1.0: + dependencies: + p-map: 7.0.6 + + p-limit@1.3.0: + dependencies: + p-try: 1.0.0 + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 + p-locate@2.0.0: + dependencies: + p-limit: 1.3.0 + p-locate@5.0.0: dependencies: p-limit: 3.1.0 p-map@7.0.6: {} + p-reduce@3.0.0: {} + + p-timeout@6.1.4: {} + + p-try@1.0.0: {} + package-json-from-dist@1.0.1: {} package-manager-detector@1.8.0: {} @@ -7141,6 +9176,10 @@ snapshots: pako@1.0.11: {} + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + parse-entities@4.0.2: dependencies: '@types/unist': 2.0.11 @@ -7156,16 +9195,29 @@ snapshots: error-ex: 1.3.4 json-parse-better-errors: 1.0.2 + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.29.7 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + parse-json@8.3.0: dependencies: '@babel/code-frame': 7.29.7 index-to-position: 1.2.0 type-fest: 4.41.0 + parse-ms@4.0.0: {} + parse-semver@1.1.1: dependencies: semver: 5.7.2 + parse5-htmlparser2-tree-adapter@6.0.1: + dependencies: + parse5: 6.0.1 + parse5-htmlparser2-tree-adapter@7.1.0: dependencies: domhandler: 5.0.3 @@ -7175,6 +9227,10 @@ snapshots: dependencies: parse5: 7.3.0 + parse5@5.1.1: {} + + parse5@6.0.1: {} + parse5@7.3.0: dependencies: entities: 6.0.1 @@ -7183,6 +9239,8 @@ snapshots: path-data-parser@0.1.0: {} + path-exists@3.0.0: {} + path-exists@4.0.0: {} path-is-absolute@1.0.1: {} @@ -7191,6 +9249,8 @@ snapshots: path-key@3.1.1: {} + path-key@4.0.0: {} + path-parse@1.0.7: {} path-scurry@1.11.1: @@ -7209,6 +9269,8 @@ snapshots: dependencies: pify: 3.0.0 + path-type@4.0.0: {} + path-type@6.0.0: {} pathe@2.0.3: {} @@ -7231,6 +9293,11 @@ snapshots: pify@3.0.0: {} + pkg-conf@2.1.0: + dependencies: + find-up: 2.1.0 + load-json-file: 4.0.0 + playwright-core@1.62.1: {} playwright@1.62.1: @@ -7278,8 +9345,14 @@ snapshots: prettier@3.9.6: {} + pretty-ms@9.3.0: + dependencies: + parse-ms: 4.0.0 + process-nextick-args@2.0.1: {} + proto-list@1.2.4: {} + proxy-agent-negotiate@1.1.0: {} pump@2.0.1: @@ -7324,7 +9397,26 @@ snapshots: ini: 1.3.8 minimist: 1.2.8 strip-json-comments: 2.0.1 - optional: true + + read-package-up@11.0.0: + dependencies: + find-up-simple: 1.0.1 + read-pkg: 9.0.1 + type-fest: 4.41.0 + + read-package-up@12.0.0: + dependencies: + find-up-simple: 1.0.1 + read-pkg: 10.1.0 + type-fest: 5.8.0 + + read-pkg@10.1.0: + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 8.0.0 + parse-json: 8.3.0 + type-fest: 5.8.0 + unicorn-magic: 0.4.0 read-pkg@3.0.0: dependencies: @@ -7385,10 +9477,18 @@ snapshots: gopd: 1.2.0 set-function-name: 2.0.2 + registry-auth-token@5.1.1: + dependencies: + '@pnpm/npm-conf': 3.0.3 + require-directory@2.1.1: {} require-from-string@2.0.2: {} + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + resolve-path@1.4.0: dependencies: http-errors: 1.6.3 @@ -7484,6 +9584,43 @@ snapshots: transitivePeerDependencies: - supports-color + semantic-release@25.0.9(supports-color@8.1.1)(typescript@6.0.3): + dependencies: + '@semantic-release/commit-analyzer': 13.0.1(semantic-release@25.0.9(supports-color@8.1.1)(typescript@6.0.3))(supports-color@8.1.1) + '@semantic-release/error': 4.0.0 + '@semantic-release/github': 12.0.9(semantic-release@25.0.9(supports-color@8.1.1)(typescript@6.0.3))(supports-color@8.1.1) + '@semantic-release/npm': 13.1.5(semantic-release@25.0.9(supports-color@8.1.1)(typescript@6.0.3)) + '@semantic-release/release-notes-generator': 14.1.1(semantic-release@25.0.9(supports-color@8.1.1)(typescript@6.0.3))(supports-color@8.1.1) + aggregate-error: 5.0.0 + cosmiconfig: 9.0.2(typescript@6.0.3) + debug: 4.4.3(supports-color@8.1.1) + env-ci: 11.2.0 + execa: 9.6.1 + figures: 6.1.0 + find-versions: 6.0.0 + get-stream: 6.0.1 + git-log-parser: 1.2.1 + hook-std: 4.0.0 + hosted-git-info: 9.0.3 + import-from-esm: 2.0.0(supports-color@8.1.1) + lodash-es: 4.18.1 + marked: 15.0.12 + marked-terminal: 7.3.0(marked@15.0.12) + micromatch: 4.0.8 + p-each-series: 3.0.0 + p-reduce: 3.0.0 + read-package-up: 12.0.0 + resolve-from: 5.0.0 + semver: 7.8.5 + signale: 1.4.0 + yargs: 18.1.0 + transitivePeerDependencies: + - kerberos + - supports-color + - typescript + + semver-regex@4.0.5: {} + semver@5.7.2: {} semver@7.8.5: {} @@ -7564,6 +9701,12 @@ snapshots: signal-exit@4.1.0: {} + signale@1.4.0: + dependencies: + chalk: 2.4.2 + figures: 2.0.0 + pkg-conf: 2.1.0 + simple-concat@1.0.1: optional: true @@ -7574,6 +9717,12 @@ snapshots: simple-concat: 1.0.1 optional: true + simple-invariant@2.0.1: {} + + skin-tone@2.0.0: + dependencies: + unicode-emoji-modifier-base: 1.0.0 + slash@5.1.0: {} slice-ansi@4.0.0: @@ -7588,6 +9737,10 @@ snapshots: source-map-js@1.2.1: {} + source-map@0.6.1: {} + + spawn-error-forwarder@1.0.0: {} + spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 @@ -7602,6 +9755,10 @@ snapshots: spdx-license-ids@3.0.23: {} + split2@1.0.0: + dependencies: + through2: 2.0.5 + stackback@0.0.2: {} statuses@1.5.0: {} @@ -7617,6 +9774,11 @@ snapshots: es-errors: 1.3.0 internal-slot: 1.1.0 + stream-combiner2@1.1.1: + dependencies: + duplexer2: 0.1.4 + readable-stream: 2.3.8 + stream-shift@1.0.3: {} streamx@2.28.0: @@ -7706,8 +9868,11 @@ snapshots: strip-bom@3.0.0: {} - strip-json-comments@2.0.1: - optional: true + strip-final-newline@3.0.0: {} + + strip-final-newline@4.0.0: {} + + strip-json-comments@2.0.1: {} strip-json-comments@3.1.1: {} @@ -7717,6 +9882,12 @@ snapshots: stylis@4.4.0: {} + super-regex@1.1.0: + dependencies: + function-timeout: 1.0.2 + make-asynchronous: 1.1.0 + time-span: 5.1.0 + supports-color@10.2.2: {} supports-color@5.5.0: @@ -7746,6 +9917,8 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 + tagged-tag@1.0.0: {} + tapable@2.3.3: {} tar-fs@2.1.5: @@ -7795,6 +9968,15 @@ snapshots: - bare-abort-controller - react-native-b4a + temp-dir@3.0.0: {} + + tempy@3.2.0: + dependencies: + is-stream: 3.0.0 + temp-dir: 3.0.0 + type-fest: 2.19.0 + unique-string: 3.0.0 + terminal-link@4.0.0: dependencies: ansi-escapes: 7.3.0 @@ -7818,11 +10000,23 @@ snapshots: dependencies: editions: 6.22.0 + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + through2@2.0.5: dependencies: readable-stream: 2.3.8 xtend: 4.0.2 + time-span@5.1.0: + dependencies: + convert-hrtime: 5.0.0 + tinybench@2.9.0: {} tinyexec@1.3.0: {} @@ -7842,6 +10036,8 @@ snapshots: toidentifier@1.0.1: {} + traverse@0.6.8: {} + ts-api-utils@2.5.0(typescript@6.0.3): dependencies: typescript: 6.0.3 @@ -7863,8 +10059,16 @@ snapshots: dependencies: prelude-ls: 1.2.1 + type-fest@1.4.0: {} + + type-fest@2.19.0: {} + type-fest@4.41.0: {} + type-fest@5.8.0: + dependencies: + tagged-tag: 1.0.0 + type-is@2.1.0: dependencies: content-type: 2.0.0 @@ -7927,6 +10131,9 @@ snapshots: uc.micro@3.0.0: {} + uglify-js@3.19.3: + optional: true + unbox-primitive@1.1.0: dependencies: call-bound: 1.0.4 @@ -7940,14 +10147,24 @@ snapshots: undici-types@8.3.0: {} + undici@6.28.0: {} + undici@7.29.0: {} + unicode-emoji-modifier-base@1.0.0: {} + unicorn-magic@0.1.0: {} unicorn-magic@0.3.0: {} unicorn-magic@0.4.0: {} + unique-string@3.0.0: + dependencies: + crypto-random-string: 4.0.0 + + universal-user-agent@7.0.3: {} + universalify@2.0.1: {} uri-js@4.4.1: @@ -7956,6 +10173,8 @@ snapshots: url-join@4.0.1: {} + url-join@5.0.0: {} + util-deprecate@1.0.2: {} uuid@14.0.1: {} @@ -8019,6 +10238,8 @@ snapshots: vscode-uri@3.1.0: {} + web-worker@1.5.0: {} + whatwg-encoding@3.1.1: dependencies: iconv-lite: 0.6.3 @@ -8083,8 +10304,16 @@ snapshots: word-wrap@1.2.5: {} + wordwrap@1.0.0: {} + workerpool@9.3.4: {} + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -8124,6 +10353,8 @@ snapshots: yallist@4.0.0: {} + yargs-parser@20.2.9: {} + yargs-parser@21.1.1: {} yargs-parser@22.0.0: {} @@ -8135,6 +10366,16 @@ snapshots: flat: 5.0.2 is-plain-obj: 2.1.0 + yargs@16.2.2: + dependencies: + cliui: 7.0.4 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + yargs@17.7.3: dependencies: cliui: 8.0.1 @@ -8154,6 +10395,12 @@ snapshots: y18n: 5.0.8 yargs-parser: 22.0.0 + yauzl-promise@4.0.0: + dependencies: + '@node-rs/crc32': 1.10.6 + is-it-type: 5.1.3 + simple-invariant: 2.0.1 + yauzl@3.4.0: dependencies: pend: 1.2.0 @@ -8163,3 +10410,7 @@ snapshots: buffer-crc32: 0.2.13 yocto-queue@0.1.0: {} + + yoctocolors-cjs@2.1.3: {} + + yoctocolors@2.2.0: {} diff --git a/release.config.mjs b/release.config.mjs new file mode 100644 index 0000000..050850b --- /dev/null +++ b/release.config.mjs @@ -0,0 +1 @@ +export { default } from './scripts/lib/release-config.mts'; diff --git a/scripts/lib/checksum.mts b/scripts/lib/checksum.mts new file mode 100644 index 0000000..c36b75a --- /dev/null +++ b/scripts/lib/checksum.mts @@ -0,0 +1,31 @@ +import assert from 'node:assert/strict'; +import { createHash } from 'node:crypto'; +import { readFile, writeFile } from 'node:fs/promises'; +import path from 'node:path'; + +export async function sha256(pathname: string): Promise { + return createHash('sha256') + .update(await readFile(pathname)) + .digest('hex'); +} + +export async function writeSha256(pathname: string): Promise { + const checksumPath = `${pathname}.sha256`; + const digest = await sha256(pathname); + await writeFile( + checksumPath, + `${digest} ${path.basename(pathname)}\n`, + 'utf8', + ); + + return checksumPath; +} + +export async function assertSha256( + pathname: string, + checksumPath: string, +): Promise { + const line = await readFile(checksumPath, 'utf8'); + const expected = `${await sha256(pathname)} ${path.basename(pathname)}\n`; + assert.equal(line, expected); +} diff --git a/scripts/lib/package-contract.mts b/scripts/lib/package-contract.mts new file mode 100644 index 0000000..38f4b6a --- /dev/null +++ b/scripts/lib/package-contract.mts @@ -0,0 +1,85 @@ +import assert from 'node:assert/strict'; +import { readFile } from 'node:fs/promises'; +import { unzipSync } from 'fflate'; + +export const expectedPackageEntries = [ + '[Content_Types].xml', + 'extension.vsixmanifest', + 'extension/LICENSE.txt', + 'extension/changelog.md', + 'extension/dist/node/extension.js', + 'extension/dist/preview/mermaid-runtime.js', + 'extension/dist/preview/preview.css', + 'extension/dist/preview/preview.js', + 'extension/dist/web/extension.js', + 'extension/img/icon.png', + 'extension/img/preview.png', + 'extension/package.json', + 'extension/readme.md', +].sort(); + +interface PackagedManifest { + browser?: unknown; + contributes: Record; + icon?: unknown; + main?: unknown; + version?: unknown; +} + +export interface PackageInspection { + archive: Record; + changelog: string; + manifest: PackagedManifest; +} + +export async function inspectPackage( + archivePath: string | URL, +): Promise { + const archive = unzipSync(new Uint8Array(await readFile(archivePath))); + const manifest = JSON.parse( + new TextDecoder().decode(archive['extension/package.json']), + ) as PackagedManifest; + + return { + archive, + changelog: new TextDecoder().decode(archive['extension/changelog.md']), + manifest, + }; +} + +export function assertPackageInventory( + inspection: PackageInspection, + expectedVersion: string, +): void { + assert.deepEqual( + Object.keys(inspection.archive).sort(), + expectedPackageEntries, + ); + for (const file of expectedPackageEntries) { + assert.ok( + inspection.archive[file].byteLength > 0, + `expected ${file} to be non-empty`, + ); + } + + assert.equal(inspection.manifest.version, expectedVersion); + assert.equal(inspection.manifest.icon, 'img/icon.png'); + assert.equal(inspection.manifest.main, './dist/node/extension.js'); + assert.equal(inspection.manifest.browser, './dist/web/extension.js'); + assert.ok( + inspection.archive['extension/dist/preview/mermaid-runtime.js'].byteLength > + inspection.archive['extension/dist/node/extension.js'].byteLength, + 'Mermaid stays in its separately loaded preview bundle', + ); +} + +export function assertReleaseChangelog( + inspection: PackageInspection, + version: string, +): void { + assert.match( + inspection.changelog, + new RegExp(`\\b${version.replaceAll('.', '\\.')}\\b`), + ); + assert.doesNotMatch(inspection.changelog, /^## \[Unreleased\]/m); +} diff --git a/scripts/lib/package.mts b/scripts/lib/package.mts new file mode 100644 index 0000000..40d39ca --- /dev/null +++ b/scripts/lib/package.mts @@ -0,0 +1,115 @@ +import { spawn } from 'node:child_process'; +import { mkdir, readFile, rm } from 'node:fs/promises'; +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; +import { pnpmInvocation } from './commands.mts'; + +const repositoryRoot = fileURLToPath(new URL('../..', import.meta.url)); +const semanticVersionPattern = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/; +const extensionIdentifierPattern = /^[a-z0-9][a-z0-9-]*$/i; + +interface ExtensionManifest { + name: string; + publisher: string; + version: string; +} + +export interface PackageArtifact { + filename: string; + path: string; + version: string; +} + +export function assertSemanticVersion(version: string): void { + if (!semanticVersionPattern.test(version)) { + throw new Error(`Expected a stable semantic version, received: ${version}`); + } +} + +export function packageFilename( + publisher: string, + name: string, + version: string, +): string { + if ( + !extensionIdentifierPattern.test(publisher) || + !extensionIdentifierPattern.test(name) + ) { + throw new Error('Extension publisher and name must be safe identifiers'); + } + assertSemanticVersion(version); + + return `${publisher}.${name}-${version}.vsix`; +} + +async function readManifest(): Promise { + const manifest = JSON.parse( + await readFile(path.join(repositoryRoot, 'package.json'), 'utf8'), + ) as Partial; + + if (!manifest.name || !manifest.publisher || !manifest.version) { + throw new Error( + 'Extension manifest is missing name, publisher, or version', + ); + } + + return manifest as ExtensionManifest; +} + +async function runVsce(args: readonly string[]): Promise { + const invocation = pnpmInvocation(['exec', 'vsce', ...args]); + + await new Promise((resolve, reject) => { + const child = spawn(invocation.command, invocation.args, { + ...invocation.options, + cwd: repositoryRoot, + }); + + child.once('error', (error) => { + reject(new Error(`Failed to package extension: ${error.message}`)); + }); + child.once('exit', (code, signal) => { + if (signal) { + reject(new Error(`Extension packaging exited after signal ${signal}`)); + return; + } + if (code !== 0) { + reject(new Error(`Extension packaging exited with code ${code ?? 1}`)); + return; + } + + resolve(); + }); + }); +} + +export async function packageExtension( + explicitVersion?: string, +): Promise { + const manifest = await readManifest(); + const version = explicitVersion ?? manifest.version; + const filename = packageFilename(manifest.publisher, manifest.name, version); + const artifactDirectory = path.join(repositoryRoot, 'artifacts'); + const artifactPath = path.join(artifactDirectory, filename); + + await mkdir(artifactDirectory, { recursive: true }); + await rm(artifactPath, { force: true }); + await rm(`${artifactPath}.sha256`, { force: true }); + + const versionArgument = explicitVersion + ? [explicitVersion, '--no-git-tag-version', '--no-update-package-json'] + : []; + await runVsce([ + 'package', + ...versionArgument, + '--no-dependencies', + '--out', + artifactPath, + ]); + + return { + filename, + path: path.relative(repositoryRoot, artifactPath), + version, + }; +} diff --git a/scripts/lib/release-config.mts b/scripts/lib/release-config.mts new file mode 100644 index 0000000..7936e44 --- /dev/null +++ b/scripts/lib/release-config.mts @@ -0,0 +1,66 @@ +import type { Options } from 'semantic-release'; + +export const releaseRules = [ + { breaking: true, release: 'major' }, + { type: 'docs', release: 'patch' }, + { type: 'revert', release: 'patch' }, +] as const; + +export const changelogTypes = [ + { type: 'feat', section: 'Features' }, + { type: 'feature', section: 'Features' }, + { type: 'fix', section: 'Bug Fixes' }, + { type: 'perf', section: 'Performance Improvements' }, + { type: 'revert', section: 'Reverts' }, + { type: 'docs', section: 'Documentation' }, + { type: 'style', section: 'Styles', hidden: true }, + { type: 'chore', section: 'Miscellaneous Chores', hidden: true }, + { type: 'refactor', section: 'Code Refactoring', hidden: true }, + { type: 'test', section: 'Tests', hidden: true }, + { type: 'build', section: 'Build System', hidden: true }, + { type: 'ci', section: 'Continuous Integration', hidden: true }, +] as const; + +const releaseConfig = { + branches: ['main'], + tagFormat: 'v${version}', + plugins: [ + [ + '@semantic-release/commit-analyzer', + { + preset: 'conventionalcommits', + releaseRules, + }, + ], + [ + '@semantic-release/release-notes-generator', + { + preset: 'conventionalcommits', + presetConfig: { types: changelogTypes }, + }, + ], + [ + '@semantic-release/changelog', + { + changelogFile: 'CHANGELOG.md', + changelogTitle: + '# Changelog\n\nRelease history is available in\n[GitHub Releases](https://github.com/jimeh/vscode-better-markdown-preview/releases).', + }, + ], + [ + '@semantic-release/exec', + { + prepareCmd: 'mise run release:package -- ${nextRelease.version}', + }, + ], + [ + '@semantic-release/github', + { + releasedLabels: false, + successCommentCondition: false, + }, + ], + ], +} satisfies Options; + +export default releaseConfig; diff --git a/scripts/lib/release.mts b/scripts/lib/release.mts new file mode 100644 index 0000000..8026b56 --- /dev/null +++ b/scripts/lib/release.mts @@ -0,0 +1,48 @@ +import { appendFile } from 'node:fs/promises'; +import type { Result } from 'semantic-release'; +import { packageFilename } from './package.mts'; + +export interface ReleaseOutputs { + released: 'false' | 'true'; + version: string; + git_tag: string; + vsix_path: string; + checksum_path: string; +} + +export function releaseOutputs(result: Result): ReleaseOutputs { + if (!result) { + return { + released: 'false', + version: '', + git_tag: '', + vsix_path: '', + checksum_path: '', + }; + } + + const filename = packageFilename( + 'jimeh', + 'better-markdown-preview', + result.nextRelease.version, + ); + const vsixPath = `artifacts/${filename}`; + + return { + released: 'true', + version: result.nextRelease.version, + git_tag: result.nextRelease.gitTag, + vsix_path: vsixPath, + checksum_path: `${vsixPath}.sha256`, + }; +} + +export async function writeReleaseOutputs( + outputPath: string, + outputs: ReleaseOutputs, +): Promise { + const lines = Object.entries(outputs) + .map(([name, value]) => `${name}=${value}`) + .join('\n'); + await appendFile(outputPath, `${lines}\n`, 'utf8'); +} diff --git a/scripts/package.mts b/scripts/package.mts index 7ce4e09..b5d0837 100644 --- a/scripts/package.mts +++ b/scripts/package.mts @@ -1,30 +1,4 @@ -import { mkdir } from 'node:fs/promises'; -import { spawn } from 'node:child_process'; -import { pnpmInvocation } from './lib/commands.mts'; +import { packageExtension } from './lib/package.mts'; -await mkdir('artifacts', { recursive: true }); - -const invocation = pnpmInvocation([ - 'exec', - 'vsce', - 'package', - '--no-dependencies', - '--out', - 'artifacts/better-markdown-preview.vsix', -]); -const child = spawn(invocation.command, invocation.args, invocation.options); - -child.on('error', (error) => { - console.error(`Failed to package extension: ${error.message}`); - process.exitCode = 1; -}); - -child.on('exit', (code, signal) => { - if (signal) { - console.error(`Extension packaging exited after signal ${signal}`); - process.exitCode = 1; - return; - } - - process.exitCode = code ?? 1; -}); +const artifact = await packageExtension(process.argv[2]); +console.log(`Packaged ${artifact.path}`); diff --git a/scripts/prepare-release.mts b/scripts/prepare-release.mts new file mode 100644 index 0000000..44aa791 --- /dev/null +++ b/scripts/prepare-release.mts @@ -0,0 +1,25 @@ +import path from 'node:path'; +import { assertSha256, writeSha256 } from './lib/checksum.mts'; +import { + assertPackageInventory, + assertReleaseChangelog, + inspectPackage, +} from './lib/package-contract.mts'; +import { assertSemanticVersion, packageExtension } from './lib/package.mts'; + +const version = process.argv[2]; +if (!version) { + throw new Error('Usage: node scripts/prepare-release.mts '); +} +assertSemanticVersion(version); + +const artifact = await packageExtension(version); +const inspection = await inspectPackage(artifact.path); +assertPackageInventory(inspection, version); +assertReleaseChangelog(inspection, version); + +const checksumPath = await writeSha256(artifact.path); +await assertSha256(artifact.path, checksumPath); + +console.log(`Prepared ${artifact.path}`); +console.log(`Verified ${path.relative(process.cwd(), checksumPath)}`); diff --git a/scripts/release.mts b/scripts/release.mts new file mode 100644 index 0000000..db1111e --- /dev/null +++ b/scripts/release.mts @@ -0,0 +1,16 @@ +import semanticRelease from 'semantic-release'; +import releaseConfig from './lib/release-config.mts'; +import { releaseOutputs, writeReleaseOutputs } from './lib/release.mts'; + +const result = await semanticRelease(releaseConfig); +const outputs = releaseOutputs(result); + +if (process.env.GITHUB_OUTPUT) { + await writeReleaseOutputs(process.env.GITHUB_OUTPUT, outputs); +} + +if (outputs.released === 'true') { + console.log(`Released ${outputs.git_tag}`); +} else { + console.log('No release-worthy commits found'); +} diff --git a/test/manifest.test.mts b/test/manifest.test.mts index cfd5570..d2db7a8 100644 --- a/test/manifest.test.mts +++ b/test/manifest.test.mts @@ -9,6 +9,7 @@ const manifest = JSON.parse( ); test('manifest exposes native Markdown preview hooks for desktop and web', () => { + assert.equal(manifest.version, '0.0.0'); assert.equal(manifest.engines.vscode, `^${DESKTOP_FLOOR_VERSION}`); assert.equal(manifest.icon, 'img/icon.png'); assert.equal(manifest.main, './dist/node/extension.js'); diff --git a/test/package-content.test.mts b/test/package-content.test.mts index ae9b671..6300610 100644 --- a/test/package-content.test.mts +++ b/test/package-content.test.mts @@ -1,40 +1,29 @@ import assert from 'node:assert/strict'; import { readFile } from 'node:fs/promises'; import test from 'node:test'; -import { unzipSync } from 'fflate'; +import { + assertPackageInventory, + inspectPackage, +} from '../scripts/lib/package-contract.mts'; +import { packageFilename } from '../scripts/lib/package.mts'; import { assertConfigurationContribution } from './configuration-contract.mts'; -const archiveUrl = new URL( - '../artifacts/better-markdown-preview.vsix', - import.meta.url, -); -const expectedEntries = [ - '[Content_Types].xml', - 'extension.vsixmanifest', - 'extension/LICENSE.txt', - 'extension/changelog.md', - 'extension/dist/node/extension.js', - 'extension/dist/preview/mermaid-runtime.js', - 'extension/dist/preview/preview.css', - 'extension/dist/preview/preview.js', - 'extension/dist/web/extension.js', - 'extension/img/icon.png', - 'extension/img/preview.png', - 'extension/package.json', - 'extension/readme.md', -].sort(); +const sourceManifest = JSON.parse( + await readFile(new URL('../package.json', import.meta.url), 'utf8'), +) as { name: string; publisher: string; version: string }; +const expectedVersion = + process.env.EXPECTED_PACKAGE_VERSION ?? sourceManifest.version; +const archiveUrl = process.env.PACKAGE_PATH + ? new URL(`../${process.env.PACKAGE_PATH}`, import.meta.url) + : new URL( + `../artifacts/${packageFilename(sourceManifest.publisher, sourceManifest.name, expectedVersion)}`, + import.meta.url, + ); test('VSIX contains exactly the expected runtime archive', async () => { - const archive = unzipSync(new Uint8Array(await readFile(archiveUrl))); - - assert.deepEqual(Object.keys(archive).sort(), expectedEntries); - for (const file of expectedEntries) { - assert.ok(archive[file].byteLength > 0, `expected ${file} to be non-empty`); - } - - const packagedManifest = JSON.parse( - new TextDecoder().decode(archive['extension/package.json']), - ); + const inspection = await inspectPackage(archiveUrl); + assertPackageInventory(inspection, expectedVersion); + const packagedManifest = inspection.manifest; assert.equal(packagedManifest.icon, 'img/icon.png'); assert.equal(packagedManifest.main, './dist/node/extension.js'); assert.equal(packagedManifest.browser, './dist/web/extension.js'); @@ -49,9 +38,4 @@ test('VSIX contains exactly the expected runtime archive', async () => { './dist/preview/preview.js', ]); assertConfigurationContribution(packagedManifest.contributes.configuration); - assert.ok( - archive['extension/dist/preview/mermaid-runtime.js'].byteLength > - archive['extension/dist/node/extension.js'].byteLength, - 'Mermaid stays in its separately loaded preview bundle', - ); }); diff --git a/test/release.test.mts b/test/release.test.mts new file mode 100644 index 0000000..c0ed56e --- /dev/null +++ b/test/release.test.mts @@ -0,0 +1,256 @@ +import assert from 'node:assert/strict'; +import { mkdtemp, readFile, rm, writeFile } from 'node:fs/promises'; +import os from 'node:os'; +import path from 'node:path'; +import test from 'node:test'; +import type { Result } from 'semantic-release'; +import { assertSha256, writeSha256 } from '../scripts/lib/checksum.mts'; +import { + assertReleaseChangelog, + type PackageInspection, +} from '../scripts/lib/package-contract.mts'; +import { packageFilename } from '../scripts/lib/package.mts'; +import releaseConfig from '../scripts/lib/release-config.mts'; +import { + releaseOutputs, + writeReleaseOutputs, +} from '../scripts/lib/release.mts'; + +interface Commit { + hash: string; + message: string; +} + +type AnalyzeCommits = ( + pluginConfig: Record, + context: { + commits: Commit[]; + cwd: string; + logger: { log: () => void }; + }, +) => Promise; + +type GenerateNotes = ( + pluginConfig: Record, + context: Record, +) => Promise; + +type PrepareChangelog = ( + pluginConfig: Record, + context: { + cwd: string; + logger: { log: () => void }; + nextRelease: { notes: string }; + }, +) => Promise; + +const commitAnalyzerModule = '@semantic-release/commit-analyzer'; +const notesGeneratorModule = '@semantic-release/release-notes-generator'; +const changelogModule = '@semantic-release/changelog'; +const { analyzeCommits } = (await import(commitAnalyzerModule)) as { + analyzeCommits: AnalyzeCommits; +}; +const { generateNotes } = (await import(notesGeneratorModule)) as { + generateNotes: GenerateNotes; +}; +const { prepare: prepareChangelog } = (await import(changelogModule)) as { + prepare: PrepareChangelog; +}; + +function pluginOptions(name: string): Record { + const specification = releaseConfig.plugins?.find( + (plugin) => Array.isArray(plugin) && plugin[0] === name, + ); + assert.ok(Array.isArray(specification)); + assert.equal(typeof specification[1], 'object'); + + return specification[1] as Record; +} + +async function releaseType(message: string): Promise { + return analyzeCommits(pluginOptions(commitAnalyzerModule), { + commits: [{ hash: 'abc1234', message }], + cwd: process.cwd(), + logger: { log: () => undefined }, + }); +} + +test('release policy maps conventional commits to intended versions', async () => { + assert.deepEqual(releaseConfig.branches, ['main']); + assert.equal(releaseConfig.tagFormat, 'v${version}'); + assert.equal(await releaseType('feat: add viewer'), 'minor'); + assert.equal(await releaseType('fix: restore preview'), 'patch'); + assert.equal(await releaseType('docs: explain columns'), 'patch'); + assert.equal(await releaseType('revert: remove broken change'), 'patch'); + assert.equal(await releaseType('chore: reorder tooling'), null); + assert.equal(await releaseType('feat!: remove legacy setting'), 'major'); + assert.equal( + await releaseType('docs!: replace configuration format'), + 'major', + ); + assert.equal(await releaseType('chore!: drop old Node versions'), 'major'); + assert.deepEqual( + releaseConfig.plugins?.map((plugin) => + Array.isArray(plugin) ? plugin[0] : plugin, + ), + [ + '@semantic-release/commit-analyzer', + '@semantic-release/release-notes-generator', + '@semantic-release/changelog', + '@semantic-release/exec', + '@semantic-release/github', + ], + ); +}); + +test('generated notes show documentation and hide maintenance commits', async () => { + const notes = await generateNotes(pluginOptions(notesGeneratorModule), { + commits: [ + { hash: 'abc1234', message: 'docs: explain columns' }, + { hash: 'def5678', message: 'chore: reorder tooling' }, + ], + cwd: process.cwd(), + lastRelease: { + channels: [], + gitHead: '0000000', + gitTag: 'v1.0.0', + name: 'v1.0.0', + version: '1.0.0', + }, + logger: { log: () => undefined }, + nextRelease: { + channel: '', + gitHead: '1111111', + gitTag: 'v1.0.1', + name: 'v1.0.1', + type: 'patch', + version: '1.0.1', + }, + options: { + repositoryUrl: + 'https://github.com/jimeh/vscode-better-markdown-preview.git', + }, + }); + + assert.match(notes, /### Documentation/); + assert.match(notes, /explain columns/); + assert.doesNotMatch(notes, /reorder tooling/); +}); + +test('release artifacts use stable versioned filenames', () => { + assert.equal( + packageFilename('jimeh', 'better-markdown-preview', '1.2.3'), + 'jimeh.better-markdown-preview-1.2.3.vsix', + ); + assert.throws( + () => packageFilename('jimeh', 'better-markdown-preview', '../1.2.3'), + /Expected a stable semantic version/, + ); +}); + +test('release package checks require current notes and a valid checksum', async () => { + const temporaryDirectory = await mkdtemp( + path.join(os.tmpdir(), 'better-markdown-preview-checksum-'), + ); + try { + const changelogPath = path.join(temporaryDirectory, 'CHANGELOG.md'); + await writeFile( + changelogPath, + await readFile(new URL('../CHANGELOG.md', import.meta.url), 'utf8'), + ); + await prepareChangelog(pluginOptions(changelogModule), { + cwd: temporaryDirectory, + logger: { log: () => undefined }, + nextRelease: { + notes: '## 1.2.3\n\n### Documentation\n\n- explain release automation', + }, + }); + const inspection = { + archive: {}, + changelog: await readFile(changelogPath, 'utf8'), + manifest: { contributes: {} }, + } satisfies PackageInspection; + assertReleaseChangelog(inspection, '1.2.3'); + assert.match(inspection.changelog, /GitHub Releases/); + assert.equal( + [...inspection.changelog.matchAll(/^# Changelog$/gm)].length, + 1, + ); + assert.throws( + () => + assertReleaseChangelog( + { ...inspection, changelog: '# Changelog\n\n## [Unreleased]\n' }, + '1.2.3', + ), + /The input did not match|The input was expected not to match/, + ); + + const vsixPath = path.join(temporaryDirectory, 'extension.vsix'); + await writeFile(vsixPath, 'immutable package bytes'); + const checksumPath = await writeSha256(vsixPath); + await assertSha256(vsixPath, checksumPath); + await writeFile(vsixPath, 'mutated package bytes'); + await assert.rejects(assertSha256(vsixPath, checksumPath)); + } finally { + await rm(temporaryDirectory, { force: true, recursive: true }); + } +}); + +test('release runner exposes no-op and published outputs', async () => { + assert.deepEqual(releaseOutputs(false), { + released: 'false', + version: '', + git_tag: '', + vsix_path: '', + checksum_path: '', + }); + + const outputs = releaseOutputs({ + commits: [], + lastRelease: { + channels: [], + gitHead: '0000000', + gitTag: 'v1.2.2', + name: 'v1.2.2', + version: '1.2.2', + }, + nextRelease: { + channel: '', + gitHead: '1111111', + gitTag: 'v1.2.3', + name: 'v1.2.3', + notes: 'notes', + type: 'patch', + version: '1.2.3', + }, + releases: [], + } as Result); + assert.deepEqual(outputs, { + released: 'true', + version: '1.2.3', + git_tag: 'v1.2.3', + vsix_path: 'artifacts/jimeh.better-markdown-preview-1.2.3.vsix', + checksum_path: 'artifacts/jimeh.better-markdown-preview-1.2.3.vsix.sha256', + }); + + const temporaryDirectory = await mkdtemp( + path.join(os.tmpdir(), 'better-markdown-preview-release-'), + ); + try { + const outputPath = path.join(temporaryDirectory, 'github-output'); + await writeReleaseOutputs(outputPath, outputs); + assert.equal( + await readFile(outputPath, 'utf8'), + [ + 'released=true', + 'version=1.2.3', + 'git_tag=v1.2.3', + 'vsix_path=artifacts/jimeh.better-markdown-preview-1.2.3.vsix', + 'checksum_path=artifacts/jimeh.better-markdown-preview-1.2.3.vsix.sha256', + '', + ].join('\n'), + ); + } finally { + await rm(temporaryDirectory, { force: true, recursive: true }); + } +}); diff --git a/test/workflows.test.mts b/test/workflows.test.mts new file mode 100644 index 0000000..7282158 --- /dev/null +++ b/test/workflows.test.mts @@ -0,0 +1,100 @@ +import assert from 'node:assert/strict'; +import { readFile } from 'node:fs/promises'; +import test from 'node:test'; + +const ciWorkflow = await readFile( + new URL('../.github/workflows/ci.yml', import.meta.url), + 'utf8', +); +const semanticPrWorkflow = await readFile( + new URL('../.github/workflows/semantic-pr.yml', import.meta.url), + 'utf8', +); + +function occurrences(source: string, pattern: RegExp): number { + return [...source.matchAll(pattern)].length; +} + +test('semantic PR validation is metadata-only and enforces the release vocabulary', () => { + assert.match(semanticPrWorkflow, /^\s{2}pull_request_target:/m); + for (const event of ['opened', 'edited', 'reopened', 'synchronize']) { + assert.match(semanticPrWorkflow, new RegExp(`^\\s{6}- ${event}$`, 'm')); + } + assert.match(semanticPrWorkflow, /^\s{2}pull-requests: write$/m); + assert.doesNotMatch(semanticPrWorkflow, /actions\/checkout/); + assert.match( + semanticPrWorkflow, + /amannn\/action-semantic-pull-request@48f256284bd46cdaab1048c3721360e808335d50/, + ); + assert.match( + semanticPrWorkflow, + /marocchino\/sticky-pull-request-comment@5770ad5eb8f42dd2c4f34da00c94c5381e49af88/, + ); + for (const type of [ + 'build', + 'chore', + 'ci', + 'docs', + 'feat', + 'fix', + 'perf', + 'refactor', + 'revert', + 'style', + 'test', + ]) { + assert.match(semanticPrWorkflow, new RegExp(`^\\s{12}${type}$`, 'm')); + } + assert.match(semanticPrWorkflow, /subjectPattern: \^\(\?!\[A-Z\]\)\.\+\$/); + assert.match(semanticPrWorkflow, /delete: true/); +}); + +test('main release waits for every host gate and cannot be cancelled', () => { + assert.match( + ciWorkflow, + /cancel-in-progress: \$\{\{ github\.event_name == 'pull_request' \}\}/, + ); + assert.match( + ciWorkflow, + /release:\n\s{4}name: Release[\s\S]*?needs:\n\s{6}- validate\n\s{6}- desktop-host\n\s{6}- web-host/, + ); + assert.match(ciWorkflow, /fetch-depth: 0/); + assert.match( + ciWorkflow, + /client-id: \$\{\{ vars\.RELEASE_BOT_CLIENT_ID \}\}/, + ); + assert.match( + ciWorkflow, + /private-key: \$\{\{ secrets\.RELEASE_BOT_PRIVATE_KEY \}\}/, + ); + assert.match(ciWorkflow, /permission-contents: write/); + assert.match(ciWorkflow, /permission-issues: write/); + assert.doesNotMatch(ciWorkflow, /^\s{4}tags:/m); +}); + +test('publication jobs share one immutable package and isolate credentials', () => { + for (const job of [ + 'publish-vscode', + 'publish-openvsx', + 'upload-github-release', + ]) { + assert.match(ciWorkflow, new RegExp(`^\\s{2}${job}:$`, 'm')); + } + assert.equal(occurrences(ciWorkflow, /secrets\.VSCE_PAT/g), 1); + assert.equal(occurrences(ciWorkflow, /secrets\.OVSX_PAT/g), 1); + assert.equal(occurrences(ciWorkflow, /actions\/upload-artifact@/g), 2); + assert.equal(occurrences(ciWorkflow, /name: release-\$\{\{/g), 4); + assert.equal( + occurrences( + ciWorkflow, + /\(cd artifacts && sha256sum --check "jimeh\.better-markdown-preview-\$\{VERSION\}\.vsix\.sha256"\)/g, + ), + 3, + ); + assert.match(ciWorkflow, /vsce publish --packagePath "\$VSIX_PATH"/); + assert.match(ciWorkflow, /ovsx publish "\$VSIX_PATH"/); + assert.match( + ciWorkflow, + /gh release upload "\$GIT_TAG" "\$VSIX_PATH" "\$CHECKSUM_PATH" --clobber/, + ); +}); diff --git a/tsconfig.tooling.json b/tsconfig.tooling.json index 90333b5..9970bce 100644 --- a/tsconfig.tooling.json +++ b/tsconfig.tooling.json @@ -15,6 +15,7 @@ }, "include": [ ".vscode-test.mjs", + "release.config.mjs", "esbuild.mts", "eslint.config.mts", "vitest.config.mts", From 213e1c530a8ff1b863a0360e0fe7e19f7275ed54 Mon Sep 17 00:00:00 2001 From: Jim Myhrberg Date: Sat, 15 Aug 2026 20:01:08 +0000 Subject: [PATCH 2/2] fix: harden release publication --- .github/workflows/ci.yml | 1 + .github/workflows/semantic-pr.yml | 5 +++-- scripts/lib/package.mts | 6 +++--- scripts/lib/release.mts | 9 +++++---- scripts/release.mts | 2 +- test/release.test.mts | 15 ++++++++++++--- test/workflows.test.mts | 25 +++++++++++++++++++++++++ 7 files changed, 50 insertions(+), 13 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 310d81d..81e9a29 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -260,6 +260,7 @@ jobs: - name: Verify and attach release assets env: CHECKSUM_PATH: ${{ needs.release.outputs.checksum_path }} + GH_REPO: ${{ github.repository }} GH_TOKEN: ${{ github.token }} GIT_TAG: ${{ needs.release.outputs.git_tag }} VERSION: ${{ needs.release.outputs.version }} diff --git a/.github/workflows/semantic-pr.yml b/.github/workflows/semantic-pr.yml index cb51f01..7c61803 100644 --- a/.github/workflows/semantic-pr.yml +++ b/.github/workflows/semantic-pr.yml @@ -40,10 +40,10 @@ jobs: style test subjectPattern: ^(?![A-Z]).+$ - subjectPatternError: The subject must start with a lowercase character. + subjectPatternError: The subject must not start with an uppercase character. - name: Comment on invalid PR title - if: always() && (steps.lint_pr_title.outputs.error_message != null) + if: ${{ !cancelled() && steps.lint_pr_title.outputs.error_message != null }} uses: marocchino/sticky-pull-request-comment@5770ad5eb8f42dd2c4f34da00c94c5381e49af88 # v3.0.5 with: header: pr-title-lint-error @@ -62,6 +62,7 @@ jobs: - name: Remove PR title lint comment if: ${{ steps.lint_pr_title.outputs.error_message == null }} + continue-on-error: true uses: marocchino/sticky-pull-request-comment@5770ad5eb8f42dd2c4f34da00c94c5381e49af88 # v3.0.5 with: header: pr-title-lint-error diff --git a/scripts/lib/package.mts b/scripts/lib/package.mts index 40d39ca..53283ee 100644 --- a/scripts/lib/package.mts +++ b/scripts/lib/package.mts @@ -8,7 +8,7 @@ const repositoryRoot = fileURLToPath(new URL('../..', import.meta.url)); const semanticVersionPattern = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)$/; const extensionIdentifierPattern = /^[a-z0-9][a-z0-9-]*$/i; -interface ExtensionManifest { +export interface ExtensionManifest { name: string; publisher: string; version: string; @@ -42,7 +42,7 @@ export function packageFilename( return `${publisher}.${name}-${version}.vsix`; } -async function readManifest(): Promise { +export async function readExtensionManifest(): Promise { const manifest = JSON.parse( await readFile(path.join(repositoryRoot, 'package.json'), 'utf8'), ) as Partial; @@ -86,7 +86,7 @@ async function runVsce(args: readonly string[]): Promise { export async function packageExtension( explicitVersion?: string, ): Promise { - const manifest = await readManifest(); + const manifest = await readExtensionManifest(); const version = explicitVersion ?? manifest.version; const filename = packageFilename(manifest.publisher, manifest.name, version); const artifactDirectory = path.join(repositoryRoot, 'artifacts'); diff --git a/scripts/lib/release.mts b/scripts/lib/release.mts index 8026b56..4bc15a5 100644 --- a/scripts/lib/release.mts +++ b/scripts/lib/release.mts @@ -1,6 +1,6 @@ import { appendFile } from 'node:fs/promises'; import type { Result } from 'semantic-release'; -import { packageFilename } from './package.mts'; +import { packageFilename, readExtensionManifest } from './package.mts'; export interface ReleaseOutputs { released: 'false' | 'true'; @@ -10,7 +10,7 @@ export interface ReleaseOutputs { checksum_path: string; } -export function releaseOutputs(result: Result): ReleaseOutputs { +export async function releaseOutputs(result: Result): Promise { if (!result) { return { released: 'false', @@ -21,9 +21,10 @@ export function releaseOutputs(result: Result): ReleaseOutputs { }; } + const manifest = await readExtensionManifest(); const filename = packageFilename( - 'jimeh', - 'better-markdown-preview', + manifest.publisher, + manifest.name, result.nextRelease.version, ); const vsixPath = `artifacts/${filename}`; diff --git a/scripts/release.mts b/scripts/release.mts index db1111e..a3adf51 100644 --- a/scripts/release.mts +++ b/scripts/release.mts @@ -3,7 +3,7 @@ import releaseConfig from './lib/release-config.mts'; import { releaseOutputs, writeReleaseOutputs } from './lib/release.mts'; const result = await semanticRelease(releaseConfig); -const outputs = releaseOutputs(result); +const outputs = await releaseOutputs(result); if (process.env.GITHUB_OUTPUT) { await writeReleaseOutputs(process.env.GITHUB_OUTPUT, outputs); diff --git a/test/release.test.mts b/test/release.test.mts index c0ed56e..fbca30f 100644 --- a/test/release.test.mts +++ b/test/release.test.mts @@ -80,15 +80,24 @@ test('release policy maps conventional commits to intended versions', async () = assert.equal(releaseConfig.tagFormat, 'v${version}'); assert.equal(await releaseType('feat: add viewer'), 'minor'); assert.equal(await releaseType('fix: restore preview'), 'patch'); + assert.equal(await releaseType('perf: speed up rendering'), 'patch'); assert.equal(await releaseType('docs: explain columns'), 'patch'); assert.equal(await releaseType('revert: remove broken change'), 'patch'); - assert.equal(await releaseType('chore: reorder tooling'), null); + for (const type of ['build', 'chore', 'ci', 'refactor', 'style', 'test']) { + assert.equal(await releaseType(`${type}: maintain project`), null); + } assert.equal(await releaseType('feat!: remove legacy setting'), 'major'); assert.equal( await releaseType('docs!: replace configuration format'), 'major', ); assert.equal(await releaseType('chore!: drop old Node versions'), 'major'); + assert.equal( + await releaseType( + 'fix: change config parsing\n\nBREAKING CHANGE: remove legacy format', + ), + 'major', + ); assert.deepEqual( releaseConfig.plugins?.map((plugin) => Array.isArray(plugin) ? plugin[0] : plugin, @@ -197,7 +206,7 @@ test('release package checks require current notes and a valid checksum', async }); test('release runner exposes no-op and published outputs', async () => { - assert.deepEqual(releaseOutputs(false), { + assert.deepEqual(await releaseOutputs(false), { released: 'false', version: '', git_tag: '', @@ -205,7 +214,7 @@ test('release runner exposes no-op and published outputs', async () => { checksum_path: '', }); - const outputs = releaseOutputs({ + const outputs = await releaseOutputs({ commits: [], lastRelease: { channels: [], diff --git a/test/workflows.test.mts b/test/workflows.test.mts index 7282158..b5560cb 100644 --- a/test/workflows.test.mts +++ b/test/workflows.test.mts @@ -46,6 +46,18 @@ test('semantic PR validation is metadata-only and enforces the release vocabular assert.match(semanticPrWorkflow, new RegExp(`^\\s{12}${type}$`, 'm')); } assert.match(semanticPrWorkflow, /subjectPattern: \^\(\?!\[A-Z\]\)\.\+\$/); + assert.match( + semanticPrWorkflow, + /subjectPatternError: The subject must not start with an uppercase character\./, + ); + assert.match( + semanticPrWorkflow, + /if: \$\{\{ !cancelled\(\) && steps\.lint_pr_title\.outputs\.error_message != null \}\}/, + ); + assert.match( + semanticPrWorkflow, + /name: Remove PR title lint comment\n\s{8}if:[\s\S]*?\n\s{8}continue-on-error: true/, + ); assert.match(semanticPrWorkflow, /delete: true/); }); @@ -54,10 +66,18 @@ test('main release waits for every host gate and cannot be cancelled', () => { ciWorkflow, /cancel-in-progress: \$\{\{ github\.event_name == 'pull_request' \}\}/, ); + assert.match( + ciWorkflow, + /group: \$\{\{ github\.workflow \}\}-\$\{\{ github\.event_name == 'push' && github\.ref == 'refs\/heads\/main' && 'main-release' \|\| github\.ref \}\}/, + ); assert.match( ciWorkflow, /release:\n\s{4}name: Release[\s\S]*?needs:\n\s{6}- validate\n\s{6}- desktop-host\n\s{6}- web-host/, ); + assert.match( + ciWorkflow, + /if: github\.event_name == 'push' && github\.ref == 'refs\/heads\/main'/, + ); assert.match(ciWorkflow, /fetch-depth: 0/); assert.match( ciWorkflow, @@ -80,6 +100,10 @@ test('publication jobs share one immutable package and isolate credentials', () ]) { assert.match(ciWorkflow, new RegExp(`^\\s{2}${job}:$`, 'm')); } + assert.equal( + occurrences(ciWorkflow, /if: needs\.release\.outputs\.released == 'true'/g), + 3, + ); assert.equal(occurrences(ciWorkflow, /secrets\.VSCE_PAT/g), 1); assert.equal(occurrences(ciWorkflow, /secrets\.OVSX_PAT/g), 1); assert.equal(occurrences(ciWorkflow, /actions\/upload-artifact@/g), 2); @@ -97,4 +121,5 @@ test('publication jobs share one immutable package and isolate credentials', () ciWorkflow, /gh release upload "\$GIT_TAG" "\$VSIX_PATH" "\$CHECKSUM_PATH" --clobber/, ); + assert.match(ciWorkflow, /GH_REPO: \$\{\{ github\.repository \}\}/); });