diff --git a/.all-contributorsrc b/.all-contributorsrc
deleted file mode 100644
index 8bc3d0c..0000000
--- a/.all-contributorsrc
+++ /dev/null
@@ -1,64 +0,0 @@
-{
- "projectName": "cli-testing-library",
- "projectOwner": "crutchcorn",
- "repoType": "github",
- "files": [
- "README.md"
- ],
- "imageSize": 100,
- "commit": false,
- "contributorsPerLine": 7,
- "skipCi": false,
- "contributors": [
- {
- "login": "crutchcorn",
- "name": "Corbin Crutchley",
- "avatar_url": "https://avatars.githubusercontent.com/u/9100169?v=4",
- "profile": "https://crutchcorn.dev/",
- "contributions": [
- "code",
- "doc",
- "maintenance"
- ]
- },
- {
- "login": "SerkanSipahi",
- "name": "Bitcollage",
- "avatar_url": "https://avatars.githubusercontent.com/u/1880749?v=4",
- "profile": "https://www.linkedin.com/in/serkan-sipahi-59b20081/",
- "contributions": [
- "doc"
- ]
- },
- {
- "login": "jgoux",
- "name": "Julien Goux",
- "avatar_url": "https://avatars.githubusercontent.com/u/1443499?v=4",
- "profile": "http://jgoux.dev",
- "contributions": [
- "bug",
- "code"
- ]
- },
- {
- "login": "bantic",
- "name": "Cory Forsyth",
- "avatar_url": "https://avatars.githubusercontent.com/u/2023?v=4",
- "profile": "http://coryforsyth.com/",
- "contributions": [
- "doc"
- ]
- },
- {
- "login": "eran-cohen",
- "name": "eran-cohen",
- "avatar_url": "https://avatars.githubusercontent.com/u/105227395?v=4",
- "profile": "https://github.com/eran-cohen",
- "contributions": [
- "doc"
- ]
- }
- ],
- "repoHost": "https://github.com",
- "commitConvention": "none"
-}
diff --git a/.gitattributes b/.gitattributes
index 6313b56..5a0d5e4 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1 +1,2 @@
+# Auto detect text files and perform LF normalization
* text=auto eol=lf
diff --git a/.github/workflows/autofix.yml b/.github/workflows/autofix.yml
new file mode 100644
index 0000000..a6179b0
--- /dev/null
+++ b/.github/workflows/autofix.yml
@@ -0,0 +1,31 @@
+name: autofix.ci # needed to securely identify the workflow
+
+on:
+ pull_request:
+ push:
+ branches: [main, alpha, beta]
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.event.number || github.ref }}
+ cancel-in-progress: true
+
+permissions:
+ contents: read
+
+jobs:
+ autofix:
+ name: autofix
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4.2.2
+ - name: Setup Tools
+ uses: tanstack/config/.github/setup@main
+ - name: Fix formatting
+ run: pnpm prettier:write
+ - name: Generate Docs
+ run: pnpm docs:generate
+ - name: Apply fixes
+ uses: autofix-ci/action@ff86a557419858bb967097bfc916833f5647fa8c
+ with:
+ commit-message: "ci: apply automated fixes and generate docs"
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..5b4bcd8
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,41 @@
+name: ci
+
+on:
+ workflow_dispatch:
+ inputs:
+ tag:
+ description: override release tag
+ required: false
+ push:
+ branches: [main, alpha, beta]
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.event.number || github.ref }}
+ cancel-in-progress: true
+
+permissions:
+ contents: write
+ id-token: write
+
+jobs:
+ test-and-publish:
+ name: Test & Publish
+ if: github.repository == 'crutchcorn/cli-testing-library'
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ - name: Setup Tools
+ uses: tanstack/config/.github/setup@main
+ - name: Run Tests
+ run: pnpm run test:ci --parallel=3
+ - name: Publish
+ run: |
+ git config --global user.name 'Corbin Crutchley'
+ git config --global user.email 'git@crutchcorn.dev'
+ npm config set '//registry.npmjs.org/:_authToken' "${NPM_TOKEN}"
+ pnpm run cipublish
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
+ TAG: ${{ inputs.tag }}
diff --git a/.github/workflows/deploy-preview.yml b/.github/workflows/deploy-preview.yml
new file mode 100644
index 0000000..fca47d3
--- /dev/null
+++ b/.github/workflows/deploy-preview.yml
@@ -0,0 +1,36 @@
+name: Deploy Preview
+
+on:
+ push:
+ branches:
+ - main
+
+permissions: {}
+
+jobs:
+ deploy-docs:
+ permissions:
+ contents: write # to write to gh-pages branch (peaceiris/actions-gh-pages)
+
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - name: Setup pnpm
+ uses: pnpm/action-setup@v4
+ - uses: actions/setup-node@v4
+ with:
+ node-version-file: ".nvmrc"
+ cache: "pnpm"
+
+ - name: Install packages
+ run: pnpm install --frozen-lockfile --prefer-offline
+
+ - name: Build
+ run: pnpm run build:website
+
+ - name: Deploy docs
+ uses: peaceiris/actions-gh-pages@v4
+ with:
+ github_token: ${{ secrets.GITHUB_TOKEN }}
+ publish_dir: website/dist
+ cname: cli-testing.com
diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml
new file mode 100644
index 0000000..f2bd439
--- /dev/null
+++ b/.github/workflows/pr.yml
@@ -0,0 +1,41 @@
+name: pr
+
+on:
+ pull_request:
+ paths-ignore:
+ - "docs/**"
+ - "media/**"
+ - "**/*.md"
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.event.number || github.ref }}
+ cancel-in-progress: true
+
+permissions:
+ contents: read
+
+jobs:
+ test:
+ name: Test
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ - name: Setup Tools
+ uses: tanstack/config/.github/setup@main
+ - name: Run Checks
+ run: pnpm run test:pr --parallel=3
+ preview:
+ name: Preview
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ - name: Setup Tools
+ uses: tanstack/config/.github/setup@main
+ - name: Build Packages
+ run: pnpm run build:all
+ - name: Publish Previews
+ run: pnpx pkg-pr-new publish --pnpm --compact './packages/*' --template './examples/*/*'
diff --git a/.github/workflows/validate.yml b/.github/workflows/validate.yml
deleted file mode 100644
index d35ef34..0000000
--- a/.github/workflows/validate.yml
+++ /dev/null
@@ -1,87 +0,0 @@
-name: validate
-on:
- push:
- branches:
- - '+([0-9])?(.{+([0-9]),x}).x'
- - 'main'
- - 'next'
- - 'next-major'
- - 'beta'
- - 'alpha'
- - '!all-contributors/**'
- pull_request: {}
-jobs:
- main:
- # ignore all-contributors PRs
- if: ${{ !contains(github.head_ref, 'all-contributors') }}
- strategy:
- matrix:
- os: [ubuntu-latest, windows-latest]
- node: [12, 14, 16]
- runs-on: ${{ matrix.os }}
- steps:
- - name: 🛑 Cancel Previous Runs
- uses: styfle/cancel-workflow-action@0.9.0
-
- - name: ⬇️ Checkout repo
- uses: actions/checkout@v2
-
- - name: ⎔ Setup node
- uses: actions/setup-node@v2
- with:
- node-version: ${{ matrix.node }}
-
- - name: 📥 Download deps
- uses: bahmutov/npm-install@v1
- with:
- useLockFile: false
-
- - name: ▶️ Run validate script
- run: npm run validate
-
- - name: ⬆️ Upload coverage report
- uses: codecov/codecov-action@v2
-
- release:
- needs: main
- runs-on: ubuntu-latest
- if:
- ${{ github.repository == 'crutchcorn/cli-testing-library' &&
- contains('refs/heads/main,refs/heads/beta,refs/heads/next,refs/heads/alpha',
- github.ref) && github.event_name == 'push' }}
- steps:
- - name: 🛑 Cancel Previous Runs
- uses: styfle/cancel-workflow-action@0.9.0
-
- - name: ⬇️ Checkout repo
- uses: actions/checkout@v2
-
- - name: ⎔ Setup node
- uses: actions/setup-node@v2
- with:
- node-version: 14
-
- - name: 📥 Download deps
- uses: bahmutov/npm-install@v1
- with:
- useLockFile: false
-
- - name: 🏗 Run build script
- run: npm run build
-
- - name: 🚀 Release
- uses: cycjimmy/semantic-release-action@v2
- with:
- semantic_version: 17
- branches: |
- [
- '+([0-9])?(.{+([0-9]),x}).x',
- 'main',
- 'next',
- 'next-major',
- {name: 'beta', prerelease: true},
- {name: 'alpha', prerelease: true}
- ]
- env:
- GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
diff --git a/.gitignore b/.gitignore
index cf1a543..d60197e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,13 +1,42 @@
+
+# See https://help.github.com/ignore-files/ for more about ignoring files.
+
+# dependencies
node_modules
+package-lock.json
+yarn.lock
+
+# builds
+build
coverage
dist
+
+# misc
.DS_Store
-.idea/
+.env
+.env.local
+.env.development.local
+.env.test.local
+.env.production.local
+.next
-# these cause more harm than good
-# when working with contributors
-package-lock.json
-yarn.lock
-# Temporary for dev
-old/
-reference/
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+.history
+size-plugin.json
+stats-hydration.json
+stats.json
+stats.html
+.vscode/settings.json
+
+*.log
+.cache
+.idea
+.nx/cache
+.nx/workspace-data
+.pnpm-store
+.tsup
+
+vite.config.js.timestamp-*
+vite.config.ts.timestamp-*
diff --git a/.huskyrc.js b/.huskyrc.js
deleted file mode 100644
index 5e45c45..0000000
--- a/.huskyrc.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('kcd-scripts/husky')
diff --git a/.npmrc b/.npmrc
index 1df2a6d..84aee8d 100644
--- a/.npmrc
+++ b/.npmrc
@@ -1,2 +1,3 @@
-registry=https://registry.npmjs.org/
-package-lock=false
+link-workspace-packages=true
+prefer-workspace-packages=true
+provenance=true
diff --git a/.nvmrc b/.nvmrc
new file mode 100644
index 0000000..1d9b783
--- /dev/null
+++ b/.nvmrc
@@ -0,0 +1 @@
+22.12.0
diff --git a/.prettierignore b/.prettierignore
index 9c62828..6534da9 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -1,3 +1,9 @@
-node_modules
-coverage
-dist
+**/.next
+**/.nx/cache
+**/.svelte-kit
+**/build
+**/coverage
+**/dist
+**/docs
+**/codemods/**/__testfixtures__
+pnpm-lock.yaml
diff --git a/.prettierrc.js b/.prettierrc.js
deleted file mode 100644
index 4679d9b..0000000
--- a/.prettierrc.js
+++ /dev/null
@@ -1 +0,0 @@
-module.exports = require('kcd-scripts/prettier')
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
deleted file mode 100644
index ba61187..0000000
--- a/CODE_OF_CONDUCT.md
+++ /dev/null
@@ -1,128 +0,0 @@
-# Contributor Covenant Code of Conduct
-
-## Our Pledge
-
-We as members, contributors, and leaders pledge to make participation in our
-community a harassment-free experience for everyone, regardless of age, body
-size, visible or invisible disability, ethnicity, sex characteristics, gender
-identity and expression, level of experience, education, socio-economic status,
-nationality, personal appearance, race, religion, or sexual identity and
-orientation.
-
-We pledge to act and interact in ways that contribute to an open, welcoming,
-diverse, inclusive, and healthy community.
-
-## Our Standards
-
-Examples of behavior that contributes to a positive environment for our
-community include:
-
-- Demonstrating empathy and kindness toward other people
-- Being respectful of differing opinions, viewpoints, and experiences
-- Giving and gracefully accepting constructive feedback
-- Accepting responsibility and apologizing to those affected by our mistakes,
- and learning from the experience
-- Focusing on what is best not just for us as individuals, but for the overall
- community
-
-Examples of unacceptable behavior include:
-
-- The use of sexualized language or imagery, and sexual attention or advances of
- any kind
-- Trolling, insulting or derogatory comments, and personal or political attacks
-- Public or private harassment
-- Publishing others' private information, such as a physical or email address,
- without their explicit permission
-- Other conduct which could reasonably be considered inappropriate in a
- professional setting
-
-## Enforcement Responsibilities
-
-Community leaders are responsible for clarifying and enforcing our standards of
-acceptable behavior and will take appropriate and fair corrective action in
-response to any behavior that they deem inappropriate, threatening, offensive,
-or harmful.
-
-Community leaders have the right and responsibility to remove, edit, or reject
-comments, commits, code, wiki edits, issues, and other contributions that are
-not aligned to this Code of Conduct, and will communicate reasons for moderation
-decisions when appropriate.
-
-## Scope
-
-This Code of Conduct applies within all community spaces, and also applies when
-an individual is officially representing the community in public spaces.
-Examples of representing our community include using an official e-mail address,
-posting via an official social media account, or acting as an appointed
-representative at an online or offline event.
-
-## Enforcement
-
-Instances of abusive, harassing, or otherwise unacceptable behavior may be
-reported to the community leaders responsible for enforcement at
-testingcli+coc@oceanbit.dev. All complaints will be reviewed and investigated
-promptly and fairly.
-
-All community leaders are obligated to respect the privacy and security of the
-reporter of any incident.
-
-## Enforcement Guidelines
-
-Community leaders will follow these Community Impact Guidelines in determining
-the consequences for any action they deem in violation of this Code of Conduct:
-
-### 1. Correction
-
-**Community Impact**: Use of inappropriate language or other behavior deemed
-unprofessional or unwelcome in the community.
-
-**Consequence**: A private, written warning from community leaders, providing
-clarity around the nature of the violation and an explanation of why the
-behavior was inappropriate. A public apology may be requested.
-
-### 2. Warning
-
-**Community Impact**: A violation through a single incident or series of
-actions.
-
-**Consequence**: A warning with consequences for continued behavior. No
-interaction with the people involved, including unsolicited interaction with
-those enforcing the Code of Conduct, for a specified period of time. This
-includes avoiding interactions in community spaces as well as external channels
-like social media. Violating these terms may lead to a temporary or permanent
-ban.
-
-### 3. Temporary Ban
-
-**Community Impact**: A serious violation of community standards, including
-sustained inappropriate behavior.
-
-**Consequence**: A temporary ban from any sort of interaction or public
-communication with the community for a specified period of time. No public or
-private interaction with the people involved, including unsolicited interaction
-with those enforcing the Code of Conduct, is allowed during this period.
-Violating these terms may lead to a permanent ban.
-
-### 4. Permanent Ban
-
-**Community Impact**: Demonstrating a pattern of violation of community
-standards, including sustained inappropriate behavior, harassment of an
-individual, or aggression toward or disparagement of classes of individuals.
-
-**Consequence**: A permanent ban from any sort of public interaction within the
-community.
-
-## Attribution
-
-This Code of Conduct is adapted from the [Contributor Covenant][homepage],
-version 2.0, available at
-https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
-
-Community Impact Guidelines were inspired by
-[Mozilla's code of conduct enforcement ladder](https://github.com/mozilla/diversity).
-
-[homepage]: https://www.contributor-covenant.org
-
-For answers to common questions about this code of conduct, see the FAQ at
-https://www.contributor-covenant.org/faq. Translations are available at
-https://www.contributor-covenant.org/translations.
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
deleted file mode 100644
index 368af30..0000000
--- a/CONTRIBUTING.md
+++ /dev/null
@@ -1,37 +0,0 @@
-# Contributing
-
-Thanks for being willing to contribute!
-
-## Project setup
-
-1. Fork and clone the repo
-2. Run `npm run setup -s` to install dependencies and run validation
-3. Create a branch for your PR with `git checkout -b pr/your-branch-name`
-
-> Tip: Keep your `main` branch pointing at the original repository and make pull
-> requests from branches on your fork. To do this, run:
->
-> ```
-> git remote add upstream https://github.com/crutchcorn/cli-testing-library.git
-> git fetch upstream
-> git branch --set-upstream-to=upstream/main main
-> ```
->
-> This will add the original repository as a "remote" called "upstream," Then
-> fetch the git information from that remote, then set your local `main` branch
-> to use the upstream main branch whenever you run `git pull`. Then you can make
-> all of your pull request branches based on this `main` branch. Whenever you
-> want to update your version of `main`, do a regular `git pull`.
-
-## Committing and Pushing changes
-
-Please make sure to run the tests before you commit your changes. You can run
-`npm run test:update` which will update any snapshots that need updating. Make
-sure to include those changes (if they exist) in your commit.
-
-## Help needed
-
-Please checkout the [the open issues][issues]
-
-Also, please watch the repo and respond to questions/bug reports/feature
-requests! Thanks!
diff --git a/README.md b/README.md
deleted file mode 100644
index 94427f1..0000000
--- a/README.md
+++ /dev/null
@@ -1,137 +0,0 @@
-
-
CLI Testing Library
-
-
-
-
-
-
Simple and complete CLI testing utilities that encourage good testing
-practices.
-
-
-
-
-
-[](https://github.com/crutchcorn/cli-testing-library/actions/workflows/validate.yml?query=branch%3Amain)
-[](https://www.npmjs.com/package/cli-testing-library)
-[](https://www.npmjs.com/package/cli-testing-library)
-[](./LICENSE)
-[](makeapullrequest.com)
-[](./CODE_OF_CONDUCT.md)
-
-
-
-[](#contributors-)
-
-
-
-[](https://github.com/crutchcorn/cli-testing-library/watchers)
-[](https://github.com/crutchcorn/cli-testing-library/stargazers)
-
-
-
-## Table of Contents
-
-
-
-
-- [Installation](#installation)
-- [Usage](#usage)
-- [Contributors ✨](#contributors-)
-
-
-
-> This project is not affiliated with the
-> ["Testing Library"](https://github.com/testing-library) ecosystem that this
-> project is clearly inspired from. We're just big fans :)
-
-## Installation
-
-This module is distributed via [npm][npm] which is bundled with [node][node] and
-should be installed as one of your project's `devDependencies`:
-
-```
-npm install --save-dev cli-testing-library
-```
-
-## Usage
-
-> This is currently the only section of "usage" documentation. We'll be
-> expanding it as soon as possible
-
-Usage example:
-
-```javascript
-const {resolve} = require('path')
-const {render} = require('cli-testing-library')
-
-test('Is able to make terminal input and view in-progress stdout', async () => {
- const {clear, findByText, queryByText, userEvent} = await render('node', [
- resolve(__dirname, './execute-scripts/stdio-inquirer.js'),
- ])
-
- const instance = await findByText('First option')
-
- expect(instance).toBeInTheConsole()
-
- expect(await findByText('❯ One')).toBeInTheConsole()
-
- clear()
-
- userEvent('[ArrowDown]')
-
- expect(await findByText('❯ Two')).toBeInTheConsole()
-
- clear()
-
- userEvent.keyboard('[Enter]')
-
- expect(await findByText('First option: Two')).toBeInTheConsole()
- expect(await queryByText('First option: Three')).not.toBeInTheConsole()
-})
-```
-
-For a API reference documentation, including suggestions on how to use this
-library, see our
-[documentation introduction with further reading](./docs/introduction.md).
-
-> While this library _does_ work in Windows, it does not appear to function
-> properly in Windows CI environments, such as GitHub actions. As a result, you
-> may need to either switch CI systems or limit your CI to only run in Linux
->
-> If you know how to fix this, please let us know in
-> [this tracking issue](https://github.com/crutchcorn/cli-testing-library/issues/3)
-
-## Contributors ✨
-
-Thanks goes to these wonderful people
-([emoji key](https://allcontributors.org/docs/en/emoji-key)):
-
-
-
-
-
-
-
-
-
-
-
-This project follows the
-[all-contributors](https://github.com/all-contributors/all-contributors)
-specification. Contributions of any kind welcome!
diff --git a/docs/api.md b/docs/api.md
index b2ce96e..550a96f 100644
--- a/docs/api.md
+++ b/docs/api.md
@@ -1,4 +1,6 @@
-# API
+---
+title: "API"
+---
`CLI Testing Library`, despite taking clear inspiration from, does not re-export
anything from
@@ -14,25 +16,6 @@ them.
Instead, the following API is what `CLI Testing Library` provides the following.
-
-
-
-- [`render`](#render)
-- [`render` Options](#render-options)
- - [`cwd`](#cwd)
- - [`spawnOpts`](#spawnopts)
-- [`render` Result](#render-result)
- - [`...queries`](#queries)
- - [ByText](#bytext)
- - [`userEvent[eventName]`](#usereventeventname)
- - [`debug`](#debug)
- - [`hasExit`](#hasexit)
- - [`process`](#process)
- - [`stdoutArr`/`stderrArr`](#stdoutarrstderrarr)
- - [`clear`](#clear)
-
-
-
# `render`
```typescript
@@ -113,7 +96,7 @@ The most important feature of render is that the queries from
[CLI Testing Library](https://github.com/crutchcorn/cli-testing-library) are
automatically returned with their first argument bound to the testInstance.
-See [Queries](./queries.md) to learn more about how to use these queries and the
+See [Queries](./queries) to learn more about how to use these queries and the
philosophy behind them.
### ByText
@@ -139,7 +122,7 @@ Queries for test instance `stdout` results with the given text (and it also
accepts a TextMatch).
These options are all standard for text matching. To learn more, see our
-[Queries page](./queries.md).
+[Queries page](./queries).
## `userEvent[eventName]`
@@ -149,11 +132,11 @@ userEvent[eventName](...eventProps)
> While `userEvent` isn't usually returned on `render` in, say,
> `React Testing Library`, we're able to do so because of our differences in
-> implementation with upstream. See our [Differences](./differences.md) doc for
+> implementation with upstream. See our [Differences](./differences) doc for
> more.
This object is the same as described with
-[`userEvent` documentation](./user-event.md) with the key difference that
+[`userEvent` documentation](./user-event) with the key difference that
`instance` is not expected to be passed when bound to `render`.
## `debug`
@@ -175,7 +158,7 @@ debug()
```
This is a simple wrapper around `prettyCLI` which is also exposed and comes from
-[CLI Testing Library](./debug.md).
+[CLI Testing Library](./debug).
## `hasExit`
@@ -201,7 +184,7 @@ so you can call `process.pid` etc. to inspect the process.
## `stdoutArr`/`stderrArr`
Each of these is an array of what's output by their respective `std`\* pipe.
-This is used internally to create the [`debug`methods](./debug.md) and more.
+This is used internally to create the [`debug`methods](./debug) and more.
They're defined as:
```typescript
@@ -224,7 +207,7 @@ end of the test.
> Please note that this is done automatically if the testing framework you're
> using supports the `afterEach` global and it is injected to your testing
-> environment (like mocha, Jest, and Jasmine). If not, you will need to do
+> environment (like mocha, Jest, Vitest, and Jasmine). If not, you will need to do
> manual cleanups after each test.
For example, if you're using the [ava](https://github.com/avajs/ava) testing
diff --git a/docs/configure.md b/docs/configure.md
index ca80f4a..b798212 100644
--- a/docs/configure.md
+++ b/docs/configure.md
@@ -1,17 +1,6 @@
-# Configuration Options
-
-
-
-
-- [Introduction](#introduction)
-- [Options](#options)
- - [`showOriginalStackTrace`](#showoriginalstacktrace)
- - [`throwSuggestions` (experimental)](#throwsuggestions-experimental)
- - [`getInstanceError`](#getinstanceerror)
- - [`asyncUtilTimeout`](#asyncutiltimeout)
- - [`renderAwaitTime`](#renderawaittime)
-
-
+---
+title: "Configuration Options"
+---
## Introduction
@@ -36,7 +25,7 @@ to `waitFor`.
### `throwSuggestions` (experimental)
-When enabled, if [better queries](./queries.md) are available the test will fail
+When enabled, if [better queries](./queries) are available the test will fail
and provide a suggested query to use instead. Default to `false`.
To disable a suggestion for a single query just add `{suggest:false}` as an
@@ -62,7 +51,7 @@ to 1000ms.
By default, we wait for the CLI to `spawn` the command from `render`. If we
immediately resolve the promise to allow users to query, however, we lose the
ability to `getByText` immediately after rendering. This
-[differs greatly from upstream Testing Library](./differences.md) and makes for
+[differs greatly from upstream Testing Library](./differences) and makes for
a poor testing experience.
As a result, we wait this duration before resolving the promise after the
diff --git a/docs/debug.md b/docs/debug.md
index 1cf9a78..93184a1 100644
--- a/docs/debug.md
+++ b/docs/debug.md
@@ -1,12 +1,6 @@
-# Debug
-
-
-
-
-- [Automatic Logging](#automatic-logging)
-- [`prettyCLI`](#prettycli)
-
-
+---
+title: "Debug"
+---
## Automatic Logging
diff --git a/docs/differences.md b/docs/differences.md
index ce3576f..4800dc8 100644
--- a/docs/differences.md
+++ b/docs/differences.md
@@ -1,4 +1,6 @@
-# Differences Between `cli-testing-library` & Testing Library
+---
+title: "Differences Between CLI Testing Library & Testing Library"
+---
While we clearly take inspiration from
[`DOM Testing Library`](https://github.com/testing-library/dom-testing-library)
@@ -7,19 +9,6 @@ and
and try to do our best to align as much as possible, there are some major
distinctions between the project's APIs.
-
-
-
-- [Instances](#instances)
-- [Queries](#queries)
-- [Events](#events)
- - [FireEvent](#fireevent)
- - [UserEvent](#userevent)
-- [Matchers](#matchers)
-- [Similarities](#similarities)
-
-
-
# Instances
While the `DOM Testing Library` and it's descendants have a concept of both a
diff --git a/docs/fire-event.md b/docs/fire-event.md
index 2456a64..edac334 100644
--- a/docs/fire-event.md
+++ b/docs/fire-event.md
@@ -1,13 +1,6 @@
-
-
-
-- [Firing Events](#firing-events)
- - [`fireEvent`](#fireevent)
- - [`fireEvent[eventName]`](#fireeventeventname)
-
-
-
-# Firing Events
+---
+title: "Firing Events"
+---
> **Note**
>
diff --git a/docs/introduction.md b/docs/introduction.md
index 19c39dc..a876055 100644
--- a/docs/introduction.md
+++ b/docs/introduction.md
@@ -1,4 +1,6 @@
-# CLI Testing Library
+---
+title: "Introduction"
+---
[CLI Testing Library](https://github.com/crutchcorn/cli-testing-library)
implements as-close-as-possible API to
@@ -13,16 +15,6 @@ npm install --save-dev cli-testing-library
- [`cli-testing-library` on GitHub](https://github.com/crutchcorn/cli-testing-library)
-## Table of Contents
-
-
-
-
-- [The problem](#the-problem)
-- [This solution](#this-solution)
-
-
-
# The problem
You want to write maintainable tests for your CLI applications. As a part of
@@ -55,16 +47,15 @@ will work when a real user uses it.
**What this library is not**:
1. A test runner or framework
-2. Specific to a testing framework (though we recommend Jest as our preference,
- the library works with any framework.)
+2. Specific to a testing framework
# Further Reading
-- [API reference for `render` and friends](./api.md)
-- [Jest matchers](./matchers.md)
-- [Mock user input](./user-event.md)
-- [Manually fire input events](./fire-event.md)
-- [Output matching queries](./queries.md)
-- [Debugging "CLI Testing Library" tests](./debug.md)
-- [Configure library options](./configure.md)
-- [Differences between us and other "Testing Library" projects](./differences.md)
+- [API reference for `render` and friends](./api)
+- [Jest and Vitest matchers](./matchers)
+- [Mock user input](./user-event)
+- [Manually fire input events](./fire-event)
+- [Output matching queries](./queries)
+- [Debugging "CLI Testing Library" tests](./debug)
+- [Configure library options](./configure)
+- [Differences between us and other "Testing Library" projects](./differences)
diff --git a/docs/matchers.md b/docs/matchers.md
index 83a0dca..b252736 100644
--- a/docs/matchers.md
+++ b/docs/matchers.md
@@ -1,33 +1,20 @@
-# Matchers
+---
+title: "Matchers"
+---
-The `cli-testing-library` provides a set of custom jest matchers that you can
-use to extend jest. These will make your tests more declarative, clear to read
+The `cli-testing-library` provides a set of custom Jest and Vitest matchers that you can
+use to extend Jest or Vitest. These will make your tests more declarative, clear to read
and to maintain.
-## Table of Contents
-
-
-
-
-- [Usage](#usage)
- - [With TypeScript](#with-typescript)
-- [Custom matchers](#custom-matchers)
- - [`toBeInTheConsole`](#tobeintheconsole)
- - [Examples](#examples)
- - [`toHaveErrorMessage`](#tohaveerrormessage)
- - [Examples](#examples-1)
-
-
-
## Usage
-Import `cli-testing-library/extend-expect` once (for instance in your
+Import `cli-testing-library/jest`, `cli-testing-library/jest-globals`, or `cli-testing-library/vitest` once, based on your testing (for instance in your
[tests setup file](https://jestjs.io/docs/en/configuration.html#setupfilesafterenv-array))
and you're good to go:
```javascript
// In your own jest-setup.js (or any other name)
-import 'cli-testing-library/extend-expect'
+import 'cli-testing-library/jest'
// In jest.config.js add (if you haven't already)
setupFilesAfterEnv: ['/jest-setup.js']
diff --git a/docs/queries.md b/docs/queries.md
index 6fad12a..e9a7a6b 100644
--- a/docs/queries.md
+++ b/docs/queries.md
@@ -1,4 +1,6 @@
-# About Queries
+---
+title: "About Queries"
+---
Queries are the methods that the CLI Testing Library gives you to find processes
in the command line. There are several types of queries ("get", "find",
@@ -7,29 +9,10 @@ if no CLI instance is found or if it will return a Promise and retry. Depending
on what app content you are selecting, different queries may be more or less
appropriate.
-While our APIs [differ slightly](./differences.md) from upstream Testing
+While our APIs [differ slightly](./differences) from upstream Testing
Library's,
[their "About Queries" page summarizes the goals and intentions of this project's queries quite well](https://testing-library.com/docs/queries/about/).
-
-
-
-- [Example](#example)
-- [Types of Queries](#types-of-queries)
-- [`TextMatch`](#textmatch)
- - [TextMatch Examples](#textmatch-examples)
- - [Precision](#precision)
- - [Normalization](#normalization)
- - [Normalization Examples](#normalization-examples)
-- [ByText](#bytext)
- - [API](#api)
- - [Options](#options)
-- [ByError](#byerror)
- - [API](#api-1)
- - [Options](#options-1)
-
-
-
# Example
```javascript
diff --git a/docs/reference/classes/mutationobserver.md b/docs/reference/classes/mutationobserver.md
new file mode 100644
index 0000000..159241e
--- /dev/null
+++ b/docs/reference/classes/mutationobserver.md
@@ -0,0 +1,82 @@
+---
+id: MutationObserver
+title: MutationObserver
+---
+
+
+
+# Class: MutationObserver
+
+Defined in: [mutation-observer.ts:9](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/mutation-observer.ts#L9)
+
+## Constructors
+
+### new MutationObserver()
+
+```ts
+new MutationObserver(cb): MutationObserver
+```
+
+Defined in: [mutation-observer.ts:13](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/mutation-observer.ts#L13)
+
+#### Parameters
+
+##### cb
+
+() => `void`
+
+#### Returns
+
+[`MutationObserver`](mutationobserver.md)
+
+## Properties
+
+### \_cb()
+
+```ts
+_cb: () => void;
+```
+
+Defined in: [mutation-observer.ts:10](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/mutation-observer.ts#L10)
+
+#### Returns
+
+`void`
+
+***
+
+### \_id
+
+```ts
+_id: number;
+```
+
+Defined in: [mutation-observer.ts:11](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/mutation-observer.ts#L11)
+
+## Methods
+
+### disconnect()
+
+```ts
+disconnect(): void
+```
+
+Defined in: [mutation-observer.ts:22](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/mutation-observer.ts#L22)
+
+#### Returns
+
+`void`
+
+***
+
+### observe()
+
+```ts
+observe(): void
+```
+
+Defined in: [mutation-observer.ts:18](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/mutation-observer.ts#L18)
+
+#### Returns
+
+`void`
diff --git a/docs/reference/functions/bindobjectfnstoinstance.md b/docs/reference/functions/bindobjectfnstoinstance.md
new file mode 100644
index 0000000..e75d7ed
--- /dev/null
+++ b/docs/reference/functions/bindobjectfnstoinstance.md
@@ -0,0 +1,31 @@
+---
+id: bindObjectFnsToInstance
+title: bindObjectFnsToInstance
+---
+
+
+
+# Function: bindObjectFnsToInstance()
+
+```ts
+function bindObjectFnsToInstance(instance, object): Record unknown>
+```
+
+Defined in: [helpers.ts:75](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/helpers.ts#L75)
+
+This is used to bind a series of functions where `instance` is the first argument
+to an instance, removing the implicit first argument.
+
+## Parameters
+
+### instance
+
+`TestInstance`
+
+### object
+
+`Record`\<`string`, (...`props`) => `unknown`\>
+
+## Returns
+
+`Record`\<`string`, (...`props`) => `unknown`\>
diff --git a/docs/reference/functions/buildqueries.md b/docs/reference/functions/buildqueries.md
new file mode 100644
index 0000000..d8dd6b0
--- /dev/null
+++ b/docs/reference/functions/buildqueries.md
@@ -0,0 +1,28 @@
+---
+id: buildQueries
+title: buildQueries
+---
+
+
+
+# Function: buildQueries()
+
+```ts
+function buildQueries(queryBy, getMissingError): readonly [(container, ...args) => T, (container, ...args) => T, (instance, text, options?, waitForOptions?) => Promise]
+```
+
+Defined in: [query-helpers.ts:115](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/query-helpers.ts#L115)
+
+## Parameters
+
+### queryBy
+
+[`QueryMethod`](../type-aliases/querymethod.md)\<\[[`Matcher`](../type-aliases/matcher.md), [`MatcherOptions`](../interfaces/matcheroptions.md)\], `null` \| `TestInstance`\>
+
+### getMissingError
+
+[`GetErrorFunction`](../type-aliases/geterrorfunction.md)\<\[[`Matcher`](../type-aliases/matcher.md), [`MatcherOptions`](../interfaces/matcheroptions.md)\]\>
+
+## Returns
+
+readonly \[\<`T`\>(`container`, ...`args`) => `T`, \<`T`\>(`container`, ...`args`) => `T`, \<`T`\>(`instance`, `text`, `options`?, `waitForOptions`?) => `Promise`\<`T`\>\]
diff --git a/docs/reference/functions/cleanup.md b/docs/reference/functions/cleanup.md
new file mode 100644
index 0000000..1c25f79
--- /dev/null
+++ b/docs/reference/functions/cleanup.md
@@ -0,0 +1,18 @@
+---
+id: cleanup
+title: cleanup
+---
+
+
+
+# Function: cleanup()
+
+```ts
+function cleanup(): Promise
+```
+
+Defined in: [pure.ts:167](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/pure.ts#L167)
+
+## Returns
+
+`Promise`\<`void`[]\>
diff --git a/docs/reference/functions/configure.md b/docs/reference/functions/configure.md
new file mode 100644
index 0000000..e71d1ca
--- /dev/null
+++ b/docs/reference/functions/configure.md
@@ -0,0 +1,24 @@
+---
+id: configure
+title: configure
+---
+
+
+
+# Function: configure()
+
+```ts
+function configure(newConfig): void
+```
+
+Defined in: [config.ts:77](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/config.ts#L77)
+
+## Parameters
+
+### newConfig
+
+[`ConfigFn`](../interfaces/configfn.md) | `Partial`\<[`Config`](../interfaces/config.md)\>
+
+## Returns
+
+`void`
diff --git a/docs/reference/functions/debounce.md b/docs/reference/functions/debounce.md
new file mode 100644
index 0000000..7a0944a
--- /dev/null
+++ b/docs/reference/functions/debounce.md
@@ -0,0 +1,42 @@
+---
+id: debounce
+title: debounce
+---
+
+
+
+# Function: debounce()
+
+```ts
+function debounce(func, timeout): (...args) => void
+```
+
+Defined in: [helpers.ts:56](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/helpers.ts#L56)
+
+## Type Parameters
+
+• **T** *extends* (...`args`) => `void`
+
+## Parameters
+
+### func
+
+`T`
+
+### timeout
+
+`number`
+
+## Returns
+
+`Function`
+
+### Parameters
+
+#### args
+
+...`Parameters`\<`T`\>
+
+### Returns
+
+`void`
diff --git a/docs/reference/functions/fireevent.md b/docs/reference/functions/fireevent.md
new file mode 100644
index 0000000..e388ea8
--- /dev/null
+++ b/docs/reference/functions/fireevent.md
@@ -0,0 +1,39 @@
+---
+id: fireEvent
+title: fireEvent
+---
+
+
+
+# Function: fireEvent()
+
+```ts
+function fireEvent(
+ instance,
+ event,
+options?): boolean | Promise
+```
+
+Defined in: [events.ts:20](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/events.ts#L20)
+
+## Type Parameters
+
+• **TEventType** *extends* `"sigterm"` \| `"sigkill"` \| `"write"`
+
+## Parameters
+
+### instance
+
+`TestInstance`
+
+### event
+
+`TEventType`
+
+### options?
+
+`Parameters`\<`object`\[`TEventType`\]\>\[`1`\]
+
+## Returns
+
+`boolean` \| `Promise`\<`void`\>
diff --git a/docs/reference/functions/getconfig.md b/docs/reference/functions/getconfig.md
new file mode 100644
index 0000000..05918ee
--- /dev/null
+++ b/docs/reference/functions/getconfig.md
@@ -0,0 +1,18 @@
+---
+id: getConfig
+title: getConfig
+---
+
+
+
+# Function: getConfig()
+
+```ts
+function getConfig(): Config
+```
+
+Defined in: [config.ts:91](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/config.ts#L91)
+
+## Returns
+
+[`Config`](../interfaces/config.md)
diff --git a/docs/reference/functions/getcurrentinstance.md b/docs/reference/functions/getcurrentinstance.md
new file mode 100644
index 0000000..33f838c
--- /dev/null
+++ b/docs/reference/functions/getcurrentinstance.md
@@ -0,0 +1,18 @@
+---
+id: getCurrentInstance
+title: getCurrentInstance
+---
+
+
+
+# Function: getCurrentInstance()
+
+```ts
+function getCurrentInstance(): undefined | TestInstance
+```
+
+Defined in: [helpers.ts:33](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/helpers.ts#L33)
+
+## Returns
+
+`undefined` \| `TestInstance`
diff --git a/docs/reference/functions/getdefaultnormalizer.md b/docs/reference/functions/getdefaultnormalizer.md
new file mode 100644
index 0000000..5c449c9
--- /dev/null
+++ b/docs/reference/functions/getdefaultnormalizer.md
@@ -0,0 +1,24 @@
+---
+id: getDefaultNormalizer
+title: getDefaultNormalizer
+---
+
+
+
+# Function: getDefaultNormalizer()
+
+```ts
+function getDefaultNormalizer(__namedParameters): NormalizerFn
+```
+
+Defined in: [matches.ts:104](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/matches.ts#L104)
+
+## Parameters
+
+### \_\_namedParameters
+
+[`DefaultNormalizerOptions`](../interfaces/defaultnormalizeroptions.md) = `{}`
+
+## Returns
+
+[`NormalizerFn`](../type-aliases/normalizerfn.md)
diff --git a/docs/reference/functions/getinstanceerror.md b/docs/reference/functions/getinstanceerror.md
new file mode 100644
index 0000000..9fcad19
--- /dev/null
+++ b/docs/reference/functions/getinstanceerror.md
@@ -0,0 +1,28 @@
+---
+id: getInstanceError
+title: getInstanceError
+---
+
+
+
+# Function: getInstanceError()
+
+```ts
+function getInstanceError(message, instance): Error
+```
+
+Defined in: [query-helpers.ts:26](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/query-helpers.ts#L26)
+
+## Parameters
+
+### message
+
+`null` | `string`
+
+### instance
+
+`TestInstance`
+
+## Returns
+
+`Error`
diff --git a/docs/reference/functions/getqueriesforelement.md b/docs/reference/functions/getqueriesforelement.md
new file mode 100644
index 0000000..8076214
--- /dev/null
+++ b/docs/reference/functions/getqueriesforelement.md
@@ -0,0 +1,43 @@
+---
+id: getQueriesForElement
+title: getQueriesForElement
+---
+
+
+
+# Function: getQueriesForElement()
+
+```ts
+function getQueriesForElement(
+ instance,
+ queries,
+initialValue): BoundFunctions
+```
+
+Defined in: [get-queries-for-instance.ts:50](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/get-queries-for-instance.ts#L50)
+
+## Type Parameters
+
+• **T** *extends* [`Queries`](../interfaces/queries.md) = [`queries`](../namespaces/queries/index.md)
+
+## Parameters
+
+### instance
+
+`TestInstance`
+
+### queries
+
+`T` = `...`
+
+object of functions
+
+### initialValue
+
+for reducer
+
+## Returns
+
+[`BoundFunctions`](../type-aliases/boundfunctions.md)\<`T`\>
+
+returns object of functions bound to container
diff --git a/docs/reference/functions/jestfaketimersareenabled.md b/docs/reference/functions/jestfaketimersareenabled.md
new file mode 100644
index 0000000..eb29455
--- /dev/null
+++ b/docs/reference/functions/jestfaketimersareenabled.md
@@ -0,0 +1,18 @@
+---
+id: jestFakeTimersAreEnabled
+title: jestFakeTimersAreEnabled
+---
+
+
+
+# Function: jestFakeTimersAreEnabled()
+
+```ts
+function jestFakeTimersAreEnabled(): boolean
+```
+
+Defined in: [helpers.ts:3](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/helpers.ts#L3)
+
+## Returns
+
+`boolean`
diff --git a/docs/reference/functions/makefindquery.md b/docs/reference/functions/makefindquery.md
new file mode 100644
index 0000000..25a0bfc
--- /dev/null
+++ b/docs/reference/functions/makefindquery.md
@@ -0,0 +1,54 @@
+---
+id: makeFindQuery
+title: makeFindQuery
+---
+
+
+
+# Function: makeFindQuery()
+
+```ts
+function makeFindQuery(getter): (instance, text, options?, waitForOptions?) => Promise
+```
+
+Defined in: [query-helpers.ts:66](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/query-helpers.ts#L66)
+
+## Type Parameters
+
+• **TQueryFor**
+
+## Parameters
+
+### getter
+
+(`container`, `text`, `options`?) => `TQueryFor`
+
+## Returns
+
+`Function`
+
+### Type Parameters
+
+• **T** *extends* `TestInstance` = `TestInstance`
+
+### Parameters
+
+#### instance
+
+`TestInstance`
+
+#### text
+
+[`Matcher`](../type-aliases/matcher.md)
+
+#### options?
+
+[`MatcherOptions`](../interfaces/matcheroptions.md)
+
+#### waitForOptions?
+
+[`waitForOptions`](../interfaces/waitforoptions.md)
+
+### Returns
+
+`Promise`\<`T`\>
diff --git a/docs/reference/functions/makenormalizer.md b/docs/reference/functions/makenormalizer.md
new file mode 100644
index 0000000..7193bed
--- /dev/null
+++ b/docs/reference/functions/makenormalizer.md
@@ -0,0 +1,28 @@
+---
+id: makeNormalizer
+title: makeNormalizer
+---
+
+
+
+# Function: makeNormalizer()
+
+```ts
+function makeNormalizer(props): NormalizerFn
+```
+
+Defined in: [matches.ts:132](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/matches.ts#L132)
+
+## Parameters
+
+### props
+
+[`NormalizerOptions`](../interfaces/normalizeroptions.md)
+
+Constructs a normalizer to pass to functions in matches.js
+
+## Returns
+
+[`NormalizerFn`](../type-aliases/normalizerfn.md)
+
+A normalizer
diff --git a/docs/reference/functions/render.md b/docs/reference/functions/render.md
new file mode 100644
index 0000000..6f79208
--- /dev/null
+++ b/docs/reference/functions/render.md
@@ -0,0 +1,35 @@
+---
+id: render
+title: render
+---
+
+
+
+# Function: render()
+
+```ts
+function render(
+ command,
+ args,
+opts): Promise
+```
+
+Defined in: [pure.ts:40](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/pure.ts#L40)
+
+## Parameters
+
+### command
+
+`string`
+
+### args
+
+`string`[] = `[]`
+
+### opts
+
+`Partial`\<[`RenderOptions`](../interfaces/renderoptions.md)\> = `{}`
+
+## Returns
+
+`Promise`\<[`RenderResult`](../type-aliases/renderresult.md)\>
diff --git a/docs/reference/functions/runobservers.md b/docs/reference/functions/runobservers.md
new file mode 100644
index 0000000..0baa3a9
--- /dev/null
+++ b/docs/reference/functions/runobservers.md
@@ -0,0 +1,18 @@
+---
+id: _runObservers
+title: _runObservers
+---
+
+
+
+# Function: \_runObservers()
+
+```ts
+function _runObservers(): void
+```
+
+Defined in: [mutation-observer.ts:27](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/mutation-observer.ts#L27)
+
+## Returns
+
+`void`
diff --git a/docs/reference/functions/runwithexpensiveerrordiagnosticsdisabled.md b/docs/reference/functions/runwithexpensiveerrordiagnosticsdisabled.md
new file mode 100644
index 0000000..98d070f
--- /dev/null
+++ b/docs/reference/functions/runwithexpensiveerrordiagnosticsdisabled.md
@@ -0,0 +1,28 @@
+---
+id: runWithExpensiveErrorDiagnosticsDisabled
+title: runWithExpensiveErrorDiagnosticsDisabled
+---
+
+
+
+# Function: runWithExpensiveErrorDiagnosticsDisabled()
+
+```ts
+function runWithExpensiveErrorDiagnosticsDisabled(callback): T
+```
+
+Defined in: [config.ts:66](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/config.ts#L66)
+
+## Type Parameters
+
+• **T**
+
+## Parameters
+
+### callback
+
+`Callback`\<`T`\>
+
+## Returns
+
+`T`
diff --git a/docs/reference/functions/setcurrentinstance.md b/docs/reference/functions/setcurrentinstance.md
new file mode 100644
index 0000000..3acc0c4
--- /dev/null
+++ b/docs/reference/functions/setcurrentinstance.md
@@ -0,0 +1,24 @@
+---
+id: setCurrentInstance
+title: setCurrentInstance
+---
+
+
+
+# Function: setCurrentInstance()
+
+```ts
+function setCurrentInstance(newInstance): void
+```
+
+Defined in: [helpers.ts:52](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/helpers.ts#L52)
+
+## Parameters
+
+### newInstance
+
+`TestInstance`
+
+## Returns
+
+`void`
diff --git a/docs/reference/functions/waitfor.md b/docs/reference/functions/waitfor.md
new file mode 100644
index 0000000..bb4423b
--- /dev/null
+++ b/docs/reference/functions/waitfor.md
@@ -0,0 +1,32 @@
+---
+id: waitFor
+title: waitFor
+---
+
+
+
+# Function: waitFor()
+
+```ts
+function waitFor(callback, options?): Promise
+```
+
+Defined in: [wait-for.ts:196](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/wait-for.ts#L196)
+
+## Type Parameters
+
+• **T**
+
+## Parameters
+
+### callback
+
+() => `T` \| `Promise`\<`T`\>
+
+### options?
+
+[`waitForOptions`](../interfaces/waitforoptions.md)
+
+## Returns
+
+`Promise`\<`T`\>
diff --git a/docs/reference/functions/wrapsinglequerywithsuggestion.md b/docs/reference/functions/wrapsinglequerywithsuggestion.md
new file mode 100644
index 0000000..3077442
--- /dev/null
+++ b/docs/reference/functions/wrapsinglequerywithsuggestion.md
@@ -0,0 +1,57 @@
+---
+id: wrapSingleQueryWithSuggestion
+title: wrapSingleQueryWithSuggestion
+---
+
+
+
+# Function: wrapSingleQueryWithSuggestion()
+
+```ts
+function wrapSingleQueryWithSuggestion(
+ query,
+ queryByName,
+ variant): (container, ...args) => T
+```
+
+Defined in: [query-helpers.ts:89](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/query-helpers.ts#L89)
+
+## Type Parameters
+
+• **TArguments** *extends* `unknown`[]
+
+## Parameters
+
+### query
+
+(`container`, ...`args`) => `null` \| `TestInstance`
+
+### queryByName
+
+`string`
+
+### variant
+
+`Variant`
+
+## Returns
+
+`Function`
+
+### Type Parameters
+
+• **T** *extends* `TestInstance` = `TestInstance`
+
+### Parameters
+
+#### container
+
+`TestInstance`
+
+#### args
+
+...`TArguments`
+
+### Returns
+
+`T`
diff --git a/docs/reference/index.md b/docs/reference/index.md
new file mode 100644
index 0000000..fada7f2
--- /dev/null
+++ b/docs/reference/index.md
@@ -0,0 +1,141 @@
+---
+id: cli-testing-library
+title: cli-testing-library
+---
+
+
+
+# cli-testing-library
+
+## References
+
+### findByError
+
+Re-exports [findByError](namespaces/queries/functions/findbyerror.md)
+
+***
+
+### FindByError
+
+Re-exports [FindByError](namespaces/queries/type-aliases/findbyerror.md)
+
+***
+
+### findByText
+
+Re-exports [findByText](namespaces/queries/functions/findbytext.md)
+
+***
+
+### FindByText
+
+Re-exports [FindByText](namespaces/queries/type-aliases/findbytext.md)
+
+***
+
+### getByError
+
+Re-exports [getByError](namespaces/queries/functions/getbyerror.md)
+
+***
+
+### GetByError
+
+Re-exports [GetByError](namespaces/queries/type-aliases/getbyerror.md)
+
+***
+
+### getByText
+
+Re-exports [getByText](namespaces/queries/functions/getbytext.md)
+
+***
+
+### GetByText
+
+Re-exports [GetByText](namespaces/queries/type-aliases/getbytext.md)
+
+***
+
+### queryByError
+
+Re-exports [queryByError](namespaces/queries/functions/querybyerror.md)
+
+***
+
+### QueryByError
+
+Re-exports [QueryByError](namespaces/queries/type-aliases/querybyerror.md)
+
+***
+
+### queryByText
+
+Re-exports [queryByText](namespaces/queries/functions/querybytext.md)
+
+***
+
+### QueryByText
+
+Re-exports [QueryByText](namespaces/queries/type-aliases/querybytext.md)
+
+## Namespaces
+
+- [queries](namespaces/queries/index.md)
+
+## Classes
+
+- [MutationObserver](classes/mutationobserver.md)
+
+## Interfaces
+
+- [Config](interfaces/config.md)
+- [ConfigFn](interfaces/configfn.md)
+- [DefaultNormalizerOptions](interfaces/defaultnormalizeroptions.md)
+- [keyboardKey](interfaces/keyboardkey.md)
+- [MatcherOptions](interfaces/matcheroptions.md)
+- [NormalizerOptions](interfaces/normalizeroptions.md)
+- [Queries](interfaces/queries.md)
+- [RenderOptions](interfaces/renderoptions.md)
+- [SelectorMatcherOptions](interfaces/selectormatcheroptions.md)
+- [waitForOptions](interfaces/waitforoptions.md)
+
+## Type Aliases
+
+- [BoundFunction](type-aliases/boundfunction.md)
+- [BoundFunctions](type-aliases/boundfunctions.md)
+- [EventType](type-aliases/eventtype.md)
+- [FireFunction](type-aliases/firefunction.md)
+- [FireObject](type-aliases/fireobject.md)
+- [GetErrorFunction](type-aliases/geterrorfunction.md)
+- [Match](type-aliases/match.md)
+- [Matcher](type-aliases/matcher.md)
+- [MatcherFunction](type-aliases/matcherfunction.md)
+- [NormalizerFn](type-aliases/normalizerfn.md)
+- [Query](type-aliases/query.md)
+- [QueryMethod](type-aliases/querymethod.md)
+- [RenderResult](type-aliases/renderresult.md)
+- [WithSuggest](type-aliases/withsuggest.md)
+
+## Functions
+
+- [\_runObservers](functions/runobservers.md)
+- [bindObjectFnsToInstance](functions/bindobjectfnstoinstance.md)
+- [buildQueries](functions/buildqueries.md)
+- [cleanup](functions/cleanup.md)
+- [configure](functions/configure.md)
+- [debounce](functions/debounce.md)
+- [fireEvent](functions/fireevent.md)
+- [getConfig](functions/getconfig.md)
+- [getCurrentInstance](functions/getcurrentinstance.md)
+- [getDefaultNormalizer](functions/getdefaultnormalizer.md)
+- [getInstanceError](functions/getinstanceerror.md)
+- [getQueriesForElement](functions/getqueriesforelement.md)
+- [jestFakeTimersAreEnabled](functions/jestfaketimersareenabled.md)
+- [makeFindQuery](functions/makefindquery.md)
+- [makeNormalizer](functions/makenormalizer.md)
+- [render](functions/render.md)
+- [runWithExpensiveErrorDiagnosticsDisabled](functions/runwithexpensiveerrordiagnosticsdisabled.md)
+- [setCurrentInstance](functions/setcurrentinstance.md)
+- [waitFor](functions/waitfor.md)
+- [wrapSingleQueryWithSuggestion](functions/wrapsinglequerywithsuggestion.md)
diff --git a/docs/reference/interfaces/config.md b/docs/reference/interfaces/config.md
new file mode 100644
index 0000000..97837de
--- /dev/null
+++ b/docs/reference/interfaces/config.md
@@ -0,0 +1,106 @@
+---
+id: Config
+title: Config
+---
+
+
+
+# Interface: Config
+
+Defined in: [config.ts:5](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/config.ts#L5)
+
+## Properties
+
+### asyncUtilTimeout
+
+```ts
+asyncUtilTimeout: number;
+```
+
+Defined in: [config.ts:13](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/config.ts#L13)
+
+***
+
+### errorDebounceTimeout
+
+```ts
+errorDebounceTimeout: number;
+```
+
+Defined in: [config.ts:15](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/config.ts#L15)
+
+***
+
+### getInstanceError()
+
+```ts
+getInstanceError: (message, container) => Error;
+```
+
+Defined in: [config.ts:18](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/config.ts#L18)
+
+#### Parameters
+
+##### message
+
+`null` | `string`
+
+##### container
+
+`TestInstance`
+
+#### Returns
+
+`Error`
+
+***
+
+### renderAwaitTime
+
+```ts
+renderAwaitTime: number;
+```
+
+Defined in: [config.ts:14](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/config.ts#L14)
+
+***
+
+### showOriginalStackTrace
+
+```ts
+showOriginalStackTrace: boolean;
+```
+
+Defined in: [config.ts:16](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/config.ts#L16)
+
+***
+
+### throwSuggestions
+
+```ts
+throwSuggestions: boolean;
+```
+
+Defined in: [config.ts:17](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/config.ts#L17)
+
+***
+
+### unstable\_advanceTimersWrapper()
+
+```ts
+unstable_advanceTimersWrapper: (cb) => unknown;
+```
+
+Defined in: [config.ts:10](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/config.ts#L10)
+
+WARNING: `unstable` prefix means this API may change in patch and minor releases.
+
+#### Parameters
+
+##### cb
+
+(...`args`) => `unknown`
+
+#### Returns
+
+`unknown`
diff --git a/docs/reference/interfaces/configfn.md b/docs/reference/interfaces/configfn.md
new file mode 100644
index 0000000..563678b
--- /dev/null
+++ b/docs/reference/interfaces/configfn.md
@@ -0,0 +1,26 @@
+---
+id: ConfigFn
+title: ConfigFn
+---
+
+
+
+# Interface: ConfigFn()
+
+Defined in: [config.ts:21](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/config.ts#L21)
+
+```ts
+interface ConfigFn(existingConfig): Partial
+```
+
+Defined in: [config.ts:22](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/config.ts#L22)
+
+## Parameters
+
+### existingConfig
+
+[`Config`](config.md)
+
+## Returns
+
+`Partial`\<[`Config`](config.md)\>
diff --git a/docs/reference/interfaces/defaultnormalizeroptions.md b/docs/reference/interfaces/defaultnormalizeroptions.md
new file mode 100644
index 0000000..f9b0852
--- /dev/null
+++ b/docs/reference/interfaces/defaultnormalizeroptions.md
@@ -0,0 +1,44 @@
+---
+id: DefaultNormalizerOptions
+title: DefaultNormalizerOptions
+---
+
+
+
+# Interface: DefaultNormalizerOptions
+
+Defined in: [matches.ts:37](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/matches.ts#L37)
+
+## Extended by
+
+- [`NormalizerOptions`](normalizeroptions.md)
+
+## Properties
+
+### collapseWhitespace?
+
+```ts
+optional collapseWhitespace: boolean;
+```
+
+Defined in: [matches.ts:39](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/matches.ts#L39)
+
+***
+
+### stripAnsi?
+
+```ts
+optional stripAnsi: boolean;
+```
+
+Defined in: [matches.ts:40](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/matches.ts#L40)
+
+***
+
+### trim?
+
+```ts
+optional trim: boolean;
+```
+
+Defined in: [matches.ts:38](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/matches.ts#L38)
diff --git a/docs/reference/interfaces/keyboardkey.md b/docs/reference/interfaces/keyboardkey.md
new file mode 100644
index 0000000..51ed3e7
--- /dev/null
+++ b/docs/reference/interfaces/keyboardkey.md
@@ -0,0 +1,34 @@
+---
+id: keyboardKey
+title: keyboardKey
+---
+
+
+
+# Interface: keyboardKey
+
+Defined in: [user-event/keyboard/types.ts:8](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/user-event/keyboard/types.ts#L8)
+
+## Properties
+
+### code?
+
+```ts
+optional code: string;
+```
+
+Defined in: [user-event/keyboard/types.ts:10](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/user-event/keyboard/types.ts#L10)
+
+Physical location on a keyboard
+
+***
+
+### hex?
+
+```ts
+optional hex: string;
+```
+
+Defined in: [user-event/keyboard/types.ts:12](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/user-event/keyboard/types.ts#L12)
+
+Character or functional key hex code
diff --git a/docs/reference/interfaces/matcheroptions.md b/docs/reference/interfaces/matcheroptions.md
new file mode 100644
index 0000000..16e4141
--- /dev/null
+++ b/docs/reference/interfaces/matcheroptions.md
@@ -0,0 +1,82 @@
+---
+id: MatcherOptions
+title: MatcherOptions
+---
+
+
+
+# Interface: MatcherOptions
+
+Defined in: [matches.ts:17](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/matches.ts#L17)
+
+## Extended by
+
+- [`SelectorMatcherOptions`](selectormatcheroptions.md)
+
+## Properties
+
+### collapseWhitespace?
+
+```ts
+optional collapseWhitespace: boolean;
+```
+
+Defined in: [matches.ts:24](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/matches.ts#L24)
+
+Use normalizer with getDefaultNormalizer instead
+
+***
+
+### exact?
+
+```ts
+optional exact: boolean;
+```
+
+Defined in: [matches.ts:18](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/matches.ts#L18)
+
+***
+
+### normalizer?
+
+```ts
+optional normalizer: NormalizerFn;
+```
+
+Defined in: [matches.ts:25](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/matches.ts#L25)
+
+***
+
+### stripAnsi?
+
+```ts
+optional stripAnsi: boolean;
+```
+
+Defined in: [matches.ts:22](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/matches.ts#L22)
+
+Use normalizer with getDefaultNormalizer instead
+
+***
+
+### suggest?
+
+```ts
+optional suggest: boolean;
+```
+
+Defined in: [matches.ts:27](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/matches.ts#L27)
+
+suppress suggestions for a specific query
+
+***
+
+### trim?
+
+```ts
+optional trim: boolean;
+```
+
+Defined in: [matches.ts:20](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/matches.ts#L20)
+
+Use normalizer with getDefaultNormalizer instead
diff --git a/docs/reference/interfaces/normalizeroptions.md b/docs/reference/interfaces/normalizeroptions.md
new file mode 100644
index 0000000..ea4d267
--- /dev/null
+++ b/docs/reference/interfaces/normalizeroptions.md
@@ -0,0 +1,66 @@
+---
+id: NormalizerOptions
+title: NormalizerOptions
+---
+
+
+
+# Interface: NormalizerOptions
+
+Defined in: [matches.ts:13](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/matches.ts#L13)
+
+## Extends
+
+- [`DefaultNormalizerOptions`](defaultnormalizeroptions.md)
+
+## Properties
+
+### collapseWhitespace?
+
+```ts
+optional collapseWhitespace: boolean;
+```
+
+Defined in: [matches.ts:39](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/matches.ts#L39)
+
+#### Inherited from
+
+[`DefaultNormalizerOptions`](defaultnormalizeroptions.md).[`collapseWhitespace`](DefaultNormalizerOptions.md#collapsewhitespace)
+
+***
+
+### normalizer?
+
+```ts
+optional normalizer: NormalizerFn;
+```
+
+Defined in: [matches.ts:14](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/matches.ts#L14)
+
+***
+
+### stripAnsi?
+
+```ts
+optional stripAnsi: boolean;
+```
+
+Defined in: [matches.ts:40](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/matches.ts#L40)
+
+#### Inherited from
+
+[`DefaultNormalizerOptions`](defaultnormalizeroptions.md).[`stripAnsi`](DefaultNormalizerOptions.md#stripansi)
+
+***
+
+### trim?
+
+```ts
+optional trim: boolean;
+```
+
+Defined in: [matches.ts:38](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/matches.ts#L38)
+
+#### Inherited from
+
+[`DefaultNormalizerOptions`](defaultnormalizeroptions.md).[`trim`](DefaultNormalizerOptions.md#trim)
diff --git a/docs/reference/interfaces/queries.md b/docs/reference/interfaces/queries.md
new file mode 100644
index 0000000..fd33e3b
--- /dev/null
+++ b/docs/reference/interfaces/queries.md
@@ -0,0 +1,16 @@
+---
+id: Queries
+title: Queries
+---
+
+
+
+# Interface: Queries
+
+Defined in: [get-queries-for-instance.ts:40](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/get-queries-for-instance.ts#L40)
+
+## Indexable
+
+```ts
+[T: string]: Query
+```
diff --git a/docs/reference/interfaces/renderoptions.md b/docs/reference/interfaces/renderoptions.md
new file mode 100644
index 0000000..8b4e88a
--- /dev/null
+++ b/docs/reference/interfaces/renderoptions.md
@@ -0,0 +1,40 @@
+---
+id: RenderOptions
+title: RenderOptions
+---
+
+
+
+# Interface: RenderOptions
+
+Defined in: [pure.ts:24](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/pure.ts#L24)
+
+## Properties
+
+### cwd
+
+```ts
+cwd: string;
+```
+
+Defined in: [pure.ts:25](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/pure.ts#L25)
+
+***
+
+### debug
+
+```ts
+debug: boolean;
+```
+
+Defined in: [pure.ts:26](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/pure.ts#L26)
+
+***
+
+### spawnOpts
+
+```ts
+spawnOpts: Omit;
+```
+
+Defined in: [pure.ts:27](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/pure.ts#L27)
diff --git a/docs/reference/interfaces/selectormatcheroptions.md b/docs/reference/interfaces/selectormatcheroptions.md
new file mode 100644
index 0000000..82fe404
--- /dev/null
+++ b/docs/reference/interfaces/selectormatcheroptions.md
@@ -0,0 +1,126 @@
+---
+id: SelectorMatcherOptions
+title: SelectorMatcherOptions
+---
+
+
+
+# Interface: SelectorMatcherOptions
+
+Defined in: [query-helpers.ts:16](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/query-helpers.ts#L16)
+
+## Extends
+
+- [`MatcherOptions`](matcheroptions.md)
+
+## Properties
+
+### collapseWhitespace?
+
+```ts
+optional collapseWhitespace: boolean;
+```
+
+Defined in: [matches.ts:24](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/matches.ts#L24)
+
+Use normalizer with getDefaultNormalizer instead
+
+#### Inherited from
+
+[`MatcherOptions`](matcheroptions.md).[`collapseWhitespace`](MatcherOptions.md#collapsewhitespace)
+
+***
+
+### exact?
+
+```ts
+optional exact: boolean;
+```
+
+Defined in: [matches.ts:18](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/matches.ts#L18)
+
+#### Inherited from
+
+[`MatcherOptions`](matcheroptions.md).[`exact`](MatcherOptions.md#exact)
+
+***
+
+### ignore?
+
+```ts
+optional ignore: string | boolean;
+```
+
+Defined in: [query-helpers.ts:18](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/query-helpers.ts#L18)
+
+***
+
+### normalizer?
+
+```ts
+optional normalizer: NormalizerFn;
+```
+
+Defined in: [matches.ts:25](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/matches.ts#L25)
+
+#### Inherited from
+
+[`MatcherOptions`](matcheroptions.md).[`normalizer`](MatcherOptions.md#normalizer)
+
+***
+
+### selector?
+
+```ts
+optional selector: string;
+```
+
+Defined in: [query-helpers.ts:17](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/query-helpers.ts#L17)
+
+***
+
+### stripAnsi?
+
+```ts
+optional stripAnsi: boolean;
+```
+
+Defined in: [matches.ts:22](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/matches.ts#L22)
+
+Use normalizer with getDefaultNormalizer instead
+
+#### Inherited from
+
+[`MatcherOptions`](matcheroptions.md).[`stripAnsi`](MatcherOptions.md#stripansi)
+
+***
+
+### suggest?
+
+```ts
+optional suggest: boolean;
+```
+
+Defined in: [matches.ts:27](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/matches.ts#L27)
+
+suppress suggestions for a specific query
+
+#### Inherited from
+
+[`MatcherOptions`](matcheroptions.md).[`suggest`](MatcherOptions.md#suggest)
+
+***
+
+### trim?
+
+```ts
+optional trim: boolean;
+```
+
+Defined in: [matches.ts:20](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/matches.ts#L20)
+
+Use normalizer with getDefaultNormalizer instead
+
+#### Inherited from
+
+[`MatcherOptions`](matcheroptions.md).[`trim`](MatcherOptions.md#trim)
diff --git a/docs/reference/interfaces/waitforoptions.md b/docs/reference/interfaces/waitforoptions.md
new file mode 100644
index 0000000..f90cce4
--- /dev/null
+++ b/docs/reference/interfaces/waitforoptions.md
@@ -0,0 +1,80 @@
+---
+id: waitForOptions
+title: waitForOptions
+---
+
+
+
+# Interface: waitForOptions
+
+Defined in: [wait-for.ts:14](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/wait-for.ts#L14)
+
+## Properties
+
+### instance?
+
+```ts
+optional instance: TestInstance;
+```
+
+Defined in: [wait-for.ts:15](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/wait-for.ts#L15)
+
+***
+
+### interval?
+
+```ts
+optional interval: number;
+```
+
+Defined in: [wait-for.ts:18](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/wait-for.ts#L18)
+
+***
+
+### onTimeout()?
+
+```ts
+optional onTimeout: (error) => Error;
+```
+
+Defined in: [wait-for.ts:19](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/wait-for.ts#L19)
+
+#### Parameters
+
+##### error
+
+`Error`
+
+#### Returns
+
+`Error`
+
+***
+
+### showOriginalStackTrace?
+
+```ts
+optional showOriginalStackTrace: boolean;
+```
+
+Defined in: [wait-for.ts:16](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/wait-for.ts#L16)
+
+***
+
+### stackTraceError?
+
+```ts
+optional stackTraceError: Error;
+```
+
+Defined in: [wait-for.ts:20](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/wait-for.ts#L20)
+
+***
+
+### timeout?
+
+```ts
+optional timeout: number;
+```
+
+Defined in: [wait-for.ts:17](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/wait-for.ts#L17)
diff --git a/docs/reference/namespaces/queries/functions/findbyerror.md b/docs/reference/namespaces/queries/functions/findbyerror.md
new file mode 100644
index 0000000..deada4b
--- /dev/null
+++ b/docs/reference/namespaces/queries/functions/findbyerror.md
@@ -0,0 +1,28 @@
+---
+id: findByError
+title: findByError
+---
+
+
+
+# Function: findByError()
+
+```ts
+function findByError(...args): ReturnType>
+```
+
+Defined in: [queries/error.ts:71](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/queries/error.ts#L71)
+
+## Type Parameters
+
+• **T** *extends* `TestInstance` = `TestInstance`
+
+## Parameters
+
+### args
+
+...\[`TestInstance`, [`Matcher`](../../../type-aliases/matcher.md), [`SelectorMatcherOptions`](../../../interfaces/selectormatcheroptions.md), [`waitForOptions`](../../../interfaces/waitforoptions.md)\]
+
+## Returns
+
+`ReturnType`\<[`FindByError`](../type-aliases/findbyerror.md)\<`T`\>\>
diff --git a/docs/reference/namespaces/queries/functions/findbytext.md b/docs/reference/namespaces/queries/functions/findbytext.md
new file mode 100644
index 0000000..06ac6b8
--- /dev/null
+++ b/docs/reference/namespaces/queries/functions/findbytext.md
@@ -0,0 +1,28 @@
+---
+id: findByText
+title: findByText
+---
+
+
+
+# Function: findByText()
+
+```ts
+function findByText(...args): ReturnType>
+```
+
+Defined in: [queries/text.ts:69](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/queries/text.ts#L69)
+
+## Type Parameters
+
+• **T** *extends* `TestInstance` = `TestInstance`
+
+## Parameters
+
+### args
+
+...\[`TestInstance`, [`Matcher`](../../../type-aliases/matcher.md), [`SelectorMatcherOptions`](../../../interfaces/selectormatcheroptions.md), [`waitForOptions`](../../../interfaces/waitforoptions.md)\]
+
+## Returns
+
+`ReturnType`\<[`FindByText`](../type-aliases/findbytext.md)\<`T`\>\>
diff --git a/docs/reference/namespaces/queries/functions/getbyerror.md b/docs/reference/namespaces/queries/functions/getbyerror.md
new file mode 100644
index 0000000..084c41f
--- /dev/null
+++ b/docs/reference/namespaces/queries/functions/getbyerror.md
@@ -0,0 +1,28 @@
+---
+id: getByError
+title: getByError
+---
+
+
+
+# Function: getByError()
+
+```ts
+function getByError(...args): ReturnType>
+```
+
+Defined in: [queries/error.ts:59](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/queries/error.ts#L59)
+
+## Type Parameters
+
+• **T** *extends* `TestInstance` = `TestInstance`
+
+## Parameters
+
+### args
+
+...\[`TestInstance`, [`Matcher`](../../../type-aliases/matcher.md), [`SelectorMatcherOptions`](../../../interfaces/selectormatcheroptions.md)\]
+
+## Returns
+
+`ReturnType`\<[`GetByError`](../type-aliases/getbyerror.md)\<`T`\>\>
diff --git a/docs/reference/namespaces/queries/functions/getbytext.md b/docs/reference/namespaces/queries/functions/getbytext.md
new file mode 100644
index 0000000..0b648df
--- /dev/null
+++ b/docs/reference/namespaces/queries/functions/getbytext.md
@@ -0,0 +1,28 @@
+---
+id: getByText
+title: getByText
+---
+
+
+
+# Function: getByText()
+
+```ts
+function getByText(...args): ReturnType>
+```
+
+Defined in: [queries/text.ts:59](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/queries/text.ts#L59)
+
+## Type Parameters
+
+• **T** *extends* `TestInstance` = `TestInstance`
+
+## Parameters
+
+### args
+
+...\[`TestInstance`, [`Matcher`](../../../type-aliases/matcher.md), [`SelectorMatcherOptions`](../../../interfaces/selectormatcheroptions.md)\]
+
+## Returns
+
+`ReturnType`\<[`GetByText`](../type-aliases/getbytext.md)\<`T`\>\>
diff --git a/docs/reference/namespaces/queries/functions/querybyerror.md b/docs/reference/namespaces/queries/functions/querybyerror.md
new file mode 100644
index 0000000..409756a
--- /dev/null
+++ b/docs/reference/namespaces/queries/functions/querybyerror.md
@@ -0,0 +1,28 @@
+---
+id: queryByError
+title: queryByError
+---
+
+
+
+# Function: queryByError()
+
+```ts
+function queryByError(...args): ReturnType>
+```
+
+Defined in: [queries/error.ts:65](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/queries/error.ts#L65)
+
+## Type Parameters
+
+• **T** *extends* `TestInstance` = `TestInstance`
+
+## Parameters
+
+### args
+
+...\[`TestInstance`, [`Matcher`](../../../type-aliases/matcher.md), [`SelectorMatcherOptions`](../../../interfaces/selectormatcheroptions.md)\]
+
+## Returns
+
+`ReturnType`\<[`QueryByError`](../type-aliases/querybyerror.md)\<`T`\>\>
diff --git a/docs/reference/namespaces/queries/functions/querybytext.md b/docs/reference/namespaces/queries/functions/querybytext.md
new file mode 100644
index 0000000..28440e0
--- /dev/null
+++ b/docs/reference/namespaces/queries/functions/querybytext.md
@@ -0,0 +1,28 @@
+---
+id: queryByText
+title: queryByText
+---
+
+
+
+# Function: queryByText()
+
+```ts
+function queryByText(...args): ReturnType>
+```
+
+Defined in: [queries/text.ts:64](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/queries/text.ts#L64)
+
+## Type Parameters
+
+• **T** *extends* `TestInstance` = `TestInstance`
+
+## Parameters
+
+### args
+
+...\[`TestInstance`, [`Matcher`](../../../type-aliases/matcher.md), [`SelectorMatcherOptions`](../../../interfaces/selectormatcheroptions.md)\]
+
+## Returns
+
+`ReturnType`\<[`QueryByText`](../type-aliases/querybytext.md)\<`T`\>\>
diff --git a/docs/reference/namespaces/queries/index.md b/docs/reference/namespaces/queries/index.md
new file mode 100644
index 0000000..005ccdc
--- /dev/null
+++ b/docs/reference/namespaces/queries/index.md
@@ -0,0 +1,26 @@
+---
+id: queries
+title: queries
+---
+
+
+
+# queries
+
+## Type Aliases
+
+- [FindByError](type-aliases/findbyerror.md)
+- [FindByText](type-aliases/findbytext.md)
+- [GetByError](type-aliases/getbyerror.md)
+- [GetByText](type-aliases/getbytext.md)
+- [QueryByError](type-aliases/querybyerror.md)
+- [QueryByText](type-aliases/querybytext.md)
+
+## Functions
+
+- [findByError](functions/findbyerror.md)
+- [findByText](functions/findbytext.md)
+- [getByError](functions/getbyerror.md)
+- [getByText](functions/getbytext.md)
+- [queryByError](functions/querybyerror.md)
+- [queryByText](functions/querybytext.md)
diff --git a/docs/reference/namespaces/queries/type-aliases/findbyerror.md b/docs/reference/namespaces/queries/type-aliases/findbyerror.md
new file mode 100644
index 0000000..0f4abb9
--- /dev/null
+++ b/docs/reference/namespaces/queries/type-aliases/findbyerror.md
@@ -0,0 +1,40 @@
+---
+id: FindByError
+title: FindByError
+---
+
+
+
+# Type Alias: FindByError()\
+
+```ts
+type FindByError = (instance, id, options?, waitForElementOptions?) => Promise;
+```
+
+Defined in: [queries/error.ts:27](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/queries/error.ts#L27)
+
+## Type Parameters
+
+• **T** *extends* `TestInstance` = `TestInstance`
+
+## Parameters
+
+### instance
+
+`TestInstance`
+
+### id
+
+[`Matcher`](../../../type-aliases/matcher.md)
+
+### options?
+
+[`SelectorMatcherOptions`](../../../interfaces/selectormatcheroptions.md)
+
+### waitForElementOptions?
+
+[`waitForOptions`](../../../interfaces/waitforoptions.md)
+
+## Returns
+
+`Promise`\<`T`\>
diff --git a/docs/reference/namespaces/queries/type-aliases/findbytext.md b/docs/reference/namespaces/queries/type-aliases/findbytext.md
new file mode 100644
index 0000000..76b9ba8
--- /dev/null
+++ b/docs/reference/namespaces/queries/type-aliases/findbytext.md
@@ -0,0 +1,40 @@
+---
+id: FindByText
+title: FindByText
+---
+
+
+
+# Type Alias: FindByText()\
+
+```ts
+type FindByText = (instance, id, options?, waitForElementOptions?) => Promise;
+```
+
+Defined in: [queries/text.ts:27](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/queries/text.ts#L27)
+
+## Type Parameters
+
+• **T** *extends* `TestInstance` = `TestInstance`
+
+## Parameters
+
+### instance
+
+`TestInstance`
+
+### id
+
+[`Matcher`](../../../type-aliases/matcher.md)
+
+### options?
+
+[`SelectorMatcherOptions`](../../../interfaces/selectormatcheroptions.md)
+
+### waitForElementOptions?
+
+[`waitForOptions`](../../../interfaces/waitforoptions.md)
+
+## Returns
+
+`Promise`\<`T`\>
diff --git a/docs/reference/namespaces/queries/type-aliases/getbyerror.md b/docs/reference/namespaces/queries/type-aliases/getbyerror.md
new file mode 100644
index 0000000..434aa8b
--- /dev/null
+++ b/docs/reference/namespaces/queries/type-aliases/getbyerror.md
@@ -0,0 +1,36 @@
+---
+id: GetByError
+title: GetByError
+---
+
+
+
+# Type Alias: GetByError()\
+
+```ts
+type GetByError = (instance, id, options?) => T;
+```
+
+Defined in: [queries/error.ts:21](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/queries/error.ts#L21)
+
+## Type Parameters
+
+• **T** *extends* `TestInstance` = `TestInstance`
+
+## Parameters
+
+### instance
+
+`TestInstance`
+
+### id
+
+[`Matcher`](../../../type-aliases/matcher.md)
+
+### options?
+
+[`SelectorMatcherOptions`](../../../interfaces/selectormatcheroptions.md)
+
+## Returns
+
+`T`
diff --git a/docs/reference/namespaces/queries/type-aliases/getbytext.md b/docs/reference/namespaces/queries/type-aliases/getbytext.md
new file mode 100644
index 0000000..3e4d0f2
--- /dev/null
+++ b/docs/reference/namespaces/queries/type-aliases/getbytext.md
@@ -0,0 +1,36 @@
+---
+id: GetByText
+title: GetByText
+---
+
+
+
+# Type Alias: GetByText()\
+
+```ts
+type GetByText = (instance, id, options?) => T;
+```
+
+Defined in: [queries/text.ts:21](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/queries/text.ts#L21)
+
+## Type Parameters
+
+• **T** *extends* `TestInstance` = `TestInstance`
+
+## Parameters
+
+### instance
+
+`TestInstance`
+
+### id
+
+[`Matcher`](../../../type-aliases/matcher.md)
+
+### options?
+
+[`SelectorMatcherOptions`](../../../interfaces/selectormatcheroptions.md)
+
+## Returns
+
+`T`
diff --git a/docs/reference/namespaces/queries/type-aliases/querybyerror.md b/docs/reference/namespaces/queries/type-aliases/querybyerror.md
new file mode 100644
index 0000000..80d593a
--- /dev/null
+++ b/docs/reference/namespaces/queries/type-aliases/querybyerror.md
@@ -0,0 +1,36 @@
+---
+id: QueryByError
+title: QueryByError
+---
+
+
+
+# Type Alias: QueryByError()\
+
+```ts
+type QueryByError = (instance, id, options?) => T | null;
+```
+
+Defined in: [queries/error.ts:15](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/queries/error.ts#L15)
+
+## Type Parameters
+
+• **T** *extends* `TestInstance` = `TestInstance`
+
+## Parameters
+
+### instance
+
+`TestInstance`
+
+### id
+
+[`Matcher`](../../../type-aliases/matcher.md)
+
+### options?
+
+[`SelectorMatcherOptions`](../../../interfaces/selectormatcheroptions.md)
+
+## Returns
+
+`T` \| `null`
diff --git a/docs/reference/namespaces/queries/type-aliases/querybytext.md b/docs/reference/namespaces/queries/type-aliases/querybytext.md
new file mode 100644
index 0000000..4d51f8d
--- /dev/null
+++ b/docs/reference/namespaces/queries/type-aliases/querybytext.md
@@ -0,0 +1,36 @@
+---
+id: QueryByText
+title: QueryByText
+---
+
+
+
+# Type Alias: QueryByText()\
+
+```ts
+type QueryByText = (instance, id, options?) => T | null;
+```
+
+Defined in: [queries/text.ts:15](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/queries/text.ts#L15)
+
+## Type Parameters
+
+• **T** *extends* `TestInstance` = `TestInstance`
+
+## Parameters
+
+### instance
+
+`TestInstance`
+
+### id
+
+[`Matcher`](../../../type-aliases/matcher.md)
+
+### options?
+
+[`SelectorMatcherOptions`](../../../interfaces/selectormatcheroptions.md)
+
+## Returns
+
+`T` \| `null`
diff --git a/docs/reference/type-aliases/boundfunction.md b/docs/reference/type-aliases/boundfunction.md
new file mode 100644
index 0000000..9fa91de
--- /dev/null
+++ b/docs/reference/type-aliases/boundfunction.md
@@ -0,0 +1,18 @@
+---
+id: BoundFunction
+title: BoundFunction
+---
+
+
+
+# Type Alias: BoundFunction\
+
+```ts
+type BoundFunction = T extends (container, ...args) => infer R ? (...args) => R : never;
+```
+
+Defined in: [get-queries-for-instance.ts:4](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/get-queries-for-instance.ts#L4)
+
+## Type Parameters
+
+• **T**
diff --git a/docs/reference/type-aliases/boundfunctions.md b/docs/reference/type-aliases/boundfunctions.md
new file mode 100644
index 0000000..177271f
--- /dev/null
+++ b/docs/reference/type-aliases/boundfunctions.md
@@ -0,0 +1,18 @@
+---
+id: BoundFunctions
+title: BoundFunctions
+---
+
+
+
+# Type Alias: BoundFunctions\
+
+```ts
+type BoundFunctions = TQueries extends typeof queries ? object & { [P in keyof TQueries]: BoundFunction } : { [P in keyof TQueries]: BoundFunction };
+```
+
+Defined in: [get-queries-for-instance.ts:11](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/get-queries-for-instance.ts#L11)
+
+## Type Parameters
+
+• **TQueries**
diff --git a/docs/reference/type-aliases/eventtype.md b/docs/reference/type-aliases/eventtype.md
new file mode 100644
index 0000000..97e2b2e
--- /dev/null
+++ b/docs/reference/type-aliases/eventtype.md
@@ -0,0 +1,14 @@
+---
+id: EventType
+title: EventType
+---
+
+
+
+# Type Alias: EventType
+
+```ts
+type EventType = keyof EventMap;
+```
+
+Defined in: [events.ts:5](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/events.ts#L5)
diff --git a/docs/reference/type-aliases/firefunction.md b/docs/reference/type-aliases/firefunction.md
new file mode 100644
index 0000000..34678d4
--- /dev/null
+++ b/docs/reference/type-aliases/firefunction.md
@@ -0,0 +1,36 @@
+---
+id: FireFunction
+title: FireFunction
+---
+
+
+
+# Type Alias: FireFunction()
+
+```ts
+type FireFunction = (instance, event, options?) => boolean | Promise;
+```
+
+Defined in: [events.ts:7](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/events.ts#L7)
+
+## Type Parameters
+
+• **TEventType** *extends* [`EventType`](eventtype.md)
+
+## Parameters
+
+### instance
+
+`TestInstance`
+
+### event
+
+`TEventType`
+
+### options?
+
+`Parameters`\<`EventMap`\[`TEventType`\]\>\[`1`\]
+
+## Returns
+
+`boolean` \| `Promise`\<`void`\>
diff --git a/docs/reference/type-aliases/fireobject.md b/docs/reference/type-aliases/fireobject.md
new file mode 100644
index 0000000..98fd944
--- /dev/null
+++ b/docs/reference/type-aliases/fireobject.md
@@ -0,0 +1,14 @@
+---
+id: FireObject
+title: FireObject
+---
+
+
+
+# Type Alias: FireObject
+
+```ts
+type FireObject = { [K in EventType]: (instance: TestInstance, options?: Parameters[1]) => boolean | Promise };
+```
+
+Defined in: [events.ts:13](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/events.ts#L13)
diff --git a/docs/reference/type-aliases/geterrorfunction.md b/docs/reference/type-aliases/geterrorfunction.md
new file mode 100644
index 0000000..4b6626a
--- /dev/null
+++ b/docs/reference/type-aliases/geterrorfunction.md
@@ -0,0 +1,32 @@
+---
+id: GetErrorFunction
+title: GetErrorFunction
+---
+
+
+
+# Type Alias: GetErrorFunction()\
+
+```ts
+type GetErrorFunction = (c, ...args) => string;
+```
+
+Defined in: [query-helpers.ts:11](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/query-helpers.ts#L11)
+
+## Type Parameters
+
+• **TArguments** *extends* `any`[] = \[`string`\]
+
+## Parameters
+
+### c
+
+`TestInstance` | `null`
+
+### args
+
+...`TArguments`
+
+## Returns
+
+`string`
diff --git a/docs/reference/type-aliases/match.md b/docs/reference/type-aliases/match.md
new file mode 100644
index 0000000..3271237
--- /dev/null
+++ b/docs/reference/type-aliases/match.md
@@ -0,0 +1,36 @@
+---
+id: Match
+title: Match
+---
+
+
+
+# Type Alias: Match()
+
+```ts
+type Match = (textToMatch, node, matcher, options?) => boolean;
+```
+
+Defined in: [matches.ts:30](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/matches.ts#L30)
+
+## Parameters
+
+### textToMatch
+
+`string`
+
+### node
+
+`TestInstance` | `null`
+
+### matcher
+
+[`Matcher`](matcher.md)
+
+### options?
+
+[`MatcherOptions`](../interfaces/matcheroptions.md)
+
+## Returns
+
+`boolean`
diff --git a/docs/reference/type-aliases/matcher.md b/docs/reference/type-aliases/matcher.md
new file mode 100644
index 0000000..4fff396
--- /dev/null
+++ b/docs/reference/type-aliases/matcher.md
@@ -0,0 +1,14 @@
+---
+id: Matcher
+title: Matcher
+---
+
+
+
+# Type Alias: Matcher
+
+```ts
+type Matcher = MatcherFunction | RegExp | number | string;
+```
+
+Defined in: [matches.ts:9](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/matches.ts#L9)
diff --git a/docs/reference/type-aliases/matcherfunction.md b/docs/reference/type-aliases/matcherfunction.md
new file mode 100644
index 0000000..828139f
--- /dev/null
+++ b/docs/reference/type-aliases/matcherfunction.md
@@ -0,0 +1,28 @@
+---
+id: MatcherFunction
+title: MatcherFunction
+---
+
+
+
+# Type Alias: MatcherFunction()
+
+```ts
+type MatcherFunction = (content, element) => boolean;
+```
+
+Defined in: [matches.ts:4](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/matches.ts#L4)
+
+## Parameters
+
+### content
+
+`string`
+
+### element
+
+`TestInstance` | `null`
+
+## Returns
+
+`boolean`
diff --git a/docs/reference/type-aliases/normalizerfn.md b/docs/reference/type-aliases/normalizerfn.md
new file mode 100644
index 0000000..cf5e34e
--- /dev/null
+++ b/docs/reference/type-aliases/normalizerfn.md
@@ -0,0 +1,24 @@
+---
+id: NormalizerFn
+title: NormalizerFn
+---
+
+
+
+# Type Alias: NormalizerFn()
+
+```ts
+type NormalizerFn = (text) => string;
+```
+
+Defined in: [matches.ts:11](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/matches.ts#L11)
+
+## Parameters
+
+### text
+
+`string`
+
+## Returns
+
+`string`
diff --git a/docs/reference/type-aliases/query.md b/docs/reference/type-aliases/query.md
new file mode 100644
index 0000000..7353892
--- /dev/null
+++ b/docs/reference/type-aliases/query.md
@@ -0,0 +1,39 @@
+---
+id: Query
+title: Query
+---
+
+
+
+# Type Alias: Query()
+
+```ts
+type Query = (container, ...args) =>
+ | Error
+ | TestInstance
+ | TestInstance[]
+ | Promise
+ | Promise
+ | null;
+```
+
+Defined in: [get-queries-for-instance.ts:29](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/get-queries-for-instance.ts#L29)
+
+## Parameters
+
+### container
+
+`TestInstance`
+
+### args
+
+...`any`[]
+
+## Returns
+
+ \| `Error`
+ \| `TestInstance`
+ \| `TestInstance`[]
+ \| `Promise`\<`TestInstance`[]\>
+ \| `Promise`\<`TestInstance`\>
+ \| `null`
diff --git a/docs/reference/type-aliases/querymethod.md b/docs/reference/type-aliases/querymethod.md
new file mode 100644
index 0000000..25f0906
--- /dev/null
+++ b/docs/reference/type-aliases/querymethod.md
@@ -0,0 +1,34 @@
+---
+id: QueryMethod
+title: QueryMethod
+---
+
+
+
+# Type Alias: QueryMethod()\
+
+```ts
+type QueryMethod = (container, ...args) => TReturn;
+```
+
+Defined in: [query-helpers.ts:21](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/query-helpers.ts#L21)
+
+## Type Parameters
+
+• **TArguments** *extends* `any`[]
+
+• **TReturn**
+
+## Parameters
+
+### container
+
+`TestInstance`
+
+### args
+
+...`TArguments`
+
+## Returns
+
+`TReturn`
diff --git a/docs/reference/type-aliases/renderresult.md b/docs/reference/type-aliases/renderresult.md
new file mode 100644
index 0000000..51c6836
--- /dev/null
+++ b/docs/reference/type-aliases/renderresult.md
@@ -0,0 +1,22 @@
+---
+id: RenderResult
+title: RenderResult
+---
+
+
+
+# Type Alias: RenderResult
+
+```ts
+type RenderResult = TestInstance & object & { [P in keyof typeof queries]: BoundFunction };
+```
+
+Defined in: [pure.ts:32](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/pure.ts#L32)
+
+## Type declaration
+
+### userEvent
+
+```ts
+userEvent: { [P in keyof UserEvent]: BoundFunction };
+```
diff --git a/docs/reference/type-aliases/withsuggest.md b/docs/reference/type-aliases/withsuggest.md
new file mode 100644
index 0000000..f096a97
--- /dev/null
+++ b/docs/reference/type-aliases/withsuggest.md
@@ -0,0 +1,22 @@
+---
+id: WithSuggest
+title: WithSuggest
+---
+
+
+
+# Type Alias: WithSuggest
+
+```ts
+type WithSuggest = object;
+```
+
+Defined in: [query-helpers.ts:9](https://github.com/crutchcorn/cli-testing-library/blob/main/packages/cli-testing-library/src/query-helpers.ts#L9)
+
+## Type declaration
+
+### suggest?
+
+```ts
+optional suggest: boolean;
+```
diff --git a/docs/user-event.md b/docs/user-event.md
index 528cdcc..7e8199b 100644
--- a/docs/user-event.md
+++ b/docs/user-event.md
@@ -1,16 +1,10 @@
+---
+title: "User Event"
+---
+
[`user-event`][gh] is a helper that provides more advanced simulation of CLI
interactions than the [`fireEvent`](./fire-event) method.
-
-
-
-- [Import](#import)
-- [API](#api)
- - [`keyboard(instance, text, [options])`](#keyboardinstance-text-options)
- - [Special characters](#special-characters)
-
-
-
## Import
`userEvent` can be used either as a global import or as returned from `render`:
diff --git a/eslint.config.js b/eslint.config.js
new file mode 100644
index 0000000..6be1a1e
--- /dev/null
+++ b/eslint.config.js
@@ -0,0 +1,12 @@
+// @ts-check
+
+// @ts-ignore Needed due to moduleResolution Node vs Bundler
+import { tanstackConfig } from "@tanstack/config/eslint";
+
+export default [
+ ...tanstackConfig,
+ {
+ name: "clitesting/temp",
+ rules: {},
+ },
+];
diff --git a/extend-expect.d.ts b/extend-expect.d.ts
deleted file mode 100644
index 2d121d6..0000000
--- a/extend-expect.d.ts
+++ /dev/null
@@ -1,23 +0,0 @@
-// TypeScript Version: 3.8
-
-///
-
-declare namespace jest {
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
- interface Matchers {
- /**
- * @description
- * Assert whether a query is present in the console or not.
- * @example
- * expect(queryByText('Hello world')).toBeInTheDocument()
- */
- toBeInTheConsole(): R
- /**
- * @description
- * Check whether the given instance has an stderr message or not.
- * @example
- * expect(instance).toHaveErrorMessage(/command could not be found/i) // to partially match
- */
- toHaveErrorMessage(): R
- }
-}
diff --git a/extend-expect.js b/extend-expect.js
deleted file mode 100644
index e7d19c1..0000000
--- a/extend-expect.js
+++ /dev/null
@@ -1,2 +0,0 @@
-// eslint-disable-next-line
-require('./dist/extend-expect')
diff --git a/jest.config.js b/jest.config.js
deleted file mode 100644
index 32837d6..0000000
--- a/jest.config.js
+++ /dev/null
@@ -1,28 +0,0 @@
-const {
- collectCoverageFrom,
- coveragePathIgnorePatterns,
- coverageThreshold,
- watchPlugins,
-} = require('kcd-scripts/jest')
-
-module.exports = {
- collectCoverageFrom,
- passWithNoTests: true,
- coveragePathIgnorePatterns: [
- ...coveragePathIgnorePatterns,
- '/__tests__/',
- '/__node_tests__/',
- ],
- coverageThreshold: {
- ...coverageThreshold,
- // TODO: Remove this
- global: {
- branches: 40,
- functions: 50,
- lines: 50,
- statements: 50,
- },
- },
- watchPlugins,
- projects: [require.resolve('./tests/jest.config.js')],
-}
diff --git a/knip.json b/knip.json
new file mode 100644
index 0000000..313a472
--- /dev/null
+++ b/knip.json
@@ -0,0 +1,14 @@
+{
+ "$schema": "https://unpkg.com/knip@5/schema.json",
+ "ignore": ["**/tests/execute-scripts/*", "website/src/components/*"],
+ "ignoreDependencies": [
+ "sharp",
+ "@babel/runtime",
+ "@jest/expect",
+ "inquirer",
+ "@types/inquirer",
+ "@jest/globals",
+ "vitest"
+ ],
+ "ignoreExportsUsedInFile": true
+}
diff --git a/other/koala.png b/media/koala.png
similarity index 100%
rename from other/koala.png
rename to media/koala.png
diff --git a/nx.json b/nx.json
new file mode 100644
index 0000000..aa54c43
--- /dev/null
+++ b/nx.json
@@ -0,0 +1,60 @@
+{
+ "$schema": "./node_modules/nx/schemas/nx-schema.json",
+ "defaultBase": "main",
+ "useInferencePlugins": false,
+ "parallel": 5,
+ "namedInputs": {
+ "sharedGlobals": [
+ "{workspaceRoot}/.nvmrc",
+ "{workspaceRoot}/package.json",
+ "{workspaceRoot}/tsconfig.json"
+ ],
+ "default": [
+ "sharedGlobals",
+ "{projectRoot}/**/*",
+ "!{projectRoot}/**/*.md"
+ ],
+ "production": [
+ "default",
+ "!{projectRoot}/tests/**/*",
+ "!{projectRoot}/eslint.config.js"
+ ]
+ },
+ "targetDefaults": {
+ "test:knip": {
+ "cache": true,
+ "inputs": ["{workspaceRoot}/**/*"]
+ },
+ "test:sherif": {
+ "cache": true,
+ "inputs": ["{workspaceRoot}/**/package.json"]
+ },
+ "test:eslint": {
+ "cache": true,
+ "dependsOn": ["^build"],
+ "inputs": ["default", "^production", "{workspaceRoot}/eslint.config.js"]
+ },
+ "test:lib": {
+ "cache": true,
+ "dependsOn": ["^build"],
+ "inputs": ["default", "^production"],
+ "outputs": ["{projectRoot}/coverage"]
+ },
+ "test:types": {
+ "cache": true,
+ "dependsOn": ["^build"],
+ "inputs": ["default", "^production"]
+ },
+ "build": {
+ "cache": true,
+ "dependsOn": ["^build"],
+ "inputs": ["production", "^production"],
+ "outputs": ["{projectRoot}/build", "{projectRoot}/dist"]
+ },
+ "test:build": {
+ "cache": true,
+ "dependsOn": ["build"],
+ "inputs": ["production"]
+ }
+ }
+}
diff --git a/other/MAINTAINING.md b/other/MAINTAINING.md
deleted file mode 100644
index a2f1a47..0000000
--- a/other/MAINTAINING.md
+++ /dev/null
@@ -1,84 +0,0 @@
-# Maintaining
-
-
-
-
-**Table of Contents**
-
-- [Code of Conduct](#code-of-conduct)
-- [Issues](#issues)
-- [Pull Requests](#pull-requests)
-- [Release](#release)
-- [Thanks!](#thanks)
-
-
-
-This is documentation for maintainers of this project.
-
-## Code of Conduct
-
-Please review, understand, and be an example of it. Violations of the code of
-conduct are taken seriously, even (especially) for maintainers.
-
-## Issues
-
-We want to support and build the community. We do that best by helping people
-learn to solve their own problems. We have an issue template and hopefully most
-folks follow it. If it's not clear what the issue is, invite them to create a
-minimal reproduction of what they're trying to accomplish or the bug they think
-they've found.
-
-Once it's determined that a code change is necessary, point people to
-[makeapullrequest.com](http://makeapullrequest.com) and invite them to make a
-pull request. If they're the one who needs the feature, they're the one who can
-build it. If they need some hand holding and you have time to lend a hand,
-please do so. It's an investment into another human being, and an investment
-into a potential maintainer.
-
-Remember that this is open source, so the code is not yours, it's ours. If
-someone needs a change in the codebase, you don't have to make it happen
-yourself. Commit as much time to the project as you want/need to. Nobody can ask
-any more of you than that.
-
-## Pull Requests
-
-As a maintainer, you're fine to make your branches on the main repo or on your
-own fork. Either way is fine.
-
-When we receive a pull request, a GitHub Action is kicked off automatically (see
-the `.github/workflows/validate.yml` for what runs in the Action). We avoid
-merging anything that breaks the GitHub Action.
-
-Please review PRs and focus on the code rather than the individual. You never
-know when this is someone's first ever PR and we want their experience to be as
-positive as possible, so be uplifting and constructive.
-
-When you merge the pull request, 99% of the time you should use the
-[Squash and merge](https://help.github.com/articles/merging-a-pull-request/)
-feature. This keeps our git history clean, but more importantly, this allows us
-to make any necessary changes to the commit message so we release what we want
-to release. See the next section on Releases for more about that.
-
-## Release
-
-Our releases are automatic. They happen whenever code lands into `main`. A
-GitHub Action gets kicked off and if it's successful, a tool called
-[`semantic-release`](https://github.com/semantic-release/semantic-release) is
-used to automatically publish a new release to npm as well as a changelog to
-GitHub. It is only able to determine the version and whether a release is
-necessary by the git commit messages. With this in mind, **please brush up on
-[the commit message convention][commit] which drives our releases.**
-
-> One important note about this: Please make sure that commit messages do NOT
-> contain the words "BREAKING CHANGE" in them unless we want to push a major
-> version. I've been burned by this more than once where someone will include
-> "BREAKING CHANGE: None" and it will end up releasing a new major version. Not
-> a huge deal honestly, but kind of annoying...
-
-## Thanks!
-
-Thank you so much for helping to maintain this project!
-
-
-[commit]: https://github.com/conventional-changelog-archived-repos/conventional-changelog-angular/blob/ed32559941719a130bb0327f886d6a32a8cbc2ba/convention.md
-
diff --git a/other/USERS.md b/other/USERS.md
deleted file mode 100644
index 4bc1281..0000000
--- a/other/USERS.md
+++ /dev/null
@@ -1,12 +0,0 @@
-# Users
-
-If you or your company uses this project, add your name to this list! Eventually
-we may have a website to showcase these (wanna build it!?)
-
-> No users have been added yet!
-
-
diff --git a/other/manual-releases.md b/other/manual-releases.md
deleted file mode 100644
index e1e77e6..0000000
--- a/other/manual-releases.md
+++ /dev/null
@@ -1,44 +0,0 @@
-# manual-releases
-
-This project has an automated release set up. So things are only released when
-there are useful changes in the code that justify a release. But sometimes
-things get messed up one way or another and we need to trigger the release
-ourselves. When this happens, simply bump the number below and commit that with
-the following commit message based on your needs:
-
-**Major**
-
-```
-fix(release): manually release a major version
-
-There was an issue with a major release, so this manual-releases.md
-change is to release a new major version.
-
-Reference: #
-
-BREAKING CHANGE:
-```
-
-**Minor**
-
-```
-feat(release): manually release a minor version
-
-There was an issue with a minor release, so this manual-releases.md
-change is to release a new minor version.
-
-Reference: #
-```
-
-**Patch**
-
-```
-fix(release): manually release a patch version
-
-There was an issue with a patch release, so this manual-releases.md
-change is to release a new patch version.
-
-Reference: #
-```
-
-The number of times we've had to do a manual release is: 6
diff --git a/package.json b/package.json
index 3427919..485757c 100644
--- a/package.json
+++ b/package.json
@@ -1,109 +1,60 @@
{
- "name": "cli-testing-library",
- "version": "0.0.0-semantically-released",
- "description": "Simple and complete CLI testing utilities that encourage good testing practices.",
- "main": "dist/index.js",
- "exports": {
- ".": {
- "types": "./types/index.d.ts",
- "require": "./dist/cli-testing-library.cjs.js",
- "import": "./dist/cli-testing-library.esm.js"
- },
- "./extend-expect": {
- "types": "./extend-expect.d.ts",
- "require": "./dist/extend-expect.js",
- "import": "./dist/extend-expect.js"
- }
- },
- "types": "types/index.d.ts",
- "module": "dist/cli-testing-library.esm.js",
- "umd:main": "dist/cli-testing-library.umd.js",
- "source": "src/index.js",
- "keywords": [
- "testing",
- "cli",
- "unit",
- "integration",
- "functional",
- "end-to-end",
- "e2e"
- ],
- "author": "Corbin Crutchley (https://crutchcorn.com)",
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "scripts": {
- "build": "kcd-scripts build --no-ts-defs --ignore \"**/__tests__/**,**/__node_tests__/**,**/__mocks__/**\" && kcd-scripts build --no-ts-defs --bundle --no-clean",
- "format": "kcd-scripts format",
- "lint": "kcd-scripts lint",
- "setup": "npm install && npm run validate -s",
- "test": "kcd-scripts test",
- "test:debug": "node --inspect-brk ./node_modules/.bin/jest --watch --runInBand",
- "test:update": "npm test -- --updateSnapshot --coverage",
- "validate": "kcd-scripts validate",
- "typecheck": "kcd-scripts typecheck --build types"
- },
- "files": [
- "dist",
- "types/*.d.ts",
- "types/user-event/**/*.d.ts",
- "extend-expect.js",
- "extend-expect.d.ts",
- "src/user-event/**/*.ts",
- "src/user-event/*.ts"
- ],
- "dependencies": {
- "@babel/code-frame": "^7.10.4",
- "@babel/runtime": "^7.12.5",
- "jest-matcher-utils": "^27.4.2",
- "lz-string": "^1.4.4",
- "pretty-format": "^27.0.2",
- "redent": "^3.0.0",
- "slice-ansi": "^4.0.0",
- "strip-ansi": "^6.0.1",
- "strip-final-newline": "^2.0.0",
- "tree-kill": "^1.2.2"
- },
- "devDependencies": {
- "@types/lz-string": "^1.3.34",
- "@types/strip-final-newline": "^3.0.0",
- "chalk": "^4.1.2",
- "has-ansi": "^3.0.0",
- "inquirer": "^8.2.0",
- "jest-in-case": "^1.0.2",
- "jest-watch-select-projects": "^2.0.0",
- "kcd-scripts": "^12.2.0",
- "typescript": "^4.7.2"
- },
- "eslintConfig": {
- "extends": [
- "./node_modules/kcd-scripts/eslint.js",
- "plugin:import/typescript"
- ],
- "rules": {
- "@typescript-eslint/prefer-includes": "off",
- "@typescript-eslint/no-unsafe-call": "off",
- "@typescript-eslint/no-unsafe-member-access": "off",
- "@typescript-eslint/no-unsafe-assignment": "off",
- "import/prefer-default-export": "off",
- "import/no-unassigned-import": "off",
- "import/no-useless-path-segments": "off",
- "no-console": "off",
- "import/consistent-type-specifier-style": "off"
- }
- },
- "eslintIgnore": [
- "node_modules",
- "coverage",
- "dist"
- ],
+ "name": "root",
+ "private": true,
"repository": {
"type": "git",
"url": "https://github.com/crutchcorn/cli-testing-library"
},
- "bugs": {
- "url": "https://github.com/crutchcorn/cli-testing-library/issues"
+ "packageManager": "pnpm@9.14.4",
+ "type": "module",
+ "scripts": {
+ "clean": "pnpm --filter \"./packages/**\" run clean",
+ "preinstall": "node -e \"if(process.env.CI == 'true') {console.log('Skipping preinstall...')} else {process.exit(1)}\" || npx -y only-allow pnpm",
+ "test": "pnpm run test:ci",
+ "test:pr": "nx run-many --targets=test:sherif,test:knip,test:eslint,test:lib,test:types,test:build,build",
+ "test:ci": "nx run-many --targets=test:sherif,test:knip,test:eslint,test:lib,test:types,test:build,build",
+ "test:eslint": "nx run-many --target=test:eslint",
+ "test:format": "pnpm run prettier --check",
+ "test:sherif": "sherif",
+ "test:lib": "nx run-many --target=test:lib --exclude=examples/**",
+ "test:lib:dev": "pnpm run test:lib && nx watch --all -- pnpm run test:lib",
+ "test:build": "nx run-many --target=test:build --exclude=examples/**",
+ "test:types": "nx run-many --target=test:types --exclude=examples/**",
+ "test:knip": "knip",
+ "build": "nx run-many --target=build --exclude=examples/**",
+ "build:website": "nx run-many --target=build --projects=website",
+ "build:all": "nx run-many --target=build --exclude=examples/**",
+ "watch": "pnpm run build:all && nx watch --all -- pnpm run build:all",
+ "dev": "pnpm run watch",
+ "prettier": "prettier --ignore-unknown .",
+ "prettier:write": "pnpm run prettier --write",
+ "docs:generate": "node scripts/generateDocs.js",
+ "cipublish": "node scripts/publish.js",
+ "cipublishforce": "CI=true pnpm cipublish"
+ },
+ "nx": {
+ "includedScripts": [
+ "test:knip",
+ "test:sherif"
+ ]
},
- "homepage": "https://github.com/crutchcorn/cli-testing-library#readme"
+ "devDependencies": {
+ "@tanstack/config": "^0.16.1",
+ "@types/node": "^22.10.10",
+ "eslint": "9.19.0",
+ "knip": "^5.43.3",
+ "nx": "^20.3.3",
+ "premove": "^4.0.0",
+ "prettier": "^3.4.2",
+ "publint": "^0.3.2",
+ "sherif": "^1.2.0",
+ "typescript": "5.6.3",
+ "typescript51": "npm:typescript@5.1",
+ "typescript52": "npm:typescript@5.2",
+ "typescript53": "npm:typescript@5.3",
+ "typescript54": "npm:typescript@5.4",
+ "typescript55": "npm:typescript@5.5",
+ "vite": "^6.0.11",
+ "vitest": "^3.0.4"
+ }
}
diff --git a/packages/cli-testing-library/README.md b/packages/cli-testing-library/README.md
new file mode 100644
index 0000000..200b2b4
--- /dev/null
+++ b/packages/cli-testing-library/README.md
@@ -0,0 +1,108 @@
+
+
CLI Testing Library
+
+
+
+
+
+
Simple and complete CLI testing utilities that encourage good testing
+practices.
+
+
+
+
+
+[](https://github.com/crutchcorn/cli-testing-library/actions/workflows/validate.yml?query=branch%3Amain)
+[](https://www.npmjs.com/package/cli-testing-library)
+[](https://www.npmjs.com/package/cli-testing-library)
+[](./LICENSE)
+[](makeapullrequest.com)
+[](./CODE_OF_CONDUCT.md)
+
+
+
+[](#contributors-)
+
+
+
+[](https://github.com/crutchcorn/cli-testing-library/watchers)
+[](https://github.com/crutchcorn/cli-testing-library/stargazers)
+
+
+
+## Table of Contents
+
+
+
+
+- [Installation](#installation)
+- [Usage](#usage)
+- [Contributors ✨](#contributors-)
+
+
+
+> This project is not affiliated with the
+> ["Testing Library"](https://github.com/testing-library) ecosystem that this
+> project is clearly inspired from. We're just big fans :)
+
+## Installation
+
+This module is distributed via [npm][npm] which is bundled with [node][node] and
+should be installed as one of your project's `devDependencies`:
+
+```
+npm install --save-dev cli-testing-library
+```
+
+## Usage
+
+> This is currently the only section of "usage" documentation. We'll be
+> expanding it as soon as possible
+
+Usage example:
+
+```javascript
+const { resolve } = require("path");
+const { render } = require("cli-testing-library");
+
+test("Is able to make terminal input and view in-progress stdout", async () => {
+ const { clear, findByText, queryByText, userEvent } = await render("node", [
+ resolve(__dirname, "./execute-scripts/stdio-inquirer.js"),
+ ]);
+
+ const instance = await findByText("First option");
+
+ expect(instance).toBeInTheConsole();
+
+ expect(await findByText("❯ One")).toBeInTheConsole();
+
+ clear();
+
+ userEvent("[ArrowDown]");
+
+ expect(await findByText("❯ Two")).toBeInTheConsole();
+
+ clear();
+
+ userEvent.keyboard("[Enter]");
+
+ expect(await findByText("First option: Two")).toBeInTheConsole();
+ expect(await queryByText("First option: Three")).not.toBeInTheConsole();
+});
+```
+
+For a API reference documentation, including suggestions on how to use this
+library, see our
+[documentation introduction with further reading](./docs/introduction.md).
+
+> While this library _does_ work in Windows, it does not appear to function
+> properly in Windows CI environments, such as GitHub actions. As a result, you
+> may need to either switch CI systems or limit your CI to only run in Linux
+>
+> If you know how to fix this, please let us know in
+> [this tracking issue](https://github.com/crutchcorn/cli-testing-library/issues/3)
diff --git a/packages/cli-testing-library/eslint.config.js b/packages/cli-testing-library/eslint.config.js
new file mode 100644
index 0000000..835e0f6
--- /dev/null
+++ b/packages/cli-testing-library/eslint.config.js
@@ -0,0 +1,5 @@
+// @ts-check
+
+import rootConfig from "../../eslint.config.js";
+
+export default [...rootConfig];
diff --git a/packages/cli-testing-library/jest-globals/package.json b/packages/cli-testing-library/jest-globals/package.json
new file mode 100644
index 0000000..cbfcfaf
--- /dev/null
+++ b/packages/cli-testing-library/jest-globals/package.json
@@ -0,0 +1,25 @@
+{
+ "name": "cli-testing-library-jest-globals",
+ "version": "3.0.0",
+ "description": "",
+ "type": "module",
+ "module": "./../dist/esm/jest-globals.js",
+ "main": "./../dist/cjs/jest-globals.cjs",
+ "types": "./../dist/cjs/jest-globals.d.cts",
+ "exports": {
+ "./package.json": "./package.json",
+ ".": {
+ "import": {
+ "types": "./../dist/esm/jest-globals.d.ts",
+ "default": "./../dist/esm/jest-globals.js"
+ },
+ "require": {
+ "types": "./../dist/cjs/jest-globals.d.cts",
+ "default": "./../dist/cjs/jest-globals.cjs"
+ }
+ }
+ },
+ "author": "Corbin Crutchley (https://crutchcorn.dev)",
+ "license": "MIT",
+ "sideEffects": true
+}
diff --git a/packages/cli-testing-library/jest/package.json b/packages/cli-testing-library/jest/package.json
new file mode 100644
index 0000000..08fde4e
--- /dev/null
+++ b/packages/cli-testing-library/jest/package.json
@@ -0,0 +1,25 @@
+{
+ "name": "cli-testing-library-jest",
+ "version": "3.0.0",
+ "description": "",
+ "type": "module",
+ "module": "./../dist/esm/jest.js",
+ "main": "./../dist/cjs/jest.cjs",
+ "types": "./../dist/cjs/jest.d.cts",
+ "exports": {
+ "./package.json": "./package.json",
+ ".": {
+ "import": {
+ "types": "./../dist/esm/jest.d.ts",
+ "default": "./../dist/esm/jest.js"
+ },
+ "require": {
+ "types": "./../dist/cjs/jest.d.cts",
+ "default": "./../dist/cjs/jest.cjs"
+ }
+ }
+ },
+ "author": "Corbin Crutchley (https://crutchcorn.dev)",
+ "license": "MIT",
+ "sideEffects": true
+}
diff --git a/packages/cli-testing-library/package.json b/packages/cli-testing-library/package.json
new file mode 100644
index 0000000..6abc7b3
--- /dev/null
+++ b/packages/cli-testing-library/package.json
@@ -0,0 +1,136 @@
+{
+ "name": "cli-testing-library",
+ "version": "3.0.0",
+ "description": "Simple and complete CLI testing utilities that encourage good testing practices.",
+ "keywords": [
+ "testing",
+ "cli",
+ "unit",
+ "integration",
+ "functional",
+ "end-to-end",
+ "e2e"
+ ],
+ "author": "Corbin Crutchley (https://crutchcorn.dev)",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/crutchcorn/cli-testing-library",
+ "directory": "packages/cli-testing-library"
+ },
+ "bugs": {
+ "url": "https://github.com/crutchcorn/cli-testing-library/issues"
+ },
+ "homepage": "https://github.com/crutchcorn/cli-testing-library#readme",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/crutchcorn"
+ },
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
+ },
+ "scripts": {
+ "clean": "premove ./dist ./coverage",
+ "test:eslint": "eslint ./src ./tests",
+ "test:types": "pnpm run \"/^test:types:ts[0-9]{2}$/\"",
+ "test:types:ts51": "node ../../node_modules/typescript51/lib/tsc.js",
+ "test:types:ts52": "node ../../node_modules/typescript52/lib/tsc.js",
+ "test:types:ts53": "node ../../node_modules/typescript53/lib/tsc.js",
+ "test:types:ts54": "node ../../node_modules/typescript54/lib/tsc.js",
+ "test:types:ts55": "node ../../node_modules/typescript55/lib/tsc.js",
+ "test:types:ts56": "tsc",
+ "test:lib": "vitest",
+ "test:lib:dev": "pnpm run test:lib --watch",
+ "test:build": "publint --strict",
+ "build": "vite build"
+ },
+ "type": "module",
+ "types": "dist/esm/index.d.ts",
+ "main": "dist/cjs/index.cjs",
+ "module": "dist/esm/index.js",
+ "exports": {
+ ".": {
+ "import": {
+ "types": "./dist/esm/index.d.ts",
+ "default": "./dist/esm/index.js"
+ },
+ "require": {
+ "types": "./dist/cjs/index.d.cts",
+ "default": "./dist/cjs/index.cjs"
+ }
+ },
+ "./jest": {
+ "import": {
+ "types": "./dist/esm/jest.d.ts",
+ "default": "./dist/esm/jest.js"
+ },
+ "require": {
+ "types": "./dist/cjs/jest.d.cts",
+ "default": "./dist/cjs/jest.cjs"
+ }
+ },
+ "./jest-globals": {
+ "import": {
+ "types": "./dist/esm/jest-globals.d.ts",
+ "default": "./dist/esm/jest-globals.js"
+ },
+ "require": {
+ "types": "./dist/cjs/jest-globals.d.cts",
+ "default": "./dist/cjs/jest-globals.cjs"
+ }
+ },
+ "./vitest": {
+ "import": {
+ "types": "./dist/esm/vitest.d.ts",
+ "default": "./dist/esm/vitest.js"
+ },
+ "require": {
+ "types": "./dist/cjs/vitest.d.cts",
+ "default": "./dist/cjs/vitest.cjs"
+ }
+ },
+ "./package.json": "./package.json"
+ },
+ "sideEffects": false,
+ "files": [
+ "dist",
+ "src",
+ "vitest",
+ "jest",
+ "jest-globals"
+ ],
+ "dependencies": {
+ "@babel/code-frame": "^7.10.4",
+ "@babel/runtime": "^7.12.5",
+ "picocolors": "^1.1.1",
+ "redent": "^4.0.0",
+ "slice-ansi": "^7.1.0",
+ "strip-ansi": "^7.1.0",
+ "strip-final-newline": "^4.0.0",
+ "tree-kill": "^1.2.2"
+ },
+ "devDependencies": {
+ "@jest/expect": "^29.7.0",
+ "@jest/globals": "^29.7.0",
+ "@types/babel__code-frame": "^7.0.6",
+ "@types/inquirer": "^9.0.7",
+ "@vitest/coverage-istanbul": "3.0.4",
+ "inquirer": "^12.3.2"
+ },
+ "peerDependencies": {
+ "@jest/expect": "^29.0.0",
+ "@jest/globals": "^29.0.0",
+ "vitest": "^3.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@jest/globals": {
+ "optional": true
+ },
+ "@jest/expect": {
+ "optional": true
+ },
+ "vitest": {
+ "optional": true
+ }
+ }
+}
diff --git a/src/config.ts b/packages/cli-testing-library/src/config.ts
similarity index 55%
rename from src/config.ts
rename to packages/cli-testing-library/src/config.ts
index 1337b5c..30dbda4 100644
--- a/src/config.ts
+++ b/packages/cli-testing-library/src/config.ts
@@ -1,10 +1,30 @@
-import {Config, ConfigFn} from '../types/config'
-import {TestInstance} from '../types/pure'
+import type { TestInstance } from "./types";
+
// import {prettyDOM} from './pretty-dom'
-type Callback = () => T
+export interface Config {
+ /**
+ * WARNING: `unstable` prefix means this API may change in patch and minor releases.
+ * @param cb
+ */
+ unstable_advanceTimersWrapper: (
+ cb: (...args: Array) => unknown,
+ ) => unknown;
+ asyncUtilTimeout: number;
+ renderAwaitTime: number;
+ errorDebounceTimeout: number;
+ showOriginalStackTrace: boolean;
+ throwSuggestions: boolean;
+ getInstanceError: (message: string | null, container: TestInstance) => Error;
+}
+
+export interface ConfigFn {
+ (existingConfig: Config): Partial;
+}
+
+type Callback = () => T;
interface InternalConfig extends Config {
- _disableExpensiveErrorDiagnostics: boolean
+ _disableExpensiveErrorDiagnostics: boolean;
}
// It would be cleaner for this to live inside './queries', but
@@ -17,7 +37,7 @@ let config: InternalConfig = {
renderAwaitTime: 100,
// Internal timer time to wait before attempting error recovery debounce action
errorDebounceTimeout: 100,
- unstable_advanceTimersWrapper: cb => cb(),
+ unstable_advanceTimersWrapper: (cb) => cb(),
// default value for the `hidden` option in `ByRole` queries
// showOriginalStackTrace flag to show the full error stack traces for async errors
showOriginalStackTrace: false,
@@ -27,47 +47,47 @@ let config: InternalConfig = {
// called when getBy* queries fail. (message, container) => Error
getInstanceError(message, testInstance: TestInstance | undefined) {
- let instanceWarning: string = ''
+ let instanceWarning = "";
if (testInstance) {
- const stdallArrStr = testInstance.getStdallStr()
- instanceWarning = `\n${stdallArrStr}`
+ const stdallArrStr = testInstance.getStdallStr();
+ instanceWarning = `\n${stdallArrStr}`;
} else {
- instanceWarning = ''
+ instanceWarning = "";
}
const error = new Error(
- [message, instanceWarning].filter(Boolean).join('\n\n'),
- )
- error.name = 'TestingLibraryElementError'
- return error
+ [message, instanceWarning].filter(Boolean).join("\n\n"),
+ );
+ error.name = "TestingLibraryElementError";
+ return error;
},
_disableExpensiveErrorDiagnostics: false,
-}
+};
export function runWithExpensiveErrorDiagnosticsDisabled(
callback: Callback,
) {
try {
- config._disableExpensiveErrorDiagnostics = true
- return callback()
+ config._disableExpensiveErrorDiagnostics = true;
+ return callback();
} finally {
- config._disableExpensiveErrorDiagnostics = false
+ config._disableExpensiveErrorDiagnostics = false;
}
}
-export function configure(newConfig: ConfigFn | Partial) {
- if (typeof newConfig === 'function') {
+export function configure(newConfig: ConfigFn | Partial): void {
+ if (typeof newConfig === "function") {
// Pass the existing config out to the provided function
// and accept a delta in return
- newConfig = newConfig(config)
+ newConfig = newConfig(config);
}
// Merge the incoming config delta
config = {
...config,
...newConfig,
- }
+ };
}
export function getConfig(): Config {
- return config
+ return config;
}
diff --git a/packages/cli-testing-library/src/event-map.ts b/packages/cli-testing-library/src/event-map.ts
new file mode 100644
index 0000000..1edd6c1
--- /dev/null
+++ b/packages/cli-testing-library/src/event-map.ts
@@ -0,0 +1,15 @@
+import { killProc } from "./process-helpers";
+import type { TestInstance } from "./types";
+
+const isWin = process.platform === "win32";
+
+const eventMap = {
+ sigterm: (instance: TestInstance): Promise =>
+ killProc(instance, isWin ? undefined : "SIGTERM"),
+ sigkill: (instance: TestInstance): Promise =>
+ killProc(instance, isWin ? undefined : "SIGKILL"),
+ write: (instance: TestInstance, props: { value: string }): boolean =>
+ instance.process.stdin.write(props.value),
+};
+
+export { eventMap };
diff --git a/packages/cli-testing-library/src/events.ts b/packages/cli-testing-library/src/events.ts
new file mode 100644
index 0000000..48ee03e
--- /dev/null
+++ b/packages/cli-testing-library/src/events.ts
@@ -0,0 +1,38 @@
+import { eventMap } from "./event-map";
+import type { TestInstance } from "./types";
+
+type EventMap = typeof eventMap;
+export type EventType = keyof EventMap;
+
+export type FireFunction = (
+ instance: TestInstance,
+ event: TEventType,
+ options?: Parameters[1],
+) => boolean | Promise;
+
+export type FireObject = {
+ [K in EventType]: (
+ instance: TestInstance,
+ options?: Parameters[1],
+ ) => boolean | Promise;
+};
+
+const fireEvent: FireFunction & FireObject = ((
+ instance,
+ event,
+ props = undefined,
+) => {
+ return eventMap[event](instance, props!);
+}) satisfies FireFunction as never;
+
+Object.entries(eventMap).forEach(([_eventName, _eventFn]) => {
+ const eventName = _eventName as keyof typeof eventMap;
+ const eventFn = _eventFn as (
+ ...props: Array
+ ) => ReturnType<(typeof eventMap)[keyof typeof eventMap]>;
+ fireEvent[eventName] = (instance, ...props) => {
+ return eventFn(instance, ...props);
+ };
+});
+
+export { fireEvent };
diff --git a/packages/cli-testing-library/src/get-queries-for-instance.ts b/packages/cli-testing-library/src/get-queries-for-instance.ts
new file mode 100644
index 0000000..5100e9e
--- /dev/null
+++ b/packages/cli-testing-library/src/get-queries-for-instance.ts
@@ -0,0 +1,62 @@
+import * as defaultQueries from "./queries/index";
+import type { TestInstance } from "./types";
+
+export type BoundFunction = T extends (
+ container: TestInstance,
+ ...args: infer P
+) => infer R
+ ? (...args: P) => R
+ : never;
+
+export type BoundFunctions = TQueries extends typeof defaultQueries
+ ? {
+ getByText: (
+ ...args: Parameters>>
+ ) => ReturnType>;
+ queryByText: (
+ ...args: Parameters>>
+ ) => ReturnType>;
+ findByText: (
+ ...args: Parameters>>
+ ) => ReturnType>;
+ } & {
+ [P in keyof TQueries]: BoundFunction;
+ }
+ : {
+ [P in keyof TQueries]: BoundFunction;
+ };
+
+export type Query = (
+ container: TestInstance,
+ ...args: Array
+) =>
+ | Error
+ | TestInstance
+ | Array
+ | Promise>
+ | Promise
+ | null;
+
+export interface Queries {
+ [T: string]: Query;
+}
+
+/**
+ * @param instance
+ * @param queries object of functions
+ * @param initialValue for reducer
+ * @returns returns object of functions bound to container
+ */
+function getQueriesForElement(
+ instance: TestInstance,
+ queries: T = defaultQueries as unknown as T,
+ initialValue = {},
+): BoundFunctions {
+ return Object.keys(queries).reduce((helpers, key) => {
+ const fn = queries[key];
+ helpers[key] = fn!.bind(null, instance);
+ return helpers;
+ }, initialValue as BoundFunctions);
+}
+
+export { getQueriesForElement };
diff --git a/packages/cli-testing-library/src/get-user-code-frame.ts b/packages/cli-testing-library/src/get-user-code-frame.ts
new file mode 100644
index 0000000..0bfdacb
--- /dev/null
+++ b/packages/cli-testing-library/src/get-user-code-frame.ts
@@ -0,0 +1,57 @@
+// We try to load node dependencies
+import fs from "node:fs";
+import pc from "picocolors";
+import { codeFrameColumns } from "@babel/code-frame";
+
+const readFileSync = fs.readFileSync;
+
+// frame has the form "at myMethod (location/to/my/file.js:10:2)"
+function getCodeFrame(frame: string) {
+ const locationStart = frame.indexOf("(") + 1;
+ const locationEnd = frame.indexOf(")");
+ const frameLocation = frame.slice(locationStart, locationEnd);
+
+ const frameLocationElements = frameLocation.split(":");
+ const [filename, line, column] = [
+ frameLocationElements[0]!,
+ parseInt(frameLocationElements[1]!, 10),
+ parseInt(frameLocationElements[2]!, 10),
+ ];
+
+ let rawFileContents = "";
+ try {
+ rawFileContents = readFileSync(filename, "utf-8");
+ } catch (e) {
+ return "";
+ }
+
+ const codeFrame = codeFrameColumns(
+ rawFileContents,
+ {
+ start: { line, column },
+ },
+ {
+ highlightCode: false,
+ linesBelow: 0,
+ },
+ );
+ return `${pc.dim(frameLocation)}\n${codeFrame}\n`;
+}
+
+function getUserCodeFrame() {
+ // If we couldn't load dependencies, we can't generate the user trace
+ /* istanbul ignore next */
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
+ if (!readFileSync || !codeFrameColumns) {
+ return "";
+ }
+ const err = new Error();
+ const firstClientCodeFrame = err.stack
+ ?.split("\n")
+ .slice(1) // Remove first line which has the form "Error: TypeError"
+ .find((frame) => !frame.includes("node_modules/")); // Ignore frames from 3rd party libraries
+
+ return getCodeFrame(firstClientCodeFrame!);
+}
+
+export { getUserCodeFrame };
diff --git a/packages/cli-testing-library/src/helpers.ts b/packages/cli-testing-library/src/helpers.ts
new file mode 100644
index 0000000..bc40096
--- /dev/null
+++ b/packages/cli-testing-library/src/helpers.ts
@@ -0,0 +1,94 @@
+import type { TestInstance } from "./types";
+
+function jestFakeTimersAreEnabled() {
+ /* istanbul ignore else */
+ if (
+ (typeof vi !== "undefined" && vi.isFakeTimers && vi.isFakeTimers()) ||
+ (typeof jest !== "undefined" && jest !== null)
+ ) {
+ return (
+ // legacy timers
+ (
+ setTimeout as unknown as {
+ _isMockFunction: boolean;
+ }
+ )._isMockFunction === true ||
+ // modern timers
+
+ Object.prototype.hasOwnProperty.call(setTimeout, "clock")
+ );
+ }
+ // istanbul ignore next
+ return false;
+}
+
+const instanceRef = { current: undefined as TestInstance | undefined };
+
+if (typeof afterEach === "function") {
+ afterEach(() => {
+ instanceRef.current = undefined;
+ });
+}
+
+function getCurrentInstance() {
+ /**
+ * Worth mentioning that this deviates from the upstream implementation
+ * of `dom-testing-library`'s `getDocument` in waitFor, which throws an error whenever
+ * `window` is not defined.
+ *
+ * Admittedly, this is another way that `cli-testing-library` will need to figure out
+ * the right solution to this problem, since there is no omni-present parent `instance`
+ * in a CLI like there is in a browser. (although FWIW, "process" might work)
+ *
+ * Have ideas how to solve? Please let us know:
+ * https://github.com/crutchcorn/cli-testing-library/issues/
+ */
+ return instanceRef.current;
+}
+
+// TODO: Does this need to be namespaced for each test that runs?
+// That way, we don't end up with a "singleton" that ends up wiped between
+// parallel tests.
+function setCurrentInstance(newInstance: TestInstance) {
+ instanceRef.current = newInstance;
+}
+
+function debounce) => void>(
+ func: T,
+ timeout: number,
+): (...args: Parameters) => void {
+ let timer: ReturnType;
+
+ return (...args: Parameters) => {
+ clearTimeout(timer);
+ timer = setTimeout(() => {
+ // @ts-ignore this is fine
+ func.apply(this, args);
+ }, timeout);
+ };
+}
+
+/**
+ * This is used to bind a series of functions where `instance` is the first argument
+ * to an instance, removing the implicit first argument.
+ */
+function bindObjectFnsToInstance(
+ instance: TestInstance,
+ object: Record) => unknown>,
+) {
+ return Object.entries(object).reduce(
+ (prev, [key, fn]) => {
+ prev[key] = (...props: Array) => fn(instance, ...props);
+ return prev;
+ },
+ {} as typeof object,
+ );
+}
+
+export {
+ jestFakeTimersAreEnabled,
+ setCurrentInstance,
+ getCurrentInstance,
+ debounce,
+ bindObjectFnsToInstance,
+};
diff --git a/packages/cli-testing-library/src/index.ts b/packages/cli-testing-library/src/index.ts
new file mode 100644
index 0000000..b793479
--- /dev/null
+++ b/packages/cli-testing-library/src/index.ts
@@ -0,0 +1,39 @@
+import { cleanup } from "./pure";
+
+// if we're running in a test runner that supports afterEach
+// or teardown then we'll automatically run cleanup afterEach test
+// this ensures that tests run in isolation from each other
+// if you don't like this then set the CTL_SKIP_AUTO_CLEANUP env variable to 'true'.
+if (
+ typeof process === "undefined" ||
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
+ !(process.env && process.env.CTL_SKIP_AUTO_CLEANUP)
+) {
+ // ignore teardown() in code coverage because Jest does not support it
+ /* istanbul ignore else */
+ if (typeof afterEach === "function") {
+ afterEach(async () => {
+ await cleanup();
+ });
+ } else if (typeof teardown === "function") {
+ // Block is guarded by `typeof` check.
+ // eslint does not support `typeof` guards.
+
+ teardown(async () => {
+ await cleanup();
+ });
+ }
+}
+
+export * from "./config";
+export * from "./helpers";
+export * from "./events";
+export * from "./get-queries-for-instance";
+export * from "./matches";
+export * from "./pure";
+export * from "./query-helpers";
+export * from "./queries/index";
+export * as queries from "./queries/index";
+export * from "./mutation-observer";
+export * from "./wait-for";
+export * from "./user-event/index";
diff --git a/packages/cli-testing-library/src/jest-globals.ts b/packages/cli-testing-library/src/jest-globals.ts
new file mode 100644
index 0000000..2838c1a
--- /dev/null
+++ b/packages/cli-testing-library/src/jest-globals.ts
@@ -0,0 +1,11 @@
+import globals from "@jest/globals";
+import * as extensions from "./matchers/index";
+import type { CLITestingLibraryMatchers } from "./matchers/types";
+
+globals.expect.extend(extensions);
+
+declare module "@jest/expect" {
+ // eslint-disable-next-line @typescript-eslint/naming-convention
+ export interface Matchers>
+ extends CLITestingLibraryMatchers {}
+}
diff --git a/packages/cli-testing-library/src/jest.ts b/packages/cli-testing-library/src/jest.ts
new file mode 100644
index 0000000..dd5f7a5
--- /dev/null
+++ b/packages/cli-testing-library/src/jest.ts
@@ -0,0 +1,12 @@
+import * as extensions from "./matchers/index";
+import type { CLITestingLibraryMatchers } from "./matchers/types";
+
+expect.extend(extensions);
+
+declare global {
+ // eslint-disable-next-line @typescript-eslint/no-namespace
+ namespace jest {
+ // eslint-disable-next-line @typescript-eslint/naming-convention
+ interface Matchers extends CLITestingLibraryMatchers {}
+ }
+}
diff --git a/packages/cli-testing-library/src/matchers/index.ts b/packages/cli-testing-library/src/matchers/index.ts
new file mode 100644
index 0000000..c680e79
--- /dev/null
+++ b/packages/cli-testing-library/src/matchers/index.ts
@@ -0,0 +1,4 @@
+import { toBeInTheConsole } from "./to-be-in-the-console";
+import { toHaveErrorMessage } from "./to-have-errormessage";
+
+export { toBeInTheConsole, toHaveErrorMessage };
diff --git a/packages/cli-testing-library/src/matchers/to-be-in-the-console.ts b/packages/cli-testing-library/src/matchers/to-be-in-the-console.ts
new file mode 100644
index 0000000..1a84871
--- /dev/null
+++ b/packages/cli-testing-library/src/matchers/to-be-in-the-console.ts
@@ -0,0 +1,37 @@
+import { getDefaultNormalizer } from "../matches";
+import { checkCliInstance, getMessage } from "./utils";
+import type { TestInstance } from "../types";
+
+export function toBeInTheConsole(this: any, instance: TestInstance) {
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
+ if (instance !== null || !this.isNot) {
+ checkCliInstance(instance, toBeInTheConsole, this);
+ }
+
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
+ const errormessage = instance
+ ? getDefaultNormalizer()(
+ instance.stdoutArr.map((obj) => obj.contents).join("\n"),
+ )
+ : null;
+
+ return {
+ // Does not change based on `.not`, and as a result, we must confirm if it _actually_ is there
+ pass: !!instance,
+ message: () => {
+ const to = this.isNot ? "not to" : "to";
+ return getMessage(
+ this,
+ this.utils.matcherHint(
+ `${this.isNot ? ".not" : ""}.toBeInTheConsole`,
+ "instance",
+ "",
+ ),
+ `Expected ${to} find the instance in the console`,
+ "",
+ "Received",
+ this.utils.printReceived(errormessage),
+ );
+ },
+ };
+}
diff --git a/packages/cli-testing-library/src/matchers/to-have-errormessage.ts b/packages/cli-testing-library/src/matchers/to-have-errormessage.ts
new file mode 100644
index 0000000..212e599
--- /dev/null
+++ b/packages/cli-testing-library/src/matchers/to-have-errormessage.ts
@@ -0,0 +1,40 @@
+import { getDefaultNormalizer } from "../matches";
+import { checkCliInstance, getMessage } from "./utils";
+import type { TestInstance } from "../types";
+
+export function toHaveErrorMessage(
+ this: any,
+ testInstance: TestInstance,
+ checkWith?: string | RegExp,
+) {
+ checkCliInstance(testInstance, toHaveErrorMessage, this);
+
+ const expectsErrorMessage = checkWith !== undefined;
+
+ const errormessage = getDefaultNormalizer()(
+ testInstance.stderrArr.map((obj) => obj.contents).join("\n"),
+ );
+
+ return {
+ pass: expectsErrorMessage
+ ? checkWith instanceof RegExp
+ ? checkWith.test(errormessage)
+ : this.equals(errormessage, checkWith)
+ : Boolean(testInstance.stderrArr.length),
+ message: () => {
+ const to = this.isNot ? "not to" : "to";
+ return getMessage(
+ this,
+ this.utils.matcherHint(
+ `${this.isNot ? ".not" : ""}.toHaveErrorMessage`,
+ "instance",
+ "",
+ ),
+ `Expected the instance ${to} have error message`,
+ this.utils.printExpected(checkWith),
+ "Received",
+ this.utils.printReceived(errormessage),
+ );
+ },
+ };
+}
diff --git a/packages/cli-testing-library/src/matchers/types.ts b/packages/cli-testing-library/src/matchers/types.ts
new file mode 100644
index 0000000..57fbe2d
--- /dev/null
+++ b/packages/cli-testing-library/src/matchers/types.ts
@@ -0,0 +1,17 @@
+export interface CLITestingLibraryMatchers {
+ /**
+ * @description
+ * Assert whether a query is present in the console or not.
+ * @example
+ * expect(queryByText('Hello world')).toBeInTheDocument()
+ */
+ toBeInTheConsole: () => TReturn;
+
+ /**
+ * @description
+ * Check whether the given instance has a stderr message or not.
+ * @example
+ * expect(instance).toHaveErrorMessage(/command could not be found/i) // to partially match
+ */
+ toHaveErrorMessage: (checkWith?: string | RegExp) => TReturn;
+}
diff --git a/packages/cli-testing-library/src/matchers/utils.ts b/packages/cli-testing-library/src/matchers/utils.ts
new file mode 100644
index 0000000..c9a7f0f
--- /dev/null
+++ b/packages/cli-testing-library/src/matchers/utils.ts
@@ -0,0 +1,93 @@
+import redent from "redent";
+import type { TestInstance } from "../types";
+
+class GenericTypeError extends Error {
+ constructor(
+ expectedString: string,
+ received: any,
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
+ matcherFn: Function,
+ context: any,
+ ) {
+ super();
+
+ /* istanbul ignore next */
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
+ if (Error.captureStackTrace) {
+ Error.captureStackTrace(this, matcherFn);
+ }
+ let withType = "";
+ try {
+ withType = context.utils.printWithType(
+ "Received",
+ received,
+ context.utils.printReceived,
+ );
+ } catch (e) {
+ // Can throw for Document:
+ // https://github.com/jsdom/jsdom/issues/2304
+ }
+ this.message = [
+ context.utils.matcherHint(
+ `${context.isNot ? ".not" : ""}.${matcherFn.name}`,
+ "received",
+ "",
+ ),
+ "",
+
+ `${context.utils.RECEIVED_COLOR(
+ "received",
+ )} value must ${expectedString}.`,
+ withType,
+ ].join("\n");
+ }
+}
+
+type GenericTypeErrorArgs = ConstructorParameters;
+
+type AllButFirst = T extends [infer _First, ...infer Rest] ? Rest : never;
+
+class CliInstanceTypeError extends GenericTypeError {
+ constructor(...args: AllButFirst) {
+ super("be a TestInstance", ...args);
+ }
+}
+
+type CliInstanceTypeErrorArgs = ConstructorParameters<
+ typeof CliInstanceTypeError
+>;
+
+function checkCliInstance(
+ cliInstance: TestInstance,
+ ...args: AllButFirst
+) {
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
+ if (!(cliInstance && cliInstance.process && cliInstance.process.stdout)) {
+ throw new CliInstanceTypeError(cliInstance, ...args);
+ }
+}
+
+function display(context: any, value: any) {
+ return typeof value === "string" ? value : context.utils.stringify(value);
+}
+
+function getMessage(
+ context: any,
+ matcher: string,
+ expectedLabel: string,
+ expectedValue: string,
+ receivedLabel: string,
+ receivedValue: string,
+) {
+ return [
+ `${matcher}\n`,
+ `${expectedLabel}:\n${context.utils.EXPECTED_COLOR(
+ redent(display(context, expectedValue), 2),
+ )}`,
+ `${receivedLabel}:\n${context.utils.RECEIVED_COLOR(
+ redent(display(context, receivedValue), 2),
+ )}`,
+ ].join("\n");
+}
+
+export { CliInstanceTypeError, checkCliInstance, getMessage };
diff --git a/packages/cli-testing-library/src/matches.ts b/packages/cli-testing-library/src/matches.ts
new file mode 100644
index 0000000..3007716
--- /dev/null
+++ b/packages/cli-testing-library/src/matches.ts
@@ -0,0 +1,160 @@
+import stripAnsiFn from "strip-ansi";
+import type { TestInstance } from "./types";
+
+export type MatcherFunction = (
+ content: string,
+ element: TestInstance | null,
+) => boolean;
+
+export type Matcher = MatcherFunction | RegExp | number | string;
+
+export type NormalizerFn = (text: string) => string;
+
+export interface NormalizerOptions extends DefaultNormalizerOptions {
+ normalizer?: NormalizerFn;
+}
+
+export interface MatcherOptions {
+ exact?: boolean;
+ /** Use normalizer with getDefaultNormalizer instead */
+ trim?: boolean;
+ /** Use normalizer with getDefaultNormalizer instead */
+ stripAnsi?: boolean;
+ /** Use normalizer with getDefaultNormalizer instead */
+ collapseWhitespace?: boolean;
+ normalizer?: NormalizerFn;
+ /** suppress suggestions for a specific query */
+ suggest?: boolean;
+}
+
+export type Match = (
+ textToMatch: string,
+ node: TestInstance | null,
+ matcher: Matcher,
+ options?: MatcherOptions,
+) => boolean;
+
+export interface DefaultNormalizerOptions {
+ trim?: boolean;
+ collapseWhitespace?: boolean;
+ stripAnsi?: boolean;
+}
+
+function assertNotNullOrUndefined(matcher: Matcher) {
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
+ if (matcher === null || matcher === undefined) {
+ throw new Error(
+ `It looks like ${matcher} was passed instead of a matcher. Did you do something like getByText(${matcher})?`,
+ );
+ }
+}
+
+/**
+ * @private
+ */
+function fuzzyMatches(
+ textToMatch: string,
+ node: TestInstance | null,
+ matcher: Matcher,
+ normalizer: NormalizerFn,
+) {
+ if (typeof textToMatch !== "string") {
+ return false;
+ }
+ assertNotNullOrUndefined(matcher);
+
+ const normalizedText = normalizer(textToMatch);
+
+ if (typeof matcher === "string" || typeof matcher === "number") {
+ return normalizedText
+ .toLowerCase()
+ .includes(matcher.toString().toLowerCase());
+ } else if (typeof matcher === "function") {
+ return matcher(normalizedText, node);
+ } else {
+ return matcher.test(normalizedText);
+ }
+}
+
+/**
+ * @private
+ */
+function matches(
+ textToMatch: string,
+ node: TestInstance | null,
+ matcher: Matcher,
+ normalizer: NormalizerFn,
+): boolean {
+ if (typeof textToMatch !== "string") {
+ return false;
+ }
+
+ assertNotNullOrUndefined(matcher);
+
+ const normalizedText = normalizer(textToMatch);
+ if (matcher instanceof Function) {
+ return matcher(normalizedText, node);
+ } else if (matcher instanceof RegExp) {
+ return matcher.test(normalizedText);
+ } else {
+ return normalizedText === String(matcher);
+ }
+}
+
+function getDefaultNormalizer({
+ trim = true,
+ collapseWhitespace = true,
+ stripAnsi = true,
+}: DefaultNormalizerOptions = {}): NormalizerFn {
+ return (text: string) => {
+ let normalizedText = text;
+ normalizedText = trim ? normalizedText.trim() : normalizedText;
+ normalizedText = collapseWhitespace
+ ? normalizedText.replace(/\s+/g, " ")
+ : normalizedText;
+ normalizedText = stripAnsi ? stripAnsiFn(normalizedText) : normalizedText;
+ return normalizedText;
+ };
+}
+
+/**
+ * @param {Object} props
+ * Constructs a normalizer to pass to functions in matches.js
+ * @param {boolean|undefined} props.trim The user-specified value for `trim`, without
+ * any defaulting having been applied
+ * @param {boolean|undefined} props.stripAnsi The user-specified value for `stripAnsi`, without
+ * any defaulting having been applied
+ * @param {boolean|undefined} props.collapseWhitespace The user-specified value for
+ * `collapseWhitespace`, without any defaulting having been applied
+ * @param {Function|undefined} props.normalizer The user-specified normalizer
+ * @returns {Function} A normalizer
+ */
+function makeNormalizer({
+ trim,
+ stripAnsi,
+ collapseWhitespace,
+ normalizer,
+}: NormalizerOptions): NormalizerFn {
+ if (normalizer) {
+ // User has specified a custom normalizer
+ if (
+ typeof trim !== "undefined" ||
+ typeof collapseWhitespace !== "undefined" ||
+ typeof stripAnsi !== "undefined"
+ ) {
+ // They've also specified a value for trim or collapseWhitespace
+ throw new Error(
+ "trim and collapseWhitespace are not supported with a normalizer. " +
+ "If you want to use the default trim and collapseWhitespace logic in your normalizer, " +
+ 'use "getDefaultNormalizer({trim, collapseWhitespace})" and compose that into your normalizer',
+ );
+ }
+
+ return normalizer;
+ } else {
+ // No custom normalizer specified. Just use default.
+ return getDefaultNormalizer({ trim, collapseWhitespace, stripAnsi });
+ }
+}
+
+export { fuzzyMatches, matches, getDefaultNormalizer, makeNormalizer };
diff --git a/src/mutation-observer.js b/packages/cli-testing-library/src/mutation-observer.ts
similarity index 58%
rename from src/mutation-observer.js
rename to packages/cli-testing-library/src/mutation-observer.ts
index 5181c80..463d934 100644
--- a/src/mutation-observer.js
+++ b/packages/cli-testing-library/src/mutation-observer.ts
@@ -1,28 +1,31 @@
// Used for `MutationObserver`. Unsure if it's really needed, but it's worth mentioning that these are not tied to
// specific CLI instances of `render`. This means that if there are e2e CLI tests that run in parallel, they will
// execute far more frequently than needed.
-const _observers = new Map()
+const _observers = new Map();
// Not perfect as a way to make "MutationObserver" unique IDs, but it should work
-let mutId = 0
+let mutId = 0;
class MutationObserver {
- constructor(cb) {
- this._id = ++mutId
- this._cb = cb
+ _cb: () => void;
+ _id: number;
+
+ constructor(cb: () => void) {
+ this._id = ++mutId;
+ this._cb = cb;
}
observe() {
- _observers.set(this._id, this._cb)
+ _observers.set(this._id, this._cb);
}
disconnect() {
- _observers.delete(this._id)
+ _observers.delete(this._id);
}
}
function _runObservers() {
- Array.from(_observers.values()).forEach(cb => cb())
+ Array.from(_observers.values()).forEach((cb) => cb());
}
-export {_runObservers, MutationObserver}
+export { _runObservers, MutationObserver };
diff --git a/packages/cli-testing-library/src/pretty-cli.ts b/packages/cli-testing-library/src/pretty-cli.ts
new file mode 100644
index 0000000..bb7d310
--- /dev/null
+++ b/packages/cli-testing-library/src/pretty-cli.ts
@@ -0,0 +1,38 @@
+import sliceAnsi from "slice-ansi";
+import { getUserCodeFrame } from "./get-user-code-frame";
+import type { TestInstance } from "./types";
+
+function prettyCLI(testInstance: TestInstance, maxLength?: number) {
+ if (typeof maxLength !== "number") {
+ maxLength =
+ (typeof process !== "undefined" &&
+ Number(process.env.DEBUG_PRINT_LIMIT)) ||
+ 7000;
+ }
+
+ if (maxLength === 0) {
+ return "";
+ }
+
+ if (!("stdoutArr" in testInstance && "stderrArr" in testInstance)) {
+ throw new TypeError(`Expected an instance but got ${testInstance}`);
+ }
+
+ const outStr = testInstance.getStdallStr();
+
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
+ return maxLength !== undefined && outStr.length > maxLength
+ ? sliceAnsi(outStr, 0, maxLength)
+ : outStr;
+}
+
+const logCLI = (...args: Parameters) => {
+ const userCodeFrame = getUserCodeFrame();
+ if (userCodeFrame) {
+ process.stdout.write(`${prettyCLI(...args)}\n\n${userCodeFrame}`);
+ } else {
+ process.stdout.write(prettyCLI(...args));
+ }
+};
+
+export { prettyCLI, logCLI };
diff --git a/packages/cli-testing-library/src/process-helpers.ts b/packages/cli-testing-library/src/process-helpers.ts
new file mode 100644
index 0000000..1342daf
--- /dev/null
+++ b/packages/cli-testing-library/src/process-helpers.ts
@@ -0,0 +1,71 @@
+import treeKill from "tree-kill";
+import { getConfig } from "./config";
+import type { TestInstance } from "./types";
+
+export const killProc = (instance: TestInstance, signal: string | undefined) =>
+ new Promise((resolve, reject) => {
+ if (!instance.process.pid || (instance.process.pid && instance.hasExit())) {
+ resolve();
+ return;
+ }
+
+ treeKill(instance.process.pid, signal, async (err) => {
+ try {
+ if (err) {
+ if (
+ err.message.includes("The process") &&
+ err.message.includes("not found.")
+ ) {
+ resolve();
+ return;
+ }
+ if (
+ err.message.includes("could not be terminated") &&
+ err.message.includes("There is no running instance of the task.") &&
+ instance.hasExit()
+ ) {
+ resolve();
+ return;
+ }
+ const isOperationNotSupported = err.message.includes(
+ "The operation attempted is not supported.",
+ );
+ const isAccessDenied = err.message.includes("Access is denied.");
+ if (
+ err.message.includes("could not be terminated") &&
+ (isOperationNotSupported || isAccessDenied)
+ ) {
+ const sleep = (t: number) => new Promise((r) => setTimeout(r, t));
+ await sleep(getConfig().errorDebounceTimeout);
+ if (instance.hasExit()) {
+ resolve();
+ return;
+ }
+ console.warn("Ran into error while trying to kill process:");
+ console.warn(err.toString());
+ console.warn(`This is likely due to Window's permissions.
+ Because this error is prevalent on CI Windows systems with the tree-kill package, we are attempting
+ an alternative kill method.`);
+ console.warn();
+ console.warn(
+ "Be aware that this alternative kill method is not guaranteed to work with subprocesses, and they may not exit properly as a result.",
+ );
+
+ const didKill = instance.process.kill(signal as "SIGKILL");
+ if (didKill) {
+ resolve();
+ } else {
+ console.error(
+ "Alternative kill method failed. Rejecting with original error.",
+ );
+ reject(err);
+ }
+ return;
+ }
+ reject(err);
+ } else resolve();
+ } catch (e: unknown) {
+ reject(e);
+ }
+ });
+ });
diff --git a/packages/cli-testing-library/src/pure.ts b/packages/cli-testing-library/src/pure.ts
new file mode 100644
index 0000000..b7959a2
--- /dev/null
+++ b/packages/cli-testing-library/src/pure.ts
@@ -0,0 +1,179 @@
+import childProcess from "node:child_process";
+import { performance } from "node:perf_hooks";
+import path from "node:path";
+import { fileURLToPath } from "node:url";
+import stripFinalNewline from "strip-final-newline";
+import { _runObservers } from "./mutation-observer";
+import { getQueriesForElement } from "./get-queries-for-instance";
+import userEvent from "./user-event/index";
+import { bindObjectFnsToInstance, setCurrentInstance } from "./helpers";
+import { fireEvent } from "./events";
+import { getConfig } from "./config";
+import { logCLI } from "./pretty-cli";
+import type { TestInstance } from "./types";
+import type * as queries from "./queries/index";
+import type { SpawnOptionsWithoutStdio } from "node:child_process";
+import type { BoundFunction } from "./get-queries-for-instance";
+
+const __curDir =
+ typeof __dirname === "undefined"
+ ? // @ts-ignore ESM requires this, but it doesn't work in Node18
+ path.dirname(fileURLToPath(import.meta.url))
+ : __dirname;
+
+export interface RenderOptions {
+ cwd: string;
+ debug: boolean;
+ spawnOpts: Omit;
+}
+
+type UserEvent = typeof userEvent;
+
+export type RenderResult = TestInstance & {
+ userEvent: {
+ [P in keyof UserEvent]: BoundFunction;
+ };
+} & { [P in keyof typeof queries]: BoundFunction<(typeof queries)[P]> };
+
+const mountedInstances = new Set();
+
+async function render(
+ command: string,
+ args: Array = [],
+ opts: Partial = {},
+): Promise {
+ const { cwd = __curDir, spawnOpts = {} } = opts;
+
+ const exec = childProcess.spawn(command, args, {
+ ...spawnOpts,
+ cwd,
+ shell: true,
+ });
+
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
+ let _readyPromiseInternals: null | { resolve: Function; reject: Function } =
+ null;
+
+ let _resolved = false;
+
+ const execOutputAPI = {
+ __exitCode: null as null | number,
+ _isOutputAPI: true,
+ _isReady: new Promise(
+ (resolve, reject) => (_readyPromiseInternals = { resolve, reject }),
+ ),
+ process: exec,
+ // Clear buffer of stdout to do more accurate `t.regex` checks
+ clear() {
+ execOutputAPI.stdoutArr = [];
+ execOutputAPI.stderrArr = [];
+ },
+ debug(maxLength?: number) {
+ logCLI(execOutputAPI, maxLength);
+ },
+ // An array of strings gathered from stdout when unable to do
+ // `await stdout` because of inquirer interactive prompts
+ stdoutArr: [] as Array<{ contents: Buffer | string; timestamp: number }>,
+ stderrArr: [] as Array<{ contents: Buffer | string; timestamp: number }>,
+ hasExit() {
+ return this.__exitCode === null ? null : { exitCode: this.__exitCode };
+ },
+ getStdallStr(): string {
+ return this.stderrArr
+ .concat(this.stdoutArr)
+ .sort((a, b) => (a.timestamp < b.timestamp ? -1 : 1))
+ .map((obj) => obj.contents)
+ .join("\n");
+ },
+ } as TestInstance & {
+ __exitCode: null | number;
+ _isOutputAPI: true;
+ _isReady: Promise;
+ };
+
+ mountedInstances.add(execOutputAPI as unknown as TestInstance);
+
+ exec.stdout.on("data", (result: string | Buffer) => {
+ // `on('spawn') doesn't work the same way in Node12.
+ // Instead, we have to rely on this working as-expected.
+ if (_readyPromiseInternals && !_resolved) {
+ _readyPromiseInternals.resolve();
+ _resolved = true;
+ }
+
+ const resStr = stripFinalNewline(result as string);
+ execOutputAPI.stdoutArr.push({
+ contents: resStr,
+ timestamp: performance.now(),
+ });
+ _runObservers();
+ });
+
+ exec.stderr.on("data", (result: string | Buffer) => {
+ if (_readyPromiseInternals && !_resolved) {
+ _readyPromiseInternals.resolve();
+ _resolved = true;
+ }
+
+ const resStr = stripFinalNewline(result as string);
+ execOutputAPI.stderrArr.push({
+ contents: resStr,
+ timestamp: performance.now(),
+ });
+ _runObservers();
+ });
+
+ exec.on("error", (result) => {
+ if (_readyPromiseInternals) {
+ _readyPromiseInternals.reject(result);
+ }
+ });
+
+ exec.on("spawn", () => {
+ setTimeout(() => {
+ if (_readyPromiseInternals && !_resolved) {
+ _readyPromiseInternals.resolve();
+ _resolved = true;
+ }
+ }, getConfig().renderAwaitTime);
+ });
+
+ exec.on("exit", (code) => {
+ execOutputAPI.__exitCode = code ?? 0;
+ });
+
+ setCurrentInstance(execOutputAPI);
+
+ await execOutputAPI._isReady;
+
+ function getStdallStr(this: Omit) {
+ return this.stderrArr
+ .concat(this.stdoutArr)
+ .sort((a, b) => (a.timestamp < b.timestamp ? -1 : 1))
+ .map((obj) => obj.contents)
+ .join("\n");
+ }
+
+ return Object.assign(
+ execOutputAPI,
+ {
+ userEvent: bindObjectFnsToInstance(execOutputAPI, userEvent as never),
+ getStdallStr: getStdallStr.bind(execOutputAPI),
+ },
+ getQueriesForElement(execOutputAPI),
+ ) as TestInstance as RenderResult;
+}
+
+function cleanup() {
+ return Promise.all(Array.from(mountedInstances).map(cleanupAtInstance));
+}
+
+// maybe one day we'll expose this (perhaps even as a utility returned by render).
+// but let's wait until someone asks for it.
+async function cleanupAtInstance(instance: TestInstance) {
+ await fireEvent.sigkill(instance);
+
+ mountedInstances.delete(instance);
+}
+
+export { render, cleanup };
diff --git a/packages/cli-testing-library/src/queries/all-utils.ts b/packages/cli-testing-library/src/queries/all-utils.ts
new file mode 100644
index 0000000..882f235
--- /dev/null
+++ b/packages/cli-testing-library/src/queries/all-utils.ts
@@ -0,0 +1,3 @@
+export * from "../matches";
+export * from "../query-helpers";
+export * from "../config";
diff --git a/packages/cli-testing-library/src/queries/error.ts b/packages/cli-testing-library/src/queries/error.ts
new file mode 100644
index 0000000..763e882
--- /dev/null
+++ b/packages/cli-testing-library/src/queries/error.ts
@@ -0,0 +1,75 @@
+import {
+ buildQueries,
+ fuzzyMatches,
+ makeNormalizer,
+ matches,
+} from "./all-utils";
+import type {
+ GetErrorFunction,
+ Matcher,
+ SelectorMatcherOptions,
+} from "./all-utils";
+import type { TestInstance } from "../types";
+import type { waitForOptions } from "../wait-for";
+
+export type QueryByError = (
+ instance: TestInstance,
+ id: Matcher,
+ options?: SelectorMatcherOptions,
+) => T | null;
+
+export type GetByError = (
+ instance: TestInstance,
+ id: Matcher,
+ options?: SelectorMatcherOptions,
+) => T;
+
+export type FindByError = (
+ instance: TestInstance,
+ id: Matcher,
+ options?: SelectorMatcherOptions,
+ waitForElementOptions?: waitForOptions,
+) => Promise;
+
+const queryByErrorBase: QueryByError = (
+ instance,
+ text,
+ { exact = false, collapseWhitespace, trim, normalizer, stripAnsi } = {},
+) => {
+ const matcher = exact ? matches : fuzzyMatches;
+ const matchNormalizer = makeNormalizer({
+ stripAnsi,
+ collapseWhitespace,
+ trim,
+ normalizer,
+ });
+ const str = instance.stderrArr.map((obj) => obj.contents).join("\n");
+ if (matcher(str, instance, text, matchNormalizer)) return instance;
+ else return null;
+};
+
+const getMissingError: GetErrorFunction<[unknown]> = (_c, text) =>
+ `Unable to find an stdout line with the text: ${text}. This could be because the text is broken up by multiple lines. In this case, you can provide a function for your text matcher to make your matcher more flexible.`;
+
+const [_queryByErrorWithSuggestions, _getByError, _findByError] = buildQueries(
+ queryByErrorBase,
+ getMissingError,
+);
+
+export function getByError(
+ ...args: Parameters>
+): ReturnType> {
+ return _getByError(...args);
+}
+
+export function queryByError(
+ ...args: Parameters>
+): ReturnType> {
+ return _queryByErrorWithSuggestions(...args);
+}
+
+export function findByError(
+ ...args: Parameters>
+): ReturnType> {
+ return _findByError(...args);
+}
diff --git a/packages/cli-testing-library/src/queries/index.ts b/packages/cli-testing-library/src/queries/index.ts
new file mode 100644
index 0000000..7df0510
--- /dev/null
+++ b/packages/cli-testing-library/src/queries/index.ts
@@ -0,0 +1,2 @@
+export * from "./text";
+export * from "./error";
diff --git a/packages/cli-testing-library/src/queries/text.ts b/packages/cli-testing-library/src/queries/text.ts
new file mode 100644
index 0000000..56e25f3
--- /dev/null
+++ b/packages/cli-testing-library/src/queries/text.ts
@@ -0,0 +1,73 @@
+import {
+ buildQueries,
+ fuzzyMatches,
+ makeNormalizer,
+ matches,
+} from "./all-utils";
+import type { TestInstance } from "../types";
+import type {
+ GetErrorFunction,
+ Matcher,
+ SelectorMatcherOptions,
+} from "./all-utils";
+import type { waitForOptions } from "../wait-for";
+
+export type QueryByText = (
+ instance: TestInstance,
+ id: Matcher,
+ options?: SelectorMatcherOptions,
+) => T | null;
+
+export type GetByText = (
+ instance: TestInstance,
+ id: Matcher,
+ options?: SelectorMatcherOptions,
+) => T;
+
+export type FindByText = (
+ instance: TestInstance,
+ id: Matcher,
+ options?: SelectorMatcherOptions,
+ waitForElementOptions?: waitForOptions,
+) => Promise;
+
+const queryByTextBase: QueryByText = (
+ instance,
+ text,
+ { exact = false, collapseWhitespace, trim, normalizer, stripAnsi } = {},
+) => {
+ const matcher = exact ? matches : fuzzyMatches;
+ const matchNormalizer = makeNormalizer({
+ stripAnsi,
+ collapseWhitespace,
+ trim,
+ normalizer,
+ });
+ const str = instance.stdoutArr.map((output) => output.contents).join("\n");
+ if (matcher(str, instance, text, matchNormalizer)) return instance;
+ else return null;
+};
+
+const getMissingError: GetErrorFunction<[unknown]> = (_c, text) =>
+ `Unable to find an stdout line with the text: ${text}. This could be because the text is broken up by multiple lines. In this case, you can provide a function for your text matcher to make your matcher more flexible.`;
+
+const [_queryByTextWithSuggestions, _getByText, _findByText] = buildQueries(
+ queryByTextBase,
+ getMissingError,
+);
+
+export function getByText(
+ ...args: Parameters>
+): ReturnType> {
+ return _getByText(...args);
+}
+export function queryByText(
+ ...args: Parameters>
+): ReturnType> {
+ return _queryByTextWithSuggestions(...args);
+}
+export function findByText(
+ ...args: Parameters>
+): ReturnType> {
+ return _findByText(...args);
+}
diff --git a/packages/cli-testing-library/src/query-helpers.ts b/packages/cli-testing-library/src/query-helpers.ts
new file mode 100644
index 0000000..b7faa13
--- /dev/null
+++ b/packages/cli-testing-library/src/query-helpers.ts
@@ -0,0 +1,150 @@
+import { getSuggestedQuery } from "./suggestions";
+import { waitFor } from "./wait-for";
+import { getConfig } from "./config";
+import type { waitForOptions as WaitForOptions } from "./wait-for";
+import type { Variant } from "./suggestions";
+import type { TestInstance } from "./types";
+import type { Matcher, MatcherOptions } from "./matches";
+
+export type WithSuggest = { suggest?: boolean };
+
+export type GetErrorFunction = [string]> = (
+ c: TestInstance | null,
+ ...args: TArguments
+) => string;
+
+export interface SelectorMatcherOptions extends MatcherOptions {
+ selector?: string;
+ ignore?: boolean | string;
+}
+
+export type QueryMethod, TReturn> = (
+ container: TestInstance,
+ ...args: TArguments
+) => TReturn;
+
+function getInstanceError(message: string | null, instance: TestInstance) {
+ return getConfig().getInstanceError(message, instance);
+}
+
+function getSuggestionError(
+ suggestion: { toString: () => string },
+ container: TestInstance,
+) {
+ return getConfig().getInstanceError(
+ `A better query is available, try this:
+${suggestion.toString()}
+`,
+ container,
+ );
+}
+
+// this accepts a query function and returns a function which throws an error
+// if an empty list of elements is returned
+function makeGetQuery>(
+ queryBy: (instance: TestInstance, ...args: TArguments) => TestInstance | null,
+ getMissingError: GetErrorFunction,
+) {
+ return (
+ instance: TestInstance,
+ ...args: TArguments
+ ): T => {
+ const el = queryBy(instance, ...args);
+ if (!el) {
+ throw getConfig().getInstanceError(
+ getMissingError(instance, ...args),
+ instance,
+ );
+ }
+
+ return el as T;
+ };
+}
+
+// this accepts a getter query function and returns a function which calls
+// waitFor and passing a function which invokes the getter.
+function makeFindQuery(
+ getter: (
+ container: TestInstance,
+ text: Matcher,
+ options?: MatcherOptions,
+ ) => TQueryFor,
+) {
+ return (
+ instance: TestInstance,
+ text: Matcher,
+ options?: MatcherOptions,
+ waitForOptions?: WaitForOptions,
+ ): Promise => {
+ return waitFor(
+ () => {
+ return getter(instance, text, options) as unknown as T;
+ },
+ { instance, ...waitForOptions },
+ );
+ };
+}
+
+const wrapSingleQueryWithSuggestion =
+ >(
+ query: (
+ container: TestInstance,
+ ...args: TArguments
+ ) => TestInstance | null,
+ queryByName: string,
+ variant: Variant,
+ ) =>
+ (
+ container: TestInstance,
+ ...args: TArguments
+ ): T => {
+ const instance = query(container, ...args);
+ const [{ suggest = getConfig().throwSuggestions } = {}] = args.slice(
+ -1,
+ ) as [WithSuggest];
+ if (instance && suggest) {
+ const suggestion = getSuggestedQuery(instance, variant);
+ if (suggestion && !queryByName.endsWith(suggestion.queryName)) {
+ throw getSuggestionError(suggestion.toString(), container);
+ }
+ }
+
+ return instance as T;
+ };
+
+function buildQueries(
+ queryBy: QueryMethod<
+ [matcher: Matcher, options?: MatcherOptions],
+ TestInstance | null
+ >,
+ getMissingError: GetErrorFunction<
+ [matcher: Matcher, options?: MatcherOptions]
+ >,
+) {
+ const getBy = makeGetQuery(queryBy, getMissingError);
+
+ const queryByWithSuggestions = wrapSingleQueryWithSuggestion(
+ queryBy,
+ queryBy.name,
+ "get",
+ );
+
+ const getByWithSuggestions = wrapSingleQueryWithSuggestion(
+ getBy,
+ queryBy.name,
+ "get",
+ );
+
+ const findBy = makeFindQuery(
+ wrapSingleQueryWithSuggestion(getBy, queryBy.name, "find"),
+ );
+
+ return [queryByWithSuggestions, getByWithSuggestions, findBy] as const;
+}
+
+export {
+ getInstanceError,
+ wrapSingleQueryWithSuggestion,
+ makeFindQuery,
+ buildQueries,
+};
diff --git a/packages/cli-testing-library/src/suggestions.ts b/packages/cli-testing-library/src/suggestions.ts
new file mode 100644
index 0000000..1ac20d0
--- /dev/null
+++ b/packages/cli-testing-library/src/suggestions.ts
@@ -0,0 +1,111 @@
+import { getDefaultNormalizer } from "./matches";
+import type { TestInstance } from "./types";
+
+export interface QueryOptions {
+ [key: string]: RegExp | boolean;
+}
+
+export type QueryArgs = [string, QueryOptions?];
+
+export interface Suggestion {
+ queryName: string;
+ queryMethod: string;
+ queryArgs: QueryArgs;
+ variant: string;
+ warning?: string;
+ toString: () => string;
+}
+
+export type Variant = "find" | "get" | "query";
+
+export type Method = "Text" | "text";
+
+const normalize = getDefaultNormalizer();
+
+function escapeRegExp(string: string) {
+ return string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string
+}
+
+function getRegExpMatcher(string: string) {
+ return new RegExp(escapeRegExp(string.toLowerCase()), "i");
+}
+
+function makeSuggestion(
+ queryName: string,
+ _instance: TestInstance,
+ content: string,
+ {
+ variant,
+ name,
+ }: {
+ variant: Variant;
+ name?: string;
+ },
+): Suggestion | undefined {
+ const warning = "" as string;
+ const queryOptions = {} as QueryOptions;
+ const queryArgs = [
+ [].includes(queryName as never) ? content : getRegExpMatcher(content),
+ ] as QueryArgs;
+
+ if (name) {
+ queryOptions.name = getRegExpMatcher(name);
+ }
+
+ if (Object.keys(queryOptions).length > 0) {
+ queryArgs.push(queryOptions);
+ }
+
+ const queryMethod = `${variant}By${queryName}`;
+
+ return {
+ queryName,
+ queryMethod,
+ queryArgs,
+ variant,
+ warning,
+ toString() {
+ if (warning) {
+ console.warn(warning);
+ }
+ const [text, options] = queryArgs;
+
+ const newText = typeof text === "string" ? `'${text}'` : text;
+
+ const newOptions = options
+ ? `, { ${Object.entries(options)
+ .map(([k, v]) => `${k}: ${v}`)
+ .join(", ")} }`
+ : "";
+
+ return `${queryMethod}(${newText}${newOptions})`;
+ },
+ };
+}
+
+function canSuggest(
+ currentMethod: Method,
+ requestedMethod: Method | undefined,
+ data: unknown,
+) {
+ return (
+ data &&
+ (!requestedMethod ||
+ requestedMethod.toLowerCase() === currentMethod.toLowerCase())
+ );
+}
+
+export function getSuggestedQuery(
+ instance: TestInstance,
+ variant: Variant = "get",
+ method?: Method,
+): Suggestion | undefined {
+ const textContent = normalize(
+ instance.stdoutArr.map((obj) => obj.contents).join("\n"),
+ );
+ if (canSuggest("Text", method, textContent)) {
+ return makeSuggestion("Text", instance, textContent, { variant });
+ }
+
+ return undefined;
+}
diff --git a/packages/cli-testing-library/src/types.ts b/packages/cli-testing-library/src/types.ts
new file mode 100644
index 0000000..4e21951
--- /dev/null
+++ b/packages/cli-testing-library/src/types.ts
@@ -0,0 +1,19 @@
+import type { ChildProcessWithoutNullStreams } from "node:child_process";
+
+export interface TestInstance {
+ clear: () => void;
+ process: ChildProcessWithoutNullStreams;
+ stdoutArr: Array<{ contents: Buffer | string; timestamp: number }>;
+ stderrArr: Array<{ contents: Buffer | string; timestamp: number }>;
+ getStdallStr: () => string;
+ hasExit: () => null | { exitCode: number };
+ debug: (maxLength?: number) => void;
+}
+
+declare global {
+ const jest: undefined | any;
+ const vi: undefined | any;
+ const afterEach: undefined | ((fn: () => void) => void);
+ const teardown: undefined | ((fn: () => void) => void);
+ const expect: undefined | any;
+}
diff --git a/packages/cli-testing-library/src/user-event/index.ts b/packages/cli-testing-library/src/user-event/index.ts
new file mode 100644
index 0000000..1604b15
--- /dev/null
+++ b/packages/cli-testing-library/src/user-event/index.ts
@@ -0,0 +1,9 @@
+import { keyboard } from "./keyboard/index";
+
+const userEvent = {
+ keyboard,
+};
+
+export default userEvent;
+
+export type { keyboardKey } from "./keyboard/index";
diff --git a/src/user-event/keyboard/getNextKeyDef.ts b/packages/cli-testing-library/src/user-event/keyboard/getNextKeyDef.ts
similarity index 59%
rename from src/user-event/keyboard/getNextKeyDef.ts
rename to packages/cli-testing-library/src/user-event/keyboard/getNextKeyDef.ts
index 5afc61b..298a210 100644
--- a/src/user-event/keyboard/getNextKeyDef.ts
+++ b/packages/cli-testing-library/src/user-event/keyboard/getNextKeyDef.ts
@@ -1,7 +1,7 @@
-import {keyboardKey, keyboardOptions} from './types'
+import type { keyboardKey, keyboardOptions } from "./types";
enum bracketDict {
- '[' = ']',
+ "[" = "]",
}
/**
@@ -15,56 +15,56 @@ export function getNextKeyDef(
text: string,
options: keyboardOptions,
): {
- keyDef: keyboardKey
- consumedLength: number
+ keyDef: keyboardKey;
+ consumedLength: number;
} {
- const {type, descriptor, consumedLength} = readNextDescriptor(text)
+ const { type, descriptor, consumedLength } = readNextDescriptor(text);
- const keyDef: keyboardKey = options.keyboardMap.find(def => {
- if (type === '[') {
- return def.code?.toLowerCase() === descriptor.toLowerCase()
+ const keyDef: keyboardKey = options.keyboardMap.find((def) => {
+ if (type === "[") {
+ return def.code?.toLowerCase() === descriptor.toLowerCase();
}
- return def.hex === descriptor
+ return def.hex === descriptor;
}) ?? {
code: descriptor,
- hex: 'Unknown',
- }
+ hex: "Unknown",
+ };
return {
keyDef,
consumedLength,
- }
+ };
}
function readNextDescriptor(text: string) {
- let pos = 0
+ let pos = 0;
const startBracket =
- text[pos] in bracketDict ? (text[pos] as keyof typeof bracketDict) : ''
+ text[pos]! in bracketDict ? (text[pos] as keyof typeof bracketDict) : "";
- pos += startBracket.length
+ pos += startBracket.length;
// `foo[[bar` is an escaped char at position 3,
// but `foo[[[>5}bar` should be treated as `{` pressed down for 5 keydowns.
const startBracketRepeated = startBracket
? (text.match(new RegExp(`^\\${startBracket}+`)) as RegExpMatchArray)[0]
.length
- : 0
- const isEscapedChar = startBracketRepeated === 2
+ : 0;
+ const isEscapedChar = startBracketRepeated === 2;
- const type = isEscapedChar ? '' : startBracket
+ const type = isEscapedChar ? "" : startBracket;
return {
type,
- ...(type === '' ? readPrintableChar(text, pos) : readTag(text, pos, type)),
- }
+ ...(type === "" ? readPrintableChar(text, pos) : readTag(text, pos, type)),
+ };
}
function readPrintableChar(text: string, pos: number) {
- const descriptor = text[pos]
+ const descriptor = text[pos];
- assertDescriptor(descriptor, text, pos)
+ assertDescriptor(descriptor, text, pos);
- pos += descriptor.length
+ pos += descriptor.length;
return {
consumedLength: pos,
@@ -72,7 +72,7 @@ function readPrintableChar(text: string, pos: number) {
releasePrevious: false,
releaseSelf: true,
repeat: 1,
- }
+ };
}
function readTag(
@@ -80,25 +80,27 @@ function readTag(
pos: number,
startBracket: keyof typeof bracketDict,
) {
- const descriptor = text.slice(pos).match(/^\w+/)?.[0]
+ const descriptor = text.slice(pos).match(/^\w+/)?.[0];
- assertDescriptor(descriptor, text, pos)
+ assertDescriptor(descriptor, text, pos);
- pos += descriptor.length
+ pos += descriptor.length;
- const expectedEndBracket = bracketDict[startBracket]
- const endBracket = text[pos] === expectedEndBracket ? expectedEndBracket : ''
+ const expectedEndBracket = bracketDict[startBracket];
+ const endBracket = text[pos] === expectedEndBracket ? expectedEndBracket : "";
if (!endBracket) {
- throw new Error(getErrorMessage(`"${expectedEndBracket}"`, text[pos], text))
+ throw new Error(
+ getErrorMessage(`"${expectedEndBracket}"`, text[pos], text),
+ );
}
- pos += endBracket.length
+ pos += endBracket.length;
return {
consumedLength: pos,
descriptor,
- }
+ };
}
function assertDescriptor(
@@ -107,7 +109,7 @@ function assertDescriptor(
pos: number,
): asserts descriptor is string {
if (!descriptor) {
- throw new Error(getErrorMessage('key descriptor', text[pos], text))
+ throw new Error(getErrorMessage("key descriptor", text[pos], text));
}
}
@@ -116,7 +118,7 @@ function getErrorMessage(
found: string | undefined,
text: string,
) {
- return `Expected ${expected} but found "${found ?? ''}" in "${text}"
+ return `Expected ${expected} but found "${found ?? ""}" in "${text}"
See https://github.com/testing-library/user-event/blob/main/README.md#keyboardtext-options
- for more information about how userEvent parses your input.`
+ for more information about how userEvent parses your input.`;
}
diff --git a/packages/cli-testing-library/src/user-event/keyboard/index.ts b/packages/cli-testing-library/src/user-event/keyboard/index.ts
new file mode 100644
index 0000000..3ac9e2b
--- /dev/null
+++ b/packages/cli-testing-library/src/user-event/keyboard/index.ts
@@ -0,0 +1,39 @@
+import { keyboardImplementation } from "./keyboardImplementation";
+import { defaultKeyMap } from "./keyMap";
+import type { TestInstance } from "../../types";
+import type { keyboardKey, keyboardOptions } from "./types";
+
+export type { keyboardOptions, keyboardKey };
+
+export function keyboard(
+ instance: TestInstance,
+ text: string,
+ options?: Partial,
+): void | Promise {
+ const { promise } = keyboardImplementationWrapper(instance, text, options);
+
+ if ((options?.delay ?? 0) > 0) {
+ return promise;
+ } else {
+ // prevent users from dealing with UnhandledPromiseRejectionWarning in sync call
+ promise.catch(console.error);
+ }
+}
+
+export function keyboardImplementationWrapper(
+ instance: TestInstance,
+ text: string,
+ config: Partial = {},
+): {
+ promise: Promise;
+} {
+ const { delay = 0, keyboardMap = defaultKeyMap } = config;
+ const options = {
+ delay,
+ keyboardMap,
+ };
+
+ return {
+ promise: keyboardImplementation(instance, text, options),
+ };
+}
diff --git a/packages/cli-testing-library/src/user-event/keyboard/keyMap.ts b/packages/cli-testing-library/src/user-event/keyboard/keyMap.ts
new file mode 100644
index 0000000..8da3112
--- /dev/null
+++ b/packages/cli-testing-library/src/user-event/keyboard/keyMap.ts
@@ -0,0 +1,114 @@
+import type { keyboardKey } from "./types";
+
+/**
+ * Mapping for a default US-104-QWERTY keyboard
+ *
+ * These use ANSI-C quoting, which seems to work for Linux, macOS, and Windows alike
+ * @see https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#ANSI_002dC-Quoting
+ * @see https://stackoverflow.com/questions/35429671/detecting-key-press-within-bash-scripts
+ * @see https://gist.github.com/crutchcorn/2811db78a7b924cf54f4507198427fd2
+ */
+export const defaultKeyMap: Array = [
+ // alphanumeric keys
+ { code: "Digit!", hex: "\x21" },
+ { code: "Digit#", hex: "\x23" },
+ { code: "Digit$", hex: "\x24" },
+ { code: "Digit%", hex: "\x25" },
+ { code: "Digit&", hex: "\x26" },
+ { code: "Digit(", hex: "\x29" },
+ { code: "Digit)", hex: "\x29" },
+ { code: "Digit*", hex: "\x2a" },
+ { code: "Digit-", hex: "\x2d" },
+ { code: "Digit@", hex: "\x40" },
+ { code: "Digit^", hex: "\x5e" },
+ { code: "Digit{", hex: "\x7b" },
+ { code: "Digit|", hex: "\x7c" },
+ { code: "Digit}", hex: "\x7d" },
+ { code: "Digit~", hex: "\x7e" },
+ { code: "Digit0", hex: "\x30" },
+ { code: "Digit1", hex: "\x31" },
+ { code: "Digit2", hex: "\x32" },
+ { code: "Digit3", hex: "\x33" },
+ { code: "Digit4", hex: "\x34" },
+ { code: "Digit5", hex: "\x35" },
+ { code: "Digit6", hex: "\x36" },
+ { code: "Digit7", hex: "\x37" },
+ { code: "Digit8", hex: "\x38" },
+ { code: "Digit9", hex: "\x39" },
+ { code: "KeyA", hex: "\x41" },
+ { code: "KeyB", hex: "\x42" },
+ { code: "KeyC", hex: "\x43" },
+ { code: "KeyD", hex: "\x44" },
+ { code: "KeyE", hex: "\x45" },
+ { code: "KeyF", hex: "\x46" },
+ { code: "KeyG", hex: "\x47" },
+ { code: "KeyH", hex: "\x48" },
+ { code: "KeyI", hex: "\x49" },
+ { code: "KeyJ", hex: "\x4a" },
+ { code: "KeyK", hex: "\x4b" },
+ { code: "KeyL", hex: "\x4c" },
+ { code: "KeyM", hex: "\x4d" },
+ { code: "KeyN", hex: "\x4e" },
+ { code: "KeyO", hex: "\x4f" },
+ { code: "KeyP", hex: "\x50" },
+ { code: "KeyQ", hex: "\x51" },
+ { code: "KeyR", hex: "\x52" },
+ { code: "KeyS", hex: "\x53" },
+ { code: "KeyT", hex: "\x54" },
+ { code: "KeyU", hex: "\x55" },
+ { code: "KeyV", hex: "\x56" },
+ { code: "KeyW", hex: "\x57" },
+ { code: "KeyX", hex: "\x58" },
+ { code: "KeyY", hex: "\x59" },
+ { code: "KeyZ", hex: "\x5a" },
+ { code: "Digit_", hex: "\x5f" },
+ { code: "KeyLowerA", hex: "\x61" },
+ { code: "KeyLowerB", hex: "\x62" },
+ { code: "KeyLowerC", hex: "\x63" },
+ { code: "KeyLowerD", hex: "\x64" },
+ { code: "KeyLowerE", hex: "\x65" },
+ { code: "KeyLowerF", hex: "\x66" },
+ { code: "KeyLowerG", hex: "\x67" },
+ { code: "KeyLowerH", hex: "\x68" },
+ { code: "KeyLowerI", hex: "\x69" },
+ { code: "KeyLowerJ", hex: "\x6a" },
+ { code: "KeyLowerK", hex: "\x6b" },
+ { code: "KeyLowerL", hex: "\x6c" },
+ { code: "KeyLowerM", hex: "\x6d" },
+ { code: "KeyLowerN", hex: "\x6e" },
+ { code: "KeyLowerO", hex: "\x6f" },
+ { code: "KeyLowerP", hex: "\x70" },
+ { code: "KeyLowerQ", hex: "\x71" },
+ { code: "KeyLowerR", hex: "\x72" },
+ { code: "KeyLowerS", hex: "\x73" },
+ { code: "KeyLowerT", hex: "\x74" },
+ { code: "KeyLowerU", hex: "\x75" },
+ { code: "KeyLowerV", hex: "\x76" },
+ { code: "KeyLowerW", hex: "\x77" },
+ { code: "KeyLowerX", hex: "\x78" },
+ { code: "KeyLowerY", hex: "\x79" },
+ { code: "KeyLowerZ", hex: "\x7a" },
+
+ // alphanumeric block - functional
+ { code: "Space", hex: "\x20" },
+ { code: "Backspace", hex: "\x08" },
+ { code: "Enter", hex: "\x0D" },
+
+ // function
+ { code: "Escape", hex: "\x1b" },
+
+ // arrows
+ { code: "ArrowUp", hex: "\x1b\x5b\x41" },
+ { code: "ArrowDown", hex: "\x1B\x5B\x42" },
+ { code: "ArrowLeft", hex: "\x1b\x5b\x44" },
+ { code: "ArrowRight", hex: "\x1b\x5b\x43" },
+
+ // control pad
+ { code: "Home", hex: "\x1b\x4f\x48" },
+ { code: "End", hex: "\x1b\x4f\x46" },
+ { code: "Delete", hex: "\x1b\x5b\x33\x7e" },
+ { code: "PageUp", hex: "\x1b\x5b\x35\x7e" },
+ { code: "PageDown", hex: "\x1b\x5b\x36\x7e" },
+
+ // TODO: add mappings
+];
diff --git a/packages/cli-testing-library/src/user-event/keyboard/keyboardImplementation.ts b/packages/cli-testing-library/src/user-event/keyboard/keyboardImplementation.ts
new file mode 100644
index 0000000..0666a07
--- /dev/null
+++ b/packages/cli-testing-library/src/user-event/keyboard/keyboardImplementation.ts
@@ -0,0 +1,32 @@
+import { fireEvent } from "../../events";
+import { wait } from "../utils";
+import { getNextKeyDef } from "./getNextKeyDef";
+import type { TestInstance } from "../../types";
+import type { keyboardKey, keyboardOptions } from "./types";
+
+export async function keyboardImplementation(
+ instance: TestInstance,
+ text: string,
+ options: keyboardOptions,
+): Promise {
+ const { keyDef, consumedLength } = getNextKeyDef(text, options);
+
+ keypress(keyDef, instance);
+
+ if (text.length > consumedLength) {
+ if (options.delay > 0) {
+ await wait(options.delay);
+ }
+
+ return keyboardImplementation(
+ instance,
+ text.slice(consumedLength),
+ options,
+ );
+ }
+ return void undefined;
+}
+
+function keypress(keyDef: keyboardKey, instance: TestInstance) {
+ fireEvent.write(instance, { value: keyDef.hex! });
+}
diff --git a/src/user-event/keyboard/types.ts b/packages/cli-testing-library/src/user-event/keyboard/types.ts
similarity index 71%
rename from src/user-event/keyboard/types.ts
rename to packages/cli-testing-library/src/user-event/keyboard/types.ts
index 0ffa27f..c97ca87 100644
--- a/src/user-event/keyboard/types.ts
+++ b/packages/cli-testing-library/src/user-event/keyboard/types.ts
@@ -1,13 +1,13 @@
export type keyboardOptions = {
/** Delay between keystrokes */
- delay: number
+ delay: number;
/** Keyboard layout to use */
- keyboardMap: keyboardKey[]
-}
+ keyboardMap: Array;
+};
export interface keyboardKey {
/** Physical location on a keyboard */
- code?: string
+ code?: string;
/** Character or functional key hex code */
- hex?: string
+ hex?: string;
}
diff --git a/packages/cli-testing-library/src/user-event/utils.ts b/packages/cli-testing-library/src/user-event/utils.ts
new file mode 100644
index 0000000..e5d6d0a
--- /dev/null
+++ b/packages/cli-testing-library/src/user-event/utils.ts
@@ -0,0 +1,3 @@
+export function wait(time?: number) {
+ return new Promise((resolve) => setTimeout(() => resolve(), time));
+}
diff --git a/packages/cli-testing-library/src/vitest.ts b/packages/cli-testing-library/src/vitest.ts
new file mode 100644
index 0000000..6ca84f8
--- /dev/null
+++ b/packages/cli-testing-library/src/vitest.ts
@@ -0,0 +1,14 @@
+/* istanbul ignore file */
+
+import { expect } from "vitest";
+import * as extensions from "./matchers/index";
+import type { CLITestingLibraryMatchers } from "./matchers/types";
+
+expect.extend(extensions);
+
+declare module "vitest" {
+ interface Assertion extends CLITestingLibraryMatchers {}
+
+ interface AsymmetricMatchersContaining
+ extends CLITestingLibraryMatchers {}
+}
diff --git a/src/wait-for.js b/packages/cli-testing-library/src/wait-for.ts
similarity index 50%
rename from src/wait-for.js
rename to packages/cli-testing-library/src/wait-for.ts
index 6ee9d11..4f42e98 100644
--- a/src/wait-for.js
+++ b/packages/cli-testing-library/src/wait-for.ts
@@ -1,60 +1,79 @@
// Migrated from: https://github.com/testing-library/dom-testing-library/blob/main/src/wait-for.js
// TODO: Migrate back to use `config.js` file
-import {getCurrentInstance, jestFakeTimersAreEnabled} from './helpers'
-import {MutationObserver} from './mutation-observer'
-import {getConfig} from './config'
+import { getCurrentInstance, jestFakeTimersAreEnabled } from "./helpers";
+import { MutationObserver } from "./mutation-observer";
+import { getConfig } from "./config";
+import type { TestInstance } from "./types";
// This is so the stack trace the developer sees is one that's
// closer to their code (because async stack traces are hard to follow).
-function copyStackTrace(target, source) {
- target.stack = source.stack.replace(source.message, target.message)
+function copyStackTrace(target: Error, source: Error) {
+ target.stack = source.stack!.replace(source.message, target.message);
}
-function waitFor(
- callback,
+export interface waitForOptions {
+ instance?: TestInstance;
+ showOriginalStackTrace?: boolean;
+ timeout?: number;
+ interval?: number;
+ onTimeout?: (error: Error) => Error;
+ stackTraceError?: Error;
+}
+
+function waitFor(
+ callback: () => Promise | T,
{
instance = getCurrentInstance(),
timeout = getConfig().asyncUtilTimeout,
showOriginalStackTrace = getConfig().showOriginalStackTrace,
stackTraceError,
interval = 50,
- onTimeout = error => {
+ onTimeout = (error) => {
error.message = getConfig().getInstanceError(
error.message,
- instance,
- ).message
- return error
+ instance!,
+ ).message;
+ return error;
},
+ }: Omit & {
+ stackTraceError: Error;
+ } = {
+ stackTraceError: new Error("STACK_TRACE_MESSAGE"),
},
-) {
- if (typeof callback !== 'function') {
- throw new TypeError('Received `callback` arg must be a function')
+): Promise {
+ if (typeof callback !== "function") {
+ throw new TypeError("Received `callback` arg must be a function");
}
+ // eslint-disable-next-line no-async-promise-executor
return new Promise(async (resolve, reject) => {
- let lastError, intervalId, observer
- let finished = false
- let promiseStatus = 'idle'
+ let lastError: Error | null = null;
+ let intervalId!: NodeJS.Timeout;
+ let observer: MutationObserver;
+ let finished = false;
+ let promiseStatus = "idle";
- const overallTimeoutTimer = setTimeout(handleTimeout, timeout)
+ const overallTimeoutTimer = setTimeout(handleTimeout, timeout);
- const usingJestFakeTimers = jestFakeTimersAreEnabled()
+ const usingJestFakeTimers = jestFakeTimersAreEnabled();
if (usingJestFakeTimers) {
- const {unstable_advanceTimersWrapper: advanceTimersWrapper} = getConfig()
- checkCallback()
+ const { unstable_advanceTimersWrapper: advanceTimersWrapper } =
+ getConfig();
+ checkCallback();
// this is a dangerous rule to disable because it could lead to an
// infinite loop. However, eslint isn't smart enough to know that we're
// setting finished inside `onDone` which will be called when we're done
// waiting or when we've timed out.
- // eslint-disable-next-line no-unmodified-loop-condition
+
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
while (!finished) {
if (!jestFakeTimersAreEnabled()) {
const error = new Error(
`Changed from using fake timers to real timers while using waitFor. This is not allowed and will result in very strange behavior. Please ensure you're awaiting all async things your test is doing before changing to real timers. For more info, please go to https://github.com/testing-library/dom-testing-library/issues/830`,
- )
- if (!showOriginalStackTrace) copyStackTrace(error, stackTraceError)
- reject(error)
- return
+ );
+ if (!showOriginalStackTrace) copyStackTrace(error, stackTraceError);
+ reject(error);
+ return;
}
// we *could* (maybe should?) use `advanceTimersToNextTimer` but it's
// possible that could make this loop go on forever if someone is using
@@ -62,47 +81,54 @@ function waitFor(
// the user's timer's don't get a chance to resolve. So we'll advance
// by an interval instead. (We have a test for this case).
advanceTimersWrapper(() => {
- jest.advanceTimersByTime(interval)
- })
+ if (typeof jest !== "undefined") {
+ jest.advanceTimersByTime(interval);
+ } else if (typeof vi !== "undefined") {
+ vi.advanceTimersByTime(interval);
+ }
+ });
// It's really important that checkCallback is run *before* we flush
// in-flight promises. To be honest, I'm not sure why, and I can't quite
// think of a way to reproduce the problem in a test, but I spent
// an entire day banging my head against a wall on this.
- checkCallback()
+ checkCallback();
// In this rare case, we *need* to wait for in-flight promises
// to resolve before continuing. We don't need to take advantage
// of parallelization so we're fine.
// https://stackoverflow.com/a/59243586/971592
- // eslint-disable-next-line no-await-in-loop
+
await advanceTimersWrapper(async () => {
- await new Promise(r => {
- setTimeout(r, 0)
- jest.advanceTimersByTime(0)
- })
- })
+ await new Promise((r) => {
+ setTimeout(r, 0);
+ if (typeof jest !== "undefined") jest.advanceTimersByTime(0);
+ else if (typeof vi !== "undefined") vi.advanceTimersByTime(0);
+ });
+ });
}
} else {
- intervalId = setInterval(checkRealTimersCallback, interval)
- observer = new MutationObserver(checkRealTimersCallback)
- observer.observe()
- checkCallback()
+ intervalId = setInterval(checkRealTimersCallback, interval);
+ observer = new MutationObserver(checkRealTimersCallback);
+ observer.observe();
+ checkCallback();
}
- function onDone(error, result) {
- finished = true
- clearTimeout(overallTimeoutTimer)
+ function onDone(error: null, result: T): void;
+ function onDone(error: Error, result: null): void;
+ function onDone(error: Error | null, result: T | null) {
+ finished = true;
+ clearTimeout(overallTimeoutTimer);
if (!usingJestFakeTimers) {
- clearInterval(intervalId)
- observer.disconnect()
+ clearInterval(intervalId);
+ observer.disconnect();
}
if (error) {
- reject(error)
+ reject(error);
} else {
- resolve(result)
+ resolve(result!);
}
}
@@ -110,71 +136,71 @@ function waitFor(
if (jestFakeTimersAreEnabled()) {
const error = new Error(
`Changed from using real timers to fake timers while using waitFor. This is not allowed and will result in very strange behavior. Please ensure you're awaiting all async things your test is doing before changing to fake timers. For more info, please go to https://github.com/testing-library/dom-testing-library/issues/830`,
- )
- if (!showOriginalStackTrace) copyStackTrace(error, stackTraceError)
- return reject(error)
+ );
+ if (!showOriginalStackTrace) copyStackTrace(error, stackTraceError);
+ return reject(error);
} else {
- return checkCallback()
+ return checkCallback();
}
}
function checkCallback() {
- if (promiseStatus === 'pending') return
+ if (promiseStatus === "pending") return;
try {
- const result = callback() // runWithExpensiveErrorDiagnosticsDisabled(callback)
- if (typeof (result && result.then) === 'function') {
- promiseStatus = 'pending'
+ const result = callback(); // runWithExpensiveErrorDiagnosticsDisabled(callback)
+ const isPromise = (r: unknown): r is Promise =>
+ !!r && typeof (r as Promise).then === "function";
+ if (isPromise(result)) {
+ promiseStatus = "pending";
result.then(
- resolvedValue => {
- promiseStatus = 'resolved'
- onDone(null, resolvedValue)
+ (resolvedValue) => {
+ promiseStatus = "resolved";
+ onDone(null, resolvedValue);
},
- rejectedValue => {
- promiseStatus = 'rejected'
- lastError = rejectedValue
+ (rejectedValue) => {
+ promiseStatus = "rejected";
+ lastError = rejectedValue;
},
- )
+ );
} else {
- onDone(null, result)
+ onDone(null, result);
}
// If `callback` throws, wait for the next mutation, interval, or timeout.
} catch (error) {
// Save the most recent callback error to reject the promise with it in the event of a timeout
- lastError = error
+ lastError = error as Error;
}
}
function handleTimeout() {
- let error
+ let error;
if (lastError) {
- error = lastError
+ error = lastError;
if (
!showOriginalStackTrace &&
- error.name === 'TestingLibraryElementError'
+ error.name === "TestingLibraryElementError"
) {
- copyStackTrace(error, stackTraceError)
+ copyStackTrace(error, stackTraceError);
}
} else {
- error = new Error('Timed out in waitFor.')
+ error = new Error("Timed out in waitFor.");
if (!showOriginalStackTrace) {
- copyStackTrace(error, stackTraceError)
+ copyStackTrace(error, stackTraceError);
}
}
- onDone(onTimeout(error), null)
+ onDone(onTimeout(error), null);
}
- })
+ });
}
-function waitForWrapper(callback, options) {
+function waitForWrapper(
+ callback: () => Promise | T,
+ options?: waitForOptions,
+): Promise {
// create the error here so its stack trace is as close to the
// calling code as possible
- const stackTraceError = new Error('STACK_TRACE_MESSAGE')
- return waitFor(callback, {stackTraceError, ...options})
+ const stackTraceError = new Error("STACK_TRACE_MESSAGE");
+ return waitFor(callback, { stackTraceError, ...options });
}
-export {waitForWrapper as waitFor}
-
-/*
-eslint
- max-lines-per-function: ["error", {"max": 200}],
-*/
+export { waitForWrapper as waitFor };
diff --git a/packages/cli-testing-library/tests/events.spec.ts b/packages/cli-testing-library/tests/events.spec.ts
new file mode 100644
index 0000000..f73cf1c
--- /dev/null
+++ b/packages/cli-testing-library/tests/events.spec.ts
@@ -0,0 +1,120 @@
+import { resolve } from "node:path";
+import { afterEach, expect, test } from "vitest";
+import { cleanup, render } from "../src/pure";
+import { fireEvent } from "../src/events";
+import { waitFor } from "../src/wait-for";
+import userEvent from "../src/user-event";
+
+afterEach(async () => {
+ await cleanup();
+});
+
+test("fireEvent write works", async () => {
+ const props = await render("node", [
+ resolve(__dirname, "./execute-scripts/stdio-inquirer.js"),
+ ]);
+
+ const { clear, findByText } = props;
+
+ const instance = await findByText("First option");
+
+ expect(instance).toBeTruthy();
+
+ // Windows uses ">", Linux/MacOS use "❯"
+ expect(await findByText(/[❯>] One/)).toBeTruthy();
+
+ clear();
+
+ const down = "\x1B\x5B\x42";
+ fireEvent(instance, "write", { value: down });
+
+ expect(await findByText(/[❯>] Two/)).toBeTruthy();
+
+ clear();
+
+ const enter = "\x0D";
+ fireEvent(instance, "write", { value: enter });
+
+ expect(await findByText("First option: Two")).toBeTruthy();
+});
+
+test("FireEvent SigTerm works", async () => {
+ const { findByText } = await render("node", [
+ resolve(__dirname, "./execute-scripts/stdio-inquirer.js"),
+ ]);
+
+ const instance = await findByText("First option");
+
+ expect(instance).toBeTruthy();
+
+ await fireEvent.sigterm(instance);
+
+ await waitFor(() => expect(instance.hasExit()).toBeTruthy());
+});
+
+test("FireEvent SigKill works", async () => {
+ const { findByText } = await render("node", [
+ resolve(__dirname, "./execute-scripts/stdio-inquirer.js"),
+ ]);
+
+ const instance = await findByText("First option");
+
+ expect(instance).toBeTruthy();
+
+ await fireEvent.sigkill(instance);
+
+ await waitFor(() => expect(instance.hasExit()).toBeTruthy());
+});
+
+test("userEvent basic keyboard works", async () => {
+ const { findByText } = await render("node", [
+ resolve(__dirname, "./execute-scripts/stdio-inquirer-input.js"),
+ ]);
+
+ const instance = await findByText("What is your name?");
+ expect(instance).toBeTruthy();
+
+ userEvent.keyboard(instance, "Test");
+
+ expect(await findByText("Test")).toBeTruthy();
+});
+
+test("userEvent basic keyboard works when bound", async () => {
+ const { findByText, userEvent: userEventLocal } = await render("node", [
+ resolve(__dirname, "./execute-scripts/stdio-inquirer-input.js"),
+ ]);
+
+ const instance = await findByText("What is your name?");
+ expect(instance).toBeTruthy();
+
+ userEventLocal.keyboard("Test");
+
+ expect(await findByText("Test")).toBeTruthy();
+});
+
+test("UserEvent.keyboard enter key works", async () => {
+ const props = await render("node", [
+ resolve(__dirname, "./execute-scripts/stdio-inquirer.js"),
+ ]);
+
+ const { clear, findByText, userEvent: userEventLocal } = props;
+
+ const instance = await findByText("First option");
+
+ expect(instance).toBeTruthy();
+
+ // Windows uses ">", Linux/MacOS use "❯"
+ expect(await findByText(/[❯>] One/)).toBeTruthy();
+
+ clear();
+
+ userEventLocal.keyboard("[ArrowDown]");
+
+ expect(await findByText(/[❯>] Two/)).toBeTruthy();
+
+ clear();
+
+ userEventLocal.keyboard("[Enter]");
+
+ expect(await findByText("First option: Two")).toBeTruthy();
+});
diff --git a/packages/cli-testing-library/tests/execute-scripts/list-args.js b/packages/cli-testing-library/tests/execute-scripts/list-args.js
new file mode 100644
index 0000000..ab74fd7
--- /dev/null
+++ b/packages/cli-testing-library/tests/execute-scripts/list-args.js
@@ -0,0 +1 @@
+console.log(process.argv);
diff --git a/packages/cli-testing-library/tests/execute-scripts/log-err.js b/packages/cli-testing-library/tests/execute-scripts/log-err.js
new file mode 100644
index 0000000..4fe2bf0
--- /dev/null
+++ b/packages/cli-testing-library/tests/execute-scripts/log-err.js
@@ -0,0 +1,3 @@
+console.log("Log here");
+console.warn("Warn here");
+console.error("Error here");
diff --git a/packages/cli-testing-library/tests/execute-scripts/log-output.js b/packages/cli-testing-library/tests/execute-scripts/log-output.js
new file mode 100644
index 0000000..3ea1ae5
--- /dev/null
+++ b/packages/cli-testing-library/tests/execute-scripts/log-output.js
@@ -0,0 +1,5 @@
+import pc from "picocolors";
+
+console.log("__disable_ansi_serialization");
+
+console.log(pc.blue("Hello") + " World" + pc.red("!"));
diff --git a/packages/cli-testing-library/tests/execute-scripts/stdio-inquirer-input.js b/packages/cli-testing-library/tests/execute-scripts/stdio-inquirer-input.js
new file mode 100644
index 0000000..1eb9806
--- /dev/null
+++ b/packages/cli-testing-library/tests/execute-scripts/stdio-inquirer-input.js
@@ -0,0 +1,9 @@
+import inquirer from "inquirer";
+
+inquirer.prompt([
+ {
+ type: "input",
+ name: "name",
+ message: "What is your name?",
+ },
+]);
diff --git a/packages/cli-testing-library/tests/execute-scripts/stdio-inquirer.js b/packages/cli-testing-library/tests/execute-scripts/stdio-inquirer.js
new file mode 100644
index 0000000..0d61a1a
--- /dev/null
+++ b/packages/cli-testing-library/tests/execute-scripts/stdio-inquirer.js
@@ -0,0 +1,10 @@
+import inquirer from "inquirer";
+
+inquirer.prompt([
+ {
+ type: "list",
+ name: "value",
+ message: "First option:",
+ choices: ["One", "Two", "Three"],
+ },
+]);
diff --git a/packages/cli-testing-library/tests/execute-scripts/throw.js b/packages/cli-testing-library/tests/execute-scripts/throw.js
new file mode 100644
index 0000000..dfe1354
--- /dev/null
+++ b/packages/cli-testing-library/tests/execute-scripts/throw.js
@@ -0,0 +1 @@
+throw new Error("Search for this error in stderr");
diff --git a/packages/cli-testing-library/tests/get-user-code-frame.spec.ts b/packages/cli-testing-library/tests/get-user-code-frame.spec.ts
new file mode 100644
index 0000000..b67139f
--- /dev/null
+++ b/packages/cli-testing-library/tests/get-user-code-frame.spec.ts
@@ -0,0 +1,88 @@
+import fs from "node:fs";
+import { afterEach, beforeEach, expect, test, vi } from "vitest";
+import { getUserCodeFrame } from "../src/get-user-code-frame";
+
+vi.mock(import("node:fs"), async (importOriginal) => {
+ const actual = await importOriginal();
+ return {
+ ...actual,
+ default: {
+ ...actual.default,
+ readFileSync: vi.fn(
+ () => `
+ import {screen} from '@testing-library/dom'
+ it('renders', () => {
+ document.body.appendChild(
+ document.createTextNode('Hello world')
+ )
+ screen.debug()
+ expect(screen.getByText('Hello world')).toBeInTheDocument()
+ })
+ `,
+ ),
+ },
+ } as never;
+});
+
+const userStackFrame =
+ "at somethingWrong (/sample-error/error-example.js:7:14)";
+
+let globalErrorMock!: ReturnType;
+
+beforeEach(() => {
+ globalErrorMock = vi.spyOn(global, "Error") as never;
+});
+
+afterEach(() => {
+ vi.mocked(global.Error).mockRestore();
+});
+
+test("it returns only user code frame when code frames from node_modules are first", () => {
+ const stack = `Error: Kaboom
+ at Object. (/sample-error/node_modules/@es2050/console/build/index.js:4:10)
+ ${userStackFrame}
+ `;
+ globalErrorMock.mockImplementationOnce(() => ({ stack }));
+ const userTrace = getUserCodeFrame();
+
+ expect(userTrace).toMatchInlineSnapshot(`
+ "[2m/sample-error/error-example.js:7:14[22m
+ 5 | document.createTextNode('Hello world')
+ 6 | )
+ > 7 | screen.debug()
+ | ^
+ "
+ `);
+});
+
+test("it returns only user code frame when node code frames are present afterwards", () => {
+ const stack = `Error: Kaboom
+ at Object. (/sample-error/node_modules/@es2050/console/build/index.js:4:10)
+ ${userStackFrame}
+ at Object. (/sample-error/error-example.js:14:1)
+ at internal/main/run_main_module.js:17:47
+ `;
+ globalErrorMock.mockImplementationOnce(() => ({ stack }));
+ const userTrace = getUserCodeFrame();
+
+ expect(userTrace).toMatchInlineSnapshot(`
+ "[2m/sample-error/error-example.js:7:14[22m
+ 5 | document.createTextNode('Hello world')
+ 6 | )
+ > 7 | screen.debug()
+ | ^
+ "
+ `);
+});
+
+test("it returns empty string if file from code frame can't be read", () => {
+ (fs.readFileSync as ReturnType).mockImplementationOnce(() => {
+ throw Error();
+ });
+ const stack = `Error: Kaboom
+ ${userStackFrame}
+ `;
+ globalErrorMock.mockImplementationOnce(() => ({ stack }));
+
+ expect(getUserCodeFrame()).toEqual("");
+});
diff --git a/packages/cli-testing-library/tests/matchers.spec.ts b/packages/cli-testing-library/tests/matchers.spec.ts
new file mode 100644
index 0000000..a6278f3
--- /dev/null
+++ b/packages/cli-testing-library/tests/matchers.spec.ts
@@ -0,0 +1,91 @@
+import { resolve } from "node:path";
+import { expect, test } from "vitest";
+import { render } from "../src/pure";
+
+test("toBeInTheConsole should pass when something is in console", async () => {
+ const { findByText } = await render("node", [
+ resolve(__dirname, "./execute-scripts/list-args.js"),
+ "--version",
+ ]);
+
+ await expect(
+ (async () => expect(await findByText("--version")).toBeInTheConsole())(),
+ ).resolves.not.toThrow();
+});
+
+test("toBeInTheConsole should fail when something is not console", async () => {
+ const { queryByText } = await render("node", [
+ resolve(__dirname, "./execute-scripts/list-args.js"),
+ "--version",
+ ]);
+
+ expect(() => expect(queryByText("NotHere")).toBeInTheConsole()).toThrow(
+ /value must be a TestInstance/,
+ );
+});
+
+test("not.toBeInTheConsole should pass something is not console", async () => {
+ const { queryByText } = await render("node", [
+ resolve(__dirname, "./execute-scripts/list-args.js"),
+ "--version",
+ ]);
+
+ expect(() =>
+ expect(queryByText("NotHere")).not.toBeInTheConsole(),
+ ).not.toThrow();
+});
+
+test("not.toBeInTheConsole should fail something is console", async () => {
+ const { queryByText } = await render("node", [
+ resolve(__dirname, "./execute-scripts/list-args.js"),
+ "--version",
+ ]);
+
+ expect(() => expect(queryByText("--version")).not.toBeInTheConsole()).toThrow(
+ /Expected not to find the instance in the console/,
+ );
+});
+
+test("toHaveErrorMessage should pass during stderr when no string passed", async () => {
+ const instance = await render("node", [
+ resolve(__dirname, "./execute-scripts/throw.js"),
+ ]);
+
+ await expect(
+ (async () => expect(instance).toHaveErrorMessage())(),
+ ).resolves.not.toThrow();
+});
+
+test("toHaveErrorMessage should pass during stderr when string passed", async () => {
+ const instance = await render("node", [
+ resolve(__dirname, "./execute-scripts/throw.js"),
+ ]);
+
+ await expect(
+ (async () =>
+ expect(instance).toHaveErrorMessage(/Search for this error in stderr/))(),
+ ).resolves.not.toThrow();
+});
+
+test("toHaveErrorMessage should fail when something is not in stderr", async () => {
+ const { findByText } = await render("node", [
+ resolve(__dirname, "./execute-scripts/list-args.js"),
+ "--version",
+ ]);
+
+ const instance = await findByText("--version");
+ expect(() => expect(instance).toHaveErrorMessage("Error isn't here")).toThrow(
+ /Expected the instance to have error message/,
+ );
+});
+
+test("toHaveErrorMessage should fail when null is passed", async () => {
+ const { queryByText } = await render("node", [
+ resolve(__dirname, "./execute-scripts/list-args.js"),
+ "--version",
+ ]);
+
+ expect(() => expect(queryByText("NotHere")).toHaveErrorMessage()).toThrow(
+ /value must be a TestInstance/,
+ );
+});
diff --git a/packages/cli-testing-library/tests/matches.spec.ts b/packages/cli-testing-library/tests/matches.spec.ts
new file mode 100644
index 0000000..ca9cfe5
--- /dev/null
+++ b/packages/cli-testing-library/tests/matches.spec.ts
@@ -0,0 +1,44 @@
+import { expect, test } from "vitest";
+import { fuzzyMatches, matches } from "../src/matches";
+
+// unit tests for text match utils
+
+const node = null;
+const normalizer = (str: string) => str;
+
+test("matchers accept strings", () => {
+ expect(matches("ABC", node, "ABC", normalizer)).toBe(true);
+ expect(fuzzyMatches("ABC", node, "ABC", normalizer)).toBe(true);
+});
+
+test("matchers accept regex", () => {
+ expect(matches("ABC", node, /ABC/, normalizer)).toBe(true);
+ expect(fuzzyMatches("ABC", node, /ABC/, normalizer)).toBe(true);
+});
+
+test("matchers accept functions", () => {
+ expect(
+ matches("ABC", node, (text: string) => text === "ABC", normalizer),
+ ).toBe(true);
+ expect(
+ fuzzyMatches("ABC", node, (text: string) => text === "ABC", normalizer),
+ ).toBe(true);
+});
+
+test("matchers return false if text to match is not a string", () => {
+ expect(matches(null as never, node, "ABC", normalizer)).toBe(false);
+ expect(fuzzyMatches(null as never, node, "ABC", normalizer)).toBe(false);
+});
+
+test("matchers throw on invalid matcher inputs", () => {
+ expect(() =>
+ matches("ABC", node, null as never, normalizer),
+ ).toThrowErrorMatchingInlineSnapshot(
+ `[Error: It looks like null was passed instead of a matcher. Did you do something like getByText(null)?]`,
+ );
+ expect(() =>
+ fuzzyMatches("ABC", node, undefined as never, normalizer),
+ ).toThrowErrorMatchingInlineSnapshot(
+ `[Error: It looks like undefined was passed instead of a matcher. Did you do something like getByText(undefined)?]`,
+ );
+});
diff --git a/packages/cli-testing-library/tests/pretty-cli.spec.ts b/packages/cli-testing-library/tests/pretty-cli.spec.ts
new file mode 100644
index 0000000..74ec22f
--- /dev/null
+++ b/packages/cli-testing-library/tests/pretty-cli.spec.ts
@@ -0,0 +1,44 @@
+import { resolve } from "node:path";
+import { expect, test } from "vitest";
+import { render } from "../src/pure";
+import { prettyCLI } from "../src/pretty-cli";
+
+test("Should pretty print with ANSI codes properly", async () => {
+ const instance = await render("node", [
+ resolve(__dirname, "./execute-scripts/log-output.js"),
+ ]);
+
+ await instance.findByText("Hello");
+
+ expect(prettyCLI(instance, 9000)).toMatchInlineSnapshot(`
+ "__disable_ansi_serialization
+ [34mHello[39m World[31m![39m"
+ `);
+});
+
+test("Should escape ANSI codes properly when sliced too thin", async () => {
+ const instance = await render("node", [
+ resolve(__dirname, "./execute-scripts/log-output.js"),
+ ]);
+
+ await instance.findByText("Hello");
+
+ expect(prettyCLI(instance, 30)).toMatchInlineSnapshot(`
+ "__disable_ansi_serialization
+ [34mH[39m"
+ `);
+});
+
+test("Should show proper stderr and stdout output", async () => {
+ const instance = await render("node", [
+ resolve(__dirname, "./execute-scripts/log-err.js"),
+ ]);
+
+ await instance.findByError("Error here");
+
+ expect(prettyCLI(instance, 300)).toMatchInlineSnapshot(`
+ "Log here
+ Warn here
+ Error here"
+ `);
+});
diff --git a/packages/cli-testing-library/tests/queries.spec.ts b/packages/cli-testing-library/tests/queries.spec.ts
new file mode 100644
index 0000000..3bdfe12
--- /dev/null
+++ b/packages/cli-testing-library/tests/queries.spec.ts
@@ -0,0 +1,69 @@
+import { resolve } from "node:path";
+import { expect, test } from "vitest";
+import { render } from "../src/pure";
+import { waitFor } from "../src/wait-for";
+
+test("findByError should show stderr", async () => {
+ const { findByError } = await render("node", [
+ resolve(__dirname, "./execute-scripts/throw.js"),
+ ]);
+ expect(findByError("Search for this error in stderr")).toBeTruthy();
+});
+
+test("findByText should find stdout", async () => {
+ const { findByText } = await render("node", [
+ resolve(__dirname, "./execute-scripts/list-args.js"),
+ "--version",
+ ]);
+
+ expect(await findByText("--version")).toBeTruthy();
+});
+
+test("findByText should throw errors", async () => {
+ const { findByText } = await render("node", [
+ resolve(__dirname, "./execute-scripts/list-args.js"),
+ "--version",
+ ]);
+
+ await expect(() => findByText("--nothing")).rejects.toThrow(
+ "Unable to find an stdout line with the text:",
+ );
+});
+
+test("queryByText should find text", async () => {
+ const { queryByText } = await render("node", [
+ resolve(__dirname, "./execute-scripts/list-args.js"),
+ "--version",
+ ]);
+
+ expect(queryByText("--version")).toBeTruthy();
+});
+
+test("queryByText should not throw errors", async () => {
+ const { queryByText } = await render("node", [
+ resolve(__dirname, "./execute-scripts/list-args.js"),
+ "--version",
+ ]);
+
+ expect(await queryByText("--nothing")).toBeFalsy();
+});
+
+test("getByText should find text", async () => {
+ const { getByText } = await render("node", [
+ resolve(__dirname, "./execute-scripts/list-args.js"),
+ "--version",
+ ]);
+
+ expect(await waitFor(() => getByText("--version"))).toBeTruthy();
+});
+
+test("getByText should throw errors", async () => {
+ const { getByText } = await render("node", [
+ resolve(__dirname, "./execute-scripts/list-args.js"),
+ "--version",
+ ]);
+
+ await expect(() => waitFor(() => getByText("--nothing"))).rejects.toThrow(
+ "Unable to find an stdout line with the text:",
+ );
+});
diff --git a/packages/cli-testing-library/tests/render-basics.spec.ts b/packages/cli-testing-library/tests/render-basics.spec.ts
new file mode 100644
index 0000000..59f3bba
--- /dev/null
+++ b/packages/cli-testing-library/tests/render-basics.spec.ts
@@ -0,0 +1,49 @@
+import { resolve } from "node:path";
+import { expect, test } from "vitest";
+import { render } from "../src/pure";
+import { waitFor } from "../src/wait-for";
+
+test("Should expect error codes when intended", async () => {
+ const instance = await render("node", [
+ resolve(__dirname, "./execute-scripts/throw.js"),
+ ]);
+ await waitFor(() =>
+ expect(instance.hasExit()).toMatchObject({ exitCode: 1 }),
+ );
+});
+
+test("Should handle argument passing", async () => {
+ const { findByText } = await render("node", [
+ resolve(__dirname, "./execute-scripts/list-args.js"),
+ "--version",
+ ]);
+
+ expect(await findByText("--version")).toBeTruthy();
+});
+
+test("Is able to make terminal input and view in-progress stdout", async () => {
+ const props = await render("node", [
+ resolve(__dirname, "./execute-scripts/stdio-inquirer.js"),
+ ]);
+
+ const { clear, findByText, userEvent } = props;
+
+ const instance = await findByText("First option");
+
+ expect(instance).toBeTruthy();
+
+ // Windows uses ">", Linux/MacOS use "❯"
+ expect(await findByText(/[❯>] One/)).toBeTruthy();
+
+ clear();
+
+ userEvent.keyboard("[ArrowDown]");
+
+ expect(await findByText(/[❯>] Two/)).toBeTruthy();
+
+ clear();
+
+ userEvent.keyboard("[Enter]");
+
+ expect(await findByText("First option: Two")).toBeTruthy();
+});
diff --git a/packages/cli-testing-library/tests/setup.ts b/packages/cli-testing-library/tests/setup.ts
new file mode 100644
index 0000000..170aef2
--- /dev/null
+++ b/packages/cli-testing-library/tests/setup.ts
@@ -0,0 +1 @@
+import "../src/vitest";
diff --git a/packages/cli-testing-library/tests/user-keyboard.spec.ts b/packages/cli-testing-library/tests/user-keyboard.spec.ts
new file mode 100644
index 0000000..5160319
--- /dev/null
+++ b/packages/cli-testing-library/tests/user-keyboard.spec.ts
@@ -0,0 +1,19 @@
+import { resolve } from "node:path";
+import { expect, test } from "vitest";
+import { render } from "../src/pure";
+import { fireEvent } from "../src/events";
+
+test("Should render { and } in user keyboard", async () => {
+ const { findByText, userEvent: userEventLocal } = await render("node", [
+ resolve(__dirname, "./execute-scripts/stdio-inquirer-input.js"),
+ ]);
+
+ const instance = await findByText("What is your name?");
+ expect(instance).toBeTruthy();
+
+ userEventLocal.keyboard("{Hello}");
+
+ expect(await findByText("{Hello}")).toBeTruthy();
+
+ await fireEvent.sigterm(instance);
+});
diff --git a/packages/cli-testing-library/tests/wait-for.spec.ts b/packages/cli-testing-library/tests/wait-for.spec.ts
new file mode 100644
index 0000000..db967d2
--- /dev/null
+++ b/packages/cli-testing-library/tests/wait-for.spec.ts
@@ -0,0 +1,247 @@
+import { expect, test, vi } from "vitest";
+import { waitFor } from "../src/index";
+import { configure, getConfig } from "../src/config";
+// import {render} from '../pure'
+
+function deferred() {
+ let resolve!: (...props: Array) => void;
+ let reject!: (...props: Array) => void;
+ const promise = new Promise((res, rej) => {
+ resolve = res as never;
+ reject = rej as never;
+ });
+ return { promise, resolve, reject };
+}
+
+test("waits callback to not throw an error", async () => {
+ const spy = vi.fn();
+ // we are using random timeout here to simulate a real-time example
+ // of an async operation calling a callback at a non-deterministic time
+ const randomTimeout = Math.floor(Math.random() * 60);
+ setTimeout(spy, randomTimeout);
+
+ await waitFor(() => expect(spy).toHaveBeenCalledTimes(1));
+ expect(spy).toHaveBeenCalledWith();
+});
+
+// we used to have a limitation where we had to set an interval of 0 to 1
+// otherwise there would be problems. I don't think this limitation exists
+// anymore, but we'll keep this test around to make sure a problem doesn't
+// crop up.
+test("can accept an interval of 0", () => waitFor(() => {}, { interval: 0 }));
+
+test("can timeout after the given timeout time", async () => {
+ const error = new Error("throws every time");
+ const result = await waitFor(
+ () => {
+ throw error;
+ },
+ { timeout: 8, interval: 5 },
+ ).catch((e) => e);
+ expect(result).toBe(error);
+});
+
+test("if no error is thrown then throws a timeout error", async () => {
+ const result = await waitFor(
+ () => {
+ throw undefined;
+ },
+ { timeout: 8, interval: 5, onTimeout: (e) => e },
+ ).catch((e) => e);
+ expect(result).toMatchInlineSnapshot(`[Error: Timed out in waitFor.]`);
+});
+
+test("if showOriginalStackTrace on a timeout error then the stack trace does not include this file", async () => {
+ const result = await waitFor(
+ () => {
+ throw undefined;
+ },
+ { timeout: 8, interval: 5, showOriginalStackTrace: true },
+ ).catch((e) => e);
+ expect(result.stack).not.toMatch(__dirname);
+});
+
+test("uses full stack error trace when showOriginalStackTrace present", async () => {
+ const error = new Error("Throws the full stack trace");
+ // even if the error is a TestingLibraryElementError
+ error.name = "TestingLibraryElementError";
+ const originalStackTrace = error.stack;
+ const result = await waitFor(
+ () => {
+ throw error;
+ },
+ { timeout: 8, interval: 5, showOriginalStackTrace: true },
+ ).catch((e) => e);
+ expect(result.stack).toBe(originalStackTrace);
+});
+
+test("does not change the stack trace if the thrown error is not a TestingLibraryElementError", async () => {
+ const error = new Error("Throws the full stack trace");
+ const originalStackTrace = error.stack;
+ const result = await waitFor(
+ () => {
+ throw error;
+ },
+ { timeout: 8, interval: 5 },
+ ).catch((e) => e);
+ expect(result.stack).toBe(originalStackTrace);
+});
+
+test("provides an improved stack trace if the thrown error is a TestingLibraryElementError", async () => {
+ const error = new Error("Throws the full stack trace");
+ error.name = "TestingLibraryElementError";
+ const originalStackTrace = error.stack;
+ const result = await waitFor(
+ () => {
+ throw error;
+ },
+ { timeout: 8, interval: 5 },
+ ).catch((e) => e);
+ // too hard to test that the stack trace is what we want it to be
+ // so we'll just make sure that it's not the same as the original
+ expect(result.stack).not.toBe(originalStackTrace);
+});
+
+test("throws nice error if provided callback is not a function", () => {
+ const someElement = "Hello";
+ expect(() => waitFor(someElement as never)).toThrow(
+ "Received `callback` arg must be a function",
+ );
+});
+
+// test('timeout logs a pretty DOM', async () => {
+// renderIntoDocument(`how pretty
`)
+// const error = await waitFor(
+// () => {
+// throw new Error('always throws')
+// },
+// {timeout: 1},
+// ).catch(e => e)
+// expect(error.message).toMatchInlineSnapshot(`
+// always throws
+//
+// Ignored nodes: comments, ,
+//
+//
+//
+//
+// how pretty
+//
+//
+//
+// `)
+// })
+
+test("should delegate to config.getInstanceError", async () => {
+ const originalConfig = getConfig();
+ const elementError = new Error("Custom instance error");
+ const getInstanceError = vi.fn().mockImplementation(() => elementError);
+ configure({ getInstanceError });
+
+ const error = await waitFor(
+ () => {
+ throw new Error("always throws");
+ },
+ { timeout: 1 },
+ ).catch((e) => e);
+
+ expect(getInstanceError).toBeCalledTimes(1);
+ expect(error.message).toMatchInlineSnapshot(`"Custom instance error"`);
+ configure(originalConfig);
+});
+
+test("when a promise is returned, it does not call the callback again until that promise rejects", async () => {
+ const sleep = (t: number) => new Promise((r) => setTimeout(r, t));
+ const p1 = deferred();
+ const waitForCb = vi.fn(() => p1.promise);
+ const waitForPromise = waitFor(waitForCb, { interval: 1 });
+ expect(waitForCb).toHaveBeenCalledTimes(1);
+ waitForCb.mockClear();
+ await sleep(50);
+ expect(waitForCb).toHaveBeenCalledTimes(0);
+
+ const p2 = deferred();
+ waitForCb.mockImplementation(() => p2.promise);
+
+ p1.reject("p1 rejection (should not fail this test)");
+ await sleep(50);
+
+ expect(waitForCb).toHaveBeenCalledTimes(1);
+ p2.resolve();
+
+ await waitForPromise;
+});
+
+test("when a promise is returned, if that is not resolved within the timeout, then waitFor is rejected", async () => {
+ const sleep = (t: number) => new Promise((r) => setTimeout(r, t));
+ const { promise } = deferred();
+ const waitForError = waitFor(() => promise, { timeout: 1 }).catch((e) => e);
+ await sleep(5);
+
+ expect(
+ ((await waitForError) as { message: string }).message,
+ ).toMatchInlineSnapshot(`"Timed out in waitFor."`);
+});
+
+test("if you switch from fake timers to real timers during the wait period you get an error", async () => {
+ vi.useFakeTimers();
+ const waitForError = waitFor(() => {
+ throw new Error("this error message does not matter...");
+ }).catch((e) => e);
+
+ // this is the problem...
+ vi.useRealTimers();
+
+ const error = await waitForError;
+
+ expect(error.message).toMatchInlineSnapshot(
+ `"Changed from using fake timers to real timers while using waitFor. This is not allowed and will result in very strange behavior. Please ensure you're awaiting all async things your test is doing before changing to real timers. For more info, please go to https://github.com/testing-library/dom-testing-library/issues/830"`,
+ );
+ // stack trace has this file in it
+ expect(error.stack).toMatch(__dirname);
+});
+
+test("if you switch from real timers to fake timers during the wait period you get an error", async () => {
+ const waitForError = waitFor(() => {
+ throw new Error("this error message does not matter...");
+ }).catch((e) => e);
+
+ // this is the problem...
+ vi.useFakeTimers();
+ const error = await waitForError;
+
+ expect(error.message).toMatchInlineSnapshot(
+ `"Changed from using real timers to fake timers while using waitFor. This is not allowed and will result in very strange behavior. Please ensure you're awaiting all async things your test is doing before changing to fake timers. For more info, please go to https://github.com/testing-library/dom-testing-library/issues/830"`,
+ );
+ // stack trace has this file in it
+ expect(error.stack).toMatch(__dirname);
+});
+
+test("the fake timers => real timers error shows the original stack trace when configured to do so", async () => {
+ vi.useFakeTimers();
+ const waitForError = waitFor(
+ () => {
+ throw new Error("this error message does not matter...");
+ },
+ { showOriginalStackTrace: true },
+ ).catch((e) => e);
+
+ vi.useRealTimers();
+
+ expect((await waitForError).stack).not.toMatch(__dirname);
+});
+
+test("the real timers => fake timers error shows the original stack trace when configured to do so", async () => {
+ const waitForError = waitFor(
+ () => {
+ throw new Error("this error message does not matter...");
+ },
+ { showOriginalStackTrace: true },
+ ).catch((e) => e);
+
+ vi.useFakeTimers();
+
+ expect((await waitForError).stack).not.toMatch(__dirname);
+});
diff --git a/packages/cli-testing-library/tsconfig.docs.json b/packages/cli-testing-library/tsconfig.docs.json
new file mode 100644
index 0000000..b90fc83
--- /dev/null
+++ b/packages/cli-testing-library/tsconfig.docs.json
@@ -0,0 +1,4 @@
+{
+ "extends": "./tsconfig.json",
+ "include": ["src"]
+}
diff --git a/packages/cli-testing-library/tsconfig.json b/packages/cli-testing-library/tsconfig.json
new file mode 100644
index 0000000..e04bee2
--- /dev/null
+++ b/packages/cli-testing-library/tsconfig.json
@@ -0,0 +1,7 @@
+{
+ "extends": "../../tsconfig.json",
+ "compilerOptions": {
+ "moduleResolution": "Bundler"
+ },
+ "include": ["src", "tests", "eslint.config.js", "vite.config.ts"]
+}
diff --git a/packages/cli-testing-library/vite.config.ts b/packages/cli-testing-library/vite.config.ts
new file mode 100644
index 0000000..dd65a85
--- /dev/null
+++ b/packages/cli-testing-library/vite.config.ts
@@ -0,0 +1,28 @@
+import { defineConfig, mergeConfig } from "vitest/config";
+import { tanstackViteConfig } from "@tanstack/config/vite";
+import packageJson from "./package.json";
+
+const config = defineConfig({
+ test: {
+ name: packageJson.name,
+ dir: "./tests",
+ watch: false,
+ globals: true,
+ setupFiles: ["./tests/setup.ts"],
+ coverage: { enabled: true, provider: "istanbul", include: ["src/**/*"] },
+ typecheck: { enabled: true },
+ },
+});
+
+export default mergeConfig(
+ config,
+ tanstackViteConfig({
+ entry: [
+ "./src/index.ts",
+ "./src/vitest.ts",
+ "./src/jest-globals.ts",
+ "./src/jest.ts",
+ ],
+ srcDir: "./src",
+ }),
+);
diff --git a/packages/cli-testing-library/vitest/package.json b/packages/cli-testing-library/vitest/package.json
new file mode 100644
index 0000000..93753f9
--- /dev/null
+++ b/packages/cli-testing-library/vitest/package.json
@@ -0,0 +1,25 @@
+{
+ "name": "cli-testing-library-vitest",
+ "version": "3.0.0",
+ "description": "",
+ "type": "module",
+ "module": "./../dist/esm/vitest.js",
+ "main": "./../dist/cjs/vitest.cjs",
+ "types": "./../dist/cjs/vitest.d.cts",
+ "exports": {
+ "./package.json": "./package.json",
+ ".": {
+ "import": {
+ "types": "./../dist/esm/vitest.d.ts",
+ "default": "./../dist/esm/vitest.js"
+ },
+ "require": {
+ "types": "./../dist/cjs/vitest.d.cts",
+ "default": "./../dist/cjs/vitest.cjs"
+ }
+ }
+ },
+ "author": "Corbin Crutchley (https://crutchcorn.dev)",
+ "license": "MIT",
+ "sideEffects": true
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
new file mode 100644
index 0000000..e51ee6b
--- /dev/null
+++ b/pnpm-lock.yaml
@@ -0,0 +1,9336 @@
+lockfileVersion: '9.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+importers:
+
+ .:
+ devDependencies:
+ '@tanstack/config':
+ specifier: ^0.16.1
+ version: 0.16.1(@types/node@22.10.10)(esbuild@0.24.2)(eslint@9.19.0(jiti@2.4.2))(rollup@4.32.0)(typescript@5.6.3)(vite@6.0.11(@types/node@22.10.10)(jiti@2.4.2)(yaml@2.7.0))
+ '@types/node':
+ specifier: ^22.10.10
+ version: 22.10.10
+ eslint:
+ specifier: 9.19.0
+ version: 9.19.0(jiti@2.4.2)
+ knip:
+ specifier: ^5.43.3
+ version: 5.43.3(@types/node@22.10.10)(typescript@5.6.3)
+ nx:
+ specifier: ^20.3.3
+ version: 20.3.3
+ premove:
+ specifier: ^4.0.0
+ version: 4.0.0
+ prettier:
+ specifier: ^3.4.2
+ version: 3.4.2
+ publint:
+ specifier: ^0.3.2
+ version: 0.3.2
+ sherif:
+ specifier: ^1.2.0
+ version: 1.2.0
+ typescript:
+ specifier: 5.6.3
+ version: 5.6.3
+ typescript51:
+ specifier: npm:typescript@5.1
+ version: typescript@5.7.3
+ typescript52:
+ specifier: npm:typescript@5.2
+ version: typescript@5.7.3
+ typescript53:
+ specifier: npm:typescript@5.3
+ version: typescript@5.7.3
+ typescript54:
+ specifier: npm:typescript@5.4
+ version: typescript@5.7.3
+ typescript55:
+ specifier: npm:typescript@5.5
+ version: typescript@5.7.3
+ vite:
+ specifier: ^6.0.11
+ version: 6.0.11(@types/node@22.10.10)(jiti@2.4.2)(yaml@2.7.0)
+ vitest:
+ specifier: ^3.0.4
+ version: 3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(jiti@2.4.2)(yaml@2.7.0)
+
+ packages/cli-testing-library:
+ dependencies:
+ '@babel/code-frame':
+ specifier: ^7.10.4
+ version: 7.26.2
+ '@babel/runtime':
+ specifier: ^7.12.5
+ version: 7.26.7
+ picocolors:
+ specifier: ^1.1.1
+ version: 1.1.1
+ redent:
+ specifier: ^4.0.0
+ version: 4.0.0
+ slice-ansi:
+ specifier: ^7.1.0
+ version: 7.1.0
+ strip-ansi:
+ specifier: ^7.1.0
+ version: 7.1.0
+ strip-final-newline:
+ specifier: ^4.0.0
+ version: 4.0.0
+ tree-kill:
+ specifier: ^1.2.2
+ version: 1.2.2
+ vitest:
+ specifier: ^3.0.0
+ version: 3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(jiti@2.4.2)(yaml@2.7.0)
+ devDependencies:
+ '@jest/expect':
+ specifier: ^29.7.0
+ version: 29.7.0
+ '@jest/globals':
+ specifier: ^29.7.0
+ version: 29.7.0
+ '@types/babel__code-frame':
+ specifier: ^7.0.6
+ version: 7.0.6
+ '@types/inquirer':
+ specifier: ^9.0.7
+ version: 9.0.7
+ '@vitest/coverage-istanbul':
+ specifier: 3.0.4
+ version: 3.0.4(vitest@3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(jiti@2.4.2)(yaml@2.7.0))
+ inquirer:
+ specifier: ^12.3.2
+ version: 12.3.2(@types/node@22.10.10)
+
+ packages/cli-testing-library/jest: {}
+
+ packages/cli-testing-library/jest-globals: {}
+
+ packages/cli-testing-library/vitest: {}
+
+ website:
+ dependencies:
+ '@astrojs/react':
+ specifier: ^4.1.2
+ version: 4.1.6(@types/node@22.10.10)(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(jiti@2.4.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(yaml@2.7.0)
+ '@astrojs/starlight':
+ specifier: ^0.31.1
+ version: 0.31.1(astro@5.1.9(@types/node@22.10.10)(jiti@2.4.2)(rollup@4.32.0)(typescript@5.7.3)(yaml@2.7.0))
+ astro:
+ specifier: ^5.0.2
+ version: 5.1.9(@types/node@22.10.10)(jiti@2.4.2)(rollup@4.32.0)(typescript@5.7.3)(yaml@2.7.0)
+ react:
+ specifier: ^19.0.0
+ version: 19.0.0
+ react-dom:
+ specifier: ^19.0.0
+ version: 19.0.0(react@19.0.0)
+ sharp:
+ specifier: ^0.33.5
+ version: 0.33.5
+ devDependencies:
+ '@types/react':
+ specifier: ^19.0.2
+ version: 19.0.8
+ '@types/react-dom':
+ specifier: ^19.0.2
+ version: 19.0.3(@types/react@19.0.8)
+
+packages:
+
+ '@ampproject/remapping@2.3.0':
+ resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
+ engines: {node: '>=6.0.0'}
+
+ '@astrojs/compiler@2.10.3':
+ resolution: {integrity: sha512-bL/O7YBxsFt55YHU021oL+xz+B/9HvGNId3F9xURN16aeqDK9juHGktdkCSXz+U4nqFACq6ZFvWomOzhV+zfPw==}
+
+ '@astrojs/internal-helpers@0.4.2':
+ resolution: {integrity: sha512-EdDWkC3JJVcpGpqJAU/5hSk2LKXyG3mNGkzGoAuyK+xoPHbaVdSuIWoN1QTnmK3N/gGfaaAfM8gO2KDCAW7S3w==}
+
+ '@astrojs/markdown-remark@6.0.2':
+ resolution: {integrity: sha512-aAoHGVRK3rebCYbaLjyyR+3VeAuTz4q49syUxJP29Oo5yZHdy4cCAXRqLBdr9mJVlxCUUjZiF0Dau6YBf65SGg==}
+
+ '@astrojs/mdx@4.0.7':
+ resolution: {integrity: sha512-d3PopBTbbCoX3QOmSLYXW6YCZ0dkhNaeP9/Liz9BhEekflMc9IvBjbtNFf1WCEatsl4LLGftyDisfMM3F3LGMA==}
+ engines: {node: ^18.17.1 || ^20.3.0 || >=22.0.0}
+ peerDependencies:
+ astro: ^5.0.0
+
+ '@astrojs/prism@3.2.0':
+ resolution: {integrity: sha512-GilTHKGCW6HMq7y3BUv9Ac7GMe/MO9gi9GW62GzKtth0SwukCu/qp2wLiGpEujhY+VVhaG9v7kv/5vFzvf4NYw==}
+ engines: {node: ^18.17.1 || ^20.3.0 || >=22.0.0}
+
+ '@astrojs/react@4.1.6':
+ resolution: {integrity: sha512-lMBO+Va4JbLsXviagT9/ZmliwfQGmsiw4rvI4yusPZijQek3q5yfEnQor5XWNcErrkazjjNxY9BFO5f/eSfqmw==}
+ engines: {node: ^18.17.1 || ^20.3.0 || >=22.0.0}
+ peerDependencies:
+ '@types/react': ^17.0.50 || ^18.0.21 || ^19.0.0
+ '@types/react-dom': ^17.0.17 || ^18.0.6 || ^19.0.0
+ react: ^17.0.2 || ^18.0.0 || ^19.0.0
+ react-dom: ^17.0.2 || ^18.0.0 || ^19.0.0
+
+ '@astrojs/sitemap@3.2.1':
+ resolution: {integrity: sha512-uxMfO8f7pALq0ADL6Lk68UV6dNYjJ2xGUzyjjVj60JLBs5a6smtlkBYv3tQ0DzoqwS7c9n4FUx5lgv0yPo/fgA==}
+
+ '@astrojs/starlight@0.31.1':
+ resolution: {integrity: sha512-VIVkHugwgtEqJPiRH8+ouP0UqUfdmpBO9C64R+6QaQ2qmADNkI/BA3/YAJHTBZYlMQQGEEuLJwD9qpaUovi52Q==}
+ peerDependencies:
+ astro: ^5.1.5
+
+ '@astrojs/telemetry@3.2.0':
+ resolution: {integrity: sha512-wxhSKRfKugLwLlr4OFfcqovk+LIFtKwLyGPqMsv+9/ibqqnW3Gv7tBhtKEb0gAyUAC4G9BTVQeQahqnQAhd6IQ==}
+ engines: {node: ^18.17.1 || ^20.3.0 || >=22.0.0}
+
+ '@babel/code-frame@7.26.2':
+ resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/compat-data@7.26.5':
+ resolution: {integrity: sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/core@7.26.0':
+ resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/core@7.26.7':
+ resolution: {integrity: sha512-SRijHmF0PSPgLIBYlWnG0hyeJLwXE2CgpsXaMOrtt2yp9/86ALw6oUlj9KYuZ0JN07T4eBMVIW4li/9S1j2BGA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/generator@7.26.5':
+ resolution: {integrity: sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-compilation-targets@7.26.5':
+ resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-imports@7.25.9':
+ resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-module-transforms@7.26.0':
+ resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ '@babel/helper-plugin-utils@7.26.5':
+ resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-string-parser@7.25.9':
+ resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-identifier@7.25.9':
+ resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helper-validator-option@7.25.9':
+ resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helpers@7.26.0':
+ resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/helpers@7.26.7':
+ resolution: {integrity: sha512-8NHiL98vsi0mbPQmYAGWwfcFaOy4j2HY49fXJCfuDcdE7fMIsH9a7GdaeXpIBsbT7307WU8KCMp5pUVDNL4f9A==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/parser@7.26.5':
+ resolution: {integrity: sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
+ '@babel/parser@7.26.7':
+ resolution: {integrity: sha512-kEvgGGgEjRUutvdVvZhbn/BxVt+5VSpwXz1j3WYXQbXDo8KzFOPNG2GQbdAiNq8g6wn1yKk7C/qrke03a84V+w==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
+ '@babel/plugin-syntax-async-generators@7.8.4':
+ resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-bigint@7.8.3':
+ resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-class-properties@7.12.13':
+ resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-class-static-block@7.14.5':
+ resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-import-attributes@7.26.0':
+ resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-import-meta@7.10.4':
+ resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-json-strings@7.8.3':
+ resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-jsx@7.25.9':
+ resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-logical-assignment-operators@7.10.4':
+ resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3':
+ resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-numeric-separator@7.10.4':
+ resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-object-rest-spread@7.8.3':
+ resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-optional-catch-binding@7.8.3':
+ resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-optional-chaining@7.8.3':
+ resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-private-property-in-object@7.14.5':
+ resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-top-level-await@7.14.5':
+ resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-syntax-typescript@7.25.9':
+ resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-react-jsx-self@7.25.9':
+ resolution: {integrity: sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/plugin-transform-react-jsx-source@7.25.9':
+ resolution: {integrity: sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+
+ '@babel/runtime@7.26.7':
+ resolution: {integrity: sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/template@7.25.9':
+ resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/traverse@7.26.5':
+ resolution: {integrity: sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/traverse@7.26.7':
+ resolution: {integrity: sha512-1x1sgeyRLC3r5fQOM0/xtQKsYjyxmFjaOrLJNtZ81inNjyJHGIolTULPiSc/2qe1/qfpFLisLQYFnnZl7QoedA==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/types@7.26.5':
+ resolution: {integrity: sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==}
+ engines: {node: '>=6.9.0'}
+
+ '@babel/types@7.26.7':
+ resolution: {integrity: sha512-t8kDRGrKXyp6+tjUh7hw2RLyclsW4TRoRvRHtSyAX9Bb5ldlFh+90YAYY6awRXrlB4G5G2izNeGySpATlFzmOg==}
+ engines: {node: '>=6.9.0'}
+
+ '@commitlint/parse@19.5.0':
+ resolution: {integrity: sha512-cZ/IxfAlfWYhAQV0TwcbdR1Oc0/r0Ik1GEessDJ3Lbuma/MRO8FRQX76eurcXtmhJC//rj52ZSZuXUg0oIX0Fw==}
+ engines: {node: '>=v18'}
+
+ '@commitlint/types@19.5.0':
+ resolution: {integrity: sha512-DSHae2obMSMkAtTBSOulg5X7/z+rGLxcXQIkg3OmWvY6wifojge5uVMydfhUvs7yQj+V7jNmRZ2Xzl8GJyqRgg==}
+ engines: {node: '>=v18'}
+
+ '@ctrl/tinycolor@4.1.0':
+ resolution: {integrity: sha512-WyOx8cJQ+FQus4Mm4uPIZA64gbk3Wxh0so5Lcii0aJifqwoVOlfFtorjLE0Hen4OYyHZMXDWqMmaQemBhgxFRQ==}
+ engines: {node: '>=14'}
+
+ '@emnapi/core@1.3.1':
+ resolution: {integrity: sha512-pVGjBIt1Y6gg3EJN8jTcfpP/+uuRksIo055oE/OBkDNcjZqVbfkWCksG1Jp4yZnj3iKWyWX8fdG/j6UDYPbFog==}
+
+ '@emnapi/runtime@1.3.1':
+ resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==}
+
+ '@emnapi/wasi-threads@1.0.1':
+ resolution: {integrity: sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==}
+
+ '@esbuild/aix-ppc64@0.24.2':
+ resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [aix]
+
+ '@esbuild/android-arm64@0.24.2':
+ resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [android]
+
+ '@esbuild/android-arm@0.24.2':
+ resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [android]
+
+ '@esbuild/android-x64@0.24.2':
+ resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [android]
+
+ '@esbuild/darwin-arm64@0.24.2':
+ resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@esbuild/darwin-x64@0.24.2':
+ resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@esbuild/freebsd-arm64@0.24.2':
+ resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@esbuild/freebsd-x64@0.24.2':
+ resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@esbuild/linux-arm64@0.24.2':
+ resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@esbuild/linux-arm@0.24.2':
+ resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [linux]
+
+ '@esbuild/linux-ia32@0.24.2':
+ resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [linux]
+
+ '@esbuild/linux-loong64@0.24.2':
+ resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==}
+ engines: {node: '>=18'}
+ cpu: [loong64]
+ os: [linux]
+
+ '@esbuild/linux-mips64el@0.24.2':
+ resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==}
+ engines: {node: '>=18'}
+ cpu: [mips64el]
+ os: [linux]
+
+ '@esbuild/linux-ppc64@0.24.2':
+ resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@esbuild/linux-riscv64@0.24.2':
+ resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==}
+ engines: {node: '>=18'}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@esbuild/linux-s390x@0.24.2':
+ resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==}
+ engines: {node: '>=18'}
+ cpu: [s390x]
+ os: [linux]
+
+ '@esbuild/linux-x64@0.24.2':
+ resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [linux]
+
+ '@esbuild/netbsd-arm64@0.24.2':
+ resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [netbsd]
+
+ '@esbuild/netbsd-x64@0.24.2':
+ resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [netbsd]
+
+ '@esbuild/openbsd-arm64@0.24.2':
+ resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openbsd]
+
+ '@esbuild/openbsd-x64@0.24.2':
+ resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@esbuild/sunos-x64@0.24.2':
+ resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [sunos]
+
+ '@esbuild/win32-arm64@0.24.2':
+ resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@esbuild/win32-ia32@0.24.2':
+ resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@esbuild/win32-x64@0.24.2':
+ resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [win32]
+
+ '@eslint-community/eslint-utils@4.4.1':
+ resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+
+ '@eslint-community/regexpp@4.12.1':
+ resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==}
+ engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+
+ '@eslint/config-array@0.19.1':
+ resolution: {integrity: sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/core@0.10.0':
+ resolution: {integrity: sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/eslintrc@3.2.0':
+ resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/js@9.19.0':
+ resolution: {integrity: sha512-rbq9/g38qjfqFLOVPvwjIvFFdNziEC5S65jmjPw5r6A//QH+W91akh9irMwjDN8zKUTak6W9EsAv4m/7Wnw0UQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/object-schema@2.1.5':
+ resolution: {integrity: sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@eslint/plugin-kit@0.2.5':
+ resolution: {integrity: sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@expressive-code/core@0.40.1':
+ resolution: {integrity: sha512-j71gxBepyzBgOtZomxzl8M90AjILf6hZarWFePDis7sTjqCwxWrtZEtTCafto8IOURG/ECZN0g7Ys4zExkNU7Q==}
+
+ '@expressive-code/plugin-frames@0.40.1':
+ resolution: {integrity: sha512-qV7BIdTQ9nJ/eLHaJlzMvUq5aqAoZKO3PLFzBVop/q0d0m5rWpwWncIQ8qkufQDabmq2m38PRRWxKgx5FkJ2Rg==}
+
+ '@expressive-code/plugin-shiki@0.40.1':
+ resolution: {integrity: sha512-N5oXhLv5DwLGXmLwJtwMzrfnZPWJl4pHRR5mfDoqK1+NxptdVaaQ0nEjgw13Y5ID/O5Bbze5YcOyph2K52BBrQ==}
+
+ '@expressive-code/plugin-text-markers@0.40.1':
+ resolution: {integrity: sha512-LsirF7M4F2yWgrFXEocD74F/MaVXsOsHVsRxBLhXQJemSSkWkDp/EZPt//OaqQ8ExnqWZ2lH7E1/KiN46unKjg==}
+
+ '@gerrit0/mini-shiki@1.27.0':
+ resolution: {integrity: sha512-nFZkbq4/wU+GxkyJVrXeMIS9SEcHI1HzJtK3EDtMQy16nNs1LNaI0dZTLAP2EuK/QSTYLo/Zaabm6Phxlmra1A==}
+
+ '@humanfs/core@0.19.1':
+ resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanfs/node@0.16.6':
+ resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==}
+ engines: {node: '>=18.18.0'}
+
+ '@humanwhocodes/module-importer@1.0.1':
+ resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
+ engines: {node: '>=12.22'}
+
+ '@humanwhocodes/retry@0.3.1':
+ resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==}
+ engines: {node: '>=18.18'}
+
+ '@humanwhocodes/retry@0.4.1':
+ resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==}
+ engines: {node: '>=18.18'}
+
+ '@img/sharp-darwin-arm64@0.33.5':
+ resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@img/sharp-darwin-x64@0.33.5':
+ resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [darwin]
+
+ '@img/sharp-libvips-darwin-arm64@1.0.4':
+ resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@img/sharp-libvips-darwin-x64@1.0.4':
+ resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@img/sharp-libvips-linux-arm64@1.0.4':
+ resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@img/sharp-libvips-linux-arm@1.0.5':
+ resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==}
+ cpu: [arm]
+ os: [linux]
+
+ '@img/sharp-libvips-linux-s390x@1.0.4':
+ resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==}
+ cpu: [s390x]
+ os: [linux]
+
+ '@img/sharp-libvips-linux-x64@1.0.4':
+ resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==}
+ cpu: [x64]
+ os: [linux]
+
+ '@img/sharp-libvips-linuxmusl-arm64@1.0.4':
+ resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@img/sharp-libvips-linuxmusl-x64@1.0.4':
+ resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==}
+ cpu: [x64]
+ os: [linux]
+
+ '@img/sharp-linux-arm64@0.33.5':
+ resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [linux]
+
+ '@img/sharp-linux-arm@0.33.5':
+ resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm]
+ os: [linux]
+
+ '@img/sharp-linux-s390x@0.33.5':
+ resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [s390x]
+ os: [linux]
+
+ '@img/sharp-linux-x64@0.33.5':
+ resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [linux]
+
+ '@img/sharp-linuxmusl-arm64@0.33.5':
+ resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [arm64]
+ os: [linux]
+
+ '@img/sharp-linuxmusl-x64@0.33.5':
+ resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [linux]
+
+ '@img/sharp-wasm32@0.33.5':
+ resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [wasm32]
+
+ '@img/sharp-win32-ia32@0.33.5':
+ resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [ia32]
+ os: [win32]
+
+ '@img/sharp-win32-x64@0.33.5':
+ resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+ cpu: [x64]
+ os: [win32]
+
+ '@inquirer/checkbox@4.0.6':
+ resolution: {integrity: sha512-PgP35JfmGjHU0LSXOyRew0zHuA9N6OJwOlos1fZ20b7j8ISeAdib3L+n0jIxBtX958UeEpte6xhG/gxJ5iUqMw==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+
+ '@inquirer/confirm@5.1.3':
+ resolution: {integrity: sha512-fuF9laMmHoOgWapF9h9hv6opA5WvmGFHsTYGCmuFxcghIhEhb3dN0CdQR4BUMqa2H506NCj8cGX4jwMsE4t6dA==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+
+ '@inquirer/core@10.1.4':
+ resolution: {integrity: sha512-5y4/PUJVnRb4bwWY67KLdebWOhOc7xj5IP2J80oWXa64mVag24rwQ1VAdnj7/eDY/odhguW0zQ1Mp1pj6fO/2w==}
+ engines: {node: '>=18'}
+
+ '@inquirer/editor@4.2.3':
+ resolution: {integrity: sha512-S9KnIOJuTZpb9upeRSBBhoDZv7aSV3pG9TECrBj0f+ZsFwccz886hzKBrChGrXMJwd4NKY+pOA9Vy72uqnd6Eg==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+
+ '@inquirer/expand@4.0.6':
+ resolution: {integrity: sha512-TRTfi1mv1GeIZGyi9PQmvAaH65ZlG4/FACq6wSzs7Vvf1z5dnNWsAAXBjWMHt76l+1hUY8teIqJFrWBk5N6gsg==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+
+ '@inquirer/figures@1.0.9':
+ resolution: {integrity: sha512-BXvGj0ehzrngHTPTDqUoDT3NXL8U0RxUk2zJm2A66RhCEIWdtU1v6GuUqNAgArW4PQ9CinqIWyHdQgdwOj06zQ==}
+ engines: {node: '>=18'}
+
+ '@inquirer/input@4.1.3':
+ resolution: {integrity: sha512-zeo++6f7hxaEe7OjtMzdGZPHiawsfmCZxWB9X1NpmYgbeoyerIbWemvlBxxl+sQIlHC0WuSAG19ibMq3gbhaqQ==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+
+ '@inquirer/number@3.0.6':
+ resolution: {integrity: sha512-xO07lftUHk1rs1gR0KbqB+LJPhkUNkyzV/KhH+937hdkMazmAYHLm1OIrNKpPelppeV1FgWrgFDjdUD8mM+XUg==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+
+ '@inquirer/password@4.0.6':
+ resolution: {integrity: sha512-QLF0HmMpHZPPMp10WGXh6F+ZPvzWE7LX6rNoccdktv/Rov0B+0f+eyXkAcgqy5cH9V+WSpbLxu2lo3ysEVK91w==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+
+ '@inquirer/prompts@7.2.3':
+ resolution: {integrity: sha512-hzfnm3uOoDySDXfDNOm9usOuYIaQvTgKp/13l1uJoe6UNY+Zpcn2RYt0jXz3yA+yemGHvDOxVzqWl3S5sQq53Q==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+
+ '@inquirer/rawlist@4.0.6':
+ resolution: {integrity: sha512-QoE4s1SsIPx27FO4L1b1mUjVcoHm1pWE/oCmm4z/Hl+V1Aw5IXl8FYYzGmfXaBT0l/sWr49XmNSiq7kg3Kd/Lg==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+
+ '@inquirer/search@3.0.6':
+ resolution: {integrity: sha512-eFZ2hiAq0bZcFPuFFBmZEtXU1EarHLigE+ENCtpO+37NHCl4+Yokq1P/d09kUblObaikwfo97w+0FtG/EXl5Ng==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+
+ '@inquirer/select@4.0.6':
+ resolution: {integrity: sha512-yANzIiNZ8fhMm4NORm+a74+KFYHmf7BZphSOBovIzYPVLquseTGEkU5l2UTnBOf5k0VLmTgPighNDLE9QtbViQ==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+
+ '@inquirer/type@3.0.2':
+ resolution: {integrity: sha512-ZhQ4TvhwHZF+lGhQ2O/rsjo80XoZR5/5qhOY3t6FJuX5XBg5Be8YzYTvaUGJnc12AUGI2nr4QSUE4PhKSigx7g==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+
+ '@isaacs/cliui@8.0.2':
+ resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
+ engines: {node: '>=12'}
+
+ '@istanbuljs/load-nyc-config@1.1.0':
+ resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==}
+ engines: {node: '>=8'}
+
+ '@istanbuljs/schema@0.1.3':
+ resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==}
+ engines: {node: '>=8'}
+
+ '@jest/environment@29.7.0':
+ resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ '@jest/expect-utils@29.7.0':
+ resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ '@jest/expect@29.7.0':
+ resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ '@jest/fake-timers@29.7.0':
+ resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ '@jest/globals@29.7.0':
+ resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ '@jest/schemas@29.6.3':
+ resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ '@jest/transform@29.7.0':
+ resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ '@jest/types@29.6.3':
+ resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ '@jridgewell/gen-mapping@0.3.8':
+ resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/resolve-uri@3.1.2':
+ resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/set-array@1.2.1':
+ resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/sourcemap-codec@1.5.0':
+ resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
+
+ '@jridgewell/trace-mapping@0.3.25':
+ resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
+
+ '@kwsites/file-exists@1.1.1':
+ resolution: {integrity: sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==}
+
+ '@kwsites/promise-deferred@1.1.1':
+ resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==}
+
+ '@mdx-js/mdx@3.1.0':
+ resolution: {integrity: sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==}
+
+ '@microsoft/api-extractor-model@7.29.4':
+ resolution: {integrity: sha512-LHOMxmT8/tU1IiiiHOdHFF83Qsi+V8d0kLfscG4EvQE9cafiR8blOYr8SfkQKWB1wgEilQgXJX3MIA4vetDLZw==}
+
+ '@microsoft/api-extractor@7.47.4':
+ resolution: {integrity: sha512-HKm+P4VNzWwvq1Ey+Jfhhj/3MjsD+ka2hbt8L5AcRM95lu1MFOYnz3XlU7Gr79Q/ZhOb7W/imAKeYrOI0bFydg==}
+ hasBin: true
+
+ '@microsoft/tsdoc-config@0.17.1':
+ resolution: {integrity: sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==}
+
+ '@microsoft/tsdoc@0.15.1':
+ resolution: {integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==}
+
+ '@napi-rs/wasm-runtime@0.2.4':
+ resolution: {integrity: sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==}
+
+ '@nodelib/fs.scandir@2.1.5':
+ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.scandir@4.0.1':
+ resolution: {integrity: sha512-vAkI715yhnmiPupY+dq+xenu5Tdf2TBQ66jLvBIcCddtz+5Q8LbMKaf9CIJJreez8fQ8fgaY+RaywQx8RJIWpw==}
+ engines: {node: '>=18.18.0'}
+
+ '@nodelib/fs.stat@2.0.5':
+ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.stat@4.0.0':
+ resolution: {integrity: sha512-ctr6bByzksKRCV0bavi8WoQevU6plSp2IkllIsEqaiKe2mwNNnaluhnRhcsgGZHrrHk57B3lf95MkLMO3STYcg==}
+ engines: {node: '>=18.18.0'}
+
+ '@nodelib/fs.walk@1.2.8':
+ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.walk@3.0.1':
+ resolution: {integrity: sha512-nIh/M6Kh3ZtOmlY00DaUYB4xeeV6F3/ts1l29iwl3/cfyY/OuCfUx+v08zgx8TKPTifXRcjjqVQ4KB2zOYSbyw==}
+ engines: {node: '>=18.18.0'}
+
+ '@nx/nx-darwin-arm64@20.3.3':
+ resolution: {integrity: sha512-4C7ShMrqp1vbH1ZgvSlkt0f35hJcqKtRcf8n/tCck46rnMkj4egXi3K1dE6uQcOorwiD1ttAr0DHcI1TTqcNXw==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@nx/nx-darwin-x64@20.3.3':
+ resolution: {integrity: sha512-OUtJ7gA09pJC+a+RcZf1bGbMM4T7a/IcPb97z1xOoxr5Wm2s8BGBQUW2CKJ5gCp5iI1pGo44F12u0G9gbYClow==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@nx/nx-freebsd-x64@20.3.3':
+ resolution: {integrity: sha512-q4SABgKYWPGOcdfRZne6n8HF4CzltRL5nJ3q093jQAUO93yPXtWzhQBaKZIZr6aPoqq0/NuH6xY4gNo4w9F8Bg==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@nx/nx-linux-arm-gnueabihf@20.3.3':
+ resolution: {integrity: sha512-e07PJcVsBT/Aelo/Vj6hLplDZamGCZ3zOJpW3XVBhdG4DC4sn+jodsdrIASoEpmF70VB89lzQsm9GrAgQPaWOA==}
+ engines: {node: '>= 10'}
+ cpu: [arm]
+ os: [linux]
+
+ '@nx/nx-linux-arm64-gnu@20.3.3':
+ resolution: {integrity: sha512-1Z9chlN0/hWzliMer7TvdLT8cb6BKpGjZ15a+rQuUbO/CyLhY21Ct+lXtnaBERnNPYJpNOJlrbBDuF/9wpZ4CQ==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@nx/nx-linux-arm64-musl@20.3.3':
+ resolution: {integrity: sha512-RrLgujPU5NfDrsDRa7Y2isxGb8XkoQeJkTMUl1xmBK2Qnf4jAUn0PH0ULWrRMNgChi4nYUTn/Sf+2m6Uyoqcfw==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@nx/nx-linux-x64-gnu@20.3.3':
+ resolution: {integrity: sha512-/WmCnPxv1eR8tyYiFp4XoMbcXrJ8a/OIw1rpZZ5ceMKgH8lPaF2/KFf04JZZygrCKletEdqqIojBXz4AHoaueQ==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+
+ '@nx/nx-linux-x64-musl@20.3.3':
+ resolution: {integrity: sha512-y4BJsR0fgJrXY3P7GkWfUZAeQEHMTXvaRHvzJfBSBPmnVcVZDYNTfEQYnslp8m8ahKdlJwtflxzykJ4Bwf55fw==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+
+ '@nx/nx-win32-arm64-msvc@20.3.3':
+ resolution: {integrity: sha512-BHqZitBaGT9ybv386B5QKxP5N66+xpTiYlKClzQ44o6Ca8QxnkugI64exBdcQyj+DRiL6HJhN14kaPJ1KrsKRA==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@nx/nx-win32-x64-msvc@20.3.3':
+ resolution: {integrity: sha512-6HcbAKghEypt4aMAoDjPn2sa6FG0MyiDabpV/cVLKokK09ngyy6qQDa5vSCUSDwI542XBxqtcv0AcZi7Ez+XUQ==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [win32]
+
+ '@oslojs/encoding@1.1.0':
+ resolution: {integrity: sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==}
+
+ '@pagefind/darwin-arm64@1.3.0':
+ resolution: {integrity: sha512-365BEGl6ChOsauRjyVpBjXybflXAOvoMROw3TucAROHIcdBvXk9/2AmEvGFU0r75+vdQI4LJdJdpH4Y6Yqaj4A==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@pagefind/darwin-x64@1.3.0':
+ resolution: {integrity: sha512-zlGHA23uuXmS8z3XxEGmbHpWDxXfPZ47QS06tGUq0HDcZjXjXHeLG+cboOy828QIV5FXsm9MjfkP5e4ZNbOkow==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@pagefind/default-ui@1.3.0':
+ resolution: {integrity: sha512-CGKT9ccd3+oRK6STXGgfH+m0DbOKayX6QGlq38TfE1ZfUcPc5+ulTuzDbZUnMo+bubsEOIypm4Pl2iEyzZ1cNg==}
+
+ '@pagefind/linux-arm64@1.3.0':
+ resolution: {integrity: sha512-8lsxNAiBRUk72JvetSBXs4WRpYrQrVJXjlRRnOL6UCdBN9Nlsz0t7hWstRk36+JqHpGWOKYiuHLzGYqYAqoOnQ==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@pagefind/linux-x64@1.3.0':
+ resolution: {integrity: sha512-hAvqdPJv7A20Ucb6FQGE6jhjqy+vZ6pf+s2tFMNtMBG+fzcdc91uTw7aP/1Vo5plD0dAOHwdxfkyw0ugal4kcQ==}
+ cpu: [x64]
+ os: [linux]
+
+ '@pagefind/windows-x64@1.3.0':
+ resolution: {integrity: sha512-BR1bIRWOMqkf8IoU576YDhij1Wd/Zf2kX/kCI0b2qzCKC8wcc2GQJaaRMCpzvCCrmliO4vtJ6RITp/AnoYUUmQ==}
+ cpu: [x64]
+ os: [win32]
+
+ '@pkgjs/parseargs@0.11.0':
+ resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
+ engines: {node: '>=14'}
+
+ '@publint/pack@0.1.1':
+ resolution: {integrity: sha512-TvCl79Y8v18ZhFGd5mjO1kYPovSBq3+4LVCi5Nfl1JI8fS8i8kXbgQFGwBJRXczim8GlW8c2LMBKTtExYXOy/A==}
+ engines: {node: '>=18'}
+
+ '@rollup/pluginutils@5.1.4':
+ resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
+ peerDependenciesMeta:
+ rollup:
+ optional: true
+
+ '@rollup/rollup-android-arm-eabi@4.32.0':
+ resolution: {integrity: sha512-G2fUQQANtBPsNwiVFg4zKiPQyjVKZCUdQUol53R8E71J7AsheRMV/Yv/nB8giOcOVqP7//eB5xPqieBYZe9bGg==}
+ cpu: [arm]
+ os: [android]
+
+ '@rollup/rollup-android-arm64@4.32.0':
+ resolution: {integrity: sha512-qhFwQ+ljoymC+j5lXRv8DlaJYY/+8vyvYmVx074zrLsu5ZGWYsJNLjPPVJJjhZQpyAKUGPydOq9hRLLNvh1s3A==}
+ cpu: [arm64]
+ os: [android]
+
+ '@rollup/rollup-darwin-arm64@4.32.0':
+ resolution: {integrity: sha512-44n/X3lAlWsEY6vF8CzgCx+LQaoqWGN7TzUfbJDiTIOjJm4+L2Yq+r5a8ytQRGyPqgJDs3Rgyo8eVL7n9iW6AQ==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@rollup/rollup-darwin-x64@4.32.0':
+ resolution: {integrity: sha512-F9ct0+ZX5Np6+ZDztxiGCIvlCaW87HBdHcozUfsHnj1WCUTBUubAoanhHUfnUHZABlElyRikI0mgcw/qdEm2VQ==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@rollup/rollup-freebsd-arm64@4.32.0':
+ resolution: {integrity: sha512-JpsGxLBB2EFXBsTLHfkZDsXSpSmKD3VxXCgBQtlPcuAqB8TlqtLcbeMhxXQkCDv1avgwNjF8uEIbq5p+Cee0PA==}
+ cpu: [arm64]
+ os: [freebsd]
+
+ '@rollup/rollup-freebsd-x64@4.32.0':
+ resolution: {integrity: sha512-wegiyBT6rawdpvnD9lmbOpx5Sph+yVZKHbhnSP9MqUEDX08G4UzMU+D87jrazGE7lRSyTRs6NEYHtzfkJ3FjjQ==}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.32.0':
+ resolution: {integrity: sha512-3pA7xecItbgOs1A5H58dDvOUEboG5UfpTq3WzAdF54acBbUM+olDJAPkgj1GRJ4ZqE12DZ9/hNS2QZk166v92A==}
+ cpu: [arm]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm-musleabihf@4.32.0':
+ resolution: {integrity: sha512-Y7XUZEVISGyge51QbYyYAEHwpGgmRrAxQXO3siyYo2kmaj72USSG8LtlQQgAtlGfxYiOwu+2BdbPjzEpcOpRmQ==}
+ cpu: [arm]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm64-gnu@4.32.0':
+ resolution: {integrity: sha512-r7/OTF5MqeBrZo5omPXcTnjvv1GsrdH8a8RerARvDFiDwFpDVDnJyByYM/nX+mvks8XXsgPUxkwe/ltaX2VH7w==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rollup/rollup-linux-arm64-musl@4.32.0':
+ resolution: {integrity: sha512-HJbifC9vex9NqnlodV2BHVFNuzKL5OnsV2dvTw6e1dpZKkNjPG6WUq+nhEYV6Hv2Bv++BXkwcyoGlXnPrjAKXw==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rollup/rollup-linux-loongarch64-gnu@4.32.0':
+ resolution: {integrity: sha512-VAEzZTD63YglFlWwRj3taofmkV1V3xhebDXffon7msNz4b14xKsz7utO6F8F4cqt8K/ktTl9rm88yryvDpsfOw==}
+ cpu: [loong64]
+ os: [linux]
+
+ '@rollup/rollup-linux-powerpc64le-gnu@4.32.0':
+ resolution: {integrity: sha512-Sts5DST1jXAc9YH/iik1C9QRsLcCoOScf3dfbY5i4kH9RJpKxiTBXqm7qU5O6zTXBTEZry69bGszr3SMgYmMcQ==}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@rollup/rollup-linux-riscv64-gnu@4.32.0':
+ resolution: {integrity: sha512-qhlXeV9AqxIyY9/R1h1hBD6eMvQCO34ZmdYvry/K+/MBs6d1nRFLm6BOiITLVI+nFAAB9kUB6sdJRKyVHXnqZw==}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@rollup/rollup-linux-s390x-gnu@4.32.0':
+ resolution: {integrity: sha512-8ZGN7ExnV0qjXa155Rsfi6H8M4iBBwNLBM9lcVS+4NcSzOFaNqmt7djlox8pN1lWrRPMRRQ8NeDlozIGx3Omsw==}
+ cpu: [s390x]
+ os: [linux]
+
+ '@rollup/rollup-linux-x64-gnu@4.32.0':
+ resolution: {integrity: sha512-VDzNHtLLI5s7xd/VubyS10mq6TxvZBp+4NRWoW+Hi3tgV05RtVm4qK99+dClwTN1McA6PHwob6DEJ6PlXbY83A==}
+ cpu: [x64]
+ os: [linux]
+
+ '@rollup/rollup-linux-x64-musl@4.32.0':
+ resolution: {integrity: sha512-qcb9qYDlkxz9DxJo7SDhWxTWV1gFuwznjbTiov289pASxlfGbaOD54mgbs9+z94VwrXtKTu+2RqwlSTbiOqxGg==}
+ cpu: [x64]
+ os: [linux]
+
+ '@rollup/rollup-win32-arm64-msvc@4.32.0':
+ resolution: {integrity: sha512-pFDdotFDMXW2AXVbfdUEfidPAk/OtwE/Hd4eYMTNVVaCQ6Yl8et0meDaKNL63L44Haxv4UExpv9ydSf3aSayDg==}
+ cpu: [arm64]
+ os: [win32]
+
+ '@rollup/rollup-win32-ia32-msvc@4.32.0':
+ resolution: {integrity: sha512-/TG7WfrCAjeRNDvI4+0AAMoHxea/USWhAzf9PVDFHbcqrQ7hMMKp4jZIy4VEjk72AAfN5k4TiSMRXRKf/0akSw==}
+ cpu: [ia32]
+ os: [win32]
+
+ '@rollup/rollup-win32-x64-msvc@4.32.0':
+ resolution: {integrity: sha512-5hqO5S3PTEO2E5VjCePxv40gIgyS2KvO7E7/vvC/NbIW4SIRamkMr1hqj+5Y67fbBWv/bQLB6KelBQmXlyCjWA==}
+ cpu: [x64]
+ os: [win32]
+
+ '@rushstack/node-core-library@5.5.1':
+ resolution: {integrity: sha512-ZutW56qIzH8xIOlfyaLQJFx+8IBqdbVCZdnj+XT1MorQ1JqqxHse8vbCpEM+2MjsrqcbxcgDIbfggB1ZSQ2A3g==}
+ peerDependencies:
+ '@types/node': '*'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@rushstack/rig-package@0.5.3':
+ resolution: {integrity: sha512-olzSSjYrvCNxUFZowevC3uz8gvKr3WTpHQ7BkpjtRpA3wK+T0ybep/SRUMfr195gBzJm5gaXw0ZMgjIyHqJUow==}
+
+ '@rushstack/terminal@0.13.3':
+ resolution: {integrity: sha512-fc3zjXOw8E0pXS5t9vTiIPx9gHA0fIdTXsu9mT4WbH+P3mYvnrX0iAQ5a6NvyK1+CqYWBTw/wVNx7SDJkI+WYQ==}
+ peerDependencies:
+ '@types/node': '*'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
+ '@rushstack/ts-command-line@4.22.3':
+ resolution: {integrity: sha512-edMpWB3QhFFZ4KtSzS8WNjBgR4PXPPOVrOHMbb7kNpmQ1UFS9HdVtjCXg1H5fG+xYAbeE+TMPcVPUyX2p84STA==}
+
+ '@shikijs/core@1.29.1':
+ resolution: {integrity: sha512-Mo1gGGkuOYjDu5H8YwzmOuly9vNr8KDVkqj9xiKhhhFS8jisAtDSEWB9hzqRHLVQgFdA310e8XRJcW4tYhRB2A==}
+
+ '@shikijs/engine-javascript@1.29.1':
+ resolution: {integrity: sha512-Hpi8k9x77rCQ7F/7zxIOUruNkNidMyBnP5qAGbLFqg4kRrg1HZhkB8btib5EXbQWTtLb5gBHOdBwshk20njD7Q==}
+
+ '@shikijs/engine-oniguruma@1.27.2':
+ resolution: {integrity: sha512-FZYKD1KN7srvpkz4lbGLOYWlyDU4Rd+2RtuKfABTkafAPOFr+J6umfIwY/TzOQqfNtWjL7SAwPAO0dcOraRLaQ==}
+
+ '@shikijs/engine-oniguruma@1.29.1':
+ resolution: {integrity: sha512-gSt2WhLNgEeLstcweQOSp+C+MhOpTsgdNXRqr3zP6M+BUBZ8Md9OU2BYwUYsALBxHza7hwaIWtFHjQ/aOOychw==}
+
+ '@shikijs/langs@1.29.1':
+ resolution: {integrity: sha512-iERn4HlyuT044/FgrvLOaZgKVKf3PozjKjyV/RZ5GnlyYEAZFcgwHGkYboeBv2IybQG1KVS/e7VGgiAU4JY2Gw==}
+
+ '@shikijs/themes@1.29.1':
+ resolution: {integrity: sha512-lb11zf72Vc9uxkl+aec2oW1HVTHJ2LtgZgumb4Rr6By3y/96VmlU44bkxEb8WBWH3RUtbqAJEN0jljD9cF7H7g==}
+
+ '@shikijs/types@1.27.2':
+ resolution: {integrity: sha512-DM9OWUyjmdYdnKDpaGB/GEn9XkToyK1tqxuqbmc5PV+5K8WjjwfygL3+cIvbkSw2v1ySwHDgqATq/+98pJ4Kyg==}
+
+ '@shikijs/types@1.29.1':
+ resolution: {integrity: sha512-aBqAuhYRp5vSir3Pc9+QPu9WESBOjUo03ao0IHLC4TyTioSsp/SkbAZSrIH4ghYYC1T1KTEpRSBa83bas4RnPA==}
+
+ '@shikijs/vscode-textmate@10.0.1':
+ resolution: {integrity: sha512-fTIQwLF+Qhuws31iw7Ncl1R3HUDtGwIipiJ9iU+UsDUwMhegFcQKQHd51nZjb7CArq0MvON8rbgCGQYWHUKAdg==}
+
+ '@sinclair/typebox@0.27.8':
+ resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==}
+
+ '@sinonjs/commons@3.0.1':
+ resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==}
+
+ '@sinonjs/fake-timers@10.3.0':
+ resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==}
+
+ '@snyk/github-codeowners@1.1.0':
+ resolution: {integrity: sha512-lGFf08pbkEac0NYgVf4hdANpAgApRjNByLXB+WBip3qj1iendOIyAwP2GKkKbQMNVy2r1xxDf0ssfWscoiC+Vw==}
+ engines: {node: '>=8.10'}
+ hasBin: true
+
+ '@stylistic/eslint-plugin-js@2.13.0':
+ resolution: {integrity: sha512-GPPDK4+fcbsQD58a3abbng2Dx+jBoxM5cnYjBM4T24WFZRZdlNSKvR19TxP8CPevzMOodQ9QVzNeqWvMXzfJRA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: '>=8.40.0'
+
+ '@tanstack/config@0.16.1':
+ resolution: {integrity: sha512-GLt1xyQCGRty58N2jv0ONouv8OU46FjkbcSSTiAKwydcX+JycZ7FCLWt05lefrvuV8Eay0eNuN0sYUemObZLEA==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ '@tybys/wasm-util@0.9.0':
+ resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==}
+
+ '@types/acorn@4.0.6':
+ resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==}
+
+ '@types/argparse@1.0.38':
+ resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==}
+
+ '@types/babel__code-frame@7.0.6':
+ resolution: {integrity: sha512-Anitqkl3+KrzcW2k77lRlg/GfLZLWXBuNgbEcIOU6M92yw42vsd3xV/Z/yAHEj8m+KUjL6bWOVOFqX8PFPJ4LA==}
+
+ '@types/babel__core@7.20.5':
+ resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
+
+ '@types/babel__generator@7.6.8':
+ resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==}
+
+ '@types/babel__template@7.4.4':
+ resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==}
+
+ '@types/babel__traverse@7.20.6':
+ resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==}
+
+ '@types/conventional-commits-parser@5.0.1':
+ resolution: {integrity: sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==}
+
+ '@types/cookie@0.6.0':
+ resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==}
+
+ '@types/debug@4.1.12':
+ resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==}
+
+ '@types/doctrine@0.0.9':
+ resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==}
+
+ '@types/estree-jsx@1.0.5':
+ resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==}
+
+ '@types/estree@1.0.6':
+ resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==}
+
+ '@types/graceful-fs@4.1.9':
+ resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==}
+
+ '@types/hast@3.0.4':
+ resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==}
+
+ '@types/inquirer@9.0.7':
+ resolution: {integrity: sha512-Q0zyBupO6NxGRZut/JdmqYKOnN95Eg5V8Csg3PGKkP+FnvsUZx1jAyK7fztIszxxMuoBA6E3KXWvdZVXIpx60g==}
+
+ '@types/istanbul-lib-coverage@2.0.6':
+ resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==}
+
+ '@types/istanbul-lib-report@3.0.3':
+ resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==}
+
+ '@types/istanbul-reports@3.0.4':
+ resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==}
+
+ '@types/js-yaml@4.0.9':
+ resolution: {integrity: sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==}
+
+ '@types/json-schema@7.0.15':
+ resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+
+ '@types/mdast@4.0.4':
+ resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==}
+
+ '@types/mdx@2.0.13':
+ resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==}
+
+ '@types/ms@2.1.0':
+ resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==}
+
+ '@types/nlcst@2.0.3':
+ resolution: {integrity: sha512-vSYNSDe6Ix3q+6Z7ri9lyWqgGhJTmzRjZRqyq15N0Z/1/UnVsno9G/N40NBijoYx2seFDIl0+B2mgAb9mezUCA==}
+
+ '@types/node@17.0.45':
+ resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==}
+
+ '@types/node@22.10.10':
+ resolution: {integrity: sha512-X47y/mPNzxviAGY5TcYPtYL8JsY3kAq2n8fMmKoRCxq/c4v4pyGNCzM2R6+M5/umG4ZfHuT+sgqDYqWc9rJ6ww==}
+
+ '@types/react-dom@19.0.3':
+ resolution: {integrity: sha512-0Knk+HJiMP/qOZgMyNFamlIjw9OFCsyC2ZbigmEEyXXixgre6IQpm/4V+r3qH4GC1JPvRJKInw+on2rV6YZLeA==}
+ peerDependencies:
+ '@types/react': ^19.0.0
+
+ '@types/react@19.0.8':
+ resolution: {integrity: sha512-9P/o1IGdfmQxrujGbIMDyYaaCykhLKc0NGCtYcECNUr9UAaDe4gwvV9bR6tvd5Br1SG0j+PBpbKr2UYY8CwqSw==}
+
+ '@types/sax@1.2.7':
+ resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==}
+
+ '@types/stack-utils@2.0.3':
+ resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==}
+
+ '@types/through@0.0.33':
+ resolution: {integrity: sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==}
+
+ '@types/unist@2.0.11':
+ resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==}
+
+ '@types/unist@3.0.3':
+ resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
+
+ '@types/yargs-parser@21.0.3':
+ resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==}
+
+ '@types/yargs@17.0.33':
+ resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==}
+
+ '@typescript-eslint/eslint-plugin@8.20.0':
+ resolution: {integrity: sha512-naduuphVw5StFfqp4Gq4WhIBE2gN1GEmMUExpJYknZJdRnc+2gDzB8Z3+5+/Kv33hPQRDGzQO/0opHE72lZZ6A==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <5.8.0'
+
+ '@typescript-eslint/parser@8.20.0':
+ resolution: {integrity: sha512-gKXG7A5HMyjDIedBi6bUrDcun8GIjnI8qOwVLiY3rx6T/sHP/19XLJOnIq/FgQvWLHja5JN/LSE7eklNBr612g==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <5.8.0'
+
+ '@typescript-eslint/scope-manager@8.20.0':
+ resolution: {integrity: sha512-J7+VkpeGzhOt3FeG1+SzhiMj9NzGD/M6KoGn9f4dbz3YzK9hvbhVTmLj/HiTp9DazIzJ8B4XcM80LrR9Dm1rJw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@typescript-eslint/type-utils@8.20.0':
+ resolution: {integrity: sha512-bPC+j71GGvA7rVNAHAtOjbVXbLN5PkwqMvy1cwGeaxUoRQXVuKCebRoLzm+IPW/NtFFpstn1ummSIasD5t60GA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <5.8.0'
+
+ '@typescript-eslint/types@8.20.0':
+ resolution: {integrity: sha512-cqaMiY72CkP+2xZRrFt3ExRBu0WmVitN/rYPZErA80mHjHx/Svgp8yfbzkJmDoQ/whcytOPO9/IZXnOc+wigRA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@typescript-eslint/typescript-estree@8.20.0':
+ resolution: {integrity: sha512-Y7ncuy78bJqHI35NwzWol8E0X7XkRVS4K4P4TCyzWkOJih5NDvtoRDW4Ba9YJJoB2igm9yXDdYI/+fkiiAxPzA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ typescript: '>=4.8.4 <5.8.0'
+
+ '@typescript-eslint/utils@8.20.0':
+ resolution: {integrity: sha512-dq70RUw6UK9ei7vxc4KQtBRk7qkHZv447OUZ6RPQMQl71I3NZxQJX/f32Smr+iqWrB02pHKn2yAdHBb0KNrRMA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <5.8.0'
+
+ '@typescript-eslint/visitor-keys@8.20.0':
+ resolution: {integrity: sha512-v/BpkeeYAsPkKCkR8BDwcno0llhzWVqPOamQrAEMdpZav2Y9OVjd9dwJyBLJWwf335B5DmlifECIkZRJCaGaHA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ '@ungap/structured-clone@1.3.0':
+ resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==}
+
+ '@vitejs/plugin-react@4.3.4':
+ resolution: {integrity: sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ peerDependencies:
+ vite: ^4.2.0 || ^5.0.0 || ^6.0.0
+
+ '@vitest/coverage-istanbul@3.0.4':
+ resolution: {integrity: sha512-a+SgPMom0PlRTuDasoucL2V7FDpS8j7p6jpHLNgt3d7oOSWYwtAFVCfZ3iQ+a+cOnh76g4mOftVR5Y9HokB/GQ==}
+ peerDependencies:
+ vitest: 3.0.4
+
+ '@vitest/expect@3.0.4':
+ resolution: {integrity: sha512-Nm5kJmYw6P2BxhJPkO3eKKhGYKRsnqJqf+r0yOGRKpEP+bSCBDsjXgiu1/5QFrnPMEgzfC38ZEjvCFgaNBC0Eg==}
+
+ '@vitest/mocker@3.0.4':
+ resolution: {integrity: sha512-gEef35vKafJlfQbnyOXZ0Gcr9IBUsMTyTLXsEQwuyYAerpHqvXhzdBnDFuHLpFqth3F7b6BaFr4qV/Cs1ULx5A==}
+ peerDependencies:
+ msw: ^2.4.9
+ vite: ^5.0.0 || ^6.0.0
+ peerDependenciesMeta:
+ msw:
+ optional: true
+ vite:
+ optional: true
+
+ '@vitest/pretty-format@3.0.4':
+ resolution: {integrity: sha512-ts0fba+dEhK2aC9PFuZ9LTpULHpY/nd6jhAQ5IMU7Gaj7crPCTdCFfgvXxruRBLFS+MLraicCuFXxISEq8C93g==}
+
+ '@vitest/runner@3.0.4':
+ resolution: {integrity: sha512-dKHzTQ7n9sExAcWH/0sh1elVgwc7OJ2lMOBrAm73J7AH6Pf9T12Zh3lNE1TETZaqrWFXtLlx3NVrLRb5hCK+iw==}
+
+ '@vitest/snapshot@3.0.4':
+ resolution: {integrity: sha512-+p5knMLwIk7lTQkM3NonZ9zBewzVp9EVkVpvNta0/PlFWpiqLaRcF4+33L1it3uRUCh0BGLOaXPPGEjNKfWb4w==}
+
+ '@vitest/spy@3.0.4':
+ resolution: {integrity: sha512-sXIMF0oauYyUy2hN49VFTYodzEAu744MmGcPR3ZBsPM20G+1/cSW/n1U+3Yu/zHxX2bIDe1oJASOkml+osTU6Q==}
+
+ '@vitest/utils@3.0.4':
+ resolution: {integrity: sha512-8BqC1ksYsHtbWH+DfpOAKrFw3jl3Uf9J7yeFh85Pz52IWuh1hBBtyfEbRNNZNjl8H8A5yMLH9/t+k7HIKzQcZQ==}
+
+ '@volar/language-core@2.4.11':
+ resolution: {integrity: sha512-lN2C1+ByfW9/JRPpqScuZt/4OrUUse57GLI6TbLgTIqBVemdl1wNcZ1qYGEo2+Gw8coYLgCy7SuKqn6IrQcQgg==}
+
+ '@volar/source-map@2.4.11':
+ resolution: {integrity: sha512-ZQpmafIGvaZMn/8iuvCFGrW3smeqkq/IIh9F1SdSx9aUl0J4Iurzd6/FhmjNO5g2ejF3rT45dKskgXWiofqlZQ==}
+
+ '@volar/typescript@2.4.11':
+ resolution: {integrity: sha512-2DT+Tdh88Spp5PyPbqhyoYavYCPDsqbHLFwcUI9K1NlY1YgUJvujGdrqUp0zWxnW7KWNTr3xSpMuv2WnaTKDAw==}
+
+ '@vue/compiler-core@3.5.13':
+ resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==}
+
+ '@vue/compiler-dom@3.5.13':
+ resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==}
+
+ '@vue/compiler-vue2@2.7.16':
+ resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==}
+
+ '@vue/language-core@2.0.29':
+ resolution: {integrity: sha512-o2qz9JPjhdoVj8D2+9bDXbaI4q2uZTHQA/dbyZT4Bj1FR9viZxDJnLcKVHfxdn6wsOzRgpqIzJEEmSSvgMvDTQ==}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ '@vue/shared@3.5.13':
+ resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==}
+
+ '@yarnpkg/lockfile@1.1.0':
+ resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==}
+
+ '@yarnpkg/parsers@3.0.2':
+ resolution: {integrity: sha512-/HcYgtUSiJiot/XWGLOlGxPYUG65+/31V8oqk17vZLW1xlCoR4PampyePljOxY2n8/3jz9+tIFzICsyGujJZoA==}
+ engines: {node: '>=18.12.0'}
+
+ '@zkochan/js-yaml@0.0.7':
+ resolution: {integrity: sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==}
+ hasBin: true
+
+ JSONStream@1.3.5:
+ resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==}
+ hasBin: true
+
+ acorn-jsx@5.3.2:
+ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+ peerDependencies:
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+
+ acorn@8.14.0:
+ resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
+ aggregate-error@3.1.0:
+ resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==}
+ engines: {node: '>=8'}
+
+ ajv-draft-04@1.0.0:
+ resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==}
+ peerDependencies:
+ ajv: ^8.5.0
+ peerDependenciesMeta:
+ ajv:
+ optional: true
+
+ ajv-formats@3.0.1:
+ resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==}
+ peerDependencies:
+ ajv: ^8.0.0
+ peerDependenciesMeta:
+ ajv:
+ optional: true
+
+ ajv@6.12.6:
+ resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
+
+ ajv@8.12.0:
+ resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==}
+
+ ajv@8.13.0:
+ resolution: {integrity: sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==}
+
+ ansi-align@3.0.1:
+ resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==}
+
+ ansi-colors@4.1.3:
+ resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==}
+ engines: {node: '>=6'}
+
+ ansi-escapes@4.3.2:
+ resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
+ engines: {node: '>=8'}
+
+ ansi-regex@5.0.1:
+ resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+ engines: {node: '>=8'}
+
+ ansi-regex@6.1.0:
+ resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==}
+ engines: {node: '>=12'}
+
+ ansi-styles@4.3.0:
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+ engines: {node: '>=8'}
+
+ ansi-styles@5.2.0:
+ resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==}
+ engines: {node: '>=10'}
+
+ ansi-styles@6.2.1:
+ resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
+ engines: {node: '>=12'}
+
+ anymatch@3.1.3:
+ resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+ engines: {node: '>= 8'}
+
+ arg@5.0.2:
+ resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
+
+ argparse@1.0.10:
+ resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
+
+ argparse@2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+
+ aria-query@5.3.2:
+ resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==}
+ engines: {node: '>= 0.4'}
+
+ array-each@1.0.1:
+ resolution: {integrity: sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==}
+ engines: {node: '>=0.10.0'}
+
+ array-ify@1.0.0:
+ resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==}
+
+ array-iterate@2.0.1:
+ resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==}
+
+ array-slice@1.1.0:
+ resolution: {integrity: sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==}
+ engines: {node: '>=0.10.0'}
+
+ assertion-error@2.0.1:
+ resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
+ engines: {node: '>=12'}
+
+ astring@1.9.0:
+ resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==}
+ hasBin: true
+
+ astro-expressive-code@0.40.1:
+ resolution: {integrity: sha512-dQ47XhgtxuRTiKQrZOJKdebMuxvvTBR89U439EHzLP6KR45IILFlGDihGQp3//1aUjj4nwpbINSzms1heJ7vmQ==}
+ peerDependencies:
+ astro: ^4.0.0-beta || ^5.0.0-beta || ^3.3.0
+
+ astro@5.1.9:
+ resolution: {integrity: sha512-QB3MH7Ul3gEvmHXEfvPkGpTZyyB/TBKQbm0kTHpo0BTEB7BvaY+wrcWiGEJBVDpVdEAKY9fM3zrJ0c7hZSXVlw==}
+ engines: {node: ^18.17.1 || ^20.3.0 || >=22.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0'}
+ hasBin: true
+
+ asynckit@0.4.0:
+ resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
+
+ axios@1.7.9:
+ resolution: {integrity: sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==}
+
+ axobject-query@4.1.0:
+ resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==}
+ engines: {node: '>= 0.4'}
+
+ babel-plugin-istanbul@6.1.1:
+ resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==}
+ engines: {node: '>=8'}
+
+ babel-preset-current-node-syntax@1.1.0:
+ resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+
+ bail@2.0.2:
+ resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==}
+
+ balanced-match@1.0.2:
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
+ base-64@1.0.0:
+ resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==}
+
+ base64-js@1.5.1:
+ resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+
+ bcp-47-match@2.0.3:
+ resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==}
+
+ bcp-47@2.1.0:
+ resolution: {integrity: sha512-9IIS3UPrvIa1Ej+lVDdDwO7zLehjqsaByECw0bu2RRGP73jALm6FYbzI5gWbgHLvNdkvfXB5YrSbocZdOS0c0w==}
+
+ binary-extensions@2.3.0:
+ resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
+ engines: {node: '>=8'}
+
+ bl@4.1.0:
+ resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
+
+ boolbase@1.0.0:
+ resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
+
+ boxen@8.0.1:
+ resolution: {integrity: sha512-F3PH5k5juxom4xktynS7MoFY+NUWH5LC4CnH11YB8NPew+HLpmBLCybSAEyb2F+4pRXhuhWqFesoQd6DAyc2hw==}
+ engines: {node: '>=18'}
+
+ brace-expansion@1.1.11:
+ resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
+
+ brace-expansion@2.0.1:
+ resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
+
+ braces@3.0.3:
+ resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
+ engines: {node: '>=8'}
+
+ browserslist@4.24.4:
+ resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+
+ bser@2.1.1:
+ resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==}
+
+ buffer@5.7.1:
+ resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
+
+ cac@6.7.14:
+ resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
+ engines: {node: '>=8'}
+
+ callsites@3.1.0:
+ resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+ engines: {node: '>=6'}
+
+ camelcase@5.3.1:
+ resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
+ engines: {node: '>=6'}
+
+ camelcase@8.0.0:
+ resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==}
+ engines: {node: '>=16'}
+
+ caniuse-lite@1.0.30001692:
+ resolution: {integrity: sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==}
+
+ ccount@2.0.1:
+ resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
+
+ chai@5.1.2:
+ resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==}
+ engines: {node: '>=12'}
+
+ chalk@4.1.2:
+ resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+ engines: {node: '>=10'}
+
+ chalk@5.4.1:
+ resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==}
+ engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
+
+ character-entities-html4@2.1.0:
+ resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==}
+
+ character-entities-legacy@3.0.0:
+ resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==}
+
+ character-entities@2.0.2:
+ resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==}
+
+ character-reference-invalid@2.0.1:
+ resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==}
+
+ chardet@0.7.0:
+ resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==}
+
+ check-error@2.1.1:
+ resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==}
+ engines: {node: '>= 16'}
+
+ chokidar@3.6.0:
+ resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
+ engines: {node: '>= 8.10.0'}
+
+ ci-info@3.9.0:
+ resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==}
+ engines: {node: '>=8'}
+
+ ci-info@4.1.0:
+ resolution: {integrity: sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==}
+ engines: {node: '>=8'}
+
+ clean-stack@2.2.0:
+ resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==}
+ engines: {node: '>=6'}
+
+ cli-boxes@3.0.0:
+ resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==}
+ engines: {node: '>=10'}
+
+ cli-cursor@3.1.0:
+ resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==}
+ engines: {node: '>=8'}
+
+ cli-spinners@2.6.1:
+ resolution: {integrity: sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==}
+ engines: {node: '>=6'}
+
+ cli-width@4.1.0:
+ resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==}
+ engines: {node: '>= 12'}
+
+ cliui@8.0.1:
+ resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
+ engines: {node: '>=12'}
+
+ clone@1.0.4:
+ resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==}
+ engines: {node: '>=0.8'}
+
+ clsx@2.1.1:
+ resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
+ engines: {node: '>=6'}
+
+ collapse-white-space@2.1.0:
+ resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==}
+
+ color-convert@2.0.1:
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+ engines: {node: '>=7.0.0'}
+
+ color-name@1.1.4:
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
+ color-string@1.9.1:
+ resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==}
+
+ color@4.2.3:
+ resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==}
+ engines: {node: '>=12.5.0'}
+
+ combined-stream@1.0.8:
+ resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
+ engines: {node: '>= 0.8'}
+
+ comma-separated-tokens@2.0.3:
+ resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==}
+
+ commander@13.0.0:
+ resolution: {integrity: sha512-oPYleIY8wmTVzkvQq10AEok6YcTC4sRUBl8F9gVuwchGVUCTbl/vhLTaQqutuuySYOsu8YTgV+OxKc/8Yvx+mQ==}
+ engines: {node: '>=18'}
+
+ commander@4.1.1:
+ resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
+ engines: {node: '>= 6'}
+
+ common-ancestor-path@1.0.1:
+ resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==}
+
+ compare-func@2.0.0:
+ resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==}
+
+ compare-versions@6.1.1:
+ resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==}
+
+ computeds@0.0.1:
+ resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==}
+
+ concat-map@0.0.1:
+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+
+ confbox@0.1.8:
+ resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==}
+
+ consola@3.4.0:
+ resolution: {integrity: sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==}
+ engines: {node: ^14.18.0 || >=16.10.0}
+
+ conventional-changelog-angular@7.0.0:
+ resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==}
+ engines: {node: '>=16'}
+
+ conventional-commits-parser@5.0.0:
+ resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==}
+ engines: {node: '>=16'}
+ hasBin: true
+
+ convert-source-map@2.0.0:
+ resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+
+ cookie-es@1.2.2:
+ resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==}
+
+ cookie@0.7.2:
+ resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==}
+ engines: {node: '>= 0.6'}
+
+ cross-spawn@7.0.6:
+ resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==}
+ engines: {node: '>= 8'}
+
+ crossws@0.3.3:
+ resolution: {integrity: sha512-/71DJT3xJlqSnBr83uGJesmVHSzZEvgxHt/fIKxBAAngqMHmnBWQNxCphVxxJ2XL3xleu5+hJD6IQ3TglBedcw==}
+
+ css-selector-parser@3.0.5:
+ resolution: {integrity: sha512-3itoDFbKUNx1eKmVpYMFyqKX04Ww9osZ+dLgrk6GEv6KMVeXUhUnp4I5X+evw+u3ZxVU6RFXSSRxlTeMh8bA+g==}
+
+ cssesc@3.0.0:
+ resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ csstype@3.1.3:
+ resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
+
+ de-indent@1.0.2:
+ resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==}
+
+ debug@3.2.7:
+ resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ debug@4.4.0:
+ resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ decode-named-character-reference@1.0.2:
+ resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==}
+
+ deep-eql@5.0.2:
+ resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==}
+ engines: {node: '>=6'}
+
+ deep-is@0.1.4:
+ resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+
+ defaults@1.0.4:
+ resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==}
+
+ define-lazy-prop@2.0.0:
+ resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==}
+ engines: {node: '>=8'}
+
+ defu@6.1.4:
+ resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==}
+
+ delayed-stream@1.0.0:
+ resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
+ engines: {node: '>=0.4.0'}
+
+ dequal@2.0.3:
+ resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
+ engines: {node: '>=6'}
+
+ destr@2.0.3:
+ resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==}
+
+ detect-file@1.0.0:
+ resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==}
+ engines: {node: '>=0.10.0'}
+
+ detect-libc@2.0.3:
+ resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==}
+ engines: {node: '>=8'}
+
+ deterministic-object-hash@2.0.2:
+ resolution: {integrity: sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==}
+ engines: {node: '>=18'}
+
+ devalue@5.1.1:
+ resolution: {integrity: sha512-maua5KUiapvEwiEAe+XnlZ3Rh0GD+qI1J/nb9vrJc3muPXvcF/8gXYTWF76+5DAqHyDUtOIImEuo0YKE9mshVw==}
+
+ devlop@1.1.0:
+ resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==}
+
+ diff-sequences@29.6.3:
+ resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ diff@5.2.0:
+ resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==}
+ engines: {node: '>=0.3.1'}
+
+ direction@2.0.1:
+ resolution: {integrity: sha512-9S6m9Sukh1cZNknO1CWAr2QAWsbKLafQiyM5gZ7VgXHeuaoUwffKN4q6NC4A/Mf9iiPlOXQEKW/Mv/mh9/3YFA==}
+ hasBin: true
+
+ dlv@1.1.3:
+ resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
+
+ doctrine@3.0.0:
+ resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
+ engines: {node: '>=6.0.0'}
+
+ dot-prop@5.3.0:
+ resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==}
+ engines: {node: '>=8'}
+
+ dotenv-expand@11.0.7:
+ resolution: {integrity: sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==}
+ engines: {node: '>=12'}
+
+ dotenv@16.4.7:
+ resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==}
+ engines: {node: '>=12'}
+
+ dset@3.1.4:
+ resolution: {integrity: sha512-2QF/g9/zTaPDc3BjNcVTGoBbXBgYfMTTceLaYcFJ/W9kggFUkhxD/hMEeuLKbugyef9SqAx8cpgwlIP/jinUTA==}
+ engines: {node: '>=4'}
+
+ eastasianwidth@0.2.0:
+ resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
+
+ easy-table@1.2.0:
+ resolution: {integrity: sha512-OFzVOv03YpvtcWGe5AayU5G2hgybsg3iqA6drU8UaoZyB9jLGMTrz9+asnLp/E+6qPh88yEI1gvyZFZ41dmgww==}
+
+ electron-to-chromium@1.5.82:
+ resolution: {integrity: sha512-Zq16uk1hfQhyGx5GpwPAYDwddJuSGhtRhgOA2mCxANYaDT79nAeGnaXogMGng4KqLaJUVnOnuL0+TDop9nLOiA==}
+
+ emoji-regex-xs@1.0.0:
+ resolution: {integrity: sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==}
+
+ emoji-regex@10.4.0:
+ resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==}
+
+ emoji-regex@8.0.0:
+ resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+
+ emoji-regex@9.2.2:
+ resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+
+ end-of-stream@1.4.4:
+ resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
+
+ enhanced-resolve@5.18.0:
+ resolution: {integrity: sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==}
+ engines: {node: '>=10.13.0'}
+
+ enquirer@2.3.6:
+ resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==}
+ engines: {node: '>=8.6'}
+
+ entities@4.5.0:
+ resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
+ engines: {node: '>=0.12'}
+
+ es-module-lexer@1.6.0:
+ resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==}
+
+ esast-util-from-estree@2.0.0:
+ resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==}
+
+ esast-util-from-js@2.0.1:
+ resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==}
+
+ esbuild-register@3.6.0:
+ resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==}
+ peerDependencies:
+ esbuild: '>=0.12 <1'
+
+ esbuild@0.24.2:
+ resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ escalade@3.2.0:
+ resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
+ engines: {node: '>=6'}
+
+ escape-string-regexp@1.0.5:
+ resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
+ engines: {node: '>=0.8.0'}
+
+ escape-string-regexp@2.0.0:
+ resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==}
+ engines: {node: '>=8'}
+
+ escape-string-regexp@4.0.0:
+ 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-compat-utils@0.5.1:
+ resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==}
+ engines: {node: '>=12'}
+ peerDependencies:
+ eslint: '>=6.0.0'
+
+ eslint-import-resolver-node@0.3.9:
+ resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==}
+
+ eslint-plugin-es-x@7.8.0:
+ resolution: {integrity: sha512-7Ds8+wAAoV3T+LAKeu39Y5BzXCrGKrcISfgKEqTS4BDN8SFEDQd0S43jiQ8vIa3wUKD07qitZdfzlenSi8/0qQ==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ peerDependencies:
+ eslint: '>=8'
+
+ eslint-plugin-import-x@4.6.1:
+ resolution: {integrity: sha512-wluSUifMIb7UfwWXqx7Yx0lE/SGCcGXECLx/9bCmbY2nneLwvAZ4vkd1IXDjPKFvdcdUgr1BaRnaRpx3k2+Pfw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+
+ eslint-plugin-n@17.15.1:
+ resolution: {integrity: sha512-KFw7x02hZZkBdbZEFQduRGH4VkIH4MW97ClsbAM4Y4E6KguBJWGfWG1P4HEIpZk2bkoWf0bojpnjNAhYQP8beA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: '>=8.23.0'
+
+ eslint-scope@7.2.2:
+ resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ eslint-scope@8.2.0:
+ resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ eslint-visitor-keys@3.4.3:
+ resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ eslint-visitor-keys@4.2.0:
+ resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ eslint@9.19.0:
+ resolution: {integrity: sha512-ug92j0LepKlbbEv6hD911THhoRHmbdXt2gX+VDABAW/Ir7D3nqKdv5Pf5vtlyY6HQMTEP2skXY43ueqTCWssEA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ hasBin: true
+ peerDependencies:
+ jiti: '*'
+ peerDependenciesMeta:
+ jiti:
+ optional: true
+
+ espree@10.3.0:
+ resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
+ espree@9.6.1:
+ resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+ esprima@4.0.1:
+ resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ esquery@1.6.0:
+ resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==}
+ engines: {node: '>=0.10'}
+
+ esrecurse@4.3.0:
+ resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
+ engines: {node: '>=4.0'}
+
+ estraverse@5.3.0:
+ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
+ engines: {node: '>=4.0'}
+
+ estree-util-attach-comments@3.0.0:
+ resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==}
+
+ estree-util-build-jsx@3.0.1:
+ resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==}
+
+ estree-util-is-identifier-name@3.0.0:
+ resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==}
+
+ estree-util-scope@1.0.0:
+ resolution: {integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==}
+
+ estree-util-to-js@2.0.0:
+ resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==}
+
+ estree-util-visit@2.0.0:
+ resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==}
+
+ estree-walker@2.0.2:
+ resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
+
+ estree-walker@3.0.3:
+ resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
+
+ esutils@2.0.3:
+ resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
+ engines: {node: '>=0.10.0'}
+
+ eventemitter3@5.0.1:
+ resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
+
+ expand-tilde@2.0.2:
+ resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==}
+ engines: {node: '>=0.10.0'}
+
+ expect-type@1.1.0:
+ resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==}
+ engines: {node: '>=12.0.0'}
+
+ expect@29.7.0:
+ resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ expressive-code@0.40.1:
+ resolution: {integrity: sha512-jBsTRX+MPsqiqYQsE9vRXMiAkUafU11j2zuWAaOX9vubLutNB0er8c0FJWeudVDH5D52V4Lf4vTIqbOE54PUcQ==}
+
+ extend@3.0.2:
+ resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
+
+ external-editor@3.1.0:
+ resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==}
+ engines: {node: '>=4'}
+
+ fast-deep-equal@3.1.3:
+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+
+ fast-glob@3.3.3:
+ resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
+ engines: {node: '>=8.6.0'}
+
+ fast-json-stable-stringify@2.1.0:
+ resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+
+ fast-levenshtein@2.0.6:
+ resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+
+ fastq@1.18.0:
+ resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==}
+
+ fb-watchman@2.0.2:
+ resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==}
+
+ figures@3.2.0:
+ resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==}
+ engines: {node: '>=8'}
+
+ file-entry-cache@8.0.0:
+ resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
+ engines: {node: '>=16.0.0'}
+
+ fill-range@7.1.1:
+ resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
+ engines: {node: '>=8'}
+
+ find-up-simple@1.0.0:
+ resolution: {integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==}
+ engines: {node: '>=18'}
+
+ find-up@4.1.0:
+ resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
+ engines: {node: '>=8'}
+
+ find-up@5.0.0:
+ resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
+ engines: {node: '>=10'}
+
+ find-yarn-workspace-root2@1.2.16:
+ resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==}
+
+ findup-sync@5.0.0:
+ resolution: {integrity: sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==}
+ engines: {node: '>= 10.13.0'}
+
+ fined@2.0.0:
+ resolution: {integrity: sha512-OFRzsL6ZMHz5s0JrsEr+TpdGNCtrVtnuG3x1yzGNiQHT0yaDnXAj8V/lWcpJVrnoDpcwXcASxAZYbuXda2Y82A==}
+ engines: {node: '>= 10.13.0'}
+
+ flagged-respawn@2.0.0:
+ resolution: {integrity: sha512-Gq/a6YCi8zexmGHMuJwahTGzXlAZAOsbCVKduWXC6TlLCjjFRlExMJc4GC2NYPYZ0r/brw9P7CpRgQmlPVeOoA==}
+ engines: {node: '>= 10.13.0'}
+
+ flat-cache@4.0.1:
+ resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==}
+ engines: {node: '>=16'}
+
+ flat@5.0.2:
+ resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==}
+ hasBin: true
+
+ flatted@3.3.2:
+ resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==}
+
+ flattie@1.1.1:
+ resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==}
+ engines: {node: '>=8'}
+
+ follow-redirects@1.15.9:
+ resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==}
+ engines: {node: '>=4.0'}
+ peerDependencies:
+ debug: '*'
+ peerDependenciesMeta:
+ debug:
+ optional: true
+
+ for-in@1.0.2:
+ resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==}
+ engines: {node: '>=0.10.0'}
+
+ for-own@1.0.0:
+ resolution: {integrity: sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==}
+ engines: {node: '>=0.10.0'}
+
+ foreground-child@3.3.0:
+ resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==}
+ engines: {node: '>=14'}
+
+ form-data@4.0.1:
+ resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==}
+ engines: {node: '>= 6'}
+
+ front-matter@4.0.2:
+ resolution: {integrity: sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==}
+
+ fs-constants@1.0.0:
+ resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==}
+
+ fs-extra@7.0.1:
+ resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==}
+ engines: {node: '>=6 <7 || >=8'}
+
+ fs.realpath@1.0.0:
+ resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+
+ fsevents@2.3.3:
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+
+ function-bind@1.1.2:
+ resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+
+ gensync@1.0.0-beta.2:
+ resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
+ engines: {node: '>=6.9.0'}
+
+ get-caller-file@2.0.5:
+ resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
+ engines: {node: 6.* || 8.* || >= 10.*}
+
+ get-east-asian-width@1.3.0:
+ resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==}
+ engines: {node: '>=18'}
+
+ get-package-type@0.1.0:
+ resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==}
+ engines: {node: '>=8.0.0'}
+
+ get-tsconfig@4.8.1:
+ resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==}
+
+ github-slugger@2.0.0:
+ resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==}
+
+ glob-parent@5.1.2:
+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+ engines: {node: '>= 6'}
+
+ glob-parent@6.0.2:
+ resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
+ engines: {node: '>=10.13.0'}
+
+ glob@10.4.5:
+ resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==}
+ hasBin: true
+
+ glob@7.2.3:
+ resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+ deprecated: Glob versions prior to v9 are no longer supported
+
+ global-modules@1.0.0:
+ resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==}
+ engines: {node: '>=0.10.0'}
+
+ global-prefix@1.0.2:
+ resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==}
+ engines: {node: '>=0.10.0'}
+
+ globals@11.12.0:
+ resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
+ engines: {node: '>=4'}
+
+ globals@14.0.0:
+ resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
+ engines: {node: '>=18'}
+
+ globals@15.14.0:
+ resolution: {integrity: sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==}
+ engines: {node: '>=18'}
+
+ globrex@0.1.2:
+ resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==}
+
+ graceful-fs@4.2.11:
+ resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+
+ graphemer@1.4.0:
+ resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
+
+ h3@1.14.0:
+ resolution: {integrity: sha512-ao22eiONdgelqcnknw0iD645qW0s9NnrJHr5OBz4WOMdBdycfSas1EQf1wXRsm+PcB2Yoj43pjBPwqIpJQTeWg==}
+
+ has-flag@4.0.0:
+ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+ engines: {node: '>=8'}
+
+ hasown@2.0.2:
+ resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
+ engines: {node: '>= 0.4'}
+
+ hast-util-embedded@3.0.0:
+ resolution: {integrity: sha512-naH8sld4Pe2ep03qqULEtvYr7EjrLK2QHY8KJR6RJkTUjPGObe1vnx585uzem2hGra+s1q08DZZpfgDVYRbaXA==}
+
+ hast-util-format@1.1.0:
+ resolution: {integrity: sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==}
+
+ hast-util-from-html@2.0.3:
+ resolution: {integrity: sha512-CUSRHXyKjzHov8yKsQjGOElXy/3EKpyX56ELnkHH34vDVw1N1XSQ1ZcAvTyAPtGqLTuKP/uxM+aLkSPqF/EtMw==}
+
+ hast-util-from-parse5@8.0.2:
+ resolution: {integrity: sha512-SfMzfdAi/zAoZ1KkFEyyeXBn7u/ShQrfd675ZEE9M3qj+PMFX05xubzRyF76CCSJu8au9jgVxDV1+okFvgZU4A==}
+
+ hast-util-has-property@3.0.0:
+ resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==}
+
+ hast-util-is-body-ok-link@3.0.1:
+ resolution: {integrity: sha512-0qpnzOBLztXHbHQenVB8uNuxTnm/QBFUOmdOSsEn7GnBtyY07+ENTWVFBAnXd/zEgd9/SUG3lRY7hSIBWRgGpQ==}
+
+ hast-util-is-element@3.0.0:
+ resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==}
+
+ hast-util-minify-whitespace@1.0.1:
+ resolution: {integrity: sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==}
+
+ hast-util-parse-selector@4.0.0:
+ resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==}
+
+ hast-util-phrasing@3.0.1:
+ resolution: {integrity: sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==}
+
+ hast-util-raw@9.1.0:
+ resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==}
+
+ hast-util-select@6.0.3:
+ resolution: {integrity: sha512-OVRQlQ1XuuLP8aFVLYmC2atrfWHS5UD3shonxpnyrjcCkwtvmt/+N6kYJdcY4mkMJhxp4kj2EFIxQ9kvkkt/eQ==}
+
+ hast-util-to-estree@3.1.1:
+ resolution: {integrity: sha512-IWtwwmPskfSmma9RpzCappDUitC8t5jhAynHhc1m2+5trOgsrp7txscUSavc5Ic8PATyAjfrCK1wgtxh2cICVQ==}
+
+ hast-util-to-html@9.0.4:
+ resolution: {integrity: sha512-wxQzXtdbhiwGAUKrnQJXlOPmHnEehzphwkK7aluUPQ+lEc1xefC8pblMgpp2w5ldBTEfveRIrADcrhGIWrlTDA==}
+
+ hast-util-to-jsx-runtime@2.3.2:
+ resolution: {integrity: sha512-1ngXYb+V9UT5h+PxNRa1O1FYguZK/XL+gkeqvp7EdHlB9oHUG0eYRo/vY5inBdcqo3RkPMC58/H94HvkbfGdyg==}
+
+ hast-util-to-parse5@8.0.0:
+ resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==}
+
+ hast-util-to-string@3.0.1:
+ resolution: {integrity: sha512-XelQVTDWvqcl3axRfI0xSeoVKzyIFPwsAGSLIsKdJKQMXDYJS4WYrBNF/8J7RdhIcFI2BOHgAifggsvsxp/3+A==}
+
+ hast-util-to-text@4.0.2:
+ resolution: {integrity: sha512-KK6y/BN8lbaq654j7JgBydev7wuNMcID54lkRav1P0CaE1e47P72AWWPiGKXTJU271ooYzcvTAn/Zt0REnvc7A==}
+
+ hast-util-whitespace@3.0.0:
+ resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==}
+
+ hastscript@9.0.0:
+ resolution: {integrity: sha512-jzaLBGavEDKHrc5EfFImKN7nZKKBdSLIdGvCwDZ9TfzbF2ffXiov8CKE445L2Z1Ek2t/m4SKQ2j6Ipv7NyUolw==}
+
+ he@1.2.0:
+ resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
+ hasBin: true
+
+ homedir-polyfill@1.0.3:
+ resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==}
+ engines: {node: '>=0.10.0'}
+
+ html-escaper@2.0.2:
+ resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==}
+
+ html-escaper@3.0.3:
+ resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==}
+
+ html-void-elements@3.0.0:
+ resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==}
+
+ html-whitespace-sensitive-tag-names@3.0.1:
+ resolution: {integrity: sha512-q+310vW8zmymYHALr1da4HyXUQ0zgiIwIicEfotYPWGN0OJVEN/58IJ3A4GBYcEq3LGAZqKb+ugvP0GNB9CEAA==}
+
+ http-cache-semantics@4.1.1:
+ resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==}
+
+ i18next@23.16.8:
+ resolution: {integrity: sha512-06r/TitrM88Mg5FdUXAKL96dJMzgqLE5dv3ryBAra4KCwD9mJ4ndOTS95ZuymIGoE+2hzfdaMak2X11/es7ZWg==}
+
+ iconv-lite@0.4.24:
+ resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
+ engines: {node: '>=0.10.0'}
+
+ ieee754@1.2.1:
+ resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
+
+ ignore@5.3.2:
+ resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
+ engines: {node: '>= 4'}
+
+ import-fresh@3.3.0:
+ resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
+ engines: {node: '>=6'}
+
+ import-lazy@4.0.0:
+ resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==}
+ engines: {node: '>=8'}
+
+ import-meta-resolve@4.1.0:
+ resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==}
+
+ imurmurhash@0.1.4:
+ 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'}
+
+ inflight@1.0.6:
+ resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
+ deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
+
+ inherits@2.0.4:
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
+ ini@1.3.8:
+ resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
+
+ inline-style-parser@0.2.4:
+ resolution: {integrity: sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==}
+
+ inquirer@12.3.2:
+ resolution: {integrity: sha512-YjQCIcDd3yyDuQrbII0FBtm/ZqNoWtvaC71yeCnd5Vbg4EgzsAGaemzfpzmqfvIZEp2roSwuZZKdM0C65hA43g==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@types/node': '>=18'
+
+ interpret@3.1.1:
+ resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==}
+ engines: {node: '>=10.13.0'}
+
+ iron-webcrypto@1.2.1:
+ resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==}
+
+ is-absolute@1.0.0:
+ resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==}
+ engines: {node: '>=0.10.0'}
+
+ is-alphabetical@2.0.1:
+ resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==}
+
+ is-alphanumerical@2.0.1:
+ resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==}
+
+ is-arrayish@0.3.2:
+ resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==}
+
+ is-binary-path@2.1.0:
+ resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+ engines: {node: '>=8'}
+
+ is-core-module@2.16.1:
+ resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==}
+ engines: {node: '>= 0.4'}
+
+ is-decimal@2.0.1:
+ resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==}
+
+ is-docker@2.2.1:
+ resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==}
+ engines: {node: '>=8'}
+ hasBin: true
+
+ is-docker@3.0.0:
+ resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ hasBin: true
+
+ is-extglob@2.1.1:
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+ engines: {node: '>=0.10.0'}
+
+ is-fullwidth-code-point@3.0.0:
+ resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+ engines: {node: '>=8'}
+
+ is-fullwidth-code-point@5.0.0:
+ resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==}
+ engines: {node: '>=18'}
+
+ is-glob@4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
+
+ is-hexadecimal@2.0.1:
+ resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==}
+
+ is-inside-container@1.0.0:
+ resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==}
+ engines: {node: '>=14.16'}
+ hasBin: true
+
+ is-interactive@1.0.0:
+ resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==}
+ engines: {node: '>=8'}
+
+ is-number@7.0.0:
+ 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-plain-obj@4.1.0:
+ resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
+ engines: {node: '>=12'}
+
+ is-plain-object@5.0.0:
+ resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==}
+ engines: {node: '>=0.10.0'}
+
+ is-relative@1.0.0:
+ resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==}
+ engines: {node: '>=0.10.0'}
+
+ is-text-path@2.0.0:
+ resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==}
+ engines: {node: '>=8'}
+
+ is-unc-path@1.0.0:
+ resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==}
+ engines: {node: '>=0.10.0'}
+
+ is-unicode-supported@0.1.0:
+ resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==}
+ engines: {node: '>=10'}
+
+ is-windows@1.0.2:
+ resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==}
+ engines: {node: '>=0.10.0'}
+
+ is-wsl@2.2.0:
+ resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
+ engines: {node: '>=8'}
+
+ is-wsl@3.1.0:
+ resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==}
+ engines: {node: '>=16'}
+
+ isexe@2.0.0:
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+
+ isobject@3.0.1:
+ resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==}
+ engines: {node: '>=0.10.0'}
+
+ istanbul-lib-coverage@3.2.2:
+ resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==}
+ engines: {node: '>=8'}
+
+ istanbul-lib-instrument@5.2.1:
+ resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==}
+ engines: {node: '>=8'}
+
+ istanbul-lib-instrument@6.0.3:
+ resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==}
+ engines: {node: '>=10'}
+
+ istanbul-lib-report@3.0.1:
+ resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==}
+ engines: {node: '>=10'}
+
+ istanbul-lib-source-maps@5.0.6:
+ resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==}
+ engines: {node: '>=10'}
+
+ istanbul-reports@3.1.7:
+ resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==}
+ engines: {node: '>=8'}
+
+ jackspeak@3.4.3:
+ resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==}
+
+ jest-diff@29.7.0:
+ resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-get-type@29.6.3:
+ resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-haste-map@29.7.0:
+ resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-matcher-utils@29.7.0:
+ resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-message-util@29.7.0:
+ resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-mock@29.7.0:
+ resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-regex-util@29.6.3:
+ resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-snapshot@29.7.0:
+ resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-util@29.7.0:
+ resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jest-worker@29.7.0:
+ resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ jiti@2.4.2:
+ resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==}
+ hasBin: true
+
+ jju@1.4.0:
+ resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==}
+
+ js-tokens@4.0.0:
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+
+ js-yaml@3.14.1:
+ resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==}
+ hasBin: true
+
+ js-yaml@4.1.0:
+ resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
+ hasBin: true
+
+ jsesc@3.1.0:
+ resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ json-buffer@3.0.1:
+ resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
+
+ json-schema-traverse@0.4.1:
+ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+
+ json-schema-traverse@1.0.0:
+ resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
+
+ json-stable-stringify-without-jsonify@1.0.1:
+ resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
+
+ json5@2.2.3:
+ resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ jsonc-parser@3.2.0:
+ resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==}
+
+ jsonfile@4.0.0:
+ resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==}
+
+ jsonfile@6.1.0:
+ resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
+
+ jsonparse@1.3.1:
+ resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==}
+ engines: {'0': node >= 0.2.0}
+
+ keyv@4.5.4:
+ resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
+
+ kleur@3.0.3:
+ resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
+ engines: {node: '>=6'}
+
+ kleur@4.1.5:
+ resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
+ engines: {node: '>=6'}
+
+ knip@5.43.3:
+ resolution: {integrity: sha512-rCSc7X1jQs+ZIc08lQF3c3nS/nKzsg9UPIbY+qQUMh+FVF5ojdiT3bJNypRlSm2pMLQVeE7XWxXrtT4sdg6nfA==}
+ engines: {node: '>=18.18.0'}
+ hasBin: true
+ peerDependencies:
+ '@types/node': '>=18'
+ typescript: '>=5.0.4'
+
+ kolorist@1.8.0:
+ resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==}
+
+ levn@0.4.1:
+ resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
+ engines: {node: '>= 0.8.0'}
+
+ liftoff@5.0.0:
+ resolution: {integrity: sha512-a5BQjbCHnB+cy+gsro8lXJ4kZluzOijzJ1UVVfyJYZC+IP2pLv1h4+aysQeKuTmyO8NAqfyQAk4HWaP/HjcKTg==}
+ engines: {node: '>=10.13.0'}
+
+ lines-and-columns@2.0.3:
+ resolution: {integrity: sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ linkify-it@5.0.0:
+ resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==}
+
+ load-yaml-file@0.2.0:
+ resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==}
+ engines: {node: '>=6'}
+
+ local-pkg@0.5.1:
+ resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==}
+ engines: {node: '>=14'}
+
+ locate-path@5.0.0:
+ resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
+ engines: {node: '>=8'}
+
+ locate-path@6.0.0:
+ resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
+ engines: {node: '>=10'}
+
+ lodash.merge@4.6.2:
+ resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
+
+ lodash@4.17.21:
+ resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+
+ log-symbols@4.1.0:
+ resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
+ engines: {node: '>=10'}
+
+ longest-streak@3.1.0:
+ resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==}
+
+ loupe@3.1.2:
+ resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==}
+
+ lru-cache@10.4.3:
+ resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
+
+ lru-cache@5.1.1:
+ resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+
+ lru-cache@6.0.0:
+ resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
+ engines: {node: '>=10'}
+
+ lunr@2.3.9:
+ resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==}
+
+ magic-string@0.30.17:
+ resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==}
+
+ magicast@0.3.5:
+ resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==}
+
+ make-dir@4.0.0:
+ resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==}
+ engines: {node: '>=10'}
+
+ makeerror@1.0.12:
+ resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==}
+
+ map-cache@0.2.2:
+ resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==}
+ engines: {node: '>=0.10.0'}
+
+ markdown-extensions@2.0.0:
+ resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==}
+ engines: {node: '>=16'}
+
+ markdown-it@14.1.0:
+ resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==}
+ hasBin: true
+
+ markdown-table@3.0.4:
+ resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==}
+
+ mdast-util-definitions@6.0.0:
+ resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==}
+
+ mdast-util-directive@3.1.0:
+ resolution: {integrity: sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==}
+
+ mdast-util-find-and-replace@3.0.2:
+ resolution: {integrity: sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==}
+
+ mdast-util-from-markdown@2.0.2:
+ resolution: {integrity: sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==}
+
+ mdast-util-gfm-autolink-literal@2.0.1:
+ resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==}
+
+ mdast-util-gfm-footnote@2.0.0:
+ resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==}
+
+ mdast-util-gfm-strikethrough@2.0.0:
+ resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==}
+
+ mdast-util-gfm-table@2.0.0:
+ resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==}
+
+ mdast-util-gfm-task-list-item@2.0.0:
+ resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==}
+
+ mdast-util-gfm@3.0.0:
+ resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==}
+
+ mdast-util-mdx-expression@2.0.1:
+ resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==}
+
+ mdast-util-mdx-jsx@3.2.0:
+ resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==}
+
+ mdast-util-mdx@3.0.0:
+ resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==}
+
+ mdast-util-mdxjs-esm@2.0.1:
+ resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==}
+
+ mdast-util-phrasing@4.1.0:
+ resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==}
+
+ mdast-util-to-hast@13.2.0:
+ resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==}
+
+ mdast-util-to-markdown@2.1.2:
+ resolution: {integrity: sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==}
+
+ mdast-util-to-string@4.0.0:
+ resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==}
+
+ mdurl@2.0.0:
+ resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==}
+
+ meow@12.1.1:
+ resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==}
+ engines: {node: '>=16.10'}
+
+ 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'}
+
+ micromark-core-commonmark@2.0.2:
+ resolution: {integrity: sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w==}
+
+ micromark-extension-directive@3.0.2:
+ resolution: {integrity: sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==}
+
+ micromark-extension-gfm-autolink-literal@2.1.0:
+ resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==}
+
+ micromark-extension-gfm-footnote@2.1.0:
+ resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==}
+
+ micromark-extension-gfm-strikethrough@2.1.0:
+ resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==}
+
+ micromark-extension-gfm-table@2.1.1:
+ resolution: {integrity: sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==}
+
+ micromark-extension-gfm-tagfilter@2.0.0:
+ resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==}
+
+ micromark-extension-gfm-task-list-item@2.1.0:
+ resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==}
+
+ micromark-extension-gfm@3.0.0:
+ resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==}
+
+ micromark-extension-mdx-expression@3.0.0:
+ resolution: {integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==}
+
+ micromark-extension-mdx-jsx@3.0.1:
+ resolution: {integrity: sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg==}
+
+ micromark-extension-mdx-md@2.0.0:
+ resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==}
+
+ micromark-extension-mdxjs-esm@3.0.0:
+ resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==}
+
+ micromark-extension-mdxjs@3.0.0:
+ resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==}
+
+ micromark-factory-destination@2.0.1:
+ resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==}
+
+ micromark-factory-label@2.0.1:
+ resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==}
+
+ micromark-factory-mdx-expression@2.0.2:
+ resolution: {integrity: sha512-5E5I2pFzJyg2CtemqAbcyCktpHXuJbABnsb32wX2U8IQKhhVFBqkcZR5LRm1WVoFqa4kTueZK4abep7wdo9nrw==}
+
+ micromark-factory-space@2.0.1:
+ resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==}
+
+ micromark-factory-title@2.0.1:
+ resolution: {integrity: sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==}
+
+ micromark-factory-whitespace@2.0.1:
+ resolution: {integrity: sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==}
+
+ micromark-util-character@2.1.1:
+ resolution: {integrity: sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==}
+
+ micromark-util-chunked@2.0.1:
+ resolution: {integrity: sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==}
+
+ micromark-util-classify-character@2.0.1:
+ resolution: {integrity: sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==}
+
+ micromark-util-combine-extensions@2.0.1:
+ resolution: {integrity: sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==}
+
+ micromark-util-decode-numeric-character-reference@2.0.2:
+ resolution: {integrity: sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==}
+
+ micromark-util-decode-string@2.0.1:
+ resolution: {integrity: sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==}
+
+ micromark-util-encode@2.0.1:
+ resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==}
+
+ micromark-util-events-to-acorn@2.0.2:
+ resolution: {integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==}
+
+ micromark-util-html-tag-name@2.0.1:
+ resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==}
+
+ micromark-util-normalize-identifier@2.0.1:
+ resolution: {integrity: sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==}
+
+ micromark-util-resolve-all@2.0.1:
+ resolution: {integrity: sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==}
+
+ micromark-util-sanitize-uri@2.0.1:
+ resolution: {integrity: sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==}
+
+ micromark-util-subtokenize@2.0.4:
+ resolution: {integrity: sha512-N6hXjrin2GTJDe3MVjf5FuXpm12PGm80BrUAeub9XFXca8JZbP+oIwY4LJSVwFUCL1IPm/WwSVUN7goFHmSGGQ==}
+
+ micromark-util-symbol@2.0.1:
+ resolution: {integrity: sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==}
+
+ micromark-util-types@2.0.1:
+ resolution: {integrity: sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==}
+
+ micromark@4.0.1:
+ resolution: {integrity: sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==}
+
+ micromatch@4.0.8:
+ resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
+ engines: {node: '>=8.6'}
+
+ mime-db@1.52.0:
+ resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
+ engines: {node: '>= 0.6'}
+
+ mime-types@2.1.35:
+ resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
+ engines: {node: '>= 0.6'}
+
+ mime@3.0.0:
+ resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==}
+ engines: {node: '>=10.0.0'}
+ hasBin: true
+
+ mimic-fn@2.1.0:
+ resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
+ engines: {node: '>=6'}
+
+ min-indent@1.0.1:
+ resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
+ engines: {node: '>=4'}
+
+ minimatch@3.0.8:
+ resolution: {integrity: sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==}
+
+ minimatch@3.1.2:
+ resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+
+ minimatch@9.0.3:
+ resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
+ minimatch@9.0.5:
+ resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
+ minimist@1.2.8:
+ resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+
+ minipass@7.1.2:
+ resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
+ engines: {node: '>=16 || 14 >=14.17'}
+
+ mlly@1.7.4:
+ resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==}
+
+ mri@1.2.0:
+ resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==}
+ engines: {node: '>=4'}
+
+ mrmime@2.0.0:
+ resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==}
+ engines: {node: '>=10'}
+
+ ms@2.1.3:
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+ muggle-string@0.4.1:
+ resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==}
+
+ mute-stream@2.0.0:
+ resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==}
+ engines: {node: ^18.17.0 || >=20.5.0}
+
+ nanoid@3.3.8:
+ resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
+ natural-compare@1.4.0:
+ resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
+
+ neotraverse@0.6.18:
+ resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==}
+ engines: {node: '>= 10'}
+
+ nlcst-to-string@4.0.0:
+ resolution: {integrity: sha512-YKLBCcUYKAg0FNlOBT6aI91qFmSiFKiluk655WzPF+DDMA02qIyy8uiRqI8QXtcFpEvll12LpL5MXqEmAZ+dcA==}
+
+ node-fetch-native@1.6.6:
+ resolution: {integrity: sha512-8Mc2HhqPdlIfedsuZoc3yioPuzp6b+L5jRCRY1QzuWZh2EGJVQrGppC6V6cF0bLdbW0+O2YpqCA25aF/1lvipQ==}
+
+ node-int64@0.4.0:
+ resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==}
+
+ node-machine-id@1.1.12:
+ resolution: {integrity: sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==}
+
+ node-releases@2.0.19:
+ resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==}
+
+ normalize-path@3.0.0:
+ resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+ engines: {node: '>=0.10.0'}
+
+ npm-run-path@4.0.1:
+ resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
+ engines: {node: '>=8'}
+
+ nth-check@2.1.1:
+ resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
+
+ nx@20.3.3:
+ resolution: {integrity: sha512-IUu2D8/bVa7aSr3ViRcrmpTGO2FKqzJoio6gjeq/YbyUHyjrrq5HUmHFx30Wm2vmC1BGm0MeyakTNUJzQvfAog==}
+ hasBin: true
+ peerDependencies:
+ '@swc-node/register': ^1.8.0
+ '@swc/core': ^1.3.85
+ peerDependenciesMeta:
+ '@swc-node/register':
+ optional: true
+ '@swc/core':
+ optional: true
+
+ object.defaults@1.1.0:
+ resolution: {integrity: sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==}
+ engines: {node: '>=0.10.0'}
+
+ object.pick@1.3.0:
+ resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==}
+ engines: {node: '>=0.10.0'}
+
+ ofetch@1.4.1:
+ resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==}
+
+ ohash@1.1.4:
+ resolution: {integrity: sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g==}
+
+ once@1.4.0:
+ resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+
+ onetime@5.1.2:
+ resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
+ engines: {node: '>=6'}
+
+ oniguruma-to-es@2.3.0:
+ resolution: {integrity: sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g==}
+
+ open@8.4.2:
+ resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==}
+ engines: {node: '>=12'}
+
+ optionator@0.9.4:
+ resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==}
+ engines: {node: '>= 0.8.0'}
+
+ ora@5.3.0:
+ resolution: {integrity: sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==}
+ engines: {node: '>=10'}
+
+ os-tmpdir@1.0.2:
+ resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==}
+ engines: {node: '>=0.10.0'}
+
+ p-limit@2.3.0:
+ resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
+ engines: {node: '>=6'}
+
+ p-limit@3.1.0:
+ resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
+ engines: {node: '>=10'}
+
+ p-limit@6.2.0:
+ resolution: {integrity: sha512-kuUqqHNUqoIWp/c467RI4X6mmyuojY5jGutNU0wVTmEOOfcuwLqyMVoAi9MKi2Ak+5i9+nhmrK4ufZE8069kHA==}
+ engines: {node: '>=18'}
+
+ p-locate@4.1.0:
+ resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
+ engines: {node: '>=8'}
+
+ p-locate@5.0.0:
+ resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
+ engines: {node: '>=10'}
+
+ p-map@4.0.0:
+ resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==}
+ engines: {node: '>=10'}
+
+ p-queue@8.1.0:
+ resolution: {integrity: sha512-mxLDbbGIBEXTJL0zEx8JIylaj3xQ7Z/7eEVjcF9fJX4DBiH9oqe+oahYnlKKxm0Ci9TlWTyhSHgygxMxjIB2jw==}
+ engines: {node: '>=18'}
+
+ p-timeout@6.1.4:
+ resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==}
+ engines: {node: '>=14.16'}
+
+ p-try@2.2.0:
+ resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
+ engines: {node: '>=6'}
+
+ package-json-from-dist@1.0.1:
+ resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
+
+ package-manager-detector@0.2.8:
+ resolution: {integrity: sha512-ts9KSdroZisdvKMWVAVCXiKqnqNfXz4+IbrBG8/BWx/TR5le+jfenvoBuIZ6UWM9nz47W7AbD9qYfAwfWMIwzA==}
+
+ pagefind@1.3.0:
+ resolution: {integrity: sha512-8KPLGT5g9s+olKMRTU9LFekLizkVIu9tes90O1/aigJ0T5LmyPqTzGJrETnSw3meSYg58YH7JTzhTTW/3z6VAw==}
+ hasBin: true
+
+ 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==}
+
+ parse-filepath@1.0.2:
+ resolution: {integrity: sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==}
+ engines: {node: '>=0.8'}
+
+ parse-latin@7.0.0:
+ resolution: {integrity: sha512-mhHgobPPua5kZ98EF4HWiH167JWBfl4pvAIXXdbaVohtK7a6YBOy56kvhCqduqyo/f3yrHFWmqmiMg/BkBkYYQ==}
+
+ parse-ms@4.0.0:
+ resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==}
+ engines: {node: '>=18'}
+
+ parse-passwd@1.0.0:
+ resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==}
+ engines: {node: '>=0.10.0'}
+
+ parse5@7.2.1:
+ resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==}
+
+ path-browserify@1.0.1:
+ resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
+
+ path-exists@4.0.0:
+ resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+ engines: {node: '>=8'}
+
+ path-is-absolute@1.0.1:
+ resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
+ engines: {node: '>=0.10.0'}
+
+ path-key@3.1.1:
+ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+ engines: {node: '>=8'}
+
+ path-parse@1.0.7:
+ resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+
+ path-root-regex@0.1.2:
+ resolution: {integrity: sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==}
+ engines: {node: '>=0.10.0'}
+
+ path-root@0.1.1:
+ resolution: {integrity: sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==}
+ engines: {node: '>=0.10.0'}
+
+ path-scurry@1.11.1:
+ resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
+ engines: {node: '>=16 || 14 >=14.18'}
+
+ pathe@1.1.2:
+ resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==}
+
+ pathe@2.0.2:
+ resolution: {integrity: sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==}
+
+ pathval@2.0.0:
+ resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==}
+ engines: {node: '>= 14.16'}
+
+ picocolors@1.1.1:
+ resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
+
+ picomatch@2.3.1:
+ resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+ engines: {node: '>=8.6'}
+
+ picomatch@4.0.2:
+ resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==}
+ engines: {node: '>=12'}
+
+ pify@4.0.1:
+ resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==}
+ engines: {node: '>=6'}
+
+ pirates@4.0.6:
+ resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==}
+ engines: {node: '>= 6'}
+
+ pkg-dir@4.2.0:
+ resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==}
+ engines: {node: '>=8'}
+
+ pkg-types@1.3.1:
+ resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==}
+
+ postcss-nested@6.2.0:
+ resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==}
+ engines: {node: '>=12.0'}
+ peerDependencies:
+ postcss: ^8.2.14
+
+ postcss-selector-parser@6.1.2:
+ resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==}
+ engines: {node: '>=4'}
+
+ postcss@8.5.1:
+ resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==}
+ engines: {node: ^10 || ^12 || >=14}
+
+ preferred-pm@4.0.0:
+ resolution: {integrity: sha512-gYBeFTZLu055D8Vv3cSPox/0iTPtkzxpLroSYYA7WXgRi31WCJ51Uyl8ZiPeUUjyvs2MBzK+S8v9JVUgHU/Sqw==}
+ engines: {node: '>=18.12'}
+
+ prelude-ls@1.2.1:
+ resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
+ engines: {node: '>= 0.8.0'}
+
+ premove@4.0.0:
+ resolution: {integrity: sha512-zim/Hr4+FVdCIM7zL9b9Z0Wfd5Ya3mnKtiuDv7L5lzYzanSq6cOcVJ7EFcgK4I0pt28l8H0jX/x3nyog380XgQ==}
+ engines: {node: '>=6'}
+ hasBin: true
+
+ prettier@3.4.2:
+ resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==}
+ engines: {node: '>=14'}
+ hasBin: true
+
+ pretty-format@29.7.0:
+ resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
+ pretty-ms@9.2.0:
+ resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==}
+ engines: {node: '>=18'}
+
+ prismjs@1.29.0:
+ resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==}
+ engines: {node: '>=6'}
+
+ prompts@2.4.2:
+ resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==}
+ engines: {node: '>= 6'}
+
+ property-information@6.5.0:
+ resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==}
+
+ proxy-from-env@1.1.0:
+ resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
+
+ publint@0.3.2:
+ resolution: {integrity: sha512-fPs7QUbUvwixxPYUUTn0Kqp0rbH5rbiAOZwQOXMkIj+4Nopby1AngodSQmzTkJWTJ5R4uVV8oYmgVIjj+tgv1w==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ punycode.js@2.3.1:
+ resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==}
+ engines: {node: '>=6'}
+
+ punycode@2.3.1:
+ resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
+ engines: {node: '>=6'}
+
+ queue-microtask@1.2.3:
+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+
+ radix3@1.1.2:
+ resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==}
+
+ react-dom@19.0.0:
+ resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==}
+ peerDependencies:
+ react: ^19.0.0
+
+ react-is@18.3.1:
+ resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==}
+
+ react-refresh@0.14.2:
+ resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==}
+ engines: {node: '>=0.10.0'}
+
+ react@19.0.0:
+ resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==}
+ engines: {node: '>=0.10.0'}
+
+ readable-stream@3.6.2:
+ resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
+ engines: {node: '>= 6'}
+
+ readdirp@3.6.0:
+ resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+ engines: {node: '>=8.10.0'}
+
+ rechoir@0.8.0:
+ resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==}
+ engines: {node: '>= 10.13.0'}
+
+ recma-build-jsx@1.0.0:
+ resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==}
+
+ recma-jsx@1.0.0:
+ resolution: {integrity: sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q==}
+
+ recma-parse@1.0.0:
+ resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==}
+
+ recma-stringify@1.0.0:
+ resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==}
+
+ redent@4.0.0:
+ resolution: {integrity: sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==}
+ engines: {node: '>=12'}
+
+ regenerator-runtime@0.14.1:
+ resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
+
+ regex-recursion@5.1.1:
+ resolution: {integrity: sha512-ae7SBCbzVNrIjgSbh7wMznPcQel1DNlDtzensnFxpiNpXt1U2ju/bHugH422r+4LAVS1FpW1YCwilmnNsjum9w==}
+
+ regex-utilities@2.3.0:
+ resolution: {integrity: sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==}
+
+ regex@5.1.1:
+ resolution: {integrity: sha512-dN5I359AVGPnwzJm2jN1k0W9LPZ+ePvoOeVMMfqIMFz53sSwXkxaJoxr50ptnsC771lK95BnTrVSZxq0b9yCGw==}
+
+ rehype-expressive-code@0.40.1:
+ resolution: {integrity: sha512-EjmhGHcgmcPoIsb4M6vm2FQQDUctdcgFFiKGCYtPJuMpzr1q+ChCNsc443MaE412MyAgL6Q/XUB7I56Mcl6bnw==}
+
+ rehype-format@5.0.1:
+ resolution: {integrity: sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==}
+
+ rehype-parse@9.0.1:
+ resolution: {integrity: sha512-ksCzCD0Fgfh7trPDxr2rSylbwq9iYDkSn8TCDmEJ49ljEUBxDVCzCHv7QNzZOfODanX4+bWQ4WZqLCRWYLfhag==}
+
+ rehype-raw@7.0.0:
+ resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==}
+
+ rehype-recma@1.0.0:
+ resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==}
+
+ rehype-stringify@10.0.1:
+ resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==}
+
+ rehype@13.0.2:
+ resolution: {integrity: sha512-j31mdaRFrwFRUIlxGeuPXXKWQxet52RBQRvCmzl5eCefn/KGbomK5GMHNMsOJf55fgo3qw5tST5neDuarDYR2A==}
+
+ remark-directive@3.0.1:
+ resolution: {integrity: sha512-gwglrEQEZcZYgVyG1tQuA+h58EZfq5CSULw7J90AFuCTyib1thgHPoqQ+h9iFvU6R+vnZ5oNFQR5QKgGpk741A==}
+
+ remark-gfm@4.0.0:
+ resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==}
+
+ remark-mdx@3.1.0:
+ resolution: {integrity: sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==}
+
+ remark-parse@11.0.0:
+ resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==}
+
+ remark-rehype@11.1.1:
+ resolution: {integrity: sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==}
+
+ remark-smartypants@3.0.2:
+ resolution: {integrity: sha512-ILTWeOriIluwEvPjv67v7Blgrcx+LZOkAUVtKI3putuhlZm84FnqDORNXPPm+HY3NdZOMhyDwZ1E+eZB/Df5dA==}
+ engines: {node: '>=16.0.0'}
+
+ remark-stringify@11.0.0:
+ resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==}
+
+ require-directory@2.1.1:
+ resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
+ engines: {node: '>=0.10.0'}
+
+ require-from-string@2.0.2:
+ resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
+ engines: {node: '>=0.10.0'}
+
+ resolve-dir@1.0.1:
+ resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==}
+ 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-pkg-maps@1.0.0:
+ resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
+
+ resolve.exports@2.0.3:
+ resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==}
+ engines: {node: '>=10'}
+
+ resolve@1.22.10:
+ resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==}
+ engines: {node: '>= 0.4'}
+ hasBin: true
+
+ restore-cursor@3.1.0:
+ resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==}
+ engines: {node: '>=8'}
+
+ retext-latin@4.0.0:
+ resolution: {integrity: sha512-hv9woG7Fy0M9IlRQloq/N6atV82NxLGveq+3H2WOi79dtIYWN8OaxogDm77f8YnVXJL2VD3bbqowu5E3EMhBYA==}
+
+ retext-smartypants@6.2.0:
+ resolution: {integrity: sha512-kk0jOU7+zGv//kfjXEBjdIryL1Acl4i9XNkHxtM7Tm5lFiCog576fjNC9hjoR7LTKQ0DsPWy09JummSsH1uqfQ==}
+
+ retext-stringify@4.0.0:
+ resolution: {integrity: sha512-rtfN/0o8kL1e+78+uxPTqu1Klt0yPzKuQ2BfWwwfgIUSayyzxpM1PJzkKt4V8803uB9qSy32MvI7Xep9khTpiA==}
+
+ retext@9.0.0:
+ resolution: {integrity: sha512-sbMDcpHCNjvlheSgMfEcVrZko3cDzdbe1x/e7G66dFp0Ff7Mldvi2uv6JkJQzdRcvLYE8CA8Oe8siQx8ZOgTcA==}
+
+ reusify@1.0.4:
+ resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+
+ rollup-plugin-preserve-directives@0.4.0:
+ resolution: {integrity: sha512-gx4nBxYm5BysmEQS+e2tAMrtFxrGvk+Pe5ppafRibQi0zlW7VYAbEGk6IKDw9sJGPdFWgVTE0o4BU4cdG0Fylg==}
+ peerDependencies:
+ rollup: 2.x || 3.x || 4.x
+
+ rollup@4.32.0:
+ resolution: {integrity: sha512-JmrhfQR31Q4AuNBjjAX4s+a/Pu/Q8Q9iwjWBsjRH1q52SPFE2NqRMK6fUZKKnvKO6id+h7JIRf0oYsph53eATg==}
+ engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+ hasBin: true
+
+ run-async@3.0.0:
+ resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==}
+ engines: {node: '>=0.12.0'}
+
+ run-parallel@1.2.0:
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+
+ rxjs@7.8.1:
+ resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==}
+
+ sade@1.8.1:
+ resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==}
+ engines: {node: '>=6'}
+
+ safe-buffer@5.2.1:
+ resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+
+ safer-buffer@2.1.2:
+ resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+
+ sax@1.4.1:
+ resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==}
+
+ scheduler@0.25.0:
+ resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==}
+
+ semver@6.3.1:
+ resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
+ hasBin: true
+
+ semver@7.5.4:
+ resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ semver@7.6.3:
+ resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==}
+ engines: {node: '>=10'}
+ hasBin: true
+
+ sharp@0.33.5:
+ resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==}
+ engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0}
+
+ shebang-command@2.0.0:
+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+ engines: {node: '>=8'}
+
+ shebang-regex@3.0.0:
+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+ engines: {node: '>=8'}
+
+ sherif-darwin-arm64@1.2.0:
+ resolution: {integrity: sha512-v3EcA7qVYz+jQHbYrH1E8dYTXCm6/+UcwIa2dsGhSMxEZcLw/4nDJ3q5MtDBexcutVZNYzoDFurjGZ7AwB0fEQ==}
+ cpu: [arm64]
+ os: [darwin]
+
+ sherif-darwin-x64@1.2.0:
+ resolution: {integrity: sha512-Mj1qNSNS0+uV/X53uCgAb51+mm9652mT+E6ji3uc+Sc5DKotMVKq9MyL5S1ZaaXa7KGRFCyXDUhdJSJR3lJ9tg==}
+ cpu: [x64]
+ os: [darwin]
+
+ sherif-linux-arm64@1.2.0:
+ resolution: {integrity: sha512-aMn1ZVISZiDDiPSwRtwDmTd2uQ9OWNQvhikIqHluTUbhzaWtPtodV8ZhJrmRs+DHKnEDxV4XfXsOYvsCv2bQQw==}
+ cpu: [arm64]
+ os: [linux]
+
+ sherif-linux-x64@1.2.0:
+ resolution: {integrity: sha512-n3rIpf479PyR5tcSOJm9lfD5d+iQTKQYBddzjY1nOWrjvagSkH/1EKhNzponNZWGfqgKlzBhUOBhcGkVXwTTRA==}
+ cpu: [x64]
+ os: [linux]
+
+ sherif-windows-arm64@1.2.0:
+ resolution: {integrity: sha512-bsIFSu3JTaad15gte/BsqMSunivdTXSXgDqSYtTXdEWK90+UrogVLK5D/Iy/CV7v0mgCWfXzs2wxg5jIhbC08Q==}
+ cpu: [arm64]
+ os: [win32]
+
+ sherif-windows-x64@1.2.0:
+ resolution: {integrity: sha512-Pqg1H1XYVHovirtfnC3YY53PhWF1KOMLcSc1k3+qRUzfYXRE66BpuSHLwNPAHqGvw6b8gDsJD4ZMTZvzs6hspw==}
+ cpu: [x64]
+ os: [win32]
+
+ sherif@1.2.0:
+ resolution: {integrity: sha512-lWdfPk9hqTSz78en8XrTnClYO/uP3LTAbxrrjxoIvi0ll4ts1WjXV6SRvBKXBXpcklGxETzQxqLZKqeqq0u+dQ==}
+ hasBin: true
+
+ shiki@1.29.1:
+ resolution: {integrity: sha512-TghWKV9pJTd/N+IgAIVJtr0qZkB7FfFCUrrEJc0aRmZupo3D1OCVRknQWVRVA7AX/M0Ld7QfoAruPzr3CnUJuw==}
+
+ siginfo@2.0.0:
+ resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
+
+ signal-exit@3.0.7:
+ resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
+
+ signal-exit@4.1.0:
+ resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
+ engines: {node: '>=14'}
+
+ simple-git@3.27.0:
+ resolution: {integrity: sha512-ivHoFS9Yi9GY49ogc6/YAi3Fl9ROnF4VyubNylgCkA+RVqLaKWnDSzXOVzya8csELIaWaYNutsEuAhZrtOjozA==}
+
+ simple-swizzle@0.2.2:
+ resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==}
+
+ sisteransi@1.0.5:
+ resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
+
+ sitemap@8.0.0:
+ resolution: {integrity: sha512-+AbdxhM9kJsHtruUF39bwS/B0Fytw6Fr1o4ZAIAEqA6cke2xcoO2GleBw9Zw7nRzILVEgz7zBM5GiTJjie1G9A==}
+ engines: {node: '>=14.0.0', npm: '>=6.0.0'}
+ hasBin: true
+
+ slash@3.0.0:
+ resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
+ engines: {node: '>=8'}
+
+ slice-ansi@7.1.0:
+ resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==}
+ engines: {node: '>=18'}
+
+ smol-toml@1.3.1:
+ resolution: {integrity: sha512-tEYNll18pPKHroYSmLLrksq233j021G0giwW7P3D24jC54pQ5W5BXMsQ/Mvw1OJCmEYDgY+lrzT+3nNUtoNfXQ==}
+ engines: {node: '>= 18'}
+
+ source-map-js@1.2.1:
+ 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'}
+
+ source-map@0.7.4:
+ resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==}
+ engines: {node: '>= 8'}
+
+ space-separated-tokens@2.0.2:
+ resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==}
+
+ split2@4.2.0:
+ resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==}
+ engines: {node: '>= 10.x'}
+
+ sprintf-js@1.0.3:
+ resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
+
+ stable-hash@0.0.4:
+ resolution: {integrity: sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==}
+
+ stack-utils@2.0.6:
+ resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==}
+ engines: {node: '>=10'}
+
+ stackback@0.0.2:
+ resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==}
+
+ std-env@3.8.0:
+ resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==}
+
+ stream-replace-string@2.0.0:
+ resolution: {integrity: sha512-TlnjJ1C0QrmxRNrON00JvaFFlNh5TTG00APw23j74ET7gkQpTASi6/L2fuiav8pzK715HXtUeClpBTw2NPSn6w==}
+
+ string-argv@0.3.2:
+ resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==}
+ engines: {node: '>=0.6.19'}
+
+ string-width@4.2.3:
+ resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+ engines: {node: '>=8'}
+
+ string-width@5.1.2:
+ resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
+ engines: {node: '>=12'}
+
+ string-width@7.2.0:
+ resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==}
+ engines: {node: '>=18'}
+
+ string_decoder@1.3.0:
+ resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
+
+ stringify-entities@4.0.4:
+ resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==}
+
+ strip-ansi@6.0.1:
+ resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+ engines: {node: '>=8'}
+
+ strip-ansi@7.1.0:
+ resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
+ engines: {node: '>=12'}
+
+ strip-bom@3.0.0:
+ resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
+ engines: {node: '>=4'}
+
+ strip-final-newline@4.0.0:
+ resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==}
+ engines: {node: '>=18'}
+
+ strip-indent@4.0.0:
+ resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==}
+ engines: {node: '>=12'}
+
+ strip-json-comments@3.1.1:
+ resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
+ engines: {node: '>=8'}
+
+ strip-json-comments@5.0.1:
+ resolution: {integrity: sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==}
+ engines: {node: '>=14.16'}
+
+ style-to-object@1.0.8:
+ resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==}
+
+ summary@2.1.0:
+ resolution: {integrity: sha512-nMIjMrd5Z2nuB2RZCKJfFMjgS3fygbeyGk9PxPPaJR1RIcyN9yn4A63Isovzm3ZtQuEkLBVgMdPup8UeLH7aQw==}
+
+ supports-color@7.2.0:
+ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+ engines: {node: '>=8'}
+
+ supports-color@8.1.1:
+ resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
+ engines: {node: '>=10'}
+
+ supports-preserve-symlinks-flag@1.0.0:
+ resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
+ engines: {node: '>= 0.4'}
+
+ tapable@2.2.1:
+ resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
+ engines: {node: '>=6'}
+
+ tar-stream@2.2.0:
+ resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==}
+ engines: {node: '>=6'}
+
+ test-exclude@6.0.0:
+ resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==}
+ engines: {node: '>=8'}
+
+ test-exclude@7.0.1:
+ resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==}
+ engines: {node: '>=18'}
+
+ text-extensions@2.4.0:
+ resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==}
+ engines: {node: '>=8'}
+
+ through@2.3.8:
+ resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
+
+ tinybench@2.9.0:
+ resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==}
+
+ tinyexec@0.3.2:
+ resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==}
+
+ tinypool@1.0.2:
+ resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+
+ tinyrainbow@2.0.0:
+ resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==}
+ engines: {node: '>=14.0.0'}
+
+ tinyspy@3.0.2:
+ resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==}
+ engines: {node: '>=14.0.0'}
+
+ tmp@0.0.33:
+ resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==}
+ engines: {node: '>=0.6.0'}
+
+ tmp@0.2.3:
+ resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==}
+ engines: {node: '>=14.14'}
+
+ tmpl@1.0.5:
+ resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==}
+
+ to-regex-range@5.0.1:
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+ engines: {node: '>=8.0'}
+
+ tree-kill@1.2.2:
+ resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==}
+ hasBin: true
+
+ trim-lines@3.0.1:
+ resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}
+
+ trough@2.2.0:
+ resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==}
+
+ ts-api-utils@2.0.0:
+ resolution: {integrity: sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==}
+ engines: {node: '>=18.12'}
+ peerDependencies:
+ typescript: '>=4.8.4'
+
+ tsconfck@3.1.4:
+ resolution: {integrity: sha512-kdqWFGVJqe+KGYvlSO9NIaWn9jT1Ny4oKVzAJsKii5eoE9snzTJzL4+MMVOMn+fikWGFmKEylcXL710V/kIPJQ==}
+ engines: {node: ^18 || >=20}
+ hasBin: true
+ peerDependencies:
+ typescript: ^5.0.0
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+
+ tsconfig-paths@4.2.0:
+ resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==}
+ engines: {node: '>=6'}
+
+ tslib@2.8.1:
+ resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+
+ type-check@0.4.0:
+ resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
+ engines: {node: '>= 0.8.0'}
+
+ type-detect@4.0.8:
+ resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==}
+ engines: {node: '>=4'}
+
+ type-fest@0.21.3:
+ resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
+ engines: {node: '>=10'}
+
+ type-fest@4.33.0:
+ resolution: {integrity: sha512-s6zVrxuyKbbAsSAD5ZPTB77q4YIdRctkTbJ2/Dqlinwz+8ooH2gd+YA7VA6Pa93KML9GockVvoxjZ2vHP+mu8g==}
+ engines: {node: '>=16'}
+
+ typedoc-plugin-frontmatter@1.1.2:
+ resolution: {integrity: sha512-ySNFQRqKjEM3IobtoND22LUuhpNLwPzTiAxTlqjn5uRLn8k8nqItvxWnWWRzaKMi870ZCvrz4wJHuVg+yqysmw==}
+ peerDependencies:
+ typedoc-plugin-markdown: '>=4.3.0'
+
+ typedoc-plugin-markdown@4.4.1:
+ resolution: {integrity: sha512-fx23nSCvewI9IR8lzIYtzDphETcgTDuxKcmHKGD4lo36oexC+B1k4NaCOY58Snqb4OlE8OXDAGVcQXYYuLRCNw==}
+ engines: {node: '>= 18'}
+ peerDependencies:
+ typedoc: 0.27.x
+
+ typedoc@0.27.6:
+ resolution: {integrity: sha512-oBFRoh2Px6jFx366db0lLlihcalq/JzyCVp7Vaq1yphL/tbgx2e+bkpkCgJPunaPvPwoTOXSwasfklWHm7GfAw==}
+ engines: {node: '>= 18'}
+ hasBin: true
+ peerDependencies:
+ typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x
+
+ typescript-eslint@8.20.0:
+ resolution: {integrity: sha512-Kxz2QRFsgbWj6Xcftlw3Dd154b3cEPFqQC+qMZrMypSijPd4UanKKvoKDrJ4o8AIfZFKAF+7sMaEIR8mTElozA==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ peerDependencies:
+ eslint: ^8.57.0 || ^9.0.0
+ typescript: '>=4.8.4 <5.8.0'
+
+ typescript@5.4.2:
+ resolution: {integrity: sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ typescript@5.6.3:
+ resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ typescript@5.7.3:
+ resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ uc.micro@2.1.0:
+ resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==}
+
+ ufo@1.5.4:
+ resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==}
+
+ ultrahtml@1.5.3:
+ resolution: {integrity: sha512-GykOvZwgDWZlTQMtp5jrD4BVL+gNn2NVlVafjcFUJ7taY20tqYdwdoWBFy6GBJsNTZe1GkGPkSl5knQAjtgceg==}
+
+ unc-path-regex@0.1.2:
+ resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==}
+ engines: {node: '>=0.10.0'}
+
+ uncrypto@0.1.3:
+ resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==}
+
+ undici-types@6.20.0:
+ resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==}
+
+ unenv@1.10.0:
+ resolution: {integrity: sha512-wY5bskBQFL9n3Eca5XnhH6KbUo/tfvkwm9OpcdCvLaeA7piBNbavbOKJySEwQ1V0RH6HvNlSAFRTpvTqgKRQXQ==}
+
+ unified@11.0.5:
+ resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==}
+
+ unist-util-find-after@5.0.0:
+ resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==}
+
+ unist-util-is@6.0.0:
+ resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==}
+
+ unist-util-modify-children@4.0.0:
+ resolution: {integrity: sha512-+tdN5fGNddvsQdIzUF3Xx82CU9sMM+fA0dLgR9vOmT0oPT2jH+P1nd5lSqfCfXAw+93NhcXNY2qqvTUtE4cQkw==}
+
+ unist-util-position-from-estree@2.0.0:
+ resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==}
+
+ unist-util-position@5.0.0:
+ resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==}
+
+ unist-util-remove-position@5.0.0:
+ resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==}
+
+ unist-util-stringify-position@4.0.0:
+ resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==}
+
+ unist-util-visit-children@3.0.0:
+ resolution: {integrity: sha512-RgmdTfSBOg04sdPcpTSD1jzoNBjt9a80/ZCzp5cI9n1qPzLZWF9YdvWGN2zmTumP1HWhXKdUWexjy/Wy/lJ7tA==}
+
+ unist-util-visit-parents@6.0.1:
+ resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==}
+
+ unist-util-visit@5.0.0:
+ resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==}
+
+ universalify@0.1.2:
+ resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==}
+ engines: {node: '>= 4.0.0'}
+
+ universalify@2.0.1:
+ resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
+ engines: {node: '>= 10.0.0'}
+
+ unstorage@1.14.4:
+ resolution: {integrity: sha512-1SYeamwuYeQJtJ/USE1x4l17LkmQBzg7deBJ+U9qOBoHo15d1cDxG4jM31zKRgF7pG0kirZy4wVMX6WL6Zoscg==}
+ peerDependencies:
+ '@azure/app-configuration': ^1.8.0
+ '@azure/cosmos': ^4.2.0
+ '@azure/data-tables': ^13.3.0
+ '@azure/identity': ^4.5.0
+ '@azure/keyvault-secrets': ^4.9.0
+ '@azure/storage-blob': ^12.26.0
+ '@capacitor/preferences': ^6.0.3
+ '@deno/kv': '>=0.8.4'
+ '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0
+ '@planetscale/database': ^1.19.0
+ '@upstash/redis': ^1.34.3
+ '@vercel/blob': '>=0.27.0'
+ '@vercel/kv': ^1.0.1
+ aws4fetch: ^1.0.20
+ db0: '>=0.2.1'
+ idb-keyval: ^6.2.1
+ ioredis: ^5.4.2
+ uploadthing: ^7.4.1
+ peerDependenciesMeta:
+ '@azure/app-configuration':
+ optional: true
+ '@azure/cosmos':
+ optional: true
+ '@azure/data-tables':
+ optional: true
+ '@azure/identity':
+ optional: true
+ '@azure/keyvault-secrets':
+ optional: true
+ '@azure/storage-blob':
+ optional: true
+ '@capacitor/preferences':
+ optional: true
+ '@deno/kv':
+ optional: true
+ '@netlify/blobs':
+ optional: true
+ '@planetscale/database':
+ optional: true
+ '@upstash/redis':
+ optional: true
+ '@vercel/blob':
+ optional: true
+ '@vercel/kv':
+ optional: true
+ aws4fetch:
+ optional: true
+ db0:
+ optional: true
+ idb-keyval:
+ optional: true
+ ioredis:
+ optional: true
+ uploadthing:
+ optional: true
+
+ update-browserslist-db@1.1.2:
+ resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
+
+ uri-js@4.4.1:
+ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+
+ util-deprecate@1.0.2:
+ resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+
+ v8flags@4.0.1:
+ resolution: {integrity: sha512-fcRLaS4H/hrZk9hYwbdRM35D0U8IYMfEClhXxCivOojl+yTRAZH3Zy2sSy6qVCiGbV9YAtPssP6jaChqC9vPCg==}
+ engines: {node: '>= 10.13.0'}
+
+ vfile-location@5.0.3:
+ resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==}
+
+ vfile-message@4.0.2:
+ resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==}
+
+ vfile@6.0.3:
+ resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==}
+
+ vite-node@3.0.4:
+ resolution: {integrity: sha512-7JZKEzcYV2Nx3u6rlvN8qdo3QV7Fxyt6hx+CCKz9fbWxdX5IvUOmTWEAxMrWxaiSf7CKGLJQ5rFu8prb/jBjOA==}
+ engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
+ hasBin: true
+
+ vite-plugin-dts@4.0.3:
+ resolution: {integrity: sha512-+xnTsaONwU2kV6zhRjtbRJSGN41uFR/whqmcb4k4fftLFDJElxthp0PP5Fq8gMeM9ytWMt1yk5gGgekLREWYQQ==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ peerDependencies:
+ typescript: '*'
+ vite: '*'
+ peerDependenciesMeta:
+ vite:
+ optional: true
+
+ vite-plugin-externalize-deps@0.9.0:
+ resolution: {integrity: sha512-wg3qb5gCy2d1KpPKyD9wkXMcYJ84yjgziHrStq9/8R7chhUC73mhQz+tVtvhFiICQHsBn1pnkY4IBbPqF9JHNw==}
+ peerDependencies:
+ vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0
+
+ vite-tsconfig-paths@5.1.4:
+ resolution: {integrity: sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==}
+ peerDependencies:
+ vite: '*'
+ peerDependenciesMeta:
+ vite:
+ optional: true
+
+ vite@6.0.11:
+ resolution: {integrity: sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==}
+ engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
+ jiti: '>=1.21.0'
+ less: '*'
+ lightningcss: ^1.21.0
+ sass: '*'
+ sass-embedded: '*'
+ stylus: '*'
+ sugarss: '*'
+ terser: ^5.16.0
+ tsx: ^4.8.1
+ yaml: ^2.4.2
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ jiti:
+ optional: true
+ less:
+ optional: true
+ lightningcss:
+ optional: true
+ sass:
+ optional: true
+ sass-embedded:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+ tsx:
+ optional: true
+ yaml:
+ optional: true
+
+ vitefu@1.0.5:
+ resolution: {integrity: sha512-h4Vflt9gxODPFNGPwp4zAMZRpZR7eslzwH2c5hn5kNZ5rhnKyRJ50U+yGCdc2IRaBs8O4haIgLNGrV5CrpMsCA==}
+ peerDependencies:
+ vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0
+ peerDependenciesMeta:
+ vite:
+ optional: true
+
+ vitest@3.0.4:
+ resolution: {integrity: sha512-6XG8oTKy2gnJIFTHP6LD7ExFeNLxiTkK3CfMvT7IfR8IN+BYICCf0lXUQmX7i7JoxUP8QmeP4mTnWXgflu4yjw==}
+ engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
+ hasBin: true
+ peerDependencies:
+ '@edge-runtime/vm': '*'
+ '@types/debug': ^4.1.12
+ '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
+ '@vitest/browser': 3.0.4
+ '@vitest/ui': 3.0.4
+ happy-dom: '*'
+ jsdom: '*'
+ peerDependenciesMeta:
+ '@edge-runtime/vm':
+ optional: true
+ '@types/debug':
+ optional: true
+ '@types/node':
+ optional: true
+ '@vitest/browser':
+ optional: true
+ '@vitest/ui':
+ optional: true
+ happy-dom:
+ optional: true
+ jsdom:
+ optional: true
+
+ vscode-uri@3.0.8:
+ resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==}
+
+ vue-eslint-parser@9.4.3:
+ resolution: {integrity: sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==}
+ engines: {node: ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: '>=6.0.0'
+
+ vue-tsc@2.0.29:
+ resolution: {integrity: sha512-MHhsfyxO3mYShZCGYNziSbc63x7cQ5g9kvijV7dRe1TTXBRLxXyL0FnXWpUF1xII2mJ86mwYpYsUmMwkmerq7Q==}
+ hasBin: true
+ peerDependencies:
+ typescript: '>=5.0.0'
+
+ walker@1.0.8:
+ resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==}
+
+ wcwidth@1.0.1:
+ resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==}
+
+ web-namespaces@2.0.1:
+ resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==}
+
+ which-pm-runs@1.1.0:
+ resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==}
+ engines: {node: '>=4'}
+
+ which-pm@3.0.0:
+ resolution: {integrity: sha512-ysVYmw6+ZBhx3+ZkcPwRuJi38ZOTLJJ33PSHaitLxSKUMsh0LkKd0nC69zZCwt5D+AYUcMK2hhw4yWny20vSGg==}
+ engines: {node: '>=18.12'}
+
+ which@1.3.1:
+ resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==}
+ hasBin: true
+
+ which@2.0.2:
+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+ engines: {node: '>= 8'}
+ hasBin: true
+
+ why-is-node-running@2.3.0:
+ resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==}
+ engines: {node: '>=8'}
+ hasBin: true
+
+ widest-line@5.0.0:
+ resolution: {integrity: sha512-c9bZp7b5YtRj2wOe6dlj32MK+Bx/M/d+9VB2SHM1OtsUHR0aV0tdP6DWh/iMt0kWi1t5g1Iudu6hQRNd1A4PVA==}
+ engines: {node: '>=18'}
+
+ word-wrap@1.2.5:
+ resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==}
+ engines: {node: '>=0.10.0'}
+
+ 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'}
+
+ wrap-ansi@8.1.0:
+ resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==}
+ engines: {node: '>=12'}
+
+ wrap-ansi@9.0.0:
+ resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==}
+ engines: {node: '>=18'}
+
+ wrappy@1.0.2:
+ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+
+ write-file-atomic@4.0.2:
+ resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==}
+ engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
+
+ xxhash-wasm@1.1.0:
+ resolution: {integrity: sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==}
+
+ y18n@5.0.8:
+ resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
+ engines: {node: '>=10'}
+
+ yallist@3.1.1:
+ resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+
+ yallist@4.0.0:
+ resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
+
+ yaml@2.7.0:
+ resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==}
+ engines: {node: '>= 14'}
+ hasBin: true
+
+ yargs-parser@21.1.1:
+ resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
+ engines: {node: '>=12'}
+
+ yargs@17.7.2:
+ resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
+ engines: {node: '>=12'}
+
+ yocto-queue@0.1.0:
+ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+ engines: {node: '>=10'}
+
+ yocto-queue@1.1.1:
+ resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==}
+ engines: {node: '>=12.20'}
+
+ yocto-spinner@0.1.2:
+ resolution: {integrity: sha512-VfmLIh/ZSZOJnVRQZc/dvpPP90lWL4G0bmxQMP0+U/2vKBA8GSpcBuWv17y7F+CZItRuO97HN1wdbb4p10uhOg==}
+ engines: {node: '>=18.19'}
+
+ yoctocolors-cjs@2.1.2:
+ resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==}
+ engines: {node: '>=18'}
+
+ yoctocolors@2.1.1:
+ resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==}
+ engines: {node: '>=18'}
+
+ zod-to-json-schema@3.24.1:
+ resolution: {integrity: sha512-3h08nf3Vw3Wl3PK+q3ow/lIil81IT2Oa7YpQyUUDsEWbXveMesdfK1xBd2RhCkynwZndAxixji/7SYJJowr62w==}
+ peerDependencies:
+ zod: ^3.24.1
+
+ zod-to-ts@1.2.0:
+ resolution: {integrity: sha512-x30XE43V+InwGpvTySRNz9kB7qFU8DlyEy7BsSTCHPH1R0QasMmHWZDCzYm6bVXtj/9NNJAZF3jW8rzFvH5OFA==}
+ peerDependencies:
+ typescript: ^4.9.4 || ^5.0.2
+ zod: ^3
+
+ zod-validation-error@3.4.0:
+ resolution: {integrity: sha512-ZOPR9SVY6Pb2qqO5XHt+MkkTRxGXb4EVtnjc9JpXUOtUB1T9Ru7mZOT361AN3MsetVe7R0a1KZshJDZdgp9miQ==}
+ engines: {node: '>=18.0.0'}
+ peerDependencies:
+ zod: ^3.18.0
+
+ zod@3.24.1:
+ resolution: {integrity: sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==}
+
+ zwitch@2.0.4:
+ resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==}
+
+snapshots:
+
+ '@ampproject/remapping@2.3.0':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.8
+ '@jridgewell/trace-mapping': 0.3.25
+
+ '@astrojs/compiler@2.10.3': {}
+
+ '@astrojs/internal-helpers@0.4.2': {}
+
+ '@astrojs/markdown-remark@6.0.2':
+ dependencies:
+ '@astrojs/prism': 3.2.0
+ github-slugger: 2.0.0
+ hast-util-from-html: 2.0.3
+ hast-util-to-text: 4.0.2
+ import-meta-resolve: 4.1.0
+ js-yaml: 4.1.0
+ mdast-util-definitions: 6.0.0
+ rehype-raw: 7.0.0
+ rehype-stringify: 10.0.1
+ remark-gfm: 4.0.0
+ remark-parse: 11.0.0
+ remark-rehype: 11.1.1
+ remark-smartypants: 3.0.2
+ shiki: 1.29.1
+ unified: 11.0.5
+ unist-util-remove-position: 5.0.0
+ unist-util-visit: 5.0.0
+ unist-util-visit-parents: 6.0.1
+ vfile: 6.0.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@astrojs/mdx@4.0.7(astro@5.1.9(@types/node@22.10.10)(jiti@2.4.2)(rollup@4.32.0)(typescript@5.7.3)(yaml@2.7.0))':
+ dependencies:
+ '@astrojs/markdown-remark': 6.0.2
+ '@mdx-js/mdx': 3.1.0(acorn@8.14.0)
+ acorn: 8.14.0
+ astro: 5.1.9(@types/node@22.10.10)(jiti@2.4.2)(rollup@4.32.0)(typescript@5.7.3)(yaml@2.7.0)
+ es-module-lexer: 1.6.0
+ estree-util-visit: 2.0.0
+ hast-util-to-html: 9.0.4
+ kleur: 4.1.5
+ rehype-raw: 7.0.0
+ remark-gfm: 4.0.0
+ remark-smartypants: 3.0.2
+ source-map: 0.7.4
+ unist-util-visit: 5.0.0
+ vfile: 6.0.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@astrojs/prism@3.2.0':
+ dependencies:
+ prismjs: 1.29.0
+
+ '@astrojs/react@4.1.6(@types/node@22.10.10)(@types/react-dom@19.0.3(@types/react@19.0.8))(@types/react@19.0.8)(jiti@2.4.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(yaml@2.7.0)':
+ dependencies:
+ '@types/react': 19.0.8
+ '@types/react-dom': 19.0.3(@types/react@19.0.8)
+ '@vitejs/plugin-react': 4.3.4(vite@6.0.11(@types/node@22.10.10)(jiti@2.4.2)(yaml@2.7.0))
+ react: 19.0.0
+ react-dom: 19.0.0(react@19.0.0)
+ ultrahtml: 1.5.3
+ vite: 6.0.11(@types/node@22.10.10)(jiti@2.4.2)(yaml@2.7.0)
+ transitivePeerDependencies:
+ - '@types/node'
+ - jiti
+ - less
+ - lightningcss
+ - sass
+ - sass-embedded
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+ - tsx
+ - yaml
+
+ '@astrojs/sitemap@3.2.1':
+ dependencies:
+ sitemap: 8.0.0
+ stream-replace-string: 2.0.0
+ zod: 3.24.1
+
+ '@astrojs/starlight@0.31.1(astro@5.1.9(@types/node@22.10.10)(jiti@2.4.2)(rollup@4.32.0)(typescript@5.7.3)(yaml@2.7.0))':
+ dependencies:
+ '@astrojs/mdx': 4.0.7(astro@5.1.9(@types/node@22.10.10)(jiti@2.4.2)(rollup@4.32.0)(typescript@5.7.3)(yaml@2.7.0))
+ '@astrojs/sitemap': 3.2.1
+ '@pagefind/default-ui': 1.3.0
+ '@types/hast': 3.0.4
+ '@types/js-yaml': 4.0.9
+ '@types/mdast': 4.0.4
+ astro: 5.1.9(@types/node@22.10.10)(jiti@2.4.2)(rollup@4.32.0)(typescript@5.7.3)(yaml@2.7.0)
+ astro-expressive-code: 0.40.1(astro@5.1.9(@types/node@22.10.10)(jiti@2.4.2)(rollup@4.32.0)(typescript@5.7.3)(yaml@2.7.0))
+ bcp-47: 2.1.0
+ hast-util-from-html: 2.0.3
+ hast-util-select: 6.0.3
+ hast-util-to-string: 3.0.1
+ hastscript: 9.0.0
+ i18next: 23.16.8
+ js-yaml: 4.1.0
+ mdast-util-directive: 3.1.0
+ mdast-util-to-markdown: 2.1.2
+ mdast-util-to-string: 4.0.0
+ pagefind: 1.3.0
+ rehype: 13.0.2
+ rehype-format: 5.0.1
+ remark-directive: 3.0.1
+ unified: 11.0.5
+ unist-util-visit: 5.0.0
+ vfile: 6.0.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@astrojs/telemetry@3.2.0':
+ dependencies:
+ ci-info: 4.1.0
+ debug: 4.4.0
+ dlv: 1.1.3
+ dset: 3.1.4
+ is-docker: 3.0.0
+ is-wsl: 3.1.0
+ which-pm-runs: 1.1.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/code-frame@7.26.2':
+ dependencies:
+ '@babel/helper-validator-identifier': 7.25.9
+ js-tokens: 4.0.0
+ picocolors: 1.1.1
+
+ '@babel/compat-data@7.26.5': {}
+
+ '@babel/core@7.26.0':
+ dependencies:
+ '@ampproject/remapping': 2.3.0
+ '@babel/code-frame': 7.26.2
+ '@babel/generator': 7.26.5
+ '@babel/helper-compilation-targets': 7.26.5
+ '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0)
+ '@babel/helpers': 7.26.0
+ '@babel/parser': 7.26.5
+ '@babel/template': 7.25.9
+ '@babel/traverse': 7.26.5
+ '@babel/types': 7.26.5
+ convert-source-map: 2.0.0
+ debug: 4.4.0
+ gensync: 1.0.0-beta.2
+ json5: 2.2.3
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/core@7.26.7':
+ dependencies:
+ '@ampproject/remapping': 2.3.0
+ '@babel/code-frame': 7.26.2
+ '@babel/generator': 7.26.5
+ '@babel/helper-compilation-targets': 7.26.5
+ '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.7)
+ '@babel/helpers': 7.26.7
+ '@babel/parser': 7.26.7
+ '@babel/template': 7.25.9
+ '@babel/traverse': 7.26.7
+ '@babel/types': 7.26.7
+ convert-source-map: 2.0.0
+ debug: 4.4.0
+ gensync: 1.0.0-beta.2
+ json5: 2.2.3
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/generator@7.26.5':
+ dependencies:
+ '@babel/parser': 7.26.5
+ '@babel/types': 7.26.5
+ '@jridgewell/gen-mapping': 0.3.8
+ '@jridgewell/trace-mapping': 0.3.25
+ jsesc: 3.1.0
+
+ '@babel/helper-compilation-targets@7.26.5':
+ dependencies:
+ '@babel/compat-data': 7.26.5
+ '@babel/helper-validator-option': 7.25.9
+ browserslist: 4.24.4
+ lru-cache: 5.1.1
+ semver: 6.3.1
+
+ '@babel/helper-module-imports@7.25.9':
+ dependencies:
+ '@babel/traverse': 7.26.5
+ '@babel/types': 7.26.5
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-module-imports': 7.25.9
+ '@babel/helper-validator-identifier': 7.25.9
+ '@babel/traverse': 7.26.5
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.7)':
+ dependencies:
+ '@babel/core': 7.26.7
+ '@babel/helper-module-imports': 7.25.9
+ '@babel/helper-validator-identifier': 7.25.9
+ '@babel/traverse': 7.26.5
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/helper-plugin-utils@7.26.5': {}
+
+ '@babel/helper-string-parser@7.25.9': {}
+
+ '@babel/helper-validator-identifier@7.25.9': {}
+
+ '@babel/helper-validator-option@7.25.9': {}
+
+ '@babel/helpers@7.26.0':
+ dependencies:
+ '@babel/template': 7.25.9
+ '@babel/types': 7.26.5
+
+ '@babel/helpers@7.26.7':
+ dependencies:
+ '@babel/template': 7.25.9
+ '@babel/types': 7.26.7
+
+ '@babel/parser@7.26.5':
+ dependencies:
+ '@babel/types': 7.26.5
+
+ '@babel/parser@7.26.7':
+ dependencies:
+ '@babel/types': 7.26.7
+
+ '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.26.5
+
+ '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.26.5
+
+ '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.26.5
+
+ '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.26.5
+
+ '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.26.5
+
+ '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.26.5
+
+ '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.26.5
+
+ '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.26.5
+
+ '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.26.5
+
+ '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.26.5
+
+ '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.26.5
+
+ '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.26.5
+
+ '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.26.5
+
+ '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.26.5
+
+ '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.26.5
+
+ '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.26.5
+
+ '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.26.5
+
+ '@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.26.5
+
+ '@babel/plugin-transform-react-jsx-source@7.25.9(@babel/core@7.26.0)':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/helper-plugin-utils': 7.26.5
+
+ '@babel/runtime@7.26.7':
+ dependencies:
+ regenerator-runtime: 0.14.1
+
+ '@babel/template@7.25.9':
+ dependencies:
+ '@babel/code-frame': 7.26.2
+ '@babel/parser': 7.26.5
+ '@babel/types': 7.26.5
+
+ '@babel/traverse@7.26.5':
+ dependencies:
+ '@babel/code-frame': 7.26.2
+ '@babel/generator': 7.26.5
+ '@babel/parser': 7.26.5
+ '@babel/template': 7.25.9
+ '@babel/types': 7.26.5
+ debug: 4.4.0
+ globals: 11.12.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/traverse@7.26.7':
+ dependencies:
+ '@babel/code-frame': 7.26.2
+ '@babel/generator': 7.26.5
+ '@babel/parser': 7.26.7
+ '@babel/template': 7.25.9
+ '@babel/types': 7.26.7
+ debug: 4.4.0
+ globals: 11.12.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@babel/types@7.26.5':
+ dependencies:
+ '@babel/helper-string-parser': 7.25.9
+ '@babel/helper-validator-identifier': 7.25.9
+
+ '@babel/types@7.26.7':
+ dependencies:
+ '@babel/helper-string-parser': 7.25.9
+ '@babel/helper-validator-identifier': 7.25.9
+
+ '@commitlint/parse@19.5.0':
+ dependencies:
+ '@commitlint/types': 19.5.0
+ conventional-changelog-angular: 7.0.0
+ conventional-commits-parser: 5.0.0
+
+ '@commitlint/types@19.5.0':
+ dependencies:
+ '@types/conventional-commits-parser': 5.0.1
+ chalk: 5.4.1
+
+ '@ctrl/tinycolor@4.1.0': {}
+
+ '@emnapi/core@1.3.1':
+ dependencies:
+ '@emnapi/wasi-threads': 1.0.1
+ tslib: 2.8.1
+
+ '@emnapi/runtime@1.3.1':
+ dependencies:
+ tslib: 2.8.1
+
+ '@emnapi/wasi-threads@1.0.1':
+ dependencies:
+ tslib: 2.8.1
+
+ '@esbuild/aix-ppc64@0.24.2':
+ optional: true
+
+ '@esbuild/android-arm64@0.24.2':
+ optional: true
+
+ '@esbuild/android-arm@0.24.2':
+ optional: true
+
+ '@esbuild/android-x64@0.24.2':
+ optional: true
+
+ '@esbuild/darwin-arm64@0.24.2':
+ optional: true
+
+ '@esbuild/darwin-x64@0.24.2':
+ optional: true
+
+ '@esbuild/freebsd-arm64@0.24.2':
+ optional: true
+
+ '@esbuild/freebsd-x64@0.24.2':
+ optional: true
+
+ '@esbuild/linux-arm64@0.24.2':
+ optional: true
+
+ '@esbuild/linux-arm@0.24.2':
+ optional: true
+
+ '@esbuild/linux-ia32@0.24.2':
+ optional: true
+
+ '@esbuild/linux-loong64@0.24.2':
+ optional: true
+
+ '@esbuild/linux-mips64el@0.24.2':
+ optional: true
+
+ '@esbuild/linux-ppc64@0.24.2':
+ optional: true
+
+ '@esbuild/linux-riscv64@0.24.2':
+ optional: true
+
+ '@esbuild/linux-s390x@0.24.2':
+ optional: true
+
+ '@esbuild/linux-x64@0.24.2':
+ optional: true
+
+ '@esbuild/netbsd-arm64@0.24.2':
+ optional: true
+
+ '@esbuild/netbsd-x64@0.24.2':
+ optional: true
+
+ '@esbuild/openbsd-arm64@0.24.2':
+ optional: true
+
+ '@esbuild/openbsd-x64@0.24.2':
+ optional: true
+
+ '@esbuild/sunos-x64@0.24.2':
+ optional: true
+
+ '@esbuild/win32-arm64@0.24.2':
+ optional: true
+
+ '@esbuild/win32-ia32@0.24.2':
+ optional: true
+
+ '@esbuild/win32-x64@0.24.2':
+ optional: true
+
+ '@eslint-community/eslint-utils@4.4.1(eslint@9.19.0(jiti@2.4.2))':
+ dependencies:
+ eslint: 9.19.0(jiti@2.4.2)
+ eslint-visitor-keys: 3.4.3
+
+ '@eslint-community/regexpp@4.12.1': {}
+
+ '@eslint/config-array@0.19.1':
+ dependencies:
+ '@eslint/object-schema': 2.1.5
+ debug: 4.4.0
+ minimatch: 3.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@eslint/core@0.10.0':
+ dependencies:
+ '@types/json-schema': 7.0.15
+
+ '@eslint/eslintrc@3.2.0':
+ dependencies:
+ ajv: 6.12.6
+ debug: 4.4.0
+ espree: 10.3.0
+ globals: 14.0.0
+ ignore: 5.3.2
+ import-fresh: 3.3.0
+ js-yaml: 4.1.0
+ minimatch: 3.1.2
+ strip-json-comments: 3.1.1
+ transitivePeerDependencies:
+ - supports-color
+
+ '@eslint/js@9.19.0': {}
+
+ '@eslint/object-schema@2.1.5': {}
+
+ '@eslint/plugin-kit@0.2.5':
+ dependencies:
+ '@eslint/core': 0.10.0
+ levn: 0.4.1
+
+ '@expressive-code/core@0.40.1':
+ dependencies:
+ '@ctrl/tinycolor': 4.1.0
+ hast-util-select: 6.0.3
+ hast-util-to-html: 9.0.4
+ hast-util-to-text: 4.0.2
+ hastscript: 9.0.0
+ postcss: 8.5.1
+ postcss-nested: 6.2.0(postcss@8.5.1)
+ unist-util-visit: 5.0.0
+ unist-util-visit-parents: 6.0.1
+
+ '@expressive-code/plugin-frames@0.40.1':
+ dependencies:
+ '@expressive-code/core': 0.40.1
+
+ '@expressive-code/plugin-shiki@0.40.1':
+ dependencies:
+ '@expressive-code/core': 0.40.1
+ shiki: 1.29.1
+
+ '@expressive-code/plugin-text-markers@0.40.1':
+ dependencies:
+ '@expressive-code/core': 0.40.1
+
+ '@gerrit0/mini-shiki@1.27.0':
+ dependencies:
+ '@shikijs/engine-oniguruma': 1.27.2
+ '@shikijs/types': 1.27.2
+ '@shikijs/vscode-textmate': 10.0.1
+
+ '@humanfs/core@0.19.1': {}
+
+ '@humanfs/node@0.16.6':
+ dependencies:
+ '@humanfs/core': 0.19.1
+ '@humanwhocodes/retry': 0.3.1
+
+ '@humanwhocodes/module-importer@1.0.1': {}
+
+ '@humanwhocodes/retry@0.3.1': {}
+
+ '@humanwhocodes/retry@0.4.1': {}
+
+ '@img/sharp-darwin-arm64@0.33.5':
+ optionalDependencies:
+ '@img/sharp-libvips-darwin-arm64': 1.0.4
+ optional: true
+
+ '@img/sharp-darwin-x64@0.33.5':
+ optionalDependencies:
+ '@img/sharp-libvips-darwin-x64': 1.0.4
+ optional: true
+
+ '@img/sharp-libvips-darwin-arm64@1.0.4':
+ optional: true
+
+ '@img/sharp-libvips-darwin-x64@1.0.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-arm64@1.0.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-arm@1.0.5':
+ optional: true
+
+ '@img/sharp-libvips-linux-s390x@1.0.4':
+ optional: true
+
+ '@img/sharp-libvips-linux-x64@1.0.4':
+ optional: true
+
+ '@img/sharp-libvips-linuxmusl-arm64@1.0.4':
+ optional: true
+
+ '@img/sharp-libvips-linuxmusl-x64@1.0.4':
+ optional: true
+
+ '@img/sharp-linux-arm64@0.33.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-arm64': 1.0.4
+ optional: true
+
+ '@img/sharp-linux-arm@0.33.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-arm': 1.0.5
+ optional: true
+
+ '@img/sharp-linux-s390x@0.33.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-s390x': 1.0.4
+ optional: true
+
+ '@img/sharp-linux-x64@0.33.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-x64': 1.0.4
+ optional: true
+
+ '@img/sharp-linuxmusl-arm64@0.33.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-arm64': 1.0.4
+ optional: true
+
+ '@img/sharp-linuxmusl-x64@0.33.5':
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-x64': 1.0.4
+ optional: true
+
+ '@img/sharp-wasm32@0.33.5':
+ dependencies:
+ '@emnapi/runtime': 1.3.1
+ optional: true
+
+ '@img/sharp-win32-ia32@0.33.5':
+ optional: true
+
+ '@img/sharp-win32-x64@0.33.5':
+ optional: true
+
+ '@inquirer/checkbox@4.0.6(@types/node@22.10.10)':
+ dependencies:
+ '@inquirer/core': 10.1.4(@types/node@22.10.10)
+ '@inquirer/figures': 1.0.9
+ '@inquirer/type': 3.0.2(@types/node@22.10.10)
+ '@types/node': 22.10.10
+ ansi-escapes: 4.3.2
+ yoctocolors-cjs: 2.1.2
+
+ '@inquirer/confirm@5.1.3(@types/node@22.10.10)':
+ dependencies:
+ '@inquirer/core': 10.1.4(@types/node@22.10.10)
+ '@inquirer/type': 3.0.2(@types/node@22.10.10)
+ '@types/node': 22.10.10
+
+ '@inquirer/core@10.1.4(@types/node@22.10.10)':
+ dependencies:
+ '@inquirer/figures': 1.0.9
+ '@inquirer/type': 3.0.2(@types/node@22.10.10)
+ ansi-escapes: 4.3.2
+ cli-width: 4.1.0
+ mute-stream: 2.0.0
+ signal-exit: 4.1.0
+ strip-ansi: 6.0.1
+ wrap-ansi: 6.2.0
+ yoctocolors-cjs: 2.1.2
+ transitivePeerDependencies:
+ - '@types/node'
+
+ '@inquirer/editor@4.2.3(@types/node@22.10.10)':
+ dependencies:
+ '@inquirer/core': 10.1.4(@types/node@22.10.10)
+ '@inquirer/type': 3.0.2(@types/node@22.10.10)
+ '@types/node': 22.10.10
+ external-editor: 3.1.0
+
+ '@inquirer/expand@4.0.6(@types/node@22.10.10)':
+ dependencies:
+ '@inquirer/core': 10.1.4(@types/node@22.10.10)
+ '@inquirer/type': 3.0.2(@types/node@22.10.10)
+ '@types/node': 22.10.10
+ yoctocolors-cjs: 2.1.2
+
+ '@inquirer/figures@1.0.9': {}
+
+ '@inquirer/input@4.1.3(@types/node@22.10.10)':
+ dependencies:
+ '@inquirer/core': 10.1.4(@types/node@22.10.10)
+ '@inquirer/type': 3.0.2(@types/node@22.10.10)
+ '@types/node': 22.10.10
+
+ '@inquirer/number@3.0.6(@types/node@22.10.10)':
+ dependencies:
+ '@inquirer/core': 10.1.4(@types/node@22.10.10)
+ '@inquirer/type': 3.0.2(@types/node@22.10.10)
+ '@types/node': 22.10.10
+
+ '@inquirer/password@4.0.6(@types/node@22.10.10)':
+ dependencies:
+ '@inquirer/core': 10.1.4(@types/node@22.10.10)
+ '@inquirer/type': 3.0.2(@types/node@22.10.10)
+ '@types/node': 22.10.10
+ ansi-escapes: 4.3.2
+
+ '@inquirer/prompts@7.2.3(@types/node@22.10.10)':
+ dependencies:
+ '@inquirer/checkbox': 4.0.6(@types/node@22.10.10)
+ '@inquirer/confirm': 5.1.3(@types/node@22.10.10)
+ '@inquirer/editor': 4.2.3(@types/node@22.10.10)
+ '@inquirer/expand': 4.0.6(@types/node@22.10.10)
+ '@inquirer/input': 4.1.3(@types/node@22.10.10)
+ '@inquirer/number': 3.0.6(@types/node@22.10.10)
+ '@inquirer/password': 4.0.6(@types/node@22.10.10)
+ '@inquirer/rawlist': 4.0.6(@types/node@22.10.10)
+ '@inquirer/search': 3.0.6(@types/node@22.10.10)
+ '@inquirer/select': 4.0.6(@types/node@22.10.10)
+ '@types/node': 22.10.10
+
+ '@inquirer/rawlist@4.0.6(@types/node@22.10.10)':
+ dependencies:
+ '@inquirer/core': 10.1.4(@types/node@22.10.10)
+ '@inquirer/type': 3.0.2(@types/node@22.10.10)
+ '@types/node': 22.10.10
+ yoctocolors-cjs: 2.1.2
+
+ '@inquirer/search@3.0.6(@types/node@22.10.10)':
+ dependencies:
+ '@inquirer/core': 10.1.4(@types/node@22.10.10)
+ '@inquirer/figures': 1.0.9
+ '@inquirer/type': 3.0.2(@types/node@22.10.10)
+ '@types/node': 22.10.10
+ yoctocolors-cjs: 2.1.2
+
+ '@inquirer/select@4.0.6(@types/node@22.10.10)':
+ dependencies:
+ '@inquirer/core': 10.1.4(@types/node@22.10.10)
+ '@inquirer/figures': 1.0.9
+ '@inquirer/type': 3.0.2(@types/node@22.10.10)
+ '@types/node': 22.10.10
+ ansi-escapes: 4.3.2
+ yoctocolors-cjs: 2.1.2
+
+ '@inquirer/type@3.0.2(@types/node@22.10.10)':
+ dependencies:
+ '@types/node': 22.10.10
+
+ '@isaacs/cliui@8.0.2':
+ dependencies:
+ string-width: 5.1.2
+ string-width-cjs: string-width@4.2.3
+ strip-ansi: 7.1.0
+ strip-ansi-cjs: strip-ansi@6.0.1
+ wrap-ansi: 8.1.0
+ wrap-ansi-cjs: wrap-ansi@7.0.0
+
+ '@istanbuljs/load-nyc-config@1.1.0':
+ dependencies:
+ camelcase: 5.3.1
+ find-up: 4.1.0
+ get-package-type: 0.1.0
+ js-yaml: 3.14.1
+ resolve-from: 5.0.0
+
+ '@istanbuljs/schema@0.1.3': {}
+
+ '@jest/environment@29.7.0':
+ dependencies:
+ '@jest/fake-timers': 29.7.0
+ '@jest/types': 29.6.3
+ '@types/node': 22.10.10
+ jest-mock: 29.7.0
+
+ '@jest/expect-utils@29.7.0':
+ dependencies:
+ jest-get-type: 29.6.3
+
+ '@jest/expect@29.7.0':
+ dependencies:
+ expect: 29.7.0
+ jest-snapshot: 29.7.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@jest/fake-timers@29.7.0':
+ dependencies:
+ '@jest/types': 29.6.3
+ '@sinonjs/fake-timers': 10.3.0
+ '@types/node': 22.10.10
+ jest-message-util: 29.7.0
+ jest-mock: 29.7.0
+ jest-util: 29.7.0
+
+ '@jest/globals@29.7.0':
+ dependencies:
+ '@jest/environment': 29.7.0
+ '@jest/expect': 29.7.0
+ '@jest/types': 29.6.3
+ jest-mock: 29.7.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@jest/schemas@29.6.3':
+ dependencies:
+ '@sinclair/typebox': 0.27.8
+
+ '@jest/transform@29.7.0':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@jest/types': 29.6.3
+ '@jridgewell/trace-mapping': 0.3.25
+ babel-plugin-istanbul: 6.1.1
+ chalk: 4.1.2
+ convert-source-map: 2.0.0
+ fast-json-stable-stringify: 2.1.0
+ graceful-fs: 4.2.11
+ jest-haste-map: 29.7.0
+ jest-regex-util: 29.6.3
+ jest-util: 29.7.0
+ micromatch: 4.0.8
+ pirates: 4.0.6
+ slash: 3.0.0
+ write-file-atomic: 4.0.2
+ transitivePeerDependencies:
+ - supports-color
+
+ '@jest/types@29.6.3':
+ dependencies:
+ '@jest/schemas': 29.6.3
+ '@types/istanbul-lib-coverage': 2.0.6
+ '@types/istanbul-reports': 3.0.4
+ '@types/node': 22.10.10
+ '@types/yargs': 17.0.33
+ chalk: 4.1.2
+
+ '@jridgewell/gen-mapping@0.3.8':
+ dependencies:
+ '@jridgewell/set-array': 1.2.1
+ '@jridgewell/sourcemap-codec': 1.5.0
+ '@jridgewell/trace-mapping': 0.3.25
+
+ '@jridgewell/resolve-uri@3.1.2': {}
+
+ '@jridgewell/set-array@1.2.1': {}
+
+ '@jridgewell/sourcemap-codec@1.5.0': {}
+
+ '@jridgewell/trace-mapping@0.3.25':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.5.0
+
+ '@kwsites/file-exists@1.1.1':
+ dependencies:
+ debug: 4.4.0
+ transitivePeerDependencies:
+ - supports-color
+
+ '@kwsites/promise-deferred@1.1.1': {}
+
+ '@mdx-js/mdx@3.1.0(acorn@8.14.0)':
+ dependencies:
+ '@types/estree': 1.0.6
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.4
+ '@types/mdx': 2.0.13
+ collapse-white-space: 2.1.0
+ devlop: 1.1.0
+ estree-util-is-identifier-name: 3.0.0
+ estree-util-scope: 1.0.0
+ estree-walker: 3.0.3
+ hast-util-to-jsx-runtime: 2.3.2
+ markdown-extensions: 2.0.0
+ recma-build-jsx: 1.0.0
+ recma-jsx: 1.0.0(acorn@8.14.0)
+ recma-stringify: 1.0.0
+ rehype-recma: 1.0.0
+ remark-mdx: 3.1.0
+ remark-parse: 11.0.0
+ remark-rehype: 11.1.1
+ source-map: 0.7.4
+ unified: 11.0.5
+ unist-util-position-from-estree: 2.0.0
+ unist-util-stringify-position: 4.0.0
+ unist-util-visit: 5.0.0
+ vfile: 6.0.3
+ transitivePeerDependencies:
+ - acorn
+ - supports-color
+
+ '@microsoft/api-extractor-model@7.29.4(@types/node@22.10.10)':
+ dependencies:
+ '@microsoft/tsdoc': 0.15.1
+ '@microsoft/tsdoc-config': 0.17.1
+ '@rushstack/node-core-library': 5.5.1(@types/node@22.10.10)
+ transitivePeerDependencies:
+ - '@types/node'
+
+ '@microsoft/api-extractor@7.47.4(@types/node@22.10.10)':
+ dependencies:
+ '@microsoft/api-extractor-model': 7.29.4(@types/node@22.10.10)
+ '@microsoft/tsdoc': 0.15.1
+ '@microsoft/tsdoc-config': 0.17.1
+ '@rushstack/node-core-library': 5.5.1(@types/node@22.10.10)
+ '@rushstack/rig-package': 0.5.3
+ '@rushstack/terminal': 0.13.3(@types/node@22.10.10)
+ '@rushstack/ts-command-line': 4.22.3(@types/node@22.10.10)
+ lodash: 4.17.21
+ minimatch: 3.0.8
+ resolve: 1.22.10
+ semver: 7.5.4
+ source-map: 0.6.1
+ typescript: 5.4.2
+ transitivePeerDependencies:
+ - '@types/node'
+
+ '@microsoft/tsdoc-config@0.17.1':
+ dependencies:
+ '@microsoft/tsdoc': 0.15.1
+ ajv: 8.12.0
+ jju: 1.4.0
+ resolve: 1.22.10
+
+ '@microsoft/tsdoc@0.15.1': {}
+
+ '@napi-rs/wasm-runtime@0.2.4':
+ dependencies:
+ '@emnapi/core': 1.3.1
+ '@emnapi/runtime': 1.3.1
+ '@tybys/wasm-util': 0.9.0
+
+ '@nodelib/fs.scandir@2.1.5':
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ run-parallel: 1.2.0
+
+ '@nodelib/fs.scandir@4.0.1':
+ dependencies:
+ '@nodelib/fs.stat': 4.0.0
+ run-parallel: 1.2.0
+
+ '@nodelib/fs.stat@2.0.5': {}
+
+ '@nodelib/fs.stat@4.0.0': {}
+
+ '@nodelib/fs.walk@1.2.8':
+ dependencies:
+ '@nodelib/fs.scandir': 2.1.5
+ fastq: 1.18.0
+
+ '@nodelib/fs.walk@3.0.1':
+ dependencies:
+ '@nodelib/fs.scandir': 4.0.1
+ fastq: 1.18.0
+
+ '@nx/nx-darwin-arm64@20.3.3':
+ optional: true
+
+ '@nx/nx-darwin-x64@20.3.3':
+ optional: true
+
+ '@nx/nx-freebsd-x64@20.3.3':
+ optional: true
+
+ '@nx/nx-linux-arm-gnueabihf@20.3.3':
+ optional: true
+
+ '@nx/nx-linux-arm64-gnu@20.3.3':
+ optional: true
+
+ '@nx/nx-linux-arm64-musl@20.3.3':
+ optional: true
+
+ '@nx/nx-linux-x64-gnu@20.3.3':
+ optional: true
+
+ '@nx/nx-linux-x64-musl@20.3.3':
+ optional: true
+
+ '@nx/nx-win32-arm64-msvc@20.3.3':
+ optional: true
+
+ '@nx/nx-win32-x64-msvc@20.3.3':
+ optional: true
+
+ '@oslojs/encoding@1.1.0': {}
+
+ '@pagefind/darwin-arm64@1.3.0':
+ optional: true
+
+ '@pagefind/darwin-x64@1.3.0':
+ optional: true
+
+ '@pagefind/default-ui@1.3.0': {}
+
+ '@pagefind/linux-arm64@1.3.0':
+ optional: true
+
+ '@pagefind/linux-x64@1.3.0':
+ optional: true
+
+ '@pagefind/windows-x64@1.3.0':
+ optional: true
+
+ '@pkgjs/parseargs@0.11.0':
+ optional: true
+
+ '@publint/pack@0.1.1': {}
+
+ '@rollup/pluginutils@5.1.4(rollup@4.32.0)':
+ dependencies:
+ '@types/estree': 1.0.6
+ estree-walker: 2.0.2
+ picomatch: 4.0.2
+ optionalDependencies:
+ rollup: 4.32.0
+
+ '@rollup/rollup-android-arm-eabi@4.32.0':
+ optional: true
+
+ '@rollup/rollup-android-arm64@4.32.0':
+ optional: true
+
+ '@rollup/rollup-darwin-arm64@4.32.0':
+ optional: true
+
+ '@rollup/rollup-darwin-x64@4.32.0':
+ optional: true
+
+ '@rollup/rollup-freebsd-arm64@4.32.0':
+ optional: true
+
+ '@rollup/rollup-freebsd-x64@4.32.0':
+ optional: true
+
+ '@rollup/rollup-linux-arm-gnueabihf@4.32.0':
+ optional: true
+
+ '@rollup/rollup-linux-arm-musleabihf@4.32.0':
+ optional: true
+
+ '@rollup/rollup-linux-arm64-gnu@4.32.0':
+ optional: true
+
+ '@rollup/rollup-linux-arm64-musl@4.32.0':
+ optional: true
+
+ '@rollup/rollup-linux-loongarch64-gnu@4.32.0':
+ optional: true
+
+ '@rollup/rollup-linux-powerpc64le-gnu@4.32.0':
+ optional: true
+
+ '@rollup/rollup-linux-riscv64-gnu@4.32.0':
+ optional: true
+
+ '@rollup/rollup-linux-s390x-gnu@4.32.0':
+ optional: true
+
+ '@rollup/rollup-linux-x64-gnu@4.32.0':
+ optional: true
+
+ '@rollup/rollup-linux-x64-musl@4.32.0':
+ optional: true
+
+ '@rollup/rollup-win32-arm64-msvc@4.32.0':
+ optional: true
+
+ '@rollup/rollup-win32-ia32-msvc@4.32.0':
+ optional: true
+
+ '@rollup/rollup-win32-x64-msvc@4.32.0':
+ optional: true
+
+ '@rushstack/node-core-library@5.5.1(@types/node@22.10.10)':
+ dependencies:
+ ajv: 8.13.0
+ ajv-draft-04: 1.0.0(ajv@8.13.0)
+ ajv-formats: 3.0.1(ajv@8.13.0)
+ fs-extra: 7.0.1
+ import-lazy: 4.0.0
+ jju: 1.4.0
+ resolve: 1.22.10
+ semver: 7.5.4
+ optionalDependencies:
+ '@types/node': 22.10.10
+
+ '@rushstack/rig-package@0.5.3':
+ dependencies:
+ resolve: 1.22.10
+ strip-json-comments: 3.1.1
+
+ '@rushstack/terminal@0.13.3(@types/node@22.10.10)':
+ dependencies:
+ '@rushstack/node-core-library': 5.5.1(@types/node@22.10.10)
+ supports-color: 8.1.1
+ optionalDependencies:
+ '@types/node': 22.10.10
+
+ '@rushstack/ts-command-line@4.22.3(@types/node@22.10.10)':
+ dependencies:
+ '@rushstack/terminal': 0.13.3(@types/node@22.10.10)
+ '@types/argparse': 1.0.38
+ argparse: 1.0.10
+ string-argv: 0.3.2
+ transitivePeerDependencies:
+ - '@types/node'
+
+ '@shikijs/core@1.29.1':
+ dependencies:
+ '@shikijs/engine-javascript': 1.29.1
+ '@shikijs/engine-oniguruma': 1.29.1
+ '@shikijs/types': 1.29.1
+ '@shikijs/vscode-textmate': 10.0.1
+ '@types/hast': 3.0.4
+ hast-util-to-html: 9.0.4
+
+ '@shikijs/engine-javascript@1.29.1':
+ dependencies:
+ '@shikijs/types': 1.29.1
+ '@shikijs/vscode-textmate': 10.0.1
+ oniguruma-to-es: 2.3.0
+
+ '@shikijs/engine-oniguruma@1.27.2':
+ dependencies:
+ '@shikijs/types': 1.27.2
+ '@shikijs/vscode-textmate': 10.0.1
+
+ '@shikijs/engine-oniguruma@1.29.1':
+ dependencies:
+ '@shikijs/types': 1.29.1
+ '@shikijs/vscode-textmate': 10.0.1
+
+ '@shikijs/langs@1.29.1':
+ dependencies:
+ '@shikijs/types': 1.29.1
+
+ '@shikijs/themes@1.29.1':
+ dependencies:
+ '@shikijs/types': 1.29.1
+
+ '@shikijs/types@1.27.2':
+ dependencies:
+ '@shikijs/vscode-textmate': 10.0.1
+ '@types/hast': 3.0.4
+
+ '@shikijs/types@1.29.1':
+ dependencies:
+ '@shikijs/vscode-textmate': 10.0.1
+ '@types/hast': 3.0.4
+
+ '@shikijs/vscode-textmate@10.0.1': {}
+
+ '@sinclair/typebox@0.27.8': {}
+
+ '@sinonjs/commons@3.0.1':
+ dependencies:
+ type-detect: 4.0.8
+
+ '@sinonjs/fake-timers@10.3.0':
+ dependencies:
+ '@sinonjs/commons': 3.0.1
+
+ '@snyk/github-codeowners@1.1.0':
+ dependencies:
+ commander: 4.1.1
+ ignore: 5.3.2
+ p-map: 4.0.0
+
+ '@stylistic/eslint-plugin-js@2.13.0(eslint@9.19.0(jiti@2.4.2))':
+ dependencies:
+ eslint: 9.19.0(jiti@2.4.2)
+ eslint-visitor-keys: 4.2.0
+ espree: 10.3.0
+
+ '@tanstack/config@0.16.1(@types/node@22.10.10)(esbuild@0.24.2)(eslint@9.19.0(jiti@2.4.2))(rollup@4.32.0)(typescript@5.6.3)(vite@6.0.11(@types/node@22.10.10)(jiti@2.4.2)(yaml@2.7.0))':
+ dependencies:
+ '@commitlint/parse': 19.5.0
+ '@eslint/js': 9.19.0
+ '@stylistic/eslint-plugin-js': 2.13.0(eslint@9.19.0(jiti@2.4.2))
+ commander: 13.0.0
+ esbuild-register: 3.6.0(esbuild@0.24.2)
+ eslint-plugin-import-x: 4.6.1(eslint@9.19.0(jiti@2.4.2))(typescript@5.6.3)
+ eslint-plugin-n: 17.15.1(eslint@9.19.0(jiti@2.4.2))
+ globals: 15.14.0
+ interpret: 3.1.1
+ jsonfile: 6.1.0
+ liftoff: 5.0.0
+ minimist: 1.2.8
+ rollup-plugin-preserve-directives: 0.4.0(rollup@4.32.0)
+ semver: 7.6.3
+ simple-git: 3.27.0
+ typedoc: 0.27.6(typescript@5.6.3)
+ typedoc-plugin-frontmatter: 1.1.2(typedoc-plugin-markdown@4.4.1(typedoc@0.27.6(typescript@5.6.3)))
+ typedoc-plugin-markdown: 4.4.1(typedoc@0.27.6(typescript@5.6.3))
+ typescript-eslint: 8.20.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.6.3)
+ v8flags: 4.0.1
+ vite-plugin-dts: 4.0.3(@types/node@22.10.10)(rollup@4.32.0)(typescript@5.6.3)(vite@6.0.11(@types/node@22.10.10)(jiti@2.4.2)(yaml@2.7.0))
+ vite-plugin-externalize-deps: 0.9.0(vite@6.0.11(@types/node@22.10.10)(jiti@2.4.2)(yaml@2.7.0))
+ vite-tsconfig-paths: 5.1.4(typescript@5.6.3)(vite@6.0.11(@types/node@22.10.10)(jiti@2.4.2)(yaml@2.7.0))
+ vue-eslint-parser: 9.4.3(eslint@9.19.0(jiti@2.4.2))
+ transitivePeerDependencies:
+ - '@types/node'
+ - esbuild
+ - eslint
+ - rollup
+ - supports-color
+ - typescript
+ - vite
+
+ '@tybys/wasm-util@0.9.0':
+ dependencies:
+ tslib: 2.8.1
+
+ '@types/acorn@4.0.6':
+ dependencies:
+ '@types/estree': 1.0.6
+
+ '@types/argparse@1.0.38': {}
+
+ '@types/babel__code-frame@7.0.6': {}
+
+ '@types/babel__core@7.20.5':
+ dependencies:
+ '@babel/parser': 7.26.5
+ '@babel/types': 7.26.5
+ '@types/babel__generator': 7.6.8
+ '@types/babel__template': 7.4.4
+ '@types/babel__traverse': 7.20.6
+
+ '@types/babel__generator@7.6.8':
+ dependencies:
+ '@babel/types': 7.26.5
+
+ '@types/babel__template@7.4.4':
+ dependencies:
+ '@babel/parser': 7.26.5
+ '@babel/types': 7.26.5
+
+ '@types/babel__traverse@7.20.6':
+ dependencies:
+ '@babel/types': 7.26.5
+
+ '@types/conventional-commits-parser@5.0.1':
+ dependencies:
+ '@types/node': 22.10.10
+
+ '@types/cookie@0.6.0': {}
+
+ '@types/debug@4.1.12':
+ dependencies:
+ '@types/ms': 2.1.0
+
+ '@types/doctrine@0.0.9': {}
+
+ '@types/estree-jsx@1.0.5':
+ dependencies:
+ '@types/estree': 1.0.6
+
+ '@types/estree@1.0.6': {}
+
+ '@types/graceful-fs@4.1.9':
+ dependencies:
+ '@types/node': 22.10.10
+
+ '@types/hast@3.0.4':
+ dependencies:
+ '@types/unist': 3.0.3
+
+ '@types/inquirer@9.0.7':
+ dependencies:
+ '@types/through': 0.0.33
+ rxjs: 7.8.1
+
+ '@types/istanbul-lib-coverage@2.0.6': {}
+
+ '@types/istanbul-lib-report@3.0.3':
+ dependencies:
+ '@types/istanbul-lib-coverage': 2.0.6
+
+ '@types/istanbul-reports@3.0.4':
+ dependencies:
+ '@types/istanbul-lib-report': 3.0.3
+
+ '@types/js-yaml@4.0.9': {}
+
+ '@types/json-schema@7.0.15': {}
+
+ '@types/mdast@4.0.4':
+ dependencies:
+ '@types/unist': 3.0.3
+
+ '@types/mdx@2.0.13': {}
+
+ '@types/ms@2.1.0': {}
+
+ '@types/nlcst@2.0.3':
+ dependencies:
+ '@types/unist': 3.0.3
+
+ '@types/node@17.0.45': {}
+
+ '@types/node@22.10.10':
+ dependencies:
+ undici-types: 6.20.0
+
+ '@types/react-dom@19.0.3(@types/react@19.0.8)':
+ dependencies:
+ '@types/react': 19.0.8
+
+ '@types/react@19.0.8':
+ dependencies:
+ csstype: 3.1.3
+
+ '@types/sax@1.2.7':
+ dependencies:
+ '@types/node': 17.0.45
+
+ '@types/stack-utils@2.0.3': {}
+
+ '@types/through@0.0.33':
+ dependencies:
+ '@types/node': 22.10.10
+
+ '@types/unist@2.0.11': {}
+
+ '@types/unist@3.0.3': {}
+
+ '@types/yargs-parser@21.0.3': {}
+
+ '@types/yargs@17.0.33':
+ dependencies:
+ '@types/yargs-parser': 21.0.3
+
+ '@typescript-eslint/eslint-plugin@8.20.0(@typescript-eslint/parser@8.20.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.6.3))(eslint@9.19.0(jiti@2.4.2))(typescript@5.6.3)':
+ dependencies:
+ '@eslint-community/regexpp': 4.12.1
+ '@typescript-eslint/parser': 8.20.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.6.3)
+ '@typescript-eslint/scope-manager': 8.20.0
+ '@typescript-eslint/type-utils': 8.20.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.6.3)
+ '@typescript-eslint/utils': 8.20.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.6.3)
+ '@typescript-eslint/visitor-keys': 8.20.0
+ eslint: 9.19.0(jiti@2.4.2)
+ graphemer: 1.4.0
+ ignore: 5.3.2
+ natural-compare: 1.4.0
+ ts-api-utils: 2.0.0(typescript@5.6.3)
+ typescript: 5.6.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/parser@8.20.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.6.3)':
+ dependencies:
+ '@typescript-eslint/scope-manager': 8.20.0
+ '@typescript-eslint/types': 8.20.0
+ '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.6.3)
+ '@typescript-eslint/visitor-keys': 8.20.0
+ debug: 4.4.0
+ eslint: 9.19.0(jiti@2.4.2)
+ typescript: 5.6.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/scope-manager@8.20.0':
+ dependencies:
+ '@typescript-eslint/types': 8.20.0
+ '@typescript-eslint/visitor-keys': 8.20.0
+
+ '@typescript-eslint/type-utils@8.20.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.6.3)':
+ dependencies:
+ '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.6.3)
+ '@typescript-eslint/utils': 8.20.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.6.3)
+ debug: 4.4.0
+ eslint: 9.19.0(jiti@2.4.2)
+ ts-api-utils: 2.0.0(typescript@5.6.3)
+ typescript: 5.6.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/types@8.20.0': {}
+
+ '@typescript-eslint/typescript-estree@8.20.0(typescript@5.6.3)':
+ dependencies:
+ '@typescript-eslint/types': 8.20.0
+ '@typescript-eslint/visitor-keys': 8.20.0
+ debug: 4.4.0
+ fast-glob: 3.3.3
+ is-glob: 4.0.3
+ minimatch: 9.0.5
+ semver: 7.6.3
+ ts-api-utils: 2.0.0(typescript@5.6.3)
+ typescript: 5.6.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/utils@8.20.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.6.3)':
+ dependencies:
+ '@eslint-community/eslint-utils': 4.4.1(eslint@9.19.0(jiti@2.4.2))
+ '@typescript-eslint/scope-manager': 8.20.0
+ '@typescript-eslint/types': 8.20.0
+ '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.6.3)
+ eslint: 9.19.0(jiti@2.4.2)
+ typescript: 5.6.3
+ transitivePeerDependencies:
+ - supports-color
+
+ '@typescript-eslint/visitor-keys@8.20.0':
+ dependencies:
+ '@typescript-eslint/types': 8.20.0
+ eslint-visitor-keys: 4.2.0
+
+ '@ungap/structured-clone@1.3.0': {}
+
+ '@vitejs/plugin-react@4.3.4(vite@6.0.11(@types/node@22.10.10)(jiti@2.4.2)(yaml@2.7.0))':
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.0)
+ '@types/babel__core': 7.20.5
+ react-refresh: 0.14.2
+ vite: 6.0.11(@types/node@22.10.10)(jiti@2.4.2)(yaml@2.7.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@vitest/coverage-istanbul@3.0.4(vitest@3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(jiti@2.4.2)(yaml@2.7.0))':
+ dependencies:
+ '@istanbuljs/schema': 0.1.3
+ debug: 4.4.0
+ istanbul-lib-coverage: 3.2.2
+ istanbul-lib-instrument: 6.0.3
+ istanbul-lib-report: 3.0.1
+ istanbul-lib-source-maps: 5.0.6
+ istanbul-reports: 3.1.7
+ magicast: 0.3.5
+ test-exclude: 7.0.1
+ tinyrainbow: 2.0.0
+ vitest: 3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(jiti@2.4.2)(yaml@2.7.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ '@vitest/expect@3.0.4':
+ dependencies:
+ '@vitest/spy': 3.0.4
+ '@vitest/utils': 3.0.4
+ chai: 5.1.2
+ tinyrainbow: 2.0.0
+
+ '@vitest/mocker@3.0.4(vite@6.0.11(@types/node@22.10.10)(jiti@2.4.2)(yaml@2.7.0))':
+ dependencies:
+ '@vitest/spy': 3.0.4
+ estree-walker: 3.0.3
+ magic-string: 0.30.17
+ optionalDependencies:
+ vite: 6.0.11(@types/node@22.10.10)(jiti@2.4.2)(yaml@2.7.0)
+
+ '@vitest/pretty-format@3.0.4':
+ dependencies:
+ tinyrainbow: 2.0.0
+
+ '@vitest/runner@3.0.4':
+ dependencies:
+ '@vitest/utils': 3.0.4
+ pathe: 2.0.2
+
+ '@vitest/snapshot@3.0.4':
+ dependencies:
+ '@vitest/pretty-format': 3.0.4
+ magic-string: 0.30.17
+ pathe: 2.0.2
+
+ '@vitest/spy@3.0.4':
+ dependencies:
+ tinyspy: 3.0.2
+
+ '@vitest/utils@3.0.4':
+ dependencies:
+ '@vitest/pretty-format': 3.0.4
+ loupe: 3.1.2
+ tinyrainbow: 2.0.0
+
+ '@volar/language-core@2.4.11':
+ dependencies:
+ '@volar/source-map': 2.4.11
+
+ '@volar/source-map@2.4.11': {}
+
+ '@volar/typescript@2.4.11':
+ dependencies:
+ '@volar/language-core': 2.4.11
+ path-browserify: 1.0.1
+ vscode-uri: 3.0.8
+
+ '@vue/compiler-core@3.5.13':
+ dependencies:
+ '@babel/parser': 7.26.5
+ '@vue/shared': 3.5.13
+ entities: 4.5.0
+ estree-walker: 2.0.2
+ source-map-js: 1.2.1
+
+ '@vue/compiler-dom@3.5.13':
+ dependencies:
+ '@vue/compiler-core': 3.5.13
+ '@vue/shared': 3.5.13
+
+ '@vue/compiler-vue2@2.7.16':
+ dependencies:
+ de-indent: 1.0.2
+ he: 1.2.0
+
+ '@vue/language-core@2.0.29(typescript@5.6.3)':
+ dependencies:
+ '@volar/language-core': 2.4.11
+ '@vue/compiler-dom': 3.5.13
+ '@vue/compiler-vue2': 2.7.16
+ '@vue/shared': 3.5.13
+ computeds: 0.0.1
+ minimatch: 9.0.5
+ muggle-string: 0.4.1
+ path-browserify: 1.0.1
+ optionalDependencies:
+ typescript: 5.6.3
+
+ '@vue/shared@3.5.13': {}
+
+ '@yarnpkg/lockfile@1.1.0': {}
+
+ '@yarnpkg/parsers@3.0.2':
+ dependencies:
+ js-yaml: 3.14.1
+ tslib: 2.8.1
+
+ '@zkochan/js-yaml@0.0.7':
+ dependencies:
+ argparse: 2.0.1
+
+ JSONStream@1.3.5:
+ dependencies:
+ jsonparse: 1.3.1
+ through: 2.3.8
+
+ acorn-jsx@5.3.2(acorn@8.14.0):
+ dependencies:
+ acorn: 8.14.0
+
+ acorn@8.14.0: {}
+
+ aggregate-error@3.1.0:
+ dependencies:
+ clean-stack: 2.2.0
+ indent-string: 4.0.0
+
+ ajv-draft-04@1.0.0(ajv@8.13.0):
+ optionalDependencies:
+ ajv: 8.13.0
+
+ ajv-formats@3.0.1(ajv@8.13.0):
+ optionalDependencies:
+ ajv: 8.13.0
+
+ ajv@6.12.6:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-json-stable-stringify: 2.1.0
+ json-schema-traverse: 0.4.1
+ uri-js: 4.4.1
+
+ ajv@8.12.0:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ json-schema-traverse: 1.0.0
+ require-from-string: 2.0.2
+ uri-js: 4.4.1
+
+ ajv@8.13.0:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ json-schema-traverse: 1.0.0
+ require-from-string: 2.0.2
+ uri-js: 4.4.1
+
+ ansi-align@3.0.1:
+ dependencies:
+ string-width: 4.2.3
+
+ ansi-colors@4.1.3: {}
+
+ ansi-escapes@4.3.2:
+ dependencies:
+ type-fest: 0.21.3
+
+ ansi-regex@5.0.1: {}
+
+ ansi-regex@6.1.0: {}
+
+ ansi-styles@4.3.0:
+ dependencies:
+ color-convert: 2.0.1
+
+ ansi-styles@5.2.0: {}
+
+ ansi-styles@6.2.1: {}
+
+ anymatch@3.1.3:
+ dependencies:
+ normalize-path: 3.0.0
+ picomatch: 2.3.1
+
+ arg@5.0.2: {}
+
+ argparse@1.0.10:
+ dependencies:
+ sprintf-js: 1.0.3
+
+ argparse@2.0.1: {}
+
+ aria-query@5.3.2: {}
+
+ array-each@1.0.1: {}
+
+ array-ify@1.0.0: {}
+
+ array-iterate@2.0.1: {}
+
+ array-slice@1.1.0: {}
+
+ assertion-error@2.0.1: {}
+
+ astring@1.9.0: {}
+
+ astro-expressive-code@0.40.1(astro@5.1.9(@types/node@22.10.10)(jiti@2.4.2)(rollup@4.32.0)(typescript@5.7.3)(yaml@2.7.0)):
+ dependencies:
+ astro: 5.1.9(@types/node@22.10.10)(jiti@2.4.2)(rollup@4.32.0)(typescript@5.7.3)(yaml@2.7.0)
+ rehype-expressive-code: 0.40.1
+
+ astro@5.1.9(@types/node@22.10.10)(jiti@2.4.2)(rollup@4.32.0)(typescript@5.7.3)(yaml@2.7.0):
+ dependencies:
+ '@astrojs/compiler': 2.10.3
+ '@astrojs/internal-helpers': 0.4.2
+ '@astrojs/markdown-remark': 6.0.2
+ '@astrojs/telemetry': 3.2.0
+ '@oslojs/encoding': 1.1.0
+ '@rollup/pluginutils': 5.1.4(rollup@4.32.0)
+ '@types/cookie': 0.6.0
+ acorn: 8.14.0
+ aria-query: 5.3.2
+ axobject-query: 4.1.0
+ boxen: 8.0.1
+ ci-info: 4.1.0
+ clsx: 2.1.1
+ common-ancestor-path: 1.0.1
+ cookie: 0.7.2
+ cssesc: 3.0.0
+ debug: 4.4.0
+ deterministic-object-hash: 2.0.2
+ devalue: 5.1.1
+ diff: 5.2.0
+ dlv: 1.1.3
+ dset: 3.1.4
+ es-module-lexer: 1.6.0
+ esbuild: 0.24.2
+ estree-walker: 3.0.3
+ fast-glob: 3.3.3
+ flattie: 1.1.1
+ github-slugger: 2.0.0
+ html-escaper: 3.0.3
+ http-cache-semantics: 4.1.1
+ js-yaml: 4.1.0
+ kleur: 4.1.5
+ magic-string: 0.30.17
+ magicast: 0.3.5
+ micromatch: 4.0.8
+ mrmime: 2.0.0
+ neotraverse: 0.6.18
+ p-limit: 6.2.0
+ p-queue: 8.1.0
+ preferred-pm: 4.0.0
+ prompts: 2.4.2
+ rehype: 13.0.2
+ semver: 7.6.3
+ shiki: 1.29.1
+ tinyexec: 0.3.2
+ tsconfck: 3.1.4(typescript@5.7.3)
+ ultrahtml: 1.5.3
+ unist-util-visit: 5.0.0
+ unstorage: 1.14.4
+ vfile: 6.0.3
+ vite: 6.0.11(@types/node@22.10.10)(jiti@2.4.2)(yaml@2.7.0)
+ vitefu: 1.0.5(vite@6.0.11(@types/node@22.10.10)(jiti@2.4.2)(yaml@2.7.0))
+ which-pm: 3.0.0
+ xxhash-wasm: 1.1.0
+ yargs-parser: 21.1.1
+ yocto-spinner: 0.1.2
+ zod: 3.24.1
+ zod-to-json-schema: 3.24.1(zod@3.24.1)
+ zod-to-ts: 1.2.0(typescript@5.7.3)(zod@3.24.1)
+ optionalDependencies:
+ sharp: 0.33.5
+ transitivePeerDependencies:
+ - '@azure/app-configuration'
+ - '@azure/cosmos'
+ - '@azure/data-tables'
+ - '@azure/identity'
+ - '@azure/keyvault-secrets'
+ - '@azure/storage-blob'
+ - '@capacitor/preferences'
+ - '@deno/kv'
+ - '@netlify/blobs'
+ - '@planetscale/database'
+ - '@types/node'
+ - '@upstash/redis'
+ - '@vercel/blob'
+ - '@vercel/kv'
+ - aws4fetch
+ - db0
+ - idb-keyval
+ - ioredis
+ - jiti
+ - less
+ - lightningcss
+ - rollup
+ - sass
+ - sass-embedded
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+ - tsx
+ - typescript
+ - uploadthing
+ - yaml
+
+ asynckit@0.4.0: {}
+
+ axios@1.7.9:
+ dependencies:
+ follow-redirects: 1.15.9
+ form-data: 4.0.1
+ proxy-from-env: 1.1.0
+ transitivePeerDependencies:
+ - debug
+
+ axobject-query@4.1.0: {}
+
+ babel-plugin-istanbul@6.1.1:
+ dependencies:
+ '@babel/helper-plugin-utils': 7.26.5
+ '@istanbuljs/load-nyc-config': 1.1.0
+ '@istanbuljs/schema': 0.1.3
+ istanbul-lib-instrument: 5.2.1
+ test-exclude: 6.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ babel-preset-current-node-syntax@1.1.0(@babel/core@7.26.0):
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.26.0)
+ '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.26.0)
+ '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.26.0)
+ '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.26.0)
+ '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.0)
+ '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.0)
+ '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.26.0)
+ '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.26.0)
+ '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.26.0)
+ '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.26.0)
+ '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.26.0)
+ '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.26.0)
+ '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.26.0)
+ '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.26.0)
+ '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.26.0)
+
+ bail@2.0.2: {}
+
+ balanced-match@1.0.2: {}
+
+ base-64@1.0.0: {}
+
+ base64-js@1.5.1: {}
+
+ bcp-47-match@2.0.3: {}
+
+ bcp-47@2.1.0:
+ dependencies:
+ is-alphabetical: 2.0.1
+ is-alphanumerical: 2.0.1
+ is-decimal: 2.0.1
+
+ binary-extensions@2.3.0: {}
+
+ bl@4.1.0:
+ dependencies:
+ buffer: 5.7.1
+ inherits: 2.0.4
+ readable-stream: 3.6.2
+
+ boolbase@1.0.0: {}
+
+ boxen@8.0.1:
+ dependencies:
+ ansi-align: 3.0.1
+ camelcase: 8.0.0
+ chalk: 5.4.1
+ cli-boxes: 3.0.0
+ string-width: 7.2.0
+ type-fest: 4.33.0
+ widest-line: 5.0.0
+ wrap-ansi: 9.0.0
+
+ brace-expansion@1.1.11:
+ dependencies:
+ balanced-match: 1.0.2
+ concat-map: 0.0.1
+
+ brace-expansion@2.0.1:
+ dependencies:
+ balanced-match: 1.0.2
+
+ braces@3.0.3:
+ dependencies:
+ fill-range: 7.1.1
+
+ browserslist@4.24.4:
+ dependencies:
+ caniuse-lite: 1.0.30001692
+ electron-to-chromium: 1.5.82
+ node-releases: 2.0.19
+ update-browserslist-db: 1.1.2(browserslist@4.24.4)
+
+ bser@2.1.1:
+ dependencies:
+ node-int64: 0.4.0
+
+ buffer@5.7.1:
+ dependencies:
+ base64-js: 1.5.1
+ ieee754: 1.2.1
+
+ cac@6.7.14: {}
+
+ callsites@3.1.0: {}
+
+ camelcase@5.3.1: {}
+
+ camelcase@8.0.0: {}
+
+ caniuse-lite@1.0.30001692: {}
+
+ ccount@2.0.1: {}
+
+ chai@5.1.2:
+ dependencies:
+ assertion-error: 2.0.1
+ check-error: 2.1.1
+ deep-eql: 5.0.2
+ loupe: 3.1.2
+ pathval: 2.0.0
+
+ chalk@4.1.2:
+ dependencies:
+ ansi-styles: 4.3.0
+ supports-color: 7.2.0
+
+ chalk@5.4.1: {}
+
+ character-entities-html4@2.1.0: {}
+
+ character-entities-legacy@3.0.0: {}
+
+ character-entities@2.0.2: {}
+
+ character-reference-invalid@2.0.1: {}
+
+ chardet@0.7.0: {}
+
+ check-error@2.1.1: {}
+
+ chokidar@3.6.0:
+ dependencies:
+ anymatch: 3.1.3
+ braces: 3.0.3
+ glob-parent: 5.1.2
+ is-binary-path: 2.1.0
+ is-glob: 4.0.3
+ normalize-path: 3.0.0
+ readdirp: 3.6.0
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ ci-info@3.9.0: {}
+
+ ci-info@4.1.0: {}
+
+ clean-stack@2.2.0: {}
+
+ cli-boxes@3.0.0: {}
+
+ cli-cursor@3.1.0:
+ dependencies:
+ restore-cursor: 3.1.0
+
+ cli-spinners@2.6.1: {}
+
+ cli-width@4.1.0: {}
+
+ cliui@8.0.1:
+ dependencies:
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wrap-ansi: 7.0.0
+
+ clone@1.0.4: {}
+
+ clsx@2.1.1: {}
+
+ collapse-white-space@2.1.0: {}
+
+ color-convert@2.0.1:
+ dependencies:
+ color-name: 1.1.4
+
+ color-name@1.1.4: {}
+
+ color-string@1.9.1:
+ dependencies:
+ color-name: 1.1.4
+ simple-swizzle: 0.2.2
+
+ color@4.2.3:
+ dependencies:
+ color-convert: 2.0.1
+ color-string: 1.9.1
+
+ combined-stream@1.0.8:
+ dependencies:
+ delayed-stream: 1.0.0
+
+ comma-separated-tokens@2.0.3: {}
+
+ commander@13.0.0: {}
+
+ commander@4.1.1: {}
+
+ common-ancestor-path@1.0.1: {}
+
+ compare-func@2.0.0:
+ dependencies:
+ array-ify: 1.0.0
+ dot-prop: 5.3.0
+
+ compare-versions@6.1.1: {}
+
+ computeds@0.0.1: {}
+
+ concat-map@0.0.1: {}
+
+ confbox@0.1.8: {}
+
+ consola@3.4.0: {}
+
+ conventional-changelog-angular@7.0.0:
+ dependencies:
+ compare-func: 2.0.0
+
+ conventional-commits-parser@5.0.0:
+ dependencies:
+ JSONStream: 1.3.5
+ is-text-path: 2.0.0
+ meow: 12.1.1
+ split2: 4.2.0
+
+ convert-source-map@2.0.0: {}
+
+ cookie-es@1.2.2: {}
+
+ cookie@0.7.2: {}
+
+ cross-spawn@7.0.6:
+ dependencies:
+ path-key: 3.1.1
+ shebang-command: 2.0.0
+ which: 2.0.2
+
+ crossws@0.3.3:
+ dependencies:
+ uncrypto: 0.1.3
+
+ css-selector-parser@3.0.5: {}
+
+ cssesc@3.0.0: {}
+
+ csstype@3.1.3: {}
+
+ de-indent@1.0.2: {}
+
+ debug@3.2.7:
+ dependencies:
+ ms: 2.1.3
+
+ debug@4.4.0:
+ dependencies:
+ ms: 2.1.3
+
+ decode-named-character-reference@1.0.2:
+ dependencies:
+ character-entities: 2.0.2
+
+ deep-eql@5.0.2: {}
+
+ deep-is@0.1.4: {}
+
+ defaults@1.0.4:
+ dependencies:
+ clone: 1.0.4
+
+ define-lazy-prop@2.0.0: {}
+
+ defu@6.1.4: {}
+
+ delayed-stream@1.0.0: {}
+
+ dequal@2.0.3: {}
+
+ destr@2.0.3: {}
+
+ detect-file@1.0.0: {}
+
+ detect-libc@2.0.3: {}
+
+ deterministic-object-hash@2.0.2:
+ dependencies:
+ base-64: 1.0.0
+
+ devalue@5.1.1: {}
+
+ devlop@1.1.0:
+ dependencies:
+ dequal: 2.0.3
+
+ diff-sequences@29.6.3: {}
+
+ diff@5.2.0: {}
+
+ direction@2.0.1: {}
+
+ dlv@1.1.3: {}
+
+ doctrine@3.0.0:
+ dependencies:
+ esutils: 2.0.3
+
+ dot-prop@5.3.0:
+ dependencies:
+ is-obj: 2.0.0
+
+ dotenv-expand@11.0.7:
+ dependencies:
+ dotenv: 16.4.7
+
+ dotenv@16.4.7: {}
+
+ dset@3.1.4: {}
+
+ eastasianwidth@0.2.0: {}
+
+ easy-table@1.2.0:
+ dependencies:
+ ansi-regex: 5.0.1
+ optionalDependencies:
+ wcwidth: 1.0.1
+
+ electron-to-chromium@1.5.82: {}
+
+ emoji-regex-xs@1.0.0: {}
+
+ emoji-regex@10.4.0: {}
+
+ emoji-regex@8.0.0: {}
+
+ emoji-regex@9.2.2: {}
+
+ end-of-stream@1.4.4:
+ dependencies:
+ once: 1.4.0
+
+ enhanced-resolve@5.18.0:
+ dependencies:
+ graceful-fs: 4.2.11
+ tapable: 2.2.1
+
+ enquirer@2.3.6:
+ dependencies:
+ ansi-colors: 4.1.3
+
+ entities@4.5.0: {}
+
+ es-module-lexer@1.6.0: {}
+
+ esast-util-from-estree@2.0.0:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ devlop: 1.1.0
+ estree-util-visit: 2.0.0
+ unist-util-position-from-estree: 2.0.0
+
+ esast-util-from-js@2.0.1:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ acorn: 8.14.0
+ esast-util-from-estree: 2.0.0
+ vfile-message: 4.0.2
+
+ esbuild-register@3.6.0(esbuild@0.24.2):
+ dependencies:
+ debug: 4.4.0
+ esbuild: 0.24.2
+ transitivePeerDependencies:
+ - supports-color
+
+ esbuild@0.24.2:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.24.2
+ '@esbuild/android-arm': 0.24.2
+ '@esbuild/android-arm64': 0.24.2
+ '@esbuild/android-x64': 0.24.2
+ '@esbuild/darwin-arm64': 0.24.2
+ '@esbuild/darwin-x64': 0.24.2
+ '@esbuild/freebsd-arm64': 0.24.2
+ '@esbuild/freebsd-x64': 0.24.2
+ '@esbuild/linux-arm': 0.24.2
+ '@esbuild/linux-arm64': 0.24.2
+ '@esbuild/linux-ia32': 0.24.2
+ '@esbuild/linux-loong64': 0.24.2
+ '@esbuild/linux-mips64el': 0.24.2
+ '@esbuild/linux-ppc64': 0.24.2
+ '@esbuild/linux-riscv64': 0.24.2
+ '@esbuild/linux-s390x': 0.24.2
+ '@esbuild/linux-x64': 0.24.2
+ '@esbuild/netbsd-arm64': 0.24.2
+ '@esbuild/netbsd-x64': 0.24.2
+ '@esbuild/openbsd-arm64': 0.24.2
+ '@esbuild/openbsd-x64': 0.24.2
+ '@esbuild/sunos-x64': 0.24.2
+ '@esbuild/win32-arm64': 0.24.2
+ '@esbuild/win32-ia32': 0.24.2
+ '@esbuild/win32-x64': 0.24.2
+
+ escalade@3.2.0: {}
+
+ escape-string-regexp@1.0.5: {}
+
+ escape-string-regexp@2.0.0: {}
+
+ escape-string-regexp@4.0.0: {}
+
+ escape-string-regexp@5.0.0: {}
+
+ eslint-compat-utils@0.5.1(eslint@9.19.0(jiti@2.4.2)):
+ dependencies:
+ eslint: 9.19.0(jiti@2.4.2)
+ semver: 7.6.3
+
+ eslint-import-resolver-node@0.3.9:
+ dependencies:
+ debug: 3.2.7
+ is-core-module: 2.16.1
+ resolve: 1.22.10
+ transitivePeerDependencies:
+ - supports-color
+
+ eslint-plugin-es-x@7.8.0(eslint@9.19.0(jiti@2.4.2)):
+ dependencies:
+ '@eslint-community/eslint-utils': 4.4.1(eslint@9.19.0(jiti@2.4.2))
+ '@eslint-community/regexpp': 4.12.1
+ eslint: 9.19.0(jiti@2.4.2)
+ eslint-compat-utils: 0.5.1(eslint@9.19.0(jiti@2.4.2))
+
+ eslint-plugin-import-x@4.6.1(eslint@9.19.0(jiti@2.4.2))(typescript@5.6.3):
+ dependencies:
+ '@types/doctrine': 0.0.9
+ '@typescript-eslint/scope-manager': 8.20.0
+ '@typescript-eslint/utils': 8.20.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.6.3)
+ debug: 4.4.0
+ doctrine: 3.0.0
+ enhanced-resolve: 5.18.0
+ eslint: 9.19.0(jiti@2.4.2)
+ eslint-import-resolver-node: 0.3.9
+ get-tsconfig: 4.8.1
+ is-glob: 4.0.3
+ minimatch: 9.0.5
+ semver: 7.6.3
+ stable-hash: 0.0.4
+ tslib: 2.8.1
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+
+ eslint-plugin-n@17.15.1(eslint@9.19.0(jiti@2.4.2)):
+ dependencies:
+ '@eslint-community/eslint-utils': 4.4.1(eslint@9.19.0(jiti@2.4.2))
+ enhanced-resolve: 5.18.0
+ eslint: 9.19.0(jiti@2.4.2)
+ eslint-plugin-es-x: 7.8.0(eslint@9.19.0(jiti@2.4.2))
+ get-tsconfig: 4.8.1
+ globals: 15.14.0
+ ignore: 5.3.2
+ minimatch: 9.0.5
+ semver: 7.6.3
+
+ eslint-scope@7.2.2:
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 5.3.0
+
+ eslint-scope@8.2.0:
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 5.3.0
+
+ eslint-visitor-keys@3.4.3: {}
+
+ eslint-visitor-keys@4.2.0: {}
+
+ eslint@9.19.0(jiti@2.4.2):
+ dependencies:
+ '@eslint-community/eslint-utils': 4.4.1(eslint@9.19.0(jiti@2.4.2))
+ '@eslint-community/regexpp': 4.12.1
+ '@eslint/config-array': 0.19.1
+ '@eslint/core': 0.10.0
+ '@eslint/eslintrc': 3.2.0
+ '@eslint/js': 9.19.0
+ '@eslint/plugin-kit': 0.2.5
+ '@humanfs/node': 0.16.6
+ '@humanwhocodes/module-importer': 1.0.1
+ '@humanwhocodes/retry': 0.4.1
+ '@types/estree': 1.0.6
+ '@types/json-schema': 7.0.15
+ ajv: 6.12.6
+ chalk: 4.1.2
+ cross-spawn: 7.0.6
+ debug: 4.4.0
+ escape-string-regexp: 4.0.0
+ eslint-scope: 8.2.0
+ eslint-visitor-keys: 4.2.0
+ espree: 10.3.0
+ esquery: 1.6.0
+ esutils: 2.0.3
+ fast-deep-equal: 3.1.3
+ file-entry-cache: 8.0.0
+ find-up: 5.0.0
+ glob-parent: 6.0.2
+ ignore: 5.3.2
+ imurmurhash: 0.1.4
+ is-glob: 4.0.3
+ json-stable-stringify-without-jsonify: 1.0.1
+ lodash.merge: 4.6.2
+ minimatch: 3.1.2
+ natural-compare: 1.4.0
+ optionator: 0.9.4
+ optionalDependencies:
+ jiti: 2.4.2
+ transitivePeerDependencies:
+ - supports-color
+
+ espree@10.3.0:
+ dependencies:
+ acorn: 8.14.0
+ acorn-jsx: 5.3.2(acorn@8.14.0)
+ eslint-visitor-keys: 4.2.0
+
+ espree@9.6.1:
+ dependencies:
+ acorn: 8.14.0
+ acorn-jsx: 5.3.2(acorn@8.14.0)
+ eslint-visitor-keys: 3.4.3
+
+ esprima@4.0.1: {}
+
+ esquery@1.6.0:
+ dependencies:
+ estraverse: 5.3.0
+
+ esrecurse@4.3.0:
+ dependencies:
+ estraverse: 5.3.0
+
+ estraverse@5.3.0: {}
+
+ estree-util-attach-comments@3.0.0:
+ dependencies:
+ '@types/estree': 1.0.6
+
+ estree-util-build-jsx@3.0.1:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ devlop: 1.1.0
+ estree-util-is-identifier-name: 3.0.0
+ estree-walker: 3.0.3
+
+ estree-util-is-identifier-name@3.0.0: {}
+
+ estree-util-scope@1.0.0:
+ dependencies:
+ '@types/estree': 1.0.6
+ devlop: 1.1.0
+
+ estree-util-to-js@2.0.0:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ astring: 1.9.0
+ source-map: 0.7.4
+
+ estree-util-visit@2.0.0:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ '@types/unist': 3.0.3
+
+ estree-walker@2.0.2: {}
+
+ estree-walker@3.0.3:
+ dependencies:
+ '@types/estree': 1.0.6
+
+ esutils@2.0.3: {}
+
+ eventemitter3@5.0.1: {}
+
+ expand-tilde@2.0.2:
+ dependencies:
+ homedir-polyfill: 1.0.3
+
+ expect-type@1.1.0: {}
+
+ expect@29.7.0:
+ dependencies:
+ '@jest/expect-utils': 29.7.0
+ jest-get-type: 29.6.3
+ jest-matcher-utils: 29.7.0
+ jest-message-util: 29.7.0
+ jest-util: 29.7.0
+
+ expressive-code@0.40.1:
+ dependencies:
+ '@expressive-code/core': 0.40.1
+ '@expressive-code/plugin-frames': 0.40.1
+ '@expressive-code/plugin-shiki': 0.40.1
+ '@expressive-code/plugin-text-markers': 0.40.1
+
+ extend@3.0.2: {}
+
+ external-editor@3.1.0:
+ dependencies:
+ chardet: 0.7.0
+ iconv-lite: 0.4.24
+ tmp: 0.0.33
+
+ fast-deep-equal@3.1.3: {}
+
+ fast-glob@3.3.3:
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ '@nodelib/fs.walk': 1.2.8
+ glob-parent: 5.1.2
+ merge2: 1.4.1
+ micromatch: 4.0.8
+
+ fast-json-stable-stringify@2.1.0: {}
+
+ fast-levenshtein@2.0.6: {}
+
+ fastq@1.18.0:
+ dependencies:
+ reusify: 1.0.4
+
+ fb-watchman@2.0.2:
+ dependencies:
+ bser: 2.1.1
+
+ figures@3.2.0:
+ dependencies:
+ escape-string-regexp: 1.0.5
+
+ file-entry-cache@8.0.0:
+ dependencies:
+ flat-cache: 4.0.1
+
+ fill-range@7.1.1:
+ dependencies:
+ to-regex-range: 5.0.1
+
+ find-up-simple@1.0.0: {}
+
+ find-up@4.1.0:
+ dependencies:
+ locate-path: 5.0.0
+ path-exists: 4.0.0
+
+ find-up@5.0.0:
+ dependencies:
+ locate-path: 6.0.0
+ path-exists: 4.0.0
+
+ find-yarn-workspace-root2@1.2.16:
+ dependencies:
+ micromatch: 4.0.8
+ pkg-dir: 4.2.0
+
+ findup-sync@5.0.0:
+ dependencies:
+ detect-file: 1.0.0
+ is-glob: 4.0.3
+ micromatch: 4.0.8
+ resolve-dir: 1.0.1
+
+ fined@2.0.0:
+ dependencies:
+ expand-tilde: 2.0.2
+ is-plain-object: 5.0.0
+ object.defaults: 1.1.0
+ object.pick: 1.3.0
+ parse-filepath: 1.0.2
+
+ flagged-respawn@2.0.0: {}
+
+ flat-cache@4.0.1:
+ dependencies:
+ flatted: 3.3.2
+ keyv: 4.5.4
+
+ flat@5.0.2: {}
+
+ flatted@3.3.2: {}
+
+ flattie@1.1.1: {}
+
+ follow-redirects@1.15.9: {}
+
+ for-in@1.0.2: {}
+
+ for-own@1.0.0:
+ dependencies:
+ for-in: 1.0.2
+
+ foreground-child@3.3.0:
+ dependencies:
+ cross-spawn: 7.0.6
+ signal-exit: 4.1.0
+
+ form-data@4.0.1:
+ dependencies:
+ asynckit: 0.4.0
+ combined-stream: 1.0.8
+ mime-types: 2.1.35
+
+ front-matter@4.0.2:
+ dependencies:
+ js-yaml: 3.14.1
+
+ fs-constants@1.0.0: {}
+
+ fs-extra@7.0.1:
+ dependencies:
+ graceful-fs: 4.2.11
+ jsonfile: 4.0.0
+ universalify: 0.1.2
+
+ fs.realpath@1.0.0: {}
+
+ fsevents@2.3.3:
+ optional: true
+
+ function-bind@1.1.2: {}
+
+ gensync@1.0.0-beta.2: {}
+
+ get-caller-file@2.0.5: {}
+
+ get-east-asian-width@1.3.0: {}
+
+ get-package-type@0.1.0: {}
+
+ get-tsconfig@4.8.1:
+ dependencies:
+ resolve-pkg-maps: 1.0.0
+
+ github-slugger@2.0.0: {}
+
+ glob-parent@5.1.2:
+ dependencies:
+ is-glob: 4.0.3
+
+ glob-parent@6.0.2:
+ dependencies:
+ is-glob: 4.0.3
+
+ glob@10.4.5:
+ dependencies:
+ foreground-child: 3.3.0
+ jackspeak: 3.4.3
+ minimatch: 9.0.5
+ minipass: 7.1.2
+ package-json-from-dist: 1.0.1
+ path-scurry: 1.11.1
+
+ glob@7.2.3:
+ dependencies:
+ fs.realpath: 1.0.0
+ inflight: 1.0.6
+ inherits: 2.0.4
+ minimatch: 3.1.2
+ once: 1.4.0
+ path-is-absolute: 1.0.1
+
+ global-modules@1.0.0:
+ dependencies:
+ global-prefix: 1.0.2
+ is-windows: 1.0.2
+ resolve-dir: 1.0.1
+
+ global-prefix@1.0.2:
+ dependencies:
+ expand-tilde: 2.0.2
+ homedir-polyfill: 1.0.3
+ ini: 1.3.8
+ is-windows: 1.0.2
+ which: 1.3.1
+
+ globals@11.12.0: {}
+
+ globals@14.0.0: {}
+
+ globals@15.14.0: {}
+
+ globrex@0.1.2: {}
+
+ graceful-fs@4.2.11: {}
+
+ graphemer@1.4.0: {}
+
+ h3@1.14.0:
+ dependencies:
+ cookie-es: 1.2.2
+ crossws: 0.3.3
+ defu: 6.1.4
+ destr: 2.0.3
+ iron-webcrypto: 1.2.1
+ ohash: 1.1.4
+ radix3: 1.1.2
+ ufo: 1.5.4
+ uncrypto: 0.1.3
+ unenv: 1.10.0
+
+ has-flag@4.0.0: {}
+
+ hasown@2.0.2:
+ dependencies:
+ function-bind: 1.1.2
+
+ hast-util-embedded@3.0.0:
+ dependencies:
+ '@types/hast': 3.0.4
+ hast-util-is-element: 3.0.0
+
+ hast-util-format@1.1.0:
+ dependencies:
+ '@types/hast': 3.0.4
+ hast-util-embedded: 3.0.0
+ hast-util-minify-whitespace: 1.0.1
+ hast-util-phrasing: 3.0.1
+ hast-util-whitespace: 3.0.0
+ html-whitespace-sensitive-tag-names: 3.0.1
+ unist-util-visit-parents: 6.0.1
+
+ hast-util-from-html@2.0.3:
+ dependencies:
+ '@types/hast': 3.0.4
+ devlop: 1.1.0
+ hast-util-from-parse5: 8.0.2
+ parse5: 7.2.1
+ vfile: 6.0.3
+ vfile-message: 4.0.2
+
+ hast-util-from-parse5@8.0.2:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.3
+ devlop: 1.1.0
+ hastscript: 9.0.0
+ property-information: 6.5.0
+ vfile: 6.0.3
+ vfile-location: 5.0.3
+ web-namespaces: 2.0.1
+
+ hast-util-has-property@3.0.0:
+ dependencies:
+ '@types/hast': 3.0.4
+
+ hast-util-is-body-ok-link@3.0.1:
+ dependencies:
+ '@types/hast': 3.0.4
+
+ hast-util-is-element@3.0.0:
+ dependencies:
+ '@types/hast': 3.0.4
+
+ hast-util-minify-whitespace@1.0.1:
+ dependencies:
+ '@types/hast': 3.0.4
+ hast-util-embedded: 3.0.0
+ hast-util-is-element: 3.0.0
+ hast-util-whitespace: 3.0.0
+ unist-util-is: 6.0.0
+
+ hast-util-parse-selector@4.0.0:
+ dependencies:
+ '@types/hast': 3.0.4
+
+ hast-util-phrasing@3.0.1:
+ dependencies:
+ '@types/hast': 3.0.4
+ hast-util-embedded: 3.0.0
+ hast-util-has-property: 3.0.0
+ hast-util-is-body-ok-link: 3.0.1
+ hast-util-is-element: 3.0.0
+
+ hast-util-raw@9.1.0:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.3
+ '@ungap/structured-clone': 1.3.0
+ hast-util-from-parse5: 8.0.2
+ hast-util-to-parse5: 8.0.0
+ html-void-elements: 3.0.0
+ mdast-util-to-hast: 13.2.0
+ parse5: 7.2.1
+ unist-util-position: 5.0.0
+ unist-util-visit: 5.0.0
+ vfile: 6.0.3
+ web-namespaces: 2.0.1
+ zwitch: 2.0.4
+
+ hast-util-select@6.0.3:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.3
+ bcp-47-match: 2.0.3
+ comma-separated-tokens: 2.0.3
+ css-selector-parser: 3.0.5
+ devlop: 1.1.0
+ direction: 2.0.1
+ hast-util-has-property: 3.0.0
+ hast-util-to-string: 3.0.1
+ hast-util-whitespace: 3.0.0
+ nth-check: 2.1.1
+ property-information: 6.5.0
+ space-separated-tokens: 2.0.2
+ unist-util-visit: 5.0.0
+ zwitch: 2.0.4
+
+ hast-util-to-estree@3.1.1:
+ dependencies:
+ '@types/estree': 1.0.6
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.4
+ comma-separated-tokens: 2.0.3
+ devlop: 1.1.0
+ estree-util-attach-comments: 3.0.0
+ estree-util-is-identifier-name: 3.0.0
+ hast-util-whitespace: 3.0.0
+ mdast-util-mdx-expression: 2.0.1
+ mdast-util-mdx-jsx: 3.2.0
+ mdast-util-mdxjs-esm: 2.0.1
+ property-information: 6.5.0
+ space-separated-tokens: 2.0.2
+ style-to-object: 1.0.8
+ unist-util-position: 5.0.0
+ zwitch: 2.0.4
+ transitivePeerDependencies:
+ - supports-color
+
+ hast-util-to-html@9.0.4:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.3
+ ccount: 2.0.1
+ comma-separated-tokens: 2.0.3
+ hast-util-whitespace: 3.0.0
+ html-void-elements: 3.0.0
+ mdast-util-to-hast: 13.2.0
+ property-information: 6.5.0
+ space-separated-tokens: 2.0.2
+ stringify-entities: 4.0.4
+ zwitch: 2.0.4
+
+ hast-util-to-jsx-runtime@2.3.2:
+ dependencies:
+ '@types/estree': 1.0.6
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.3
+ comma-separated-tokens: 2.0.3
+ devlop: 1.1.0
+ estree-util-is-identifier-name: 3.0.0
+ hast-util-whitespace: 3.0.0
+ mdast-util-mdx-expression: 2.0.1
+ mdast-util-mdx-jsx: 3.2.0
+ mdast-util-mdxjs-esm: 2.0.1
+ property-information: 6.5.0
+ space-separated-tokens: 2.0.2
+ style-to-object: 1.0.8
+ unist-util-position: 5.0.0
+ vfile-message: 4.0.2
+ transitivePeerDependencies:
+ - supports-color
+
+ hast-util-to-parse5@8.0.0:
+ dependencies:
+ '@types/hast': 3.0.4
+ comma-separated-tokens: 2.0.3
+ devlop: 1.1.0
+ property-information: 6.5.0
+ space-separated-tokens: 2.0.2
+ web-namespaces: 2.0.1
+ zwitch: 2.0.4
+
+ hast-util-to-string@3.0.1:
+ dependencies:
+ '@types/hast': 3.0.4
+
+ hast-util-to-text@4.0.2:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/unist': 3.0.3
+ hast-util-is-element: 3.0.0
+ unist-util-find-after: 5.0.0
+
+ hast-util-whitespace@3.0.0:
+ dependencies:
+ '@types/hast': 3.0.4
+
+ hastscript@9.0.0:
+ dependencies:
+ '@types/hast': 3.0.4
+ comma-separated-tokens: 2.0.3
+ hast-util-parse-selector: 4.0.0
+ property-information: 6.5.0
+ space-separated-tokens: 2.0.2
+
+ he@1.2.0: {}
+
+ homedir-polyfill@1.0.3:
+ dependencies:
+ parse-passwd: 1.0.0
+
+ html-escaper@2.0.2: {}
+
+ html-escaper@3.0.3: {}
+
+ html-void-elements@3.0.0: {}
+
+ html-whitespace-sensitive-tag-names@3.0.1: {}
+
+ http-cache-semantics@4.1.1: {}
+
+ i18next@23.16.8:
+ dependencies:
+ '@babel/runtime': 7.26.7
+
+ iconv-lite@0.4.24:
+ dependencies:
+ safer-buffer: 2.1.2
+
+ ieee754@1.2.1: {}
+
+ ignore@5.3.2: {}
+
+ import-fresh@3.3.0:
+ dependencies:
+ parent-module: 1.0.1
+ resolve-from: 4.0.0
+
+ import-lazy@4.0.0: {}
+
+ import-meta-resolve@4.1.0: {}
+
+ imurmurhash@0.1.4: {}
+
+ indent-string@4.0.0: {}
+
+ indent-string@5.0.0: {}
+
+ inflight@1.0.6:
+ dependencies:
+ once: 1.4.0
+ wrappy: 1.0.2
+
+ inherits@2.0.4: {}
+
+ ini@1.3.8: {}
+
+ inline-style-parser@0.2.4: {}
+
+ inquirer@12.3.2(@types/node@22.10.10):
+ dependencies:
+ '@inquirer/core': 10.1.4(@types/node@22.10.10)
+ '@inquirer/prompts': 7.2.3(@types/node@22.10.10)
+ '@inquirer/type': 3.0.2(@types/node@22.10.10)
+ '@types/node': 22.10.10
+ ansi-escapes: 4.3.2
+ mute-stream: 2.0.0
+ run-async: 3.0.0
+ rxjs: 7.8.1
+
+ interpret@3.1.1: {}
+
+ iron-webcrypto@1.2.1: {}
+
+ is-absolute@1.0.0:
+ dependencies:
+ is-relative: 1.0.0
+ is-windows: 1.0.2
+
+ is-alphabetical@2.0.1: {}
+
+ is-alphanumerical@2.0.1:
+ dependencies:
+ is-alphabetical: 2.0.1
+ is-decimal: 2.0.1
+
+ is-arrayish@0.3.2: {}
+
+ is-binary-path@2.1.0:
+ dependencies:
+ binary-extensions: 2.3.0
+
+ is-core-module@2.16.1:
+ dependencies:
+ hasown: 2.0.2
+
+ is-decimal@2.0.1: {}
+
+ is-docker@2.2.1: {}
+
+ is-docker@3.0.0: {}
+
+ is-extglob@2.1.1: {}
+
+ is-fullwidth-code-point@3.0.0: {}
+
+ is-fullwidth-code-point@5.0.0:
+ dependencies:
+ get-east-asian-width: 1.3.0
+
+ is-glob@4.0.3:
+ dependencies:
+ is-extglob: 2.1.1
+
+ is-hexadecimal@2.0.1: {}
+
+ is-inside-container@1.0.0:
+ dependencies:
+ is-docker: 3.0.0
+
+ is-interactive@1.0.0: {}
+
+ is-number@7.0.0: {}
+
+ is-obj@2.0.0: {}
+
+ is-plain-obj@4.1.0: {}
+
+ is-plain-object@5.0.0: {}
+
+ is-relative@1.0.0:
+ dependencies:
+ is-unc-path: 1.0.0
+
+ is-text-path@2.0.0:
+ dependencies:
+ text-extensions: 2.4.0
+
+ is-unc-path@1.0.0:
+ dependencies:
+ unc-path-regex: 0.1.2
+
+ is-unicode-supported@0.1.0: {}
+
+ is-windows@1.0.2: {}
+
+ is-wsl@2.2.0:
+ dependencies:
+ is-docker: 2.2.1
+
+ is-wsl@3.1.0:
+ dependencies:
+ is-inside-container: 1.0.0
+
+ isexe@2.0.0: {}
+
+ isobject@3.0.1: {}
+
+ istanbul-lib-coverage@3.2.2: {}
+
+ istanbul-lib-instrument@5.2.1:
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/parser': 7.26.5
+ '@istanbuljs/schema': 0.1.3
+ istanbul-lib-coverage: 3.2.2
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
+ istanbul-lib-instrument@6.0.3:
+ dependencies:
+ '@babel/core': 7.26.7
+ '@babel/parser': 7.26.7
+ '@istanbuljs/schema': 0.1.3
+ istanbul-lib-coverage: 3.2.2
+ semver: 7.6.3
+ transitivePeerDependencies:
+ - supports-color
+
+ istanbul-lib-report@3.0.1:
+ dependencies:
+ istanbul-lib-coverage: 3.2.2
+ make-dir: 4.0.0
+ supports-color: 7.2.0
+
+ istanbul-lib-source-maps@5.0.6:
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.25
+ debug: 4.4.0
+ istanbul-lib-coverage: 3.2.2
+ transitivePeerDependencies:
+ - supports-color
+
+ istanbul-reports@3.1.7:
+ dependencies:
+ html-escaper: 2.0.2
+ istanbul-lib-report: 3.0.1
+
+ jackspeak@3.4.3:
+ dependencies:
+ '@isaacs/cliui': 8.0.2
+ optionalDependencies:
+ '@pkgjs/parseargs': 0.11.0
+
+ jest-diff@29.7.0:
+ dependencies:
+ chalk: 4.1.2
+ diff-sequences: 29.6.3
+ jest-get-type: 29.6.3
+ pretty-format: 29.7.0
+
+ jest-get-type@29.6.3: {}
+
+ jest-haste-map@29.7.0:
+ dependencies:
+ '@jest/types': 29.6.3
+ '@types/graceful-fs': 4.1.9
+ '@types/node': 22.10.10
+ anymatch: 3.1.3
+ fb-watchman: 2.0.2
+ graceful-fs: 4.2.11
+ jest-regex-util: 29.6.3
+ jest-util: 29.7.0
+ jest-worker: 29.7.0
+ micromatch: 4.0.8
+ walker: 1.0.8
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ jest-matcher-utils@29.7.0:
+ dependencies:
+ chalk: 4.1.2
+ jest-diff: 29.7.0
+ jest-get-type: 29.6.3
+ pretty-format: 29.7.0
+
+ jest-message-util@29.7.0:
+ dependencies:
+ '@babel/code-frame': 7.26.2
+ '@jest/types': 29.6.3
+ '@types/stack-utils': 2.0.3
+ chalk: 4.1.2
+ graceful-fs: 4.2.11
+ micromatch: 4.0.8
+ pretty-format: 29.7.0
+ slash: 3.0.0
+ stack-utils: 2.0.6
+
+ jest-mock@29.7.0:
+ dependencies:
+ '@jest/types': 29.6.3
+ '@types/node': 22.10.10
+ jest-util: 29.7.0
+
+ jest-regex-util@29.6.3: {}
+
+ jest-snapshot@29.7.0:
+ dependencies:
+ '@babel/core': 7.26.0
+ '@babel/generator': 7.26.5
+ '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0)
+ '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0)
+ '@babel/types': 7.26.5
+ '@jest/expect-utils': 29.7.0
+ '@jest/transform': 29.7.0
+ '@jest/types': 29.6.3
+ babel-preset-current-node-syntax: 1.1.0(@babel/core@7.26.0)
+ chalk: 4.1.2
+ expect: 29.7.0
+ graceful-fs: 4.2.11
+ jest-diff: 29.7.0
+ jest-get-type: 29.6.3
+ jest-matcher-utils: 29.7.0
+ jest-message-util: 29.7.0
+ jest-util: 29.7.0
+ natural-compare: 1.4.0
+ pretty-format: 29.7.0
+ semver: 7.6.3
+ transitivePeerDependencies:
+ - supports-color
+
+ jest-util@29.7.0:
+ dependencies:
+ '@jest/types': 29.6.3
+ '@types/node': 22.10.10
+ chalk: 4.1.2
+ ci-info: 3.9.0
+ graceful-fs: 4.2.11
+ picomatch: 2.3.1
+
+ jest-worker@29.7.0:
+ dependencies:
+ '@types/node': 22.10.10
+ jest-util: 29.7.0
+ merge-stream: 2.0.0
+ supports-color: 8.1.1
+
+ jiti@2.4.2: {}
+
+ jju@1.4.0: {}
+
+ js-tokens@4.0.0: {}
+
+ js-yaml@3.14.1:
+ dependencies:
+ argparse: 1.0.10
+ esprima: 4.0.1
+
+ js-yaml@4.1.0:
+ dependencies:
+ argparse: 2.0.1
+
+ jsesc@3.1.0: {}
+
+ json-buffer@3.0.1: {}
+
+ json-schema-traverse@0.4.1: {}
+
+ json-schema-traverse@1.0.0: {}
+
+ json-stable-stringify-without-jsonify@1.0.1: {}
+
+ json5@2.2.3: {}
+
+ jsonc-parser@3.2.0: {}
+
+ jsonfile@4.0.0:
+ optionalDependencies:
+ graceful-fs: 4.2.11
+
+ jsonfile@6.1.0:
+ dependencies:
+ universalify: 2.0.1
+ optionalDependencies:
+ graceful-fs: 4.2.11
+
+ jsonparse@1.3.1: {}
+
+ keyv@4.5.4:
+ dependencies:
+ json-buffer: 3.0.1
+
+ kleur@3.0.3: {}
+
+ kleur@4.1.5: {}
+
+ knip@5.43.3(@types/node@22.10.10)(typescript@5.6.3):
+ dependencies:
+ '@nodelib/fs.walk': 3.0.1
+ '@snyk/github-codeowners': 1.1.0
+ '@types/node': 22.10.10
+ easy-table: 1.2.0
+ enhanced-resolve: 5.18.0
+ fast-glob: 3.3.3
+ jiti: 2.4.2
+ js-yaml: 4.1.0
+ minimist: 1.2.8
+ picocolors: 1.1.1
+ picomatch: 4.0.2
+ pretty-ms: 9.2.0
+ smol-toml: 1.3.1
+ strip-json-comments: 5.0.1
+ summary: 2.1.0
+ typescript: 5.6.3
+ zod: 3.24.1
+ zod-validation-error: 3.4.0(zod@3.24.1)
+
+ kolorist@1.8.0: {}
+
+ levn@0.4.1:
+ dependencies:
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+
+ liftoff@5.0.0:
+ dependencies:
+ extend: 3.0.2
+ findup-sync: 5.0.0
+ fined: 2.0.0
+ flagged-respawn: 2.0.0
+ is-plain-object: 5.0.0
+ rechoir: 0.8.0
+ resolve: 1.22.10
+
+ lines-and-columns@2.0.3: {}
+
+ linkify-it@5.0.0:
+ dependencies:
+ uc.micro: 2.1.0
+
+ load-yaml-file@0.2.0:
+ dependencies:
+ graceful-fs: 4.2.11
+ js-yaml: 3.14.1
+ pify: 4.0.1
+ strip-bom: 3.0.0
+
+ local-pkg@0.5.1:
+ dependencies:
+ mlly: 1.7.4
+ pkg-types: 1.3.1
+
+ locate-path@5.0.0:
+ dependencies:
+ p-locate: 4.1.0
+
+ locate-path@6.0.0:
+ dependencies:
+ p-locate: 5.0.0
+
+ lodash.merge@4.6.2: {}
+
+ lodash@4.17.21: {}
+
+ log-symbols@4.1.0:
+ dependencies:
+ chalk: 4.1.2
+ is-unicode-supported: 0.1.0
+
+ longest-streak@3.1.0: {}
+
+ loupe@3.1.2: {}
+
+ lru-cache@10.4.3: {}
+
+ lru-cache@5.1.1:
+ dependencies:
+ yallist: 3.1.1
+
+ lru-cache@6.0.0:
+ dependencies:
+ yallist: 4.0.0
+
+ lunr@2.3.9: {}
+
+ magic-string@0.30.17:
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.0
+
+ magicast@0.3.5:
+ dependencies:
+ '@babel/parser': 7.26.5
+ '@babel/types': 7.26.5
+ source-map-js: 1.2.1
+
+ make-dir@4.0.0:
+ dependencies:
+ semver: 7.6.3
+
+ makeerror@1.0.12:
+ dependencies:
+ tmpl: 1.0.5
+
+ map-cache@0.2.2: {}
+
+ markdown-extensions@2.0.0: {}
+
+ markdown-it@14.1.0:
+ dependencies:
+ argparse: 2.0.1
+ entities: 4.5.0
+ linkify-it: 5.0.0
+ mdurl: 2.0.0
+ punycode.js: 2.3.1
+ uc.micro: 2.1.0
+
+ markdown-table@3.0.4: {}
+
+ mdast-util-definitions@6.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ unist-util-visit: 5.0.0
+
+ mdast-util-directive@3.1.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ ccount: 2.0.1
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.2
+ parse-entities: 4.0.2
+ stringify-entities: 4.0.4
+ unist-util-visit-parents: 6.0.1
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-find-and-replace@3.0.2:
+ dependencies:
+ '@types/mdast': 4.0.4
+ escape-string-regexp: 5.0.0
+ unist-util-is: 6.0.0
+ unist-util-visit-parents: 6.0.1
+
+ mdast-util-from-markdown@2.0.2:
+ dependencies:
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ decode-named-character-reference: 1.0.2
+ devlop: 1.1.0
+ mdast-util-to-string: 4.0.0
+ micromark: 4.0.1
+ micromark-util-decode-numeric-character-reference: 2.0.2
+ micromark-util-decode-string: 2.0.1
+ micromark-util-normalize-identifier: 2.0.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.1
+ unist-util-stringify-position: 4.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-gfm-autolink-literal@2.0.1:
+ dependencies:
+ '@types/mdast': 4.0.4
+ ccount: 2.0.1
+ devlop: 1.1.0
+ mdast-util-find-and-replace: 3.0.2
+ micromark-util-character: 2.1.1
+
+ mdast-util-gfm-footnote@2.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.2
+ micromark-util-normalize-identifier: 2.0.1
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-gfm-strikethrough@2.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-gfm-table@2.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ markdown-table: 3.0.4
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-gfm-task-list-item@2.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-gfm@3.0.0:
+ dependencies:
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-gfm-autolink-literal: 2.0.1
+ mdast-util-gfm-footnote: 2.0.0
+ mdast-util-gfm-strikethrough: 2.0.0
+ mdast-util-gfm-table: 2.0.0
+ mdast-util-gfm-task-list-item: 2.0.0
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-mdx-expression@2.0.1:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-mdx-jsx@3.2.0:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ ccount: 2.0.1
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.2
+ parse-entities: 4.0.2
+ stringify-entities: 4.0.4
+ unist-util-stringify-position: 4.0.0
+ vfile-message: 4.0.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-mdx@3.0.0:
+ dependencies:
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-mdx-expression: 2.0.1
+ mdast-util-mdx-jsx: 3.2.0
+ mdast-util-mdxjs-esm: 2.0.1
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-mdxjs-esm@2.0.1:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ devlop: 1.1.0
+ mdast-util-from-markdown: 2.0.2
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
+ mdast-util-phrasing@4.1.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ unist-util-is: 6.0.0
+
+ mdast-util-to-hast@13.2.0:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ '@ungap/structured-clone': 1.3.0
+ devlop: 1.1.0
+ micromark-util-sanitize-uri: 2.0.1
+ trim-lines: 3.0.1
+ unist-util-position: 5.0.0
+ unist-util-visit: 5.0.0
+ vfile: 6.0.3
+
+ mdast-util-to-markdown@2.1.2:
+ dependencies:
+ '@types/mdast': 4.0.4
+ '@types/unist': 3.0.3
+ longest-streak: 3.1.0
+ mdast-util-phrasing: 4.1.0
+ mdast-util-to-string: 4.0.0
+ micromark-util-classify-character: 2.0.1
+ micromark-util-decode-string: 2.0.1
+ unist-util-visit: 5.0.0
+ zwitch: 2.0.4
+
+ mdast-util-to-string@4.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+
+ mdurl@2.0.0: {}
+
+ meow@12.1.1: {}
+
+ merge-stream@2.0.0: {}
+
+ merge2@1.4.1: {}
+
+ micromark-core-commonmark@2.0.2:
+ dependencies:
+ decode-named-character-reference: 1.0.2
+ devlop: 1.1.0
+ micromark-factory-destination: 2.0.1
+ micromark-factory-label: 2.0.1
+ micromark-factory-space: 2.0.1
+ micromark-factory-title: 2.0.1
+ micromark-factory-whitespace: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-chunked: 2.0.1
+ micromark-util-classify-character: 2.0.1
+ micromark-util-html-tag-name: 2.0.1
+ micromark-util-normalize-identifier: 2.0.1
+ micromark-util-resolve-all: 2.0.1
+ micromark-util-subtokenize: 2.0.4
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.1
+
+ micromark-extension-directive@3.0.2:
+ dependencies:
+ devlop: 1.1.0
+ micromark-factory-space: 2.0.1
+ micromark-factory-whitespace: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.1
+ parse-entities: 4.0.2
+
+ micromark-extension-gfm-autolink-literal@2.1.0:
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-sanitize-uri: 2.0.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.1
+
+ micromark-extension-gfm-footnote@2.1.0:
+ dependencies:
+ devlop: 1.1.0
+ micromark-core-commonmark: 2.0.2
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-normalize-identifier: 2.0.1
+ micromark-util-sanitize-uri: 2.0.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.1
+
+ micromark-extension-gfm-strikethrough@2.1.0:
+ dependencies:
+ devlop: 1.1.0
+ micromark-util-chunked: 2.0.1
+ micromark-util-classify-character: 2.0.1
+ micromark-util-resolve-all: 2.0.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.1
+
+ micromark-extension-gfm-table@2.1.1:
+ dependencies:
+ devlop: 1.1.0
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.1
+
+ micromark-extension-gfm-tagfilter@2.0.0:
+ dependencies:
+ micromark-util-types: 2.0.1
+
+ micromark-extension-gfm-task-list-item@2.1.0:
+ dependencies:
+ devlop: 1.1.0
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.1
+
+ micromark-extension-gfm@3.0.0:
+ dependencies:
+ micromark-extension-gfm-autolink-literal: 2.1.0
+ micromark-extension-gfm-footnote: 2.1.0
+ micromark-extension-gfm-strikethrough: 2.1.0
+ micromark-extension-gfm-table: 2.1.1
+ micromark-extension-gfm-tagfilter: 2.0.0
+ micromark-extension-gfm-task-list-item: 2.1.0
+ micromark-util-combine-extensions: 2.0.1
+ micromark-util-types: 2.0.1
+
+ micromark-extension-mdx-expression@3.0.0:
+ dependencies:
+ '@types/estree': 1.0.6
+ devlop: 1.1.0
+ micromark-factory-mdx-expression: 2.0.2
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-events-to-acorn: 2.0.2
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.1
+
+ micromark-extension-mdx-jsx@3.0.1:
+ dependencies:
+ '@types/acorn': 4.0.6
+ '@types/estree': 1.0.6
+ devlop: 1.1.0
+ estree-util-is-identifier-name: 3.0.0
+ micromark-factory-mdx-expression: 2.0.2
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-events-to-acorn: 2.0.2
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.1
+ vfile-message: 4.0.2
+
+ micromark-extension-mdx-md@2.0.0:
+ dependencies:
+ micromark-util-types: 2.0.1
+
+ micromark-extension-mdxjs-esm@3.0.0:
+ dependencies:
+ '@types/estree': 1.0.6
+ devlop: 1.1.0
+ micromark-core-commonmark: 2.0.2
+ micromark-util-character: 2.1.1
+ micromark-util-events-to-acorn: 2.0.2
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.1
+ unist-util-position-from-estree: 2.0.0
+ vfile-message: 4.0.2
+
+ micromark-extension-mdxjs@3.0.0:
+ dependencies:
+ acorn: 8.14.0
+ acorn-jsx: 5.3.2(acorn@8.14.0)
+ micromark-extension-mdx-expression: 3.0.0
+ micromark-extension-mdx-jsx: 3.0.1
+ micromark-extension-mdx-md: 2.0.0
+ micromark-extension-mdxjs-esm: 3.0.0
+ micromark-util-combine-extensions: 2.0.1
+ micromark-util-types: 2.0.1
+
+ micromark-factory-destination@2.0.1:
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.1
+
+ micromark-factory-label@2.0.1:
+ dependencies:
+ devlop: 1.1.0
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.1
+
+ micromark-factory-mdx-expression@2.0.2:
+ dependencies:
+ '@types/estree': 1.0.6
+ devlop: 1.1.0
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-events-to-acorn: 2.0.2
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.1
+ unist-util-position-from-estree: 2.0.0
+ vfile-message: 4.0.2
+
+ micromark-factory-space@2.0.1:
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-types: 2.0.1
+
+ micromark-factory-title@2.0.1:
+ dependencies:
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.1
+
+ micromark-factory-whitespace@2.0.1:
+ dependencies:
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.1
+
+ micromark-util-character@2.1.1:
+ dependencies:
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.1
+
+ micromark-util-chunked@2.0.1:
+ dependencies:
+ micromark-util-symbol: 2.0.1
+
+ micromark-util-classify-character@2.0.1:
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.1
+
+ micromark-util-combine-extensions@2.0.1:
+ dependencies:
+ micromark-util-chunked: 2.0.1
+ micromark-util-types: 2.0.1
+
+ micromark-util-decode-numeric-character-reference@2.0.2:
+ dependencies:
+ micromark-util-symbol: 2.0.1
+
+ micromark-util-decode-string@2.0.1:
+ dependencies:
+ decode-named-character-reference: 1.0.2
+ micromark-util-character: 2.1.1
+ micromark-util-decode-numeric-character-reference: 2.0.2
+ micromark-util-symbol: 2.0.1
+
+ micromark-util-encode@2.0.1: {}
+
+ micromark-util-events-to-acorn@2.0.2:
+ dependencies:
+ '@types/acorn': 4.0.6
+ '@types/estree': 1.0.6
+ '@types/unist': 3.0.3
+ devlop: 1.1.0
+ estree-util-visit: 2.0.0
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.1
+ vfile-message: 4.0.2
+
+ micromark-util-html-tag-name@2.0.1: {}
+
+ micromark-util-normalize-identifier@2.0.1:
+ dependencies:
+ micromark-util-symbol: 2.0.1
+
+ micromark-util-resolve-all@2.0.1:
+ dependencies:
+ micromark-util-types: 2.0.1
+
+ micromark-util-sanitize-uri@2.0.1:
+ dependencies:
+ micromark-util-character: 2.1.1
+ micromark-util-encode: 2.0.1
+ micromark-util-symbol: 2.0.1
+
+ micromark-util-subtokenize@2.0.4:
+ dependencies:
+ devlop: 1.1.0
+ micromark-util-chunked: 2.0.1
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.1
+
+ micromark-util-symbol@2.0.1: {}
+
+ micromark-util-types@2.0.1: {}
+
+ micromark@4.0.1:
+ dependencies:
+ '@types/debug': 4.1.12
+ debug: 4.4.0
+ decode-named-character-reference: 1.0.2
+ devlop: 1.1.0
+ micromark-core-commonmark: 2.0.2
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-chunked: 2.0.1
+ micromark-util-combine-extensions: 2.0.1
+ micromark-util-decode-numeric-character-reference: 2.0.2
+ micromark-util-encode: 2.0.1
+ micromark-util-normalize-identifier: 2.0.1
+ micromark-util-resolve-all: 2.0.1
+ micromark-util-sanitize-uri: 2.0.1
+ micromark-util-subtokenize: 2.0.4
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.1
+ transitivePeerDependencies:
+ - supports-color
+
+ micromatch@4.0.8:
+ dependencies:
+ braces: 3.0.3
+ picomatch: 2.3.1
+
+ mime-db@1.52.0: {}
+
+ mime-types@2.1.35:
+ dependencies:
+ mime-db: 1.52.0
+
+ mime@3.0.0: {}
+
+ mimic-fn@2.1.0: {}
+
+ min-indent@1.0.1: {}
+
+ minimatch@3.0.8:
+ dependencies:
+ brace-expansion: 1.1.11
+
+ minimatch@3.1.2:
+ dependencies:
+ brace-expansion: 1.1.11
+
+ minimatch@9.0.3:
+ dependencies:
+ brace-expansion: 2.0.1
+
+ minimatch@9.0.5:
+ dependencies:
+ brace-expansion: 2.0.1
+
+ minimist@1.2.8: {}
+
+ minipass@7.1.2: {}
+
+ mlly@1.7.4:
+ dependencies:
+ acorn: 8.14.0
+ pathe: 2.0.2
+ pkg-types: 1.3.1
+ ufo: 1.5.4
+
+ mri@1.2.0: {}
+
+ mrmime@2.0.0: {}
+
+ ms@2.1.3: {}
+
+ muggle-string@0.4.1: {}
+
+ mute-stream@2.0.0: {}
+
+ nanoid@3.3.8: {}
+
+ natural-compare@1.4.0: {}
+
+ neotraverse@0.6.18: {}
+
+ nlcst-to-string@4.0.0:
+ dependencies:
+ '@types/nlcst': 2.0.3
+
+ node-fetch-native@1.6.6: {}
+
+ node-int64@0.4.0: {}
+
+ node-machine-id@1.1.12: {}
+
+ node-releases@2.0.19: {}
+
+ normalize-path@3.0.0: {}
+
+ npm-run-path@4.0.1:
+ dependencies:
+ path-key: 3.1.1
+
+ nth-check@2.1.1:
+ dependencies:
+ boolbase: 1.0.0
+
+ nx@20.3.3:
+ dependencies:
+ '@napi-rs/wasm-runtime': 0.2.4
+ '@yarnpkg/lockfile': 1.1.0
+ '@yarnpkg/parsers': 3.0.2
+ '@zkochan/js-yaml': 0.0.7
+ axios: 1.7.9
+ chalk: 4.1.2
+ cli-cursor: 3.1.0
+ cli-spinners: 2.6.1
+ cliui: 8.0.1
+ dotenv: 16.4.7
+ dotenv-expand: 11.0.7
+ enquirer: 2.3.6
+ figures: 3.2.0
+ flat: 5.0.2
+ front-matter: 4.0.2
+ ignore: 5.3.2
+ jest-diff: 29.7.0
+ jsonc-parser: 3.2.0
+ lines-and-columns: 2.0.3
+ minimatch: 9.0.3
+ node-machine-id: 1.1.12
+ npm-run-path: 4.0.1
+ open: 8.4.2
+ ora: 5.3.0
+ resolve.exports: 2.0.3
+ semver: 7.6.3
+ string-width: 4.2.3
+ tar-stream: 2.2.0
+ tmp: 0.2.3
+ tsconfig-paths: 4.2.0
+ tslib: 2.8.1
+ yaml: 2.7.0
+ yargs: 17.7.2
+ yargs-parser: 21.1.1
+ optionalDependencies:
+ '@nx/nx-darwin-arm64': 20.3.3
+ '@nx/nx-darwin-x64': 20.3.3
+ '@nx/nx-freebsd-x64': 20.3.3
+ '@nx/nx-linux-arm-gnueabihf': 20.3.3
+ '@nx/nx-linux-arm64-gnu': 20.3.3
+ '@nx/nx-linux-arm64-musl': 20.3.3
+ '@nx/nx-linux-x64-gnu': 20.3.3
+ '@nx/nx-linux-x64-musl': 20.3.3
+ '@nx/nx-win32-arm64-msvc': 20.3.3
+ '@nx/nx-win32-x64-msvc': 20.3.3
+ transitivePeerDependencies:
+ - debug
+
+ object.defaults@1.1.0:
+ dependencies:
+ array-each: 1.0.1
+ array-slice: 1.1.0
+ for-own: 1.0.0
+ isobject: 3.0.1
+
+ object.pick@1.3.0:
+ dependencies:
+ isobject: 3.0.1
+
+ ofetch@1.4.1:
+ dependencies:
+ destr: 2.0.3
+ node-fetch-native: 1.6.6
+ ufo: 1.5.4
+
+ ohash@1.1.4: {}
+
+ once@1.4.0:
+ dependencies:
+ wrappy: 1.0.2
+
+ onetime@5.1.2:
+ dependencies:
+ mimic-fn: 2.1.0
+
+ oniguruma-to-es@2.3.0:
+ dependencies:
+ emoji-regex-xs: 1.0.0
+ regex: 5.1.1
+ regex-recursion: 5.1.1
+
+ open@8.4.2:
+ dependencies:
+ define-lazy-prop: 2.0.0
+ is-docker: 2.2.1
+ is-wsl: 2.2.0
+
+ optionator@0.9.4:
+ dependencies:
+ deep-is: 0.1.4
+ fast-levenshtein: 2.0.6
+ levn: 0.4.1
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+ word-wrap: 1.2.5
+
+ ora@5.3.0:
+ dependencies:
+ bl: 4.1.0
+ chalk: 4.1.2
+ cli-cursor: 3.1.0
+ cli-spinners: 2.6.1
+ is-interactive: 1.0.0
+ log-symbols: 4.1.0
+ strip-ansi: 6.0.1
+ wcwidth: 1.0.1
+
+ os-tmpdir@1.0.2: {}
+
+ p-limit@2.3.0:
+ dependencies:
+ p-try: 2.2.0
+
+ p-limit@3.1.0:
+ dependencies:
+ yocto-queue: 0.1.0
+
+ p-limit@6.2.0:
+ dependencies:
+ yocto-queue: 1.1.1
+
+ p-locate@4.1.0:
+ dependencies:
+ p-limit: 2.3.0
+
+ p-locate@5.0.0:
+ dependencies:
+ p-limit: 3.1.0
+
+ p-map@4.0.0:
+ dependencies:
+ aggregate-error: 3.1.0
+
+ p-queue@8.1.0:
+ dependencies:
+ eventemitter3: 5.0.1
+ p-timeout: 6.1.4
+
+ p-timeout@6.1.4: {}
+
+ p-try@2.2.0: {}
+
+ package-json-from-dist@1.0.1: {}
+
+ package-manager-detector@0.2.8: {}
+
+ pagefind@1.3.0:
+ optionalDependencies:
+ '@pagefind/darwin-arm64': 1.3.0
+ '@pagefind/darwin-x64': 1.3.0
+ '@pagefind/linux-arm64': 1.3.0
+ '@pagefind/linux-x64': 1.3.0
+ '@pagefind/windows-x64': 1.3.0
+
+ parent-module@1.0.1:
+ dependencies:
+ callsites: 3.1.0
+
+ parse-entities@4.0.2:
+ dependencies:
+ '@types/unist': 2.0.11
+ character-entities-legacy: 3.0.0
+ character-reference-invalid: 2.0.1
+ decode-named-character-reference: 1.0.2
+ is-alphanumerical: 2.0.1
+ is-decimal: 2.0.1
+ is-hexadecimal: 2.0.1
+
+ parse-filepath@1.0.2:
+ dependencies:
+ is-absolute: 1.0.0
+ map-cache: 0.2.2
+ path-root: 0.1.1
+
+ parse-latin@7.0.0:
+ dependencies:
+ '@types/nlcst': 2.0.3
+ '@types/unist': 3.0.3
+ nlcst-to-string: 4.0.0
+ unist-util-modify-children: 4.0.0
+ unist-util-visit-children: 3.0.0
+ vfile: 6.0.3
+
+ parse-ms@4.0.0: {}
+
+ parse-passwd@1.0.0: {}
+
+ parse5@7.2.1:
+ dependencies:
+ entities: 4.5.0
+
+ path-browserify@1.0.1: {}
+
+ path-exists@4.0.0: {}
+
+ path-is-absolute@1.0.1: {}
+
+ path-key@3.1.1: {}
+
+ path-parse@1.0.7: {}
+
+ path-root-regex@0.1.2: {}
+
+ path-root@0.1.1:
+ dependencies:
+ path-root-regex: 0.1.2
+
+ path-scurry@1.11.1:
+ dependencies:
+ lru-cache: 10.4.3
+ minipass: 7.1.2
+
+ pathe@1.1.2: {}
+
+ pathe@2.0.2: {}
+
+ pathval@2.0.0: {}
+
+ picocolors@1.1.1: {}
+
+ picomatch@2.3.1: {}
+
+ picomatch@4.0.2: {}
+
+ pify@4.0.1: {}
+
+ pirates@4.0.6: {}
+
+ pkg-dir@4.2.0:
+ dependencies:
+ find-up: 4.1.0
+
+ pkg-types@1.3.1:
+ dependencies:
+ confbox: 0.1.8
+ mlly: 1.7.4
+ pathe: 2.0.2
+
+ postcss-nested@6.2.0(postcss@8.5.1):
+ dependencies:
+ postcss: 8.5.1
+ postcss-selector-parser: 6.1.2
+
+ postcss-selector-parser@6.1.2:
+ dependencies:
+ cssesc: 3.0.0
+ util-deprecate: 1.0.2
+
+ postcss@8.5.1:
+ dependencies:
+ nanoid: 3.3.8
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+
+ preferred-pm@4.0.0:
+ dependencies:
+ find-up-simple: 1.0.0
+ find-yarn-workspace-root2: 1.2.16
+ which-pm: 3.0.0
+
+ prelude-ls@1.2.1: {}
+
+ premove@4.0.0: {}
+
+ prettier@3.4.2: {}
+
+ pretty-format@29.7.0:
+ dependencies:
+ '@jest/schemas': 29.6.3
+ ansi-styles: 5.2.0
+ react-is: 18.3.1
+
+ pretty-ms@9.2.0:
+ dependencies:
+ parse-ms: 4.0.0
+
+ prismjs@1.29.0: {}
+
+ prompts@2.4.2:
+ dependencies:
+ kleur: 3.0.3
+ sisteransi: 1.0.5
+
+ property-information@6.5.0: {}
+
+ proxy-from-env@1.1.0: {}
+
+ publint@0.3.2:
+ dependencies:
+ '@publint/pack': 0.1.1
+ package-manager-detector: 0.2.8
+ picocolors: 1.1.1
+ sade: 1.8.1
+
+ punycode.js@2.3.1: {}
+
+ punycode@2.3.1: {}
+
+ queue-microtask@1.2.3: {}
+
+ radix3@1.1.2: {}
+
+ react-dom@19.0.0(react@19.0.0):
+ dependencies:
+ react: 19.0.0
+ scheduler: 0.25.0
+
+ react-is@18.3.1: {}
+
+ react-refresh@0.14.2: {}
+
+ react@19.0.0: {}
+
+ readable-stream@3.6.2:
+ dependencies:
+ inherits: 2.0.4
+ string_decoder: 1.3.0
+ util-deprecate: 1.0.2
+
+ readdirp@3.6.0:
+ dependencies:
+ picomatch: 2.3.1
+
+ rechoir@0.8.0:
+ dependencies:
+ resolve: 1.22.10
+
+ recma-build-jsx@1.0.0:
+ dependencies:
+ '@types/estree': 1.0.6
+ estree-util-build-jsx: 3.0.1
+ vfile: 6.0.3
+
+ recma-jsx@1.0.0(acorn@8.14.0):
+ dependencies:
+ acorn-jsx: 5.3.2(acorn@8.14.0)
+ estree-util-to-js: 2.0.0
+ recma-parse: 1.0.0
+ recma-stringify: 1.0.0
+ unified: 11.0.5
+ transitivePeerDependencies:
+ - acorn
+
+ recma-parse@1.0.0:
+ dependencies:
+ '@types/estree': 1.0.6
+ esast-util-from-js: 2.0.1
+ unified: 11.0.5
+ vfile: 6.0.3
+
+ recma-stringify@1.0.0:
+ dependencies:
+ '@types/estree': 1.0.6
+ estree-util-to-js: 2.0.0
+ unified: 11.0.5
+ vfile: 6.0.3
+
+ redent@4.0.0:
+ dependencies:
+ indent-string: 5.0.0
+ strip-indent: 4.0.0
+
+ regenerator-runtime@0.14.1: {}
+
+ regex-recursion@5.1.1:
+ dependencies:
+ regex: 5.1.1
+ regex-utilities: 2.3.0
+
+ regex-utilities@2.3.0: {}
+
+ regex@5.1.1:
+ dependencies:
+ regex-utilities: 2.3.0
+
+ rehype-expressive-code@0.40.1:
+ dependencies:
+ expressive-code: 0.40.1
+
+ rehype-format@5.0.1:
+ dependencies:
+ '@types/hast': 3.0.4
+ hast-util-format: 1.1.0
+
+ rehype-parse@9.0.1:
+ dependencies:
+ '@types/hast': 3.0.4
+ hast-util-from-html: 2.0.3
+ unified: 11.0.5
+
+ rehype-raw@7.0.0:
+ dependencies:
+ '@types/hast': 3.0.4
+ hast-util-raw: 9.1.0
+ vfile: 6.0.3
+
+ rehype-recma@1.0.0:
+ dependencies:
+ '@types/estree': 1.0.6
+ '@types/hast': 3.0.4
+ hast-util-to-estree: 3.1.1
+ transitivePeerDependencies:
+ - supports-color
+
+ rehype-stringify@10.0.1:
+ dependencies:
+ '@types/hast': 3.0.4
+ hast-util-to-html: 9.0.4
+ unified: 11.0.5
+
+ rehype@13.0.2:
+ dependencies:
+ '@types/hast': 3.0.4
+ rehype-parse: 9.0.1
+ rehype-stringify: 10.0.1
+ unified: 11.0.5
+
+ remark-directive@3.0.1:
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-directive: 3.1.0
+ micromark-extension-directive: 3.0.2
+ unified: 11.0.5
+ transitivePeerDependencies:
+ - supports-color
+
+ remark-gfm@4.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-gfm: 3.0.0
+ micromark-extension-gfm: 3.0.0
+ remark-parse: 11.0.0
+ remark-stringify: 11.0.0
+ unified: 11.0.5
+ transitivePeerDependencies:
+ - supports-color
+
+ remark-mdx@3.1.0:
+ dependencies:
+ mdast-util-mdx: 3.0.0
+ micromark-extension-mdxjs: 3.0.0
+ transitivePeerDependencies:
+ - supports-color
+
+ remark-parse@11.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-from-markdown: 2.0.2
+ micromark-util-types: 2.0.1
+ unified: 11.0.5
+ transitivePeerDependencies:
+ - supports-color
+
+ remark-rehype@11.1.1:
+ dependencies:
+ '@types/hast': 3.0.4
+ '@types/mdast': 4.0.4
+ mdast-util-to-hast: 13.2.0
+ unified: 11.0.5
+ vfile: 6.0.3
+
+ remark-smartypants@3.0.2:
+ dependencies:
+ retext: 9.0.0
+ retext-smartypants: 6.2.0
+ unified: 11.0.5
+ unist-util-visit: 5.0.0
+
+ remark-stringify@11.0.0:
+ dependencies:
+ '@types/mdast': 4.0.4
+ mdast-util-to-markdown: 2.1.2
+ unified: 11.0.5
+
+ require-directory@2.1.1: {}
+
+ require-from-string@2.0.2: {}
+
+ resolve-dir@1.0.1:
+ dependencies:
+ expand-tilde: 2.0.2
+ global-modules: 1.0.0
+
+ resolve-from@4.0.0: {}
+
+ resolve-from@5.0.0: {}
+
+ resolve-pkg-maps@1.0.0: {}
+
+ resolve.exports@2.0.3: {}
+
+ resolve@1.22.10:
+ dependencies:
+ is-core-module: 2.16.1
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+
+ restore-cursor@3.1.0:
+ dependencies:
+ onetime: 5.1.2
+ signal-exit: 3.0.7
+
+ retext-latin@4.0.0:
+ dependencies:
+ '@types/nlcst': 2.0.3
+ parse-latin: 7.0.0
+ unified: 11.0.5
+
+ retext-smartypants@6.2.0:
+ dependencies:
+ '@types/nlcst': 2.0.3
+ nlcst-to-string: 4.0.0
+ unist-util-visit: 5.0.0
+
+ retext-stringify@4.0.0:
+ dependencies:
+ '@types/nlcst': 2.0.3
+ nlcst-to-string: 4.0.0
+ unified: 11.0.5
+
+ retext@9.0.0:
+ dependencies:
+ '@types/nlcst': 2.0.3
+ retext-latin: 4.0.0
+ retext-stringify: 4.0.0
+ unified: 11.0.5
+
+ reusify@1.0.4: {}
+
+ rollup-plugin-preserve-directives@0.4.0(rollup@4.32.0):
+ dependencies:
+ '@rollup/pluginutils': 5.1.4(rollup@4.32.0)
+ magic-string: 0.30.17
+ rollup: 4.32.0
+
+ rollup@4.32.0:
+ dependencies:
+ '@types/estree': 1.0.6
+ optionalDependencies:
+ '@rollup/rollup-android-arm-eabi': 4.32.0
+ '@rollup/rollup-android-arm64': 4.32.0
+ '@rollup/rollup-darwin-arm64': 4.32.0
+ '@rollup/rollup-darwin-x64': 4.32.0
+ '@rollup/rollup-freebsd-arm64': 4.32.0
+ '@rollup/rollup-freebsd-x64': 4.32.0
+ '@rollup/rollup-linux-arm-gnueabihf': 4.32.0
+ '@rollup/rollup-linux-arm-musleabihf': 4.32.0
+ '@rollup/rollup-linux-arm64-gnu': 4.32.0
+ '@rollup/rollup-linux-arm64-musl': 4.32.0
+ '@rollup/rollup-linux-loongarch64-gnu': 4.32.0
+ '@rollup/rollup-linux-powerpc64le-gnu': 4.32.0
+ '@rollup/rollup-linux-riscv64-gnu': 4.32.0
+ '@rollup/rollup-linux-s390x-gnu': 4.32.0
+ '@rollup/rollup-linux-x64-gnu': 4.32.0
+ '@rollup/rollup-linux-x64-musl': 4.32.0
+ '@rollup/rollup-win32-arm64-msvc': 4.32.0
+ '@rollup/rollup-win32-ia32-msvc': 4.32.0
+ '@rollup/rollup-win32-x64-msvc': 4.32.0
+ fsevents: 2.3.3
+
+ run-async@3.0.0: {}
+
+ run-parallel@1.2.0:
+ dependencies:
+ queue-microtask: 1.2.3
+
+ rxjs@7.8.1:
+ dependencies:
+ tslib: 2.8.1
+
+ sade@1.8.1:
+ dependencies:
+ mri: 1.2.0
+
+ safe-buffer@5.2.1: {}
+
+ safer-buffer@2.1.2: {}
+
+ sax@1.4.1: {}
+
+ scheduler@0.25.0: {}
+
+ semver@6.3.1: {}
+
+ semver@7.5.4:
+ dependencies:
+ lru-cache: 6.0.0
+
+ semver@7.6.3: {}
+
+ sharp@0.33.5:
+ dependencies:
+ color: 4.2.3
+ detect-libc: 2.0.3
+ semver: 7.6.3
+ optionalDependencies:
+ '@img/sharp-darwin-arm64': 0.33.5
+ '@img/sharp-darwin-x64': 0.33.5
+ '@img/sharp-libvips-darwin-arm64': 1.0.4
+ '@img/sharp-libvips-darwin-x64': 1.0.4
+ '@img/sharp-libvips-linux-arm': 1.0.5
+ '@img/sharp-libvips-linux-arm64': 1.0.4
+ '@img/sharp-libvips-linux-s390x': 1.0.4
+ '@img/sharp-libvips-linux-x64': 1.0.4
+ '@img/sharp-libvips-linuxmusl-arm64': 1.0.4
+ '@img/sharp-libvips-linuxmusl-x64': 1.0.4
+ '@img/sharp-linux-arm': 0.33.5
+ '@img/sharp-linux-arm64': 0.33.5
+ '@img/sharp-linux-s390x': 0.33.5
+ '@img/sharp-linux-x64': 0.33.5
+ '@img/sharp-linuxmusl-arm64': 0.33.5
+ '@img/sharp-linuxmusl-x64': 0.33.5
+ '@img/sharp-wasm32': 0.33.5
+ '@img/sharp-win32-ia32': 0.33.5
+ '@img/sharp-win32-x64': 0.33.5
+
+ shebang-command@2.0.0:
+ dependencies:
+ shebang-regex: 3.0.0
+
+ shebang-regex@3.0.0: {}
+
+ sherif-darwin-arm64@1.2.0:
+ optional: true
+
+ sherif-darwin-x64@1.2.0:
+ optional: true
+
+ sherif-linux-arm64@1.2.0:
+ optional: true
+
+ sherif-linux-x64@1.2.0:
+ optional: true
+
+ sherif-windows-arm64@1.2.0:
+ optional: true
+
+ sherif-windows-x64@1.2.0:
+ optional: true
+
+ sherif@1.2.0:
+ optionalDependencies:
+ sherif-darwin-arm64: 1.2.0
+ sherif-darwin-x64: 1.2.0
+ sherif-linux-arm64: 1.2.0
+ sherif-linux-x64: 1.2.0
+ sherif-windows-arm64: 1.2.0
+ sherif-windows-x64: 1.2.0
+
+ shiki@1.29.1:
+ dependencies:
+ '@shikijs/core': 1.29.1
+ '@shikijs/engine-javascript': 1.29.1
+ '@shikijs/engine-oniguruma': 1.29.1
+ '@shikijs/langs': 1.29.1
+ '@shikijs/themes': 1.29.1
+ '@shikijs/types': 1.29.1
+ '@shikijs/vscode-textmate': 10.0.1
+ '@types/hast': 3.0.4
+
+ siginfo@2.0.0: {}
+
+ signal-exit@3.0.7: {}
+
+ signal-exit@4.1.0: {}
+
+ simple-git@3.27.0:
+ dependencies:
+ '@kwsites/file-exists': 1.1.1
+ '@kwsites/promise-deferred': 1.1.1
+ debug: 4.4.0
+ transitivePeerDependencies:
+ - supports-color
+
+ simple-swizzle@0.2.2:
+ dependencies:
+ is-arrayish: 0.3.2
+
+ sisteransi@1.0.5: {}
+
+ sitemap@8.0.0:
+ dependencies:
+ '@types/node': 17.0.45
+ '@types/sax': 1.2.7
+ arg: 5.0.2
+ sax: 1.4.1
+
+ slash@3.0.0: {}
+
+ slice-ansi@7.1.0:
+ dependencies:
+ ansi-styles: 6.2.1
+ is-fullwidth-code-point: 5.0.0
+
+ smol-toml@1.3.1: {}
+
+ source-map-js@1.2.1: {}
+
+ source-map@0.6.1: {}
+
+ source-map@0.7.4: {}
+
+ space-separated-tokens@2.0.2: {}
+
+ split2@4.2.0: {}
+
+ sprintf-js@1.0.3: {}
+
+ stable-hash@0.0.4: {}
+
+ stack-utils@2.0.6:
+ dependencies:
+ escape-string-regexp: 2.0.0
+
+ stackback@0.0.2: {}
+
+ std-env@3.8.0: {}
+
+ stream-replace-string@2.0.0: {}
+
+ string-argv@0.3.2: {}
+
+ string-width@4.2.3:
+ dependencies:
+ emoji-regex: 8.0.0
+ is-fullwidth-code-point: 3.0.0
+ strip-ansi: 6.0.1
+
+ string-width@5.1.2:
+ dependencies:
+ eastasianwidth: 0.2.0
+ emoji-regex: 9.2.2
+ strip-ansi: 7.1.0
+
+ string-width@7.2.0:
+ dependencies:
+ emoji-regex: 10.4.0
+ get-east-asian-width: 1.3.0
+ strip-ansi: 7.1.0
+
+ string_decoder@1.3.0:
+ dependencies:
+ safe-buffer: 5.2.1
+
+ stringify-entities@4.0.4:
+ dependencies:
+ character-entities-html4: 2.1.0
+ character-entities-legacy: 3.0.0
+
+ strip-ansi@6.0.1:
+ dependencies:
+ ansi-regex: 5.0.1
+
+ strip-ansi@7.1.0:
+ dependencies:
+ ansi-regex: 6.1.0
+
+ strip-bom@3.0.0: {}
+
+ strip-final-newline@4.0.0: {}
+
+ strip-indent@4.0.0:
+ dependencies:
+ min-indent: 1.0.1
+
+ strip-json-comments@3.1.1: {}
+
+ strip-json-comments@5.0.1: {}
+
+ style-to-object@1.0.8:
+ dependencies:
+ inline-style-parser: 0.2.4
+
+ summary@2.1.0: {}
+
+ supports-color@7.2.0:
+ dependencies:
+ has-flag: 4.0.0
+
+ supports-color@8.1.1:
+ dependencies:
+ has-flag: 4.0.0
+
+ supports-preserve-symlinks-flag@1.0.0: {}
+
+ tapable@2.2.1: {}
+
+ tar-stream@2.2.0:
+ dependencies:
+ bl: 4.1.0
+ end-of-stream: 1.4.4
+ fs-constants: 1.0.0
+ inherits: 2.0.4
+ readable-stream: 3.6.2
+
+ test-exclude@6.0.0:
+ dependencies:
+ '@istanbuljs/schema': 0.1.3
+ glob: 7.2.3
+ minimatch: 3.1.2
+
+ test-exclude@7.0.1:
+ dependencies:
+ '@istanbuljs/schema': 0.1.3
+ glob: 10.4.5
+ minimatch: 9.0.5
+
+ text-extensions@2.4.0: {}
+
+ through@2.3.8: {}
+
+ tinybench@2.9.0: {}
+
+ tinyexec@0.3.2: {}
+
+ tinypool@1.0.2: {}
+
+ tinyrainbow@2.0.0: {}
+
+ tinyspy@3.0.2: {}
+
+ tmp@0.0.33:
+ dependencies:
+ os-tmpdir: 1.0.2
+
+ tmp@0.2.3: {}
+
+ tmpl@1.0.5: {}
+
+ to-regex-range@5.0.1:
+ dependencies:
+ is-number: 7.0.0
+
+ tree-kill@1.2.2: {}
+
+ trim-lines@3.0.1: {}
+
+ trough@2.2.0: {}
+
+ ts-api-utils@2.0.0(typescript@5.6.3):
+ dependencies:
+ typescript: 5.6.3
+
+ tsconfck@3.1.4(typescript@5.6.3):
+ optionalDependencies:
+ typescript: 5.6.3
+
+ tsconfck@3.1.4(typescript@5.7.3):
+ optionalDependencies:
+ typescript: 5.7.3
+
+ tsconfig-paths@4.2.0:
+ dependencies:
+ json5: 2.2.3
+ minimist: 1.2.8
+ strip-bom: 3.0.0
+
+ tslib@2.8.1: {}
+
+ type-check@0.4.0:
+ dependencies:
+ prelude-ls: 1.2.1
+
+ type-detect@4.0.8: {}
+
+ type-fest@0.21.3: {}
+
+ type-fest@4.33.0: {}
+
+ typedoc-plugin-frontmatter@1.1.2(typedoc-plugin-markdown@4.4.1(typedoc@0.27.6(typescript@5.6.3))):
+ dependencies:
+ typedoc-plugin-markdown: 4.4.1(typedoc@0.27.6(typescript@5.6.3))
+ yaml: 2.7.0
+
+ typedoc-plugin-markdown@4.4.1(typedoc@0.27.6(typescript@5.6.3)):
+ dependencies:
+ typedoc: 0.27.6(typescript@5.6.3)
+
+ typedoc@0.27.6(typescript@5.6.3):
+ dependencies:
+ '@gerrit0/mini-shiki': 1.27.0
+ lunr: 2.3.9
+ markdown-it: 14.1.0
+ minimatch: 9.0.5
+ typescript: 5.6.3
+ yaml: 2.7.0
+
+ typescript-eslint@8.20.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.6.3):
+ dependencies:
+ '@typescript-eslint/eslint-plugin': 8.20.0(@typescript-eslint/parser@8.20.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.6.3))(eslint@9.19.0(jiti@2.4.2))(typescript@5.6.3)
+ '@typescript-eslint/parser': 8.20.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.6.3)
+ '@typescript-eslint/utils': 8.20.0(eslint@9.19.0(jiti@2.4.2))(typescript@5.6.3)
+ eslint: 9.19.0(jiti@2.4.2)
+ typescript: 5.6.3
+ transitivePeerDependencies:
+ - supports-color
+
+ typescript@5.4.2: {}
+
+ typescript@5.6.3: {}
+
+ typescript@5.7.3: {}
+
+ uc.micro@2.1.0: {}
+
+ ufo@1.5.4: {}
+
+ ultrahtml@1.5.3: {}
+
+ unc-path-regex@0.1.2: {}
+
+ uncrypto@0.1.3: {}
+
+ undici-types@6.20.0: {}
+
+ unenv@1.10.0:
+ dependencies:
+ consola: 3.4.0
+ defu: 6.1.4
+ mime: 3.0.0
+ node-fetch-native: 1.6.6
+ pathe: 1.1.2
+
+ unified@11.0.5:
+ dependencies:
+ '@types/unist': 3.0.3
+ bail: 2.0.2
+ devlop: 1.1.0
+ extend: 3.0.2
+ is-plain-obj: 4.1.0
+ trough: 2.2.0
+ vfile: 6.0.3
+
+ unist-util-find-after@5.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-is: 6.0.0
+
+ unist-util-is@6.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+
+ unist-util-modify-children@4.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+ array-iterate: 2.0.1
+
+ unist-util-position-from-estree@2.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+
+ unist-util-position@5.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+
+ unist-util-remove-position@5.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-visit: 5.0.0
+
+ unist-util-stringify-position@4.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+
+ unist-util-visit-children@3.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+
+ unist-util-visit-parents@6.0.1:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-is: 6.0.0
+
+ unist-util-visit@5.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-is: 6.0.0
+ unist-util-visit-parents: 6.0.1
+
+ universalify@0.1.2: {}
+
+ universalify@2.0.1: {}
+
+ unstorage@1.14.4:
+ dependencies:
+ anymatch: 3.1.3
+ chokidar: 3.6.0
+ destr: 2.0.3
+ h3: 1.14.0
+ lru-cache: 10.4.3
+ node-fetch-native: 1.6.6
+ ofetch: 1.4.1
+ ufo: 1.5.4
+
+ update-browserslist-db@1.1.2(browserslist@4.24.4):
+ dependencies:
+ browserslist: 4.24.4
+ escalade: 3.2.0
+ picocolors: 1.1.1
+
+ uri-js@4.4.1:
+ dependencies:
+ punycode: 2.3.1
+
+ util-deprecate@1.0.2: {}
+
+ v8flags@4.0.1: {}
+
+ vfile-location@5.0.3:
+ dependencies:
+ '@types/unist': 3.0.3
+ vfile: 6.0.3
+
+ vfile-message@4.0.2:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-stringify-position: 4.0.0
+
+ vfile@6.0.3:
+ dependencies:
+ '@types/unist': 3.0.3
+ vfile-message: 4.0.2
+
+ vite-node@3.0.4(@types/node@22.10.10)(jiti@2.4.2)(yaml@2.7.0):
+ dependencies:
+ cac: 6.7.14
+ debug: 4.4.0
+ es-module-lexer: 1.6.0
+ pathe: 2.0.2
+ vite: 6.0.11(@types/node@22.10.10)(jiti@2.4.2)(yaml@2.7.0)
+ transitivePeerDependencies:
+ - '@types/node'
+ - jiti
+ - less
+ - lightningcss
+ - sass
+ - sass-embedded
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+ - tsx
+ - yaml
+
+ vite-plugin-dts@4.0.3(@types/node@22.10.10)(rollup@4.32.0)(typescript@5.6.3)(vite@6.0.11(@types/node@22.10.10)(jiti@2.4.2)(yaml@2.7.0)):
+ dependencies:
+ '@microsoft/api-extractor': 7.47.4(@types/node@22.10.10)
+ '@rollup/pluginutils': 5.1.4(rollup@4.32.0)
+ '@volar/typescript': 2.4.11
+ '@vue/language-core': 2.0.29(typescript@5.6.3)
+ compare-versions: 6.1.1
+ debug: 4.4.0
+ kolorist: 1.8.0
+ local-pkg: 0.5.1
+ magic-string: 0.30.17
+ typescript: 5.6.3
+ vue-tsc: 2.0.29(typescript@5.6.3)
+ optionalDependencies:
+ vite: 6.0.11(@types/node@22.10.10)(jiti@2.4.2)(yaml@2.7.0)
+ transitivePeerDependencies:
+ - '@types/node'
+ - rollup
+ - supports-color
+
+ vite-plugin-externalize-deps@0.9.0(vite@6.0.11(@types/node@22.10.10)(jiti@2.4.2)(yaml@2.7.0)):
+ dependencies:
+ vite: 6.0.11(@types/node@22.10.10)(jiti@2.4.2)(yaml@2.7.0)
+
+ vite-tsconfig-paths@5.1.4(typescript@5.6.3)(vite@6.0.11(@types/node@22.10.10)(jiti@2.4.2)(yaml@2.7.0)):
+ dependencies:
+ debug: 4.4.0
+ globrex: 0.1.2
+ tsconfck: 3.1.4(typescript@5.6.3)
+ optionalDependencies:
+ vite: 6.0.11(@types/node@22.10.10)(jiti@2.4.2)(yaml@2.7.0)
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+
+ vite@6.0.11(@types/node@22.10.10)(jiti@2.4.2)(yaml@2.7.0):
+ dependencies:
+ esbuild: 0.24.2
+ postcss: 8.5.1
+ rollup: 4.32.0
+ optionalDependencies:
+ '@types/node': 22.10.10
+ fsevents: 2.3.3
+ jiti: 2.4.2
+ yaml: 2.7.0
+
+ vitefu@1.0.5(vite@6.0.11(@types/node@22.10.10)(jiti@2.4.2)(yaml@2.7.0)):
+ optionalDependencies:
+ vite: 6.0.11(@types/node@22.10.10)(jiti@2.4.2)(yaml@2.7.0)
+
+ vitest@3.0.4(@types/debug@4.1.12)(@types/node@22.10.10)(jiti@2.4.2)(yaml@2.7.0):
+ dependencies:
+ '@vitest/expect': 3.0.4
+ '@vitest/mocker': 3.0.4(vite@6.0.11(@types/node@22.10.10)(jiti@2.4.2)(yaml@2.7.0))
+ '@vitest/pretty-format': 3.0.4
+ '@vitest/runner': 3.0.4
+ '@vitest/snapshot': 3.0.4
+ '@vitest/spy': 3.0.4
+ '@vitest/utils': 3.0.4
+ chai: 5.1.2
+ debug: 4.4.0
+ expect-type: 1.1.0
+ magic-string: 0.30.17
+ pathe: 2.0.2
+ std-env: 3.8.0
+ tinybench: 2.9.0
+ tinyexec: 0.3.2
+ tinypool: 1.0.2
+ tinyrainbow: 2.0.0
+ vite: 6.0.11(@types/node@22.10.10)(jiti@2.4.2)(yaml@2.7.0)
+ vite-node: 3.0.4(@types/node@22.10.10)(jiti@2.4.2)(yaml@2.7.0)
+ why-is-node-running: 2.3.0
+ optionalDependencies:
+ '@types/debug': 4.1.12
+ '@types/node': 22.10.10
+ transitivePeerDependencies:
+ - jiti
+ - less
+ - lightningcss
+ - msw
+ - sass
+ - sass-embedded
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+ - tsx
+ - yaml
+
+ vscode-uri@3.0.8: {}
+
+ vue-eslint-parser@9.4.3(eslint@9.19.0(jiti@2.4.2)):
+ dependencies:
+ debug: 4.4.0
+ eslint: 9.19.0(jiti@2.4.2)
+ eslint-scope: 7.2.2
+ eslint-visitor-keys: 3.4.3
+ espree: 9.6.1
+ esquery: 1.6.0
+ lodash: 4.17.21
+ semver: 7.6.3
+ transitivePeerDependencies:
+ - supports-color
+
+ vue-tsc@2.0.29(typescript@5.6.3):
+ dependencies:
+ '@volar/typescript': 2.4.11
+ '@vue/language-core': 2.0.29(typescript@5.6.3)
+ semver: 7.6.3
+ typescript: 5.6.3
+
+ walker@1.0.8:
+ dependencies:
+ makeerror: 1.0.12
+
+ wcwidth@1.0.1:
+ dependencies:
+ defaults: 1.0.4
+
+ web-namespaces@2.0.1: {}
+
+ which-pm-runs@1.1.0: {}
+
+ which-pm@3.0.0:
+ dependencies:
+ load-yaml-file: 0.2.0
+
+ which@1.3.1:
+ dependencies:
+ isexe: 2.0.0
+
+ which@2.0.2:
+ dependencies:
+ isexe: 2.0.0
+
+ why-is-node-running@2.3.0:
+ dependencies:
+ siginfo: 2.0.0
+ stackback: 0.0.2
+
+ widest-line@5.0.0:
+ dependencies:
+ string-width: 7.2.0
+
+ word-wrap@1.2.5: {}
+
+ 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
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+
+ wrap-ansi@8.1.0:
+ dependencies:
+ ansi-styles: 6.2.1
+ string-width: 5.1.2
+ strip-ansi: 7.1.0
+
+ wrap-ansi@9.0.0:
+ dependencies:
+ ansi-styles: 6.2.1
+ string-width: 7.2.0
+ strip-ansi: 7.1.0
+
+ wrappy@1.0.2: {}
+
+ write-file-atomic@4.0.2:
+ dependencies:
+ imurmurhash: 0.1.4
+ signal-exit: 3.0.7
+
+ xxhash-wasm@1.1.0: {}
+
+ y18n@5.0.8: {}
+
+ yallist@3.1.1: {}
+
+ yallist@4.0.0: {}
+
+ yaml@2.7.0: {}
+
+ yargs-parser@21.1.1: {}
+
+ yargs@17.7.2:
+ dependencies:
+ cliui: 8.0.1
+ 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: 21.1.1
+
+ yocto-queue@0.1.0: {}
+
+ yocto-queue@1.1.1: {}
+
+ yocto-spinner@0.1.2:
+ dependencies:
+ yoctocolors: 2.1.1
+
+ yoctocolors-cjs@2.1.2: {}
+
+ yoctocolors@2.1.1: {}
+
+ zod-to-json-schema@3.24.1(zod@3.24.1):
+ dependencies:
+ zod: 3.24.1
+
+ zod-to-ts@1.2.0(typescript@5.7.3)(zod@3.24.1):
+ dependencies:
+ typescript: 5.7.3
+ zod: 3.24.1
+
+ zod-validation-error@3.4.0(zod@3.24.1):
+ dependencies:
+ zod: 3.24.1
+
+ zod@3.24.1: {}
+
+ zwitch@2.0.4: {}
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
new file mode 100644
index 0000000..183ff49
--- /dev/null
+++ b/pnpm-workspace.yaml
@@ -0,0 +1,3 @@
+packages:
+ - "packages/**"
+ - "website"
diff --git a/rollup.config.js b/rollup.config.js
deleted file mode 100644
index ab5c710..0000000
--- a/rollup.config.js
+++ /dev/null
@@ -1,5 +0,0 @@
-const rollupConfig = require('kcd-scripts/dist/config/rollup.config')
-
-// the exports in this library should always be named for all formats.
-rollupConfig.output[0].exports = 'named'
-module.exports = rollupConfig
diff --git a/scripts/generateDocs.js b/scripts/generateDocs.js
new file mode 100644
index 0000000..e597ec8
--- /dev/null
+++ b/scripts/generateDocs.js
@@ -0,0 +1,24 @@
+import { resolve } from "node:path";
+import { fileURLToPath } from "node:url";
+import { generateReferenceDocs } from "@tanstack/config/typedoc";
+
+const __dirname = fileURLToPath(new URL(".", import.meta.url));
+
+/** @type {import('@tanstack/config/typedoc').Package[]} */
+const packages = [
+ {
+ name: "cli-testing-library",
+ entryPoints: [
+ resolve(__dirname, "../packages/cli-testing-library/src/index.ts"),
+ ],
+ tsconfig: resolve(
+ __dirname,
+ "../packages/cli-testing-library/tsconfig.docs.json",
+ ),
+ outputDir: resolve(__dirname, "../docs/reference"),
+ },
+];
+
+await generateReferenceDocs({ packages });
+
+process.exit(0);
diff --git a/scripts/publish.js b/scripts/publish.js
new file mode 100644
index 0000000..db9b0e7
--- /dev/null
+++ b/scripts/publish.js
@@ -0,0 +1,33 @@
+// @ts-check
+
+import { resolve } from "node:path";
+import { fileURLToPath } from "node:url";
+import { publish } from "@tanstack/config/publish";
+
+const __dirname = fileURLToPath(new URL(".", import.meta.url));
+
+await publish({
+ packages: [
+ {
+ name: "cli-testing-library",
+ packageDir: "packages/cli-testing-library",
+ },
+ ],
+ branchConfigs: {
+ main: {
+ prerelease: false,
+ },
+ alpha: {
+ prerelease: true,
+ },
+ beta: {
+ prerelease: true,
+ },
+ },
+ rootDir: resolve(__dirname, ".."),
+ branch: process.env.BRANCH,
+ tag: process.env.TAG,
+ ghToken: process.env.GH_TOKEN,
+});
+
+process.exit(0);
diff --git a/scripts/tsconfig.json b/scripts/tsconfig.json
new file mode 100644
index 0000000..8ddb546
--- /dev/null
+++ b/scripts/tsconfig.json
@@ -0,0 +1,7 @@
+{
+ "extends": "../tsconfig.json",
+ "compilerOptions": {
+ "moduleResolution": "Bundler"
+ },
+ "include": ["**/*"]
+}
diff --git a/src/__tests__/events.js b/src/__tests__/events.js
deleted file mode 100644
index 7d900b0..0000000
--- a/src/__tests__/events.js
+++ /dev/null
@@ -1,119 +0,0 @@
-const {resolve} = require('path')
-const {render, cleanup} = require('../pure')
-const {fireEvent} = require('../events')
-const {waitFor} = require('../wait-for')
-const {default: userEvent} = require('../user-event')
-
-afterEach(async () => {
- await cleanup()
-})
-
-test('fireEvent write works', async () => {
- const props = await render('node', [
- resolve(__dirname, './execute-scripts/stdio-inquirer.js'),
- ])
-
- const {clear, findByText} = props
-
- const instance = await findByText('First option')
-
- expect(instance).toBeTruthy()
-
- // Windows uses ">", Linux/MacOS use "❯"
- expect(await findByText(/[❯>] One/)).toBeTruthy()
-
- clear()
-
- const down = '\x1B\x5B\x42'
- fireEvent(instance, 'write', {value: down})
-
- expect(await findByText(/[❯>] Two/)).toBeTruthy()
-
- clear()
-
- const enter = '\x0D'
- fireEvent(instance, 'write', {value: enter})
-
- expect(await findByText('First option: Two')).toBeTruthy()
-})
-
-test('FireEvent SigTerm works', async () => {
- const {findByText} = await render('node', [
- resolve(__dirname, './execute-scripts/stdio-inquirer.js'),
- ])
-
- const instance = await findByText('First option')
-
- expect(instance).toBeTruthy()
-
- await fireEvent.sigterm(instance)
-
- await waitFor(() => expect(instance.hasExit()).toBeTruthy())
-})
-
-test('FireEvent SigKill works', async () => {
- const {findByText} = await render('node', [
- resolve(__dirname, './execute-scripts/stdio-inquirer.js'),
- ])
-
- const instance = await findByText('First option')
-
- expect(instance).toBeTruthy()
-
- await fireEvent.sigkill(instance)
-
- await waitFor(() => expect(instance.hasExit()).toBeTruthy())
-})
-
-test('userEvent basic keyboard works', async () => {
- const {findByText} = await render('node', [
- resolve(__dirname, './execute-scripts/stdio-inquirer-input.js'),
- ])
-
- const instance = await findByText('What is your name?')
- expect(instance).toBeTruthy()
-
- userEvent.keyboard(instance, 'Test')
-
- expect(await findByText('Test')).toBeTruthy()
-})
-
-test('userEvent basic keyboard works when bound', async () => {
- const {findByText, userEvent: userEventLocal} = await render('node', [
- resolve(__dirname, './execute-scripts/stdio-inquirer-input.js'),
- ])
-
- const instance = await findByText('What is your name?')
- expect(instance).toBeTruthy()
-
- userEventLocal.keyboard('Test')
-
- expect(await findByText('Test')).toBeTruthy()
-})
-
-test('UserEvent.keyboard enter key works', async () => {
- const props = await render('node', [
- resolve(__dirname, './execute-scripts/stdio-inquirer.js'),
- ])
-
- const {clear, findByText, userEvent: userEventLocal} = props
-
- const instance = await findByText('First option')
-
- expect(instance).toBeTruthy()
-
- // Windows uses ">", Linux/MacOS use "❯"
- expect(await findByText(/[❯>] One/)).toBeTruthy()
-
- clear()
-
- userEventLocal.keyboard('[ArrowDown]')
-
- expect(await findByText(/[❯>] Two/)).toBeTruthy()
-
- clear()
-
- userEventLocal.keyboard('[Enter]')
-
- expect(await findByText('First option: Two')).toBeTruthy()
-})
diff --git a/src/__tests__/execute-scripts/list-args.js b/src/__tests__/execute-scripts/list-args.js
deleted file mode 100644
index 3e91ea7..0000000
--- a/src/__tests__/execute-scripts/list-args.js
+++ /dev/null
@@ -1 +0,0 @@
-console.log(process.argv)
diff --git a/src/__tests__/execute-scripts/log-err.js b/src/__tests__/execute-scripts/log-err.js
deleted file mode 100644
index de42973..0000000
--- a/src/__tests__/execute-scripts/log-err.js
+++ /dev/null
@@ -1,3 +0,0 @@
-console.log('Log here')
-console.warn('Warn here')
-console.error('Error here')
diff --git a/src/__tests__/execute-scripts/log-output.js b/src/__tests__/execute-scripts/log-output.js
deleted file mode 100644
index 1074704..0000000
--- a/src/__tests__/execute-scripts/log-output.js
+++ /dev/null
@@ -1,7 +0,0 @@
-const chalk = require('chalk')
-const customChalk = new chalk.Instance({level: 1})
-
-console.log('__disable_ansi_serialization')
-
-// eslint-disable-next-line prefer-template
-console.log(customChalk.blue('Hello') + ' World' + customChalk.red('!'))
diff --git a/src/__tests__/execute-scripts/stdio-inquirer-input.js b/src/__tests__/execute-scripts/stdio-inquirer-input.js
deleted file mode 100644
index 01e4ea0..0000000
--- a/src/__tests__/execute-scripts/stdio-inquirer-input.js
+++ /dev/null
@@ -1,9 +0,0 @@
-const inquirer = require('inquirer')
-
-inquirer.prompt([
- {
- type: 'input',
- name: 'name',
- message: 'What is your name?',
- },
-])
diff --git a/src/__tests__/execute-scripts/stdio-inquirer.js b/src/__tests__/execute-scripts/stdio-inquirer.js
deleted file mode 100644
index 0148bba..0000000
--- a/src/__tests__/execute-scripts/stdio-inquirer.js
+++ /dev/null
@@ -1,10 +0,0 @@
-const inquirer = require('inquirer')
-
-inquirer.prompt([
- {
- type: 'list',
- name: 'value',
- message: 'First option:',
- choices: ['One', 'Two', 'Three'],
- },
-])
diff --git a/src/__tests__/execute-scripts/throw.js b/src/__tests__/execute-scripts/throw.js
deleted file mode 100644
index bc4d348..0000000
--- a/src/__tests__/execute-scripts/throw.js
+++ /dev/null
@@ -1 +0,0 @@
-throw new Error('Search for this error in stderr')
diff --git a/src/__tests__/get-user-code-frame.js b/src/__tests__/get-user-code-frame.js
deleted file mode 100644
index 8d2bd05..0000000
--- a/src/__tests__/get-user-code-frame.js
+++ /dev/null
@@ -1,82 +0,0 @@
-import fs from 'fs'
-import {getUserCodeFrame} from '../get-user-code-frame'
-
-jest.mock('fs', () => ({
- // We setup the contents of a sample file
- readFileSync: jest.fn(
- () => `
- import {screen} from '@testing-library/dom'
- it('renders', () => {
- document.body.appendChild(
- document.createTextNode('Hello world')
- )
- screen.debug()
- expect(screen.getByText('Hello world')).toBeInTheDocument()
- })
- `,
- ),
-}))
-
-const userStackFrame = 'at somethingWrong (/sample-error/error-example.js:7:14)'
-
-let globalErrorMock
-
-beforeEach(() => {
- // Mock global.Error so we can setup our own stack messages
- globalErrorMock = jest.spyOn(global, 'Error')
-})
-
-afterEach(() => {
- global.Error.mockRestore()
-})
-
-test('it returns only user code frame when code frames from node_modules are first', () => {
- const stack = `Error: Kaboom
- at Object. (/sample-error/node_modules/@es2050/console/build/index.js:4:10)
- ${userStackFrame}
- `
- globalErrorMock.mockImplementationOnce(() => ({stack}))
- const userTrace = getUserCodeFrame(stack)
-
- expect(userTrace).toMatchInlineSnapshot(`
- /sample-error/error-example.js:7:14
- 5 | document.createTextNode('Hello world')
- 6 | )
- > 7 | screen.debug()
- | ^
-
- `)
-})
-
-test('it returns only user code frame when node code frames are present afterwards', () => {
- const stack = `Error: Kaboom
- at Object. (/sample-error/node_modules/@es2050/console/build/index.js:4:10)
- ${userStackFrame}
- at Object. (/sample-error/error-example.js:14:1)
- at internal/main/run_main_module.js:17:47
- `
- globalErrorMock.mockImplementationOnce(() => ({stack}))
- const userTrace = getUserCodeFrame()
-
- expect(userTrace).toMatchInlineSnapshot(`
- /sample-error/error-example.js:7:14
- 5 | document.createTextNode('Hello world')
- 6 | )
- > 7 | screen.debug()
- | ^
-
- `)
-})
-
-test("it returns empty string if file from code frame can't be read", () => {
- // Make fire read purposely fail
- fs.readFileSync.mockImplementationOnce(() => {
- throw Error()
- })
- const stack = `Error: Kaboom
- ${userStackFrame}
- `
- globalErrorMock.mockImplementationOnce(() => ({stack}))
-
- expect(getUserCodeFrame(stack)).toEqual('')
-})
diff --git a/src/__tests__/matchers.js b/src/__tests__/matchers.js
deleted file mode 100644
index 985933e..0000000
--- a/src/__tests__/matchers.js
+++ /dev/null
@@ -1,90 +0,0 @@
-const {resolve} = require('path')
-const {render} = require('../pure')
-
-test('toBeInTheConsole should pass when something is in console', async () => {
- const {findByText} = await render('node', [
- resolve(__dirname, './execute-scripts/list-args.js'),
- '--version',
- ])
-
- await expect(
- (async () => expect(await findByText('--version')).toBeInTheConsole())(),
- ).resolves.not.toThrow()
-})
-
-test('toBeInTheConsole should fail when something is not console', async () => {
- const {queryByText} = await render('node', [
- resolve(__dirname, './execute-scripts/list-args.js'),
- '--version',
- ])
-
- expect(() => expect(queryByText('NotHere')).toBeInTheConsole()).toThrow(
- /value must be a TestInstance/,
- )
-})
-
-test('not.toBeInTheConsole should pass something is not console', async () => {
- const {queryByText} = await render('node', [
- resolve(__dirname, './execute-scripts/list-args.js'),
- '--version',
- ])
-
- expect(() =>
- expect(queryByText('NotHere')).not.toBeInTheConsole(),
- ).not.toThrow()
-})
-
-test('not.toBeInTheConsole should fail something is console', async () => {
- const {queryByText} = await render('node', [
- resolve(__dirname, './execute-scripts/list-args.js'),
- '--version',
- ])
-
- expect(() => expect(queryByText('--version')).not.toBeInTheConsole()).toThrow(
- /Expected not to find the instance in the console/,
- )
-})
-
-test('toHaveErrorMessage should pass during stderr when no string passed', async () => {
- const instance = await render('node', [
- resolve(__dirname, './execute-scripts/throw.js'),
- ])
-
- await expect(
- (async () => expect(instance).toHaveErrorMessage())(),
- ).resolves.not.toThrow()
-})
-
-test('toHaveErrorMessage should pass during stderr when string passed', async () => {
- const instance = await render('node', [
- resolve(__dirname, './execute-scripts/throw.js'),
- ])
-
- await expect(
- (async () =>
- expect(instance).toHaveErrorMessage(/Search for this error in stderr/))(),
- ).resolves.not.toThrow()
-})
-
-test('toHaveErrorMessage should fail when something is not in stderr', async () => {
- const {findByText} = await render('node', [
- resolve(__dirname, './execute-scripts/list-args.js'),
- '--version',
- ])
-
- const instance = await findByText('--version')
- expect(() => expect(instance).toHaveErrorMessage("Error isn't here")).toThrow(
- /Expected the instance to have error message/,
- )
-})
-
-test('toHaveErrorMessage should fail when null is passed', async () => {
- const {queryByText} = await render('node', [
- resolve(__dirname, './execute-scripts/list-args.js'),
- '--version',
- ])
-
- expect(() => expect(queryByText('NotHere')).toHaveErrorMessage()).toThrow(
- /value must be a TestInstance/,
- )
-})
diff --git a/src/__tests__/matches.js b/src/__tests__/matches.js
deleted file mode 100644
index 3d512e6..0000000
--- a/src/__tests__/matches.js
+++ /dev/null
@@ -1,41 +0,0 @@
-import {fuzzyMatches, matches} from '../matches'
-
-// unit tests for text match utils
-
-const node = null
-const normalizer = str => str
-
-test('matchers accept strings', () => {
- expect(matches('ABC', node, 'ABC', normalizer)).toBe(true)
- expect(fuzzyMatches('ABC', node, 'ABC', normalizer)).toBe(true)
-})
-
-test('matchers accept regex', () => {
- expect(matches('ABC', node, /ABC/, normalizer)).toBe(true)
- expect(fuzzyMatches('ABC', node, /ABC/, normalizer)).toBe(true)
-})
-
-test('matchers accept functions', () => {
- expect(matches('ABC', node, text => text === 'ABC', normalizer)).toBe(true)
- expect(fuzzyMatches('ABC', node, text => text === 'ABC', normalizer)).toBe(
- true,
- )
-})
-
-test('matchers return false if text to match is not a string', () => {
- expect(matches(null, node, 'ABC', normalizer)).toBe(false)
- expect(fuzzyMatches(null, node, 'ABC', normalizer)).toBe(false)
-})
-
-test('matchers throw on invalid matcher inputs', () => {
- expect(() =>
- matches('ABC', node, null, normalizer),
- ).toThrowErrorMatchingInlineSnapshot(
- `It looks like null was passed instead of a matcher. Did you do something like getByText(null)?`,
- )
- expect(() =>
- fuzzyMatches('ABC', node, undefined, normalizer),
- ).toThrowErrorMatchingInlineSnapshot(
- `It looks like undefined was passed instead of a matcher. Did you do something like getByText(undefined)?`,
- )
-})
diff --git a/src/__tests__/pretty-cli.js b/src/__tests__/pretty-cli.js
deleted file mode 100644
index 81090f2..0000000
--- a/src/__tests__/pretty-cli.js
+++ /dev/null
@@ -1,43 +0,0 @@
-const {resolve} = require('path')
-const {render} = require('../pure')
-const {prettyCLI} = require('../pretty-cli')
-
-test('Should pretty print with ANSI codes properly', async () => {
- const instance = await render('node', [
- resolve(__dirname, './execute-scripts/log-output.js'),
- ])
-
- await instance.findByText('Hello')
-
- expect(prettyCLI(instance, 9000)).toMatchInlineSnapshot(`
- __disable_ansi_serialization
- [34mHello[39m World[31m![39m
- `)
-})
-
-test('Should escape ANSI codes properly when sliced too thin', async () => {
- const instance = await render('node', [
- resolve(__dirname, './execute-scripts/log-output.js'),
- ])
-
- await instance.findByText('Hello')
-
- expect(prettyCLI(instance, 30)).toMatchInlineSnapshot(`
- __disable_ansi_serialization
- [34mH[39m
- `)
-})
-
-test('Should show proper stderr and stdout output', async () => {
- const instance = await render('node', [
- resolve(__dirname, './execute-scripts/log-err.js'),
- ])
-
- await instance.findByError('Error here')
-
- expect(prettyCLI(instance, 300)).toMatchInlineSnapshot(`
- Log here
- Warn here
- Error here
- `)
-})
diff --git a/src/__tests__/queries.js b/src/__tests__/queries.js
deleted file mode 100644
index 9b79697..0000000
--- a/src/__tests__/queries.js
+++ /dev/null
@@ -1,68 +0,0 @@
-const {resolve} = require('path')
-const {render} = require('../pure')
-const {waitFor} = require('../wait-for')
-
-test('findByError should show stderr', async () => {
- const {findByError} = await render('node', [
- resolve(__dirname, './execute-scripts/throw.js'),
- ])
- expect(findByError('Search for this error in stderr')).toBeTruthy()
-})
-
-test('findByText should find stdout', async () => {
- const {findByText} = await render('node', [
- resolve(__dirname, './execute-scripts/list-args.js'),
- '--version',
- ])
-
- expect(await findByText('--version')).toBeTruthy()
-})
-
-test('findByText should throw errors', async () => {
- const {findByText} = await render('node', [
- resolve(__dirname, './execute-scripts/list-args.js'),
- '--version',
- ])
-
- await expect(() => findByText('--nothing')).rejects.toThrow(
- 'Unable to find an stdout line with the text:',
- )
-})
-
-test('queryByText should find text', async () => {
- const {queryByText} = await render('node', [
- resolve(__dirname, './execute-scripts/list-args.js'),
- '--version',
- ])
-
- expect(queryByText('--version')).toBeTruthy()
-})
-
-test('queryByText should not throw errors', async () => {
- const {queryByText} = await render('node', [
- resolve(__dirname, './execute-scripts/list-args.js'),
- '--version',
- ])
-
- expect(await queryByText('--nothing')).toBeFalsy()
-})
-
-test('getByText should find text', async () => {
- const {getByText} = await render('node', [
- resolve(__dirname, './execute-scripts/list-args.js'),
- '--version',
- ])
-
- expect(await waitFor(() => getByText('--version'))).toBeTruthy()
-})
-
-test('getByText should throw errors', async () => {
- const {getByText} = await render('node', [
- resolve(__dirname, './execute-scripts/list-args.js'),
- '--version',
- ])
-
- await expect(() => waitFor(() => getByText('--nothing'))).rejects.toThrow(
- 'Unable to find an stdout line with the text:',
- )
-})
diff --git a/src/__tests__/render-basics.js b/src/__tests__/render-basics.js
deleted file mode 100644
index 4b198ce..0000000
--- a/src/__tests__/render-basics.js
+++ /dev/null
@@ -1,46 +0,0 @@
-const {resolve} = require('path')
-const {render} = require('../pure')
-const {waitFor} = require('../wait-for')
-
-test('Should expect error codes when intended', async () => {
- const instance = await render('node', [
- resolve(__dirname, './execute-scripts/throw.js'),
- ])
- await waitFor(() => expect(instance.hasExit()).toMatchObject({exitCode: 1}))
-})
-
-test('Should handle argument passing', async () => {
- const {findByText} = await render('node', [
- resolve(__dirname, './execute-scripts/list-args.js'),
- '--version',
- ])
-
- expect(await findByText('--version')).toBeTruthy()
-})
-
-test('Is able to make terminal input and view in-progress stdout', async () => {
- const props = await render('node', [
- resolve(__dirname, './execute-scripts/stdio-inquirer.js'),
- ])
-
- const {clear, findByText, userEvent} = props
-
- const instance = await findByText('First option')
-
- expect(instance).toBeTruthy()
-
- // Windows uses ">", Linux/MacOS use "❯"
- expect(await findByText(/[❯>] One/)).toBeTruthy()
-
- clear()
-
- userEvent.keyboard('[ArrowDown]')
-
- expect(await findByText(/[❯>] Two/)).toBeTruthy()
-
- clear()
-
- userEvent.keyboard('[Enter]')
-
- expect(await findByText('First option: Two')).toBeTruthy()
-})
diff --git a/src/__tests__/user-keyboard.js b/src/__tests__/user-keyboard.js
deleted file mode 100644
index 139b9ab..0000000
--- a/src/__tests__/user-keyboard.js
+++ /dev/null
@@ -1,18 +0,0 @@
-const {resolve} = require('path')
-const {render} = require('../pure')
-const {fireEvent} = require('../events')
-
-test('Should render { and } in user keyboard', async () => {
- const {findByText, userEvent: userEventLocal} = await render('node', [
- resolve(__dirname, './execute-scripts/stdio-inquirer-input.js'),
- ])
-
- const instance = await findByText('What is your name?')
- expect(instance).toBeTruthy()
-
- userEventLocal.keyboard('{Hello}')
-
- expect(await findByText('{Hello}')).toBeTruthy()
-
- await fireEvent.sigterm(instance)
-})
diff --git a/src/__tests__/wait-for.js b/src/__tests__/wait-for.js
deleted file mode 100644
index bb96141..0000000
--- a/src/__tests__/wait-for.js
+++ /dev/null
@@ -1,248 +0,0 @@
-import {waitFor} from '../index'
-import {configure, getConfig} from '../config'
-// import {render} from '../pure'
-
-function deferred() {
- let resolve, reject
- const promise = new Promise((res, rej) => {
- resolve = res
- reject = rej
- })
- return {promise, resolve, reject}
-}
-
-test('waits callback to not throw an error', async () => {
- const spy = jest.fn()
- // we are using random timeout here to simulate a real-time example
- // of an async operation calling a callback at a non-deterministic time
- const randomTimeout = Math.floor(Math.random() * 60)
- setTimeout(spy, randomTimeout)
-
- await waitFor(() => expect(spy).toHaveBeenCalledTimes(1))
- expect(spy).toHaveBeenCalledWith()
-})
-
-// we used to have a limitation where we had to set an interval of 0 to 1
-// otherwise there would be problems. I don't think this limitation exists
-// anymore, but we'll keep this test around to make sure a problem doesn't
-// crop up.
-test('can accept an interval of 0', () => waitFor(() => {}, {interval: 0}))
-
-test('can timeout after the given timeout time', async () => {
- const error = new Error('throws every time')
- const result = await waitFor(
- () => {
- throw error
- },
- {timeout: 8, interval: 5},
- ).catch(e => e)
- expect(result).toBe(error)
-})
-
-test('if no error is thrown then throws a timeout error', async () => {
- const result = await waitFor(
- () => {
- // eslint-disable-next-line no-throw-literal
- throw undefined
- },
- {timeout: 8, interval: 5, onTimeout: e => e},
- ).catch(e => e)
- expect(result).toMatchInlineSnapshot(`[Error: Timed out in waitFor.]`)
-})
-
-test('if showOriginalStackTrace on a timeout error then the stack trace does not include this file', async () => {
- const result = await waitFor(
- () => {
- // eslint-disable-next-line no-throw-literal
- throw undefined
- },
- {timeout: 8, interval: 5, showOriginalStackTrace: true},
- ).catch(e => e)
- expect(result.stack).not.toMatch(__dirname)
-})
-
-test('uses full stack error trace when showOriginalStackTrace present', async () => {
- const error = new Error('Throws the full stack trace')
- // even if the error is a TestingLibraryElementError
- error.name = 'TestingLibraryElementError'
- const originalStackTrace = error.stack
- const result = await waitFor(
- () => {
- throw error
- },
- {timeout: 8, interval: 5, showOriginalStackTrace: true},
- ).catch(e => e)
- expect(result.stack).toBe(originalStackTrace)
-})
-
-test('does not change the stack trace if the thrown error is not a TestingLibraryElementError', async () => {
- const error = new Error('Throws the full stack trace')
- const originalStackTrace = error.stack
- const result = await waitFor(
- () => {
- throw error
- },
- {timeout: 8, interval: 5},
- ).catch(e => e)
- expect(result.stack).toBe(originalStackTrace)
-})
-
-test('provides an improved stack trace if the thrown error is a TestingLibraryElementError', async () => {
- const error = new Error('Throws the full stack trace')
- error.name = 'TestingLibraryElementError'
- const originalStackTrace = error.stack
- const result = await waitFor(
- () => {
- throw error
- },
- {timeout: 8, interval: 5},
- ).catch(e => e)
- // too hard to test that the stack trace is what we want it to be
- // so we'll just make sure that it's not the same as the original
- expect(result.stack).not.toBe(originalStackTrace)
-})
-
-test('throws nice error if provided callback is not a function', () => {
- const someElement = 'Hello'
- expect(() => waitFor(someElement)).toThrow(
- 'Received `callback` arg must be a function',
- )
-})
-
-// eslint-disable-next-line jest/no-commented-out-tests
-// test('timeout logs a pretty DOM', async () => {
-// renderIntoDocument(`how pretty
`)
-// const error = await waitFor(
-// () => {
-// throw new Error('always throws')
-// },
-// {timeout: 1},
-// ).catch(e => e)
-// expect(error.message).toMatchInlineSnapshot(`
-// always throws
-//
-// Ignored nodes: comments, ,
-//
-//
-//
-//
-// how pretty
-//
-//
-//
-// `)
-// })
-
-test('should delegate to config.getInstanceError', async () => {
- const originalConfig = getConfig()
- const elementError = new Error('Custom instance error')
- const getInstanceError = jest.fn().mockImplementation(() => elementError)
- configure({getInstanceError})
-
- const error = await waitFor(
- () => {
- throw new Error('always throws')
- },
- {timeout: 1},
- ).catch(e => e)
-
- expect(getInstanceError).toBeCalledTimes(1)
- expect(error.message).toMatchInlineSnapshot(`Custom instance error`)
- configure(originalConfig)
-})
-
-test('when a promise is returned, it does not call the callback again until that promise rejects', async () => {
- const sleep = t => new Promise(r => setTimeout(r, t))
- const p1 = deferred()
- const waitForCb = jest.fn(() => p1.promise)
- const waitForPromise = waitFor(waitForCb, {interval: 1})
- expect(waitForCb).toHaveBeenCalledTimes(1)
- waitForCb.mockClear()
- await sleep(50)
- expect(waitForCb).toHaveBeenCalledTimes(0)
-
- const p2 = deferred()
- waitForCb.mockImplementation(() => p2.promise)
-
- p1.reject('p1 rejection (should not fail this test)')
- await sleep(50)
-
- expect(waitForCb).toHaveBeenCalledTimes(1)
- p2.resolve()
-
- await waitForPromise
-})
-
-test('when a promise is returned, if that is not resolved within the timeout, then waitFor is rejected', async () => {
- const sleep = t => new Promise(r => setTimeout(r, t))
- const {promise} = deferred()
- const waitForError = waitFor(() => promise, {timeout: 1}).catch(e => e)
- await sleep(5)
-
- expect((await waitForError).message).toMatchInlineSnapshot(
- `Timed out in waitFor.`,
- )
-})
-
-test('if you switch from fake timers to real timers during the wait period you get an error', async () => {
- jest.useFakeTimers()
- const waitForError = waitFor(() => {
- throw new Error('this error message does not matter...')
- }).catch(e => e)
-
- // this is the problem...
- jest.useRealTimers()
-
- const error = await waitForError
-
- expect(error.message).toMatchInlineSnapshot(
- `Changed from using fake timers to real timers while using waitFor. This is not allowed and will result in very strange behavior. Please ensure you're awaiting all async things your test is doing before changing to real timers. For more info, please go to https://github.com/testing-library/dom-testing-library/issues/830`,
- )
- // stack trace has this file in it
- expect(error.stack).toMatch(__dirname)
-})
-
-test('if you switch from real timers to fake timers during the wait period you get an error', async () => {
- const waitForError = waitFor(() => {
- throw new Error('this error message does not matter...')
- }).catch(e => e)
-
- // this is the problem...
- jest.useFakeTimers()
- const error = await waitForError
-
- expect(error.message).toMatchInlineSnapshot(
- `Changed from using real timers to fake timers while using waitFor. This is not allowed and will result in very strange behavior. Please ensure you're awaiting all async things your test is doing before changing to fake timers. For more info, please go to https://github.com/testing-library/dom-testing-library/issues/830`,
- )
- // stack trace has this file in it
- expect(error.stack).toMatch(__dirname)
-})
-
-test('the fake timers => real timers error shows the original stack trace when configured to do so', async () => {
- jest.useFakeTimers()
- const waitForError = waitFor(
- () => {
- throw new Error('this error message does not matter...')
- },
- {showOriginalStackTrace: true},
- ).catch(e => e)
-
- jest.useRealTimers()
-
- expect((await waitForError).stack).not.toMatch(__dirname)
-})
-
-test('the real timers => fake timers error shows the original stack trace when configured to do so', async () => {
- const waitForError = waitFor(
- () => {
- throw new Error('this error message does not matter...')
- },
- {showOriginalStackTrace: true},
- ).catch(e => e)
-
- jest.useFakeTimers()
-
- expect((await waitForError).stack).not.toMatch(__dirname)
-})
diff --git a/src/event-map.ts b/src/event-map.ts
deleted file mode 100644
index bdb62c7..0000000
--- a/src/event-map.ts
+++ /dev/null
@@ -1,15 +0,0 @@
-import {TestInstance} from '../types'
-import {killProc} from './process-helpers'
-
-const isWin = process.platform === 'win32'
-
-const eventMap = {
- sigterm: (instance: TestInstance) =>
- killProc(instance, isWin ? undefined : 'SIGTERM'),
- sigkill: (instance: TestInstance) =>
- killProc(instance, isWin ? undefined : 'SIGKILL'),
- write: (instance: TestInstance, props: {value: string}) =>
- instance.process.stdin.write(props.value),
-}
-
-export {eventMap}
diff --git a/src/events.js b/src/events.js
deleted file mode 100644
index 8afdac6..0000000
--- a/src/events.js
+++ /dev/null
@@ -1,17 +0,0 @@
-import {eventMap} from './event-map'
-
-/**
- * Silence TypeScript errors
- * @type {*}
- */
-const fireEvent = (instance, event, props = undefined) => {
- eventMap[event](instance, props)
-}
-
-Object.entries(eventMap).forEach(([eventName, eventFn]) => {
- fireEvent[eventName] = (instance, ...props) => {
- eventFn(instance, ...props)
- }
-})
-
-export {fireEvent}
diff --git a/src/extend-expect.js b/src/extend-expect.js
deleted file mode 100644
index 3801a1d..0000000
--- a/src/extend-expect.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import * as extensions from './matchers'
-
-expect.extend(extensions)
diff --git a/src/get-queries-for-instance.js b/src/get-queries-for-instance.js
deleted file mode 100644
index 89c9a0a..0000000
--- a/src/get-queries-for-instance.js
+++ /dev/null
@@ -1,25 +0,0 @@
-import * as defaultQueries from './queries'
-
-/**
- * @typedef {{[key: string]: Function}} FuncMap
- */
-
-/**
- * @param {TestInstance} instance
- * @param {FuncMap} queries object of functions
- * @param {Object} initialValue for reducer
- * @returns {FuncMap} returns object of functions bound to container
- */
-function getQueriesForElement(
- instance,
- queries = defaultQueries,
- initialValue = {},
-) {
- return Object.keys(queries).reduce((helpers, key) => {
- const fn = queries[key]
- helpers[key] = fn.bind(null, instance)
- return helpers
- }, initialValue)
-}
-
-export {getQueriesForElement}
diff --git a/src/get-user-code-frame.js b/src/get-user-code-frame.js
deleted file mode 100644
index 5f53cff..0000000
--- a/src/get-user-code-frame.js
+++ /dev/null
@@ -1,67 +0,0 @@
-// We try to load node dependencies
-let chalk = null
-let readFileSync = null
-let codeFrameColumns = null
-
-try {
- const nodeRequire = module && module.require
-
- readFileSync = nodeRequire.call(module, 'fs').readFileSync
- codeFrameColumns = nodeRequire.call(
- module,
- '@babel/code-frame',
- ).codeFrameColumns
- chalk = nodeRequire.call(module, 'chalk')
-} catch (e) {
- // We're in a browser environment
-}
-
-// frame has the form "at myMethod (location/to/my/file.js:10:2)"
-function getCodeFrame(frame) {
- const locationStart = frame.indexOf('(') + 1
- const locationEnd = frame.indexOf(')')
- const frameLocation = frame.slice(locationStart, locationEnd)
-
- const frameLocationElements = frameLocation.split(':')
- const [filename, line, column] = [
- frameLocationElements[0],
- parseInt(frameLocationElements[1], 10),
- parseInt(frameLocationElements[2], 10),
- ]
-
- let rawFileContents = ''
- try {
- rawFileContents = readFileSync(filename, 'utf-8')
- } catch (e) {
- return ''
- }
-
- const codeFrame = codeFrameColumns(
- rawFileContents,
- {
- start: {line, column},
- },
- {
- highlightCode: true,
- linesBelow: 0,
- },
- )
- return `${chalk.dim(frameLocation)}\n${codeFrame}\n`
-}
-
-function getUserCodeFrame() {
- // If we couldn't load dependencies, we can't generate the user trace
- /* istanbul ignore next */
- if (!readFileSync || !codeFrameColumns) {
- return ''
- }
- const err = new Error()
- const firstClientCodeFrame = err.stack
- .split('\n')
- .slice(1) // Remove first line which has the form "Error: TypeError"
- .find(frame => !frame.includes('node_modules/')) // Ignore frames from 3rd party libraries
-
- return getCodeFrame(firstClientCodeFrame)
-}
-
-export {getUserCodeFrame}
diff --git a/src/helpers.js b/src/helpers.js
deleted file mode 100644
index c98d8f5..0000000
--- a/src/helpers.js
+++ /dev/null
@@ -1,75 +0,0 @@
-function jestFakeTimersAreEnabled() {
- /* istanbul ignore else */
- if (typeof jest !== 'undefined' && jest !== null) {
- return (
- // legacy timers
- setTimeout._isMockFunction === true ||
- // modern timers
- // eslint-disable-next-line prefer-object-has-own
- Object.prototype.hasOwnProperty.call(setTimeout, 'clock')
- )
- }
- // istanbul ignore next
- return false
-}
-
-const instanceRef = {current: undefined}
-
-if (typeof afterEach === 'function') {
- afterEach(() => {
- instanceRef.current = undefined
- })
-}
-
-function getCurrentInstance() {
- /**
- * Worth mentioning that this deviates from the upstream implementation
- * of `dom-testing-library`'s `getDocument` in waitFor, which throws an error whenever
- * `window` is not defined.
- *
- * Admittedly, this is another way that `cli-testing-library` will need to figure out
- * the right solution to this problem, since there is no omni-present parent `instance`
- * in a CLI like there is in a browser. (although FWIW, "process" might work)
- *
- * Have ideas how to solve? Please let us know:
- * https://github.com/crutchcorn/cli-testing-library/issues/
- */
- return instanceRef.current
-}
-
-// TODO: Does this need to be namespaced for each test that runs?
-// That way, we don't end up with a "singleton" that ends up wiped between
-// parallel tests.
-function setCurrentInstance(newInstance) {
- instanceRef.current = newInstance
-}
-
-function debounce(func, timeout) {
- let timer
- return (...args) => {
- clearTimeout(timer)
- timer = setTimeout(() => {
- // eslint-disable-next-line no-invalid-this
- func.apply(this, args)
- }, timeout)
- }
-}
-
-/**
- * This is used to bind a series of functions where `instance` is the first argument
- * to an instance, removing the implicit first argument.
- */
-function bindObjectFnsToInstance(instance, object) {
- return Object.entries(object).reduce((prev, [key, fn]) => {
- prev[key] = (...props) => fn(instance, ...props)
- return prev
- }, {})
-}
-
-export {
- jestFakeTimersAreEnabled,
- setCurrentInstance,
- getCurrentInstance,
- debounce,
- bindObjectFnsToInstance,
-}
diff --git a/src/index.js b/src/index.js
deleted file mode 100644
index d0e0cd1..0000000
--- a/src/index.js
+++ /dev/null
@@ -1,37 +0,0 @@
-import {cleanup} from './pure'
-
-// if we're running in a test runner that supports afterEach
-// or teardown then we'll automatically run cleanup afterEach test
-// this ensures that tests run in isolation from each other
-// if you don't like this then set the CTL_SKIP_AUTO_CLEANUP env variable to 'true'.
-if (
- typeof process === 'undefined' ||
- !(process.env && process.env.CTL_SKIP_AUTO_CLEANUP)
-) {
- // ignore teardown() in code coverage because Jest does not support it
- /* istanbul ignore else */
- if (typeof afterEach === 'function') {
- afterEach(async () => {
- await cleanup()
- })
- } else if (typeof teardown === 'function') {
- // Block is guarded by `typeof` check.
- // eslint does not support `typeof` guards.
- // eslint-disable-next-line no-undef
- teardown(async () => {
- await cleanup()
- })
- }
-}
-
-export * from './config'
-export * from './helpers'
-export * from './events'
-export * from './get-queries-for-instance'
-export * from './matches'
-export * from './pure'
-export * from './query-helpers'
-export * from './queries'
-export * from './mutation-observer'
-export * from './wait-for'
-export * from './user-event'
diff --git a/src/matchers/index.js b/src/matchers/index.js
deleted file mode 100644
index a0fa8bc..0000000
--- a/src/matchers/index.js
+++ /dev/null
@@ -1,4 +0,0 @@
-import {toBeInTheConsole} from './to-be-in-the-console'
-import {toHaveErrorMessage} from './to-have-errormessage'
-
-export {toBeInTheConsole, toHaveErrorMessage}
diff --git a/src/matchers/to-be-in-the-console.js b/src/matchers/to-be-in-the-console.js
deleted file mode 100644
index 56d9f37..0000000
--- a/src/matchers/to-be-in-the-console.js
+++ /dev/null
@@ -1,35 +0,0 @@
-/* eslint-disable no-invalid-this */
-import {getDefaultNormalizer} from '../matches'
-import {checkCliInstance, getMessage} from './utils'
-
-export function toBeInTheConsole(instance) {
- if (instance !== null || !this.isNot) {
- checkCliInstance(instance, toBeInTheConsole, this)
- }
-
- const errormessage = instance
- ? getDefaultNormalizer()(
- instance.stdoutArr.map(obj => obj.contents).join('\n'),
- )
- : null
-
- return {
- // Does not change based on `.not`, and as a result, we must confirm if it _actually_ is there
- pass: !!instance,
- message: () => {
- const to = this.isNot ? 'not to' : 'to'
- return getMessage(
- this,
- this.utils.matcherHint(
- `${this.isNot ? '.not' : ''}.toBeInTheConsole`,
- 'instance',
- '',
- ),
- `Expected ${to} find the instance in the console`,
- '',
- 'Received',
- this.utils.printReceived(errormessage),
- )
- },
- }
-}
diff --git a/src/matchers/to-have-errormessage.js b/src/matchers/to-have-errormessage.js
deleted file mode 100644
index 4288c10..0000000
--- a/src/matchers/to-have-errormessage.js
+++ /dev/null
@@ -1,40 +0,0 @@
-/* eslint-disable no-invalid-this */
-import {getDefaultNormalizer} from '../matches'
-import {checkCliInstance, getMessage} from './utils'
-
-/**
- * @param {TestInstance} testInstance
- * @param checkWith
- */
-export function toHaveErrorMessage(testInstance, checkWith) {
- checkCliInstance(testInstance, toHaveErrorMessage, this)
-
- const expectsErrorMessage = checkWith !== undefined
-
- const errormessage = getDefaultNormalizer()(
- testInstance.stderrArr.map(obj => obj.contents).join('\n'),
- )
-
- return {
- pass: expectsErrorMessage
- ? checkWith instanceof RegExp
- ? checkWith.test(errormessage)
- : this.equals(errormessage, checkWith)
- : Boolean(testInstance.stderrArr.length),
- message: () => {
- const to = this.isNot ? 'not to' : 'to'
- return getMessage(
- this,
- this.utils.matcherHint(
- `${this.isNot ? '.not' : ''}.toHaveErrorMessage`,
- 'instance',
- '',
- ),
- `Expected the instance ${to} have error message`,
- this.utils.printExpected(checkWith),
- 'Received',
- this.utils.printReceived(errormessage),
- )
- },
- }
-}
diff --git a/src/matchers/utils.js b/src/matchers/utils.js
deleted file mode 100644
index 54a6882..0000000
--- a/src/matchers/utils.js
+++ /dev/null
@@ -1,79 +0,0 @@
-import redent from 'redent'
-
-class GenericTypeError extends Error {
- constructor(expectedString, received, matcherFn, context) {
- super()
-
- /* istanbul ignore next */
- if (Error.captureStackTrace) {
- Error.captureStackTrace(this, matcherFn)
- }
- let withType = ''
- try {
- withType = context.utils.printWithType(
- 'Received',
- received,
- context.utils.printReceived,
- )
- } catch (e) {
- // Can throw for Document:
- // https://github.com/jsdom/jsdom/issues/2304
- }
- this.message = [
- context.utils.matcherHint(
- `${context.isNot ? '.not' : ''}.${matcherFn.name}`,
- 'received',
- '',
- ),
- '',
- // eslint-disable-next-line new-cap
- `${context.utils.RECEIVED_COLOR(
- 'received',
- )} value must ${expectedString}.`,
- withType,
- ].join('\n')
- }
-}
-
-class CliInstanceTypeError extends GenericTypeError {
- constructor(...args) {
- super('be a TestInstance', ...args)
- }
-}
-
-/**
- * @param {TestInstance} cliInstance
- * @param args
- */
-function checkCliInstance(cliInstance, ...args) {
- if (!(cliInstance && cliInstance.process && cliInstance.process.stdout)) {
- throw new CliInstanceTypeError(cliInstance, ...args)
- }
-}
-
-function display(context, value) {
- return typeof value === 'string' ? value : context.utils.stringify(value)
-}
-
-function getMessage(
- context,
- matcher,
- expectedLabel,
- expectedValue,
- receivedLabel,
- receivedValue,
-) {
- return [
- `${matcher}\n`,
- // eslint-disable-next-line new-cap
- `${expectedLabel}:\n${context.utils.EXPECTED_COLOR(
- redent(display(context, expectedValue), 2),
- )}`,
- // eslint-disable-next-line new-cap
- `${receivedLabel}:\n${context.utils.RECEIVED_COLOR(
- redent(display(context, receivedValue), 2),
- )}`,
- ].join('\n')
-}
-
-export {CliInstanceTypeError, checkCliInstance, getMessage}
diff --git a/src/matches.js b/src/matches.js
deleted file mode 100644
index bb6e9e4..0000000
--- a/src/matches.js
+++ /dev/null
@@ -1,100 +0,0 @@
-import stripAnsiFn from 'strip-ansi'
-
-function assertNotNullOrUndefined(matcher) {
- if (matcher === null || matcher === undefined) {
- throw new Error(
- // eslint-disable-next-line @typescript-eslint/restrict-template-expressions -- implicitly converting `T` to `string`
- `It looks like ${matcher} was passed instead of a matcher. Did you do something like getByText(${matcher})?`,
- )
- }
-}
-
-function fuzzyMatches(textToMatch, node, matcher, normalizer) {
- if (typeof textToMatch !== 'string') {
- return false
- }
- assertNotNullOrUndefined(matcher)
-
- const normalizedText = normalizer(textToMatch)
-
- if (typeof matcher === 'string' || typeof matcher === 'number') {
- return normalizedText
- .toLowerCase()
- .includes(matcher.toString().toLowerCase())
- } else if (typeof matcher === 'function') {
- return matcher(normalizedText, node)
- } else {
- return matcher.test(normalizedText)
- }
-}
-
-function matches(textToMatch, node, matcher, normalizer) {
- if (typeof textToMatch !== 'string') {
- return false
- }
-
- assertNotNullOrUndefined(matcher)
-
- const normalizedText = normalizer(textToMatch)
- if (matcher instanceof Function) {
- return matcher(normalizedText, node)
- } else if (matcher instanceof RegExp) {
- return matcher.test(normalizedText)
- } else {
- return normalizedText === String(matcher)
- }
-}
-
-function getDefaultNormalizer({
- trim = true,
- collapseWhitespace = true,
- stripAnsi = true,
-} = {}) {
- return text => {
- let normalizedText = text
- normalizedText = trim ? normalizedText.trim() : normalizedText
- normalizedText = collapseWhitespace
- ? normalizedText.replace(/\s+/g, ' ')
- : normalizedText
- normalizedText = stripAnsi ? stripAnsiFn(normalizedText) : normalizedText
- return normalizedText
- }
-}
-
-/**
- * @param {Object} props
- * Constructs a normalizer to pass to functions in matches.js
- * @param {boolean|undefined} props.trim The user-specified value for `trim`, without
- * any defaulting having been applied
- * @param {boolean|undefined} props.stripAnsi The user-specified value for `stripAnsi`, without
- * any defaulting having been applied
- * @param {boolean|undefined} props.collapseWhitespace The user-specified value for
- * `collapseWhitespace`, without any defaulting having been applied
- * @param {Function|undefined} props.normalizer The user-specified normalizer
- * @returns {Function} A normalizer
- */
-
-function makeNormalizer({trim, stripAnsi, collapseWhitespace, normalizer}) {
- if (normalizer) {
- // User has specified a custom normalizer
- if (
- typeof trim !== 'undefined' ||
- typeof collapseWhitespace !== 'undefined' ||
- typeof stripAnsi !== 'undefined'
- ) {
- // They've also specified a value for trim or collapseWhitespace
- throw new Error(
- 'trim and collapseWhitespace are not supported with a normalizer. ' +
- 'If you want to use the default trim and collapseWhitespace logic in your normalizer, ' +
- 'use "getDefaultNormalizer({trim, collapseWhitespace})" and compose that into your normalizer',
- )
- }
-
- return normalizer
- } else {
- // No custom normalizer specified. Just use default.
- return getDefaultNormalizer({trim, collapseWhitespace, stripAnsi})
- }
-}
-
-export {fuzzyMatches, matches, getDefaultNormalizer, makeNormalizer}
diff --git a/src/pretty-cli.js b/src/pretty-cli.js
deleted file mode 100644
index 699b134..0000000
--- a/src/pretty-cli.js
+++ /dev/null
@@ -1,35 +0,0 @@
-import sliceAnsi from 'slice-ansi'
-import {getUserCodeFrame} from './get-user-code-frame'
-
-function prettyCLI(testInstance, maxLength) {
- if (typeof maxLength !== 'number') {
- maxLength =
- (typeof process !== 'undefined' && process.env.DEBUG_PRINT_LIMIT) || 7000
- }
-
- if (maxLength === 0) {
- return ''
- }
-
- if (!('stdoutArr' in testInstance && 'stderrArr' in testInstance)) {
- throw new TypeError(`Expected an instance but got ${testInstance}`)
- }
-
- const outStr = testInstance.getStdallStr()
-
- // eslint-disable-next-line no-negated-condition
- return maxLength !== undefined && outStr.length > maxLength
- ? sliceAnsi(outStr, 0, maxLength)
- : outStr
-}
-
-const logCLI = (...args) => {
- const userCodeFrame = getUserCodeFrame()
- if (userCodeFrame) {
- process.stdout.write(`${prettyCLI(...args)}\n\n${userCodeFrame}`)
- } else {
- process.stdout.write(prettyCLI(...args))
- }
-}
-
-export {prettyCLI, logCLI}
diff --git a/src/process-helpers.ts b/src/process-helpers.ts
deleted file mode 100644
index 6d2989c..0000000
--- a/src/process-helpers.ts
+++ /dev/null
@@ -1,66 +0,0 @@
-import treeKill from 'tree-kill'
-import {TestInstance} from '../types'
-import {getConfig} from './config'
-
-export const killProc = (instance: TestInstance, signal: string | undefined) =>
- new Promise((resolve, reject) => {
- if (!instance.process.pid || (instance.process.pid && instance.hasExit())) {
- resolve()
- return
- }
- // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
- treeKill(instance.process.pid, signal, async err => {
- try {
- if (err) {
- if (
- err.message.includes('The process') &&
- err.message.includes('not found.')
- ) {
- resolve()
- return
- }
- if (
- err.message.includes('could not be terminated') &&
- err.message.includes('There is no running instance of the task.') &&
- instance.hasExit()
- ) {
- resolve()
- return
- }
- const isOperationNotSupported = err.message.includes('The operation attempted is not supported.');
- const isAccessDenied = err.message.includes('Access is denied.');
- if (err.message.includes('could not be terminated') && (isOperationNotSupported || isAccessDenied)) {
- const sleep = (t: number) => new Promise(r => setTimeout(r, t))
- await sleep(getConfig().errorDebounceTimeout)
- if (instance.hasExit()) {
- resolve()
- return
- }
- console.warn('Ran into error while trying to kill process:')
- console.warn(err.toString())
- console.warn(`This is likely due to Window's permissions.
- Because this error is prevalent on CI Windows systems with the tree-kill package, we are attempting
- an alternative kill method.`)
- console.warn()
- console.warn(
- 'Be aware that this alternative kill method is not guaranteed to work with subprocesses, and they may not exit properly as a result.',
- )
-
- const didKill = instance.process.kill(signal as 'SIGKILL')
- if (didKill) {
- resolve()
- } else {
- console.error(
- 'Alternative kill method failed. Rejecting with original error.',
- )
- reject(err)
- }
- return
- }
- reject(err)
- } else resolve()
- } catch (e: unknown) {
- reject(e)
- }
- })
- })
diff --git a/src/pure.ts b/src/pure.ts
deleted file mode 100644
index d33fba0..0000000
--- a/src/pure.ts
+++ /dev/null
@@ -1,143 +0,0 @@
-import childProcess from 'child_process'
-import {performance} from 'perf_hooks'
-import stripFinalNewline from 'strip-final-newline'
-import {RenderOptions, RenderResult, TestInstance} from '../types/pure'
-import {_runObservers} from './mutation-observer'
-import {getQueriesForElement} from './get-queries-for-instance'
-import userEvent from './user-event/index'
-import {bindObjectFnsToInstance, setCurrentInstance} from './helpers'
-import {fireEvent} from './events'
-import {getConfig} from './config'
-import {logCLI} from './pretty-cli'
-
-const mountedInstances = new Set()
-
-async function render(
- command: string,
- args: string[] = [],
- opts: Partial = {},
-): Promise {
- const {cwd = __dirname, spawnOpts = {}} = opts
-
- // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
- const exec = childProcess.spawn(command, args, {
- ...spawnOpts,
- cwd,
- shell: true,
- })
-
- let _readyPromiseInternals: null | {resolve: Function; reject: Function} =
- null
-
- let _resolved = false
-
- const execOutputAPI = {
- __exitCode: null as null | number,
- _isOutputAPI: true,
- _isReady: new Promise(
- (resolve, reject) => (_readyPromiseInternals = {resolve, reject}),
- ),
- process: exec,
- // Clear buffer of stdout to do more accurate `t.regex` checks
- clear() {
- execOutputAPI.stdoutArr = []
- execOutputAPI.stderrArr = []
- },
- debug(maxLength?: number) {
- logCLI(execOutputAPI, maxLength)
- },
- // An array of strings gathered from stdout when unable to do
- // `await stdout` because of inquirer interactive prompts
- stdoutArr: [] as Array<{contents: Buffer | string; timestamp: number}>,
- stderrArr: [] as Array<{contents: Buffer | string; timestamp: number}>,
- hasExit() {
- return this.__exitCode === null ? null : {exitCode: this.__exitCode}
- },
- }
-
- mountedInstances.add(execOutputAPI as unknown as TestInstance)
-
- exec.stdout.on('data', (result: string | Buffer) => {
- // `on('spawn') doesn't work the same way in Node12.
- // Instead, we have to rely on this working as-expected.
- if (_readyPromiseInternals && !_resolved) {
- _readyPromiseInternals.resolve()
- _resolved = true
- }
-
- const resStr = stripFinalNewline(result as string)
- execOutputAPI.stdoutArr.push({
- contents: resStr,
- timestamp: performance.now(),
- })
- _runObservers()
- })
-
- exec.stderr.on('data', (result: string | Buffer) => {
- if (_readyPromiseInternals && !_resolved) {
- _readyPromiseInternals.resolve()
- _resolved = true
- }
-
- const resStr = stripFinalNewline(result as string)
- execOutputAPI.stderrArr.push({
- contents: resStr,
- timestamp: performance.now(),
- })
- _runObservers()
- })
-
- exec.on('error', result => {
- if (_readyPromiseInternals) {
- _readyPromiseInternals.reject(result)
- }
- })
-
- exec.on('spawn', () => {
- setTimeout(() => {
- if (_readyPromiseInternals && !_resolved) {
- _readyPromiseInternals.resolve()
- _resolved = true
- }
- }, getConfig().renderAwaitTime)
- })
-
- exec.on('exit', code => {
- execOutputAPI.__exitCode = code ?? 0
- })
-
- setCurrentInstance(execOutputAPI)
-
- await execOutputAPI._isReady
-
- function getStdallStr(this: Omit) {
- return this.stderrArr
- .concat(this.stdoutArr)
- .sort((a, b) => (a.timestamp < b.timestamp ? -1 : 1))
- .map(obj => obj.contents)
- .join('\n')
- }
-
- return Object.assign(
- execOutputAPI,
- {
- userEvent: bindObjectFnsToInstance(execOutputAPI, userEvent),
- getStdallStr: getStdallStr.bind(execOutputAPI),
- },
- getQueriesForElement(execOutputAPI),
- ) as TestInstance as RenderResult
-}
-
-function cleanup() {
- return Promise.all(Array.from(mountedInstances).map(cleanupAtInstance))
-}
-
-// maybe one day we'll expose this (perhaps even as a utility returned by render).
-// but let's wait until someone asks for it.
-async function cleanupAtInstance(instance: TestInstance) {
- await fireEvent.sigkill(instance)
- // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
- mountedInstances.delete(instance)
-}
-
-export {render, cleanup}
diff --git a/src/queries/all-utils.ts b/src/queries/all-utils.ts
deleted file mode 100644
index e8cb89d..0000000
--- a/src/queries/all-utils.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export * from '../matches'
-export * from '../query-helpers'
-export * from '../config'
diff --git a/src/queries/error.ts b/src/queries/error.ts
deleted file mode 100644
index f52df95..0000000
--- a/src/queries/error.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import {GetErrorFunction, QueryByText} from '../../types'
-import {fuzzyMatches, matches, makeNormalizer, buildQueries} from './all-utils'
-
-const queryByErrorBase: QueryByText = (
- instance,
- text,
- {exact = false, collapseWhitespace, trim, normalizer, stripAnsi} = {},
-) => {
- const matcher = exact ? matches : fuzzyMatches
- const matchNormalizer = makeNormalizer({
- stripAnsi,
- collapseWhitespace,
- trim,
- normalizer,
- })
- const str = instance.stderrArr.map(obj => obj.contents).join('\n')
- if (matcher(str, instance, text, matchNormalizer)) return instance
- else return null
-}
-
-const getMissingError: GetErrorFunction<[unknown]> = (c, text) =>
- `Unable to find an stdout line with the text: ${text}. This could be because the text is broken up by multiple lines. In this case, you can provide a function for your text matcher to make your matcher more flexible.`
-
-const [queryByErrorWithSuggestions, getByError, findByError] = buildQueries(
- queryByErrorBase,
- getMissingError,
-)
-
-export {queryByErrorWithSuggestions as queryByError, getByError, findByError}
diff --git a/src/queries/index.js b/src/queries/index.js
deleted file mode 100644
index d29ea74..0000000
--- a/src/queries/index.js
+++ /dev/null
@@ -1,2 +0,0 @@
-export * from './text'
-export * from './error'
diff --git a/src/queries/text.ts b/src/queries/text.ts
deleted file mode 100644
index e41f22b..0000000
--- a/src/queries/text.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-import {GetErrorFunction, QueryByText} from '../../types'
-import {fuzzyMatches, matches, makeNormalizer, buildQueries} from './all-utils'
-
-const queryByTextBase: QueryByText = (
- instance,
- text,
- {exact = false, collapseWhitespace, trim, normalizer, stripAnsi} = {},
-) => {
- const matcher = exact ? matches : fuzzyMatches
- const matchNormalizer = makeNormalizer({
- stripAnsi,
- collapseWhitespace,
- trim,
- normalizer,
- })
- const str = instance.stdoutArr.map(output => output.contents).join('\n')
- if (matcher(str, instance, text, matchNormalizer)) return instance
- else return null
-}
-
-const getMissingError: GetErrorFunction<[unknown]> = (c, text) =>
- `Unable to find an stdout line with the text: ${text}. This could be because the text is broken up by multiple lines. In this case, you can provide a function for your text matcher to make your matcher more flexible.`
-
-const [queryByTextWithSuggestions, getByText, findByText] = buildQueries(
- queryByTextBase,
- getMissingError,
-)
-
-export {queryByTextWithSuggestions as queryByText, getByText, findByText}
diff --git a/src/query-helpers.ts b/src/query-helpers.ts
deleted file mode 100644
index c3053b2..0000000
--- a/src/query-helpers.ts
+++ /dev/null
@@ -1,134 +0,0 @@
-import type {
- GetErrorFunction,
- Matcher,
- MatcherOptions,
- QueryMethod,
- waitForOptions as WaitForOptions,
- WithSuggest,
- Variant,
-} from '../types'
-import {TestInstance} from '../types/pure'
-import {getSuggestedQuery} from './suggestions'
-import {waitFor} from './wait-for'
-import {getConfig} from './config'
-
-function getInstanceError(message: string | null, instance: TestInstance) {
- return getConfig().getInstanceError(message, instance)
-}
-
-function getSuggestionError(
- suggestion: {toString(): string},
- container: TestInstance,
-) {
- return getConfig().getInstanceError(
- `A better query is available, try this:
-${suggestion.toString()}
-`,
- container,
- )
-}
-
-// this accepts a query function and returns a function which throws an error
-// if an empty list of elements is returned
-function makeGetQuery(
- queryBy: (instance: TestInstance, ...args: Arguments) => TestInstance | null,
- getMissingError: GetErrorFunction,
-) {
- return (instance: TestInstance, ...args: Arguments) => {
- const el = queryBy(instance, ...args)
- if (!el) {
- throw getConfig().getInstanceError(
- getMissingError(instance, ...args),
- instance,
- )
- }
-
- return el
- }
-}
-
-// this accepts a getter query function and returns a function which calls
-// waitFor and passing a function which invokes the getter.
-function makeFindQuery(
- getter: (
- container: TestInstance,
- text: Matcher,
- options: MatcherOptions,
- ) => QueryFor,
-) {
- return (
- container: TestInstance,
- text: Matcher,
- options: MatcherOptions,
- waitForOptions: WaitForOptions,
- ) => {
- return waitFor(
- () => {
- return getter(container, text, options)
- },
- {container, ...waitForOptions},
- )
- }
-}
-
-const wrapSingleQueryWithSuggestion =
- (
- query: (container: TestInstance, ...args: Arguments) => TestInstance | null,
- queryByName: string,
- variant: Variant,
- ) =>
- (container: TestInstance, ...args: Arguments) => {
- const instance = query(container, ...args)
- const [{suggest = getConfig().throwSuggestions} = {}] = args.slice(-1) as [
- WithSuggest,
- ]
- if (instance && suggest) {
- const suggestion = getSuggestedQuery(instance, variant)
- if (suggestion && !queryByName.endsWith(suggestion.queryName as string)) {
- // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
- throw getSuggestionError(suggestion.toString(), container)
- }
- }
-
- return instance
- }
-
-// TODO: This deviates from the published declarations
-// However, the implementation always required a dyadic (after `container`) not variadic `queryAllBy` considering the implementation of `makeFindQuery`
-// This is at least statically true and can be verified by accepting `QueryMethod`
-function buildQueries(
- queryBy: QueryMethod<
- [matcher: Matcher, options: MatcherOptions],
- TestInstance | null
- >,
- getMissingError: GetErrorFunction<
- [matcher: Matcher, options: MatcherOptions]
- >,
-) {
- const getBy = makeGetQuery(queryBy, getMissingError)
-
- const queryByWithSuggestions = wrapSingleQueryWithSuggestion(
- queryBy,
- queryBy.name,
- 'get',
- )
-
- const getByWithSuggestions = wrapSingleQueryWithSuggestion(
- getBy,
- queryBy.name,
- 'get',
- )
-
- const findBy = makeFindQuery(
- wrapSingleQueryWithSuggestion(getBy, queryBy.name, 'find'),
- )
-
- return [queryByWithSuggestions, getByWithSuggestions, findBy]
-}
-
-export {
- getInstanceError,
- wrapSingleQueryWithSuggestion,
- makeFindQuery,
- buildQueries,
-}
diff --git a/src/suggestions.js b/src/suggestions.js
deleted file mode 100644
index 9b1be8b..0000000
--- a/src/suggestions.js
+++ /dev/null
@@ -1,72 +0,0 @@
-import {getDefaultNormalizer} from './matches'
-
-const normalize = getDefaultNormalizer()
-
-function escapeRegExp(string) {
- return string.replace(/[.*+\-?^${}()|[\]\\]/g, '\\$&') // $& means the whole matched string
-}
-
-function getRegExpMatcher(string) {
- return new RegExp(escapeRegExp(string.toLowerCase()), 'i')
-}
-
-function makeSuggestion(queryName, element, content, {variant, name}) {
- const warning = ''
- const queryOptions = {}
- const queryArgs = [
- [].includes(queryName) ? content : getRegExpMatcher(content),
- ]
-
- if (name) {
- queryOptions.name = getRegExpMatcher(name)
- }
-
- if (Object.keys(queryOptions).length > 0) {
- queryArgs.push(queryOptions)
- }
-
- const queryMethod = `${variant}By${queryName}`
-
- return {
- queryName,
- queryMethod,
- queryArgs,
- variant,
- warning,
- toString() {
- if (warning) {
- console.warn(warning)
- }
- let [text, options] = queryArgs
-
- text = typeof text === 'string' ? `'${text}'` : text
-
- options = options
- ? `, { ${Object.entries(options)
- .map(([k, v]) => `${k}: ${v}`)
- .join(', ')} }`
- : ''
-
- return `${queryMethod}(${text}${options})`
- },
- }
-}
-
-function canSuggest(currentMethod, requestedMethod, data) {
- return (
- data &&
- (!requestedMethod ||
- requestedMethod.toLowerCase() === currentMethod.toLowerCase())
- )
-}
-
-export function getSuggestedQuery(instance, variant = 'get', method) {
- const textContent = normalize(
- instance.stdoutArr.map(obj => obj.contents).join('\n'),
- )
- if (canSuggest('Text', method, textContent)) {
- return makeSuggestion('Text', instance, textContent, {variant})
- }
-
- return undefined
-}
diff --git a/src/user-event/index.ts b/src/user-event/index.ts
deleted file mode 100644
index 10ca121..0000000
--- a/src/user-event/index.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-import {keyboard} from './keyboard/index'
-
-const userEvent = {
- keyboard,
-}
-
-export default userEvent
-
-export type {keyboardKey} from './keyboard/index'
diff --git a/src/user-event/keyboard/index.ts b/src/user-event/keyboard/index.ts
deleted file mode 100644
index c7d9e8a..0000000
--- a/src/user-event/keyboard/index.ts
+++ /dev/null
@@ -1,37 +0,0 @@
-import {TestInstance} from '../../../types'
-import {keyboardImplementation} from './keyboardImplementation'
-import {defaultKeyMap} from './keyMap'
-import {keyboardOptions, keyboardKey} from './types'
-
-export type {keyboardOptions, keyboardKey}
-
-export function keyboard(
- instance: TestInstance,
- text: string,
- options?: Partial,
-): void | Promise {
- const {promise} = keyboardImplementationWrapper(instance, text, options)
-
- if ((options?.delay ?? 0) > 0) {
- return promise
- } else {
- // prevent users from dealing with UnhandledPromiseRejectionWarning in sync call
- promise.catch(console.error)
- }
-}
-
-export function keyboardImplementationWrapper(
- instance: TestInstance,
- text: string,
- config: Partial = {},
-) {
- const {delay = 0, keyboardMap = defaultKeyMap} = config
- const options = {
- delay,
- keyboardMap,
- }
-
- return {
- promise: keyboardImplementation(instance, text, options),
- }
-}
diff --git a/src/user-event/keyboard/keyMap.ts b/src/user-event/keyboard/keyMap.ts
deleted file mode 100644
index 85a296b..0000000
--- a/src/user-event/keyboard/keyMap.ts
+++ /dev/null
@@ -1,114 +0,0 @@
-import {keyboardKey} from './types'
-
-/**
- * Mapping for a default US-104-QWERTY keyboard
- *
- * These use ANSI-C quoting, which seems to work for Linux, macOS, and Windows alike
- * @see https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html#ANSI_002dC-Quoting
- * @see https://stackoverflow.com/questions/35429671/detecting-key-press-within-bash-scripts
- * @see https://gist.github.com/crutchcorn/2811db78a7b924cf54f4507198427fd2
- */
-export const defaultKeyMap: keyboardKey[] = [
- // alphanumeric keys
- {code: 'Digit!', hex: '\x21'},
- {code: 'Digit#', hex: '\x23'},
- {code: 'Digit$', hex: '\x24'},
- {code: 'Digit%', hex: '\x25'},
- {code: 'Digit&', hex: '\x26'},
- {code: 'Digit(', hex: '\x29'},
- {code: 'Digit)', hex: '\x29'},
- {code: 'Digit*', hex: '\x2a'},
- {code: 'Digit-', hex: '\x2d'},
- {code: 'Digit@', hex: '\x40'},
- {code: 'Digit^', hex: '\x5e'},
- {code: 'Digit{', hex: '\x7b'},
- {code: 'Digit|', hex: '\x7c'},
- {code: 'Digit}', hex: '\x7d'},
- {code: 'Digit~', hex: '\x7e'},
- {code: 'Digit0', hex: '\x30'},
- {code: 'Digit1', hex: '\x31'},
- {code: 'Digit2', hex: '\x32'},
- {code: 'Digit3', hex: '\x33'},
- {code: 'Digit4', hex: '\x34'},
- {code: 'Digit5', hex: '\x35'},
- {code: 'Digit6', hex: '\x36'},
- {code: 'Digit7', hex: '\x37'},
- {code: 'Digit8', hex: '\x38'},
- {code: 'Digit9', hex: '\x39'},
- {code: 'KeyA', hex: '\x41'},
- {code: 'KeyB', hex: '\x42'},
- {code: 'KeyC', hex: '\x43'},
- {code: 'KeyD', hex: '\x44'},
- {code: 'KeyE', hex: '\x45'},
- {code: 'KeyF', hex: '\x46'},
- {code: 'KeyG', hex: '\x47'},
- {code: 'KeyH', hex: '\x48'},
- {code: 'KeyI', hex: '\x49'},
- {code: 'KeyJ', hex: '\x4a'},
- {code: 'KeyK', hex: '\x4b'},
- {code: 'KeyL', hex: '\x4c'},
- {code: 'KeyM', hex: '\x4d'},
- {code: 'KeyN', hex: '\x4e'},
- {code: 'KeyO', hex: '\x4f'},
- {code: 'KeyP', hex: '\x50'},
- {code: 'KeyQ', hex: '\x51'},
- {code: 'KeyR', hex: '\x52'},
- {code: 'KeyS', hex: '\x53'},
- {code: 'KeyT', hex: '\x54'},
- {code: 'KeyU', hex: '\x55'},
- {code: 'KeyV', hex: '\x56'},
- {code: 'KeyW', hex: '\x57'},
- {code: 'KeyX', hex: '\x58'},
- {code: 'KeyY', hex: '\x59'},
- {code: 'KeyZ', hex: '\x5a'},
- {code: 'Digit_', hex: '\x5f'},
- {code: 'KeyLowerA', hex: '\x61'},
- {code: 'KeyLowerB', hex: '\x62'},
- {code: 'KeyLowerC', hex: '\x63'},
- {code: 'KeyLowerD', hex: '\x64'},
- {code: 'KeyLowerE', hex: '\x65'},
- {code: 'KeyLowerF', hex: '\x66'},
- {code: 'KeyLowerG', hex: '\x67'},
- {code: 'KeyLowerH', hex: '\x68'},
- {code: 'KeyLowerI', hex: '\x69'},
- {code: 'KeyLowerJ', hex: '\x6a'},
- {code: 'KeyLowerK', hex: '\x6b'},
- {code: 'KeyLowerL', hex: '\x6c'},
- {code: 'KeyLowerM', hex: '\x6d'},
- {code: 'KeyLowerN', hex: '\x6e'},
- {code: 'KeyLowerO', hex: '\x6f'},
- {code: 'KeyLowerP', hex: '\x70'},
- {code: 'KeyLowerQ', hex: '\x71'},
- {code: 'KeyLowerR', hex: '\x72'},
- {code: 'KeyLowerS', hex: '\x73'},
- {code: 'KeyLowerT', hex: '\x74'},
- {code: 'KeyLowerU', hex: '\x75'},
- {code: 'KeyLowerV', hex: '\x76'},
- {code: 'KeyLowerW', hex: '\x77'},
- {code: 'KeyLowerX', hex: '\x78'},
- {code: 'KeyLowerY', hex: '\x79'},
- {code: 'KeyLowerZ', hex: '\x7a'},
-
- // alphanumeric block - functional
- {code: 'Space', hex: '\x20'},
- {code: 'Backspace', hex: '\x08'},
- {code: 'Enter', hex: '\x0D'},
-
- // function
- {code: 'Escape', hex: '\x1b'},
-
- // arrows
- {code: 'ArrowUp', hex: '\x1b\x5b\x41'},
- {code: 'ArrowDown', hex: '\x1B\x5B\x42'},
- {code: 'ArrowLeft', hex: '\x1b\x5b\x44'},
- {code: 'ArrowRight', hex: '\x1b\x5b\x43'},
-
- // control pad
- {code: 'Home', hex: '\x1b\x4f\x48'},
- {code: 'End', hex: '\x1b\x4f\x46'},
- {code: 'Delete', hex: '\x1b\x5b\x33\x7e'},
- {code: 'PageUp', hex: '\x1b\x5b\x35\x7e'},
- {code: 'PageDown', hex: '\x1b\x5b\x36\x7e'},
-
- // TODO: add mappings
-]
diff --git a/src/user-event/keyboard/keyboardImplementation.ts b/src/user-event/keyboard/keyboardImplementation.ts
deleted file mode 100644
index 0fe3347..0000000
--- a/src/user-event/keyboard/keyboardImplementation.ts
+++ /dev/null
@@ -1,28 +0,0 @@
-import {fireEvent} from '../../events'
-import {wait} from '../utils'
-import {TestInstance} from '../../../types'
-import {getNextKeyDef} from './getNextKeyDef'
-import {keyboardKey, keyboardOptions} from './types'
-
-export async function keyboardImplementation(
- instance: TestInstance,
- text: string,
- options: keyboardOptions,
-): Promise {
- const {keyDef, consumedLength} = getNextKeyDef(text, options)
-
- keypress(keyDef, instance)
-
- if (text.length > consumedLength) {
- if (options.delay > 0) {
- await wait(options.delay)
- }
-
- return keyboardImplementation(instance, text.slice(consumedLength), options)
- }
- return void undefined
-}
-
-function keypress(keyDef: keyboardKey, instance: TestInstance) {
- fireEvent.write(instance, {value: keyDef.hex})
-}
diff --git a/src/user-event/utils.ts b/src/user-event/utils.ts
deleted file mode 100644
index 69ad59b..0000000
--- a/src/user-event/utils.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-export function wait(time?: number) {
- return new Promise(resolve => setTimeout(() => resolve(), time))
-}
diff --git a/tests/jest.config.js b/tests/jest.config.js
deleted file mode 100644
index b0ac1aa..0000000
--- a/tests/jest.config.js
+++ /dev/null
@@ -1,15 +0,0 @@
-const path = require('path')
-const baseConfig = require('kcd-scripts/jest')
-
-module.exports = {
- ...baseConfig,
- rootDir: path.join(__dirname, '..'),
- displayName: 'node',
- testEnvironment: 'jest-environment-node',
- coveragePathIgnorePatterns: [
- ...baseConfig.coveragePathIgnorePatterns,
- '/__tests__/',
- '/__node_tests__/',
- ],
- testMatch: ['**/__tests__/**.js'],
-}
diff --git a/tests/setup-env.js b/tests/setup-env.js
deleted file mode 100644
index 6a5e3be..0000000
--- a/tests/setup-env.js
+++ /dev/null
@@ -1,72 +0,0 @@
-import '../src/extend-expect'
-import hasAnsi from 'has-ansi'
-import stripAnsi from 'strip-ansi'
-import {configure, getConfig} from '../src/config'
-
-/**
- * We have instances where we need to disable this serializer to test for ANSI codes
- * @see jest-snapshot-serializer-ansi
- */
-expect.addSnapshotSerializer({
- test: value =>
- typeof value === 'string' &&
- !value.includes('__disable_ansi_serialization') &&
- hasAnsi(value),
- print: (value, serialize) => serialize(stripAnsi(value)),
-})
-
-// add serializer for MutationRecord
-expect.addSnapshotSerializer({
- print: (record, serialize) => {
- return serialize({
- addedNodes: record.addedNodes,
- attributeName: record.attributeName,
- attributeNamespace: record.attributeNamespace,
- nextSibling: record.nextSibling,
- oldValue: record.oldValue,
- previousSibling: record.previousSibling,
- removedNodes: record.removedNodes,
- target: record.target,
- type: record.type,
- })
- },
- test: value => {
- // list of records will stringify to the same value
- return (
- Array.isArray(value) === false &&
- String(value) === '[object MutationRecord]'
- )
- },
-})
-
-beforeAll(() => {
- const originalWarn = console.warn
- jest.spyOn(console, 'warn').mockImplementation((...args) => {
- if (args[0] && args[0].includes && args[0].includes('deprecated')) {
- return
- }
- originalWarn(...args)
- })
-})
-
-afterEach(async () => {
- if (jest.isMockFunction(global.setTimeout)) {
- jest.useRealTimers()
- }
-})
-
-afterAll(() => {
- jest.restoreAllMocks()
-})
-
-jest.setTimeout(20000)
-
-let originalConfig
-beforeAll(() => {
- originalConfig = getConfig()
- configure({asyncUtilTimeout: 15000, renderAwaitTime: 800})
-})
-
-afterAll(() => {
- configure(originalConfig)
-})
diff --git a/tsconfig.json b/tsconfig.json
index c2c2b26..e33e42d 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,10 +1,27 @@
{
- "extends": "./node_modules/kcd-scripts/shared-tsconfig.json",
+ "$schema": "https://json.schemastore.org/tsconfig",
"compilerOptions": {
- "target": "ESNext",
"allowJs": true,
- "downlevelIteration": true,
- "skipLibCheck": false
+ "allowSyntheticDefaultImports": true,
+ "allowUnreachableCode": false,
+ "allowUnusedLabels": false,
+ "checkJs": true,
+ "declaration": true,
+ "esModuleInterop": true,
+ "forceConsistentCasingInFileNames": true,
+ "isolatedModules": true,
+ "lib": ["ES2022"],
+ "module": "ES2022",
+ "moduleResolution": "Node",
+ "noEmit": true,
+ "noImplicitReturns": true,
+ "noUncheckedIndexedAccess": true,
+ "noUnusedLocals": false, // TODO enable
+ "noUnusedParameters": true,
+ "resolveJsonModule": true,
+ "skipLibCheck": true,
+ "strict": true,
+ "target": "ES2020"
},
- "include": ["./src", "./types", "extend-expect.d.ts"]
+ "include": ["eslint.config.js", "prettier.config.js"]
}
diff --git a/types/.eslintrc b/types/.eslintrc
deleted file mode 100644
index 29aa479..0000000
--- a/types/.eslintrc
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "rules": {
- "one-var": "off",
- "@typescript-eslint/no-explicit-any": "off" // let's do better in the future
- }
-}
diff --git a/types/__tests__/type-tests.ts b/types/__tests__/type-tests.ts
deleted file mode 100644
index 8bbce98..0000000
--- a/types/__tests__/type-tests.ts
+++ /dev/null
@@ -1,69 +0,0 @@
-import {fireEvent, queries, waitFor, BoundFunctions} from '../index'
-import {render, TestInstance} from '../pure'
-import userEvent from '../../src/user-event'
-
-const {getByText, queryByText, findByText} = queries
-
-export async function testQueries() {
- // instance queries
- const instance = await render('command', [])
- getByText(instance, 'foo')
- getByText(instance, 1)
- queryByText(instance, 'foo')
- await findByText(instance, 'foo')
- await findByText(instance, 'foo', undefined, {timeout: 10})
-}
-
-export function testBoundFunctions() {
- const boundfunctions = {} as BoundFunctions<{
- customQueryOne: (instance: TestInstance, text: string) => HTMLElement
- customQueryTwo: (
- instance: TestInstance,
- text: string,
- text2: string,
- ) => HTMLElement
- customQueryThree: (instance: TestInstance, number: number) => HTMLElement
- }>
-
- boundfunctions.customQueryOne('one')
- boundfunctions.customQueryTwo('one', 'two')
- boundfunctions.customQueryThree(3)
-}
-
-export async function eventTest() {
- const instance = await render('command', [])
-
- // eslint-disable-next-line @typescript-eslint/await-thenable
- await fireEvent.sigterm(instance)
-
- fireEvent.write(instance, {value: 'test'})
-}
-
-export async function keyboardTest() {
- const instance = await render('command', [])
-
- await userEvent.keyboard(instance, 'Test')
- await instance.userEvent.keyboard('Test')
- await instance.userEvent.keyboard('Test', {delay: 0})
-
- fireEvent.write(instance, {value: 'test'})
-}
-
-export async function testWaitFors() {
- const instance = await render('command', [])
-
- await waitFor(() => getByText(instance, 'apple'))
- const result: TestInstance = await waitFor(() => getByText(instance, 'apple'))
- if (!result) {
- // Use value
- throw new Error(`Can't find result`)
- }
-
- await waitFor(async () => {})
-}
-
-/*
-eslint
- @typescript-eslint/no-unnecessary-condition: "off",
- import/no-extraneous-dependencies: "off"
-*/
diff --git a/types/config.d.ts b/types/config.d.ts
deleted file mode 100644
index 90a447d..0000000
--- a/types/config.d.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-import {TestInstance} from './pure'
-
-export interface Config {
- /**
- * WARNING: `unstable` prefix means this API may change in patch and minor releases.
- * @param cb
- */
- unstable_advanceTimersWrapper(cb: (...args: unknown[]) => unknown): unknown
- asyncUtilTimeout: number
- renderAwaitTime: number
- errorDebounceTimeout: number
- showOriginalStackTrace: boolean
- throwSuggestions: boolean
- getInstanceError: (message: string | null, container: TestInstance) => Error
-}
-
-export interface ConfigFn {
- (existingConfig: Config): Partial
-}
-
-export function configure(configDelta: ConfigFn | Partial): void
-export function getConfig(): Config
diff --git a/types/event-map.d.ts b/types/event-map.d.ts
deleted file mode 100644
index 612e43f..0000000
--- a/types/event-map.d.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import {TestInstance} from '../types'
-declare const eventMap: {
- sigterm: (instance: TestInstance) => Promise
- sigkill: (instance: TestInstance) => Promise
- write: (
- instance: TestInstance,
- props: {
- value: string
- },
- ) => boolean
-}
-export {eventMap}
diff --git a/types/events.d.ts b/types/events.d.ts
deleted file mode 100644
index c1cf924..0000000
--- a/types/events.d.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import type {eventMap} from './event-map'
-import {TestInstance} from './pure'
-
-type EventMap = typeof eventMap
-export type EventType = keyof EventMap
-
-export type FireFunction = (
- instance: TestInstance,
- event: K,
- options?: Parameters[1],
-) => boolean
-export type FireObject = {
- [K in EventType]: (
- instance: TestInstance,
- options?: Parameters[1],
- ) => boolean
-}
-
-export const fireEvent: FireFunction & FireObject
diff --git a/types/get-queries-for-instance.d.ts b/types/get-queries-for-instance.d.ts
deleted file mode 100644
index 10bfeb2..0000000
--- a/types/get-queries-for-instance.d.ts
+++ /dev/null
@@ -1,47 +0,0 @@
-import {TestInstance} from './pure'
-import * as queries from './queries'
-
-export type BoundFunction = T extends (
- container: TestInstance,
- ...args: infer P
-) => infer R
- ? (...args: P) => R
- : never
-
-export type BoundFunctions = Q extends typeof queries
- ? {
- getByText(
- ...args: Parameters>>
- ): ReturnType>
- queryByText(
- ...args: Parameters>>
- ): ReturnType>
- findByText(
- ...args: Parameters>>
- ): ReturnType>
- } & {
- [P in keyof Q]: BoundFunction
- }
- : {
- [P in keyof Q]: BoundFunction
- }
-
-export type Query = (
- container: TestInstance,
- ...args: any[]
-) =>
- | Error
- | TestInstance
- | TestInstance[]
- | Promise
- | Promise
- | null
-
-export interface Queries {
- [T: string]: Query
-}
-
-export function getQueriesForInstance(
- instance: TestInstance,
- queriesToBind?: T,
-): BoundFunctions
diff --git a/types/index.d.ts b/types/index.d.ts
deleted file mode 100644
index f63bca0..0000000
--- a/types/index.d.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-// TypeScript Version: 3.8
-
-import * as queries from './queries'
-import * as queryHelpers from './query-helpers'
-
-export {queries, queryHelpers}
-
-export * from './config'
-export * from './events'
-export * from './get-queries-for-instance'
-export * from './matches'
-export * from './pure'
-export * from './queries'
-export * from './query-helpers'
-export * from './suggestions'
-export * from './wait-for'
-export * from './user-event/index'
diff --git a/types/matches.d.ts b/types/matches.d.ts
deleted file mode 100644
index 531fb75..0000000
--- a/types/matches.d.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-export type MatcherFunction = (
- content: string,
- element: Element | null,
-) => boolean
-export type Matcher = MatcherFunction | RegExp | number | string
-
-export type NormalizerFn = (text: string) => string
-
-export interface NormalizerOptions extends DefaultNormalizerOptions {
- normalizer?: NormalizerFn
-}
-
-export interface MatcherOptions {
- exact?: boolean
- /** Use normalizer with getDefaultNormalizer instead */
- trim?: boolean
- /** Use normalizer with getDefaultNormalizer instead */
- stripAnsi?: boolean
- /** Use normalizer with getDefaultNormalizer instead */
- collapseWhitespace?: boolean
- normalizer?: NormalizerFn
- /** suppress suggestions for a specific query */
- suggest?: boolean
-}
-
-export type Match = (
- textToMatch: string,
- node: HTMLElement | null,
- matcher: Matcher,
- options?: MatcherOptions,
-) => boolean
-
-export interface DefaultNormalizerOptions {
- trim?: boolean
- collapseWhitespace?: boolean
- stripAnsi?: boolean
-}
-
-export function getDefaultNormalizer(
- options?: DefaultNormalizerOptions,
-): NormalizerFn
-
-// N.B. Don't expose fuzzyMatches + matches here: they're not public API
diff --git a/types/pure.d.ts b/types/pure.d.ts
deleted file mode 100644
index c967d8f..0000000
--- a/types/pure.d.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-import type {SpawnOptionsWithoutStdio} from 'child_process'
-import {ChildProcessWithoutNullStreams} from 'child_process'
-import type userEvent from './user-event/index'
-import * as queries from './queries'
-import type {BoundFunction} from './get-queries-for-instance'
-
-export interface TestInstance {
- clear(): void
- process: ChildProcessWithoutNullStreams
- stdoutArr: Array<{contents: Buffer | string; timestamp: number}>
- stderrArr: Array<{contents: Buffer | string; timestamp: number}>
- getStdallStr(): string
- hasExit(): null | {exitCode: number}
- debug(maxLength?: number): void
-}
-
-export interface RenderOptions {
- cwd: string
- debug: boolean
- spawnOpts: Omit
-}
-
-type UserEvent = typeof userEvent
-
-export type RenderResult = TestInstance & {
- userEvent: {
- [P in keyof UserEvent]: BoundFunction
- }
-} & {[P in keyof typeof queries]: BoundFunction}
-
-export function render(
- command: string,
- args?: string[],
- opts?: Partial,
-): Promise
diff --git a/types/queries.d.ts b/types/queries.d.ts
deleted file mode 100644
index bc58f17..0000000
--- a/types/queries.d.ts
+++ /dev/null
@@ -1,62 +0,0 @@
-import {Matcher} from './matches'
-import {SelectorMatcherOptions} from './query-helpers'
-import {waitForOptions} from './wait-for'
-import {TestInstance} from './pure'
-
-export type QueryByText = (
- instance: TestInstance,
- id: Matcher,
- options?: SelectorMatcherOptions,
-) => T | null
-
-export type GetByText